#![cfg(feature = "test-bpf")]
mod utils;
use mpl_token_metadata::pda::find_collection_authority_account;
use mpl_token_metadata::state::Collection;
use mpl_token_metadata::state::{UseMethod, Uses};
use mpl_token_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 mpl_token_metadata::state::{CollectionAuthorityRecord, UseAuthorityRecord};
use solana_program::borsh::try_from_slice_unchecked;
use solana_sdk::account::{Account, AccountSharedData};
use solana_sdk::transaction::Transaction;
use mpl_token_metadata::pda::{find_program_as_burner_account, find_use_authority_account};
use mpl_token_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 mpl_token_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: mpl_token_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 = mpl_token_metadata::instruction::utilize(
mpl_token_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);
}
}