radix_clis/resim/
cmd_transfer.rs

1use clap::Parser;
2use radix_common::prelude::*;
3
4use crate::resim::*;
5use crate::utils::*;
6
7/// Transfer resource to another account
8#[derive(Parser, Debug)]
9pub struct Transfer {
10    /// The resource specifier.
11    pub resource_specifier: String,
12
13    /// The recipient component address.
14    pub recipient: SimulatorComponentAddress,
15
16    /// The proofs to add to the auth zone, in form of "<resource_address>:<amount>" or "<resource_address>:<nf_local_id1>,<nf_local_id2>"
17    #[clap(short, long, multiple = true)]
18    pub proofs: Option<Vec<String>>,
19
20    /// The network to use when outputting manifest, [simulator | adapanet | nebunet | mainnet]
21    #[clap(short, long)]
22    pub network: Option<String>,
23
24    /// Output a transaction manifest without execution
25    #[clap(short, long)]
26    pub manifest: Option<PathBuf>,
27
28    /// The private keys used for signing, separated by comma
29    #[clap(short, long)]
30    pub signing_keys: Option<String>,
31
32    /// Turn on tracing
33    #[clap(short, long)]
34    pub trace: bool,
35}
36
37impl Transfer {
38    pub fn run<O: std::io::Write>(&self, out: &mut O) -> Result<(), String> {
39        let address_bech32_decoder = AddressBech32Decoder::for_simulator();
40
41        let default_account = get_default_account()?;
42        let proofs = self.proofs.clone().unwrap_or_default();
43
44        let mut builder = ManifestBuilder::new().lock_fee_from_faucet();
45        for resource_specifier in proofs {
46            builder = create_proof_from_account(
47                builder,
48                &address_bech32_decoder,
49                default_account,
50                resource_specifier,
51            )
52            .map_err(Error::FailedToBuildArguments)?
53        }
54
55        let resource_specifier =
56            parse_resource_specifier(&self.resource_specifier, &address_bech32_decoder)
57                .map_err(|_| Error::InvalidResourceSpecifier(self.resource_specifier.clone()))?;
58
59        builder = match resource_specifier {
60            crate::utils::ResourceSpecifier::Amount(amount, resource_address) => {
61                builder.withdraw_from_account(default_account, resource_address, amount)
62            }
63            crate::utils::ResourceSpecifier::Ids(ids, resource_address) => {
64                builder.withdraw_non_fungibles_from_account(default_account, resource_address, ids)
65            }
66        };
67        let manifest = builder
68            .try_deposit_entire_worktop_or_refund(self.recipient.0, None)
69            .build();
70        handle_manifest(
71            manifest.into(),
72            &self.signing_keys,
73            &self.network,
74            &self.manifest,
75            self.trace,
76            true,
77            out,
78        )
79        .map(|_| ())
80    }
81}