radix_clis/resim/
cmd_transfer.rs1use clap::Parser;
2use radix_common::prelude::*;
3
4use crate::resim::*;
5use crate::utils::*;
6
7#[derive(Parser, Debug)]
9pub struct Transfer {
10 pub resource_specifier: String,
12
13 pub recipient: SimulatorComponentAddress,
15
16 #[clap(short, long, multiple = true)]
18 pub proofs: Option<Vec<String>>,
19
20 #[clap(short, long)]
22 pub network: Option<String>,
23
24 #[clap(short, long)]
26 pub manifest: Option<PathBuf>,
27
28 #[clap(short, long)]
30 pub signing_keys: Option<String>,
31
32 #[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}