nifty_cli/commands/
approve.rs

1use nifty_asset::{
2    instructions::{Approve, ApproveInstructionArgs},
3    types::{DelegateInput, DelegateRole},
4};
5
6use super::*;
7
8pub struct ApproveArgs {
9    pub keypair_path: Option<PathBuf>,
10    pub rpc_url: Option<String>,
11    pub asset: Pubkey,
12    pub delegate: Pubkey,
13    pub role: Vec<String>,
14}
15
16pub fn handle_approve(args: ApproveArgs) -> Result<()> {
17    let config = CliConfig::new(args.keypair_path, args.rpc_url)?;
18
19    let owner_sk = config.keypair;
20
21    let owner = owner_sk.pubkey();
22    let asset = args.asset;
23    let delegate = args.delegate;
24
25    let roles = args
26        .role
27        .iter()
28        .map(|role| match role.to_lowercase().as_str() {
29            "burn" => DelegateRole::Burn,
30            "lock" => DelegateRole::Lock,
31            "transfer" => DelegateRole::Transfer,
32            _ => panic!("Invalid role: {}", role),
33        })
34        .collect();
35
36    let args = ApproveInstructionArgs {
37        delegate_input: DelegateInput::Some { roles },
38    };
39
40    let ix = Approve {
41        asset,
42        owner,
43        delegate,
44    }
45    .instruction(args);
46
47    let sig = send_and_confirm_tx(&config.client, &[&owner_sk], &[ix])?;
48
49    println!("Setting {delegate} as a delegate on asset {asset} in tx: {sig}");
50
51    Ok(())
52}