From 9fa5175c44c1c53a1a12203b218bfc68dca1b3a9 Mon Sep 17 00:00:00 2001 From: Masih Yeganeh Date: Mon, 21 Jul 2025 22:37:50 +0330 Subject: [PATCH 1/5] Denom symbol migration --- app/app.go | 1 + app/upgrade/v6/denom_symbol.go | 51 ++++++++++++++++++++ app/upgrade/v6/upgrade.go | 7 ++- integration-tests/upgrade/denom_symbol.go | 59 +++++++++++++++++++++++ integration-tests/upgrade/upgrade_test.go | 4 +- 5 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 app/upgrade/v6/denom_symbol.go create mode 100644 integration-tests/upgrade/denom_symbol.go diff --git a/app/app.go b/app/app.go index c7478b8f3..e320e5956 100644 --- a/app/app.go +++ b/app/app.go @@ -1185,6 +1185,7 @@ func New( appupgradev6.New( app.ModuleManager, app.configurator, + app.BankKeeper, ), } diff --git a/app/upgrade/v6/denom_symbol.go b/app/upgrade/v6/denom_symbol.go new file mode 100644 index 000000000..cf13173bc --- /dev/null +++ b/app/upgrade/v6/denom_symbol.go @@ -0,0 +1,51 @@ +package v6 + +import ( + "context" + "fmt" + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/CoreumFoundation/coreum/v6/pkg/config/constant" + wbankkeeper "github.com/CoreumFoundation/coreum/v6/x/wbank/keeper" +) + +func migrateDenomSymbol(ctx context.Context, bankKeeper wbankkeeper.BaseKeeperWrapper) error { + var denom string + var newSymbol string + + sdkCtx := sdk.UnwrapSDKContext(ctx) + switch sdkCtx.ChainID() { + case string(constant.ChainIDMain): + denom = constant.DenomMain + newSymbol = "TX" + case string(constant.ChainIDTest): + denom = constant.DenomTest + newSymbol = "TESTTX" + case string(constant.ChainIDDev): + denom = constant.DenomDev + newSymbol = "DEVTX" + default: + return fmt.Errorf("unknown chain id: %s", sdkCtx.ChainID()) + } + + meta, found := bankKeeper.GetDenomMetaData(ctx, denom) + if !found { + return fmt.Errorf("denom metadata not found for %s", denom) + } + + meta.Display = strings.ToLower(newSymbol) + meta.Symbol = newSymbol + + // Optionally adjust DenomUnits to reflect the new display name + for i := range meta.DenomUnits { + if meta.DenomUnits[i].Denom == strings.ToLower(meta.Display) || meta.DenomUnits[i].Exponent == 6 { + meta.DenomUnits[i].Denom = strings.ToLower(newSymbol) + } + } + + bankKeeper.SetDenomMetaData(ctx, meta) + + return nil +} diff --git a/app/upgrade/v6/upgrade.go b/app/upgrade/v6/upgrade.go index 96b543e98..f9c8687ea 100644 --- a/app/upgrade/v6/upgrade.go +++ b/app/upgrade/v6/upgrade.go @@ -8,13 +8,14 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/CoreumFoundation/coreum/v6/app/upgrade" + wbankkeeper "github.com/CoreumFoundation/coreum/v6/x/wbank/keeper" ) // Name defines the upgrade name. const Name = "v6" // New makes an upgrade handler for v6 upgrade. -func New(mm *module.Manager, configurator module.Configurator) upgrade.Upgrade { +func New(mm *module.Manager, configurator module.Configurator, bankKeeper wbankkeeper.BaseKeeperWrapper) upgrade.Upgrade { return upgrade.Upgrade{ Name: Name, StoreUpgrades: store.StoreUpgrades{ @@ -26,6 +27,10 @@ func New(mm *module.Manager, configurator module.Configurator) upgrade.Upgrade { return nil, err } + if err := migrateDenomSymbol(ctx, bankKeeper); err != nil { + return nil, err + } + return vmap, nil }, } diff --git a/integration-tests/upgrade/denom_symbol.go b/integration-tests/upgrade/denom_symbol.go new file mode 100644 index 000000000..e2ff28b6a --- /dev/null +++ b/integration-tests/upgrade/denom_symbol.go @@ -0,0 +1,59 @@ +//go:build integrationtests + +package upgrade + +import ( + "strings" + "testing" + + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/stretchr/testify/require" + + integrationtests "github.com/CoreumFoundation/coreum/v6/integration-tests" + "github.com/CoreumFoundation/coreum/v6/pkg/config/constant" +) + +type denomSymbol struct { +} + +func (d *denomSymbol) Before(t *testing.T) { + ctx, chain := integrationtests.NewCoreumTestingContext(t) + requireT := require.New(t) + + client := banktypes.NewQueryClient(chain.ClientContext) + denomMetadata, err := client.DenomMetadata(ctx, &banktypes.QueryDenomMetadataRequest{ + Denom: chain.ChainSettings.Denom, + }) + requireT.NoError(err) + switch chain.ChainSettings.ChainID { + case string(constant.ChainIDMain): + requireT.Equal(strings.ToUpper(constant.DenomMainDisplay), denomMetadata.Metadata.Symbol) + case string(constant.ChainIDTest): + requireT.Equal(strings.ToUpper(constant.DenomTestDisplay), denomMetadata.Metadata.Symbol) + case string(constant.ChainIDDev): + requireT.Equal(strings.ToUpper(constant.DenomDevDisplay), denomMetadata.Metadata.Symbol) + default: + requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) + } +} + +func (d *denomSymbol) After(t *testing.T) { + ctx, chain := integrationtests.NewCoreumTestingContext(t) + requireT := require.New(t) + + client := banktypes.NewQueryClient(chain.ClientContext) + denomMetadata, err := client.DenomMetadata(ctx, &banktypes.QueryDenomMetadataRequest{ + Denom: chain.ChainSettings.Denom, + }) + requireT.NoError(err) + switch chain.ChainSettings.ChainID { + case string(constant.ChainIDMain): + requireT.Equal("TX", denomMetadata.Metadata.Symbol) + case string(constant.ChainIDTest): + requireT.Equal("TESTTX", denomMetadata.Metadata.Symbol) + case string(constant.ChainIDDev): + requireT.Equal("DEVTX", denomMetadata.Metadata.Symbol) + default: + requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) + } +} diff --git a/integration-tests/upgrade/upgrade_test.go b/integration-tests/upgrade/upgrade_test.go index 223339d1c..958994be8 100644 --- a/integration-tests/upgrade/upgrade_test.go +++ b/integration-tests/upgrade/upgrade_test.go @@ -51,7 +51,9 @@ func TestUpgrade(t *testing.T) { } func upgradeV5ToV6(t *testing.T) { - tests := []upgradeTest{} + tests := []upgradeTest{ + &denomSymbol{}, + } for _, test := range tests { test.Before(t) From 600d56d20cd5b716a69b3c25b4147e5cdfb56322 Mon Sep 17 00:00:00 2001 From: Masih Yeganeh Date: Tue, 22 Jul 2025 11:49:58 +0330 Subject: [PATCH 2/5] Testing --- app/upgrade/v6/upgrade.go | 4 +++- integration-tests/upgrade/denom_symbol.go | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/upgrade/v6/upgrade.go b/app/upgrade/v6/upgrade.go index f9c8687ea..f29834b3e 100644 --- a/app/upgrade/v6/upgrade.go +++ b/app/upgrade/v6/upgrade.go @@ -15,7 +15,9 @@ import ( const Name = "v6" // New makes an upgrade handler for v6 upgrade. -func New(mm *module.Manager, configurator module.Configurator, bankKeeper wbankkeeper.BaseKeeperWrapper) upgrade.Upgrade { +func New( + mm *module.Manager, configurator module.Configurator, bankKeeper wbankkeeper.BaseKeeperWrapper, +) upgrade.Upgrade { return upgrade.Upgrade{ Name: Name, StoreUpgrades: store.StoreUpgrades{ diff --git a/integration-tests/upgrade/denom_symbol.go b/integration-tests/upgrade/denom_symbol.go index e2ff28b6a..4c6b1ca9a 100644 --- a/integration-tests/upgrade/denom_symbol.go +++ b/integration-tests/upgrade/denom_symbol.go @@ -3,6 +3,7 @@ package upgrade import ( + "fmt" "strings" "testing" @@ -25,13 +26,14 @@ func (d *denomSymbol) Before(t *testing.T) { Denom: chain.ChainSettings.Denom, }) requireT.NoError(err) + panic(fmt.Sprintf("%+v", denomMetadata)) switch chain.ChainSettings.ChainID { case string(constant.ChainIDMain): - requireT.Equal(strings.ToUpper(constant.DenomMainDisplay), denomMetadata.Metadata.Symbol) + requireT.Equal(strings.ToUpper(constant.DenomMainDisplay), denomMetadata.Metadata.Display) case string(constant.ChainIDTest): - requireT.Equal(strings.ToUpper(constant.DenomTestDisplay), denomMetadata.Metadata.Symbol) + requireT.Equal(strings.ToUpper(constant.DenomTestDisplay), denomMetadata.Metadata.Display) case string(constant.ChainIDDev): - requireT.Equal(strings.ToUpper(constant.DenomDevDisplay), denomMetadata.Metadata.Symbol) + requireT.Equal(strings.ToUpper(constant.DenomDevDisplay), denomMetadata.Metadata.Display) default: requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) } @@ -48,11 +50,11 @@ func (d *denomSymbol) After(t *testing.T) { requireT.NoError(err) switch chain.ChainSettings.ChainID { case string(constant.ChainIDMain): - requireT.Equal("TX", denomMetadata.Metadata.Symbol) + requireT.Equal("TX", denomMetadata.Metadata.Display) case string(constant.ChainIDTest): - requireT.Equal("TESTTX", denomMetadata.Metadata.Symbol) + requireT.Equal("TESTTX", denomMetadata.Metadata.Display) case string(constant.ChainIDDev): - requireT.Equal("DEVTX", denomMetadata.Metadata.Symbol) + requireT.Equal("DEVTX", denomMetadata.Metadata.Display) default: requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) } From 4e6a79d3519515b5d1392fe68f0920baab24c6b5 Mon Sep 17 00:00:00 2001 From: Masih Yeganeh Date: Tue, 22 Jul 2025 12:41:36 +0330 Subject: [PATCH 3/5] Fix tests --- app/upgrade/v6/denom_symbol.go | 15 +++--- integration-tests/upgrade/denom_symbol.go | 58 +++++++++++++++-------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/app/upgrade/v6/denom_symbol.go b/app/upgrade/v6/denom_symbol.go index cf13173bc..c4b1630a1 100644 --- a/app/upgrade/v6/denom_symbol.go +++ b/app/upgrade/v6/denom_symbol.go @@ -13,19 +13,15 @@ import ( func migrateDenomSymbol(ctx context.Context, bankKeeper wbankkeeper.BaseKeeperWrapper) error { var denom string - var newSymbol string sdkCtx := sdk.UnwrapSDKContext(ctx) switch sdkCtx.ChainID() { case string(constant.ChainIDMain): denom = constant.DenomMain - newSymbol = "TX" case string(constant.ChainIDTest): denom = constant.DenomTest - newSymbol = "TESTTX" case string(constant.ChainIDDev): denom = constant.DenomDev - newSymbol = "DEVTX" default: return fmt.Errorf("unknown chain id: %s", sdkCtx.ChainID()) } @@ -35,14 +31,15 @@ func migrateDenomSymbol(ctx context.Context, bankKeeper wbankkeeper.BaseKeeperWr return fmt.Errorf("denom metadata not found for %s", denom) } - meta.Display = strings.ToLower(newSymbol) - meta.Symbol = newSymbol + meta.Description = strings.ReplaceAll(meta.Description, "core", "tx") + meta.Base = strings.ReplaceAll(meta.Base, "core", "tx") + meta.Display = strings.ReplaceAll(meta.Display, "core", "tx") + meta.Name = strings.ReplaceAll(meta.Name, "core", "tx") + meta.Symbol = strings.ReplaceAll(meta.Symbol, "core", "tx") // Optionally adjust DenomUnits to reflect the new display name for i := range meta.DenomUnits { - if meta.DenomUnits[i].Denom == strings.ToLower(meta.Display) || meta.DenomUnits[i].Exponent == 6 { - meta.DenomUnits[i].Denom = strings.ToLower(newSymbol) - } + meta.DenomUnits[i].Denom = strings.ReplaceAll(meta.DenomUnits[i].Denom, "core", "tx") } bankKeeper.SetDenomMetaData(ctx, meta) diff --git a/integration-tests/upgrade/denom_symbol.go b/integration-tests/upgrade/denom_symbol.go index 4c6b1ca9a..398cee6ca 100644 --- a/integration-tests/upgrade/denom_symbol.go +++ b/integration-tests/upgrade/denom_symbol.go @@ -4,7 +4,6 @@ package upgrade import ( "fmt" - "strings" "testing" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -26,17 +25,26 @@ func (d *denomSymbol) Before(t *testing.T) { Denom: chain.ChainSettings.Denom, }) requireT.NoError(err) - panic(fmt.Sprintf("%+v", denomMetadata)) - switch chain.ChainSettings.ChainID { - case string(constant.ChainIDMain): - requireT.Equal(strings.ToUpper(constant.DenomMainDisplay), denomMetadata.Metadata.Display) - case string(constant.ChainIDTest): - requireT.Equal(strings.ToUpper(constant.DenomTestDisplay), denomMetadata.Metadata.Display) - case string(constant.ChainIDDev): - requireT.Equal(strings.ToUpper(constant.DenomDevDisplay), denomMetadata.Metadata.Display) - default: - requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) + + prefix := "" + if chain.ChainSettings.ChainID == string(constant.ChainIDTest) { + prefix = "test" + } else if chain.ChainSettings.ChainID == string(constant.ChainIDDev) { + prefix = "dev" } + + requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%score coin", prefix)) + requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + Denom: fmt.Sprintf("u%score", prefix), + }) + requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + Denom: fmt.Sprintf("%score", prefix), + Exponent: 6, + }) + requireT.Equal(denomMetadata.Metadata.Base, fmt.Sprintf("u%score", prefix)) + requireT.Equal(denomMetadata.Metadata.Display, fmt.Sprintf("%score", prefix)) + requireT.Equal(denomMetadata.Metadata.Name, fmt.Sprintf("u%score", prefix)) + requireT.Equal(denomMetadata.Metadata.Symbol, fmt.Sprintf("u%score", prefix)) } func (d *denomSymbol) After(t *testing.T) { @@ -48,14 +56,24 @@ func (d *denomSymbol) After(t *testing.T) { Denom: chain.ChainSettings.Denom, }) requireT.NoError(err) - switch chain.ChainSettings.ChainID { - case string(constant.ChainIDMain): - requireT.Equal("TX", denomMetadata.Metadata.Display) - case string(constant.ChainIDTest): - requireT.Equal("TESTTX", denomMetadata.Metadata.Display) - case string(constant.ChainIDDev): - requireT.Equal("DEVTX", denomMetadata.Metadata.Display) - default: - requireT.FailNowf("unknown chain id: %s", chain.ChainSettings.ChainID) + + prefix := "" + if chain.ChainSettings.ChainID == string(constant.ChainIDTest) { + prefix = "test" + } else if chain.ChainSettings.ChainID == string(constant.ChainIDDev) { + prefix = "dev" } + + requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%stx coin", prefix)) + requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + Denom: fmt.Sprintf("u%stx", prefix), + }) + requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + Denom: fmt.Sprintf("%stx", prefix), + Exponent: 6, + }) + requireT.Equal(denomMetadata.Metadata.Base, fmt.Sprintf("u%stx", prefix)) + requireT.Equal(denomMetadata.Metadata.Display, fmt.Sprintf("%stx", prefix)) + requireT.Equal(denomMetadata.Metadata.Name, fmt.Sprintf("u%stx", prefix)) + requireT.Equal(denomMetadata.Metadata.Symbol, fmt.Sprintf("u%stx", prefix)) } From 0e30c9dbec5b76d27befa5a770623e16493fcdf1 Mon Sep 17 00:00:00 2001 From: Masih Yeganeh Date: Tue, 22 Jul 2025 12:55:48 +0330 Subject: [PATCH 4/5] Fix test --- integration-tests/upgrade/denom_symbol.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/upgrade/denom_symbol.go b/integration-tests/upgrade/denom_symbol.go index 398cee6ca..ae608df20 100644 --- a/integration-tests/upgrade/denom_symbol.go +++ b/integration-tests/upgrade/denom_symbol.go @@ -34,10 +34,10 @@ func (d *denomSymbol) Before(t *testing.T) { } requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%score coin", prefix)) - requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("u%score", prefix), }) - requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("%score", prefix), Exponent: 6, }) @@ -65,10 +65,10 @@ func (d *denomSymbol) After(t *testing.T) { } requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%stx coin", prefix)) - requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("u%stx", prefix), }) - requireT.Contains(denomMetadata.Metadata.DenomUnits, banktypes.DenomUnit{ + requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("%stx", prefix), Exponent: 6, }) From b799a9826d5bfa172d5de9f17c014b2ce6a19cad Mon Sep 17 00:00:00 2001 From: Masih Yeganeh Date: Tue, 22 Jul 2025 13:12:37 +0330 Subject: [PATCH 5/5] panic with denom metadata --- integration-tests/upgrade/denom_symbol.go | 27 +++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/integration-tests/upgrade/denom_symbol.go b/integration-tests/upgrade/denom_symbol.go index ae608df20..c72fdab0c 100644 --- a/integration-tests/upgrade/denom_symbol.go +++ b/integration-tests/upgrade/denom_symbol.go @@ -16,6 +16,7 @@ import ( type denomSymbol struct { } +//nolint:dupl func (d *denomSymbol) Before(t *testing.T) { ctx, chain := integrationtests.NewCoreumTestingContext(t) requireT := require.New(t) @@ -33,20 +34,21 @@ func (d *denomSymbol) Before(t *testing.T) { prefix = "dev" } - requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%score coin", prefix)) + requireT.Equal(prefix+"core coin", denomMetadata.Metadata.Description) requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("u%score", prefix), }) requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ - Denom: fmt.Sprintf("%score", prefix), + Denom: prefix + "core", Exponent: 6, }) - requireT.Equal(denomMetadata.Metadata.Base, fmt.Sprintf("u%score", prefix)) - requireT.Equal(denomMetadata.Metadata.Display, fmt.Sprintf("%score", prefix)) - requireT.Equal(denomMetadata.Metadata.Name, fmt.Sprintf("u%score", prefix)) - requireT.Equal(denomMetadata.Metadata.Symbol, fmt.Sprintf("u%score", prefix)) + requireT.Equal(fmt.Sprintf("u%score", prefix), denomMetadata.Metadata.Base) + requireT.Equal(prefix+"core", denomMetadata.Metadata.Display) + requireT.Equal(fmt.Sprintf("u%score", prefix), denomMetadata.Metadata.Name) + requireT.Equal(fmt.Sprintf("u%score", prefix), denomMetadata.Metadata.Symbol) } +//nolint:dupl func (d *denomSymbol) After(t *testing.T) { ctx, chain := integrationtests.NewCoreumTestingContext(t) requireT := require.New(t) @@ -64,16 +66,17 @@ func (d *denomSymbol) After(t *testing.T) { prefix = "dev" } - requireT.Equal(denomMetadata.Metadata.Description, fmt.Sprintf("%stx coin", prefix)) + panic(fmt.Sprintf("%+v", denomMetadata.Metadata)) + requireT.Equal(prefix+"tx coin", denomMetadata.Metadata.Description) requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ Denom: fmt.Sprintf("u%stx", prefix), }) requireT.Contains(denomMetadata.Metadata.DenomUnits, &banktypes.DenomUnit{ - Denom: fmt.Sprintf("%stx", prefix), + Denom: prefix + "tx", Exponent: 6, }) - requireT.Equal(denomMetadata.Metadata.Base, fmt.Sprintf("u%stx", prefix)) - requireT.Equal(denomMetadata.Metadata.Display, fmt.Sprintf("%stx", prefix)) - requireT.Equal(denomMetadata.Metadata.Name, fmt.Sprintf("u%stx", prefix)) - requireT.Equal(denomMetadata.Metadata.Symbol, fmt.Sprintf("u%stx", prefix)) + requireT.Equal(fmt.Sprintf("u%stx", prefix), denomMetadata.Metadata.Base) + requireT.Equal(prefix+"tx", denomMetadata.Metadata.Display) + requireT.Equal(fmt.Sprintf("u%stx", prefix), denomMetadata.Metadata.Name) + requireT.Equal(fmt.Sprintf("u%stx", prefix), denomMetadata.Metadata.Symbol) }