8000 chore(upgrade): add fix denom meta logic by GAtom22 · Pull Request #2874 · evmos/evmos · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

chore(upgrade): add fix denom meta logic #2874

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
8000
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ Ref: https://keepachangelog.com/en/1.0.0/

# Changelog

## Unreleased

### State Machine Breaking

- (bank) [#2874](https://github.com/evmos/evmos/pull/2874) Fix corrupted denom metadata on testnet.

## [v20.0.0-rc2](https://github.com/evmos/evmos/releases/tag/v20.0.0-rc2) - 2024-09-19

### State Machine Breaking
Expand Down
1 change: 1 addition & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,7 @@ func (app *Evmos) setupUpgradeHandlers() {
app.mm, app.configurator,
app.EvmKeeper,
app.GovKeeper,
app.BankKeeper,
),
)

Expand Down
59 changes: 59 additions & 0 deletions app/upgrades/v20/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,19 @@ package v20

import (
"context"
"errors"
"fmt"

"cosmossdk.io/log"
upgradetypes "cosmossdk.io/x/upgrade/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"

"github.com/evmos/evmos/v20/utils"
evmkeeper "github.com/evmos/evmos/v20/x/evm/keeper"
"github.com/evmos/evmos/v20/x/evm/types"
)
Expand All @@ -22,6 +28,7 @@ func CreateUpgradeHandler(
configurator module.Configurator,
ek *evmkeeper.Keeper,
gk govkeeper.Keeper,
bk bankkeeper.Keeper,
) upgradetypes.UpgradeHandler {
return func(c context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
ctx := sdk.UnwrapSDKContext(c)
Expand All @@ -37,6 +44,13 @@ func CreateUpgradeHandler(
logger.Error("error while updating gov params", "error", err.Error())
}

if utils.IsTestnet(ctx.ChainID()) {
logger.Debug("Updating bank denom metadata...")
if err := FixDenomMetadata(ctx, logger, bk); err != nil {
logger.Error("error while updating bank denom metadata", "error", err.Error())
}
}

logger.Debug("Running module migrations...")
return mm.RunMigrations(ctx, configurator, vm)
}
Expand Down Expand Up @@ -87,3 +101,48 @@ func UpdateExpeditedPropsParams(ctx sdk.Context, gv govkeeper.Keeper) error {
}
return gv.Params.Set(ctx, params)
}

// NOTE: ONLY TESTNET
// we need this because on testnet
// some denom metadata keys are corrupted
func FixDenomMetadata(ctx sdk.Context, logger log.Logger, bk bankkeeper.Keeper) error {
// use cache context to revert all changes if fails
cacheCtx, writeFn := ctx.CacheContext()
k, ok := bk.(bankkeeper.BaseKeeper)
if !ok {
return fmt.Errorf("invalid bank keeper type, expected: keeper.BaseKeeper, got: %T", bk)
}
res, err := k.DenomsMetadata(cacheCtx, &banktypes.QueryDenomsMetadataRequest{})
if err != nil {
return err
}
if res == nil {
return errors.New("denoms metadata response is nil")
}
metaDatas := res.Metadatas

// remove all entries
iterator, err := k.BaseViewKeeper.DenomMetadata.Iterate(cacheCtx, nil)
if err != nil {
return err
}
defer sdk.LogDeferred(logger, iterator.Close)

for ; iterator.Valid(); iterator.Next() {
key, err := iterator.Key()
if err != nil {
return err
}
if err := k.BaseViewKeeper.DenomMetadata.Remove(cacheCtx, key); err != nil {
return err
}
}

// add all entries again with the key == meta.Base
for _, m := range metaDatas {
k.SetDenomMetaData(cacheCtx, m)
}

writeFn()
return nil
}
163 changes: 163 additions & 0 deletions app/upgrades/v20/upgrades_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ package v20_test
import (
"testing"

"cosmossdk.io/log"
"github.com/stretchr/testify/require"

sdk "github.com/cosmos/cosmos-sdk/types"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"

v20 "github.com/evmos/evmos/v20/app/upgrades/v20"
Expand Down Expand Up @@ -142,3 +145,163 @@ func TestUpdateExpeditedPropsParams(t *testing.T) {
})
}
}

