we_cdk/macros/call_contract.rs
1/// Call contract
2///
3/// # Usage
4/// ```
5/// use we_cdk::*;
6///
7/// #[interface]
8/// trait i_contract {
9/// fn method(integer: Integer, boolean: Boolean, binary: Binary, string: String);
10/// }
11///
12/// #[action]
13/// fn _constructor() {
14/// let contract: Binary = base58!("4WVhw3QdiinpE5QXDG7QfqLiLanM7ewBw4ChX4qyGjs2");
15/// let asset: Binary = base58!("DnK5Xfi2wXUJx9BjK9X6ZpFdTLdq2GtWH9pWrcxcmrhB");
16///
17/// let integer: Integer = 42;
18/// let boolean: Boolean = true;
19/// let binary: Binary = &[0, 1];
20/// let string: String = "test";
21///
22/// call_contract! {
23/// i_contract(contract)::method(integer, boolean, binary, string)
24/// };
25/// }
26/// ```
27///
28/// The contract can also be called with raw data of type Binary
29///
30/// ```
31/// use we_cdk::*;
32///
33/// #[action]
34/// fn call_with_binary_params(func_name: String, params: Binary) {
35/// let contract: Binary = base58!("4WVhw3QdiinpE5QXDG7QfqLiLanM7ewBw4ChX4qyGjs2");
36///
37/// call_contract! {
38/// (contract)::call(func_name, params)
39/// };
40/// }
41/// ```
42#[macro_export]
43macro_rules! call_contract {
44 ($interface:ident ( $contract_id:expr ) :: $func_name:ident ( $($func_args:expr),* ) $(:: payments ( $($payment_args:expr),+ ))?) => {
45 $(
46 $(
47 let error = wevm::v0::bindings::call_payment($payment_args.0.as_ptr(), $payment_args.0.len(), $payment_args.1);
48 error!(error);
49 )+
50 )?
51 let error = $interface::$func_name($contract_id, $($func_args),* );
52 error!(error);
53 };
54 ( ($contract_id:expr) :: call ($func_name:expr, $params:expr ) $(:: payments ( $($payment_args:expr),+ ))?) => {
55 $(
56 $(
57 let error = wevm::v0::bindings::call_payment($payment_args.0.as_ptr(), $payment_args.0.len(), $payment_args.1);
58 error!(error);
59 )+
60 )?
61 let error = wevm::v0::bindings::call_contract_params(
62 $contract_id.as_ptr(),
63 $contract_id.len(),
64 $func_name.as_ptr(),
65 $func_name.len(),
66 $params.as_ptr(),
67 $params.len(),
68 );
69 error!(error);
70 };
71}