From 5ff42a93b189a240f8cc0ac0a750ac4cd26272f7 Mon Sep 17 00:00:00 2001 From: sampocs Date: Thu, 9 Mar 2023 11:22:57 -0600 Subject: [PATCH] Transfer middleware ibc denom check (#656) Co-authored-by: Aidan Salzmann Co-authored-by: jstr1121 Co-authored-by: jstr1121 <118450565+jstr1121@users.noreply.github.com> Co-authored-by: Jacob Gadikian Co-authored-by: Riley Edmunds --- x/autopilot/keeper/liquidstake.go | 17 ++++++++++++++--- x/autopilot/keeper/liquidstake_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/x/autopilot/keeper/liquidstake.go b/x/autopilot/keeper/liquidstake.go index e096fb78c..7346ab47d 100644 --- a/x/autopilot/keeper/liquidstake.go +++ b/x/autopilot/keeper/liquidstake.go @@ -5,7 +5,6 @@ import ( errorsmod "cosmossdk.io/errors" - "github.com/armon/go-metrics" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" transfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" @@ -42,14 +41,26 @@ func (k Keeper) TryLiquidStaking( // Note: newData.denom is base denom e.g. uatom - not ibc/xxx var token = sdk.NewCoin(newData.Denom, amount) - err := k.RunLiquidStake(ctx, parsedReceiver.StrideAccAddress, token, []metrics.Label{}) + prefixedDenom := transfertypes.GetDenomPrefix(packet.GetDestPort(), packet.GetDestChannel()) + newData.Denom + ibcDenom := transfertypes.ParseDenomTrace(prefixedDenom).IBCDenom() + + hostZone, err := k.stakeibcKeeper.GetHostZoneFromHostDenom(ctx, token.Denom) + if err != nil { + return channeltypes.NewErrorAcknowledgement(err) + } + + if hostZone.IbcDenom != ibcDenom { + return channeltypes.NewErrorAcknowledgement(errors.New("ibc denom is not equal to host zone ibc denom")) + } + + err = k.RunLiquidStake(ctx, parsedReceiver.StrideAccAddress, token) if err != nil { ack = channeltypes.NewErrorAcknowledgement(err) } return ack } -func (k Keeper) RunLiquidStake(ctx sdk.Context, addr sdk.AccAddress, token sdk.Coin, labels []metrics.Label) error { +func (k Keeper) RunLiquidStake(ctx sdk.Context, addr sdk.AccAddress, token sdk.Coin) error { msg := &stakeibctypes.MsgLiquidStake{ Creator: addr.String(), Amount: token.Amount, diff --git a/x/autopilot/keeper/liquidstake_test.go b/x/autopilot/keeper/liquidstake_test.go index 81eb05386..7d42c8502 100644 --- a/x/autopilot/keeper/liquidstake_test.go +++ b/x/autopilot/keeper/liquidstake_test.go @@ -39,6 +39,8 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { atomHostDenom := "uatom" prefixedDenom := transfertypes.GetPrefixedDenom(packet.GetDestPort(), packet.GetDestChannel(), atomHostDenom) atomIbcDenom := transfertypes.ParseDenomTrace(prefixedDenom).IBCDenom() + prefixedDenom2 := transfertypes.GetPrefixedDenom(packet.GetDestPort(), "channel-1000", atomHostDenom) + atomIbcDenom2 := transfertypes.ParseDenomTrace(prefixedDenom2).IBCDenom() strdDenom := "ustrd" prefixedDenom = transfertypes.GetPrefixedDenom(packet.GetSourcePort(), packet.GetSourceChannel(), strdDenom) @@ -49,6 +51,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { forwardingActive bool recvDenom string packetData transfertypes.FungibleTokenPacketData + destChannel string expSuccess bool expLiquidStake bool }{ @@ -61,6 +64,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: fmt.Sprintf("%s|stakeibc/LiquidStake", addr1.String()), Memo: "", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: false, expLiquidStake: false, @@ -74,6 +78,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: fmt.Sprintf("%s|stakeibc/LiquidStake", addr1.String()), Memo: "", }, + destChannel: "channel-0", recvDenom: "ustrd", expSuccess: false, expLiquidStake: false, @@ -87,10 +92,25 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: fmt.Sprintf("%s|stakeibc/LiquidStake", addr1.String()), Memo: "", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: true, expLiquidStake: true, }, + { // ibc denom uatom from different channel + forwardingActive: true, + packetData: transfertypes.FungibleTokenPacketData{ + Denom: "uatom", + Amount: "1000000", + Sender: "cosmos16plylpsgxechajltx9yeseqexzdzut9g8vla4k", + Receiver: fmt.Sprintf("%s|stakeibc/LiquidStake", addr1.String()), + Memo: "", + }, + destChannel: "channel-1000", + recvDenom: atomIbcDenom2, + expSuccess: false, + expLiquidStake: false, + }, { // all okay with memo liquidstaking since ibc-go v5.1.0 forwardingActive: true, packetData: transfertypes.FungibleTokenPacketData{ @@ -100,6 +120,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: addr1.String(), Memo: "stakeibc/LiquidStake", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: true, expLiquidStake: true, @@ -113,6 +134,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: addr1.String(), Memo: "", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: true, expLiquidStake: false, @@ -126,6 +148,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: "xxx|stakeibc/LiquidStake", Memo: "", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: false, expLiquidStake: false, @@ -139,6 +162,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { Receiver: "xxx|stakeibc/LiquidStake", Memo: "", }, + destChannel: "channel-0", recvDenom: atomIbcDenom, expSuccess: false, expLiquidStake: false, @@ -147,6 +171,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { for i, tc := range testCases { suite.Run(fmt.Sprintf("Case %d", i), func() { + packet.DestinationChannel = tc.destChannel packet.Data = transfertypes.ModuleCdc.MustMarshalJSON(&tc.packetData) suite.SetupTest() // reset