nifty_cli/commands/
mint.rs1use 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 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}