diff --git a/cosmwasm/contracts/token-bridge/src/contract.rs b/cosmwasm/contracts/token-bridge/src/contract.rs index 62af2a9a8..81ce3b988 100644 --- a/cosmwasm/contracts/token-bridge/src/contract.rs +++ b/cosmwasm/contracts/token-bridge/src/contract.rs @@ -77,6 +77,7 @@ use crate::{ ExecuteMsg, ExternalIdResponse, InstantiateMsg, + IsVaaRedeemedResponse, MigrateMsg, QueryMsg, TransferInfoResponse, @@ -1456,6 +1457,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { } QueryMsg::TransferInfo { vaa } => to_binary(&query_transfer_info(deps, env, &vaa)?), QueryMsg::ExternalId { external_id } => to_binary(&query_external_id(deps, external_id)?), + QueryMsg::IsVaaRedeemed { vaa } => to_binary(&query_is_vaa_redeemed(deps, env, &vaa)?), } } @@ -1526,6 +1528,13 @@ fn query_transfer_info(deps: Deps, env: Env, vaa: &Binary) -> StdResult StdResult { + let vaa = ParsedVAA::deserialize(vaa)?; + Ok(IsVaaRedeemedResponse { + is_redeemed: vaa_archive_check(deps.storage, vaa.hash.as_slice()), + }) +} + fn is_governance_emitter(cfg: &ConfigInfo, emitter_chain: u16, emitter_address: &[u8]) -> bool { cfg.gov_chain == emitter_chain && cfg.gov_address == emitter_address } diff --git a/cosmwasm/contracts/token-bridge/src/msg.rs b/cosmwasm/contracts/token-bridge/src/msg.rs index 1be35faa5..dc431c035 100644 --- a/cosmwasm/contracts/token-bridge/src/msg.rs +++ b/cosmwasm/contracts/token-bridge/src/msg.rs @@ -87,6 +87,7 @@ pub enum QueryMsg { WrappedRegistry { chain: u16, address: Binary }, TransferInfo { vaa: Binary }, ExternalId { external_id: Binary }, + IsVaaRedeemed { vaa: Binary }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -112,3 +113,9 @@ pub struct TransferInfoResponse { pub struct ExternalIdResponse { pub token_id: TokenId, } + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct IsVaaRedeemedResponse { + pub is_redeemed: bool, +}