#![cfg(feature = "test-bpf")] mod utils; use sol_nft_metadata::pda::find_collection_authority_account; use sol_nft_metadata::state::Collection; use sol_nft_metadata::state::{UseMethod, Uses}; use sol_nft_metadata::{ error::MetadataError, state::{Key, MAX_NAME_LENGTH, MAX_SYMBOL_LENGTH, MAX_URI_LENGTH}, utils::puffed_out_string, }; use num_traits::FromPrimitive; use solana_program_test::*; use solana_sdk::{ instruction::InstructionError, signature::{Keypair, Signer}, transaction::TransactionError, transport::TransportError, }; use utils::*; use borsh::{BorshSerialize}; use sol_nft_metadata::state::{CollectionAuthorityRecord, UseAuthorityRecord}; use solana_program::borsh::try_from_slice_unchecked; use solana_sdk::account::{Account, AccountSharedData}; use solana_sdk::transaction::Transaction; use sol_nft_metadata::pda::{find_program_as_burner_account, find_use_authority_account}; use sol_nft_metadata::state::Key as MetadataKey; use solana_sdk::account::{ReadableAccount, WritableAccount}; mod bump_seed_migration { use std::borrow::BorrowMut; use solana_program::program_memory::sol_memset; use sol_nft_metadata::state::USE_AUTHORITY_RECORD_SIZE; use super::*; #[tokio::test] async fn success_migrate_account() { let mut context = program_test().start_with_context().await; let name = "Test".to_string(); let symbol = "TST".to_string(); let uri = "uri".to_string(); let test_metadata = Metadata::new(); let puffed_name = puffed_out_string(&name, MAX_NAME_LENGTH); let puffed_symbol = puffed_out_string(&symbol, MAX_SYMBOL_LENGTH); let puffed_uri = puffed_out_string(&uri, MAX_URI_LENGTH); let uses = Some(Uses { total: 1, remaining: 1, use_method: UseMethod::Single, }); test_metadata .create_v2( &mut context, name, symbol, uri, None, 10, false, None, None, uses.to_owned(), ) .await .unwrap(); let use_authority_account = Keypair::new(); let (record, record_bump) = find_use_authority_account(&test_metadata.mint.pubkey(), &use_authority_account.pubkey()); let use_record_struct = UseAuthorityRecord { key: MetadataKey::UseAuthorityRecord, allowed_uses: 10, bump: 0 }; let mut account = Account { lamports: 1113600, data: vec![], owner: sol_nft_metadata::id(), executable: false, rent_epoch: 1 }; let data_mut = account.data_mut(); use_record_struct.serialize(data_mut).unwrap(); data_mut.append(&mut vec![0,0,0,0,0,0,0,0]); let shared_data = &AccountSharedData::from(account); context.set_account(&record, shared_data); airdrop(&mut context, &use_authority_account.pubkey(), 1113600).await.unwrap(); let (burner, _) = find_program_as_burner_account(); let utilize_with_use_authority = sol_nft_metadata::instruction::utilize( sol_nft_metadata::id(), test_metadata.pubkey.clone(), test_metadata.token.pubkey(), test_metadata.mint.pubkey(), Some(record), use_authority_account.pubkey(), context.payer.pubkey(), Some(burner), 1, ); let tx = Transaction::new_signed_with_payer( &[utilize_with_use_authority], Some(&use_authority_account.pubkey()), &[&use_authority_account], context.last_blockhash, ); context.banks_client.process_transaction(tx).await.unwrap(); let account_after = context.banks_client.get_account(record).await.unwrap().unwrap(); let uar : UseAuthorityRecord = try_from_slice_unchecked(&account_after.data).unwrap(); assert_eq!(uar.bump, record_bump); } }