|
| 1 | +package fee_test |
| 2 | + |
| 3 | +import ( |
| 4 | + sdk "github.com/cosmos/cosmos-sdk/types" |
| 5 | + |
| 6 | + "github.com/cosmos/ibc-go/v6/modules/apps/29-fee/types" |
| 7 | + transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" |
| 8 | + clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" |
| 9 | + ibctesting "github.com/cosmos/ibc-go/v6/testing" |
| 10 | +) |
| 11 | + |
| 12 | +// Integration test to ensure ics29 works with ics20 |
| 13 | +func (suite *FeeTestSuite) TestFeeTransfer() { |
| 14 | + path := ibctesting.NewPath(suite.chainA, suite.chainB) |
| 15 | + feeTransferVersion := string(types.ModuleCdc.MustMarshalJSON(&types.Metadata{FeeVersion: types.Version, AppVersion: transfertypes.Version})) |
| 16 | + path.EndpointA.ChannelConfig.Version = feeTransferVersion |
| 17 | + path.EndpointB.ChannelConfig.Version = feeTransferVersion |
| 18 | + path.EndpointA.ChannelConfig.PortID = transfertypes.PortID |
| 19 | + path.EndpointB.ChannelConfig.PortID = transfertypes.PortID |
| 20 | + |
| 21 | + suite.coordinator.Setup(path) |
| 22 | + |
| 23 | + // set up coin & ics20 packet |
| 24 | + coin := ibctesting.TestCoin |
| 25 | + fee := types.Fee{ |
| 26 | + RecvFee: defaultRecvFee, |
| 27 | + AckFee: defaultAckFee, |
| 28 | + TimeoutFee: defaultTimeoutFee, |
| 29 | + } |
| 30 | + |
| 31 | + msgs := []sdk.Msg{ |
| 32 | + types.NewMsgPayPacketFee(fee, path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, suite.chainA.SenderAccount.GetAddress().String(), nil), |
| 33 | + transfertypes.NewMsgTransfer(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, coin, suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(), clienttypes.NewHeight(1, 100), 0, nil), |
| 34 | + } |
| 35 | + res, err := suite.chainA.SendMsgs(msgs...) |
| 36 | + suite.Require().NoError(err) // message committed |
| 37 | + |
| 38 | + // after incentivizing the packets |
| 39 | + originalChainASenderAccountBalance := sdk.NewCoins(suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), ibctesting.TestCoin.Denom)) |
| 40 | + |
| 41 | + packet, err := ibctesting.ParsePacketFromEvents(res.GetEvents()) |
| 42 | + suite.Require().NoError(err) |
| 43 | + |
| 44 | + // register counterparty address on chainB |
| 45 | + // relayerAddress is address of sender account on chainB, but we will use it on chainA |
| 46 | + // to differentiate from the chainA.SenderAccount for checking successful relay payouts |
| 47 | + relayerAddress := suite.chainB.SenderAccount.GetAddress() |
| 48 | + |
| 49 | + msgRegister := types.NewMsgRegisterCounterpartyPayee(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, suite.chainB.SenderAccount.GetAddress().String(), relayerAddress.String()) |
| 50 | + _, err = suite.chainB.SendMsgs(msgRegister) |
| 51 | + suite.Require().NoError(err) // message committed |
| 52 | + |
| 53 | + // relay packet |
| 54 | + err = path.RelayPacket(packet) |
| 55 | + suite.Require().NoError(err) // relay committed |
| 56 | + |
| 57 | + // ensure relayers got paid |
| 58 | + // relayer for forward relay: chainB.SenderAccount |
| 59 | + // relayer for reverse relay: chainA.SenderAccount |
| 60 | + |
| 61 | + // check forward relay balance |
| 62 | + suite.Require().Equal( |
| 63 | + fee.RecvFee, |
| 64 | + sdk.NewCoins(suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainB.SenderAccount.GetAddress(), ibctesting.TestCoin.Denom)), |
| 65 | + ) |
| 66 | + |
| 67 | + suite.Require().Equal( |
| 68 | + fee.AckFee.Add(fee.TimeoutFee...), // ack fee paid, timeout fee refunded |
| 69 | + sdk.NewCoins(suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), ibctesting.TestCoin.Denom)).Sub(originalChainASenderAccountBalance[0])) |
| 70 | +} |
0 commit comments