From 042ff4a14b3d8bd9fc7e8eef0d9bcdb3aff8ae1c Mon Sep 17 00:00:00 2001 From: Hendrik Hofstadt Date: Mon, 24 Aug 2020 12:56:19 +0200 Subject: [PATCH] bridge: properly handle VAA submissions --- solana/bridge/src/error.rs | 3 +++ solana/bridge/src/error_program.rs | 1 + solana/bridge/src/instruction.rs | 4 +++- solana/bridge/src/processor.rs | 12 +++++++++++- solana/bridge/src/state.rs | 5 +++-- 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/solana/bridge/src/error.rs b/solana/bridge/src/error.rs index d6be9559b..4fd490e51 100644 --- a/solana/bridge/src/error.rs +++ b/solana/bridge/src/error.rs @@ -100,6 +100,9 @@ pub enum Error { /// Cannot wrap a solana native asset #[error("CannotWrapNative")] CannotWrapNative, + /// VAA for this transfer has already been submitted + #[error("VAAAlreadySubmitted")] + VAAAlreadySubmitted, } impl From for ProgramError { diff --git a/solana/bridge/src/error_program.rs b/solana/bridge/src/error_program.rs index 7ca7dd392..0b40be5fa 100644 --- a/solana/bridge/src/error_program.rs +++ b/solana/bridge/src/error_program.rs @@ -38,6 +38,7 @@ impl PrintProgramError for Error { Error::SameChainTransfer => info!("Error: SameChainTransfer"), Error::VAATooLong => info!("Error: VAATooLong"), Error::CannotWrapNative => info!("Error: CannotWrapNative"), + Error::VAAAlreadySubmitted => info!("Error: VAAAlreadySubmitted"), } } } diff --git a/solana/bridge/src/instruction.rs b/solana/bridge/src/instruction.rs index 3a37e2cb0..4407916a5 100644 --- a/solana/bridge/src/instruction.rs +++ b/solana/bridge/src/instruction.rs @@ -22,10 +22,12 @@ use crate::vaa::{VAABody, VAA}; pub const CHAIN_ID_SOLANA: u8 = 1; /// maximum number of guardians pub const MAX_LEN_GUARDIAN_KEYS: usize = 20; +/// maximum size of a posted VAA +pub const MAX_VAA_SIZE: usize = 1000; /// size of a foreign address in bytes const FOREIGN_ADDRESS_SIZE: usize = 32; -/// length-prefixed serialized validator payment approval data +/// serialized VAA data pub type VAAData = Vec; /// X and Y point of P for guardians pub type GuardianKey = [u8; 64]; diff --git a/solana/bridge/src/processor.rs b/solana/bridge/src/processor.rs index 75299a5bf..233a19c13 100644 --- a/solana/bridge/src/processor.rs +++ b/solana/bridge/src/processor.rs @@ -654,9 +654,19 @@ impl Bridge { if !proposal.matches_vaa(b) { return Err(Error::VAAProposalMismatch.into()); } + if proposal.vaa_time != 0 { + return Err(Error::VAAAlreadySubmitted.into()); + } + if vaa_data.len() > MAX_VAA_SIZE { + return Err(Error::VAATooLong.into()); + } // Set vaa - proposal.vaa; + for i in 0..vaa_data.len() { + proposal.vaa[i] = vaa_data[i] + } + // Stop byte + proposal.vaa[vaa_data.len()] = 0xff; proposal.vaa_time = vaa.timestamp; Ok(()) diff --git a/solana/bridge/src/state.rs b/solana/bridge/src/state.rs index 5d207c24f..2a7076c79 100644 --- a/solana/bridge/src/state.rs +++ b/solana/bridge/src/state.rs @@ -11,7 +11,7 @@ use solana_sdk::{account_info::AccountInfo, program_error::ProgramError, pubkey: use zerocopy::AsBytes; use crate::error::Error; -use crate::instruction::{ForeignAddress, VAAData, MAX_LEN_GUARDIAN_KEYS}; +use crate::instruction::{ForeignAddress, VAAData, MAX_LEN_GUARDIAN_KEYS, MAX_VAA_SIZE}; use crate::vaa::BodyTransfer; /// fee rate as a ratio @@ -65,7 +65,8 @@ pub struct TransferOutProposal { /// nonce of the transfer pub nonce: u32, /// vaa to unlock the tokens on the foreign chain - pub vaa: [u8; 1000], + /// it is +1 byte long to make space for the termination byte + pub vaa: [u8; MAX_VAA_SIZE + 1], /// time the vaa was submitted pub vaa_time: u32,