testnumbat_wasm_node/api/
call_value_api_node.rs1use 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 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 #[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}