diff --git a/CHANGELOG.md b/CHANGELOG.md index 94f55c8c26..285b7b4331 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * (testground)[1649](https://github.com/crypto-org-chain/cronos/pull/1649) Fix running single validator benchmark locally. * (cli)[#1647](https://github.com/crypto-org-chain/cronos/pull/1647) Fix node can't shutdown by signal. * (testground)[#1652](https://github.com/crypto-org-chain/cronos/pull/1652) Remove unexpected conflicts in benchmark transactions. +* [#1654](https://github.com/crypto-org-chain/cronos/pull/1654) Set relayer as payee for relayer caller when enabled incentivized packet. ### Improvements diff --git a/app/app.go b/app/app.go index b8905c4170..7f94f3b790 100644 --- a/app/app.go +++ b/app/app.go @@ -131,6 +131,7 @@ import ( ibc "github.com/cosmos/ibc-go/v8/modules/core" ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" + ibcchanneltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" @@ -280,6 +281,43 @@ var ( type GenesisState = map[string]json.RawMessage +type CustomIBCFeeMiddleware struct { + ibcfee.IBCMiddleware + keeper ibcfeekeeper.Keeper +} + +func NewIBCFeeMiddleware(app porttypes.IBCModule, k ibcfeekeeper.Keeper) CustomIBCFeeMiddleware { + return CustomIBCFeeMiddleware{ + IBCMiddleware: ibcfee.NewIBCMiddleware(app, k), + keeper: k, + } +} + +func (im CustomIBCFeeMiddleware) OnAcknowledgementPacket( + ctx sdk.Context, + packet ibcchanneltypes.Packet, + acknowledgement []byte, + relayer sdk.AccAddress, +) error { + if im.keeper.IsFeeEnabled(ctx, packet.SourcePort, packet.SourceChannel) { + var ack ibcfeetypes.IncentivizedAcknowledgement + err := ibcfeetypes.ModuleCdc.UnmarshalJSON(acknowledgement, &ack) + if err != nil { + return errors.Wrapf(err, "cannot unmarshal ICS-29 incentivized packet acknowledgement: %v", ack) + } + im.keeper.SetPayeeAddress(ctx, relayer.String(), ack.ForwardRelayerAddress, packet.SourceChannel) + } + return im.IBCMiddleware.OnAcknowledgementPacket(ctx, packet, acknowledgement, relayer) +} + +func (im CustomIBCFeeMiddleware) OnTimeoutPacket( + ctx sdk.Context, + packet ibcchanneltypes.Packet, + relayer sdk.AccAddress, +) error { + return im.IBCMiddleware.OnTimeoutPacket(ctx, packet, relayer) +} + // App extends an ABCI application, but with most of its parameters exported. // They are exported for convenience in creating helper functions, as object // capabilities aren't needed for testing. @@ -713,8 +751,8 @@ func New( var transferStack porttypes.IBCModule transferStack = transfer.NewIBCModule(app.TransferKeeper) - transferStack = middleware.NewIBCConversionModule(transferStack, app.CronosKeeper) - transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper) + transferStack = middleware.NewIBCConversionModule(transferStack, app.CronosKeeper, app.IBCFeeKeeper) + transferStack = NewIBCFeeMiddleware(transferStack, app.IBCFeeKeeper) govKeeper := govkeeper.NewKeeper( appCodec, @@ -741,7 +779,7 @@ func New( var icaControllerStack porttypes.IBCModule icaControllerStack = icacontroller.NewIBCMiddleware(nil, app.ICAControllerKeeper) - icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper) + icaControllerStack = NewIBCFeeMiddleware(icaControllerStack, app.IBCFeeKeeper) // Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper ics4Wrapper := icaControllerStack.(porttypes.Middleware) app.ICAControllerKeeper.WithICS4Wrapper(ics4Wrapper) @@ -750,7 +788,7 @@ func New( var icaHostStack porttypes.IBCModule icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper) - icaHostStack = ibcfee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper) + icaHostStack = NewIBCFeeMiddleware(icaHostStack, app.IBCFeeKeeper) // Create static IBC router, add transfer route, then set and seal it ibcRouter := porttypes.NewRouter() diff --git a/integration_tests/cosmoscli.py b/integration_tests/cosmoscli.py index 2ed8812414..4b6aca5746 100644 --- a/integration_tests/cosmoscli.py +++ b/integration_tests/cosmoscli.py @@ -601,9 +601,12 @@ def combine_batch_multisig_tx( def broadcast_tx(self, tx_file, **kwargs): kwargs.setdefault("broadcast_mode", "sync") kwargs.setdefault("output", "json") - return json.loads( + rsp = json.loads( self.raw("tx", "broadcast", tx_file, node=self.node_rpc, **kwargs) ) + if rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp def broadcast_tx_json(self, tx, **kwargs): with tempfile.NamedTemporaryFile("w") as fp: @@ -1612,10 +1615,7 @@ def register_counterparty_payee( return rsp def register_payee(self, port_id, channel_id, relayer, payee, **kwargs): - default_kwargs = { - "home": self.data_dir, - } - return json.loads( + rsp = json.loads( self.raw( "tx", "ibc-fee", @@ -1625,14 +1625,15 @@ def register_payee(self, port_id, channel_id, relayer, payee, **kwargs): relayer, payee, "-y", - **(default_kwargs | kwargs), + home=self.data_dir, + **kwargs, ) ) + if rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp def pay_packet_fee(self, port_id, channel_id, packet_seq, **kwargs): - default_kwargs = { - "home": self.data_dir, - } rsp = json.loads( self.raw( "tx", @@ -1642,7 +1643,8 @@ def pay_packet_fee(self, port_id, channel_id, packet_seq, **kwargs): channel_id, str(packet_seq), "-y", - **(default_kwargs | kwargs), + home=self.data_dir, + **kwargs, ) ) if rsp["code"] == 0: diff --git a/integration_tests/ibc_utils.py b/integration_tests/ibc_utils.py index bd88269006..f8daa58dae 100644 --- a/integration_tests/ibc_utils.py +++ b/integration_tests/ibc_utils.py @@ -218,15 +218,22 @@ def prepare_network( def register_fee_payee(src_chain, dst_chain): + port_id = "transfer" + channel_id = "channel-0" rsp = dst_chain.register_counterparty_payee( - "transfer", - "channel-0", + port_id, + channel_id, dst_chain.address("relayer"), src_chain.address("signer1"), from_="relayer", fees="100000000basecro", ) assert rsp["code"] == 0, rsp["raw_log"] + # relayer = src_chain.address("signer1") + # relayer_caller = eth_to_bech32(RELAYER_CALLER) + # rsp = src_chain.register_payee( + # port_id, channel_id, relayer_caller, relayer, _from=relayer_caller + # ) def assert_ready(ibc): diff --git a/integration_tests/test_ibc_rly.py b/integration_tests/test_ibc_rly.py index 22f69a7f2f..c36d675e04 100644 --- a/integration_tests/test_ibc_rly.py +++ b/integration_tests/test_ibc_rly.py @@ -7,7 +7,6 @@ from .ibc_utils import ( RATIO, - RELAYER_CALLER, assert_duplicate, cronos_transfer_source_tokens, cronos_transfer_source_tokens_with_proxy, @@ -287,8 +286,8 @@ def test_ibc_incentivized_transfer(ibc): acknowledge_packet(seq0), distribute_fee(src_relayer, fee), *send_coins(feeibc_addr, src_relayer, src_amount, fee_denom), - distribute_fee(RELAYER_CALLER, fee), - *send_coins(feeibc_addr, RELAYER_CALLER, src_amount, fee_denom), + distribute_fee(src_relayer, fee), + *send_coins(feeibc_addr, src_relayer, src_amount, fee_denom), distribute_fee(cronos_signer2, ""), *send_coins(feeibc_addr, cronos_signer2, 0, fee_denom), fungible(checksum_dst_adr, cronos_signer2, amount, dst_denom), diff --git a/x/cronos/middleware/conversion_middleware.go b/x/cronos/middleware/conversion_middleware.go index 12dd7b23be..ba6c5d243a 100644 --- a/x/cronos/middleware/conversion_middleware.go +++ b/x/cronos/middleware/conversion_middleware.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" + ibcfeekeeper "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/keeper" transferTypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" @@ -19,13 +20,15 @@ var _ porttypes.UpgradableModule = (*IBCConversionModule)(nil) type IBCConversionModule struct { app porttypes.IBCModule cronoskeeper cronoskeeper.Keeper + feekeeper ibcfeekeeper.Keeper } // NewIBCConversionModule creates a new IBCModule given the keeper and underlying application -func NewIBCConversionModule(app porttypes.IBCModule, ck cronoskeeper.Keeper) IBCConversionModule { +func NewIBCConversionModule(app porttypes.IBCModule, ck cronoskeeper.Keeper, fk ibcfeekeeper.Keeper) IBCConversionModule { return IBCConversionModule{ app: app, cronoskeeper: ck, + feekeeper: fk, } }