From c0c32c3c891affaf6b8594ef8b96116d2ed8b993 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 19 Apr 2024 09:57:15 +0200 Subject: [PATCH] Adjust source chain callback type --- .../ibc-callbacks/schema/ibc-callbacks.json | 78 +++++++++---------- .../raw/response_to_callback_stats.json | 78 +++++++++---------- contracts/ibc-callbacks/src/contract.rs | 25 ++---- contracts/ibc-callbacks/src/state.rs | 8 +- packages/std/src/ibc/callbacks.rs | 39 ++++++++-- packages/std/src/lib.rs | 11 +-- packages/vm/src/calls.rs | 22 ++++-- 7 files changed, 140 insertions(+), 121 deletions(-) diff --git a/contracts/ibc-callbacks/schema/ibc-callbacks.json b/contracts/ibc-callbacks/schema/ibc-callbacks.json index 3d9f969cdb..346aa4e9d9 100644 --- a/contracts/ibc-callbacks/schema/ibc-callbacks.json +++ b/contracts/ibc-callbacks/schema/ibc-callbacks.json @@ -109,7 +109,7 @@ "ibc_ack_callbacks": { "type": "array", "items": { - "$ref": "#/definitions/IbcPacketAckMsg" + "$ref": "#/definitions/IbcAckCallbackMsg" } }, "ibc_destination_callbacks": { @@ -121,7 +121,7 @@ "ibc_timeout_callbacks": { "type": "array", "items": { - "$ref": "#/definitions/IbcPacketTimeoutMsg" + "$ref": "#/definitions/IbcTimeoutCallbackMsg" } } }, @@ -135,6 +135,26 @@ "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", "type": "string" }, + "IbcAckCallbackMsg": { + "type": "object", + "required": [ + "acknowledgement", + "original_packet", + "relayer" + ], + "properties": { + "acknowledgement": { + "$ref": "#/definitions/IbcAcknowledgement" + }, + "original_packet": { + "$ref": "#/definitions/IbcPacket" + }, + "relayer": { + "$ref": "#/definitions/Addr" + } + }, + "additionalProperties": false + }, "IbcAcknowledgement": { "type": "object", "required": [ @@ -249,44 +269,6 @@ }, "additionalProperties": false }, - "IbcPacketAckMsg": { - "description": "The message that is passed into `ibc_packet_ack`", - "type": "object", - "required": [ - "acknowledgement", - "original_packet", - "relayer" - ], - "properties": { - "acknowledgement": { - "$ref": "#/definitions/IbcAcknowledgement" - }, - "original_packet": { - "$ref": "#/definitions/IbcPacket" - }, - "relayer": { - "$ref": "#/definitions/Addr" - } - }, - "additionalProperties": false - }, - "IbcPacketTimeoutMsg": { - "description": "The message that is passed into `ibc_packet_timeout`", - "type": "object", - "required": [ - "packet", - "relayer" - ], - "properties": { - "packet": { - "$ref": "#/definitions/IbcPacket" - }, - "relayer": { - "$ref": "#/definitions/Addr" - } - }, - "additionalProperties": false - }, "IbcTimeout": { "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", "type": "object", @@ -337,6 +319,22 @@ }, "additionalProperties": false }, + "IbcTimeoutCallbackMsg": { + "type": "object", + "required": [ + "packet", + "relayer" + ], + "properties": { + "packet": { + "$ref": "#/definitions/IbcPacket" + }, + "relayer": { + "$ref": "#/definitions/Addr" + } + }, + "additionalProperties": false + }, "Timestamp": { "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", "allOf": [ diff --git a/contracts/ibc-callbacks/schema/raw/response_to_callback_stats.json b/contracts/ibc-callbacks/schema/raw/response_to_callback_stats.json index fd27793095..ec5ab4a057 100644 --- a/contracts/ibc-callbacks/schema/raw/response_to_callback_stats.json +++ b/contracts/ibc-callbacks/schema/raw/response_to_callback_stats.json @@ -12,7 +12,7 @@ "ibc_ack_callbacks": { "type": "array", "items": { - "$ref": "#/definitions/IbcPacketAckMsg" + "$ref": "#/definitions/IbcAckCallbackMsg" } }, "ibc_destination_callbacks": { @@ -24,7 +24,7 @@ "ibc_timeout_callbacks": { "type": "array", "items": { - "$ref": "#/definitions/IbcPacketTimeoutMsg" + "$ref": "#/definitions/IbcTimeoutCallbackMsg" } } }, @@ -38,6 +38,26 @@ "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", "type": "string" }, + "IbcAckCallbackMsg": { + "type": "object", + "required": [ + "acknowledgement", + "original_packet", + "relayer" + ], + "properties": { + "acknowledgement": { + "$ref": "#/definitions/IbcAcknowledgement" + }, + "original_packet": { + "$ref": "#/definitions/IbcPacket" + }, + "relayer": { + "$ref": "#/definitions/Addr" + } + }, + "additionalProperties": false + }, "IbcAcknowledgement": { "type": "object", "required": [ @@ -152,44 +172,6 @@ }, "additionalProperties": false }, - "IbcPacketAckMsg": { - "description": "The message that is passed into `ibc_packet_ack`", - "type": "object", - "required": [ - "acknowledgement", - "original_packet", - "relayer" - ], - "properties": { - "acknowledgement": { - "$ref": "#/definitions/IbcAcknowledgement" - }, - "original_packet": { - "$ref": "#/definitions/IbcPacket" - }, - "relayer": { - "$ref": "#/definitions/Addr" - } - }, - "additionalProperties": false - }, - "IbcPacketTimeoutMsg": { - "description": "The message that is passed into `ibc_packet_timeout`", - "type": "object", - "required": [ - "packet", - "relayer" - ], - "properties": { - "packet": { - "$ref": "#/definitions/IbcPacket" - }, - "relayer": { - "$ref": "#/definitions/Addr" - } - }, - "additionalProperties": false - }, "IbcTimeout": { "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", "type": "object", @@ -240,6 +222,22 @@ }, "additionalProperties": false }, + "IbcTimeoutCallbackMsg": { + "type": "object", + "required": [ + "packet", + "relayer" + ], + "properties": { + "packet": { + "$ref": "#/definitions/IbcPacket" + }, + "relayer": { + "$ref": "#/definitions/Addr" + } + }, + "additionalProperties": false + }, "Timestamp": { "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", "allOf": [ diff --git a/contracts/ibc-callbacks/src/contract.rs b/contracts/ibc-callbacks/src/contract.rs index 950405b4d8..ebaec8e827 100644 --- a/contracts/ibc-callbacks/src/contract.rs +++ b/contracts/ibc-callbacks/src/contract.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ entry_point, to_json_binary, to_json_string, Binary, Deps, DepsMut, Empty, Env, IbcBasicResponse, IbcCallbackRequest, IbcDestinationChainCallbackMsg, IbcDstCallback, IbcMsg, - IbcPacketAckMsg, IbcPacketTimeoutMsg, IbcSourceChainCallbackMsg, IbcSrcCallback, IbcTimeout, - MessageInfo, Response, StdError, StdResult, + IbcSourceChainCallbackMsg, IbcSrcCallback, IbcTimeout, MessageInfo, Response, StdError, + StdResult, }; use crate::msg::{CallbackType, ExecuteMsg, QueryMsg}; @@ -82,26 +82,13 @@ pub fn ibc_source_chain_callback( let mut counts = load_stats(deps.storage)?; match msg { - IbcSourceChainCallbackMsg::Acknowledgement { - acknowledgement, - original_packet, - relayer, - .. - } => { + IbcSourceChainCallbackMsg::Acknowledgement(ack) => { // save the ack - counts.ibc_ack_callbacks.push(IbcPacketAckMsg::new( - acknowledgement, - original_packet, - relayer, - )); + counts.ibc_ack_callbacks.push(ack); } - IbcSourceChainCallbackMsg::Timeout { - packet, relayer, .. - } => { + IbcSourceChainCallbackMsg::Timeout(timeout) => { // save the timeout - counts - .ibc_timeout_callbacks - .push(IbcPacketTimeoutMsg::new(packet, relayer)); + counts.ibc_timeout_callbacks.push(timeout); } } diff --git a/contracts/ibc-callbacks/src/state.rs b/contracts/ibc-callbacks/src/state.rs index 0e0c60ae1d..88cc3b1a9e 100644 --- a/contracts/ibc-callbacks/src/state.rs +++ b/contracts/ibc-callbacks/src/state.rs @@ -2,8 +2,8 @@ use std::any::type_name; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - from_json, storage_keys::to_length_prefixed, to_json_vec, IbcDestinationChainCallbackMsg, - IbcPacketAckMsg, IbcPacketTimeoutMsg, StdError, StdResult, Storage, + from_json, storage_keys::to_length_prefixed, to_json_vec, IbcAckCallbackMsg, + IbcDestinationChainCallbackMsg, IbcTimeoutCallbackMsg, StdError, StdResult, Storage, }; use serde::{de::DeserializeOwned, Serialize}; @@ -13,8 +13,8 @@ pub const KEY_STATS: &[u8] = b"counts"; #[cw_serde] #[derive(Default)] pub struct CallbackStats { - pub ibc_ack_callbacks: Vec, - pub ibc_timeout_callbacks: Vec, + pub ibc_ack_callbacks: Vec, + pub ibc_timeout_callbacks: Vec, pub ibc_destination_callbacks: Vec, } diff --git a/packages/std/src/ibc/callbacks.rs b/packages/std/src/ibc/callbacks.rs index f83c1c1216..9506578572 100644 --- a/packages/std/src/ibc/callbacks.rs +++ b/packages/std/src/ibc/callbacks.rs @@ -108,14 +108,43 @@ pub struct IbcDstCallback { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum IbcSourceChainCallbackMsg { - #[non_exhaustive] - Acknowledgement { + Acknowledgement(IbcAckCallbackMsg), + Timeout(IbcTimeoutCallbackMsg), +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] +pub struct IbcAckCallbackMsg { + acknowledgement: IbcAcknowledgement, + original_packet: IbcPacket, + relayer: Addr, +} + +impl IbcAckCallbackMsg { + pub fn new( acknowledgement: IbcAcknowledgement, original_packet: IbcPacket, relayer: Addr, - }, - #[non_exhaustive] - Timeout { packet: IbcPacket, relayer: Addr }, + ) -> Self { + Self { + acknowledgement, + original_packet, + relayer, + } + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] +pub struct IbcTimeoutCallbackMsg { + packet: IbcPacket, + relayer: Addr, +} + +impl IbcTimeoutCallbackMsg { + pub fn new(packet: IbcPacket, relayer: Addr) -> Self { + Self { packet, relayer } + } } /// The message type of the IBC destination chain callback. diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 2e1134f1b2..eee68fd81a 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -40,11 +40,12 @@ pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::ibc::IbcChannelOpenResponse; pub use crate::ibc::{ - Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, IbcCallbackRequest, IbcChannel, - IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcDestinationChainCallbackMsg, - IbcDstCallback, IbcEndpoint, IbcFullAcknowledgement, IbcMsg, IbcOrder, IbcPacket, - IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, - IbcSourceChainCallbackMsg, IbcSrcCallback, IbcTimeout, IbcTimeoutBlock, + Ibc3ChannelOpenResponse, IbcAckCallbackMsg, IbcAcknowledgement, IbcBasicResponse, + IbcCallbackRequest, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, + IbcDestinationChainCallbackMsg, IbcDstCallback, IbcEndpoint, IbcFullAcknowledgement, IbcMsg, + IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcReceiveResponse, IbcSourceChainCallbackMsg, IbcSrcCallback, IbcTimeout, IbcTimeoutBlock, + IbcTimeoutCallbackMsg, }; #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 2ef8abb80b..5491e89905 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -956,7 +956,8 @@ mod tests { mock_ibc_packet_ack, mock_ibc_packet_recv, mock_wasmd_attr, }; use cosmwasm_std::{ - Event, IbcAcknowledgement, IbcOrder, ReplyOn, SubMsgResponse, SubMsgResult, + Event, IbcAckCallbackMsg, IbcAcknowledgement, IbcOrder, IbcTimeoutCallbackMsg, ReplyOn, + SubMsgResponse, SubMsgResult, }; const CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_CALLBACKS: &[u8] = include_bytes!("../testdata/ibc_callbacks.wasm"); @@ -1088,10 +1089,13 @@ mod tests { } // send ack callback - let ack = IbcAcknowledgement::new(br#"{}"#); - let msg = IbcSourceChainCallbackMsg::Acknowledgement( - mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#, ack).unwrap(), - ); + let ack = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#, IbcAcknowledgement::new(br#"{}"#)) + .unwrap(); + let msg = IbcSourceChainCallbackMsg::Acknowledgement(IbcAckCallbackMsg::new( + ack.acknowledgement, + ack.original_packet, + ack.relayer, + )); call_ibc_source_chain_callback::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); @@ -1106,9 +1110,11 @@ mod tests { assert_eq!(0, stats.ibc_timeout_callbacks.len()); // send timeout callback - let msg = IbcSourceChainCallbackMsg::Timeout( - mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#).unwrap(), - ); + let timeout = mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#).unwrap(); + let msg = IbcSourceChainCallbackMsg::Timeout(IbcTimeoutCallbackMsg::new( + timeout.packet, + timeout.relayer, + )); call_ibc_source_chain_callback::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap();