kaspa_cli_lib/modules/
transfer.rs

1use crate::imports::*;
2
3#[derive(Default, Handler)]
4#[help("Transfer funds between wallet accounts")]
5pub struct Transfer;
6
7impl Transfer {
8    async fn main(self: Arc<Self>, ctx: &Arc<dyn Context>, argv: Vec<String>, _cmd: &str) -> Result<()> {
9        let ctx = ctx.clone().downcast_arc::<KaspaCli>()?;
10
11        let account = ctx.wallet().account()?;
12
13        if argv.len() < 2 {
14            tprintln!(ctx, "usage: transfer <account> <amount> <priority fee>");
15            return Ok(());
16        }
17
18        let target_account = argv.first().unwrap();
19        let target_account = ctx.find_accounts_by_name_or_id(target_account).await?;
20        if target_account.id() == account.id() {
21            return Err("Cannot transfer to the same account".into());
22        }
23        let amount_sompi = try_parse_required_nonzero_kaspa_as_sompi_u64(argv.get(1))?;
24        let priority_fee_sompi = try_parse_optional_kaspa_as_sompi_i64(argv.get(2))?.unwrap_or(0);
25        let target_address = target_account.receive_address()?;
26        let (wallet_secret, payment_secret) = ctx.ask_wallet_secret(Some(&account)).await?;
27
28        let abortable = Abortable::default();
29        let outputs = PaymentOutputs::from((target_address.clone(), amount_sompi));
30
31        // let ctx_ = ctx.clone();
32        let (summary, _ids) = account
33            .send(
34                outputs.into(),
35                priority_fee_sompi.into(),
36                None,
37                wallet_secret,
38                payment_secret,
39                &abortable,
40                Some(Arc::new(move |_ptx| {
41                    // tprintln!(ctx_, "Sending transaction: {}", ptx.id());
42                })),
43            )
44            .await?;
45
46        tprintln!(ctx, "Transfer - {summary}");
47
48        Ok(())
49    }
50}