From af23037e02d82cb16f69f557130031d9632e28db Mon Sep 17 00:00:00 2001 From: zakir <80246097+zakir-code@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:28:28 +0800 Subject: [PATCH] refactor(upgrade): split migration logic into multiple files --- app/upgrades/store/store.go | 2 +- app/upgrades/v8/bank.go | 56 ++++ app/upgrades/v8/bridge.go | 110 ++++++++ app/upgrades/v8/constants.go | 19 +- app/upgrades/v8/contract.go | 77 ++++++ app/upgrades/v8/crisis.go | 19 ++ app/upgrades/v8/crosschain.go | 56 ++++ app/upgrades/v8/erc20.go | 20 ++ app/upgrades/v8/evm.go | 16 ++ app/upgrades/v8/feegrant.go | 3 - app/upgrades/v8/feematket.go | 16 ++ app/upgrades/v8/gov.go | 37 +++ app/upgrades/v8/ibc.go | 24 ++ app/upgrades/v8/metadata.go | 86 ++++++ app/upgrades/v8/staking.go | 5 +- app/upgrades/v8/upgrade.go | 481 +--------------------------------- app/upgrades/v8/wrap_token.go | 4 +- 17 files changed, 550 insertions(+), 481 deletions(-) create mode 100644 app/upgrades/v8/bank.go create mode 100644 app/upgrades/v8/bridge.go create mode 100644 app/upgrades/v8/contract.go create mode 100644 app/upgrades/v8/crisis.go create mode 100644 app/upgrades/v8/crosschain.go create mode 100644 app/upgrades/v8/erc20.go create mode 100644 app/upgrades/v8/evm.go create mode 100644 app/upgrades/v8/feematket.go create mode 100644 app/upgrades/v8/gov.go create mode 100644 app/upgrades/v8/ibc.go create mode 100644 app/upgrades/v8/metadata.go diff --git a/app/upgrades/store/store.go b/app/upgrades/store/store.go index 2e5c0709..a108aa57 100644 --- a/app/upgrades/store/store.go +++ b/app/upgrades/store/store.go @@ -17,7 +17,7 @@ func RemoveStoreKeys(ctx sdk.Context, storeKey storetypes.StoreKey, prefixKeys [ deleteCount++ } if deleteCount > 0 { - ctx.Logger().Info("remove store key", "kvStore", storeKey.Name(), + ctx.Logger().Info("remove store key", "kvStore", "module", "upgrade", storeKey.Name(), "prefix", prefixKey[0], "deleteKeyCount", deleteCount) } } diff --git a/app/upgrades/v8/bank.go b/app/upgrades/v8/bank.go new file mode 100644 index 00000000..a0d51856 --- /dev/null +++ b/app/upgrades/v8/bank.go @@ -0,0 +1,56 @@ +package v8 + +import ( + "errors" + + "cosmossdk.io/collections" + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + + fxtypes "github.com/pundiai/fx-core/v8/types" +) + +func migrateBankModule(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { + sendEnabledEntry, found := bankKeeper.GetSendEnabledEntry(ctx, fxtypes.LegacyFXDenom) + if found { + bankKeeper.DeleteSendEnabled(ctx, fxtypes.LegacyFXDenom) + bankKeeper.SetSendEnabled(ctx, fxtypes.DefaultDenom, sendEnabledEntry.Enabled) + } + + var err error + fxSupply := bankKeeper.GetSupply(ctx, fxtypes.LegacyFXDenom) + 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 != fxtypes.LegacyFXDenom { + 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", "module", "upgrade", "FX supply", fxSupply.Amount.String(), "apundiai supply", apundiaiSupply.String()) + if err = bk.Supply.Remove(ctx, fxtypes.LegacyFXDenom); err != nil { + return err + } + return bk.Supply.Set(ctx, fxtypes.DefaultDenom, apundiaiSupply) +} diff --git a/app/upgrades/v8/bridge.go b/app/upgrades/v8/bridge.go new file mode 100644 index 00000000..92ce2566 --- /dev/null +++ b/app/upgrades/v8/bridge.go @@ -0,0 +1,110 @@ +package v8 + +import ( + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + + fxtypes "github.com/pundiai/fx-core/v8/types" + bsctypes "github.com/pundiai/fx-core/v8/x/bsc/types" + crosschaintypes "github.com/pundiai/fx-core/v8/x/crosschain/types" + erc20keeper "github.com/pundiai/fx-core/v8/x/erc20/keeper" + erc20types "github.com/pundiai/fx-core/v8/x/erc20/types" +) + +func migrateERC20TokenToCrosschain(ctx sdk.Context, bankKeeper bankkeeper.Keeper, erc20Keeper erc20keeper.Keeper) error { + balances := bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(erc20types.ModuleName)) + migrateCoins := sdk.NewCoins() + for _, bal := range balances { + has, err := erc20Keeper.HasToken(ctx, bal.Denom) + if err != nil { + return err + } + if !has { + continue + } + migrateCoins = migrateCoins.Add(bal) + } + ctx.Logger().Info("migrate erc20 bridge/ibc token to crosschain", "module", "upgrade", "coins", migrateCoins.String()) + return bankKeeper.SendCoinsFromModuleToModule(ctx, erc20types.ModuleName, crosschaintypes.ModuleName, migrateCoins) +} + +func mintPurseBridgeToken(ctx sdk.Context, erc20Keeper erc20keeper.Keeper, bankKeeper bankkeeper.Keeper) error { + pxEscrowPurse, err := getPundixEscrowPurseAmount(ctx) + if err != nil { + return err + } + + ibcToken, err := erc20Keeper.GetIBCToken(ctx, "channel-0", "purse") + if err != nil { + return err + } + bscPurseToken, err := erc20Keeper.GetBridgeToken(ctx, bsctypes.ModuleName, "purse") + if err != nil { + return err + } + ibcTokenSupply := bankKeeper.GetSupply(ctx, ibcToken.GetIbcDenom()) + bscPurseAmount := sdk.NewCoin(bscPurseToken.BridgeDenom(), pxEscrowPurse.Sub(ibcTokenSupply.Amount)) + return bankKeeper.MintCoins(ctx, bsctypes.ModuleName, sdk.NewCoins(bscPurseAmount)) +} + +func migrateBridgeBalance(ctx sdk.Context, bankKeeper bankkeeper.Keeper, accountKeeper authkeeper.AccountKeeper) error { + mds := bankKeeper.GetAllDenomMetaData(ctx) + for _, md := range mds { + if md.Base == fxtypes.LegacyFXDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { + continue + } + dstBase := md.Base + if !strings.Contains(md.Base, strings.ToLower(md.Symbol)) { + dstBase = strings.ToLower(md.Symbol) + } + srcDenoms := make([]string, 0, len(md.DenomUnits[0].Aliases)+1) + if md.Base != dstBase { + // pundix, purse + srcDenoms = append(srcDenoms, md.Base) + } + srcDenoms = append(srcDenoms, md.DenomUnits[0].Aliases...) + if len(srcDenoms) == 0 { + continue + } + + for _, srcDenom := range srcDenoms { + if err := migrateAccountBalance(ctx, bankKeeper, accountKeeper, srcDenom, dstBase); err != nil { + return err + } + } + } + return nil +} + +func migrateAccountBalance(ctx sdk.Context, bankKeeper bankkeeper.Keeper, accountKeeper authkeeper.AccountKeeper, srcBase, dstBase string) error { + var err error + bankKeeper.IterateAllBalances(ctx, func(address sdk.AccAddress, coin sdk.Coin) (stop bool) { + if coin.Denom != srcBase { + return false + } + + account := accountKeeper.GetAccount(ctx, address) + if _, ok := account.(sdk.ModuleAccountI); ok { + return false + } + + ctx.Logger().Info("migrate coin", "module", "upgrade", "address", address.String(), "src-denom", srcBase, "dst-denom", dstBase, "amount", coin.Amount.String()) + if err = bankKeeper.SendCoinsFromAccountToModule(ctx, address, erc20types.ModuleName, sdk.NewCoins(coin)); err != nil { + return true + } + coin.Denom = dstBase + if err = bankKeeper.MintCoins(ctx, crosschaintypes.ModuleName, sdk.NewCoins(coin)); err != nil { + return true + } + if err = bankKeeper.SendCoinsFromModuleToAccount(ctx, crosschaintypes.ModuleName, address, sdk.NewCoins(coin)); err != nil { + return true + } + + return false + }) + return err +} diff --git a/app/upgrades/v8/constants.go b/app/upgrades/v8/constants.go index dd399c5f..44d41991 100644 --- a/app/upgrades/v8/constants.go +++ b/app/upgrades/v8/constants.go @@ -61,10 +61,9 @@ func getContractOwner(ctx sdk.Context) common.Address { } const ( - pundixBase = "pundix" - purseBase = "purse" - pundixSymbol = "PUNDIX" - purseSymbol = "PURSE" + pundixBaseDenom = "pundix" + purseBaseDenom = "purse" + pundixSymbol = "PUNDIX" ) func getTestnetTokenAmount(ctx sdk.Context) map[string]sdkmath.Int { @@ -85,3 +84,15 @@ func MustParseIntFromString(s string) sdkmath.Int { } return res } + +func GetMigrateEscrowDenoms(chainID string) map[string]string { + result := make(map[string]string, 2) + result[fxtypes.LegacyFXDenom] = fxtypes.DefaultDenom + + pundixDenom := fxtypes.MainnetPundixUnWrapDenom + if chainID == fxtypes.TestnetChainId { + pundixDenom = fxtypes.TestnetPundixUnWrapDenom + } + result[pundixDenom] = fxtypes.PundixWrapDenom + return result +} diff --git a/app/upgrades/v8/contract.go b/app/upgrades/v8/contract.go new file mode 100644 index 00000000..4da73014 --- /dev/null +++ b/app/upgrades/v8/contract.go @@ -0,0 +1,77 @@ +package v8 + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/ethereum/go-ethereum/common" + evmtypes "github.com/evmos/ethermint/x/evm/types" + + "github.com/pundiai/fx-core/v8/contract" + fxtypes "github.com/pundiai/fx-core/v8/types" + crosschainkeeper "github.com/pundiai/fx-core/v8/x/crosschain/keeper" + erc20keeper "github.com/pundiai/fx-core/v8/x/erc20/keeper" + fxevmkeeper "github.com/pundiai/fx-core/v8/x/evm/keeper" +) + +func deployBridgeFeeContract(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, erc20Keeper erc20keeper.Keeper, crosschainKeeper crosschainkeeper.Keeper, evmModuleAddress common.Address) error { + chains := fxtypes.GetSupportChains() + bridgeDenoms := make([]contract.BridgeDenoms, len(chains)) + for index, chain := range chains { + denoms := make([]common.Hash, 0) + bridgeTokens, err := erc20Keeper.GetBridgeTokens(ctx, chain) + if err != nil { + return err + } + for _, token := range bridgeTokens { + denoms = append(denoms, contract.MustStrToByte32(token.GetDenom())) + } + bridgeDenoms[index] = contract.BridgeDenoms{ + ChainName: contract.MustStrToByte32(chain), + Denoms: denoms, + } + } + + oracles := crosschainKeeper.GetAllOracles(ctx, true) + if oracles.Len() <= 0 { + return errors.New("no oracle found") + } + defaultOracleAddress := common.HexToAddress(oracles[0].ExternalAddress) + return contract.DeployBridgeFeeContract(ctx, evmKeeper, bridgeDenoms, evmModuleAddress, getContractOwner(ctx), defaultOracleAddress) +} + +func redeployTestnetContract(ctx sdk.Context, accountKeeper authkeeper.AccountKeeper, evmKeeper *fxevmkeeper.Keeper, erc20Keeper erc20keeper.Keeper, ethKeeper crosschainkeeper.Keeper) error { + if err := evmKeeper.DeleteAccount(ctx, common.HexToAddress(contract.BridgeFeeAddress)); err != nil { + return err + } + if err := evmKeeper.DeleteAccount(ctx, common.HexToAddress(contract.BridgeFeeOracleAddress)); err != nil { + return err + } + + acc := accountKeeper.GetModuleAddress(evmtypes.ModuleName) + moduleAddress := common.BytesToAddress(acc.Bytes()) + return deployBridgeFeeContract(ctx, evmKeeper, erc20Keeper, ethKeeper, moduleAddress) +} + +func updateWPUNDIAILogicCode(ctx sdk.Context, keeper *fxevmkeeper.Keeper) { + wpundiai := contract.GetWPUNDIAI() + if err := keeper.UpdateContractCode(ctx, wpundiai.Address, wpundiai.Code); err != nil { + ctx.Logger().Error("update WPUNDIAI contract", "module", "upgrade", "err", err.Error()) + } else { + ctx.Logger().Info("update WPUNDIAI contract", "module", "upgrade", "codeHash", wpundiai.CodeHash()) + } +} + +func updateERC20LogicCode(ctx sdk.Context, keeper *fxevmkeeper.Keeper) { + erc20 := contract.GetERC20() + if err := keeper.UpdateContractCode(ctx, erc20.Address, erc20.Code); err != nil { + ctx.Logger().Error("update ERC20 contract", "module", "upgrade", "err", err.Error()) + } else { + ctx.Logger().Info("update ERC20 contract", "module", "upgrade", "codeHash", erc20.CodeHash()) + } +} + +func deployAccessControlContract(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, evmModuleAddress common.Address) error { + return contract.DeployAccessControlContract(ctx, evmKeeper, evmModuleAddress, getContractOwner(ctx)) +} diff --git a/app/upgrades/v8/crisis.go b/app/upgrades/v8/crisis.go new file mode 100644 index 00000000..58a78ad0 --- /dev/null +++ b/app/upgrades/v8/crisis.go @@ -0,0 +1,19 @@ +package v8 + +import ( + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + + fxtypes "github.com/pundiai/fx-core/v8/types" +) + +func migrateCrisisModule(ctx sdk.Context, crisisKeeper *crisiskeeper.Keeper) error { + constantFee, err := crisisKeeper.ConstantFee.Get(ctx) + if err != nil { + return err + } + constantFee.Denom = fxtypes.DefaultDenom + constantFee.Amount = sdkmath.NewInt(133).MulRaw(1e18) + return crisisKeeper.ConstantFee.Set(ctx, constantFee) +} diff --git a/app/upgrades/v8/crosschain.go b/app/upgrades/v8/crosschain.go new file mode 100644 index 00000000..7cbacb13 --- /dev/null +++ b/app/upgrades/v8/crosschain.go @@ -0,0 +1,56 @@ +package v8 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + "github.com/pundiai/fx-core/v8/app/keepers" + fxtypes "github.com/pundiai/fx-core/v8/types" + crosschaintypes "github.com/pundiai/fx-core/v8/x/crosschain/types" +) + +func migrateCrosschainParams(ctx sdk.Context, keepers keepers.CrosschainKeepers) error { + for _, k := range keepers.ToSlice() { + params := k.GetParams(ctx) + params.DelegateThreshold.Denom = fxtypes.DefaultDenom + params.DelegateThreshold.Amount = fxtypes.SwapAmount(params.DelegateThreshold.Amount) + if !params.DelegateThreshold.IsPositive() { + return sdkerrors.ErrInvalidCoins.Wrapf("module %s invalid delegate threshold: %s", + k.ModuleName(), params.DelegateThreshold.String()) + } + if err := k.SetParams(ctx, ¶ms); err != nil { + return err + } + } + return nil +} + +func migrateCrosschainModuleAccount(ctx sdk.Context, ak authkeeper.AccountKeeper) error { + addr, perms := ak.GetModuleAddressAndPermissions(crosschaintypes.ModuleName) + if addr == nil { + return sdkerrors.ErrInvalidAddress.Wrapf("crosschain module empty permissions") + } + acc := ak.GetAccount(ctx, addr) + if acc == nil { + return sdkerrors.ErrInvalidAddress.Wrapf("crosschain account not exist") + } + baseAcc, ok := acc.(*authtypes.BaseAccount) + if !ok { + return sdkerrors.ErrInvalidAddress.Wrapf("crosschain account not base account") + } + macc := authtypes.NewModuleAccount(baseAcc, crosschaintypes.ModuleName, perms...) + ak.SetModuleAccount(ctx, macc) + return nil +} + +func migrateOracleDelegateAmount(ctx sdk.Context, keepers keepers.CrosschainKeepers) { + for _, k := range keepers.ToSlice() { + k.IterateOracle(ctx, func(oracle crosschaintypes.Oracle) bool { + oracle.DelegateAmount = fxtypes.SwapAmount(oracle.DelegateAmount) + k.SetOracle(ctx, oracle) + return false + }) + } +} diff --git a/app/upgrades/v8/erc20.go b/app/upgrades/v8/erc20.go new file mode 100644 index 00000000..40969e86 --- /dev/null +++ b/app/upgrades/v8/erc20.go @@ -0,0 +1,20 @@ +package v8 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + fxtypes "github.com/pundiai/fx-core/v8/types" + erc20keeper "github.com/pundiai/fx-core/v8/x/erc20/keeper" +) + +func migrateErc20FXToPundiAI(ctx sdk.Context, keeper erc20keeper.Keeper) error { + erc20Token, err := keeper.GetERC20Token(ctx, fxtypes.LegacyFXDenom) + if err != nil { + return err + } + erc20Token.Denom = fxtypes.DefaultDenom + if err = keeper.ERC20Token.Set(ctx, erc20Token.Denom, erc20Token); err != nil { + return err + } + return keeper.ERC20Token.Remove(ctx, fxtypes.LegacyFXDenom) +} diff --git a/app/upgrades/v8/evm.go b/app/upgrades/v8/evm.go new file mode 100644 index 00000000..b688b614 --- /dev/null +++ b/app/upgrades/v8/evm.go @@ -0,0 +1,16 @@ +package v8 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + evmtypes "github.com/evmos/ethermint/x/evm/types" + + fxtypes "github.com/pundiai/fx-core/v8/types" + fxevmkeeper "github.com/pundiai/fx-core/v8/x/evm/keeper" +) + +func migrateEvmParams(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper) error { + params := evmKeeper.GetParams(ctx) + params.EvmDenom = fxtypes.DefaultDenom + params.HeaderHashNum = evmtypes.DefaultHeaderHashNum + return evmKeeper.SetParams(ctx, params) +} diff --git a/app/upgrades/v8/feegrant.go b/app/upgrades/v8/feegrant.go index 9a1bfb8c..e33ad8e6 100644 --- a/app/upgrades/v8/feegrant.go +++ b/app/upgrades/v8/feegrant.go @@ -27,9 +27,6 @@ func MigrateFeegrant(ctx sdk.Context, cdc codec.BinaryCodec, storeService store. if iterErr != nil { return iterErr } - if err != nil { - return err - } return err } diff --git a/app/upgrades/v8/feematket.go b/app/upgrades/v8/feematket.go new file mode 100644 index 00000000..a0415093 --- /dev/null +++ b/app/upgrades/v8/feematket.go @@ -0,0 +1,16 @@ +package v8 + +import ( + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + feemarketkeeper "github.com/evmos/ethermint/x/feemarket/keeper" + + fxtypes "github.com/pundiai/fx-core/v8/types" +) + +func migrateFeemarketGasPrice(ctx sdk.Context, feemarketKeeper feemarketkeeper.Keeper) error { + params := feemarketKeeper.GetParams(ctx) + params.BaseFee = sdkmath.NewInt(fxtypes.DefaultGasPrice) + params.MinGasPrice = sdkmath.LegacyNewDec(fxtypes.DefaultGasPrice) + return feemarketKeeper.SetParams(ctx, params) +} diff --git a/app/upgrades/v8/gov.go b/app/upgrades/v8/gov.go new file mode 100644 index 00000000..d0bb9718 --- /dev/null +++ b/app/upgrades/v8/gov.go @@ -0,0 +1,37 @@ +package v8 + +import ( + sdkmath "cosmossdk.io/math" + storetypes "cosmossdk.io/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + + "github.com/pundiai/fx-core/v8/app/upgrades/store" + fxtypes "github.com/pundiai/fx-core/v8/types" + fxgovkeeper "github.com/pundiai/fx-core/v8/x/gov/keeper" + fxgovv8 "github.com/pundiai/fx-core/v8/x/gov/migrations/v8" +) + +func migrateGovCustomParam(ctx sdk.Context, keeper *fxgovkeeper.Keeper, storeKey *storetypes.KVStoreKey) error { + // 1. delete fxParams key + store.RemoveStoreKeys(ctx, storeKey, fxgovv8.GetRemovedStoreKeys()) + + // 2. init custom params + return keeper.InitCustomParams(ctx) +} + +func migrateGovDefaultParams(ctx sdk.Context, keeper *fxgovkeeper.Keeper) error { + params, err := keeper.Params.Get(ctx) + if err != nil { + return err + } + + minDepositAmount := sdkmath.NewInt(1e18).MulRaw(30) + + params.MinDeposit = sdk.NewCoins(sdk.NewCoin(fxtypes.DefaultDenom, minDepositAmount)) + params.ExpeditedMinDeposit = sdk.NewCoins(sdk.NewCoin(fxtypes.DefaultDenom, minDepositAmount.MulRaw(govv1.DefaultMinExpeditedDepositTokensRatio))) + params.MinInitialDepositRatio = sdkmath.LegacyMustNewDecFromStr("0.33").String() + params.MinDepositRatio = sdkmath.LegacyMustNewDecFromStr("0").String() + + return keeper.Params.Set(ctx, params) +} diff --git a/app/upgrades/v8/ibc.go b/app/upgrades/v8/ibc.go new file mode 100644 index 00000000..e491a492 --- /dev/null +++ b/app/upgrades/v8/ibc.go @@ -0,0 +1,24 @@ +package v8 + +import ( + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" + + fxtypes "github.com/pundiai/fx-core/v8/types" +) + +func migrateTransferTokenInEscrow(ctx sdk.Context, transferKeeper ibctransferkeeper.Keeper) { + escrowDenoms := GetMigrateEscrowDenoms(ctx.ChainID()) + for oldDenom, newDenom := range escrowDenoms { + totalEscrow := transferKeeper.GetTotalEscrowForDenom(ctx, oldDenom) + newAmount := totalEscrow.Amount + if oldDenom == fxtypes.LegacyFXDenom { + newAmount = fxtypes.SwapAmount(newAmount) + } + // first remove old denom + transferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(oldDenom, sdkmath.ZeroInt())) + // then add new denom + transferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(newDenom, newAmount)) + } +} diff --git a/app/upgrades/v8/metadata.go b/app/upgrades/v8/metadata.go new file mode 100644 index 00000000..275c9b93 --- /dev/null +++ b/app/upgrades/v8/metadata.go @@ -0,0 +1,86 @@ +package v8 + +import ( + "errors" + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" + ibcchanneltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" + + fxtypes "github.com/pundiai/fx-core/v8/types" +) + +func updateMetadata(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { + mds := bankKeeper.GetAllDenomMetaData(ctx) + + removeMetadata := make([]string, 0, 2) + for _, md := range mds { + if md.Base == fxtypes.LegacyFXDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { + continue + } + // remove alias + md.DenomUnits[0].Aliases = []string{} + + newBase := strings.ToLower(md.Symbol) + // update pundix/purse base denom + if md.Base != newBase && !strings.Contains(md.Base, newBase) && !strings.HasPrefix(md.Display, ibctransfertypes.ModuleName+"/"+ibcchanneltypes.ChannelPrefix) { + removeMetadata = append(removeMetadata, md.Base) + + md.Base = newBase + md.Display = newBase + md.DenomUnits[0].Denom = newBase + } + + bankKeeper.SetDenomMetaData(ctx, md) + } + + bk, ok := bankKeeper.(bankkeeper.BaseKeeper) + if !ok { + return errors.New("bank keeper not implement bank.BaseKeeper") + } + for _, base := range removeMetadata { + if !bankKeeper.HasDenomMetaData(ctx, base) { + continue + } + ctx.Logger().Info("remove metadata", "base", base, "module", "upgrade") + if err := bk.BaseViewKeeper.DenomMetadata.Remove(ctx, base); err != nil { + return err + } + } + return nil +} + +func migrateMetadataFXToPundiAI(ctx sdk.Context, keeper bankkeeper.Keeper) error { + // add pundiai metadata + metadata := fxtypes.NewDefaultMetadata() + keeper.SetDenomMetaData(ctx, metadata) + + // remove FX metadata + bk, ok := keeper.(bankkeeper.BaseKeeper) + if !ok { + return errors.New("bank keeper not implement bank.BaseKeeper") + } + return bk.BaseViewKeeper.DenomMetadata.Remove(ctx, fxtypes.LegacyFXDenom) +} + +func migrateMetadataDisplay(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { + mds := bankKeeper.GetAllDenomMetaData(ctx) + for _, md := range mds { + if md.Display != md.Base || len(md.DenomUnits) <= 1 { + continue + } + for _, dus := range md.DenomUnits { + if dus.Denom != md.Base { + md.Display = dus.Denom + break + } + } + if err := md.Validate(); err != nil { + return err + } + bankKeeper.SetDenomMetaData(ctx, md) + } + return nil +} diff --git a/app/upgrades/v8/staking.go b/app/upgrades/v8/staking.go index aa81af8d..24da3ac3 100644 --- a/app/upgrades/v8/staking.go +++ b/app/upgrades/v8/staking.go @@ -67,10 +67,7 @@ func migrateStakingModule(ctx sdk.Context, keeper *stakingkeeper.Keeper) error { if iterErr != nil { return iterErr } - if err != nil { - return err - } - return nil + return err } func CheckStakingModule(t *testing.T, ctx sdk.Context, keeper *stakingkeeper.Keeper) { diff --git a/app/upgrades/v8/upgrade.go b/app/upgrades/v8/upgrade.go index 6051849e..e80abd2f 100644 --- a/app/upgrades/v8/upgrade.go +++ b/app/upgrades/v8/upgrade.go @@ -2,34 +2,22 @@ package v8 import ( "context" - "errors" "fmt" "math/big" - "strings" - "cosmossdk.io/collections" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" "cosmossdk.io/x/feegrant" upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/module" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" - ibcchanneltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" "github.com/ethereum/go-ethereum/common" evmtypes "github.com/evmos/ethermint/x/evm/types" - feemarketkeeper "github.com/evmos/ethermint/x/feemarket/keeper" "github.com/pundiai/fx-core/v8/app/keepers" "github.com/pundiai/fx-core/v8/app/upgrades/store" @@ -43,8 +31,6 @@ import ( erc20types "github.com/pundiai/fx-core/v8/x/erc20/types" ethtypes "github.com/pundiai/fx-core/v8/x/eth/types" fxevmkeeper "github.com/pundiai/fx-core/v8/x/evm/keeper" - fxgovkeeper "github.com/pundiai/fx-core/v8/x/gov/keeper" - fxgovv8 "github.com/pundiai/fx-core/v8/x/gov/migrations/v8" layer2types "github.com/pundiai/fx-core/v8/x/layer2/types" fxstakingv8 "github.com/pundiai/fx-core/v8/x/staking/migrations/v8" ) @@ -126,23 +112,21 @@ func upgradeMainnet( if err = migrateGovCustomParam(ctx, app.GovKeeper, app.GetKey(govtypes.StoreKey)); err != nil { return fromVM, err } - + if err = migrateGovDefaultParams(ctx, app.GovKeeper); err != nil { + return fromVM, err + } if err = migrateBridgeBalance(ctx, app.BankKeeper, app.AccountKeeper); err != nil { return fromVM, err } - if err = migrateERC20TokenToCrosschain(ctx, app.BankKeeper, app.Erc20Keeper); err != nil { return fromVM, err } - if err = fixPundixCoin(ctx, app.EvmKeeper, app.Erc20Keeper, app.BankKeeper); err != nil { return fromVM, err } - if err = fixPurseCoin(ctx, app.EvmKeeper, app.Erc20Keeper, app.BankKeeper); err != nil { return fromVM, err } - if err = updateMetadata(ctx, app.BankKeeper); err != nil { return fromVM, err } @@ -218,250 +202,6 @@ func migrateModulesData(ctx sdk.Context, codec codec.Codec, app *keepers.AppKeep return migrateCrisisModule(ctx, app.CrisisKeeper) } -func migrateTransferTokenInEscrow(ctx sdk.Context, transferKeeper ibctransferkeeper.Keeper) { - escrowDenoms := GetMigrateEscrowDenoms(ctx.ChainID()) - for oldDenom, newDenom := range escrowDenoms { - totalEscrow := transferKeeper.GetTotalEscrowForDenom(ctx, oldDenom) - newAmount := totalEscrow.Amount - if oldDenom == fxtypes.LegacyFXDenom { - newAmount = fxtypes.SwapAmount(newAmount) - } - // first remove old denom - transferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(oldDenom, sdkmath.ZeroInt())) - // then add new denom - transferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(newDenom, newAmount)) - } -} - -func migrateCrisisModule(ctx sdk.Context, crisisKeeper *crisiskeeper.Keeper) error { - constantFee, err := crisisKeeper.ConstantFee.Get(ctx) - if err != nil { - return err - } - constantFee.Denom = fxtypes.DefaultDenom - constantFee.Amount = sdkmath.NewInt(133).MulRaw(1e18) - return crisisKeeper.ConstantFee.Set(ctx, constantFee) -} - -func migrateEvmParams(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper) error { - params := evmKeeper.GetParams(ctx) - params.EvmDenom = fxtypes.DefaultDenom - params.HeaderHashNum = evmtypes.DefaultHeaderHashNum - return evmKeeper.SetParams(ctx, params) -} - -func migrateGovCustomParam(ctx sdk.Context, keeper *fxgovkeeper.Keeper, storeKey *storetypes.KVStoreKey) error { - // 1. delete fxParams key - store.RemoveStoreKeys(ctx, storeKey, fxgovv8.GetRemovedStoreKeys()) - - // 2. init custom params - if err := keeper.InitCustomParams(ctx); err != nil { - return err - } - - // 3. set default params - return migrateGovDefaultParams(ctx, keeper) -} - -func migrateCrosschainModuleAccount(ctx sdk.Context, ak authkeeper.AccountKeeper) error { - addr, perms := ak.GetModuleAddressAndPermissions(crosschaintypes.ModuleName) - if addr == nil { - return sdkerrors.ErrInvalidAddress.Wrapf("crosschain module empty permissions") - } - acc := ak.GetAccount(ctx, addr) - if acc == nil { - return sdkerrors.ErrInvalidAddress.Wrapf("crosschain account not exist") - } - baseAcc, ok := acc.(*authtypes.BaseAccount) - if !ok { - return sdkerrors.ErrInvalidAddress.Wrapf("crosschain account not base account") - } - macc := authtypes.NewModuleAccount(baseAcc, crosschaintypes.ModuleName, perms...) - ak.SetModuleAccount(ctx, macc) - return nil -} - -func migrateBridgeBalance(ctx sdk.Context, bankKeeper bankkeeper.Keeper, accountKeeper authkeeper.AccountKeeper) error { - mds := bankKeeper.GetAllDenomMetaData(ctx) - for _, md := range mds { - if md.Base == fxtypes.LegacyFXDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { - continue - } - dstBase := md.Base - if !strings.Contains(md.Base, strings.ToLower(md.Symbol)) { - dstBase = strings.ToLower(md.Symbol) - } - srcDenoms := make([]string, 0, len(md.DenomUnits[0].Aliases)+1) - if md.Base != dstBase { - // pundix, purse - srcDenoms = append(srcDenoms, md.Base) - } - srcDenoms = append(srcDenoms, md.DenomUnits[0].Aliases...) - if len(srcDenoms) == 0 { - continue - } - - for _, srcDenom := range srcDenoms { - if err := migrateAccountBalance(ctx, bankKeeper, accountKeeper, srcDenom, dstBase); err != nil { - return err - } - } - } - return nil -} - -func migrateAccountBalance(ctx sdk.Context, bankKeeper bankkeeper.Keeper, accountKeeper authkeeper.AccountKeeper, srcBase, dstBase string) error { - var err error - bankKeeper.IterateAllBalances(ctx, func(address sdk.AccAddress, coin sdk.Coin) (stop bool) { - if coin.Denom != srcBase { - return false - } - - account := accountKeeper.GetAccount(ctx, address) - if _, ok := account.(sdk.ModuleAccountI); ok { - return false - } - - ctx.Logger().Info("migrate coin", "address", address.String(), "src-denom", srcBase, "dst-denom", dstBase, "amount", coin.Amount.String()) - if err = bankKeeper.SendCoinsFromAccountToModule(ctx, address, erc20types.ModuleName, sdk.NewCoins(coin)); err != nil { - return true - } - coin.Denom = dstBase - if err = bankKeeper.MintCoins(ctx, crosschaintypes.ModuleName, sdk.NewCoins(coin)); err != nil { - return true - } - if err = bankKeeper.SendCoinsFromModuleToAccount(ctx, crosschaintypes.ModuleName, address, sdk.NewCoins(coin)); err != nil { - return true - } - - return false - }) - return err -} - -func migrateERC20TokenToCrosschain(ctx sdk.Context, bankKeeper bankkeeper.Keeper, erc20Keeper erc20keeper.Keeper) error { - balances := bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(erc20types.ModuleName)) - migrateCoins := sdk.NewCoins() - for _, bal := range balances { - has, err := erc20Keeper.HasToken(ctx, bal.Denom) - if err != nil { - return err - } - if !has { - continue - } - migrateCoins = migrateCoins.Add(bal) - } - ctx.Logger().Info("migrate erc20 bridge/ibc token to crosschain", "coins", migrateCoins.String()) - return bankKeeper.SendCoinsFromModuleToModule(ctx, erc20types.ModuleName, crosschaintypes.ModuleName, migrateCoins) -} - -func updateMetadata(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { - mds := bankKeeper.GetAllDenomMetaData(ctx) - - removeMetadata := make([]string, 0, 2) - for _, md := range mds { - if md.Base == fxtypes.LegacyFXDenom || (len(md.DenomUnits) == 0 || len(md.DenomUnits[0].Aliases) == 0) && md.Symbol != pundixSymbol { - continue - } - // remove alias - md.DenomUnits[0].Aliases = []string{} - - newBase := strings.ToLower(md.Symbol) - // update pundix/purse base denom - if md.Base != newBase && !strings.Contains(md.Base, newBase) && !strings.HasPrefix(md.Display, ibctransfertypes.ModuleName+"/"+ibcchanneltypes.ChannelPrefix) { - removeMetadata = append(removeMetadata, md.Base) - - md.Base = newBase - md.Display = newBase - md.DenomUnits[0].Denom = newBase - } - - bankKeeper.SetDenomMetaData(ctx, md) - } - - bk, ok := bankKeeper.(bankkeeper.BaseKeeper) - if !ok { - return errors.New("bank keeper not implement bank.BaseKeeper") - } - for _, base := range removeMetadata { - if !bankKeeper.HasDenomMetaData(ctx, base) { - continue - } - ctx.Logger().Info("remove metadata", "base", base) - if err := bk.BaseViewKeeper.DenomMetadata.Remove(ctx, base); err != nil { - return err - } - } - return nil -} - -func mintPurseBridgeToken(ctx sdk.Context, erc20Keeper erc20keeper.Keeper, bankKeeper bankkeeper.Keeper) error { - pxEscrowPurse, err := getPundixEscrowPurseAmount(ctx) - if err != nil { - return err - } - - ibcToken, err := erc20Keeper.GetIBCToken(ctx, "channel-0", "purse") - if err != nil { - return err - } - bscPurseToken, err := erc20Keeper.GetBridgeToken(ctx, bsctypes.ModuleName, "purse") - if err != nil { - return err - } - ibcTokenSupply := bankKeeper.GetSupply(ctx, ibcToken.GetIbcDenom()) - bscPurseAmount := sdk.NewCoin(bscPurseToken.BridgeDenom(), pxEscrowPurse.Sub(ibcTokenSupply.Amount)) - return bankKeeper.MintCoins(ctx, bsctypes.ModuleName, sdk.NewCoins(bscPurseAmount)) -} - -func deployBridgeFeeContract( - cacheCtx sdk.Context, - evmKeeper *fxevmkeeper.Keeper, - erc20Keeper erc20keeper.Keeper, - crosschainKeeper crosschainkeeper.Keeper, - evmModuleAddress common.Address, -) error { - chains := fxtypes.GetSupportChains() - bridgeDenoms := make([]contract.BridgeDenoms, len(chains)) - for index, chain := range chains { - denoms := make([]common.Hash, 0) - bridgeTokens, err := erc20Keeper.GetBridgeTokens(cacheCtx, chain) - if err != nil { - return err - } - for _, token := range bridgeTokens { - denoms = append(denoms, contract.MustStrToByte32(token.GetDenom())) - } - bridgeDenoms[index] = contract.BridgeDenoms{ - ChainName: contract.MustStrToByte32(chain), - Denoms: denoms, - } - } - - oracles := crosschainKeeper.GetAllOracles(cacheCtx, true) - if oracles.Len() <= 0 { - return errors.New("no oracle found") - } - return contract.DeployBridgeFeeContract( - cacheCtx, - evmKeeper, - bridgeDenoms, - evmModuleAddress, - getContractOwner(cacheCtx), - common.HexToAddress(oracles[0].ExternalAddress), - ) -} - -func deployAccessControlContract(cacheCtx sdk.Context, evmKeeper *fxevmkeeper.Keeper, evmModuleAddress common.Address) error { - return contract.DeployAccessControlContract( - cacheCtx, - evmKeeper, - evmModuleAddress, - getContractOwner(cacheCtx), - ) -} - func fixBaseOracleStatus(ctx sdk.Context, crosschainKeeper crosschainkeeper.Keeper) { if crosschainKeeper.ModuleName() != layer2types.ModuleName { return @@ -478,7 +218,7 @@ func fixBaseOracleStatus(ctx sdk.Context, crosschainKeeper crosschainkeeper.Keep func fixPundixCoin(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, erc20Keeper erc20keeper.Keeper, bankKeeper bankkeeper.Keeper) error { erc20Contract := contract.NewERC20TokenKeeper(evmKeeper) - erc20Token, err := erc20Keeper.GetERC20Token(ctx, pundixBase) + erc20Token, err := erc20Keeper.GetERC20Token(ctx, pundixBaseDenom) if err != nil { return err } @@ -486,18 +226,18 @@ func fixPundixCoin(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, erc20Keeper e if err != nil { return err } - erc20ModulePurseBalance := bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(erc20types.ModuleName), pundixBase) + erc20ModulePurseBalance := bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(erc20types.ModuleName), pundixBaseDenom) if !erc20ModulePurseBalance.IsZero() { erc20PundixSupply = big.NewInt(0).Sub(erc20PundixSupply, erc20ModulePurseBalance.Amount.BigInt()) } - fixCoins := sdk.NewCoins(sdk.NewCoin(pundixBase, sdkmath.NewIntFromBigInt(erc20PundixSupply))) + fixCoins := sdk.NewCoins(sdk.NewCoin(pundixBaseDenom, sdkmath.NewIntFromBigInt(erc20PundixSupply))) return bankKeeper.MintCoins(ctx, erc20types.ModuleName, fixCoins) } func fixPurseCoin(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, erc20Keeper erc20keeper.Keeper, bankKeeper bankkeeper.Keeper) error { erc20Contract := contract.NewERC20TokenKeeper(evmKeeper) - purseToken, err := erc20Keeper.GetERC20Token(ctx, purseBase) + purseToken, err := erc20Keeper.GetERC20Token(ctx, purseBaseDenom) if err != nil { return err } @@ -505,39 +245,39 @@ func fixPurseCoin(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper, erc20Keeper er if err != nil { return err } - erc20ModulePurseBalance := bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(erc20types.ModuleName), purseBase) + erc20ModulePurseBalance := bankKeeper.GetBalance(ctx, authtypes.NewModuleAddress(erc20types.ModuleName), purseBaseDenom) if !erc20ModulePurseBalance.IsZero() { contractPurseSupply = big.NewInt(0).Sub(contractPurseSupply, erc20ModulePurseBalance.Amount.BigInt()) } - ethPurseToken, err := erc20Keeper.GetBridgeToken(ctx, ethtypes.ModuleName, purseBase) + ethPurseToken, err := erc20Keeper.GetBridgeToken(ctx, ethtypes.ModuleName, purseBaseDenom) if err != nil { return err } ethPurseTokenSupply := bankKeeper.GetSupply(ctx, ethPurseToken.BridgeDenom()) - bscPurseToken, err := erc20Keeper.GetBridgeToken(ctx, bsctypes.ModuleName, purseBase) + bscPurseToken, err := erc20Keeper.GetBridgeToken(ctx, bsctypes.ModuleName, purseBaseDenom) if err != nil { return err } bscPurseTokenSupply := bankKeeper.GetSupply(ctx, bscPurseToken.BridgeDenom()) - ibcPurseToken, err := erc20Keeper.GetIBCToken(ctx, "channel-0", purseBase) + ibcPurseToken, err := erc20Keeper.GetIBCToken(ctx, "channel-0", purseBaseDenom) if err != nil { return err } - erc20PurseSupply := sdk.NewCoin(purseBase, sdkmath.NewIntFromBigInt(contractPurseSupply)) + erc20PurseSupply := sdk.NewCoin(purseBaseDenom, sdkmath.NewIntFromBigInt(contractPurseSupply)) if err = bankKeeper.MintCoins(ctx, erc20types.ModuleName, sdk.NewCoins(erc20PurseSupply)); err != nil { return err } - crosschainPurseSupply := sdk.NewCoin(purseBase, bscPurseTokenSupply.Amount.Add(ethPurseTokenSupply.Amount)) + crosschainPurseSupply := sdk.NewCoin(purseBaseDenom, bscPurseTokenSupply.Amount.Add(ethPurseTokenSupply.Amount)) if err = bankKeeper.MintCoins(ctx, crosschaintypes.ModuleName, sdk.NewCoins(crosschainPurseSupply)); err != nil { return err } - basePurseSupply := bankKeeper.GetSupply(ctx, purseBase) + basePurseSupply := bankKeeper.GetSupply(ctx, purseBaseDenom) ibcPurseSupply := bankKeeper.GetSupply(ctx, ibcPurseToken.GetIbcDenom()) needIBCPurseSupply := sdk.NewCoin(ibcPurseToken.GetIbcDenom(), basePurseSupply.Amount.Sub(ibcPurseSupply.Amount)) @@ -577,196 +317,3 @@ func fixTestnetTokenAmount(ctx sdk.Context, bankKeeper bankkeeper.Keeper, evmKee } return nil } - -func redeployTestnetContract( - ctx sdk.Context, - accountKeeper authkeeper.AccountKeeper, - evmKeeper *fxevmkeeper.Keeper, - erc20Keeper erc20keeper.Keeper, - ethKeeper crosschainkeeper.Keeper, -) error { - if err := evmKeeper.DeleteAccount(ctx, common.HexToAddress(contract.BridgeFeeAddress)); err != nil { - return err - } - if err := evmKeeper.DeleteAccount(ctx, common.HexToAddress(contract.BridgeFeeOracleAddress)); err != nil { - return err - } - - acc := accountKeeper.GetModuleAddress(evmtypes.ModuleName) - moduleAddress := common.BytesToAddress(acc.Bytes()) - return deployBridgeFeeContract( - ctx, - evmKeeper, - erc20Keeper, - ethKeeper, - moduleAddress, - ) -} - -func migrateGovDefaultParams(ctx sdk.Context, keeper *fxgovkeeper.Keeper) error { - params, err := keeper.Params.Get(ctx) - if err != nil { - return err - } - - minDepositAmount := sdkmath.NewInt(1e18).MulRaw(30) - - params.MinDeposit = sdk.NewCoins(sdk.NewCoin(fxtypes.DefaultDenom, minDepositAmount)) - params.ExpeditedMinDeposit = sdk.NewCoins(sdk.NewCoin(fxtypes.DefaultDenom, minDepositAmount.MulRaw(govv1.DefaultMinExpeditedDepositTokensRatio))) - params.MinInitialDepositRatio = sdkmath.LegacyMustNewDecFromStr("0.33").String() - params.MinDepositRatio = sdkmath.LegacyMustNewDecFromStr("0").String() - - return keeper.Params.Set(ctx, params) -} - -func migrateFeemarketGasPrice(ctx sdk.Context, feemarketKeeper feemarketkeeper.Keeper) error { - params := feemarketKeeper.GetParams(ctx) - params.BaseFee = sdkmath.NewInt(fxtypes.DefaultGasPrice) - params.MinGasPrice = sdkmath.LegacyNewDec(fxtypes.DefaultGasPrice) - return feemarketKeeper.SetParams(ctx, params) -} - -func migrateCrosschainParams(ctx sdk.Context, keepers keepers.CrosschainKeepers) error { - for _, k := range keepers.ToSlice() { - params := k.GetParams(ctx) - params.DelegateThreshold.Denom = fxtypes.DefaultDenom - params.DelegateThreshold.Amount = fxtypes.SwapAmount(params.DelegateThreshold.Amount) - if !params.DelegateThreshold.IsPositive() { - return sdkerrors.ErrInvalidCoins.Wrapf("module %s invalid delegate threshold: %s", - k.ModuleName(), params.DelegateThreshold.String()) - } - if err := k.SetParams(ctx, ¶ms); err != nil { - return err - } - } - return nil -} - -func migrateOracleDelegateAmount(ctx sdk.Context, keepers keepers.CrosschainKeepers) { - for _, k := range keepers.ToSlice() { - k.IterateOracle(ctx, func(oracle crosschaintypes.Oracle) bool { - oracle.DelegateAmount = fxtypes.SwapAmount(oracle.DelegateAmount) - k.SetOracle(ctx, oracle) - return false - }) - } -} - -func migrateMetadataDisplay(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { - mds := bankKeeper.GetAllDenomMetaData(ctx) - for _, md := range mds { - if md.Display != md.Base || len(md.DenomUnits) <= 1 { - continue - } - for _, dus := range md.DenomUnits { - if dus.Denom != md.Base { - md.Display = dus.Denom - break - } - } - if err := md.Validate(); err != nil { - return err - } - bankKeeper.SetDenomMetaData(ctx, md) - } - return nil -} - -func migrateErc20FXToPundiAI(ctx sdk.Context, keeper erc20keeper.Keeper) error { - erc20Token, err := keeper.GetERC20Token(ctx, fxtypes.LegacyFXDenom) - if err != nil { - return err - } - erc20Token.Denom = fxtypes.DefaultDenom - if err = keeper.ERC20Token.Set(ctx, erc20Token.Denom, erc20Token); err != nil { - return err - } - return keeper.ERC20Token.Remove(ctx, fxtypes.LegacyFXDenom) -} - -func migrateMetadataFXToPundiAI(ctx sdk.Context, keeper bankkeeper.Keeper) error { - // add pundiai metadata - metadata := fxtypes.NewDefaultMetadata() - keeper.SetDenomMetaData(ctx, metadata) - - // remove FX metadata - bk, ok := keeper.(bankkeeper.BaseKeeper) - if !ok { - return errors.New("bank keeper not implement bank.BaseKeeper") - } - return bk.BaseViewKeeper.DenomMetadata.Remove(ctx, fxtypes.LegacyFXDenom) -} - -func migrateBankModule(ctx sdk.Context, bankKeeper bankkeeper.Keeper) error { - sendEnabledEntry, found := bankKeeper.GetSendEnabledEntry(ctx, fxtypes.LegacyFXDenom) - if found { - bankKeeper.DeleteSendEnabled(ctx, fxtypes.LegacyFXDenom) - bankKeeper.SetSendEnabled(ctx, fxtypes.DefaultDenom, sendEnabledEntry.Enabled) - } - - var err error - fxSupply := bankKeeper.GetSupply(ctx, fxtypes.LegacyFXDenom) - 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 != fxtypes.LegacyFXDenom { - 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, fxtypes.LegacyFXDenom); err != nil { - return err - } - return bk.Supply.Set(ctx, fxtypes.DefaultDenom, apundiaiSupply) -} - -func GetMigrateEscrowDenoms(chainID string) map[string]string { - result := make(map[string]string, 2) - result[fxtypes.LegacyFXDenom] = fxtypes.DefaultDenom - - pundixDenom := fxtypes.MainnetPundixUnWrapDenom - if chainID == fxtypes.TestnetChainId { - pundixDenom = fxtypes.TestnetPundixUnWrapDenom - } - result[pundixDenom] = fxtypes.PundixWrapDenom - return result -} - -func updateWPUNDIAILogicCode(ctx sdk.Context, keeper *fxevmkeeper.Keeper) { - wpundiai := contract.GetWPUNDIAI() - if err := keeper.UpdateContractCode(ctx, wpundiai.Address, wpundiai.Code); err != nil { - ctx.Logger().Error("update WPUNDIAI contract", "module", "upgrade", "err", err.Error()) - } else { - ctx.Logger().Info("update WPUNDIAI contract", "module", "upgrade", "codeHash", wpundiai.CodeHash()) - } -} - -func updateERC20LogicCode(ctx sdk.Context, keeper *fxevmkeeper.Keeper) { - erc20 := contract.GetERC20() - if err := keeper.UpdateContractCode(ctx, erc20.Address, erc20.Code); err != nil { - ctx.Logger().Error("update ERC20 contract", "module", "upgrade", "err", err.Error()) - } else { - ctx.Logger().Info("update ERC20 contract", "module", "upgrade", "codeHash", erc20.CodeHash()) - } -} diff --git a/app/upgrades/v8/wrap_token.go b/app/upgrades/v8/wrap_token.go index a92ee92a..22c4445a 100644 --- a/app/upgrades/v8/wrap_token.go +++ b/app/upgrades/v8/wrap_token.go @@ -53,7 +53,7 @@ func migrateWFXToWPUNDIAI(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper) { return true }) - ctx.Logger().Info("total update state", "total", totalUpdateState) + ctx.Logger().Info("total update state", "module", "upgrade", "total", totalUpdateState) // set totalSupply totalSupplyByte := evmKeeper.GetState(ctx, wfxAddr, slotToHashByte(totalSupplySlot)) @@ -65,7 +65,7 @@ func migrateWFXToWPUNDIAI(ctx sdk.Context, evmKeeper *fxevmkeeper.Keeper) { symbolBytes := encodeShortStringWithoutPrefix(WrapTokenSymbol) evmKeeper.SetState(ctx, wfxAddr, slotToHashByte(symbolSlot), symbolBytes) - ctx.Logger().Info("migration WFX to WPUNDIAI done") + ctx.Logger().Info("migration WFX to WPUNDIAI done", "module", "upgrade") } func GetWFXAddress(chainID string) common.Address {