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  }