multiversx_sc/types/interaction/
contract_call_legacy.rs

1mod async_call;
2mod async_call_promises;
3mod contract_call_convert;
4mod contract_call_exec;
5mod contract_call_no_payment;
6mod contract_call_trait;
7mod contract_call_with_any_payment;
8mod contract_call_with_egld;
9mod contract_call_with_egld_or_single_esdt;
10mod contract_call_with_multi_esdt;
11mod contract_deploy;
12
13pub use async_call::AsyncCall;
14pub use async_call_promises::AsyncCallPromises;
15pub use contract_call_no_payment::ContractCallNoPayment;
16pub use contract_call_trait::{ContractCall, ContractCallBase};
17pub use contract_call_with_any_payment::ContractCallWithAnyPayment;
18pub use contract_call_with_egld::ContractCallWithEgld;
19pub use contract_call_with_egld_or_single_esdt::ContractCallWithEgldOrSingleEsdt;
20pub use contract_call_with_multi_esdt::ContractCallWithMultiEsdt;
21pub use contract_deploy::{ContractDeploy, new_contract_deploy};
22use multiversx_sc_codec::TopEncodeMulti;
23
24/// Using max u64 to represent maximum possible gas,
25/// so that the value zero is not reserved and can be specified explicitly.
26/// Leaving the gas limit unspecified will replace it with `api.get_gas_left()`.
27pub(crate) const UNSPECIFIED_GAS_LIMIT: u64 = u64::MAX;
28
29use crate::{
30    api::CallTypeApi,
31    types::{
32        DeployCall, FunctionCall, ManagedOption, OriginalResultMarker, Tx, TxPayment,
33        TxPaymentEgldOnly, TxScEnv, TxTo, TxToSpecified,
34    },
35};
36
37// Conversion from new syntax to old syntax.
38impl<Api, To, Payment, OriginalResult> ContractCallBase<Api>
39    for Tx<
40        TxScEnv<Api>,
41        (),
42        To,
43        Payment,
44        (),
45        FunctionCall<Api>,
46        OriginalResultMarker<OriginalResult>,
47    >
48where
49    Api: CallTypeApi + 'static,
50    To: TxToSpecified<TxScEnv<Api>>,
51    Payment: TxPayment<TxScEnv<Api>>,
52    OriginalResult: TopEncodeMulti,
53{
54    type OriginalResult = OriginalResult;
55
56    fn into_normalized(self) -> ContractCallWithEgld<Api, OriginalResult> {
57        self.payment.with_normalized(
58            &self.env,
59            &self.from,
60            self.to,
61            self.data,
62            |norm_to, norm_egld, norm_fc| ContractCallWithEgld {
63                basic: ContractCallNoPayment {
64                    _phantom: core::marker::PhantomData,
65                    to: norm_to.clone(),
66                    function_call: norm_fc.clone(),
67                    explicit_gas_limit: UNSPECIFIED_GAS_LIMIT,
68                    _return_type: core::marker::PhantomData,
69                },
70                egld_payment: norm_egld.clone(),
71            },
72        )
73    }
74}
75
76impl<Api, To, Payment, OriginalResult>
77    From<
78        Tx<
79            TxScEnv<Api>,
80            (),
81            To,
82            Payment,
83            (),
84            DeployCall<TxScEnv<Api>, ()>,
85            OriginalResultMarker<OriginalResult>,
86        >,
87    > for ContractDeploy<Api, OriginalResult>
88where
89    Api: CallTypeApi + 'static,
90    To: TxTo<TxScEnv<Api>>,
91    Payment: TxPaymentEgldOnly<TxScEnv<Api>>,
92    OriginalResult: TopEncodeMulti,
93{
94    fn from(
95        value: Tx<
96            TxScEnv<Api>,
97            (),
98            To,
99            Payment,
100            (),
101            DeployCall<TxScEnv<Api>, ()>,
102            OriginalResultMarker<OriginalResult>,
103        >,
104    ) -> Self {
105        ContractDeploy {
106            _phantom: core::marker::PhantomData,
107            to: ManagedOption::none(),
108            egld_payment: value.payment.into_egld_payment(&value.env),
109            explicit_gas_limit: UNSPECIFIED_GAS_LIMIT,
110            arg_buffer: value.data.arg_buffer,
111            _return_type: core::marker::PhantomData,
112        }
113    }
114}