Encode mint in token ID on Solana

Change-Id: Ice9c2b64992e60bb8a0eb5d0a109043eda2d44ac
This commit is contained in:
Hendrik Hofstadt 2021-09-20 12:49:29 +02:00
parent 371c9b3dcc
commit 64b17d851a
3 changed files with 15 additions and 4 deletions

View File

@ -101,7 +101,13 @@ pub fn complete_native(
} }
// Verify VAA // Verify VAA
if accs.vaa.token_address != accs.mint.info().key.to_bytes() { // Please refer to transfer.rs for why the token id is used to store the mint
if accs.vaa.token_address != [1u8; 32] {
return Err(InvalidMint.into());
}
let mut token_id_bytes = [0u8; 32];
accs.vaa.token_id.to_big_endian(&mut token_id_bytes);
if token_id_bytes != accs.mint.info().key.to_bytes() {
return Err(InvalidMint.into()); return Err(InvalidMint.into());
} }
if accs.vaa.token_chain != CHAIN_ID_SOLANA { if accs.vaa.token_chain != CHAIN_ID_SOLANA {

View File

@ -187,15 +187,18 @@ pub fn transfer_native(
Metadata::from_account_info(accs.spl_metadata.info()).ok_or(InvalidMetadata)?; Metadata::from_account_info(accs.spl_metadata.info()).ok_or(InvalidMetadata)?;
// Post message // Post message
// Given there is no tokenID equivalent on Solana and each distinct token address is translated
// into a new contract on EVM based chains (which is costly), we use a static token_address
// and encode the mint in the token_id.
let payload = PayloadTransfer { let payload = PayloadTransfer {
token_address: accs.mint.info().key.to_bytes(), token_address: [1u8; 32],
token_chain: 1, token_chain: 1,
to: data.target_address, to: data.target_address,
to_chain: data.target_chain, to_chain: data.target_chain,
symbol: metadata.data.symbol, symbol: metadata.data.symbol,
name: metadata.data.name, name: metadata.data.name,
uri: metadata.data.uri, uri: metadata.data.uri,
token_id: U256::from(0), // TODO token_id: U256::from_big_endian(&accs.mint.info().key.to_bytes()),
}; };
let params = ( let params = (
bridge::instruction::Instruction::PostMessage, bridge::instruction::Instruction::PostMessage,

View File

@ -168,6 +168,8 @@ pub fn complete_transfer_native_ix(
payload: vaa.payload, payload: vaa.payload,
}; };
let mut mint_bytes = [0u8; 32];
payload.token_id.to_big_endian(&mut mint_bytes);
let ix = complete_native( let ix = complete_native(
program_id, program_id,
bridge_id, bridge_id,
@ -175,7 +177,7 @@ pub fn complete_transfer_native_ix(
message_key, message_key,
post_vaa_data, post_vaa_data,
to_authority, to_authority,
Pubkey::new(&payload.token_address), Pubkey::new(&mint_bytes),
CompleteNativeData {}, CompleteNativeData {},
) )
.unwrap(); .unwrap();