From 8afcafe7a01f5e87523a5f0af1bbd34d2da7e8e6 Mon Sep 17 00:00:00 2001 From: Tomasz Kulik Date: Tue, 13 May 2025 09:07:28 +0200 Subject: [PATCH 1/2] chore: Remove IBC fees --- CHANGELOG.md | 2 + packages/go-gen/tests/cosmwasm_std__IbcMsg.go | 27 ------- .../go-gen/tests/cosmwasm_std__IbcQuery.go | 9 +-- packages/std/src/ibc.rs | 77 ------------------- packages/std/src/lib.rs | 8 +- packages/std/src/query/ibc.rs | 18 ----- packages/std/src/testing/mock.rs | 6 -- 7 files changed, 8 insertions(+), 139 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f91debf849..c1ed9f87bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,6 +89,7 @@ and this project adheres to primary cosmwasm_std dependency of a contract. - cosmwasm-vm: Enable partial reference-type support, enabling contracts compiled with Rust 1.82 or newer to be stored. ([#2473]) +- cosmwasm-std: Removed IBC fees ([#2479]) ## Fixed @@ -132,6 +133,7 @@ and this project adheres to [#2472]: https://github.com/CosmWasm/cosmwasm/pull/2472 [#2473]: https://github.com/CosmWasm/cosmwasm/pull/2473 [#2477]: https://github.com/CosmWasm/cosmwasm/pull/2477 +[#2479]: https://github.com/CosmWasm/cosmwasm/pull/2479 [#2480]: https://github.com/CosmWasm/cosmwasm/pull/2480 ## [2.2.0] - 2024-12-17 diff --git a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go index 992b258393..202dde04ad 100644 --- a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go +++ b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go @@ -21,34 +21,12 @@ type WriteAcknowledgementMsg struct { type CloseChannelMsg struct { ChannelID string `json:"channel_id"` } -type PayPacketFeeMsg struct { - // The channel id on the chain where the packet is sent from (this chain). - ChannelID string `json:"channel_id"` - Fee IBCFee `json:"fee"` - // The port id on the chain where the packet is sent from (this chain). - PortID string `json:"port_id"` - // Allowlist of relayer addresses that can receive the fee. This is currently not implemented and *must* be empty. - Relayers Array[string] `json:"relayers"` -} -type PayPacketFeeAsyncMsg struct { - // The channel id on the chain where the packet is sent from (this chain). - ChannelID string `json:"channel_id"` - Fee IBCFee `json:"fee"` - // The port id on the chain where the packet is sent from (this chain). - PortID string `json:"port_id"` - // Allowlist of relayer addresses that can receive the fee. This is currently not implemented and *must* be empty. - Relayers Array[string] `json:"relayers"` - // The sequence number of the packet that should be incentivized. - Sequence uint64 `json:"sequence"` -} type IBCMsg struct { Transfer *TransferMsg `json:"transfer,omitempty"` SendPacket *SendPacketMsg `json:"send_packet,omitempty"` WriteAcknowledgement *WriteAcknowledgementMsg `json:"write_acknowledgement,omitempty"` CloseChannel *CloseChannelMsg `json:"close_channel,omitempty"` - PayPacketFee *PayPacketFeeMsg `json:"pay_packet_fee,omitempty"` - PayPacketFeeAsync *PayPacketFeeAsyncMsg `json:"pay_packet_fee_async,omitempty"` } // Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) @@ -60,11 +38,6 @@ type Coin struct { type IBCAcknowledgement struct { Data []byte `json:"data"` } -type IBCFee struct { - AckFee Array[Coin] `json:"ack_fee"` - ReceiveFee Array[Coin] `json:"receive_fee"` - TimeoutFee Array[Coin] `json:"timeout_fee"` -} // IBCTimeout is the timeout for an IBC packet. At least one of block and timestamp is required. type IBCTimeout struct { diff --git a/packages/go-gen/tests/cosmwasm_std__IbcQuery.go b/packages/go-gen/tests/cosmwasm_std__IbcQuery.go index 24278972de..d3157874fd 100644 --- a/packages/go-gen/tests/cosmwasm_std__IbcQuery.go +++ b/packages/go-gen/tests/cosmwasm_std__IbcQuery.go @@ -6,15 +6,10 @@ type ChannelQuery struct { // optional argument PortID string `json:"port_id,omitempty"` } -type FeeEnabledChannelQuery struct { - ChannelID string `json:"channel_id"` - PortID string `json:"port_id,omitempty"` -} // IBCQuery defines a query request from the contract into the chain. // This is the counterpart of [IbcQuery](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta1/packages/std/src/ibc.rs#L61-L83). type IBCQuery struct { - PortID *PortIDQuery `json:"port_id,omitempty"` - Channel *ChannelQuery `json:"channel,omitempty"` - FeeEnabledChannel *FeeEnabledChannelQuery `json:"fee_enabled_channel,omitempty"` + PortID *PortIDQuery `json:"port_id,omitempty"` + Channel *ChannelQuery `json:"channel,omitempty"` } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 58505db626..c0ee0f0e95 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -75,83 +75,6 @@ pub enum IbcMsg { /// This will close an existing channel that is owned by this contract. /// Port is auto-assigned to the contract's IBC port CloseChannel { channel_id: String }, - /// Incentivizes the next IBC packet sent after this message with a fee. - /// Note that this does not necessarily have to be a packet sent by this contract. - /// The fees are taken from the contract's balance immediately and locked until the packet is handled. - /// - /// # Example - /// - /// Most commonly, you will attach this message to a response right before sending a packet using - /// [`IbcMsg::SendPacket`] or [`IbcMsg::Transfer`]. - /// - /// ```rust - /// # use cosmwasm_std::{IbcMsg, IbcEndpoint, IbcFee, IbcTimeout, Coin, coins, CosmosMsg, Response, Timestamp}; - /// - /// let incentivize = IbcMsg::PayPacketFee { - /// port_id: "transfer".to_string(), - /// channel_id: "source-channel".to_string(), - /// fee: IbcFee { - /// receive_fee: coins(100, "token"), - /// ack_fee: coins(201, "token"), - /// timeout_fee: coins(200, "token"), - /// }, - /// relayers: vec![], - /// }; - /// let transfer = IbcMsg::Transfer { - /// channel_id: "source-channel".to_string(), - /// to_address: "receiver".to_string(), - /// amount: Coin::new(100u32, "token"), - /// timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(0)), - /// memo: None, - /// }; - /// - /// # #[cfg(feature = "stargate")] - /// let _: Response = Response::new() - /// .add_message(CosmosMsg::Ibc(incentivize)) - /// .add_message(CosmosMsg::Ibc(transfer)); - /// ``` - #[cfg(feature = "cosmwasm_2_2")] - PayPacketFee { - /// The port id on the chain where the packet is sent from (this chain). - port_id: String, - /// The channel id on the chain where the packet is sent from (this chain). - channel_id: String, - fee: IbcFee, - /// Allowlist of relayer addresses that can receive the fee. - /// An empty list means that any relayer can receive the fee. - /// - /// This is currently not implemented and *must* be empty. - relayers: Vec, - }, - /// Incentivizes the existing IBC packet with the given port, channel and sequence with a fee. - /// Note that this does not necessarily have to be a packet sent by this contract. - /// The fees are taken from the contract's balance immediately and locked until the packet is handled. - /// They are added to the existing fees on the packet. - #[cfg(feature = "cosmwasm_2_2")] - PayPacketFeeAsync { - /// The port id on the chain where the packet is sent from (this chain). - port_id: String, - /// The channel id on the chain where the packet is sent from (this chain). - channel_id: String, - /// The sequence number of the packet that should be incentivized. - sequence: u64, - fee: IbcFee, - /// Allowlist of relayer addresses that can receive the fee. - /// An empty list means that any relayer can receive the fee. - /// - /// This is currently not implemented and *must* be empty. - relayers: Vec, - }, -} - -#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct IbcFee { - // the packet receive fee - pub receive_fee: Vec, - // the packet acknowledgement fee - pub ack_fee: Vec, - // the packet timeout fee - pub timeout_fee: Vec, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 48b3b244ca..739cac9af3 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -72,7 +72,7 @@ pub use crate::ibc::IbcChannelOpenResponse; pub use crate::ibc::{ Ibc3ChannelOpenResponse, IbcAckCallbackMsg, IbcAcknowledgement, IbcBasicResponse, IbcCallbackRequest, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, - IbcDestinationCallbackMsg, IbcDstCallback, IbcEndpoint, IbcFee, IbcMsg, IbcOrder, IbcPacket, + IbcDestinationCallbackMsg, IbcDstCallback, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcSourceCallbackMsg, IbcSrcCallback, IbcTimeout, IbcTimeoutBlock, IbcTimeoutCallbackMsg, TransferMsgBuilder, @@ -97,9 +97,9 @@ pub use crate::query::{ BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, ContractInfoResponse, CustomQuery, DecCoin, Delegation, DelegationResponse, DelegationRewardsResponse, DelegationTotalRewardsResponse, DelegatorReward, DelegatorValidatorsResponse, - DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, - FeeEnabledChannelResponse, FullDelegation, GrpcQuery, IbcQuery, PortIdResponse, QueryRequest, - StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, + DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, FullDelegation, + GrpcQuery, IbcQuery, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, + ValidatorResponse, WasmQuery, }; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use crate::results::WeightedVoteOption; diff --git a/packages/std/src/query/ibc.rs b/packages/std/src/query/ibc.rs index 05509c8937..de1dc3c8cd 100644 --- a/packages/std/src/query/ibc.rs +++ b/packages/std/src/query/ibc.rs @@ -30,16 +30,6 @@ pub enum IbcQuery { channel_id: String, port_id: Option, }, - /// Queries whether the given channel supports IBC fees. - /// If port_id is omitted, it will default to the contract's own channel. - /// (To save a PortId{} call) - /// - /// Returns a `FeeEnabledChannelResponse`. - #[cfg(feature = "cosmwasm_2_2")] - FeeEnabledChannel { - port_id: Option, - channel_id: String, - }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] @@ -57,11 +47,3 @@ pub struct ChannelResponse { } impl_hidden_constructor!(ChannelResponse, channel: Option); - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[non_exhaustive] -pub struct FeeEnabledChannelResponse { - pub fee_enabled: bool, -} - -impl_hidden_constructor!(FeeEnabledChannelResponse, fee_enabled: bool); diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index b3f57c039f..95f332b9e2 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1154,12 +1154,6 @@ impl IbcQuerier { }; to_json_binary(&res).into() } - #[cfg(feature = "cosmwasm_2_2")] - IbcQuery::FeeEnabledChannel { .. } => { - use crate::query::FeeEnabledChannelResponse; - // for now, we always return true - to_json_binary(&FeeEnabledChannelResponse::new(true)).into() - } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) From 4d955ba5ef6c64a427f88a0ad4de17bf9f12bfc6 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 07:39:05 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- .../ibc-reflect/schema/ibc/packet_msg.json | 116 -------------- contracts/reflect/schema/raw/execute.json | 116 -------------- contracts/reflect/schema/raw/query.json | 28 ---- contracts/reflect/schema/reflect.json | 144 ------------------ 4 files changed, 404 deletions(-) diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index 8de0f42bef..c9521904e9 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -423,35 +423,6 @@ }, "additionalProperties": false }, - "IbcFee": { - "type": "object", - "required": [ - "ack_fee", - "receive_fee", - "timeout_fee" - ], - "properties": { - "ack_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "receive_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "timeout_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - }, - "additionalProperties": false - }, "IbcMsg": { "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", "oneOf": [ @@ -603,93 +574,6 @@ } }, "additionalProperties": false - }, - { - "description": "Incentivizes the next IBC packet sent after this message with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled.\n\n# Example\n\nMost commonly, you will attach this message to a response right before sending a packet using [`IbcMsg::SendPacket`] or [`IbcMsg::Transfer`].\n\n```rust # use cosmwasm_std::{IbcMsg, IbcEndpoint, IbcFee, IbcTimeout, Coin, coins, CosmosMsg, Response, Timestamp};\n\nlet incentivize = IbcMsg::PayPacketFee { port_id: \"transfer\".to_string(), channel_id: \"source-channel\".to_string(), fee: IbcFee { receive_fee: coins(100, \"token\"), ack_fee: coins(201, \"token\"), timeout_fee: coins(200, \"token\"), }, relayers: vec![], }; let transfer = IbcMsg::Transfer { channel_id: \"source-channel\".to_string(), to_address: \"receiver\".to_string(), amount: Coin::new(100u32, \"token\"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(0)), memo: None, };\n\n# #[cfg(feature = \"stargate\")] let _: Response = Response::new() .add_message(CosmosMsg::Ibc(incentivize)) .add_message(CosmosMsg::Ibc(transfer)); ```", - "type": "object", - "required": [ - "pay_packet_fee" - ], - "properties": { - "pay_packet_fee": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Incentivizes the existing IBC packet with the given port, channel and sequence with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled. They are added to the existing fees on the packet.", - "type": "object", - "required": [ - "pay_packet_fee_async" - ], - "properties": { - "pay_packet_fee_async": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers", - "sequence" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - }, - "sequence": { - "description": "The sequence number of the packet that should be incentivized.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false } ] }, diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 3f8a3bca09..8c6d05b83f 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -488,35 +488,6 @@ }, "additionalProperties": false }, - "IbcFee": { - "type": "object", - "required": [ - "ack_fee", - "receive_fee", - "timeout_fee" - ], - "properties": { - "ack_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "receive_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "timeout_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - }, - "additionalProperties": false - }, "IbcMsg": { "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", "oneOf": [ @@ -668,93 +639,6 @@ } }, "additionalProperties": false - }, - { - "description": "Incentivizes the next IBC packet sent after this message with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled.\n\n# Example\n\nMost commonly, you will attach this message to a response right before sending a packet using [`IbcMsg::SendPacket`] or [`IbcMsg::Transfer`].\n\n```rust # use cosmwasm_std::{IbcMsg, IbcEndpoint, IbcFee, IbcTimeout, Coin, coins, CosmosMsg, Response, Timestamp};\n\nlet incentivize = IbcMsg::PayPacketFee { port_id: \"transfer\".to_string(), channel_id: \"source-channel\".to_string(), fee: IbcFee { receive_fee: coins(100, \"token\"), ack_fee: coins(201, \"token\"), timeout_fee: coins(200, \"token\"), }, relayers: vec![], }; let transfer = IbcMsg::Transfer { channel_id: \"source-channel\".to_string(), to_address: \"receiver\".to_string(), amount: Coin::new(100u32, \"token\"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(0)), memo: None, };\n\n# #[cfg(feature = \"stargate\")] let _: Response = Response::new() .add_message(CosmosMsg::Ibc(incentivize)) .add_message(CosmosMsg::Ibc(transfer)); ```", - "type": "object", - "required": [ - "pay_packet_fee" - ], - "properties": { - "pay_packet_fee": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Incentivizes the existing IBC packet with the given port, channel and sequence with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled. They are added to the existing fees on the packet.", - "type": "object", - "required": [ - "pay_packet_fee_async" - ], - "properties": { - "pay_packet_fee_async": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers", - "sequence" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - }, - "sequence": { - "description": "The sequence number of the packet that should be incentivized.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false } ] }, diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index c94943669e..f23bac0c54 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -378,34 +378,6 @@ } }, "additionalProperties": false - }, - { - "description": "Queries whether the given channel supports IBC fees. If port_id is omitted, it will default to the contract's own channel. (To save a PortId{} call)\n\nReturns a `FeeEnabledChannelResponse`.", - "type": "object", - "required": [ - "fee_enabled_channel" - ], - "properties": { - "fee_enabled_channel": { - "type": "object", - "required": [ - "channel_id" - ], - "properties": { - "channel_id": { - "type": "string" - }, - "port_id": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false } ] }, diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 10d826e5c2..2040734060 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -498,35 +498,6 @@ }, "additionalProperties": false }, - "IbcFee": { - "type": "object", - "required": [ - "ack_fee", - "receive_fee", - "timeout_fee" - ], - "properties": { - "ack_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "receive_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "timeout_fee": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - }, - "additionalProperties": false - }, "IbcMsg": { "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", "oneOf": [ @@ -678,93 +649,6 @@ } }, "additionalProperties": false - }, - { - "description": "Incentivizes the next IBC packet sent after this message with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled.\n\n# Example\n\nMost commonly, you will attach this message to a response right before sending a packet using [`IbcMsg::SendPacket`] or [`IbcMsg::Transfer`].\n\n```rust # use cosmwasm_std::{IbcMsg, IbcEndpoint, IbcFee, IbcTimeout, Coin, coins, CosmosMsg, Response, Timestamp};\n\nlet incentivize = IbcMsg::PayPacketFee { port_id: \"transfer\".to_string(), channel_id: \"source-channel\".to_string(), fee: IbcFee { receive_fee: coins(100, \"token\"), ack_fee: coins(201, \"token\"), timeout_fee: coins(200, \"token\"), }, relayers: vec![], }; let transfer = IbcMsg::Transfer { channel_id: \"source-channel\".to_string(), to_address: \"receiver\".to_string(), amount: Coin::new(100u32, \"token\"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(0)), memo: None, };\n\n# #[cfg(feature = \"stargate\")] let _: Response = Response::new() .add_message(CosmosMsg::Ibc(incentivize)) .add_message(CosmosMsg::Ibc(transfer)); ```", - "type": "object", - "required": [ - "pay_packet_fee" - ], - "properties": { - "pay_packet_fee": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Incentivizes the existing IBC packet with the given port, channel and sequence with a fee. Note that this does not necessarily have to be a packet sent by this contract. The fees are taken from the contract's balance immediately and locked until the packet is handled. They are added to the existing fees on the packet.", - "type": "object", - "required": [ - "pay_packet_fee_async" - ], - "properties": { - "pay_packet_fee_async": { - "type": "object", - "required": [ - "channel_id", - "fee", - "port_id", - "relayers", - "sequence" - ], - "properties": { - "channel_id": { - "description": "The channel id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "fee": { - "$ref": "#/definitions/IbcFee" - }, - "port_id": { - "description": "The port id on the chain where the packet is sent from (this chain).", - "type": "string" - }, - "relayers": { - "description": "Allowlist of relayer addresses that can receive the fee. An empty list means that any relayer can receive the fee.\n\nThis is currently not implemented and *must* be empty.", - "type": "array", - "items": { - "type": "string" - } - }, - "sequence": { - "description": "The sequence number of the packet that should be incentivized.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false } ] }, @@ -1638,34 +1522,6 @@ } }, "additionalProperties": false - }, - { - "description": "Queries whether the given channel supports IBC fees. If port_id is omitted, it will default to the contract's own channel. (To save a PortId{} call)\n\nReturns a `FeeEnabledChannelResponse`.", - "type": "object", - "required": [ - "fee_enabled_channel" - ], - "properties": { - "fee_enabled_channel": { - "type": "object", - "required": [ - "channel_id" - ], - "properties": { - "channel_id": { - "type": "string" - }, - "port_id": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false } ] },