feat: oct 30 enrollments (#4785)

### Description

- update validators for op, mode, lisk as part of superlane
- add merkly/mitosis validators for apechain, arbitrumnova, b3, fantom,
gravity, harmony, kaia, morph, orderly, snaxchain, zeronetwork, zksync
- add blockhunters to default set on redstone, cheesechain

### Drive-by changes

- igp updates
- introduce `chainsToSkip` list to reuse in deploy.ts and
check-deploy.ts
- filter out `chainsToSkip` in deploy.ts and check-deploy.ts
- add retry logic when doing safe api operations in app governor 
- update scripts for checking/getting ICAs

### Related issues

na

### Backward compatibility

yes

### Testing

manual

---------

Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com>
pull/4804/head
Paul Balaji 3 weeks ago committed by GitHub
parent 4c0605dca5
commit db91968372
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 5
      .changeset/proud-turkeys-type.md
  2. 30
      typescript/infra/config/environments/mainnet3/gasPrices.json
  3. 33
      typescript/infra/config/environments/mainnet3/owners.ts
  4. 162
      typescript/infra/config/environments/mainnet3/tokenPrices.json
  5. 2
      typescript/infra/scripts/check/check-deploy.ts
  6. 41
      typescript/infra/scripts/check/check-owner-ica.ts
  7. 4
      typescript/infra/scripts/check/check-utils.ts
  8. 15
      typescript/infra/scripts/deploy.ts
  9. 22
      typescript/infra/scripts/get-owner-ica.ts
  10. 19
      typescript/infra/src/config/chain.ts
  11. 47
      typescript/infra/src/govern/HyperlaneAppGovernor.ts
  12. 133
      typescript/sdk/src/consts/multisigIsm.ts
  13. 7
      typescript/sdk/src/middleware/account/InterchainAccount.ts

@ -0,0 +1,5 @@
---
'@hyperlane-xyz/sdk': minor
---
Update default validator sets. Throw in `InterchainAccount.getOrDeployAccount` if the origin router is the zero address.

@ -24,7 +24,7 @@
"decimals": 9
},
"astarzkevm": {
"amount": "0.0696",
"amount": "0.119",
"decimals": 9
},
"avalanche": {
@ -44,7 +44,7 @@
"decimals": 9
},
"blast": {
"amount": "0.004639802",
"amount": "0.004069265",
"decimals": 9
},
"bob": {
@ -92,7 +92,7 @@
"decimals": 9
},
"ethereum": {
"amount": "9.379005838",
"amount": "15.468343175",
"decimals": 9
},
"everclear": {
@ -104,7 +104,7 @@
"decimals": 9
},
"flare": {
"amount": "26.179282546",
"amount": "38.052815213",
"decimals": 9
},
"flow": {
@ -152,7 +152,7 @@
"decimals": 9
},
"linea": {
"amount": "0.312253183",
"amount": "0.381023276",
"decimals": 9
},
"lisk": {
@ -168,7 +168,7 @@
"decimals": 9
},
"mantapacific": {
"amount": "0.001001418",
"amount": "0.001003562",
"decimals": 9
},
"mantle": {
@ -184,7 +184,7 @@
"decimals": 9
},
"metis": {
"amount": "1.077971462",
"amount": "1.280562502",
"decimals": 9
},
"mint": {
@ -192,7 +192,7 @@
"decimals": 9
},
"mode": {
"amount": "0.001000265",
"amount": "0.001000252",
"decimals": 9
},
"molten": {
@ -204,7 +204,7 @@
"decimals": 9
},
"morph": {
"amount": "0.0041472",
"amount": "0.01",
"decimals": 9
},
"neutron": {
@ -216,7 +216,7 @@
"decimals": 9
},
"optimism": {
"amount": "0.001001064",
"amount": "0.001000604",
"decimals": 9
},
"orderly": {
@ -264,7 +264,7 @@
"decimals": 9
},
"scroll": {
"amount": "0.041113999",
"amount": "0.049509194",
"decimals": 9
},
"sei": {
@ -304,15 +304,15 @@
"decimals": 9
},
"worldchain": {
"amount": "0.001000298",
"amount": "0.001000315",
"decimals": 9
},
"xai": {
"amount": "0.10081",
"amount": "0.73774",
"decimals": 9
},
"xlayer": {
"amount": "5.882081",
"amount": "10.44609375",
"decimals": 9
},
"zeronetwork": {
@ -332,7 +332,7 @@
"decimals": 9
},
"zoramainnet": {
"amount": "0.001000255",
"amount": "0.001000267",
"decimals": 9
}
}

