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..c4b1630a1 --- /dev/null +++ b/app/upgrade/v6/denom_symbol.go @@ -0,0 +1,48 @@ +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 + + sdkCtx := sdk.UnwrapSDKContext(ctx) + switch sdkCtx.ChainID() { + case string(constant.ChainIDMain): + denom = constant.DenomMain + case string(constant.ChainIDTest): + denom = constant.DenomTest + case string(constant.ChainIDDev): + denom = constant.DenomDev + 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.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 { + meta.DenomUnits[i].Denom = strings.ReplaceAll(meta.DenomUnits[i].Denom, "core", "tx") + } + + bankKeeper.SetDenomMetaData(ctx, meta) + + return nil +} diff --git a/app/upgrade/v6/upgrade.go b/app/upgrade/v6/upgrade.go index 96b543e98..f29834b3e 100644 --- a/app/upgrade/v6/upgrade.go +++ b/app/upgrade/v6/upgrade.go @@ -8,13 +8,16 @@ 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 +29,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..c72fdab0c --- /dev/null +++ b/integration-tests/upgrade/denom_symbol.go @@ -0,0 +1,82 @@ +//go:build integrationtests + +package upgrade + +import ( + "fmt" + "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 { +} + +//nolint:dupl +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) + + prefix := "" + if chain.ChainSettings.ChainID == string(constant.ChainIDTest) { + prefix = "test" + } else if chain.ChainSettings.ChainID == string(constant.ChainIDDev) { + prefix = "dev" + } + + 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: prefix + "core", + Exponent: 6, + }) + 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) + + client := banktypes.NewQueryClient(chain.ClientContext) + denomMetadata, err := client.DenomMetadata(ctx, &banktypes.QueryDenomMetadataRequest{ + Denom: chain.ChainSettings.Denom, + }) + requireT.NoError(err) + + prefix := "" + if chain.ChainSettings.ChainID == string(constant.ChainIDTest) { + prefix = "test" + } else if chain.ChainSettings.ChainID == string(constant.ChainIDDev) { + prefix = "dev" + } + + 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: prefix + "tx", + Exponent: 6, + }) + 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) +} 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)