@@ -18,25 +18,82 @@ package upgrade
1818
1919import (
2020 "context"
21+ "fmt"
22+ "sort"
2123
2224 "cosmossdk.io/log"
2325 upgradetypes "cosmossdk.io/x/upgrade/types"
26+ ismkeeper "github.com/bcp-innovations/hyperlane-cosmos/x/core/01_interchain_security/keeper"
27+ ismtypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/01_interchain_security/types"
28+ sdk "github.com/cosmos/cosmos-sdk/types"
2429 "github.com/cosmos/cosmos-sdk/types/module"
30+ authoritytypes "github.com/noble-assets/authority/types"
2531)
2632
2733func CreateUpgradeHandler (
2834 mm * module.Manager ,
2935 cfg module.Configurator ,
3036 logger log.Logger ,
37+ ismKeeper ismkeeper.Keeper ,
3138) upgradetypes.UpgradeHandler {
3239 return func (ctx context.Context , _ upgradetypes.Plan , vm module.VersionMap ) (module.VersionMap , error ) {
40+ sdkCtx := sdk .UnwrapSDKContext (ctx )
41+
3342 vm , err := mm .RunMigrations (ctx , cfg , vm )
3443 if err != nil {
3544 return vm , err
3645 }
3746
47+ // Because the HyperEVM default ISM has already been created on Noble's
48+ // testnet, we only need to run the logic for creating the HyperEVM
49+ // default ISM on Noble's mainnet.
50+ if sdkCtx .ChainID () == MainnetChainID {
51+ err = configureHyperlaneISM (ctx , logger , ismKeeper )
52+ if err != nil {
53+ return vm , err
54+ }
55+ }
56+
3857 logger .Info (UpgradeASCII )
3958
4059 return vm , nil
4160 }
4261}
62+
63+ func configureHyperlaneISM (ctx context.Context , logger log.Logger , keeper ismkeeper.Keeper ) error {
64+ // https://docs.hyperlane.xyz/docs/reference/addresses/validators/mainnet-default-ism-validators#hyperevm-999
65+ const domain = uint32 (999 )
66+ validators := []string {
67+ "0x01be14a9eceeca36c9c1d46c056ca8c87f77c26f" , // Abacus Works
68+ "0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f" , // Merkly
69+ "0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36" , // Mitosis
70+ "0x04d949c615c9976f89595ddcb9008c92f8ba7278" , // Luganodes
71+ }
72+ sort .Strings (validators )
73+ const threshold = uint32 (3 )
74+
75+ id , err := keeper .CreateMerkleRootMultisigIsm (ctx , & ismtypes.MsgCreateMerkleRootMultisigIsm {
76+ Creator : authoritytypes .ModuleAddress .String (),
77+ Validators : validators ,
78+ Threshold : threshold ,
79+ })
80+ if err != nil {
81+ return fmt .Errorf ("unable to create default ism for domain %d: %w" , domain , err )
82+ }
83+
84+ logger .Info ("created default hyperlane ism for hyperevm" , "domain" , domain , "id" , id )
85+
86+ err = keeper .SetRoutingIsmDomain (ctx , & ismtypes.MsgSetRoutingIsmDomain {
87+ IsmId : DefaultISM ,
88+ Route : ismtypes.Route {
89+ Ism : id ,
90+ Domain : domain ,
91+ },
92+ Owner : authoritytypes .ModuleAddress .String (),
93+ })
94+ if err != nil {
95+ return fmt .Errorf ("unable to set default ism in routing ism: %w" , err )
96+ }
97+
98+ return nil
99+ }
0 commit comments