@ -128,16 +128,29 @@ export const icas: Partial<
// Oct 16, 2024 batch
// ----------------------------------------------------------
immutablezkevm: '0x8483e1480B62cB9f0aCecEbF42469b9f4013577a',
rari: '0x1124D54E989570A798769E534eAFbE1444f40AF6',
rootstock: '0x69350aeA98c5195F2c3cC6E6A065d0d8B12F659A',
alephzeroevm: '0x004a4C2e4Cd4F5Bd564fe0A6Ab2Da56258aE576f',
chiliz: '0xb52D281aD2BA9761c16f400d755837493e2baDB7',
lumia: '0x418E10Ac9e0b84022d0636228d05bc74172e0e41',
superposition: '0x34b57ff8fBA8da0cFdA795CC0F874FfaB14B1DE9',
flow: '0xf48377f8A3ddA7AAD7C2460C81d939434c829b45',
metall2: '0x2f1b1B0Fb7652E621316460f6c3b019F61d8dC9a',
polynomial: '0xC20eFa1e5A378af9233e9b24515eb3408d43f900',
// immutablezkevm: '0x8483e1480B62cB9f0aCecEbF42469b9f4013577a',
// rari: '0x1124D54E989570A798769E534eAFbE1444f40AF6',
// rootstock: '0x69350aeA98c5195F2c3cC6E6A065d0d8B12F659A',
// alephzeroevm: '0x004a4C2e4Cd4F5Bd564fe0A6Ab2Da56258aE576f',
// chiliz: '0xb52D281aD2BA9761c16f400d755837493e2baDB7',
// lumia: '0x418E10Ac9e0b84022d0636228d05bc74172e0e41',
// superposition: '0x34b57ff8fBA8da0cFdA795CC0F874FfaB14B1DE9',
// flow: '0xf48377f8A3ddA7AAD7C2460C81d939434c829b45',
// metall2: '0x2f1b1B0Fb7652E621316460f6c3b019F61d8dC9a',
// polynomial: '0xC20eFa1e5A378af9233e9b24515eb3408d43f900',
// // Oct 30, 2024 batch
// // ----------------------------------------------------------
// apechain: '0xe68b0aB6BB8c11D855556A5d3539524f6DB3bdc6',
// arbitrumnova: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// b3: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// fantom: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// gravity: '0x3104ADE26e21AEbdB325321433541DfE8B5dCF23',
// harmony: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// kaia: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// morph: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// orderly: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
// snaxchain: '0x8965d9f19336EB4e910d5f1B9070205FdBee6837',
} as const;
export const DEPLOYER = '0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba';

