diff --git a/terra/contracts/token-bridge/src/contract.rs b/terra/contracts/token-bridge/src/contract.rs index d016b275..5d6dc05a 100644 --- a/terra/contracts/token-bridge/src/contract.rs +++ b/terra/contracts/token-bridge/src/contract.rs @@ -17,7 +17,7 @@ use cw20_base::msg::QueryMsg as TokenQuery; use wormhole::msg::HandleMsg as WormholeHandleMsg; use wormhole::msg::QueryMsg as WormholeQueryMsg; -use wormhole::state::{GovernancePacket, ParsedVAA}; +use wormhole::state::{GovernancePacket, ParsedVAA, vaa_archive_add, vaa_archive_check}; use cw20::TokenInfoResponse; @@ -246,6 +246,11 @@ fn submit_vaa( return handle_governance_payload(deps, env, &data); } + if vaa_archive_check(&deps.storage, vaa.hash.as_slice()) { + return ContractError::VaaAlreadyExecuted.std_err(); + } + vaa_archive_add(&mut deps.storage, vaa.hash.as_slice())?; + let message = TokenBridgeMessage::deserialize(&data)?; let result = match message.action { diff --git a/terra/contracts/wormhole/src/contract.rs b/terra/contracts/wormhole/src/contract.rs index cd7c5e3d..994acab8 100644 --- a/terra/contracts/wormhole/src/contract.rs +++ b/terra/contracts/wormhole/src/contract.rs @@ -11,8 +11,8 @@ use crate::msg::{ }; use crate::state::{ config, config_read, guardian_set_get, guardian_set_set, sequence_read, sequence_set, - vaa_archive_check, ConfigInfo, GovernancePacket, GuardianAddress, GuardianSetInfo, - GuardianSetUpgrade, ParsedVAA, SetFee, TransferFee, + vaa_archive_add, vaa_archive_check, ConfigInfo, GovernancePacket, GuardianAddress, + GuardianSetInfo, GuardianSetUpgrade, ParsedVAA, SetFee, TransferFee, }; use k256::ecdsa::recoverable::Id as RecoverableId; @@ -79,6 +79,8 @@ fn handle_submit_vaa( let state = config_read(&deps.storage).load()?; let vaa = parse_and_verify_vaa(&deps.storage, data, env.block.time)?; + vaa_archive_add(&mut deps.storage, vaa.hash.as_slice())?; + if state.gov_chain == vaa.emitter_chain && state.gov_address == vaa.emitter_address { if state.guardian_set_index != vaa.guardian_set_index { return Err(StdError::generic_err(