Skip to main content

multiversx_sc_scenario/scenario/tx_to_step/
tx_to_step_transfer.rs

1use multiversx_sc::types::{Tx, TxEnv, TxFromSpecified, TxGas, TxPayment, TxToSpecified};
2
3use crate::{imports::TxESDT, scenario_model::TransferStep};
4
5use super::{StepWrapper, TxToStep, address_annotated, gas_annotated};
6
7impl<Env, From, To, Payment, Gas> TxToStep<Env, ()> for Tx<Env, From, To, Payment, Gas, (), ()>
8where
9    Env: TxEnv,
10    From: TxFromSpecified<Env>,
11    To: TxToSpecified<Env>,
12    Payment: TxPayment<Env>,
13    Gas: TxGas<Env>,
14{
15    type Step = TransferStep;
16
17    fn tx_to_step(self) -> StepWrapper<Env, Self::Step, ()> {
18        let step = tx_to_transfer_step(&self.env, self.from, self.to, self.payment, self.gas);
19
20        StepWrapper {
21            env: self.env,
22            step,
23            result_handler: self.result_handler,
24        }
25    }
26}
27
28pub fn tx_to_transfer_step<Env, From, To, Payment, Gas>(
29    env: &Env,
30    from: From,
31    to: To,
32    payment: Payment,
33    gas: Gas,
34) -> TransferStep
35where
36    Env: TxEnv,
37    From: TxFromSpecified<Env>,
38    To: TxToSpecified<Env>,
39    Payment: TxPayment<Env>,
40    Gas: TxGas<Env>,
41{
42    let mut step = TransferStep::new()
43        .from(address_annotated(env, &from))
44        .to(address_annotated(env, &to));
45
46    step.tx.gas_limit = gas_annotated(env, gas);
47
48    let full_payment_data = payment.into_scenario_payments(env);
49    if let Some(annotated_egld_payment) = full_payment_data.egld {
50        step.tx.egld_value = annotated_egld_payment.into();
51    } else {
52        step.tx.esdt_value = full_payment_data
53            .multi_esdt
54            .iter()
55            .map(|item| TxESDT::from(item.clone()))
56            .collect();
57    }
58
59    step
60}