var metaDatas = []banktypes.Metadata{
{
Description: "The native EVM, governance and staking token of the Evmos Hub",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "aevmos",
Aliases: []string{"attoevmos"},
},
{
Denom: "evmos",
Exponent: 18,
},
},
Base: "aevmos",
Display: "evmos",
Name: "Evmos",
Symbol: "EVMOS",
},
{
Description: "Cosmos coin token representation of 0x153A59d48AcEAbedbDCf7a13F67Ae52b434B810B",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "erc20/0x153A59d48AcEAbedbDCf7a13F67Ae52b434B810B",
},
{
Denom: "WrappedEtherCeler",
Exponent: 18,
},
},
Base: "erc20/0x153A59d48AcEAbedbDCf7a13F67Ae52b434B810B",
Display: "WrappedEtherCeler",
Name: "erc20/0x153A59d48AcEAbedbDCf7a13F67Ae52b434B810B",
Symbol: "ceWETH",
},
{
Description: "Staking derivative stATOM for staked ATOM by Stride",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "ibc/0830AFFC2F4F7CD24F9CEC07024FEA64CE3C5ABBC520DBD803BFA97BC3DCCA85",
Aliases: []string{"stuatom"},
},
{
Denom: "statom",
Exponent: 6,
},
},
Base: "ibc/0830AFFC2F4F7CD24F9CEC07024FEA64CE3C5ABBC520DBD803BFA97BC3DCCA85",
Display: "statom",
Name: "Stride Staked Atom",
Symbol: "stATOM",
},
}

func TestFixDenomMetadata(t *testing.T) {
var (
nw *network.UnitTestNetwork
ctx sdk.Context
)
testCases := []struct {
name string
set 6D40 up func()
}{
{
name: "all keys are OK - no change",
setup: func() {
for _, m := range metaDatas {
nw.App.BankKeeper.SetDenomMetaData(ctx, m)
}
},
},
{
name: "all corrupted keys",
setup: func() {
bk, ok := nw.App.BankKeeper.(bankkeeper.BaseKeeper)
require.True(t, ok)
for _, m := range metaDatas {
corruptedKey := m.Base + "a"
err := bk.BaseViewKeeper.DenomMetadata.Set(ctx, corruptedKey, m)
require.NoError(t, err)
// check that cannot retrieve metadata with correct key
_, found := bk.GetDenomMetaData(ctx, m.Base)
require.False(t, found)
}
},
},
{
name: "some corrupted keys others OK",
setup: func() {
bk, ok := nw.App.BankKeeper.(bankkeeper.BaseKeeper)
require.True(t, ok)
corrupted := true
for _, m := range metaDatas {
key := m.Base
if corrupted {
key += "a"
}
err := bk.BaseViewKeeper.DenomMetadata.Set(ctx, key, m)
require.NoError(t, err)
// check that cannot retrieve metadata with correct key
_, found := bk.GetDenomMetaData(ctx, m.Base)
require.Equal(t, !corrupted, found)
corrupted = !corrupted
}
},
},
{
name: "duplicated entry with corrupted key (IBC coin)",
setup: func() {
for _, m := range metaDatas {
nw.App.BankKeeper.SetDenomMetaData(ctx, m)
}
bk, ok := nw.App.BankKeeper.(bankkeeper.BaseKeeper)
require.True(t, ok)
ibcCoinMeta := metaDatas[len(metaDatas)-1]
corruptedKey := ibcCoinMeta.Base + "i"
err := bk.BaseViewKeeper.DenomMetadata.Set(ctx, corruptedKey, ibcCoinMeta)
require.NoError(t, err)
m, found := bk.GetDenomMetaData(ctx, ibcCoinMeta.Base)
require.True(t, found)
require.Equal(t, ibcCoinMeta, m)
m, found = bk.GetDenomMetaData(ctx, corruptedKey)
require.True(t, found)
require.Equal(t, ibcCoinMeta, m)
// there should be a duplicated entry
// on the denom metas list
res, err := nw.App.BankKeeper.DenomsMetadata(ctx, &banktypes.QueryDenomsMetadataRequest{})
require.NoError(t, err)
require.NotNil(t, res)
require.Len(t, res.Metadatas, len(metaDatas)+1)
},
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
nw = network.NewUnitTestNetwork()
ctx = nw.GetContext()

// setup for testcase
tc.setup()

err := v20.FixDenomMetadata(ctx, log.NewNopLogger(), nw.App.BankKeeper)
require.NoError(t, err)

for _, m := range metaDatas {
res, err := nw.App.BankKeeper.DenomMetadata(ctx, &banktypes.QueryDenomMetadataRequest{Denom: m.Base})
require.NoError(t, err)
require.NotNil(t, res)
require.Equal(t, m, res.Metadata)
}

// check the denom meta length
res, err := nw.App.BankKeeper.DenomsMetadata(ctx, &banktypes.QueryDenomsMetadataRequest{})
require.NoError(t, err)
require.NotNil(t, res)
require.Len(t, res.Metadatas, len(metaDatas))
})
}
}
Loading
0