From da76d527c92ef6d470099009a684622a72eef841 Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Wed, 12 Jun 2024 12:56:59 +0800 Subject: [PATCH 1/3] fix: gas mismatch due to querying empty account --- x/tokenfactory/keeper/keeper_test.go | 8 ++++---- x/tokenfactory/keeper/msg_server.go | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index 8787001e..0a4415c5 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -4,14 +4,15 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" - - sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/stretchr/testify/require" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/stretchr/testify/suite" + sdk "github.com/cosmos/cosmos-sdk/types" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" @@ -100,6 +101,5 @@ func (s *KeeperTestSuite) TestBurnFromModuleAccount() { Amount: sdk.NewCoin(denom, sdk.NewInt(1000)), BurnFromAddress: govAddr.String(), }) - require.Error(s.T(), err) } diff --git a/x/tokenfactory/keeper/msg_server.go b/x/tokenfactory/keeper/msg_server.go index 11dcdf09..017fb07d 100644 --- a/x/tokenfactory/keeper/msg_server.go +++ b/x/tokenfactory/keeper/msg_server.go @@ -113,11 +113,18 @@ func (server msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types. msg.BurnFromAddress = msg.Sender } + gasBefore1 := ctx.GasMeter().GasConsumed() acc, err := sdk.AccAddressFromBech32(msg.BurnFromAddress) if err != nil { return nil, err } accountI := server.Keeper.accountKeeper.GetAccount(ctx, acc) + gasAfter1 := ctx.GasMeter().GasConsumed() + // This is done so that we can perform an emergency upgrade to the chain to prevent app hash + // 1135 is the gas needed to look up an empty account + ctx.GasMeter().RefundGas(gasAfter1-gasBefore1, "refund gas account lookup to prevent app hash") + ctx.GasMeter().ConsumeGas(1135, "gas to lookup empty account") + _, ok := accountI.(authtypes.ModuleAccountI) if ok { return nil, types.ErrBurnFromModuleAccount From bfa3c110e65ac06bf775557e4217d135b880d5f0 Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Wed, 12 Jun 2024 14:52:01 +0800 Subject: [PATCH 2/3] fix: make addition gas free --- x/tokenfactory/keeper/msg_server.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x/tokenfactory/keeper/msg_server.go b/x/tokenfactory/keeper/msg_server.go index 017fb07d..2b2d8f46 100644 --- a/x/tokenfactory/keeper/msg_server.go +++ b/x/tokenfactory/keeper/msg_server.go @@ -120,10 +120,11 @@ func (server msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types. } accountI := server.Keeper.accountKeeper.GetAccount(ctx, acc) gasAfter1 := ctx.GasMeter().GasConsumed() - // This is done so that we can perform an emergency upgrade to the chain to prevent app hash - // 1135 is the gas needed to look up an empty account + // Make this query gas free ctx.GasMeter().RefundGas(gasAfter1-gasBefore1, "refund gas account lookup to prevent app hash") - ctx.GasMeter().ConsumeGas(1135, "gas to lookup empty account") + + // Do this so we consume the previous gas too + _ = server.Keeper.accountKeeper.GetAccount(ctx, sdk.AccAddress(msg.BurnFromAddress)) _, ok := accountI.(authtypes.ModuleAccountI) if ok { From 110d6879976911f88fc4162abda59c903a7321ff Mon Sep 17 00:00:00 2001 From: javiersuweijie Date: Wed, 12 Jun 2024 15:59:30 +0800 Subject: [PATCH 3/3] fix: comments --- x/tokenfactory/keeper/msg_server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/tokenfactory/keeper/msg_server.go b/x/tokenfactory/keeper/msg_server.go index 2b2d8f46..91c621cf 100644 --- a/x/tokenfactory/keeper/msg_server.go +++ b/x/tokenfactory/keeper/msg_server.go @@ -120,10 +120,12 @@ func (server msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types. } accountI := server.Keeper.accountKeeper.GetAccount(ctx, acc) gasAfter1 := ctx.GasMeter().GasConsumed() - // Make this query gas free + // Note: this is only used in patch v2.11.4. Will be removed from v2.12.0 onwards + // Make this query gas free to prevent app mismatch when burning tf tokens ctx.GasMeter().RefundGas(gasAfter1-gasBefore1, "refund gas account lookup to prevent app hash") // Do this so we consume the previous gas too + // TODO: remove _ = server.Keeper.accountKeeper.GetAccount(ctx, sdk.AccAddress(msg.BurnFromAddress)) _, ok := accountI.(authtypes.ModuleAccountI)