diff --git a/ibctesting/eibc_test.go b/ibctesting/eibc_test.go index 9d47ef50d..df9bb4341 100644 --- a/ibctesting/eibc_test.go +++ b/ibctesting/eibc_test.go @@ -343,6 +343,7 @@ func (suite *EIBCTestSuite) TestTimeoutEIBCDemandOrderFulfillment() { type TC struct { name string malleate func(channeltypes.Packet) + fee func(params eibctypes.Params) sdk.Dec } nOrdersCreated := 0 @@ -361,6 +362,9 @@ func (suite *EIBCTestSuite) TestTimeoutEIBCDemandOrderFulfillment() { err := hubEndpoint.TimeoutPacket(packet) suite.Require().NoError(err) }, + fee: func(params eibctypes.Params) sdk.Dec { + return params.TimeoutFee + }, }, { name: "err acknowledgement", @@ -378,6 +382,9 @@ func (suite *EIBCTestSuite) TestTimeoutEIBCDemandOrderFulfillment() { err = hubEndpoint.AcknowledgePacket(packet, ack.Acknowledgement()) suite.Require().NoError(err) }, + fee: func(params eibctypes.Params) sdk.Dec { + return params.ErrackFee + }, }, } { suite.Run(tc.name, func() { @@ -428,10 +435,10 @@ func (suite *EIBCTestSuite) TestTimeoutEIBCDemandOrderFulfillment() { // Get the last demand order created t lastDemandOrder := getLastDemandOrderByChannelAndSequence(demandOrders) // Validate the demand order price and denom - timeoutFee := eibcKeeper.GetParams(suite.hubChain.GetContext()).TimeoutFee + fee := tc.fee(eibcKeeper.GetParams(suite.hubChain.GetContext())) amountDec, err := sdk.NewDecFromStr(coinToSendToB.Amount.String()) suite.Require().NoError(err) - expectedPrice := amountDec.Mul(sdk.NewDec(1).Sub(timeoutFee)).TruncateInt() + expectedPrice := amountDec.Mul(sdk.NewDec(1).Sub(fee)).TruncateInt() suite.Require().Equal(expectedPrice, lastDemandOrder.Price[0].Amount) suite.Require().Equal(coinToSendToB.Denom, lastDemandOrder.Price[0].Denom) // Fulfill the demand order diff --git a/x/delayedack/eibc.go b/x/delayedack/eibc.go index fedbe08a0..c197904f7 100644 --- a/x/delayedack/eibc.go +++ b/x/delayedack/eibc.go @@ -61,14 +61,15 @@ func (im IBCMiddleware) eIBCDemandOrderHandler(ctx sdk.Context, rollappPacket co if t == commontypes.RollappPacket_ON_ACK { feeMultiplier = im.keeper.ErrAckFee(ctx) } - if feeMultiplier.IsZero() { - logger.Debug("fee is zero, skipping demand order creation", "fee type", t) + + fee := amountDec.Mul(feeMultiplier).TruncateInt() + if !fee.IsPositive() { + logger.Debug("fee is not positive, skipping demand order creation", "fee type", t, "fee", fee.String(), "multiplier", feeMultiplier.String()) return nil } - fee := amountDec.Mul(feeMultiplier).TruncateInt().String() packetMetaData = &types.PacketMetadata{ EIBC: &types.EIBCMetadata{ - Fee: fee, + Fee: fee.String(), }, } } @@ -108,13 +109,13 @@ func (im IBCMiddleware) createDemandOrderFromIBCPacket(fungibleTokenPacketData t if im.keeper.BlockedAddr(fungibleTokenPacketData.Receiver) { return nil, fmt.Errorf("not allowed to receive funds: receiver: %s", fungibleTokenPacketData.Receiver) } - // Get the fee from the memo - fee := eibcMetaData.Fee // Calculate the demand order price and validate it amountInt, ok := sdk.NewIntFromString(fungibleTokenPacketData.Amount) if !ok || !amountInt.IsPositive() { return nil, fmt.Errorf("convert amount to positive integer: %s", fungibleTokenPacketData.Amount) } + // Get the fee from the memo + fee := eibcMetaData.Fee feeInt, ok := sdk.NewIntFromString(fee) if !ok || !feeInt.IsPositive() { return nil, fmt.Errorf("convert fee to positive integer: %s", fee)