@hyperlane-xyz/cli 9.2.0 → 10.0.0

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warp-extend-basic.e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-basic.e2e-test.d.ts","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-basic.e2e-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,172 @@
1
+ import { expect } from 'chai';
2
+ import { Wallet } from 'ethers';
3
+ import { TokenType, } from '@hyperlane-xyz/sdk';
4
+ import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js';
5
+ import { ANVIL_KEY, CHAIN_NAME_2, CHAIN_NAME_3, CORE_CONFIG_PATH, DEFAULT_E2E_TEST_TIMEOUT, E2E_TEST_BURN_ADDRESS, EXAMPLES_PATH, TEMP_PATH, WARP_CONFIG_PATH_2, WARP_CONFIG_PATH_EXAMPLE, WARP_CORE_CONFIG_PATH_2, deployOrUseExistingCore, extendWarpConfig, getCombinedWarpRoutePath, getDomainId, } from '../commands/helpers.js';
6
+ import { hyperlaneWarpApply, hyperlaneWarpDeploy, readWarpConfig, } from '../commands/warp.js';
7
+ describe('hyperlane warp apply basic extension tests', async function () {
8
+ this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT);
9
+ let chain2Addresses = {};
10
+ before(async function () {
11
+ await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY);
12
+ chain2Addresses = await deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY);
13
+ // Create a new warp config using the example
14
+ const warpConfig = readYamlOrJson(WARP_CONFIG_PATH_EXAMPLE);
15
+ const anvil2Config = { anvil2: { ...warpConfig.anvil1 } };
16
+ writeYamlOrJson(WARP_CONFIG_PATH_2, anvil2Config);
17
+ });
18
+ beforeEach(async function () {
19
+ await hyperlaneWarpDeploy(WARP_CONFIG_PATH_2);
20
+ });
21
+ it('should extend an existing warp route', async () => {
22
+ // Read existing config into a file
23
+ const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
24
+ await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
25
+ // Extend with new config
26
+ const config = {
27
+ decimals: 18,
28
+ mailbox: chain2Addresses.mailbox,
29
+ name: 'Ether',
30
+ owner: new Wallet(ANVIL_KEY).address,
31
+ symbol: 'ETH',
32
+ type: TokenType.native,
33
+ };
34
+ await extendWarpConfig({
35
+ chain: CHAIN_NAME_2,
36
+ chainToExtend: CHAIN_NAME_3,
37
+ extendedConfig: config,
38
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
39
+ warpDeployPath: warpConfigPath,
40
+ });
41
+ const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
42
+ CHAIN_NAME_2,
43
+ CHAIN_NAME_3,
44
+ ]);
45
+ // Check that chain2 is enrolled in chain1
46
+ const updatedWarpDeployConfig1 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
47
+ const chain2Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
48
+ const remoteRouterKeys1 = Object.keys(updatedWarpDeployConfig1[CHAIN_NAME_2].remoteRouters);
49
+ expect(remoteRouterKeys1).to.include(chain2Id);
50
+ // Check that chain1 is enrolled in chain2
51
+ const updatedWarpDeployConfig2 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
52
+ const chain1Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
53
+ const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig2[CHAIN_NAME_3].remoteRouters);
54
+ expect(remoteRouterKeys2).to.include(chain1Id);
55
+ });
56
+ it('should extend an existing warp route with json strategy', async () => {
57
+ // Read existing config into a file
58
+ const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
59
+ await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
60
+ // Extend with new config
61
+ const config = {
62
+ decimals: 18,
63
+ mailbox: chain2Addresses.mailbox,
64
+ name: 'Ether',
65
+ owner: new Wallet(ANVIL_KEY).address,
66
+ symbol: 'ETH',
67
+ type: TokenType.native,
68
+ };
69
+ await extendWarpConfig({
70
+ chain: CHAIN_NAME_2,
71
+ chainToExtend: CHAIN_NAME_3,
72
+ extendedConfig: config,
73
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
74
+ warpDeployPath: warpConfigPath,
75
+ strategyUrl: `${EXAMPLES_PATH}/submit/strategy/json-rpc-chain-strategy.yaml`,
76
+ });
77
+ const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
78
+ CHAIN_NAME_2,
79
+ CHAIN_NAME_3,
80
+ ]);
81
+ // Check that chain2 is enrolled in chain1
82
+ const updatedWarpDeployConfig1 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
83
+ const chain2Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
84
+ const remoteRouterKeys1 = Object.keys(updatedWarpDeployConfig1[CHAIN_NAME_2].remoteRouters);
85
+ expect(remoteRouterKeys1).to.include(chain2Id);
86
+ // Check that chain1 is enrolled in chain2
87
+ const updatedWarpDeployConfig2 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
88
+ const chain1Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
89
+ const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig2[CHAIN_NAME_3].remoteRouters);
90
+ expect(remoteRouterKeys2).to.include(chain1Id);
91
+ });
92
+ it('should extend an existing warp route and update the owner', async () => {
93
+ const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
94
+ // Burn anvil2 owner in config
95
+ const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
96
+ warpDeployConfig[CHAIN_NAME_2].owner = E2E_TEST_BURN_ADDRESS;
97
+ // Extend with new config
98
+ const randomOwner = new Wallet(ANVIL_KEY).address;
99
+ const extendedConfig = {
100
+ decimals: 18,
101
+ mailbox: chain2Addresses.mailbox,
102
+ name: 'Ether',
103
+ owner: randomOwner,
104
+ symbol: 'ETH',
105
+ type: TokenType.native,
106
+ };
107
+ // Remove remoteRouters and destinationGas as they are written in readWarpConfig
108
+ warpDeployConfig[CHAIN_NAME_2].remoteRouters = undefined;
109
+ warpDeployConfig[CHAIN_NAME_2].destinationGas = undefined;
110
+ warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
111
+ writeYamlOrJson(warpDeployPath, warpDeployConfig);
112
+ await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
113
+ const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
114
+ CHAIN_NAME_2,
115
+ CHAIN_NAME_3,
116
+ ]);
117
+ const updatedWarpDeployConfig_2 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpDeployPath);
118
+ const updatedWarpDeployConfig_3 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpDeployPath);
119
+ // Check that anvil2 owner is burned
120
+ expect(updatedWarpDeployConfig_2.anvil2.owner).to.equal(E2E_TEST_BURN_ADDRESS);
121
+ // Also, anvil3 owner is not burned
122
+ expect(updatedWarpDeployConfig_3.anvil3.owner).to.equal(randomOwner);
123
+ // Check that both chains enrolled
124
+ const chain2Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
125
+ const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
126
+ const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig_2[CHAIN_NAME_2].remoteRouters);
127
+ const remoteRouterKeys3 = Object.keys(updatedWarpDeployConfig_3[CHAIN_NAME_3].remoteRouters);
128
+ expect(remoteRouterKeys2).to.include(chain3Id);
129
+ expect(remoteRouterKeys3).to.include(chain2Id);
130
+ });
131
+ it('should extend an existing warp route and update all destination domains', async () => {
132
+ // Read existing config into a file
133
+ const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
134
+ const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
135
+ warpDeployConfig[CHAIN_NAME_2].gas = 7777;
136
+ // Extend with new config
137
+ const GAS = 694200;
138
+ const extendedConfig = {
139
+ decimals: 18,
140
+ mailbox: chain2Addresses.mailbox,
141
+ name: 'Ether',
142
+ owner: new Wallet(ANVIL_KEY).address,
143
+ symbol: 'ETH',
144
+ type: TokenType.native,
145
+ gas: GAS,
146
+ };
147
+ // Remove remoteRouters and destinationGas as they are written in readWarpConfig
148
+ warpDeployConfig[CHAIN_NAME_2].remoteRouters = undefined;
149
+ warpDeployConfig[CHAIN_NAME_2].destinationGas = undefined;
150
+ warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
151
+ writeYamlOrJson(warpConfigPath, warpDeployConfig);
152
+ await hyperlaneWarpApply(warpConfigPath, WARP_CORE_CONFIG_PATH_2);
153
+ const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
154
+ CHAIN_NAME_2,
155
+ CHAIN_NAME_3,
156
+ ]);
157
+ // Check that chain2 is enrolled in chain1
158
+ const updatedWarpDeployConfig_2 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
159
+ const chain2Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
160
+ const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
161
+ // Destination gas should be set in the existing chain (chain2) to include the extended chain (chain3)
162
+ const destinationGas_2 = updatedWarpDeployConfig_2[CHAIN_NAME_2].destinationGas;
163
+ expect(Object.keys(destinationGas_2)).to.include(chain3Id);
164
+ expect(destinationGas_2[chain3Id]).to.equal(GAS.toString());
165
+ // Destination gas should be set for the extended chain (chain3)
166
+ const updatedWarpDeployConfig_3 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
167
+ const destinationGas_3 = updatedWarpDeployConfig_3[CHAIN_NAME_3].destinationGas;
168
+ expect(Object.keys(destinationGas_3)).to.include(chain2Id);
169
+ expect(destinationGas_3[chain2Id]).to.equal('7777');
170
+ });
171
+ });
172
+ //# sourceMappingURL=warp-extend-basic.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-basic.e2e-test.js","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-basic.e2e-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warp-extend-config.e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-config.e2e-test.d.ts","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-config.e2e-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { expect } from 'chai';
2
+ import { Wallet } from 'ethers';
3
+ import { TokenType, normalizeConfig, randomAddress, } from '@hyperlane-xyz/sdk';
4
+ import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js';
5
+ import { ANVIL_KEY, CHAIN_NAME_2, CHAIN_NAME_3, CORE_CONFIG_PATH, DEFAULT_E2E_TEST_TIMEOUT, TEMP_PATH, WARP_CONFIG_PATH_2, WARP_CONFIG_PATH_EXAMPLE, WARP_CORE_CONFIG_PATH_2, deployOrUseExistingCore, extendWarpConfig, getDomainId, } from '../commands/helpers.js';
6
+ import { hyperlaneWarpApply, hyperlaneWarpDeploy, readWarpConfig, } from '../commands/warp.js';
7
+ describe('hyperlane warp apply config extension tests', async function () {
8
+ this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT);
9
+ let chain2Addresses = {};
10
+ before(async function () {
11
+ await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY);
12
+ chain2Addresses = await deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY);
13
+ // Create a new warp config using the example
14
+ const warpConfig = readYamlOrJson(WARP_CONFIG_PATH_EXAMPLE);
15
+ const anvil2Config = { anvil2: { ...warpConfig.anvil1 } };
16
+ writeYamlOrJson(WARP_CONFIG_PATH_2, anvil2Config);
17
+ });
18
+ beforeEach(async function () {
19
+ await hyperlaneWarpDeploy(WARP_CONFIG_PATH_2);
20
+ });
21
+ it('should update destination gas configuration', async () => {
22
+ const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
23
+ // Extend with new config
24
+ const config = {
25
+ decimals: 18,
26
+ mailbox: chain2Addresses.mailbox,
27
+ name: 'Ether',
28
+ owner: new Wallet(ANVIL_KEY).address,
29
+ symbol: 'ETH',
30
+ type: TokenType.native,
31
+ };
32
+ await extendWarpConfig({
33
+ chain: CHAIN_NAME_2,
34
+ chainToExtend: CHAIN_NAME_3,
35
+ extendedConfig: config,
36
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
37
+ warpDeployPath,
38
+ });
39
+ // First read the existing config
40
+ const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
41
+ // Get the domain ID for chain 3
42
+ const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
43
+ // Update with new destination gas values
44
+ warpDeployConfig[CHAIN_NAME_2].destinationGas = {
45
+ [chain3Id]: '500000', // Set a specific gas value for chain 3
46
+ };
47
+ // Write the updated config
48
+ await writeYamlOrJson(warpDeployPath, warpDeployConfig);
49
+ // Apply the changes
50
+ await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
51
+ // Read back the config to verify changes
52
+ const updatedConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
53
+ // Verify the destination gas was updated correctly
54
+ expect(updatedConfig[CHAIN_NAME_2].destinationGas[chain3Id]).to.equal('500000');
55
+ });
56
+ it('should update remote routers configuration', async () => {
57
+ const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
58
+ // Extend with new config
59
+ const config = {
60
+ decimals: 18,
61
+ mailbox: chain2Addresses.mailbox,
62
+ name: 'Ether',
63
+ owner: new Wallet(ANVIL_KEY).address,
64
+ symbol: 'ETH',
65
+ type: TokenType.native,
66
+ };
67
+ await extendWarpConfig({
68
+ chain: CHAIN_NAME_2,
69
+ chainToExtend: CHAIN_NAME_3,
70
+ extendedConfig: config,
71
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
72
+ warpDeployPath,
73
+ });
74
+ // First read the existing config
75
+ const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
76
+ // Get the domain ID for chain 3
77
+ const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
78
+ // Generate a new router address to update
79
+ const newRouterAddress = randomAddress();
80
+ // Update with new remote router values
81
+ warpDeployConfig[CHAIN_NAME_2].remoteRouters = {
82
+ [chain3Id]: { address: newRouterAddress }, // Set a new router address for chain 3
83
+ };
84
+ // Write the updated config
85
+ await writeYamlOrJson(warpDeployPath, warpDeployConfig);
86
+ // Apply the changes
87
+ await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
88
+ // Read back the config to verify changes
89
+ const updatedConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
90
+ // Verify the remote router was updated correctly
91
+ expect(updatedConfig[CHAIN_NAME_2].remoteRouters[chain3Id].address.toLowerCase()).to.equal(newRouterAddress.toLowerCase());
92
+ });
93
+ it('should preserve deploy config when extending warp route', async () => {
94
+ const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
95
+ const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
96
+ // Extend with new config for chain 3
97
+ const extendedConfig = {
98
+ decimals: 18,
99
+ mailbox: chain2Addresses.mailbox,
100
+ name: 'Ether',
101
+ owner: new Wallet(ANVIL_KEY).address,
102
+ symbol: 'ETH',
103
+ type: TokenType.native,
104
+ };
105
+ warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
106
+ // Remove remoteRouters and destinationGas as they are written in readWarpConfig
107
+ delete warpDeployConfig[CHAIN_NAME_2].remoteRouters;
108
+ delete warpDeployConfig[CHAIN_NAME_2].destinationGas;
109
+ await writeYamlOrJson(warpDeployPath, warpDeployConfig);
110
+ await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
111
+ const updatedConfig = readYamlOrJson(warpDeployPath);
112
+ expect(normalizeConfig(warpDeployConfig)).to.deep.equal(normalizeConfig(updatedConfig), 'warp deploy config should remain unchanged after extension');
113
+ });
114
+ });
115
+ //# sourceMappingURL=warp-extend-config.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-config.e2e-test.js","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-config.e2e-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warp-extend-recovery.e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-recovery.e2e-test.d.ts","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-recovery.e2e-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,167 @@
1
+ import { expect } from 'chai';
2
+ import { Wallet } from 'ethers';
3
+ import { TokenRouter__factory } from '@hyperlane-xyz/core';
4
+ import { TokenType, } from '@hyperlane-xyz/sdk';
5
+ import { getContext } from '../../context/context.js';
6
+ import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js';
7
+ import { ANVIL_KEY, CHAIN_NAME_2, CHAIN_NAME_3, CORE_CONFIG_PATH, DEFAULT_E2E_TEST_TIMEOUT, REGISTRY_PATH, TEMP_PATH, WARP_CONFIG_PATH_2, WARP_CONFIG_PATH_EXAMPLE, WARP_CORE_CONFIG_PATH_2, deployOrUseExistingCore, extendWarpConfig, getCombinedWarpRoutePath, getDomainId, setupIncompleteWarpRouteExtension, } from '../commands/helpers.js';
8
+ import { hyperlaneWarpDeploy, readWarpConfig } from '../commands/warp.js';
9
+ describe('hyperlane warp apply recovery extension tests', async function () {
10
+ this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT);
11
+ let chain2Addresses = {};
12
+ before(async function () {
13
+ await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY);
14
+ chain2Addresses = await deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY);
15
+ // Create a new warp config using the example
16
+ const warpConfig = readYamlOrJson(WARP_CONFIG_PATH_EXAMPLE);
17
+ const anvil2Config = { anvil2: { ...warpConfig.anvil1 } };
18
+ writeYamlOrJson(WARP_CONFIG_PATH_2, anvil2Config);
19
+ });
20
+ beforeEach(async function () {
21
+ await hyperlaneWarpDeploy(WARP_CONFIG_PATH_2);
22
+ });
23
+ it('should recover and re-enroll routers after direct contract-level unenrollment through TokenRouter interface', async () => {
24
+ const { multiProvider } = await getContext({
25
+ registryUris: [REGISTRY_PATH],
26
+ key: ANVIL_KEY,
27
+ });
28
+ const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
29
+ // Initial setup with chain3 using extendWarpConfig
30
+ await extendWarpConfig({
31
+ chain: CHAIN_NAME_2,
32
+ chainToExtend: CHAIN_NAME_3,
33
+ extendedConfig: {
34
+ decimals: 18,
35
+ mailbox: chain2Addresses.mailbox,
36
+ name: 'Ether',
37
+ owner: new Wallet(ANVIL_KEY).address,
38
+ symbol: 'ETH',
39
+ type: TokenType.native,
40
+ },
41
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
42
+ warpDeployPath: warpConfigPath,
43
+ });
44
+ const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
45
+ CHAIN_NAME_2,
46
+ CHAIN_NAME_3,
47
+ ]);
48
+ const warpCoreConfig = readYamlOrJson(COMBINED_WARP_CORE_CONFIG_PATH);
49
+ const deployedTokenRoute = warpCoreConfig.tokens.find((t) => t.chainName === CHAIN_NAME_2)?.addressOrDenom;
50
+ if (!deployedTokenRoute) {
51
+ throw new Error('Failed to find deployed token route address');
52
+ }
53
+ // Manually call unenrollRemoteRouters
54
+ const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
55
+ const tokenRouter = TokenRouter__factory.connect(deployedTokenRoute, new Wallet(ANVIL_KEY).connect(multiProvider.getProvider(CHAIN_NAME_2)));
56
+ await tokenRouter.unenrollRemoteRouters([chain3Id]);
57
+ // Verify the router was unenrolled
58
+ const beforeRecoveryConfig = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
59
+ expect(Object.keys(beforeRecoveryConfig[CHAIN_NAME_2].remoteRouters || {})).to.not.include(chain3Id.toString());
60
+ // Re-extend to fix the configuration
61
+ await extendWarpConfig({
62
+ chain: CHAIN_NAME_2,
63
+ chainToExtend: CHAIN_NAME_3,
64
+ extendedConfig: {
65
+ decimals: 18,
66
+ mailbox: chain2Addresses.mailbox,
67
+ name: 'Ether',
68
+ owner: new Wallet(ANVIL_KEY).address,
69
+ symbol: 'ETH',
70
+ type: TokenType.native,
71
+ },
72
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
73
+ warpDeployPath: warpConfigPath,
74
+ });
75
+ const recoveredConfig = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
76
+ expect(Object.keys(recoveredConfig[CHAIN_NAME_2].remoteRouters)).to.include(chain3Id.toString());
77
+ });
78
+ it('should complete warp route extension when previous attempt left incomplete enrollment or destination gas settings (second attempt on new combined config)', async () => {
79
+ const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
80
+ // Verify initial state - neither chain should be enrolled in the other
81
+ const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
82
+ const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
83
+ // Check remote routers initial state
84
+ expect(Object.keys(initialConfig2[CHAIN_NAME_2].remoteRouters)).to.not.include(chain3DomainId);
85
+ expect(Object.keys(initialConfig3[CHAIN_NAME_3].remoteRouters)).to.not.include(chain2DomainId);
86
+ // Check destination gas initial state
87
+ expect(Object.keys(initialConfig2[CHAIN_NAME_2].destinationGas || {})).to.not.include(chain3DomainId);
88
+ expect(Object.keys(initialConfig3[CHAIN_NAME_3].destinationGas || {})).to.not.include(chain2DomainId);
89
+ // Complete the extension
90
+ await extendWarpConfig({
91
+ chain: CHAIN_NAME_2,
92
+ chainToExtend: CHAIN_NAME_3,
93
+ extendedConfig: configToExtend,
94
+ warpCorePath: combinedWarpCorePath,
95
+ warpDeployPath: warpConfigPath,
96
+ });
97
+ // Verify both chains are now properly configured
98
+ const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
99
+ const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
100
+ // Check remote routers final state
101
+ expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
102
+ expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
103
+ // Check destination gas final state
104
+ expect(Object.keys(finalConfig2[CHAIN_NAME_2].destinationGas)).to.include(chain3DomainId);
105
+ expect(Object.keys(finalConfig3[CHAIN_NAME_3].destinationGas)).to.include(chain2DomainId);
106
+ });
107
+ it('should complete warp route extension when previous attempt left incomplete enrollment or destination gas settings (second attempt with same config)', async () => {
108
+ const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
109
+ // Verify initial state - neither chain should be enrolled in the other
110
+ const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
111
+ const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
112
+ // Check remote routers initial state
113
+ expect(Object.keys(initialConfig2[CHAIN_NAME_2].remoteRouters)).to.not.include(chain3DomainId);
114
+ expect(Object.keys(initialConfig3[CHAIN_NAME_3].remoteRouters)).to.not.include(chain2DomainId);
115
+ // Check destination gas initial state
116
+ expect(Object.keys(initialConfig2[CHAIN_NAME_2].destinationGas || {})).to.not.include(chain3DomainId);
117
+ expect(Object.keys(initialConfig3[CHAIN_NAME_3].destinationGas || {})).to.not.include(chain2DomainId);
118
+ // Complete the extension
119
+ await extendWarpConfig({
120
+ chain: CHAIN_NAME_2,
121
+ chainToExtend: CHAIN_NAME_3,
122
+ extendedConfig: configToExtend,
123
+ warpCorePath: WARP_CORE_CONFIG_PATH_2,
124
+ warpDeployPath: combinedWarpCorePath,
125
+ });
126
+ // Verify both chains are now properly configured
127
+ const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
128
+ const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
129
+ // Check remote routers final state
130
+ expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
131
+ expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
132
+ // Check destination gas final state
133
+ expect(Object.keys(finalConfig2[CHAIN_NAME_2].destinationGas)).to.include(chain3DomainId);
134
+ expect(Object.keys(finalConfig3[CHAIN_NAME_3].destinationGas)).to.include(chain2DomainId);
135
+ });
136
+ it('should set correct gas values when completing warp route extension', async () => {
137
+ const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
138
+ // Verify initial state - gas values should not be set
139
+ const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
140
+ const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
141
+ // Check initial gas values
142
+ expect(initialConfig2[CHAIN_NAME_2].destinationGas?.[chain3DomainId]).to.be
143
+ .undefined;
144
+ expect(initialConfig3[CHAIN_NAME_3].destinationGas?.[chain2DomainId]).to.be
145
+ .undefined;
146
+ // Set specific gas values for the extension
147
+ const customGasValue = '300000';
148
+ configToExtend.gas = parseInt(customGasValue);
149
+ // Complete the extension with custom gas value
150
+ await extendWarpConfig({
151
+ chain: CHAIN_NAME_2,
152
+ chainToExtend: CHAIN_NAME_3,
153
+ extendedConfig: configToExtend,
154
+ warpCorePath: combinedWarpCorePath,
155
+ warpDeployPath: warpConfigPath,
156
+ });
157
+ // Verify gas values are correctly set after extension
158
+ const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
159
+ const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
160
+ // Check gas value is set correctly
161
+ expect(finalConfig2[CHAIN_NAME_2].destinationGas[chain3DomainId]).to.equal(customGasValue);
162
+ // Verify remote routers are also properly set
163
+ expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
164
+ expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
165
+ });
166
+ });
167
+ //# sourceMappingURL=warp-extend-recovery.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warp-extend-recovery.e2e-test.js","sourceRoot":"","sources":["../../../../src/tests/warp/warp-extend-recovery.e2e-test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "9.2.0";
1
+ export declare const VERSION = "10.0.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
@@ -1,2 +1,2 @@
1
- export const VERSION = '9.2.0';
1
+ export const VERSION = '10.0.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@hyperlane-xyz/cli",
3
- "version": "9.2.0",
3
+ "version": "10.0.0",
4
4
  "description": "A command-line utility for common Hyperlane operations",