@ -1,86 +1,86 @@
{
"ancient8": "2509.23",
"alephzeroevm": "0.374106",
"apechain": "1.17",
"arbitrum": "2509.23",
"arbitrumnova": "2509.23",
"astar": "0.056948",
"astarzkevm": "2509.23",
"avalanche": "25.94",
"b3": "2509.23",
"base": "2509.23",
"bitlayer": "67372",
"blast": "2509.23",
"bob": "2509.23",
"bsc": "587.93",
"celo": "0.687006",
"cheesechain": "0.00295261",
"chiliz": "0.065082",
"coredao": "0.9041",
"cyber": "2509.23",
"degenchain": "0.00694026",
"dogechain": "0.135405",
"eclipsemainnet": "2509.23",
"ancient8": "2677.32",
"alephzeroevm": "0.350392",
"apechain": "1.093",
"arbitrum": "2677.32",
"arbitrumnova": "2677.32",
"astar": "0.055958",
"astarzkevm": "2677.32",
"avalanche": "26.24",
"b3": "2677.32",
"base": "2677.32",
"bitlayer": "71946",
"blast": "2677.32",
"bob": "2677.32",
"bsc": "598.99",
"celo": "0.668758",
"cheesechain": "0.00278844",
"chiliz": "0.062655",
"coredao": "0.947154",
"cyber": "2677.32",
"degenchain": "0.00966441",
"dogechain": "0.167516",
"eclipsemainnet": "2677.32",
"endurance": "2.14",
"ethereum": "2509.23",
"everclear": "2509.23",
"fantom": "0.668043",
"flare": "0.01413977",
"flow": "0.537723",
"fraxtal": "2506.4",
"fusemainnet": "0.02708378",
"gnosis": "1",
"gravity": "0.03113181",
"harmony": "0.012995",
"immutablezkevm": "1.42",
"inevm": "19.75",
"injective": "19.75",
"kaia": "1",
"kroma": "2509.23",
"linea": "2509.23",
"lisk": "2509.23",
"lukso": "1.38",
"lumia": "1.14",
"mantapacific": "2509.23",
"mantle": "0.591459",
"merlin": "67402",
"metall2": "2509.23",
"metis": "41.48",
"mint": "2509.23",
"mode": "2509.23",
"molten": "0.202455",
"moonbeam": "0.163232",
"morph": "2509.23",
"neutron": "0.383777",
"oortmainnet": "0.109681",
"optimism": "2509.23",
"orderly": "2509.23",
"osmosis": "0.483881",
"polygon": "0.340093",
"polygonzkevm": "2509.23",
"polynomial": "2509.23",
"proofofplay": "2509.23",
"rari": "2509.23",
"ethereum": "2677.32",
"everclear": "2677.32",
"fantom": "0.695503",
"flare": "0.01380308",
"flow": "0.544805",
"fraxtal": "2669.11",
"fusemainnet": "0.03270532",
"gnosis": "1.003",
"gravity": "0.03103875",
"harmony": "0.01258935",
"immutablezkevm": "1.38",
"inevm": "19.88",
"injective": "19.88",
"kaia": "0.126337",
"kroma": "2677.32",
"linea": "2677.32",
"lisk": "2677.32",
"lukso": "1.52",
"lumia": "1.15",
"mantapacific": "2677.32",
"mantle": "0.605805",
"merlin": "71862",
"metall2": "2677.32",
"metis": "44.87",
"mint": "2677.32",
"mode": "2677.32",
"molten": "0.233454",
"moonbeam": "0.164444",
"morph": "2677.32",
"neutron": "0.385061",
"oortmainnet": "0.100716",
"optimism": "2677.32",
"orderly": "2677.32",
"osmosis": "0.440341",
"polygon": "0.332667",
"polygonzkevm": "2677.32",
"polynomial": "2677.32",
"proofofplay": "2677.32",
"rari": "2677.32",
"real": "1",
"redstone": "2509.23",
"rootstock": "67025",
"sanko": "47.83",
"scroll": "2509.23",
"sei": "0.393025",
"shibarium": "0.383601",
"snaxchain": "2509.23",
"solanamainnet": "168.99",
"stride": "0.731952",
"superposition": "2509.23",
"taiko": "2509.23",
"redstone": "2677.32",
"rootstock": "71827",
"sanko": "53.17",
"scroll": "2677.32",
"sei": "0.403445",
"shibarium": "0.398347",
"snaxchain": "2677.32",
"solanamainnet": "175.5",
"stride": "0.632392",
"superposition": "2677.32",
"taiko": "2677.32",
"tangle": "1",
"viction": "0.348004",
"worldchain": "2509.23",
"xai": "0.20891",
"xlayer": "39.32",
"zeronetwork": "2509.23",
"zetachain": "0.661744",
"zircuit": "2509.23",
"zksync": "2509.23",
"zoramainnet": "2509.23"
"viction": "0.357416",
"worldchain": "2677.32",
"xai": "0.214284",
"xlayer": "39.48",
"zeronetwork": "2677.32",
"zetachain": "0.694506",
"zircuit": "2677.32",
"zksync": "2677.32",
"zoramainnet": "2677.32"
}

