From d0c993634139470eee2daea22e06aa84d42d9777 Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Mon, 23 Jan 2023 13:51:00 +0100 Subject: [PATCH 1/9] feat: fee payer --- docs/neutron/feerefunder/client.md | 1 + docs/neutron/feerefunder/overview.md | 21 ++++++++++++++++++++- docs/neutron/feerefunder/state.md | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/neutron/feerefunder/client.md b/docs/neutron/feerefunder/client.md index 9570be297..42192a297 100644 --- a/docs/neutron/feerefunder/client.md +++ b/docs/neutron/feerefunder/client.md @@ -53,5 +53,6 @@ Output: timeout_fee: - denom: "untrn" amount: "500" + payer: neutron10h9stc5v6ntgeygf5xf945njqq5h32r54rf7kf ``` \ No newline at end of file diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index 7f51c1b51..a61f9222b 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -21,10 +21,29 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m * `ack_fee` - amount of coins to refund relayer for submittting ack message for a particular IBC packet (i.e. `500untrn`); * `timeout_fee` - amount of coins to refund relayer for submitting timeout message for a particular IBC packet (i.e. `500untrn`); * `recv_fee` - currently is used for compatibility with ICS-29 interface only and **must be set to zero** (i.e. `0untrn`), because Neutron's fee module can't refund relayers for submission of `Recv` IBC packets due to compatibility with target chains. +* `payer` - optional address of the contract which will pay for the fees. Please note that payer must give allowance to the contract to spend fees. > **Note:** the fees can be specified only in native Cosmos-SDK coins. CW-20 coins are not supported! -When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back. +When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back. + +
+ Details on Fee Payer + + 1. A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. + + 2. The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expire date, and period can be set, please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. + + 3. When an interchain transaction is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. + + 4. The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. + + 5. If the allowance is enough for the interchain transaction, the contract can execute the transaction. + + 6. The feegrant module is responsible for ensuring that the contract has enough tokens to pay for the fees, if it doesn't have enough tokens, the transaction should return an error message. + + 7. The payer field from the Fee struct is used to specify which address should be used to pay the fees. +
> **Note:** the minimal amount of fee to be specified for the messages above is defined via parameter [`min_fee`](https://github.com/neutron-org/neutron/blob/9cdd583bd754d0e4d5f2e16d7414cf80151b205d/proto/feerefunder/params.proto#L13) controlled by governance proposal. If provided fees are less than `min_fee` parameter, `Transfer` or `SubmitTx` or message will be rejected. \ No newline at end of file diff --git a/docs/neutron/feerefunder/state.md b/docs/neutron/feerefunder/state.md index f323a60e0..f043c892a 100644 --- a/docs/neutron/feerefunder/state.md +++ b/docs/neutron/feerefunder/state.md @@ -2,7 +2,7 @@ The FeeRefunder module stores one [FeeInfo](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/proto/feerefunder/genesis.proto#L18) per [`channel_id`, `port_id` and `sequence`](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/x/feerefunder/types/keys.go#L28). `FeeInfo` contains all the necessary info to store data about fees to properly refund relayers and return fees to the original caller of IBC messages: -* `payer` - stores an address of the smart-contract which issues `Transfer` or `SubmitTx` message; +* `payer` - stores an address of the smart-contract (or fee payer) which issues `Transfer` or `SubmitTx` message; * `packet_id` - stores an info about an IBC packet for which `ack` or `timeout` submission relayers should be refunded; * `fee` - stores amount of fee to refund relayers for the submission of IBC packets. From c168f6d2a77e4be41a463418f7305e5766c632b1 Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Tue, 24 Jan 2023 17:21:04 +0100 Subject: [PATCH 2/9] fix: review fixes --- docs/neutron/feerefunder/overview.md | 4 ++-- docs/neutron/feerefunder/state.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index a61f9222b..e1be3dbc8 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -21,7 +21,7 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m * `ack_fee` - amount of coins to refund relayer for submittting ack message for a particular IBC packet (i.e. `500untrn`); * `timeout_fee` - amount of coins to refund relayer for submitting timeout message for a particular IBC packet (i.e. `500untrn`); * `recv_fee` - currently is used for compatibility with ICS-29 interface only and **must be set to zero** (i.e. `0untrn`), because Neutron's fee module can't refund relayers for submission of `Recv` IBC packets due to compatibility with target chains. -* `payer` - optional address of the contract which will pay for the fees. Please note that payer must give allowance to the contract to spend fees. +* `payer` - optional address which will pay for the fees. Please note that payer must give allowance to the contract to spend fees. > **Note:** the fees can be specified only in native Cosmos-SDK coins. CW-20 coins are not supported! @@ -34,7 +34,7 @@ When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module de 2. The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expire date, and period can be set, please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. - 3. When an interchain transaction is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. + 3. When an interchain transaction or transfer message is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. 4. The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. diff --git a/docs/neutron/feerefunder/state.md b/docs/neutron/feerefunder/state.md index f043c892a..2014dafde 100644 --- a/docs/neutron/feerefunder/state.md +++ b/docs/neutron/feerefunder/state.md @@ -2,7 +2,7 @@ The FeeRefunder module stores one [FeeInfo](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/proto/feerefunder/genesis.proto#L18) per [`channel_id`, `port_id` and `sequence`](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/x/feerefunder/types/keys.go#L28). `FeeInfo` contains all the necessary info to store data about fees to properly refund relayers and return fees to the original caller of IBC messages: -* `payer` - stores an address of the smart-contract (or fee payer) which issues `Transfer` or `SubmitTx` message; +* `payer` - stores an address of the smart-contract (or fee payer) which will be refunded after the IBC packet is processed; * `packet_id` - stores an info about an IBC packet for which `ack` or `timeout` submission relayers should be refunded; * `fee` - stores amount of fee to refund relayers for the submission of IBC packets. From 2e897fa322974c98d1e2575cfd7193bebed34144 Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 13:46:26 +0100 Subject: [PATCH 3/9] chore: clarify and refactor --- docs/neutron/feerefunder/overview.md | 17 +++++++++-------- docs/neutron/feerefunder/state.md | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index e1be3dbc8..4eba82594 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -30,19 +30,20 @@ When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module de
Details on Fee Payer - 1. A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. + * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. - 2. The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expire date, and period can be set, please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. + * The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expiration date and period can be set. Please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. - 3. When an interchain transaction or transfer message is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. + * When an interchain transaction or transfer message is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. - 4. The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. + * The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. - 5. If the allowance is enough for the interchain transaction, the contract can execute the transaction. - - 6. The feegrant module is responsible for ensuring that the contract has enough tokens to pay for the fees, if it doesn't have enough tokens, the transaction should return an error message. + * If the allowance is enough for spending fee, the feerefunder module transfers fee from fee payer address to the module's escrow address and saves the fee payer address in state by PacketID. + + * Then interchain transaction or transfer message is sent to the IBC module. + + * When the IBC module receives the Ack or Timeout message, the module sends the specified amount of fee to the relayer from the escrow address and return the rest of fees to the fee payer's address. - 7. The payer field from the Fee struct is used to specify which address should be used to pay the fees.
> **Note:** the minimal amount of fee to be specified for the messages above is defined via parameter [`min_fee`](https://github.com/neutron-org/neutron/blob/9cdd583bd754d0e4d5f2e16d7414cf80151b205d/proto/feerefunder/params.proto#L13) controlled by governance proposal. diff --git a/docs/neutron/feerefunder/state.md b/docs/neutron/feerefunder/state.md index 2014dafde..cb35ec702 100644 --- a/docs/neutron/feerefunder/state.md +++ b/docs/neutron/feerefunder/state.md @@ -2,7 +2,7 @@ The FeeRefunder module stores one [FeeInfo](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/proto/feerefunder/genesis.proto#L18) per [`channel_id`, `port_id` and `sequence`](https://github.com/neutron-org/neutron/blob/a9e8ba5ebb9230bec97a4f2826d75a4e0e6130d9/x/feerefunder/types/keys.go#L28). `FeeInfo` contains all the necessary info to store data about fees to properly refund relayers and return fees to the original caller of IBC messages: -* `payer` - stores an address of the smart-contract (or fee payer) which will be refunded after the IBC packet is processed; +* `payer` - stores the fee payer address (smart contract or other fee payer) which will be refunded after the IBC packet is processed; * `packet_id` - stores an info about an IBC packet for which `ack` or `timeout` submission relayers should be refunded; * `fee` - stores amount of fee to refund relayers for the submission of IBC packets. From fcf49fe7fc31a1971766c79495cd7f0b4d3fd449 Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 14:29:05 +0100 Subject: [PATCH 4/9] fix: block --- docs/neutron/feerefunder/overview.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index 4eba82594..0710466a4 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -28,22 +28,22 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back.
- Details on Fee Payer + Details on Fee Payer - * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. +* A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. - * The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expiration date and period can be set. Please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. +* The fee payer can grant an allowance to a contract address, which allows the contract to use tokens from this address for the fees. Optionally, a limit, expiration date and period can be set. Please refer to the [feegrant module's documentation in the Cosmos SDK](https://docs.cosmos.network/v0.46/modules/feegrant/) for more information. - * When an interchain transaction or transfer message is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. - - * The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. - - * If the allowance is enough for spending fee, the feerefunder module transfers fee from fee payer address to the module's escrow address and saves the fee payer address in state by PacketID. +* When an interchain transaction or transfer message is requested by a contract, the feerefunder module checks the allowance in general by using the feegrant module's GetAllowance function. - * Then interchain transaction or transfer message is sent to the IBC module. +* The feerefunder module then calls the Accept method on the returned interface with the total fees as an argument to check if the contract has permission to use the required amount of tokens and to deduct them from the allowance. + +* If the allowance is enough for spending fee, the feerefunder module transfers fee from fee payer address to the module's escrow address and saves the fee payer address in state by PacketID. + +* Then interchain transaction or transfer message is sent to the IBC module. + +* When the IBC module receives the Ack or Timeout message, the module sends the specified amount of fee to the relayer from the escrow address and return the rest of fees to the fee payer's address. - * When the IBC module receives the Ack or Timeout message, the module sends the specified amount of fee to the relayer from the escrow address and return the rest of fees to the fee payer's address. -
> **Note:** the minimal amount of fee to be specified for the messages above is defined via parameter [`min_fee`](https://github.com/neutron-org/neutron/blob/9cdd583bd754d0e4d5f2e16d7414cf80151b205d/proto/feerefunder/params.proto#L13) controlled by governance proposal. From 44e16b5dd0b55d3b65c24bd91bf50801c43e742e Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 14:33:17 +0100 Subject: [PATCH 5/9] chore: trash --- docs/neutron/feerefunder/client.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/neutron/feerefunder/client.md b/docs/neutron/feerefunder/client.md index 42192a297..b2cc9d825 100644 --- a/docs/neutron/feerefunder/client.md +++ b/docs/neutron/feerefunder/client.md @@ -20,8 +20,6 @@ service Query { ### fee-info [port-id] [channel-id] [sequence] -Returns list of all failures. - ```shell neutrond query feerefunder fee-info [port-id] [channel-id] [sequence] ``` From 3169abbbedf3338746ebec163bbb8431d0943feb Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 14:35:11 +0100 Subject: [PATCH 6/9] chore: remove bold --- docs/neutron/feerefunder/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index 0710466a4..5a42ed762 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -28,7 +28,7 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back.
- Details on Fee Payer + Details on Fee Payer * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. From 5b7afe5c0a654a1cb7185255c0309206e7e1eb9e Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 14:35:41 +0100 Subject: [PATCH 7/9] chore: anchor --- docs/neutron/feerefunder/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index 5a42ed762..4ca83a8d2 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -27,7 +27,7 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back. -
+
Details on Fee Payer * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. From 2821b33d786347c3669efa453272508079bddb0f Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 14:46:10 +0100 Subject: [PATCH 8/9] fix: links and text typos --- docs/neutron/feerefunder/overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index 4ca83a8d2..af8d4ebf5 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -21,13 +21,13 @@ The module requires smart-contracts, which use [Transfer](../transfer/messages#m * `ack_fee` - amount of coins to refund relayer for submittting ack message for a particular IBC packet (i.e. `500untrn`); * `timeout_fee` - amount of coins to refund relayer for submitting timeout message for a particular IBC packet (i.e. `500untrn`); * `recv_fee` - currently is used for compatibility with ICS-29 interface only and **must be set to zero** (i.e. `0untrn`), because Neutron's fee module can't refund relayers for submission of `Recv` IBC packets due to compatibility with target chains. -* `payer` - optional address which will pay for the fees. Please note that payer must give allowance to the contract to spend fees. +* `payer` - optional address which will pay for the fees. Please note that payer must [give allowance](https://docs.cosmos.network/v0.46/modules/feegrant/01_concepts.html#grant) [#1](#feedetails) to the contract to spend fees. > **Note:** the fees can be specified only in native Cosmos-SDK coins. CW-20 coins are not supported! -When a smart-contract issues `Transfer` or `SubmitTx` message, the fee Module deduct the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract gets `ack_fee` back. +When a smart-contract issues `Transfer` or `SubmitTx` message, the Fee Refunder Module deducts the whole specified fee amount (`ack_fee + timeout_fee + recv_fee`) from contract address or from payer address (if it is defined and there is allowance from payer to contract address) and locks that amount in the module's escrow address. When a relayer submits `Ack` message for a particular packet, the module sends the specified amount of `ack_fee` to the relayer from the escrow address and return the specified `timeout_fee` to the contract (or fee payer) which issued the original `Transfer` or `SubmitTx` message. In case when relayer submits `Timeout` message, things go the other way around: the relayer is refunded with `timeout_fee` and the contract (or fee payer) gets `ack_fee` back. -
+
Details on Fee Payer * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees. From 6e17e847ab901fcce8530cfdbe562742090209aa Mon Sep 17 00:00:00 2001 From: Sergey Ratiashvili Date: Thu, 26 Jan 2023 16:47:32 +0100 Subject: [PATCH 9/9] chore: hack to fix block --- docs/neutron/feerefunder/overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/neutron/feerefunder/overview.md b/docs/neutron/feerefunder/overview.md index af8d4ebf5..bcdb233b5 100644 --- a/docs/neutron/feerefunder/overview.md +++ b/docs/neutron/feerefunder/overview.md @@ -29,6 +29,8 @@ When a smart-contract issues `Transfer` or `SubmitTx` message, the Fee Refunder
Details on Fee Payer +

+ * A fee payer is an address that holds tokens that can be used to pay for the interchain transaction fees.