5
5
  "dependencies": {
6
6
  "@aws-sdk/client-kms": "^3.577.0",
7
7
  "@aws-sdk/client-s3": "^3.577.0",
8
8
  "@hyperlane-xyz/registry": "11.1.0",
9
- "@hyperlane-xyz/sdk": "9.2.0",
10
- "@hyperlane-xyz/utils": "9.2.0",
9
+ "@hyperlane-xyz/sdk": "10.0.0",
10
+ "@hyperlane-xyz/utils": "10.0.0",
11
11
  "@inquirer/core": "9.0.10",
12
12
  "@inquirer/figures": "1.0.5",
13
13
  "@inquirer/prompts": "3.3.2",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=warp-apply-extend.e2e-test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"warp-apply-extend.e2e-test.d.ts","sourceRoot":"","sources":["../../../../src/tests/warp/warp-apply-extend.e2e-test.ts"],"names":[],"mappings":""}
@@ -1,410 +0,0 @@
1
- import { expect } from 'chai';
2
- import { Wallet } from 'ethers';
3
- import { TokenRouter__factory } from '@hyperlane-xyz/core';
4
- import { TokenType, normalizeConfig, randomAddress, } from '@hyperlane-xyz/sdk';
5
- import { getContext } from '../../context/context.js';
6
- import { readYamlOrJson, writeYamlOrJson } from '../../utils/files.js';
7
- import { ANVIL_KEY, CHAIN_NAME_2, CHAIN_NAME_3, CORE_CONFIG_PATH, DEFAULT_E2E_TEST_TIMEOUT, E2E_TEST_BURN_ADDRESS, EXAMPLES_PATH, REGISTRY_PATH, TEMP_PATH, WARP_CONFIG_PATH_2, WARP_CONFIG_PATH_EXAMPLE, WARP_CORE_CONFIG_PATH_2, deployOrUseExistingCore, extendWarpConfig, getCombinedWarpRoutePath, getDomainId, setupIncompleteWarpRouteExtension, } from '../commands/helpers.js';
8
- import { hyperlaneWarpApply, hyperlaneWarpDeploy, readWarpConfig, } from '../commands/warp.js';
9
- describe('hyperlane warp apply warp route extension tests', async function () {
10
- this.timeout(2 * DEFAULT_E2E_TEST_TIMEOUT);
11
- let chain2Addresses = {};
12
- before(async function () {
13
- await deployOrUseExistingCore(CHAIN_NAME_2, CORE_CONFIG_PATH, ANVIL_KEY);
14
- chain2Addresses = await deployOrUseExistingCore(CHAIN_NAME_3, CORE_CONFIG_PATH, ANVIL_KEY);
15
- // Create a new warp config using the example
16
- const warpConfig = readYamlOrJson(WARP_CONFIG_PATH_EXAMPLE);
17
- const anvil2Config = { anvil2: { ...warpConfig.anvil1 } };
18
- writeYamlOrJson(WARP_CONFIG_PATH_2, anvil2Config);
19
- });
20
- beforeEach(async function () {
21
- await hyperlaneWarpDeploy(WARP_CONFIG_PATH_2);
22
- });
23
- it('should extend an existing warp route', async () => {
24
- // Read existing config into a file
25
- const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
26
- await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
27
- // Extend with new config
28
- const config = {
29
- decimals: 18,
30
- mailbox: chain2Addresses.mailbox,
31
- name: 'Ether',
32
- owner: new Wallet(ANVIL_KEY).address,
33
- symbol: 'ETH',
34
- type: TokenType.native,
35
- };
36
- await extendWarpConfig({
37
- chain: CHAIN_NAME_2,
38
- chainToExtend: CHAIN_NAME_3,
39
- extendedConfig: config,
40
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
41
- warpDeployPath: warpConfigPath,
42
- });
43
- const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
44
- CHAIN_NAME_2,
45
- CHAIN_NAME_3,
46
- ]);
47
- // Check that chain2 is enrolled in chain1
48
- const updatedWarpDeployConfig1 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
49
- const chain2Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
50
- const remoteRouterKeys1 = Object.keys(updatedWarpDeployConfig1[CHAIN_NAME_2].remoteRouters);
51
- expect(remoteRouterKeys1).to.include(chain2Id);
52
- // Check that chain1 is enrolled in chain2
53
- const updatedWarpDeployConfig2 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
54
- const chain1Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
55
- const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig2[CHAIN_NAME_3].remoteRouters);
56
- expect(remoteRouterKeys2).to.include(chain1Id);
57
- });
58
- it('should extend an existing warp route with json strategy', async () => {
59
- // Read existing config into a file
60
- const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
61
- await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
62
- // Extend with new config
63
- const config = {
64
- decimals: 18,
65
- mailbox: chain2Addresses.mailbox,
66
- name: 'Ether',
67
- owner: new Wallet(ANVIL_KEY).address,
68
- symbol: 'ETH',
69
- type: TokenType.native,
70
- };
71
- await extendWarpConfig({
72
- chain: CHAIN_NAME_2,
73
- chainToExtend: CHAIN_NAME_3,
74
- extendedConfig: config,
75
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
76
- warpDeployPath: warpConfigPath,
77
- strategyUrl: `${EXAMPLES_PATH}/submit/strategy/json-rpc-chain-strategy.yaml`,
78
- });
79
- const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
80
- CHAIN_NAME_2,
81
- CHAIN_NAME_3,
82
- ]);
83
- // Check that chain2 is enrolled in chain1
84
- const updatedWarpDeployConfig1 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
85
- const chain2Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
86
- const remoteRouterKeys1 = Object.keys(updatedWarpDeployConfig1[CHAIN_NAME_2].remoteRouters);
87
- expect(remoteRouterKeys1).to.include(chain2Id);
88
- // Check that chain1 is enrolled in chain2
89
- const updatedWarpDeployConfig2 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
90
- const chain1Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
91
- const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig2[CHAIN_NAME_3].remoteRouters);
92
- expect(remoteRouterKeys2).to.include(chain1Id);
93
- });
94
- it('should extend an existing warp route and update the owner', async () => {
95
- const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
96
- // Burn anvil2 owner in config
97
- const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
98
- warpDeployConfig[CHAIN_NAME_2].owner = E2E_TEST_BURN_ADDRESS;
99
- // Extend with new config
100
- const randomOwner = new Wallet(ANVIL_KEY).address;
101
- const extendedConfig = {
102
- decimals: 18,
103
- mailbox: chain2Addresses.mailbox,
104
- name: 'Ether',
105
- owner: randomOwner,
106
- symbol: 'ETH',
107
- type: TokenType.native,
108
- };
109
- // Remove remoteRouters and destinationGas as they are written in readWarpConfig
110
- warpDeployConfig[CHAIN_NAME_2].remoteRouters = undefined;
111
- warpDeployConfig[CHAIN_NAME_2].destinationGas = undefined;
112
- warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
113
- writeYamlOrJson(warpDeployPath, warpDeployConfig);
114
- await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
115
- const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
116
- CHAIN_NAME_2,
117
- CHAIN_NAME_3,
118
- ]);
119
- const updatedWarpDeployConfig_2 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpDeployPath);
120
- const updatedWarpDeployConfig_3 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpDeployPath);
121
- // Check that anvil2 owner is burned
122
- expect(updatedWarpDeployConfig_2.anvil2.owner).to.equal(E2E_TEST_BURN_ADDRESS);
123
- // Also, anvil3 owner is not burned
124
- expect(updatedWarpDeployConfig_3.anvil3.owner).to.equal(randomOwner);
125
- // Check that both chains enrolled
126
- const chain2Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
127
- const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
128
- const remoteRouterKeys2 = Object.keys(updatedWarpDeployConfig_2[CHAIN_NAME_2].remoteRouters);
129
- const remoteRouterKeys3 = Object.keys(updatedWarpDeployConfig_3[CHAIN_NAME_3].remoteRouters);
130
- expect(remoteRouterKeys2).to.include(chain3Id);
131
- expect(remoteRouterKeys3).to.include(chain2Id);
132
- });
133
- it('should extend an existing warp route and update all destination domains', async () => {
134
- // Read existing config into a file
135
- const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
136
- const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpConfigPath);
137
- warpDeployConfig[CHAIN_NAME_2].gas = 7777;
138
- // Extend with new config
139
- const GAS = 694200;
140
- const extendedConfig = {
141
- decimals: 18,
142
- mailbox: chain2Addresses.mailbox,
143
- name: 'Ether',
144
- owner: new Wallet(ANVIL_KEY).address,
145
- symbol: 'ETH',
146
- type: TokenType.native,
147
- gas: GAS,
148
- };
149
- // Remove remoteRouters and destinationGas as they are written in readWarpConfig
150
- warpDeployConfig[CHAIN_NAME_2].remoteRouters = undefined;
151
- warpDeployConfig[CHAIN_NAME_2].destinationGas = undefined;
152
- warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
153
- writeYamlOrJson(warpConfigPath, warpDeployConfig);
154
- await hyperlaneWarpApply(warpConfigPath, WARP_CORE_CONFIG_PATH_2);
155
- const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
156
- CHAIN_NAME_2,
157
- CHAIN_NAME_3,
158
- ]);
159
- // Check that chain2 is enrolled in chain1
160
- const updatedWarpDeployConfig_2 = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
161
- const chain2Id = await getDomainId(CHAIN_NAME_2, ANVIL_KEY);
162
- const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
163
- // Destination gas should be set in the existing chain (chain2) to include the extended chain (chain3)
164
- const destinationGas_2 = updatedWarpDeployConfig_2[CHAIN_NAME_2].destinationGas;
165
- expect(Object.keys(destinationGas_2)).to.include(chain3Id);
166
- expect(destinationGas_2[chain3Id]).to.equal(GAS.toString());
167
- // Destination gas should be set for the extended chain (chain3)
168
- const updatedWarpDeployConfig_3 = await readWarpConfig(CHAIN_NAME_3, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
169
- const destinationGas_3 = updatedWarpDeployConfig_3[CHAIN_NAME_3].destinationGas;
170
- expect(Object.keys(destinationGas_3)).to.include(chain2Id);
171
- expect(destinationGas_3[chain2Id]).to.equal('7777');
172
- });
173
- it('should recover and re-enroll routers after direct contract-level unenrollment through TokenRouter interface (without having to specify the router table manually)', async () => {
174
- const { multiProvider } = await getContext({
175
- registryUris: [REGISTRY_PATH],
176
- key: ANVIL_KEY,
177
- });
178
- const warpConfigPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
179
- // Initial setup with chain3 using extendWarpConfig
180
- await extendWarpConfig({
181
- chain: CHAIN_NAME_2,
182
- chainToExtend: CHAIN_NAME_3,
183
- extendedConfig: {
184
- decimals: 18,
185
- mailbox: chain2Addresses.mailbox,
186
- name: 'Ether',
187
- owner: new Wallet(ANVIL_KEY).address,
188
- symbol: 'ETH',
189
- type: TokenType.native,
190
- },
191
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
192
- warpDeployPath: warpConfigPath,
193
- });
194
- const COMBINED_WARP_CORE_CONFIG_PATH = getCombinedWarpRoutePath('ETH', [
195
- CHAIN_NAME_2,
196
- CHAIN_NAME_3,
197
- ]);
198
- const warpCoreConfig = readYamlOrJson(COMBINED_WARP_CORE_CONFIG_PATH);
199
- const deployedTokenRoute = warpCoreConfig.tokens.find((t) => t.chainName === CHAIN_NAME_2)?.addressOrDenom;
200
- if (!deployedTokenRoute) {
201
- throw new Error('Failed to find deployed token route address');
202
- }
203
- // Manually call unenrollRemoteRouters
204
- const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
205
- const tokenRouter = TokenRouter__factory.connect(deployedTokenRoute, new Wallet(ANVIL_KEY).connect(multiProvider.getProvider(CHAIN_NAME_2)));
206
- await tokenRouter.unenrollRemoteRouters([chain3Id]);
207
- // Verify the router was unenrolled
208
- const beforeRecoveryConfig = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
209
- expect(Object.keys(beforeRecoveryConfig[CHAIN_NAME_2].remoteRouters || {})).to.not.include(chain3Id.toString());
210
- // Re-extend to fix the configuration
211
- await extendWarpConfig({
212
- chain: CHAIN_NAME_2,
213
- chainToExtend: CHAIN_NAME_3,
214
- extendedConfig: {
215
- decimals: 18,
216
- mailbox: chain2Addresses.mailbox,
217
- name: 'Ether',
218
- owner: new Wallet(ANVIL_KEY).address,
219
- symbol: 'ETH',
220
- type: TokenType.native,
221
- },
222
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
223
- warpDeployPath: warpConfigPath,
224
- });
225
- const recoveredConfig = await readWarpConfig(CHAIN_NAME_2, COMBINED_WARP_CORE_CONFIG_PATH, warpConfigPath);
226
- expect(Object.keys(recoveredConfig[CHAIN_NAME_2].remoteRouters)).to.include(chain3Id.toString());
227
- });
228
- it('should complete warp route extension when previous attempt left incomplete enrollment or destination gas settings (second attempt on new combined config)', async () => {
229
- const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
230
- // Verify initial state - neither chain should be enrolled in the other
231
- const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
232
- const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
233
- // Check remote routers initial state
234
- expect(Object.keys(initialConfig2[CHAIN_NAME_2].remoteRouters)).to.not.include(chain3DomainId);
235
- expect(Object.keys(initialConfig3[CHAIN_NAME_3].remoteRouters)).to.not.include(chain2DomainId);
236
- // Check destination gas initial state
237
- expect(Object.keys(initialConfig2[CHAIN_NAME_2].destinationGas || {})).to.not.include(chain3DomainId);
238
- expect(Object.keys(initialConfig3[CHAIN_NAME_3].destinationGas || {})).to.not.include(chain2DomainId);
239
- // Complete the extension
240
- await extendWarpConfig({
241
- chain: CHAIN_NAME_2,
242
- chainToExtend: CHAIN_NAME_3,
243
- extendedConfig: configToExtend,
244
- warpCorePath: combinedWarpCorePath,
245
- warpDeployPath: warpConfigPath,
246
- });
247
- // Verify both chains are now properly configured
248
- const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
249
- const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
250
- // Check remote routers final state
251
- expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
252
- expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
253
- // Check destination gas final state
254
- expect(Object.keys(finalConfig2[CHAIN_NAME_2].destinationGas)).to.include(chain3DomainId);
255
- expect(Object.keys(finalConfig3[CHAIN_NAME_3].destinationGas)).to.include(chain2DomainId);
256
- });
257
- it('should complete warp route extension when previous attempt left incomplete enrollment or destination gas settings (second attempt with same config)', async () => {
258
- const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
259
- // Verify initial state - neither chain should be enrolled in the other
260
- const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
261
- const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
262
- // Check remote routers initial state
263
- expect(Object.keys(initialConfig2[CHAIN_NAME_2].remoteRouters)).to.not.include(chain3DomainId);
264
- expect(Object.keys(initialConfig3[CHAIN_NAME_3].remoteRouters)).to.not.include(chain2DomainId);
265
- // Check destination gas initial state
266
- expect(Object.keys(initialConfig2[CHAIN_NAME_2].destinationGas || {})).to.not.include(chain3DomainId);
267
- expect(Object.keys(initialConfig3[CHAIN_NAME_3].destinationGas || {})).to.not.include(chain2DomainId);
268
- // Complete the extension
269
- await extendWarpConfig({
270
- chain: CHAIN_NAME_2,
271
- chainToExtend: CHAIN_NAME_3,
272
- extendedConfig: configToExtend,
273
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
274
- warpDeployPath: combinedWarpCorePath,
275
- });
276
- // Verify both chains are now properly configured
277
- const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
278
- const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
279
- // Check remote routers final state
280
- expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
281
- expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
282
- // Check destination gas final state
283
- expect(Object.keys(finalConfig2[CHAIN_NAME_2].destinationGas)).to.include(chain3DomainId);
284
- expect(Object.keys(finalConfig3[CHAIN_NAME_3].destinationGas)).to.include(chain2DomainId);
285
- });
286
- it('should set correct gas values when completing warp route extension (without having to specify the gas table manually)', async () => {
287
- const { chain2DomainId, chain3DomainId, warpConfigPath, configToExtend, combinedWarpCorePath, } = await setupIncompleteWarpRouteExtension(chain2Addresses);
288
- // Verify initial state - gas values should not be set
289
- const initialConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
290
- const initialConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
291
- // Check initial gas values
292
- expect(initialConfig2[CHAIN_NAME_2].destinationGas?.[chain3DomainId]).to.be
293
- .undefined;
294
- expect(initialConfig3[CHAIN_NAME_3].destinationGas?.[chain2DomainId]).to.be
295
- .undefined;
296
- // Set specific gas values for the extension
297
- const customGasValue = '300000';
298
- configToExtend.gas = parseInt(customGasValue);
299
- // Complete the extension with custom gas value
300
- await extendWarpConfig({
301
- chain: CHAIN_NAME_2,
302
- chainToExtend: CHAIN_NAME_3,
303
- extendedConfig: configToExtend,
304
- warpCorePath: combinedWarpCorePath,
305
- warpDeployPath: warpConfigPath,
306
- });
307
- // Verify gas values are correctly set after extension
308
- const finalConfig2 = await readWarpConfig(CHAIN_NAME_2, combinedWarpCorePath, warpConfigPath);
309
- const finalConfig3 = await readWarpConfig(CHAIN_NAME_3, combinedWarpCorePath, warpConfigPath);
310
- // Check gas value is set correctly
311
- expect(finalConfig2[CHAIN_NAME_2].destinationGas[chain3DomainId]).to.equal(customGasValue);
312
- // Verify remote routers are also properly set
313
- expect(Object.keys(finalConfig2[CHAIN_NAME_2].remoteRouters)).to.include(chain3DomainId);
314
- expect(Object.keys(finalConfig3[CHAIN_NAME_3].remoteRouters)).to.include(chain2DomainId);
315
- });
316
- it('should update destination gas configuration', async () => {
317
- const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
318
- // Extend with new config
319
- const config = {
320
- decimals: 18,
321
- mailbox: chain2Addresses.mailbox,
322
- name: 'Ether',
323
- owner: new Wallet(ANVIL_KEY).address,
324
- symbol: 'ETH',
325
- type: TokenType.native,
326
- };
327
- await extendWarpConfig({
328
- chain: CHAIN_NAME_2,
329
- chainToExtend: CHAIN_NAME_3,
330
- extendedConfig: config,
331
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
332
- warpDeployPath,
333
- });
334
- // First read the existing config
335
- const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
336
- // Get the domain ID for chain 3
337
- const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
338
- // Update with new destination gas values
339
- warpDeployConfig[CHAIN_NAME_2].destinationGas = {
340
- [chain3Id]: '500000', // Set a specific gas value for chain 3
341
- };
342
- // Write the updated config
343
- await writeYamlOrJson(warpDeployPath, warpDeployConfig);
344
- // Apply the changes
345
- await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
346
- // Read back the config to verify changes
347
- const updatedConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
348
- // Verify the destination gas was updated correctly
349
- expect(updatedConfig[CHAIN_NAME_2].destinationGas[chain3Id]).to.equal('500000');
350
- });
351
- it('should update remote routers configuration', async () => {
352
- const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
353
- // Extend with new config
354
- const config = {
355
- decimals: 18,
356
- mailbox: chain2Addresses.mailbox,
357
- name: 'Ether',
358
- owner: new Wallet(ANVIL_KEY).address,
359
- symbol: 'ETH',
360
- type: TokenType.native,
361
- };
362
- await extendWarpConfig({
363
- chain: CHAIN_NAME_2,
364
- chainToExtend: CHAIN_NAME_3,
365
- extendedConfig: config,
366
- warpCorePath: WARP_CORE_CONFIG_PATH_2,
367
- warpDeployPath,
368
- });
369
- // First read the existing config
370
- const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
371
- // Get the domain ID for chain 3
372
- const chain3Id = await getDomainId(CHAIN_NAME_3, ANVIL_KEY);
373
- // Generate a new router address to update
374
- const newRouterAddress = randomAddress();
375
- // Update with new remote router values
376
- warpDeployConfig[CHAIN_NAME_2].remoteRouters = {
377
- [chain3Id]: { address: newRouterAddress }, // Set a new router address for chain 3
378
- };
379
- // Write the updated config
380
- await writeYamlOrJson(warpDeployPath, warpDeployConfig);
381
- // Apply the changes
382
- await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
383
- // Read back the config to verify changes
384
- const updatedConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
385
- // Verify the remote router was updated correctly
386
- expect(updatedConfig[CHAIN_NAME_2].remoteRouters[chain3Id].address.toLowerCase()).to.equal(newRouterAddress.toLowerCase());
387
- });
388
- it('should preserve deploy config when extending warp route', async () => {
389
- const warpDeployPath = `${TEMP_PATH}/warp-route-deployment-2.yaml`;
390
- const warpDeployConfig = await readWarpConfig(CHAIN_NAME_2, WARP_CORE_CONFIG_PATH_2, warpDeployPath);
391
- // Extend with new config for chain 3
392
- const extendedConfig = {
393
- decimals: 18,
394
- mailbox: chain2Addresses.mailbox,
395
- name: 'Ether',
396
- owner: new Wallet(ANVIL_KEY).address,
397
- symbol: 'ETH',
398
- type: TokenType.native,
399
- };
400
- warpDeployConfig[CHAIN_NAME_3] = extendedConfig;
401
- // Remove remoteRouters and destinationGas as they are written in readWarpConfig
402
- delete warpDeployConfig[CHAIN_NAME_2].remoteRouters;
403
- delete warpDeployConfig[CHAIN_NAME_2].destinationGas;
404
- await writeYamlOrJson(warpDeployPath, warpDeployConfig);
405
- await hyperlaneWarpApply(warpDeployPath, WARP_CORE_CONFIG_PATH_2);
406
- const updatedConfig = readYamlOrJson(warpDeployPath);
407
- expect(normalizeConfig(warpDeployConfig)).to.deep.equal(normalizeConfig(updatedConfig), 'warp deploy config should remain unchanged after extension');
408
- });
409
- });
410
- //# sourceMappingURL=warp-apply-extend.e2e-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"warp-apply-extend.e2e-test.js","sourceRoot":"","sources":["../../../../src/tests/warp/warp-apply-extend.e2e-test.ts"],"names":[],"mappings":"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"}