diff --git a/app/upgrades.go b/app/upgrades.go index 5217635..d65bfaf 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -72,6 +72,7 @@ func (app *App) setupUpgradeHandlers() { app.ICAHostKeeper, app.StakingKeeper, app.TransferKeeper, + app.EvmKeeper, ), ) diff --git a/app/upgrades/v11/keepers.go b/app/upgrades/v11/keepers.go index 482b59a..1c899c2 100644 --- a/app/upgrades/v11/keepers.go +++ b/app/upgrades/v11/keepers.go @@ -5,7 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + evmtypes "github.com/cosmos/evm/x/vm/types" icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types" + "github.com/ethereum/go-ethereum/common" ) // ICAHostKeeper is the narrow interface required by the v11 upgrade @@ -26,3 +28,10 @@ type StakingKeeper interface { type TransferKeeper interface { UnescrowCoin(ctx sdk.Context, escrowAddress, receiver sdk.AccAddress, coin sdk.Coin) error } + +// EvmKeeper is the narrow interface required by the v11 upgrade +// handler. It matches a subset of evmkeeper.Keeper. +type EvmKeeper interface { + IsContract(ctx sdk.Context, addr common.Address) bool + AddPreinstalls(ctx sdk.Context, preinstalls []evmtypes.Preinstall) error +} diff --git a/app/upgrades/v11/upgrades.go b/app/upgrades/v11/upgrades.go index ab30147..ae21774 100644 --- a/app/upgrades/v11/upgrades.go +++ b/app/upgrades/v11/upgrades.go @@ -9,8 +9,10 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + evmtypes "github.com/cosmos/evm/x/vm/types" icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" + "github.com/ethereum/go-ethereum/common" ) func CreateUpgradeHandler( @@ -19,6 +21,7 @@ func CreateUpgradeHandler( icaHostKeeper ICAHostKeeper, stakingKeeper StakingKeeper, transferKeeper TransferKeeper, + evmKeeper EvmKeeper, ) upgradetypes.UpgradeHandler { return func(c context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { ctx := sdk.UnwrapSDKContext(c) @@ -50,11 +53,32 @@ func CreateUpgradeHandler( return nil, err } + logger.Info("Installing missing default preinstalls...") + if err := installMissingPreinstalls(ctx, logger, evmKeeper); err != nil { + return nil, err + } + logger.Info("Finished v11 upgrade handler") return vm, nil } } +// installMissingPreinstalls deploys any default preinstall that is absent. +func installMissingPreinstalls(ctx sdk.Context, logger log.Logger, evmKeeper EvmKeeper) error { + var missingPreinstalls []evmtypes.Preinstall + for _, aDefaultPreinstall := range evmtypes.DefaultPreinstalls { + if evmKeeper.IsContract(ctx, common.HexToAddress(aDefaultPreinstall.Address)) { + continue + } + logger.Info("installing missing preinstall", "name", aDefaultPreinstall.Name, "address", aDefaultPreinstall.Address) + missingPreinstalls = append(missingPreinstalls, aDefaultPreinstall) + } + if len(missingPreinstalls) == 0 { + return nil + } + return evmKeeper.AddPreinstalls(ctx, missingPreinstalls) +} + // withdrawElysEscrow releases the configured amount of XRP from the Elys channel // escrow to the recovery address configured for the running network. func withdrawElysEscrow(ctx sdk.Context, logger log.Logger, transferKeeper TransferKeeper) error {