github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/ibc-go/modules/apps/29-fee/transfer_test.go (about) 1 package fee_test 2 3 import ( 4 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 5 txmsg "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/ibc-adapter" 6 "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee/types" 7 transfertypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/types" 8 clienttypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/02-client/types" 9 ibctesting "github.com/fibonacci-chain/fbc/libs/ibc-go/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 coin.Denom = sdk.DefaultIbcWei 31 msgs := []txmsg.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(), suite.chainB.SenderAccount().GetAddress().String(), clienttypes.NewHeight(0, 100), 0), 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.Events) 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.RelayPacketV4(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.ToCoins(), 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...).ToCoins(), // 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), 70 ) 71 }