testnumbat_wasm_node/api/
call_value_api_node.rs

1use crate::AndesApiImpl;
2use testnumbat_wasm::{
3    api::CallValueApi,
4    types::{BigUint, DcdtTokenType, ManagedType, TokenIdentifier},
5};
6
7const MAX_POSSIBLE_TOKEN_IDENTIFIER_LENGTH: usize = 32;
8
9extern "C" {
10    fn bigIntNew(value: i64) -> i32;
11    #[cfg(not(feature = "unmanaged-ei"))]
12    fn mBufferNew() -> i32;
13
14    fn checkNoPayment();
15
16    fn bigIntGetCallValue(dest: i32);
17    fn bigIntGetDCDTCallValue(dest: i32);
18    fn getDCDTTokenName(resultOffset: *const u8) -> i32;
19    fn getDCDTTokenNonce() -> i64;
20    fn getDCDTTokenType() -> i32;
21
22    // multi-transfer API
23    fn getNumDCDTTransfers() -> i32;
24    fn bigIntGetDCDTCallValueByIndex(dest: i32, index: i32);
25    fn getDCDTTokenNameByIndex(resultOffset: *const u8, index: i32) -> i32;
26    fn getDCDTTokenNonceByIndex(index: i32) -> i64;
27    fn getDCDTTokenTypeByIndex(index: i32) -> i32;
28    #[cfg(not(feature = "unmanaged-ei"))]
29    fn managedGetMultiDCDTCallValue(resultHandle: i32);
30
31    /// TODO: decide if it is worth using or not
32    #[allow(dead_code)]
33    fn getCallValueTokenName(callValueOffset: *const u8, resultOffset: *const u8) -> i32;
34}
35
36impl CallValueApi for AndesApiImpl {
37    #[inline]
38    fn check_not_payable(&self) {
39        unsafe {
40            checkNoPayment();
41        }
42    }
43
44    fn rewa_value(&self) -> BigUint<Self> {
45        unsafe {
46            let value_handle = bigIntNew(0);
47            bigIntGetCallValue(value_handle);
48            BigUint::from_raw_handle(self.clone(), value_handle)
49        }
50    }
51
52    fn dcdt_value(&self) -> BigUint<Self> {
53        unsafe {
54            let value_handle = bigIntNew(0);
55            bigIntGetDCDTCallValue(value_handle);
56            BigUint::from_raw_handle(self.clone(), value_handle)
57        }
58    }
59
60    fn token(&self) -> TokenIdentifier<Self> {
61        unsafe {
62            let mut name_buffer = [0u8; MAX_POSSIBLE_TOKEN_IDENTIFIER_LENGTH];
63            let name_len = getDCDTTokenName(name_buffer.as_mut_ptr());
64            if name_len == 0 {
65                TokenIdentifier::rewa(self.clone())
66            } else {
67                TokenIdentifier::from_dcdt_bytes(self.clone(), &name_buffer[..name_len as usize])
68            }
69        }
70    }
71
72    fn dcdt_token_nonce(&self) -> u64 {
73        unsafe { getDCDTTokenNonce() as u64 }
74    }
75
76    fn dcdt_token_type(&self) -> DcdtTokenType {
77        unsafe { (getDCDTTokenType() as u8).into() }
78    }
79
80    fn dcdt_num_transfers(&self) -> usize {
81        unsafe { getNumDCDTTransfers() as usize }
82    }
83
84    fn dcdt_value_by_index(&self, index: usize) -> BigUint<Self> {
85        unsafe {
86            let value_handle = bigIntNew(0);
87            bigIntGetDCDTCallValueByIndex(value_handle, index as i32);
88            BigUint::from_raw_handle(self.clone(), value_handle)
89        }
90    }
91
92    fn token_by_index(&self, index: usize) -> TokenIdentifier<Self> {
93        unsafe {
94            let mut name_buffer = [0u8; MAX_POSSIBLE_TOKEN_IDENTIFIER_LENGTH];
95            let name_len = getDCDTTokenNameByIndex(name_buffer.as_mut_ptr(), index as i32);
96            if name_len == 0 {
97                TokenIdentifier::rewa(self.clone())
98            } else {
99                TokenIdentifier::from_dcdt_bytes(self.clone(), &name_buffer[..name_len as usize])
100            }
101        }
102    }
103
104    fn dcdt_token_nonce_by_index(&self, index: usize) -> u64 {
105        unsafe { getDCDTTokenNonceByIndex(index as i32) as u64 }
106    }
107
108    fn dcdt_token_type_by_index(&self, index: usize) -> DcdtTokenType {
109        unsafe { (getDCDTTokenTypeByIndex(index as i32) as u8).into() }
110    }
111
112    #[cfg(not(feature = "unmanaged-ei"))]
113    fn get_all_dcdt_transfers(
114        &self,
115    ) -> testnumbat_wasm::types::ManagedVec<Self, testnumbat_wasm::types::DcdtTokenPayment<Self>> {
116        unsafe {
117            let result_handle = mBufferNew();
118            managedGetMultiDCDTCallValue(result_handle);
119            testnumbat_wasm::types::ManagedVec::from_raw_handle(self.clone(), result_handle)
120        }
121    }
122}