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}