@hyperlane-xyz/cli 1.5.3 → 1.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/logger.d.ts.map +1 -0
- package/dist/{src/logger.js → logger.js} +19 -1
- package/dist/logger.js.map +1 -0
- package/dist/src/commands/chains.js +1 -1
- package/dist/src/commands/chains.js.map +1 -1
- package/dist/src/commands/config.js +1 -1
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/deploy.d.ts.map +1 -1
- package/dist/src/commands/deploy.js +36 -4
- package/dist/src/commands/deploy.js.map +1 -1
- package/dist/src/commands/options.d.ts +1 -0
- package/dist/src/commands/options.d.ts.map +1 -1
- package/dist/src/commands/options.js +8 -2
- package/dist/src/commands/options.js.map +1 -1
- package/dist/src/commands/send.d.ts.map +1 -1
- package/dist/src/commands/send.js +19 -1
- package/dist/src/commands/send.js.map +1 -1
- package/dist/src/commands/status.d.ts +3 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +34 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/config/chain.js +1 -1
- package/dist/src/config/chain.js.map +1 -1
- package/dist/src/config/multisig.d.ts.map +1 -1
- package/dist/src/config/multisig.js +4 -1
- package/dist/src/config/multisig.js.map +1 -1
- package/dist/src/config/warp.js +1 -1
- package/dist/src/config/warp.js.map +1 -1
- package/dist/src/consts.d.ts.map +1 -1
- package/dist/src/consts.js +1 -0
- package/dist/src/consts.js.map +1 -1
- package/dist/src/context.d.ts +5 -1
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +6 -1
- package/dist/src/context.js.map +1 -1
- package/dist/src/deploy/TestRecipientDeployer.d.ts.map +1 -1
- package/dist/src/deploy/TestRecipientDeployer.js +2 -1
- package/dist/src/deploy/TestRecipientDeployer.js.map +1 -1
- package/dist/src/deploy/core.d.ts +6 -1
- package/dist/src/deploy/core.d.ts.map +1 -1
- package/dist/src/deploy/core.js +98 -91
- package/dist/src/deploy/core.js.map +1 -1
- package/dist/src/deploy/utils.d.ts +2 -2
- package/dist/src/deploy/utils.d.ts.map +1 -1
- package/dist/src/deploy/utils.js +7 -7
- package/dist/src/deploy/utils.js.map +1 -1
- package/dist/src/deploy/warp.d.ts +4 -3
- package/dist/src/deploy/warp.d.ts.map +1 -1
- package/dist/src/deploy/warp.js +22 -15
- package/dist/src/deploy/warp.js.map +1 -1
- package/dist/src/send/message.d.ts +2 -1
- package/dist/src/send/message.d.ts.map +1 -1
- package/dist/src/send/message.js +24 -13
- package/dist/src/send/message.js.map +1 -1
- package/dist/src/send/transfer.d.ts +4 -1
- package/dist/src/send/transfer.d.ts.map +1 -1
- package/dist/src/send/transfer.js +35 -25
- package/dist/src/send/transfer.js.map +1 -1
- package/dist/src/status/message.d.ts +8 -0
- package/dist/src/status/message.d.ts.map +1 -0
- package/dist/src/status/message.js +22 -0
- package/dist/src/status/message.js.map +1 -0
- package/dist/src/utils/chains.d.ts +2 -3
- package/dist/src/utils/chains.d.ts.map +1 -1
- package/dist/src/utils/chains.js +8 -9
- package/dist/src/utils/chains.js.map +1 -1
- package/dist/src/utils/files.d.ts +1 -0
- package/dist/src/utils/files.d.ts.map +1 -1
- package/dist/src/utils/files.js +26 -1
- package/dist/src/utils/files.js.map +1 -1
- package/dist/src/utils/keys.d.ts.map +1 -1
- package/dist/src/utils/keys.js +3 -2
- package/dist/src/utils/keys.js.map +1 -1
- package/dist/src/utils/time.js +1 -1
- package/dist/src/utils/time.js.map +1 -1
- package/examples/anvil-chains.yaml +10 -9
- package/examples/contract-artifacts.yaml +1 -1
- package/examples/multisig-ism.yaml +2 -2
- package/examples/warp-tokens.yaml +3 -1
- package/package.json +3 -3
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js.map +0 -1
- /package/dist/{src/logger.d.ts → logger.d.ts} +0 -0
|
@@ -5,6 +5,7 @@ import { eqAddress } from '@hyperlane-xyz/utils';
|
|
|
5
5
|
export const testRecipientFactories = {
|
|
6
6
|
testRecipient: new TestRecipient__factory(),
|
|
7
7
|
};
|
|
8
|
+
// TODO move this and related configs to the SDK
|
|
8
9
|
export class TestRecipientDeployer extends HyperlaneDeployer {
|
|
9
10
|
constructor(multiProvider) {
|
|
10
11
|
super(multiProvider, testRecipientFactories, {
|
|
@@ -18,7 +19,7 @@ export class TestRecipientDeployer extends HyperlaneDeployer {
|
|
|
18
19
|
const ism = await testRecipient.interchainSecurityModule();
|
|
19
20
|
this.logger(`Found ISM for on ${chain}: ${ism}`);
|
|
20
21
|
if (!eqAddress(ism, config.interchainSecurityModule)) {
|
|
21
|
-
this.logger(`Current ISM does not match config. Updating
|
|
22
|
+
this.logger(`Current ISM does not match config. Updating to ${config.interchainSecurityModule}`);
|
|
22
23
|
const tx = testRecipient.setInterchainSecurityModule(config.interchainSecurityModule);
|
|
23
24
|
await this.multiProvider.handleTx(chain, tx);
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestRecipientDeployer.js","sourceRoot":"","sources":["../../../src/deploy/TestRecipientDeployer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAiB,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAEL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAW,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAc1D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,aAAa,EAAE,IAAI,sBAAsB,EAAE;CAC5C,CAAC;AAEF,MAAM,OAAO,qBAAsB,SAAQ,iBAG1C;IACC,YAAY,aAA4B;QACtC,KAAK,CAAC,aAAa,EAAE,sBAAsB,EAAE;YAC3C,MAAM,EAAE,KAAK,CAAC,iCAAiC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,KAAgB,EAChB,MAA2B;QAE3B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,wBAAwB,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,oBAAoB,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,wBAAwB,CAAC,EAAE;gBACpD,IAAI,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"TestRecipientDeployer.js","sourceRoot":"","sources":["../../../src/deploy/TestRecipientDeployer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAiB,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAEL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAW,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAc1D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,aAAa,EAAE,IAAI,sBAAsB,EAAE;CAC5C,CAAC;AAEF,gDAAgD;AAChD,MAAM,OAAO,qBAAsB,SAAQ,iBAG1C;IACC,YAAY,aAA4B;QACtC,KAAK,CAAC,aAAa,EAAE,sBAAsB,EAAE;YAC3C,MAAM,EAAE,KAAK,CAAC,iCAAiC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,KAAgB,EAChB,MAA2B;QAE3B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,wBAAwB,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,oBAAoB,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,wBAAwB,CAAC,EAAE;gBACpD,IAAI,CAAC,MAAM,CACT,kDAAkD,MAAM,CAAC,wBAAwB,EAAE,CACpF,CAAC;gBACF,MAAM,EAAE,GAAG,aAAa,CAAC,2BAA2B,CAClD,MAAM,CAAC,wBAAwB,CAChC,CAAC;gBACF,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;aAC9C;SACF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,kCAAkC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;SAClD;QACD,OAAO;YACL,aAAa;SACd,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
export declare function runCoreDeploy({ key, chainConfigPath, outPath, }: {
|
|
1
|
+
export declare function runCoreDeploy({ key, chainConfigPath, ismConfigPath, artifactsPath, outPath, origin, remotes, skipConfirmation, }: {
|
|
2
2
|
key: string;
|
|
3
3
|
chainConfigPath: string;
|
|
4
|
+
ismConfigPath: string;
|
|
5
|
+
artifactsPath?: string;
|
|
4
6
|
outPath: string;
|
|
7
|
+
origin?: string;
|
|
8
|
+
remotes?: string[];
|
|
9
|
+
skipConfirmation: boolean;
|
|
5
10
|
}): Promise<void>;
|
|
6
11
|
//# sourceMappingURL=core.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/deploy/core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/deploy/core.ts"],"names":[],"mappings":"AAoDA,wBAAsB,aAAa,CAAC,EAClC,GAAG,EACH,eAAe,EACf,aAAa,EACb,aAAa,EACb,OAAO,EACP,MAAM,EACN,OAAO,EACP,gBAAgB,GACjB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,iBAgCA"}
|
package/dist/src/deploy/core.js
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
|
-
import { confirm
|
|
1
|
+
import { confirm } from '@inquirer/prompts';
|
|
2
2
|
import { ethers } from 'ethers';
|
|
3
3
|
import { GasOracleContractType, HyperlaneCoreDeployer, HyperlaneIgpDeployer, HyperlaneIsmFactory, HyperlaneIsmFactoryDeployer, ModuleType, agentStartBlocks, buildAgentConfig, defaultMultisigIsmConfigs, multisigIsmVerificationCost, serializeContractsMap, } from '@hyperlane-xyz/sdk';
|
|
4
4
|
import { objFilter, objMerge } from '@hyperlane-xyz/utils';
|
|
5
|
+
import { log, logBlue, logGray, logGreen, logRed } from '../../logger.js';
|
|
5
6
|
import { readDeploymentArtifacts } from '../config/artifacts.js';
|
|
6
7
|
import { readMultisigConfig } from '../config/multisig.js';
|
|
7
8
|
import { MINIMUM_CORE_DEPLOY_BALANCE } from '../consts.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { prepNewArtifactsFiles, writeJson } from '../utils/files.js';
|
|
9
|
+
import { getContextWithSigner, getMergedContractAddresses, sdkContractAddressesMap, } from '../context.js';
|
|
10
|
+
import { runOriginAndRemotesSelectionStep } from '../utils/chains.js';
|
|
11
|
+
import { prepNewArtifactsFiles, runFileSelectionStep, writeJson, } from '../utils/files.js';
|
|
12
12
|
import { TestRecipientDeployer, } from './TestRecipientDeployer.js';
|
|
13
13
|
import { runPreflightChecks } from './utils.js';
|
|
14
|
-
export async function runCoreDeploy({ key, chainConfigPath, outPath, }) {
|
|
15
|
-
const { customChains, multiProvider, signer } =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
export async function runCoreDeploy({ key, chainConfigPath, ismConfigPath, artifactsPath, outPath, origin, remotes, skipConfirmation, }) {
|
|
15
|
+
const { customChains, multiProvider, signer } = getContextWithSigner(key, chainConfigPath);
|
|
16
|
+
if (!origin || !remotes?.length) {
|
|
17
|
+
({ origin, remotes } = await runOriginAndRemotesSelectionStep(customChains));
|
|
18
|
+
}
|
|
19
|
+
const selectedChains = [origin, ...remotes];
|
|
20
|
+
const artifacts = await runArtifactStep(selectedChains, artifactsPath);
|
|
21
|
+
const multisigConfig = await runIsmStep(selectedChains, ismConfigPath);
|
|
19
22
|
const deploymentParams = {
|
|
20
|
-
|
|
23
|
+
origin,
|
|
21
24
|
remotes,
|
|
22
25
|
signer,
|
|
23
26
|
multiProvider,
|
|
24
27
|
artifacts,
|
|
25
28
|
multisigConfig,
|
|
26
29
|
outPath,
|
|
30
|
+
skipConfirmation,
|
|
27
31
|
};
|
|
28
32
|
await runDeployPlanStep(deploymentParams);
|
|
29
33
|
await runPreflightChecks({
|
|
@@ -32,124 +36,124 @@ export async function runCoreDeploy({ key, chainConfigPath, outPath, }) {
|
|
|
32
36
|
});
|
|
33
37
|
await executeDeploy(deploymentParams);
|
|
34
38
|
}
|
|
35
|
-
async function runArtifactStep(selectedChains) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
39
|
+
async function runArtifactStep(selectedChains, artifactsPath) {
|
|
40
|
+
if (!artifactsPath) {
|
|
41
|
+
logBlue('\n', 'Deployments can be totally new or can use some existing contract addresses.');
|
|
42
|
+
const isResume = await confirm({
|
|
43
|
+
message: 'Do you want use some existing contract addresses?',
|
|
44
|
+
});
|
|
45
|
+
if (!isResume)
|
|
46
|
+
return undefined;
|
|
47
|
+
artifactsPath = await runFileSelectionStep('./artifacts', 'contract artifacts', 'core-deployment');
|
|
48
|
+
}
|
|
45
49
|
const artifacts = readDeploymentArtifacts(artifactsPath);
|
|
46
50
|
const artifactChains = Object.keys(artifacts).filter((c) => selectedChains.includes(c));
|
|
47
51
|
log(`Found existing artifacts for chains: ${artifactChains.join(', ')}`);
|
|
48
52
|
return artifacts;
|
|
49
53
|
}
|
|
50
|
-
async function runIsmStep(selectedChains) {
|
|
51
|
-
logBlue('\n', 'Hyperlane instances requires an Interchain Security Module (ISM).');
|
|
52
|
-
const isMultisig = await confirm({
|
|
53
|
-
message: 'Do you want use a Multisig ISM?',
|
|
54
|
-
});
|
|
55
|
-
if (!isMultisig)
|
|
56
|
-
throw new Error('Sorry, only multisig ISMs are currently supported in the CLI');
|
|
54
|
+
async function runIsmStep(selectedChains, ismConfigPath) {
|
|
57
55
|
const defaultConfigChains = Object.keys(defaultMultisigIsmConfigs);
|
|
58
56
|
const configRequired = !!selectedChains.find((c) => !defaultConfigChains.includes(c));
|
|
59
57
|
if (!configRequired)
|
|
60
58
|
return;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
if (!ismConfigPath) {
|
|
60
|
+
logBlue('\n', 'Hyperlane instances requires an Interchain Security Module (ISM).');
|
|
61
|
+
logGray('Note, only Multisig ISM configs are currently supported in the CLI', 'Example config: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/cli/typescript/cli/examples/multisig-ism.yaml');
|
|
62
|
+
ismConfigPath = await runFileSelectionStep('./configs', 'ISM config', 'ism');
|
|
63
|
+
}
|
|
64
|
+
const configs = readMultisigConfig(ismConfigPath);
|
|
66
65
|
const multisigConfigChains = Object.keys(configs).filter((c) => selectedChains.includes(c));
|
|
67
66
|
log(`Found configs for chains: ${multisigConfigChains.join(', ')}`);
|
|
68
67
|
return configs;
|
|
69
68
|
}
|
|
70
|
-
async function runDeployPlanStep({
|
|
69
|
+
async function runDeployPlanStep({ origin, remotes, signer, artifacts, skipConfirmation, }) {
|
|
71
70
|
const address = await signer.getAddress();
|
|
72
|
-
logBlue('\
|
|
73
|
-
logGray('
|
|
71
|
+
logBlue('\nDeployment plan');
|
|
72
|
+
logGray('===============');
|
|
74
73
|
log(`Transaction signer and owner of new contracts will be ${address}`);
|
|
75
|
-
log(`Deploying to ${
|
|
74
|
+
log(`Deploying to ${origin} and connecting it to ${remotes.join(', ')}`);
|
|
76
75
|
const numContracts = Object.keys(Object.values(sdkContractAddressesMap)[0]).length;
|
|
77
76
|
log(`There are ${numContracts} contracts for each chain`);
|
|
78
77
|
if (artifacts)
|
|
79
78
|
log('But contracts with an address in the artifacts file will be skipped');
|
|
80
|
-
for (const chain of [
|
|
79
|
+
for (const chain of [origin, ...remotes]) {
|
|
81
80
|
const chainArtifacts = artifacts?.[chain] || {};
|
|
82
81
|
const numRequired = numContracts - Object.keys(chainArtifacts).length;
|
|
83
82
|
log(`${chain} will require ${numRequired} of ${numContracts}`);
|
|
84
83
|
}
|
|
85
|
-
log('The interchain security module will be a Multisig.');
|
|
84
|
+
log('The default interchain security module will be a Multisig.');
|
|
85
|
+
if (skipConfirmation)
|
|
86
|
+
return;
|
|
86
87
|
const isConfirmed = await confirm({
|
|
87
88
|
message: 'Is this deployment plan correct?',
|
|
88
89
|
});
|
|
89
90
|
if (!isConfirmed)
|
|
90
91
|
throw new Error('Deployment cancelled');
|
|
91
92
|
}
|
|
92
|
-
async function executeDeploy({
|
|
93
|
+
async function executeDeploy({ origin, remotes, signer, multiProvider, outPath, artifacts = {}, multisigConfig = {}, }) {
|
|
93
94
|
logBlue('All systems ready, captain! Beginning deployment...');
|
|
94
95
|
const [contractsFilePath, agentFilePath] = prepNewArtifactsFiles(outPath, [
|
|
95
96
|
{ filename: 'core-deployment', description: 'Contract addresses' },
|
|
96
97
|
{ filename: 'agent-config', description: 'Agent configs' },
|
|
97
98
|
]);
|
|
98
99
|
const owner = await signer.getAddress();
|
|
99
|
-
const selectedChains = [
|
|
100
|
+
const selectedChains = [origin, ...remotes];
|
|
100
101
|
const mergedContractAddrs = getMergedContractAddresses(artifacts);
|
|
101
102
|
// 1. Deploy ISM factories to all deployable chains that don't have them.
|
|
102
103
|
log('Deploying ISM factory contracts');
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
const ismFactoryContracts = await
|
|
104
|
+
const ismFactoryDeployer = new HyperlaneIsmFactoryDeployer(multiProvider);
|
|
105
|
+
ismFactoryDeployer.cacheAddressesMap(mergedContractAddrs);
|
|
106
|
+
const ismFactoryContracts = await ismFactoryDeployer.deploy(selectedChains);
|
|
106
107
|
artifacts = writeMergedAddresses(contractsFilePath, artifacts, ismFactoryContracts);
|
|
107
|
-
logGreen(
|
|
108
|
+
logGreen('ISM factory contracts deployed');
|
|
108
109
|
// 2. Deploy IGPs to all deployable chains.
|
|
109
|
-
log(
|
|
110
|
-
const igpConfig = buildIgpConfigMap(owner, selectedChains,
|
|
110
|
+
log('Deploying IGP contracts');
|
|
111
|
+
const igpConfig = buildIgpConfigMap(owner, selectedChains, multisigConfig);
|
|
111
112
|
const igpDeployer = new HyperlaneIgpDeployer(multiProvider);
|
|
112
113
|
igpDeployer.cacheAddressesMap(artifacts);
|
|
113
114
|
const igpContracts = await igpDeployer.deploy(igpConfig);
|
|
114
115
|
artifacts = writeMergedAddresses(contractsFilePath, artifacts, igpContracts);
|
|
115
|
-
logGreen(
|
|
116
|
+
logGreen('IGP contracts deployed');
|
|
116
117
|
// Build an IsmFactory that covers all chains so that we can
|
|
117
|
-
// use it
|
|
118
|
+
// use it to deploy ISMs to remote chains.
|
|
118
119
|
const ismFactory = HyperlaneIsmFactory.fromAddressesMap(mergedContractAddrs, multiProvider);
|
|
119
|
-
// 3. Deploy
|
|
120
|
-
log(
|
|
121
|
-
const coreDeployer = new HyperlaneCoreDeployer(multiProvider, ismFactory);
|
|
122
|
-
coreDeployer.cacheAddressesMap(artifacts);
|
|
123
|
-
const coreConfig = buildCoreConfigMap(owner, local, remotes, multisigConfig);
|
|
124
|
-
const coreContracts = await coreDeployer.deploy(coreConfig);
|
|
125
|
-
artifacts = writeMergedAddresses(contractsFilePath, artifacts, coreContracts);
|
|
126
|
-
logGreen(`Core contracts deployed`);
|
|
127
|
-
// 4. Deploy ISM contracts to remote deployable chains
|
|
128
|
-
log(`Deploying ISMs`);
|
|
129
|
-
const ismConfigs = buildIsmConfigMap(owner, remotes, selectedChains, multisigConfig);
|
|
120
|
+
// 3. Deploy ISM contracts to remote deployable chains
|
|
121
|
+
log('Deploying ISMs');
|
|
130
122
|
const ismContracts = {};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
123
|
+
const defaultIsms = {};
|
|
124
|
+
for (const ismOrigin of selectedChains) {
|
|
125
|
+
if (artifacts[ismOrigin].multisigIsm) {
|
|
126
|
+
log(`ISM contract recovered, skipping ISM deployment to ${ismOrigin}`);
|
|
127
|
+
defaultIsms[ismOrigin] = artifacts[ismOrigin].multisigIsm;
|
|
134
128
|
continue;
|
|
135
129
|
}
|
|
136
|
-
log(`Deploying ISM to ${
|
|
137
|
-
|
|
138
|
-
|
|
130
|
+
log(`Deploying ISM to ${ismOrigin}`);
|
|
131
|
+
const ismConfig = buildIsmConfig(owner, selectedChains.filter((r) => r !== ismOrigin), multisigConfig);
|
|
132
|
+
ismContracts[ismOrigin] = {
|
|
133
|
+
multisigIsm: await ismFactory.deploy(ismOrigin, ismConfig),
|
|
139
134
|
};
|
|
135
|
+
defaultIsms[ismOrigin] = ismContracts[ismOrigin].multisigIsm.address;
|
|
140
136
|
}
|
|
141
137
|
artifacts = writeMergedAddresses(contractsFilePath, artifacts, ismContracts);
|
|
142
|
-
logGreen(
|
|
138
|
+
logGreen('ISM contracts deployed');
|
|
139
|
+
// 4. Deploy core contracts to origin chain
|
|
140
|
+
log(`Deploying core contracts to ${origin}`);
|
|
141
|
+
const coreDeployer = new HyperlaneCoreDeployer(multiProvider, ismFactory);
|
|
142
|
+
coreDeployer.cacheAddressesMap(artifacts);
|
|
143
|
+
const coreConfig = buildCoreConfigMap(owner, origin, defaultIsms);
|
|
144
|
+
const coreContracts = await coreDeployer.deploy(coreConfig);
|
|
145
|
+
artifacts = writeMergedAddresses(contractsFilePath, artifacts, coreContracts);
|
|
146
|
+
logGreen('Core contracts deployed');
|
|
143
147
|
// 5. Deploy TestRecipients to all deployable chains
|
|
144
|
-
log(
|
|
148
|
+
log('Deploying test recipient contracts');
|
|
145
149
|
const testRecipientConfig = buildTestRecipientConfigMap(selectedChains, artifacts);
|
|
146
150
|
const testRecipientDeployer = new TestRecipientDeployer(multiProvider);
|
|
147
151
|
testRecipientDeployer.cacheAddressesMap(artifacts);
|
|
148
152
|
const testRecipients = await testRecipientDeployer.deploy(testRecipientConfig);
|
|
149
153
|
artifacts = writeMergedAddresses(contractsFilePath, artifacts, testRecipients);
|
|
150
|
-
logGreen(
|
|
154
|
+
logGreen('Test recipient contracts deployed');
|
|
151
155
|
log('Writing agent configs');
|
|
152
|
-
await writeAgentConfig(agentFilePath, artifacts,
|
|
156
|
+
await writeAgentConfig(agentFilePath, artifacts, origin, remotes, multiProvider);
|
|
153
157
|
logGreen('Agent configs written');
|
|
154
158
|
logBlue('Deployment is complete!');
|
|
155
159
|
logBlue(`Contract address artifacts are in ${contractsFilePath}`);
|
|
@@ -163,40 +167,41 @@ function buildIsmConfig(owner, remotes, multisigIsmConfigs) {
|
|
|
163
167
|
domains: Object.fromEntries(remotes.map((remote) => [remote, mergedMultisigIsmConfig[remote]])),
|
|
164
168
|
};
|
|
165
169
|
}
|
|
166
|
-
function
|
|
167
|
-
return Object.fromEntries(chains.map((chain) => {
|
|
168
|
-
const ismConfig = buildIsmConfig(owner, remotes.filter((r) => r !== chain), multisigIsmConfigs);
|
|
169
|
-
return [chain, ismConfig];
|
|
170
|
-
}));
|
|
171
|
-
}
|
|
172
|
-
function buildCoreConfigMap(owner, local, remotes, multisigIsmConfigs) {
|
|
170
|
+
function buildCoreConfigMap(owner, origin, defaultIsms) {
|
|
173
171
|
const configMap = {};
|
|
174
|
-
configMap[
|
|
172
|
+
configMap[origin] = {
|
|
175
173
|
owner,
|
|
176
|
-
defaultIsm:
|
|
174
|
+
defaultIsm: defaultIsms[origin],
|
|
177
175
|
};
|
|
178
176
|
return configMap;
|
|
179
177
|
}
|
|
180
178
|
function buildTestRecipientConfigMap(chains, addressesMap) {
|
|
181
|
-
return
|
|
182
|
-
const interchainSecurityModule =
|
|
179
|
+
return chains.reduce((config, chain) => {
|
|
180
|
+
const interchainSecurityModule =
|
|
181
|
+
// TODO revisit assumption that multisigIsm is always the ISM
|
|
182
|
+
addressesMap[chain].multisigIsm ??
|
|
183
|
+
addressesMap[chain].interchainSecurityModule ??
|
|
183
184
|
ethers.constants.AddressZero;
|
|
184
|
-
|
|
185
|
-
|
|
185
|
+
if (interchainSecurityModule === ethers.constants.AddressZero) {
|
|
186
|
+
logRed('Error: No ISM for TestRecipient, deploying with zero address');
|
|
187
|
+
}
|
|
188
|
+
config[chain] = { interchainSecurityModule };
|
|
189
|
+
return config;
|
|
190
|
+
}, {});
|
|
186
191
|
}
|
|
187
|
-
function buildIgpConfigMap(owner,
|
|
192
|
+
function buildIgpConfigMap(owner, selectedChains, multisigIsmConfigs) {
|
|
188
193
|
const mergedMultisigIsmConfig = objMerge(defaultMultisigIsmConfigs, multisigIsmConfigs);
|
|
189
194
|
const configMap = {};
|
|
190
|
-
for (const
|
|
195
|
+
for (const origin of selectedChains) {
|
|
191
196
|
const overhead = {};
|
|
192
197
|
const gasOracleType = {};
|
|
193
198
|
for (const remote of selectedChains) {
|
|
194
|
-
if (
|
|
199
|
+
if (origin === remote)
|
|
195
200
|
continue;
|
|
196
201
|
overhead[remote] = multisigIsmVerificationCost(mergedMultisigIsmConfig[remote].threshold, mergedMultisigIsmConfig[remote].validators.length);
|
|
197
202
|
gasOracleType[remote] = GasOracleContractType.StorageGasOracle;
|
|
198
203
|
}
|
|
199
|
-
configMap[
|
|
204
|
+
configMap[origin] = {
|
|
200
205
|
owner,
|
|
201
206
|
beneficiary: owner,
|
|
202
207
|
gasOracleType,
|
|
@@ -212,16 +217,18 @@ function writeMergedAddresses(filePath, aAddresses, bContracts) {
|
|
|
212
217
|
writeJson(filePath, mergedAddresses);
|
|
213
218
|
return mergedAddresses;
|
|
214
219
|
}
|
|
215
|
-
async function writeAgentConfig(filePath, artifacts,
|
|
216
|
-
const selectedChains = [
|
|
220
|
+
async function writeAgentConfig(filePath, artifacts, origin, remotes, multiProvider) {
|
|
221
|
+
const selectedChains = [origin, ...remotes];
|
|
217
222
|
const startBlocks = { ...agentStartBlocks };
|
|
218
|
-
startBlocks[
|
|
223
|
+
startBlocks[origin] = await multiProvider
|
|
224
|
+
.getProvider(origin)
|
|
225
|
+
.getBlockNumber();
|
|
219
226
|
const mergedAddressesMap = objMerge(sdkContractAddressesMap, artifacts);
|
|
220
227
|
const filteredAddressesMap = objFilter(mergedAddressesMap, (chain, v) => selectedChains.includes(chain) &&
|
|
221
228
|
!!v.mailbox &&
|
|
222
229
|
!!v.interchainGasPaymaster &&
|
|
223
230
|
!!v.validatorAnnounce);
|
|
224
|
-
const agentConfig = buildAgentConfig(
|
|
231
|
+
const agentConfig = buildAgentConfig(Object.keys(filteredAddressesMap), multiProvider, filteredAddressesMap, startBlocks);
|
|
225
232
|
writeJson(filePath, agentConfig);
|
|
226
233
|
}
|
|
227
234
|
//# sourceMappingURL=core.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/deploy/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/deploy/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ethers } from 'ethers';
|
|
2
2
|
import { ChainName, MultiProvider } from '@hyperlane-xyz/sdk';
|
|
3
|
-
export declare function runPreflightChecks({
|
|
4
|
-
|
|
3
|
+
export declare function runPreflightChecks({ origin, remotes, signer, multiProvider, minBalanceWei, }: {
|
|
4
|
+
origin: ChainName;
|
|
5
5
|
remotes: ChainName[];
|
|
6
6
|
signer: ethers.Signer;
|
|
7
7
|
multiProvider: MultiProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/deploy/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAO9D,wBAAsB,kBAAkB,CAAC,EACvC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/deploy/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAO9D,wBAAsB,kBAAkB,CAAC,EACvC,MAAM,EACN,OAAO,EACP,MAAM,EACN,aAAa,EACb,aAAa,GACd,EAAE;IACD,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB,iBAwBA"}
|
package/dist/src/deploy/utils.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ProtocolType } from '@hyperlane-xyz/utils';
|
|
2
|
-
import { log, logGreen } from '
|
|
2
|
+
import { log, logGreen } from '../../logger.js';
|
|
3
3
|
import { assertNativeBalances } from '../utils/balances.js';
|
|
4
4
|
import { assertSigner } from '../utils/keys.js';
|
|
5
|
-
export async function runPreflightChecks({
|
|
5
|
+
export async function runPreflightChecks({ origin, remotes, signer, multiProvider, minBalanceWei, }) {
|
|
6
6
|
log('Running pre-flight checks...');
|
|
7
|
-
if (!
|
|
7
|
+
if (!origin || !remotes?.length)
|
|
8
8
|
throw new Error('Invalid chain selection');
|
|
9
|
-
if (remotes.includes(
|
|
10
|
-
throw new Error('
|
|
11
|
-
for (const chain of [
|
|
9
|
+
if (remotes.includes(origin))
|
|
10
|
+
throw new Error('Origin and remotes must be distinct');
|
|
11
|
+
for (const chain of [origin, ...remotes]) {
|
|
12
12
|
const metadata = multiProvider.tryGetChainMetadata(chain);
|
|
13
13
|
if (!metadata)
|
|
14
14
|
throw new Error(`No chain config found for ${chain}`);
|
|
@@ -18,7 +18,7 @@ export async function runPreflightChecks({ local, remotes, signer, multiProvider
|
|
|
18
18
|
logGreen('Chains are valid ✅');
|
|
19
19
|
assertSigner(signer);
|
|
20
20
|
logGreen('Signer is valid ✅');
|
|
21
|
-
await assertNativeBalances(multiProvider, signer, [
|
|
21
|
+
await assertNativeBalances(multiProvider, signer, [origin, ...remotes], minBalanceWei);
|
|
22
22
|
logGreen('Balances are sufficient ✅');
|
|
23
23
|
}
|
|
24
24
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/deploy/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/deploy/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,MAAM,EACN,OAAO,EACP,MAAM,EACN,aAAa,EACb,aAAa,GAOd;IACC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE;QACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACrE,IAAI,QAAQ,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ;YAC7C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;KACjE;IACD,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAE/B,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAE9B,MAAM,oBAAoB,CACxB,aAAa,EACb,MAAM,EACN,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EACpB,aAAa,CACd,CAAC;IACF,QAAQ,CAAC,2BAA2B,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export declare function runWarpDeploy({ key, chainConfigPath, warpConfigPath, coreArtifactsPath, outPath, }: {
|
|
1
|
+
export declare function runWarpDeploy({ key, chainConfigPath, warpConfigPath, coreArtifactsPath, outPath, skipConfirmation, }: {
|
|
2
2
|
key: string;
|
|
3
3
|
chainConfigPath: string;
|
|
4
|
-
warpConfigPath
|
|
5
|
-
coreArtifactsPath
|
|
4
|
+
warpConfigPath?: string;
|
|
5
|
+
coreArtifactsPath?: string;
|
|
6
6
|
outPath: string;
|
|
7
|
+
skipConfirmation: boolean;
|
|
7
8
|
}): Promise<void>;
|
|
8
9
|
//# sourceMappingURL=warp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warp.d.ts","sourceRoot":"","sources":["../../../src/deploy/warp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"warp.d.ts","sourceRoot":"","sources":["../../../src/deploy/warp.ts"],"names":[],"mappings":"AAwCA,wBAAsB,aAAa,CAAC,EAClC,GAAG,EACH,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,gBAAgB,GACjB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,iBAqCA"}
|
package/dist/src/deploy/warp.js
CHANGED
|
@@ -3,15 +3,18 @@ import { ethers } from 'ethers';
|
|
|
3
3
|
import { ERC20__factory, ERC721__factory, HypERC20Deployer, HypERC721Deployer, TokenType, } from '@hyperlane-xyz/hyperlane-token';
|
|
4
4
|
import { chainMetadata as defaultChainMetadata, } from '@hyperlane-xyz/sdk';
|
|
5
5
|
import { objMap } from '@hyperlane-xyz/utils';
|
|
6
|
+
import { log, logBlue, logGray, logGreen } from '../../logger.js';
|
|
6
7
|
import { readDeploymentArtifacts } from '../config/artifacts.js';
|
|
7
8
|
import { readWarpRouteConfig } from '../config/warp.js';
|
|
8
9
|
import { MINIMUM_WARP_DEPLOY_BALANCE } from '../consts.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { prepNewArtifactsFiles, writeJson } from '../utils/files.js';
|
|
10
|
+
import { getContextWithSigner, getMergedContractAddresses, } from '../context.js';
|
|
11
|
+
import { prepNewArtifactsFiles, runFileSelectionStep, writeJson, } from '../utils/files.js';
|
|
12
12
|
import { runPreflightChecks } from './utils.js';
|
|
13
|
-
export async function runWarpDeploy({ key, chainConfigPath, warpConfigPath, coreArtifactsPath, outPath, }) {
|
|
14
|
-
const { multiProvider, signer } =
|
|
13
|
+
export async function runWarpDeploy({ key, chainConfigPath, warpConfigPath, coreArtifactsPath, outPath, skipConfirmation, }) {
|
|
14
|
+
const { multiProvider, signer } = getContextWithSigner(key, chainConfigPath);
|
|
15
|
+
if (!warpConfigPath) {
|
|
16
|
+
warpConfigPath = await runFileSelectionStep('./configs', 'Warp config', 'warp');
|
|
17
|
+
}
|
|
15
18
|
const warpRouteConfig = readWarpRouteConfig(warpConfigPath);
|
|
16
19
|
const artifacts = coreArtifactsPath
|
|
17
20
|
? readDeploymentArtifacts(coreArtifactsPath)
|
|
@@ -27,6 +30,7 @@ export async function runWarpDeploy({ key, chainConfigPath, warpConfigPath, core
|
|
|
27
30
|
signer,
|
|
28
31
|
multiProvider,
|
|
29
32
|
outPath,
|
|
33
|
+
skipConfirmation,
|
|
30
34
|
};
|
|
31
35
|
await runDeployPlanStep(deploymentParams);
|
|
32
36
|
await runPreflightChecks({
|
|
@@ -108,21 +112,23 @@ async function runBuildConfigStep({ warpRouteConfig, multiProvider, signer, arti
|
|
|
108
112
|
return {
|
|
109
113
|
configMap,
|
|
110
114
|
metadata: baseMetadata,
|
|
111
|
-
|
|
115
|
+
origin: baseChainName,
|
|
112
116
|
remotes: synthetics.map(({ chainName }) => chainName),
|
|
113
117
|
isNft: !!isNft,
|
|
114
118
|
};
|
|
115
119
|
}
|
|
116
|
-
async function runDeployPlanStep({ configMap, isNft,
|
|
120
|
+
async function runDeployPlanStep({ configMap, isNft, origin, remotes, signer, skipConfirmation, }) {
|
|
117
121
|
const address = await signer.getAddress();
|
|
118
|
-
const baseToken = configMap[
|
|
122
|
+
const baseToken = configMap[origin];
|
|
119
123
|
const baseName = getTokenName(baseToken);
|
|
120
|
-
logBlue('\
|
|
121
|
-
logGray('
|
|
124
|
+
logBlue('\nDeployment plan');
|
|
125
|
+
logGray('===============');
|
|
122
126
|
log(`Transaction signer and owner of new contracts will be ${address}`);
|
|
123
|
-
log(`Deploying a warp route with a base of ${baseName} token on ${
|
|
127
|
+
log(`Deploying a warp route with a base of ${baseName} token on ${origin}`);
|
|
124
128
|
log(`Connecting it to new synthetic tokens on ${remotes.join(', ')}`);
|
|
125
129
|
log(`Using token standard ${isNft ? 'ERC721' : 'ERC20'}`);
|
|
130
|
+
if (skipConfirmation)
|
|
131
|
+
return;
|
|
126
132
|
const isConfirmed = await confirm({
|
|
127
133
|
message: 'Is this deployment plan correct?',
|
|
128
134
|
});
|
|
@@ -148,6 +154,7 @@ async function executeDeploy(params) {
|
|
|
148
154
|
logBlue(`Contract address artifacts are in ${contractsFilePath}`);
|
|
149
155
|
logBlue(`Warp UI token config is in ${tokenConfigPath}`);
|
|
150
156
|
}
|
|
157
|
+
// TODO move into token classes in the SDK
|
|
151
158
|
async function fetchBaseTokenMetadata(base, multiProvider) {
|
|
152
159
|
const { type, name, symbol, chainName, address, decimals, isNft } = base;
|
|
153
160
|
// Skip fetching metadata if it's already provided in the config
|
|
@@ -195,14 +202,14 @@ function writeTokenDeploymentArtifacts(filePath, contracts, { configMap }) {
|
|
|
195
202
|
});
|
|
196
203
|
writeJson(filePath, artifacts);
|
|
197
204
|
}
|
|
198
|
-
function writeWarpUiTokenConfig(filePath, contracts, { configMap, isNft, metadata,
|
|
199
|
-
const baseConfig = configMap[
|
|
200
|
-
const hypTokenAddr = contracts[
|
|
205
|
+
function writeWarpUiTokenConfig(filePath, contracts, { configMap, isNft, metadata, origin, multiProvider }) {
|
|
206
|
+
const baseConfig = configMap[origin];
|
|
207
|
+
const hypTokenAddr = contracts[origin]?.router?.address || configMap[origin]?.foreignDeployment;
|
|
201
208
|
if (!hypTokenAddr) {
|
|
202
209
|
throw Error('No base Hyperlane token address deployed and no foreign deployment specified');
|
|
203
210
|
}
|
|
204
211
|
const commonFields = {
|
|
205
|
-
chainId: multiProvider.getChainId(
|
|
212
|
+
chainId: multiProvider.getChainId(origin),
|
|
206
213
|
name: metadata.name,
|
|
207
214
|
symbol: metadata.symbol,
|
|
208
215
|
decimals: metadata.decimals,
|