From d100d56aa5615e324ef52b612e563d08121097ff Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Tue, 3 Jan 2023 12:19:38 +0000 Subject: [PATCH 1/4] adding distribute fee events to ics29 --- modules/apps/29-fee/keeper/escrow.go | 4 ++++ modules/apps/29-fee/keeper/events.go | 14 ++++++++++++++ modules/apps/29-fee/types/events.go | 3 +++ 3 files changed, 21 insertions(+) diff --git a/modules/apps/29-fee/keeper/escrow.go b/modules/apps/29-fee/keeper/escrow.go index 8914279a71d..d64f5354ef4 100644 --- a/modules/apps/29-fee/keeper/escrow.go +++ b/modules/apps/29-fee/keeper/escrow.go @@ -167,6 +167,10 @@ func (k Keeper) distributeFee(ctx sdk.Context, receiver, refundAccAddress sdk.Ac k.Logger(ctx).Error("error refunding fee to the original sender", "refund address", refundAccAddress, "fee", fee) return // if sending to the refund address fails, no-op } + + EmitDistributeFeeEvent(ctx, refundAccAddress.String(), fee) + } else { + EmitDistributeFeeEvent(ctx, receiver.String(), fee) } // write the cache diff --git a/modules/apps/29-fee/keeper/events.go b/modules/apps/29-fee/keeper/events.go index ae931862fc7..51e49bcc9fb 100644 --- a/modules/apps/29-fee/keeper/events.go +++ b/modules/apps/29-fee/keeper/events.go @@ -75,3 +75,17 @@ func EmitRegisterCounterpartyPayeeEvent(ctx sdk.Context, relayer, counterpartyPa ), }) } + +func EmitDistributeFeeEvent(ctx sdk.Context, receiver string, fee sdk.Coins) { + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + types.EventTypeDistributeFee, + sdk.NewAttribute(types.AttributeKeyReceiver, receiver), + sdk.NewAttribute(types.AttributeKeyFee, fee.String()), + ), + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + ), + }) +} diff --git a/modules/apps/29-fee/types/events.go b/modules/apps/29-fee/types/events.go index cffca5dabdd..ea9cdd0f870 100644 --- a/modules/apps/29-fee/types/events.go +++ b/modules/apps/29-fee/types/events.go @@ -5,6 +5,7 @@ const ( EventTypeIncentivizedPacket = "incentivized_ibc_packet" EventTypeRegisterPayee = "register_payee" EventTypeRegisterCounterpartyPayee = "register_counterparty_payee" + EventTypeDistributeFee = "distribute_fee" AttributeKeyRecvFee = "recv_fee" AttributeKeyAckFee = "ack_fee" @@ -13,4 +14,6 @@ const ( AttributeKeyRelayer = "relayer" AttributeKeyPayee = "payee" AttributeKeyCounterpartyPayee = "counterparty_payee" + AttributeKeyReceiver = "receiver" + AttributeKeyFee = "fee" ) From 143123980d194b1b70d677d27271c4cb0e858819 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Tue, 3 Jan 2023 12:23:48 +0000 Subject: [PATCH 2/4] adding godoc --- modules/apps/29-fee/keeper/events.go | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/apps/29-fee/keeper/events.go b/modules/apps/29-fee/keeper/events.go index 51e49bcc9fb..24122b54be7 100644 --- a/modules/apps/29-fee/keeper/events.go +++ b/modules/apps/29-fee/keeper/events.go @@ -76,6 +76,7 @@ func EmitRegisterCounterpartyPayeeEvent(ctx sdk.Context, relayer, counterpartyPa }) } +// EmitDistributeFeeEvent emits an event containing a distribution fee and receiver address func EmitDistributeFeeEvent(ctx sdk.Context, receiver string, fee sdk.Coins) { ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( From 682a0b06b9afc2fad0e219d9145e4132dd98478f Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Mon, 9 Jan 2023 15:22:46 +0100 Subject: [PATCH 3/4] adding testcase to calculate total fees paid out via distribute_fee events --- modules/apps/29-fee/keeper/events_test.go | 82 +++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/modules/apps/29-fee/keeper/events_test.go b/modules/apps/29-fee/keeper/events_test.go index 2f708e614d5..ff34462af72 100644 --- a/modules/apps/29-fee/keeper/events_test.go +++ b/modules/apps/29-fee/keeper/events_test.go @@ -5,6 +5,11 @@ import ( abcitypes "github.com/tendermint/tendermint/abci/types" "github.com/cosmos/ibc-go/v6/modules/apps/29-fee/types" + transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v6/modules/core/24-host" + ibctesting "github.com/cosmos/ibc-go/v6/testing" ) func (suite *KeeperTestSuite) TestIncentivizePacketEvent() { @@ -81,3 +86,80 @@ func (suite *KeeperTestSuite) TestIncentivizePacketEvent() { } } } + +func (suite *KeeperTestSuite) TestDistributeFeeEvent() { + // create an incentivized transfer path + path := ibctesting.NewPath(suite.chainA, suite.chainB) + feeTransferVersion := string(types.ModuleCdc.MustMarshalJSON(&types.Metadata{FeeVersion: types.Version, AppVersion: transfertypes.Version})) + path.EndpointA.ChannelConfig.Version = feeTransferVersion + path.EndpointB.ChannelConfig.Version = feeTransferVersion + path.EndpointA.ChannelConfig.PortID = transfertypes.PortID + path.EndpointB.ChannelConfig.PortID = transfertypes.PortID + + suite.coordinator.Setup(path) + + // send a new MsgPayPacketFee and MsgTransfer to chainA + fee := types.NewFee(defaultRecvFee, defaultAckFee, defaultTimeoutFee) + msgPayPacketFee := types.NewMsgPayPacketFee( + fee, + path.EndpointA.ChannelConfig.PortID, + path.EndpointA.ChannelID, + suite.chainA.SenderAccount.GetAddress().String(), + nil, + ) + + msgTransfer := transfertypes.NewMsgTransfer( + path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, + sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(), + clienttypes.NewHeight(1, 100), 0, "", + ) + + res, err := suite.chainA.SendMsgs(msgPayPacketFee, msgTransfer) + suite.Require().NoError(err) + suite.Require().NotNil(res) + + // parse the packet from result events and recv packet on chainB + packet, err := ibctesting.ParsePacketFromEvents(res.GetEvents()) + suite.Require().NoError(err) + suite.Require().NotNil(packet) + + err = path.EndpointB.UpdateClient() + suite.Require().NoError(err) + + res, err = path.EndpointB.RecvPacketWithResult(packet) + suite.Require().NoError(err) + suite.Require().NotNil(res) + + // parse the acknowledgement from result events and acknowledge packet on chainA + ack, err := ibctesting.ParseAckFromEvents(res.GetEvents()) + suite.Require().NoError(err) + suite.Require().NotNil(ack) + + packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + proof, proofHeight := path.EndpointA.Counterparty.QueryProof(packetKey) + + msgAcknowledgement := channeltypes.NewMsgAcknowledgement(packet, ack, proof, proofHeight, path.EndpointA.Chain.SenderAccount.GetAddress().String()) + res, err = suite.chainA.SendMsgs(msgAcknowledgement) + suite.Require().NoError(err) + suite.Require().NotNil(res) + + // calculate the total paid out fees using "distribute_fee" events + var totalPaid sdk.Coins + for _, event := range res.Events { + if event.Type == types.EventTypeDistributeFee { + for _, attr := range event.Attributes { + switch string(attr.Key) { + case types.AttributeKeyFee: + coins, err := sdk.ParseCoinsNormalized(string(attr.Value)) + suite.Require().NoError(err) + + totalPaid = totalPaid.Add(coins...) + } + } + + } + } + + // assert the total fees paid out equal the total incentivization fees escrowed + suite.Require().Equal(fee.Total(), totalPaid) +} From 85e7c4987e7ec9d5c22eaec6e3d2b6fbcff56c85 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Thu, 19 Jan 2023 09:40:55 +0100 Subject: [PATCH 4/4] refactor: add support for multiple events of same type in `AssertEvents` (#2995) * refactor: add support for asserting multiple events of the same type * change condition checking to make test pass * review comment * rename variable --- modules/apps/29-fee/keeper/events_test.go | 37 ++++++++++--------- .../apps/transfer/keeper/msg_server_test.go | 4 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/modules/apps/29-fee/keeper/events_test.go b/modules/apps/29-fee/keeper/events_test.go index ff34462af72..5bb1357a61b 100644 --- a/modules/apps/29-fee/keeper/events_test.go +++ b/modules/apps/29-fee/keeper/events_test.go @@ -143,23 +143,26 @@ func (suite *KeeperTestSuite) TestDistributeFeeEvent() { suite.Require().NoError(err) suite.Require().NotNil(res) - // calculate the total paid out fees using "distribute_fee" events - var totalPaid sdk.Coins - for _, event := range res.Events { - if event.Type == types.EventTypeDistributeFee { - for _, attr := range event.Attributes { - switch string(attr.Key) { - case types.AttributeKeyFee: - coins, err := sdk.ParseCoinsNormalized(string(attr.Value)) - suite.Require().NoError(err) - - totalPaid = totalPaid.Add(coins...) - } - } - - } + events := res.GetEvents() + expectedEvents := sdk.Events{ + sdk.NewEvent( + types.EventTypeDistributeFee, + sdk.NewAttribute(types.AttributeKeyReceiver, suite.chainA.SenderAccount.GetAddress().String()), + sdk.NewAttribute(types.AttributeKeyFee, defaultRecvFee.String()), + ), + sdk.NewEvent( + types.EventTypeDistributeFee, + sdk.NewAttribute(types.AttributeKeyReceiver, suite.chainA.SenderAccount.GetAddress().String()), + sdk.NewAttribute(types.AttributeKeyFee, defaultAckFee.String()), + ), + sdk.NewEvent( + types.EventTypeDistributeFee, + sdk.NewAttribute(types.AttributeKeyReceiver, suite.chainA.SenderAccount.GetAddress().String()), + sdk.NewAttribute(types.AttributeKeyFee, defaultTimeoutFee.String()), + ), } - // assert the total fees paid out equal the total incentivization fees escrowed - suite.Require().Equal(fee.Total(), totalPaid) + for _, evt := range expectedEvents { + suite.Require().Contains(events, evt) + } } diff --git a/modules/apps/transfer/keeper/msg_server_test.go b/modules/apps/transfer/keeper/msg_server_test.go index e457d3894cb..e11b2b1dfce 100644 --- a/modules/apps/transfer/keeper/msg_server_test.go +++ b/modules/apps/transfer/keeper/msg_server_test.go @@ -9,9 +9,7 @@ import ( ) func (suite *KeeperTestSuite) TestMsgTransfer() { - var ( - msg *types.MsgTransfer - ) + var msg *types.MsgTransfer testCases := []struct { name string