nifty_cli/commands/
mint.rs

1use crate::transaction::pack_instructions;
2
3use super::*;
4
5pub struct MintArgs {
6    pub keypair_path: Option<PathBuf>,
7    pub rpc_url: Option<String>,
8    pub asset_file_path: PathBuf,
9}
10
11pub async fn handle_mint(args: MintArgs) -> Result<()> {
12    let config = CliConfig::new(args.keypair_path, args.rpc_url)?;
13
14    let asset_data: AssetFile = serde_json::from_reader(File::open(args.asset_file_path)?)?;
15
16    let asset_sk = if let Some(path) = asset_data.asset_keypair_path {
17        read_keypair_file(path).expect("failed to read keypair file")
18    } else {
19        Keypair::new()
20    };
21    let authority_sk = config.keypair;
22
23    let asset = asset_sk.pubkey();
24    let owner = asset_data.owner;
25
26    let accounts = MintAccounts {
27        asset,
28        owner,
29        payer: Some(authority_sk.pubkey()),
30    };
31    let asset_args = AssetArgs {
32        name: asset_data.name,
33        standard: Standard::NonFungible,
34        mutable: asset_data.mutable,
35    };
36
37    let extension_args = asset_data
38        .extensions
39        .iter()
40        .map(|extension| ExtensionArgs {
41            extension_type: extension.extension_type.clone(),
42            data: extension.value.clone().into_data(),
43        })
44        .collect::<Vec<ExtensionArgs>>();
45
46    let instructions = mint(MintIxArgs {
47        accounts,
48        asset_args,
49        extension_args,
50    })?;
51
52    let packed_instructions = pack_instructions(2, &authority_sk.pubkey(), &instructions);
53
54    // Instructions are packed to max data length sizes, so we only put one in each tx.
55    for instructions in packed_instructions {
56        let sig = send_and_confirm_tx(&config.client, &[&authority_sk, &asset_sk], &instructions)?;
57        println!("sig: {}", sig);
58    }
59
60    println!("Minted asset: {}", asset);
61
62    Ok(())
63}