From 51cf1e35ee28cb2fe35b119c5d003cc3bfa5d76e Mon Sep 17 00:00:00 2001 From: Jeremy Bogle Date: Tue, 14 Feb 2023 18:29:32 -0500 Subject: [PATCH] Optimize compute (#412) * Optimize compute * Remove error * Compute change everywhere for pnft migration --- .../src/instructions/claim.rs | 26 ++++++------------ .../src/instructions/invalidate.rs | 26 ++++++------------ .../src/instructions/unissue.rs | 27 ++++++------------- 3 files changed, 24 insertions(+), 55 deletions(-) diff --git a/programs/cardinal-token-manager/src/instructions/claim.rs b/programs/cardinal-token-manager/src/instructions/claim.rs index 4e47db19c..1e567969c 100644 --- a/programs/cardinal-token-manager/src/instructions/claim.rs +++ b/programs/cardinal-token-manager/src/instructions/claim.rs @@ -64,26 +64,16 @@ pub fn handler<'key, 'accounts, 'remaining, 'info>(ctx: Context<'key, 'accounts, if token_manager.kind != TokenManagerKind::Programmable as u8 { // look at next account if let Some(next_account) = remaining_accs.peek() { - match assert_derivation( - &mpl_token_metadata::id(), - &next_account.to_account_info(), - &[mpl_token_metadata::state::PREFIX.as_bytes(), mpl_token_metadata::id().as_ref(), mint.as_ref()], - ) { - // migrated pnft - Ok(_) => { - let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); - let metadata = Metadata::deserialize(&mut mint_metadata_data.as_ref()).expect("Failed to deserialize metadata"); - match metadata.token_standard { - Some(TokenStandard::ProgrammableNonFungible) => { - // pop this account and update type - next_account_info(remaining_accs)?; - token_manager.kind = TokenManagerKind::Programmable as u8; - } - _ => return Err(error!(ErrorCode::InvalidTokenManagerKind)), + if next_account.owner == &mpl_token_metadata::id() { + let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); + if let Ok(metadata) = Metadata::deserialize(&mut mint_metadata_data.as_ref()) { + // migrated pnft + if metadata.token_standard == Some(TokenStandard::ProgrammableNonFungible) && metadata.mint == mint { + // pop this account and update type + next_account_info(remaining_accs)?; + token_manager.kind = TokenManagerKind::Programmable as u8; } } - // regular edition - _ => {} } } } diff --git a/programs/cardinal-token-manager/src/instructions/invalidate.rs b/programs/cardinal-token-manager/src/instructions/invalidate.rs index 884e4c69c..f22f81cde 100644 --- a/programs/cardinal-token-manager/src/instructions/invalidate.rs +++ b/programs/cardinal-token-manager/src/instructions/invalidate.rs @@ -65,26 +65,16 @@ pub fn handler<'key, 'accounts, 'remaining, 'info>(ctx: Context<'key, 'accounts, if token_manager.kind != TokenManagerKind::Programmable as u8 { // look at next account if let Some(next_account) = remaining_accs.peek() { - match assert_derivation( - &mpl_token_metadata::id(), - &next_account.to_account_info(), - &[mpl_token_metadata::state::PREFIX.as_bytes(), mpl_token_metadata::id().as_ref(), mint.as_ref()], - ) { - // migrated pnft - Ok(_) => { - let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); - let metadata = Metadata::deserialize(&mut mint_metadata_data.as_ref()).expect("Failed to deserialize metadata"); - match metadata.token_standard { - Some(TokenStandard::ProgrammableNonFungible) => { - // pop this account and update type - next_account_info(remaining_accs)?; - token_manager.kind = TokenManagerKind::Programmable as u8; - } - _ => return Err(error!(ErrorCode::InvalidTokenManagerKind)), + if next_account.owner == &mpl_token_metadata::id() { + let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); + if let Ok(metadata) = Metadata::deserialize(&mut mint_metadata_data.as_ref()) { + // migrated pnft + if metadata.token_standard == Some(TokenStandard::ProgrammableNonFungible) && metadata.mint == mint { + // pop this account and update type + next_account_info(remaining_accs)?; + token_manager.kind = TokenManagerKind::Programmable as u8; } } - // regular edition - _ => {} } } } diff --git a/programs/cardinal-token-manager/src/instructions/unissue.rs b/programs/cardinal-token-manager/src/instructions/unissue.rs index 7b3252600..d5c7219db 100644 --- a/programs/cardinal-token-manager/src/instructions/unissue.rs +++ b/programs/cardinal-token-manager/src/instructions/unissue.rs @@ -11,7 +11,6 @@ use mpl_token_metadata::instruction::MetadataInstruction; use mpl_token_metadata::instruction::TransferArgs; use mpl_token_metadata::state::Metadata; use mpl_token_metadata::state::TokenStandard; -use mpl_token_metadata::utils::assert_derivation; use solana_program::instruction::Instruction; use solana_program::program::invoke_signed; @@ -43,26 +42,16 @@ pub fn handler<'key, 'accounts, 'remaining, 'info>(ctx: Context<'key, 'accounts, if token_manager.kind != TokenManagerKind::Programmable as u8 { // look at next account if let Some(next_account) = remaining_accs.peek() { - match assert_derivation( - &mpl_token_metadata::id(), - &next_account.to_account_info(), - &[mpl_token_metadata::state::PREFIX.as_bytes(), mpl_token_metadata::id().as_ref(), mint.as_ref()], - ) { - // migrated pnft - Ok(_) => { - let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); - let metadata = Metadata::deserialize(&mut mint_metadata_data.as_ref()).expect("Failed to deserialize metadata"); - match metadata.token_standard { - Some(TokenStandard::ProgrammableNonFungible) => { - // pop this account and update type - next_account_info(remaining_accs)?; - token_manager.kind = TokenManagerKind::Programmable as u8; - } - _ => return Err(error!(ErrorCode::InvalidTokenManagerKind)), + if next_account.owner == &mpl_token_metadata::id() { + let mint_metadata_data = next_account.try_borrow_mut_data().expect("Failed to borrow data"); + if let Ok(metadata) = Metadata::deserialize(&mut mint_metadata_data.as_ref()) { + // migrated pnft + if metadata.token_standard == Some(TokenStandard::ProgrammableNonFungible) && metadata.mint == mint { + // pop this account and update type + next_account_info(remaining_accs)?; + token_manager.kind = TokenManagerKind::Programmable as u8; } } - // regular edition - _ => {} } } }