diff --git a/solana/modules/token_bridge/program/src/accounts.rs b/solana/modules/token_bridge/program/src/accounts.rs index ef677a112..a2980d29e 100644 --- a/solana/modules/token_bridge/program/src/accounts.rs +++ b/solana/modules/token_bridge/program/src/accounts.rs @@ -86,3 +86,19 @@ impl<'b, const State: AccountState> Seeded<&EndpointDerivationData> for Endpoint ] } } + +pub type SplTokenMeta<'b> = Info<'b>; + +pub struct SplTokenMetaDerivationData { + pub mint: Pubkey, +} + +impl<'b> Seeded<&SplTokenMetaDerivationData> for SplTokenMeta<'b> { + fn seeds(data: &SplTokenMetaDerivationData) -> Vec> { + vec![ + "metadata".as_bytes().to_vec(), + spl_token_metadata::id().as_ref().to_vec(), + data.mint.as_ref().to_vec(), + ] + } +} diff --git a/solana/modules/token_bridge/program/src/api/attest.rs b/solana/modules/token_bridge/program/src/api/attest.rs index 1224a9bd3..85ce776b4 100644 --- a/solana/modules/token_bridge/program/src/api/attest.rs +++ b/solana/modules/token_bridge/program/src/api/attest.rs @@ -2,6 +2,8 @@ use crate::{ accounts::{ ConfigAccount, EmitterAccount, + SplTokenMeta, + SplTokenMetaDerivationData, WrappedMetaDerivationData, WrappedTokenMeta, }, @@ -71,7 +73,7 @@ pub struct AttestToken<'b> { pub wrapped_meta: WrappedTokenMeta<'b, { AccountState::Uninitialized }>, /// SPL Metadata for the associated Mint - pub spl_metadata: Info<'b>, + pub spl_metadata: SplTokenMeta<'b>, /// CPI Context pub bridge: Mut>, @@ -102,6 +104,14 @@ impl<'a> From<&AttestToken<'a>> for WrappedMetaDerivationData { } } +impl<'a> From<&AttestToken<'a>> for SplTokenMetaDerivationData { + fn from(accs: &AttestToken<'a>) -> Self { + SplTokenMetaDerivationData { + mint: *accs.mint.info().key, + } + } +} + #[derive(BorshDeserialize, BorshSerialize, Default)] pub struct AttestTokenData { pub nonce: u32, @@ -134,6 +144,10 @@ pub fn attest_token( // Assign metadata if an SPL Metadata account exists for the SPL token in question. if !accs.spl_metadata.data_is_empty() { + let derivation_data: SplTokenMetaDerivationData = (&*accs).into(); + accs.spl_metadata + .verify_derivation(&spl_token_metadata::id(), &derivation_data)?; + if *accs.spl_metadata.owner != spl_token_metadata::id() { return Err(WrongAccountOwner.into()); } diff --git a/solana/modules/token_bridge/program/src/instructions.rs b/solana/modules/token_bridge/program/src/instructions.rs index 76b97c3a1..e853c60a3 100644 --- a/solana/modules/token_bridge/program/src/instructions.rs +++ b/solana/modules/token_bridge/program/src/instructions.rs @@ -9,6 +9,8 @@ use crate::{ Endpoint, EndpointDerivationData, MintSigner, + SplTokenMeta, + SplTokenMetaDerivationData, WrappedDerivationData, WrappedMetaDerivationData, WrappedMint, @@ -447,24 +449,27 @@ pub fn attest( message_key: Pubkey, mint: Pubkey, decimals: u8, - mint_meta: Pubkey, - spl_metadata: Pubkey, - symbol: String, - name: String, nonce: u32, ) -> solitaire::Result { let config_key = ConfigAccount::<'_, { AccountState::Uninitialized }>::key(None, &program_id); let emitter_key = EmitterAccount::key(None, &program_id); - // Bridge keys + // SPL Metadata + let spl_metadata = SplTokenMeta::key( + &SplTokenMetaDerivationData { mint }, + &spl_token_metadata::id(), + ); + + // Mint Metadata + let mint_meta = WrappedTokenMeta::<'_, { AccountState::Uninitialized }>::key( + &WrappedMetaDerivationData { + mint_key: mint, + }, + &bridge_id, + ); + + // Bridge Keys let bridge_config = Bridge::<'_, { AccountState::Uninitialized }>::key(None, &bridge_id); - let payload = PayloadAssetMeta { - token_address: mint.to_bytes(), - token_chain: 1, - decimals, - symbol, - name, - }; let sequence_key = Sequence::key( &SequenceDerivationData { emitter_key: &emitter_key, diff --git a/solana/modules/token_bridge/program/src/types.rs b/solana/modules/token_bridge/program/src/types.rs index e666bd18b..fa4c1005e 100644 --- a/solana/modules/token_bridge/program/src/types.rs +++ b/solana/modules/token_bridge/program/src/types.rs @@ -19,7 +19,6 @@ use spl_token::state::{ Mint, }; use spl_token_metadata::state::Metadata; -use std::str::FromStr; pub type Address = [u8; 32]; pub type ChainID = u16; diff --git a/solana/modules/token_bridge/program/src/wasm.rs b/solana/modules/token_bridge/program/src/wasm.rs index aa447052d..253a30591 100644 --- a/solana/modules/token_bridge/program/src/wasm.rs +++ b/solana/modules/token_bridge/program/src/wasm.rs @@ -58,7 +58,6 @@ pub fn attest_ix( message: String, mint: String, decimals: u8, - mint_meta: String, nonce: u32, ) -> JsValue { let program_id = Pubkey::from_str(program_id.as_str()).unwrap(); @@ -66,10 +65,15 @@ pub fn attest_ix( let payer = Pubkey::from_str(payer.as_str()).unwrap(); let message = Pubkey::from_str(message.as_str()).unwrap(); let mint = Pubkey::from_str(mint.as_str()).unwrap(); - let mint_meta = Pubkey::from_str(mint_meta.as_str()).unwrap(); let ix = attest( - program_id, bridge_id, payer, message, mint, decimals, mint_meta, nonce, + program_id, + bridge_id, + payer, + message, + mint, + decimals, + nonce, ) .unwrap();