diff --git a/app/upgrade_test.go b/app/upgrade_test.go index ace4013e..9ae3afee 100644 --- a/app/upgrade_test.go +++ b/app/upgrade_test.go @@ -5,7 +5,6 @@ import ( "math/big" "os" "path/filepath" - "strings" "testing" "cosmossdk.io/collections" @@ -629,7 +628,7 @@ func checkPundiAIFXERC20Token(t *testing.T, ctx sdk.Context, myApp *app.App) { has, err := myApp.Erc20Keeper.ERC20Token.Has(ctx, fxtypes.DefaultDenom) require.NoError(t, err) require.True(t, has) - has, err = myApp.Erc20Keeper.ERC20Token.Has(ctx, strings.ToUpper(fxtypes.FXDenom)) + has, err = myApp.Erc20Keeper.ERC20Token.Has(ctx, fxtypes.OriginalFXDenom()) require.NoError(t, err) require.False(t, has) } @@ -638,6 +637,7 @@ func checkModulesData(t *testing.T, ctx sdk.Context, myApp *app.App) { t.Helper() checkCrisisModule(t, ctx, myApp) + checkBankModule(t, ctx, myApp) checkEvmParams(t, ctx, myApp) } @@ -648,3 +648,25 @@ func checkEvmParams(t *testing.T, ctx sdk.Context, myApp *app.App) { require.Equal(t, fxtypes.DefaultDenom, params.EvmDenom) require.Equal(t, evmtypes.DefaultHeaderHashNum, params.HeaderHashNum) } + +func checkBankModule(t *testing.T, ctx sdk.Context, myApp *app.App) { + t.Helper() + + fxDenom := fxtypes.OriginalFXDenom() + totalSupply := sdkmath.ZeroInt() + myApp.BankKeeper.IterateAllBalances(ctx, func(addr sdk.AccAddress, balance sdk.Coin) bool { + require.NotEqual(t, fxDenom, balance.Denom) + if balance.Denom == fxtypes.DefaultDenom { + totalSupply = totalSupply.Add(balance.Amount) + } + return false + }) + + supply := myApp.BankKeeper.GetSupply(ctx, fxtypes.DefaultDenom) + require.Equal(t, totalSupply, supply.Amount) + + myApp.BankKeeper.IterateSendEnabledEntries(ctx, func(denom string, sendEnabled bool) (stop bool) { + require.NotEqual(t, fxDenom, denom) + return false + }) +} diff --git a/app/upgrades/v8/upgrade.go b/app/upgrades/v8/upgrade.go index 13295185..f6abe795 100644 --- a/app/upgrades/v8/upgrade.go +++ b/app/upgrades/v8/upgrade.go @@ -7,6 +7,7 @@ import ( "math/big" "strings" + "cosmossdk.io/collections" sdkmath "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" upgradetypes "cosmossdk.io/x/upgrade/types" @@ -205,6 +206,9 @@ func upgradeMainnet( } func migrateModulesData(ctx sdk.Context, app *keepers.AppKeepers) error { + if err := migrateBankModule(ctx, app.BankKeeper); err != nil { + return err + } if err := migrateEvmParams(ctx, app.EvmKeeper); err != nil { return err } @@ -260,9 +264,10 @@ func migrateCrosschainModuleAccount(ctx sdk.Context, ak authkeeper.AccountKeeper } func migrateBridgeBalance(ctx sdk.Context, bankKeeper bankkeeper.Keeper, accountKeeper authkeeper.AccountKeeper) error { + fxDenom := fxtypes.OriginalFXDenom() mds := bankKeeper.GetAllDenomMetaData(ctx) for _, md := range mds { - if md.Base == fxtypes.DefaultDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { + if md.Base == fxDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { continue } dstBase := md.Base @@ -335,11 +340,12 @@ func migrateERC20TokenToCrosschain(ctx sdk.Context, bankKeeper bankkeeper.Keeper } func updateMetadata(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { + fxDenom := fxtypes.OriginalFXDenom() mds := bankKeeper.GetAllDenomMetaData(ctx) removeMetadata := make([]string, 0, 2) for _, md := range mds { - if md.Base == fxtypes.DefaultDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { + if md.Base == fxDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { continue } // remove alias @@ -653,7 +659,7 @@ func migrateMetadataDisplay(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error } func migrateErc20FXToPundiAI(ctx sdk.Context, keeper erc20keeper.Keeper) error { - fxDenom := strings.ToUpper(fxtypes.FXDenom) + fxDenom := fxtypes.OriginalFXDenom() erc20Token, err := keeper.GetERC20Token(ctx, fxDenom) if err != nil { return err @@ -675,5 +681,51 @@ func migrateMetadataFXToPundiAI(ctx sdk.Context, keeper bankkeeper.Keeper) error if !ok { return errors.New("bank keeper not implement bank.BaseKeeper") } - return bk.BaseViewKeeper.DenomMetadata.Remove(ctx, strings.ToUpper(fxtypes.FXDenom)) + return bk.BaseViewKeeper.DenomMetadata.Remove(ctx, fxtypes.OriginalFXDenom()) +} + +func migrateBankModule(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { + fxDenom := fxtypes.OriginalFXDenom() + + sendEnabledEntry, found := bankKeeper.GetSendEnabledEntry(ctx, fxDenom) + if found { + bankKeeper.DeleteSendEnabled(ctx, fxDenom) + bankKeeper.SetSendEnabled(ctx, fxtypes.DefaultDenom, sendEnabledEntry.Enabled) + } + + var err error + fxSupply := bankKeeper.GetSupply(ctx, fxDenom) + apundiaiSupply := sdkmath.ZeroInt() + + bk, ok := bankKeeper.(bankkeeper.BaseKeeper) + if !ok { + return errors.New("bank keeper not implement bank.BaseKeeper") + } + bk.IterateAllBalances(ctx, func(address sdk.AccAddress, coin sdk.Coin) (stop bool) { + if coin.Denom != fxDenom { + return false + } + if err = bk.Balances.Remove(ctx, collections.Join(address, coin.Denom)); err != nil { + return true + } + coin.Denom = fxtypes.DefaultDenom + coin.Amount = fxtypes.SwapAmount(coin.Amount) + if !coin.IsPositive() { + return false + } + apundiaiSupply = apundiaiSupply.Add(coin.Amount) + if err = bk.Balances.Set(ctx, collections.Join(address, coin.Denom), coin.Amount); err != nil { + return true + } + return false + }) + if err != nil { + return err + } + + ctx.Logger().Info("migrate fx to apundiai", "FX supply", fxSupply.Amount.String(), "apundiai supply", apundiaiSupply.String()) + if err = bk.Supply.Remove(ctx, fxDenom); err != nil { + return err + } + return bk.Supply.Set(ctx, fxtypes.DefaultDenom, apundiaiSupply) } diff --git a/types/constant.go b/types/constant.go index 89ab6fdd..a5781442 100644 --- a/types/constant.go +++ b/types/constant.go @@ -104,3 +104,7 @@ func SwapCoin(coin sdk.Coin) sdk.Coin { coin.Amount = SwapAmount(coin.Amount) return coin } + +func OriginalFXDenom() string { + return strings.ToUpper(FXDenom) +} diff --git a/x/erc20/migrations/v8/keys.go b/x/erc20/migrations/v8/keys.go index c252620e..111e54ee 100644 --- a/x/erc20/migrations/v8/keys.go +++ b/x/erc20/migrations/v8/keys.go @@ -64,7 +64,7 @@ func (m Migrator) migrateParams(ctx sdk.Context, store storetypes.KVStore) error } func (m Migrator) migrateTokenPair(ctx sdk.Context, store storetypes.KVStore) error { - fxDenom := strings.ToUpper(fxtypes.FXDenom) + fxDenom := fxtypes.OriginalFXDenom() iterator := storetypes.KVStorePrefixIterator(store, KeyPrefixTokenPair) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { diff --git a/x/erc20/migrations/v8/migrate.go b/x/erc20/migrations/v8/migrate.go index 45690162..95e084da 100644 --- a/x/erc20/migrations/v8/migrate.go +++ b/x/erc20/migrations/v8/migrate.go @@ -16,7 +16,7 @@ import ( ) func (m Migrator) MigrateToken(ctx sdk.Context) error { - fxDenom := strings.ToUpper(fxtypes.FXDenom) + fxDenom := fxtypes.OriginalFXDenom() // add FX bridge token if err := m.addToken(ctx, fxDenom, ""); err != nil { return err @@ -74,7 +74,7 @@ func (m Migrator) addIBCToken(ctx sdk.Context, base, alias string) error { } func (m Migrator) addBridgeToken(ctx sdk.Context, base, alias string) error { - fxDenom := strings.ToUpper(fxtypes.FXDenom) + fxDenom := fxtypes.OriginalFXDenom() if getExcludeBridgeToken(ctx, alias) { return nil }