we_cdk/macros/
asset.rs

1/// Get the balance of tokens
2///
3/// # Result
4/// The result of execution is `i64` balance
5///
6/// # Usage
7/// ```
8/// use we_cdk::*;
9///
10/// #[action]
11/// fn _constructor() {
12///     let token: Binary = base58!("DnK5Xfi2wXUJx9BjK9X6ZpFdTLdq2GtWH9pWrcxcmrhB");
13///     let another_address: Binary = base58!("3NzkzibVRkKUzaRzjUxndpTPvoBzQ3iLng3");
14///     let another_alias: String = "alias";
15///     let another_contract: Binary = base58!("4WVhw3QdiinpE5QXDG7QfqLiLanM7ewBw4ChX4qyGjs2");
16///
17///     let contract_balance: Integer = get_balance!(this);
18///     let contract_asset_balance: Integer = get_balance!(this, asset => token);
19///     let address_balance: Integer = get_balance!(address => another_address);
20///     let alias_balance: Integer = get_balance!(alias => another_alias);
21///     let contract_balance: Integer = get_balance!(contract => another_contract);
22///     let address_asset_balance: Integer = get_balance!(address => another_address, asset => token);
23/// }
24/// ```
25#[macro_export]
26macro_rules! get_balance {
27    // For use within a macro
28    (@inner, $holder:expr, $type:expr, $version:expr) => {{
29        let system_token = internal_data!(system_token);
30        let (error, balance) = wevm::v1::bindings::get_balance(
31            system_token.0,
32            system_token.1,
33            $holder.as_ptr(),
34            $holder.len(),
35            $type,
36            $version,
37        );
38        error!(error);
39        balance
40    }};
41    // For use within a macro
42    (@inner, $holder:expr, $asset_id:expr, $type:expr, $version:expr) => {{
43        let (error, balance) = wevm::v1::bindings::get_balance(
44            $asset_id.as_ptr(),
45            $asset_id.len(),
46            $holder.as_ptr(),
47            $holder.len(),
48            $type,
49            $version,
50        );
51        error!(error);
52        balance
53    }};
54    (this) => {{
55        let system_token = internal_data!(system_token);
56        let this = internal_data!(this);
57        let (error, balance) =
58            wevm::v0::bindings::get_balance(system_token.0, system_token.1, this.0, this.1);
59        error!(error);
60        balance
61    }};
62    (this, asset => $asset_id:expr) => {{
63        let this = internal_data!(this);
64        let (error, balance) =
65            wevm::v0::bindings::get_balance($asset_id.as_ptr(), $asset_id.len(), this.0, this.1);
66        error!(error);
67        balance
68    }};
69    (address => $address:expr) => {
70        get_balance!(@inner, $address, 0, 1)
71    };
72    (address => $address:expr, asset => $asset_id:expr) => {
73        get_balance!(@inner, $address, $asset_id, 0, 1)
74    };
75    (alias => $address:expr) => {
76        get_balance!(@inner, $address, 0, 2)
77    };
78    (alias => $address:expr, asset => $asset_id:expr) => {
79        get_balance!($address, $asset_id, 0, 2)
80    };
81    (contract => $address:expr) => {
82        get_balance!(@inner, $address, 1, 1)
83    };
84    (contract => $address:expr, asset => $asset_id:expr) => {
85        get_balance!($address, $asset_id, 1, 1)
86    };
87}
88
89/// Tokens transfer
90///
91/// # Usage
92/// ```
93/// use we_cdk::*;
94///
95/// #[action]
96/// fn _constructor() {
97///     let asset_id: Binary = base58!("DnK5Xfi2wXUJx9BjK9X6ZpFdTLdq2GtWH9pWrcxcmrhB");
98///     let recipient: Binary = base58!("3NzkzibVRkKUzaRzjUxndpTPvoBzQ3iLng3");
99///     let amount: Integer = 100;
100///     transfer!(address => recipient, amount);
101///     transfer!(asset => asset_id, address => recipient, amount);
102/// }
103/// ```
104#[macro_export]
105macro_rules! transfer {
106    // For use within a macro
107    (@inner, $recipient:expr, $amount:expr, $type:expr, $version:expr) => {
108        let system_token = internal_data!(system_token);
109        let error = wevm::v1::bindings::transfer(
110            system_token.0,
111            system_token.1,
112            $recipient.as_ptr(),
113            $recipient.len(),
114            $type,
115            $version,
116            $amount,
117        );
118        error!(error);
119    };
120    // For use within a macro
121    (@inner, $asset_id:expr, $recipient:expr, $amount:expr, $type:expr, $version:expr) => {
122        let error = wevm::v1::bindings::transfer(
123            $asset_id.as_ptr(),
124            $asset_id.len(),
125            $recipient.as_ptr(),
126            $recipient.len(),
127            $type,
128            $version,
129            $amount,
130        );
131        error!(error);
132    };
133    (address => $recipient:expr, $amount:expr) => {
134        transfer!(@inner, $recipient, $amount, 0, 1);
135    };
136    (alias => $recipient:expr, $amount:expr) => {
137        transfer!(@inner, $recipient, $amount, 0, 2);
138    };
139    (contract => $recipient:expr, $amount:expr) => {
140        transfer!(@inner, $recipient, $amount, 1, 1);
141    };
142    (asset => $asset_id:expr, address => $recipient:expr, $amount:expr) => {
143        transfer!(@inner, $asset_id, $recipient, $amount, 0, 1);
144    };
145    (asset => $asset_id:expr, alias => $recipient:expr, $amount:expr) => {
146        transfer!(@inner, $asset_id, $recipient, $amount, 0, 2);
147    };
148    (asset => $asset_id:expr, contract => $recipient:expr, $amount:expr) => {
149        transfer!(@inner, $asset_id, $recipient, $amount, 1, 1);
150    };
151}
152
153/// Issue the asset
154///
155/// # Result
156/// The result of execution is `&[u8]` asset_id
157///
158/// # Usage
159/// ```
160/// use we_cdk::*;
161///
162/// #[action]
163/// fn _constructor() {
164///     let name: String = "TEST";
165///     let description: String = "Test asset";
166///     let quantity: Integer = 1_000_000;
167///     let decimals: Integer = 8;
168///     let is_reissuable: Boolean = true;
169///     let asset_id: Binary = issue!(name, description, quantity, decimals, is_reissuable);
170/// }
171/// ```
172#[macro_export]
173macro_rules! issue {
174    ($name:expr, $description:expr, $quantity:expr, $decimals:expr, $is_reissuable:expr) => {{
175        let (error, ptr, len) = wevm::v1::bindings::issue(
176            $name.as_ptr(),
177            $name.len(),
178            $description.as_ptr(),
179            $description.len(),
180            $quantity,
181            $decimals,
182            $is_reissuable,
183        );
184        error!(error);
185        core::slice::from_raw_parts(ptr, len)
186    }};
187}
188
189/// Burn the asset
190///
191/// # Usage
192/// ```
193/// use we_cdk::*;
194///
195/// #[action]
196/// fn _constructor() {
197///     let asset_id: Binary = base58!("DnK5Xfi2wXUJx9BjK9X6ZpFdTLdq2GtWH9pWrcxcmrhB");
198///     let amount: Integer = 100;
199///     burn!(asset_id, amount);
200/// }
201/// ```
202#[macro_export]
203macro_rules! burn {
204    ($asset_id:expr, $amount:expr) => {
205        let error = wevm::v0::bindings::burn($asset_id.as_ptr(), $asset_id.len(), $amount);
206        error!(error);
207    };
208}
209
210/// Reissue the asset
211///
212/// # Usage
213/// ```
214/// use we_cdk::*;
215///
216/// #[action]
217/// fn _constructor() {
218///     let asset_id: Binary = base58!("DnK5Xfi2wXUJx9BjK9X6ZpFdTLdq2GtWH9pWrcxcmrhB");
219///     let amount: Integer = 100;
220///     let is_reissuable: Boolean = true;
221///     reissue!(asset_id, amount, is_reissuable);
222/// }
223/// ```
224#[macro_export]
225macro_rules! reissue {
226    ($asset_id:expr, $amount:expr, $is_reissuable:expr) => {
227        let error = wevm::v0::bindings::reissue(
228            $asset_id.as_ptr(),
229            $asset_id.len(),
230            $amount,
231            $is_reissuable,
232        );
233        error!(error);
234    };
235}