@ -53,6 +53,8 @@ async function main() {
console.info(`${module} checker found no violations`);
}
}
process.exit(0);
}
main()

@ -1,12 +1,20 @@
import { ethers } from 'ethers';
import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk';
import { Address, eqAddress } from '@hyperlane-xyz/utils';
import {
Address,
eqAddress,
isZeroish,
isZeroishAddress,
} from '@hyperlane-xyz/utils';
import { icas } from '../../config/environments/mainnet3/owners.js';
import { getArgs as getEnvArgs } from '../agent-utils.js';
import { isEthereumProtocolChain } from '../../src/utils/utils.js';
import { getArgs as getEnvArgs, withChains } from '../agent-utils.js';
import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js';
function getArgs() {
return getEnvArgs().option('ownerChain', {
return withChains(getEnvArgs()).option('ownerChain', {
type: 'string',
description: 'Origin chain where the Safe owner lives',
default: 'ethereum',
@ -14,7 +22,7 @@ function getArgs() {
}
async function main() {
const { environment, ownerChain } = await getArgs();
const { environment, ownerChain, chains } = await getArgs();
const config = getEnvironmentConfig(environment);
const multiProvider = await config.getMultiProvider();
@ -29,17 +37,37 @@ async function main() {
const { chainAddresses } = await getHyperlaneCore(environment, multiProvider);
const ica = InterchainAccount.fromAddressesMap(chainAddresses, multiProvider);
const checkOwnerIcaChains = (
chains?.length ? chains : Object.keys(icas)
).filter(isEthereumProtocolChain);
const ownerConfig: AccountConfig = {
origin: ownerChain,
owner: owner,
};
const ownerChainInterchainAccountRouter =
ica.contractsMap[ownerChain].interchainAccountRouter.address;
if (isZeroishAddress(ownerChainInterchainAccountRouter)) {
console.error(`Interchain account router address is zero`);
process.exit(1);
}
const mismatchedResults: Record<
string,
{ Expected: Address; Actual: Address }
> = {};
for (const [chain, expectedAddress] of Object.entries(icas)) {
const actualAccount = await ica.getAccount(chain, ownerConfig);
for (const chain of checkOwnerIcaChains) {
const expectedAddress = icas[chain as keyof typeof icas];
if (!expectedAddress) {
console.error(`No expected address found for ${chain}`);
continue;
}
const actualAccount = await ica.getAccount(
chain,
ownerConfig,
ownerChainInterchainAccountRouter,
);
if (!eqAddress(expectedAddress, actualAccount)) {
mismatchedResults[chain] = {
Expected: expectedAddress,
@ -55,6 +83,7 @@ async function main() {
} else {
console.log('✅ All ICAs match the expected addresses.');
}
process.exit(0);
}
main().catch((err) => {

@ -24,6 +24,7 @@ import { Contexts } from '../../config/contexts.js';
import { DEPLOYER } from '../../config/environments/mainnet3/owners.js';
import { getWarpAddresses } from '../../config/registry.js';
import { getWarpConfig } from '../../config/warp.js';
import { chainsToSkip } from '../../src/config/chain.js';
import { DeployEnvironment } from '../../src/config/environment.js';
import { HyperlaneAppGovernor } from '../../src/govern/HyperlaneAppGovernor.js';
import { HyperlaneCoreGovernor } from '../../src/govern/HyperlaneCoreGovernor.js';
@ -116,6 +117,7 @@ export async function getGovernor(
);
if (module === Modules.CORE) {
chainsToSkip.forEach((chain) => delete envConfig.core[chain]);
const checker = new HyperlaneCoreChecker(
multiProvider,
core,
@ -139,6 +141,7 @@ export async function getGovernor(
);
governor = new ProxiedRouterGovernor(checker);
} else if (module === Modules.HAAS) {
chainsToSkip.forEach((chain) => delete routerConfig[chain]);
const icaChecker = new InterchainAccountChecker(
multiProvider,
ica,
@ -147,6 +150,7 @@ export async function getGovernor(
(chain, _): _ is InterchainAccountConfig => !!icaChainAddresses[chain],
),
);
chainsToSkip.forEach((chain) => delete envConfig.core[chain]);
const coreChecker = new HyperlaneCoreChecker(
multiProvider,
core,

@ -27,6 +27,7 @@ import { Contexts } from '../config/contexts.js';
import { core as coreConfig } from '../config/environments/mainnet3/core.js';
import { getEnvAddresses } from '../config/registry.js';
import { getWarpConfig } from '../config/warp.js';
import { chainsToSkip } from '../src/config/chain.js';
import { DeployCache, deployWithArtifacts } from '../src/deployment/deploy.js';
import { TestQuerySenderDeployer } from '../src/deployment/testcontracts/testquerysender.js';
import {
@ -71,10 +72,6 @@ async function main() {
).argv;
const envConfig = getEnvironmentConfig(environment);
// TODO: remove once zksync PR is merged into main
delete envConfig.core.zksync;
delete envConfig.core.zeronetwork;
let multiProvider = await envConfig.getMultiProvider(
context,
Role.Deployer,
@ -287,13 +284,21 @@ async function main() {
}
}
const targetNetworks =
chains && chains.length > 0 ? chains : !fork ? [] : [fork];
const filteredTargetNetworks = targetNetworks.filter(
(chain) => !chainsToSkip.includes(chain),
);
chainsToSkip.forEach((chain) => delete config[chain]);
await deployWithArtifacts({
configMap: config as ChainMap<unknown>, // TODO: fix this typing
deployer,
cache,
// Use chains if provided, otherwise deploy to all chains
// If fork is provided, deploy to fork only
targetNetworks: chains && chains.length > 0 ? chains : !fork ? [] : [fork],
targetNetworks: filteredTargetNetworks,
module,
multiProvider,
concurrentDeploy,

@ -1,5 +1,5 @@
import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk';
import { Address, eqAddress } from '@hyperlane-xyz/utils';
import { Address, eqAddress, isZeroishAddress } from '@hyperlane-xyz/utils';
import { isEthereumProtocolChain } from '../src/utils/utils.js';
@ -52,6 +52,13 @@ async function main() {
origin: ownerChain,
owner: originOwner,
};
const ownerChainInterchainAccountRouter =
ica.contractsMap[ownerChain].interchainAccountRouter.address;
if (isZeroishAddress(ownerChainInterchainAccountRouter)) {
console.error(`Interchain account router address is zero`);
process.exit(1);
}
const getOwnerIcaChains = (
chains?.length ? chains : config.supportedChainNames
@ -61,11 +68,19 @@ async function main() {
const settledResults = await Promise.allSettled(
getOwnerIcaChains.map(async (chain) => {
try {
const account = await ica.getAccount(chain, ownerConfig);
const account = await ica.getAccount(
chain,
ownerConfig,
ownerChainInterchainAccountRouter,
);
const result: { ICA: Address; Deployed?: string } = { ICA: account };
if (deploy) {
const deployedAccount = await ica.deployAccount(chain, ownerConfig);
const deployedAccount = await ica.deployAccount(
chain,
ownerConfig,
ownerChainInterchainAccountRouter,
);
result.Deployed = eqAddress(account, deployedAccount) ? '✅' : '❌';
if (result.Deployed === '❌') {
console.warn(
@ -96,6 +111,7 @@ async function main() {
});
console.table(results);
process.exit(0);
}
main()

@ -16,6 +16,25 @@ import { inCIMode } from '../utils/utils.js';
import { DeployEnvironment } from './environment.js';
// Temporarily skip some chains
export const chainsToSkip: ChainName[] = [
// TODO: remove once zksync PR is merged into main
'zksync',
'zeronetwork',
// Oct 16 batch
'immutablezkevm',
'rari',
'rootstock',
'alephzeroevm',
'chiliz',
'lumia',
'superposition',
'flow',
'metall2',
'polynomial',
];
export const defaultRetry: ProviderRetryOptions = {
maxRetries: 6,
baseRetryDelayMs: 50,

@ -557,6 +557,7 @@ export abstract class HyperlaneAppGovernor<
chain: ChainName,
signerAddress: Address,
safeAddress: string,
retries = 3,
): Promise<boolean> {
if (!this.canPropose[chain].has(safeAddress)) {
try {
@ -568,25 +569,47 @@ export abstract class HyperlaneAppGovernor<
);
this.canPropose[chain].set(safeAddress, canPropose);
} catch (error) {
const errorMessage = (error as Error).message.toLowerCase();
// Handle invalid MultiSend contract errors
if (
error instanceof Error &&
(error.message.includes('Invalid MultiSend contract address') ||
error.message.includes(
'Invalid MultiSendCallOnly contract address',
))
errorMessage.includes('invalid multisend contract address') ||
errorMessage.includes('invalid multisendcallonly contract address')
) {
console.warn(
chalk.yellow(`${error.message}: Setting submission type to MANUAL`),
);
console.warn(chalk.yellow(`Invalid contract: ${errorMessage}.`));
return false;
} else {
console.error(
chalk.red(
`Failed to determine if signer can propose safe transactions on ${chain}. Setting submission type to MANUAL. Error: ${error}`,
}
// Handle service unavailable and rate limit errors
if (
errorMessage.includes('service unavailable') ||
errorMessage.includes('too many requests')
) {
console.warn(
chalk.yellow(
`Safe service error for ${safeAddress} on ${chain}: ${errorMessage}. ${retries} retries left.`,
),
);
if (retries > 0) {
await new Promise((resolve) => setTimeout(resolve, 1000));
return this.checkSafeProposalEligibility(
chain,
signerAddress,
safeAddress,
retries - 1,
);
}
return false;
}
// Handle all other errors
console.error(
chalk.red(
`Failed to determine if signer can propose safe transactions on ${chain}. Error: ${error}`,
),
);
return false;
}
}
return this.canPropose[chain].get(safeAddress) || false;

@ -31,8 +31,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
apechain: {
threshold: 1,
validators: ['0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221'],
threshold: 2,
validators: [
'0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
arbitrum: {
@ -47,8 +51,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
arbitrumnova: {
threshold: 1,
validators: ['0xd2a5e9123308d187383c87053811a2c21bd8af1f'],
threshold: 2,
validators: [
'0xd2a5e9123308d187383c87053811a2c21bd8af1f',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
arbitrumsepolia: {
@ -89,8 +97,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
b3: {
threshold: 1,
validators: ['0xd77b516730a836fc41934e7d5864e72c165b934e'],
threshold: 2,
validators: [
'0xd77b516730a836fc41934e7d5864e72c165b934e',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
base: {
@ -181,6 +193,7 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
validators: [
'0x478fb53c6860ae8fc35235ba0d38d49b13128226',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters
],
},
@ -300,8 +313,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
fantom: {
threshold: 1,
validators: ['0xa779572028e634e16f26af5dfd4fa685f619457d'],
threshold: 2,
validators: [
'0xa779572028e634e16f26af5dfd4fa685f619457d',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
flare: {
@ -365,13 +382,21 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
gravity: {
threshold: 1,
validators: ['0x23d549bf757a02a6f6068e9363196ecd958c974e'],
threshold: 2,
validators: [
'0x23d549bf757a02a6f6068e9363196ecd958c974e',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
harmony: {
threshold: 1,
validators: ['0xd677803a67651974b1c264171b5d7ca8838db8d5'],
threshold: 2,
validators: [
'0xd677803a67651974b1c264171b5d7ca8838db8d5',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
holesky: {
@ -412,8 +437,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
kaia: {
threshold: 1,
validators: ['0x9de0b3abb221d19719882fa4d61f769fdc2be9a4'],
threshold: 2,
validators: [
'0x9de0b3abb221d19719882fa4d61f769fdc2be9a4',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
kroma: {
@ -435,11 +464,14 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
lisk: {
threshold: 2,
threshold: 4,
validators: [
'0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
'0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane)
'0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e', // enigma (superlane)
'0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf', // imperator (superlane)
'0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane)
'0xf0da628f3fb71652d48260bad4691054045832ce', // luganodes (superlane)
],
},
@ -520,12 +552,14 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
mode: {
threshold: 3,
threshold: 4,
validators: [
'0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7',
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
'0x7e29608c6e5792bbf9128599ca309be0728af7b4', // renzo
'0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters
'0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane)
'0x65C140e3a05F33192384AffEF985696Fe3cDDE42', // enigma (superlane)
'0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b', // imperator (superlane)
'0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane)
'0x485a4f0009d9afbbf44521016f9b8cdd718e36ea', // luganodes (superlane)
],
},
@ -549,8 +583,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
morph: {
threshold: 1,
validators: ['0x4884535f393151ec419add872100d352f71af380'],
threshold: 2,
validators: [
'0x4884535f393151ec419add872100d352f71af380',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
neutron: {
@ -581,13 +619,14 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
optimism: {
threshold: 3,
threshold: 4,
validators: [
'0x20349eadc6c72e94ce38268b96692b1a5c20de4f',
'0x5b7d47b76c69740462432f6a5a0ca5005e014157', // dsrv
'0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake
'0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked
'0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime
'0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane)
'0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB', // enigma (superlane)
'0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99', // imperator (superlane)
'0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane)
'0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12', // luganodes (superlane)
],
},
@ -597,8 +636,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
orderly: {
threshold: 1,
validators: ['0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6'],
threshold: 2,
validators: [
'0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
osmosis: {
@ -672,11 +715,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
redstone: {
threshold: 2,
threshold: 3,
validators: [
'0x1400b9737007f7978d8b4bbafb4a69c83f0641a7',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
'0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters
],
},
@ -746,8 +790,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
snaxchain: {
threshold: 1,
validators: ['0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e'],
threshold: 2,
validators: [
'0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
solanadevnet: {
@ -797,7 +845,7 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
'0x87460dcEd16a75AECdBffD4189111d30B099f5b0', // enigma
'0xf54982134e52Eb7253236943FBffE0886C5bde0C', // L5
'0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d', // stakecito
'0x3a446ed2923c08445af06e53f0acb558c0e0413c', // staked
'0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked
],
},
@ -881,8 +929,12 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
zeronetwork: {
threshold: 1,
validators: ['0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87'],
threshold: 2,
validators: [
'0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
],
},
zetachain: {
@ -906,8 +958,13 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
},
zksync: {
threshold: 1,
validators: ['0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a'],
threshold: 3,
validators: [
'0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a',
'0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly
'0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis
'0x75237d42ce8ea27349a0254ada265db94157e0c1', // imperator
],
},
zoramainnet: {

@ -5,6 +5,7 @@ import {
Address,
addressToBytes32,
bytes32ToAddress,
isZeroishAddress,
} from '@hyperlane-xyz/utils';
import { appFromAddressesMapHelper } from '../../contracts/contracts.js';
@ -102,6 +103,12 @@ export class InterchainAccount extends RouterApp<InterchainAccountFactories> {
const originRouterAddress =
routerOverride ??
bytes32ToAddress(await destinationRouter.routers(originDomain));
if (isZeroishAddress(originRouterAddress)) {
throw new Error(
`Origin router address is zero for ${config.origin} on ${destinationChain}`,
);
}
const destinationIsmAddress =
ismOverride ??
bytes32ToAddress(await destinationRouter.isms(originDomain));

Loading…
Cancel
Save