#![cfg(feature = "test-sbf")]
pub mod setup;
use mpl_core::{
instructions::TransferV1Builder,
types::{Creator, Plugin, PluginAuthorityPair, Royalties, RuleSet, UpdateAuthority},
};
pub use setup::*;
use solana_program_test::tokio;
use solana_sdk::{signature::Keypair, signer::Signer, transaction::Transaction};
#[tokio::test]
async fn transfer_asset_as_owner() {
let mut context = program_test().start_with_context().await;
let asset = Keypair::new();
create_asset(
&mut context,
CreateAssetHelperArgs {
owner: None,
payer: None,
asset: &asset,
data_state: None,
name: None,
uri: None,
authority: None,
update_authority: None,
collection: None,
plugins: vec![],
external_plugin_adapters: vec![],
},
)
.await
.unwrap();
let new_owner = Keypair::new();
let transfer_ix = TransferV1Builder::new()
.asset(asset.pubkey())
.payer(context.payer.pubkey())
.new_owner(new_owner.pubkey())
.instruction();
let tx = Transaction::new_signed_with_payer(
&[transfer_ix],
Some(&context.payer.pubkey()),
&[&context.payer],
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await.unwrap();
let update_authority = context.payer.pubkey();
assert_asset(
&mut context,
AssertAssetHelperArgs {
asset: asset.pubkey(),
owner: new_owner.pubkey(),
update_authority: Some(UpdateAuthority::Address(update_authority)),
name: None,
uri: None,
plugins: vec![],
external_plugin_adapters: vec![],
},
)
.await;
}
#[tokio::test]
async fn transfer_asset_with_royalties() {
let mut context = program_test().start_with_context().await;
let asset = Keypair::new();
let update_authority = context.payer.pubkey();
create_asset(
&mut context,
CreateAssetHelperArgs {
owner: None,
payer: None,
asset: &asset,
data_state: None,
name: None,
uri: None,
authority: None,
update_authority: None,
collection: None,
plugins: vec![PluginAuthorityPair {
authority: None,
plugin: Plugin::Royalties(Royalties {
basis_points: 500,
creators: vec![Creator {
address: update_authority,
percentage: 100,
}],
rule_set: RuleSet::ProgramDenyList(vec![]),
}),
}],
external_plugin_adapters: vec![],
},
)
.await
.unwrap();
let new_owner = Keypair::new();
let transfer_ix = TransferV1Builder::new()
.asset(asset.pubkey())
.payer(context.payer.pubkey())
.new_owner(new_owner.pubkey())
.instruction();
let tx = Transaction::new_signed_with_payer(
&[transfer_ix],
Some(&context.payer.pubkey()),
&[&context.payer],
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await.unwrap();
assert_asset(
&mut context,
AssertAssetHelperArgs {
asset: asset.pubkey(),
owner: new_owner.pubkey(),
update_authority: Some(UpdateAuthority::Address(update_authority)),
name: None,
uri: None,
plugins: vec![PluginAuthorityPair {
authority: None,
plugin: Plugin::Royalties(Royalties {
basis_points: 500,
creators: vec![Creator {
address: update_authority,
percentage: 100,
}],
rule_set: RuleSet::ProgramDenyList(vec![]),
}),
}],
external_plugin_adapters: vec![],
},
)
.await;
}