@hyperlane-xyz/sdk 41.1.0 → 41.3.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.
Files changed (177) hide show
  1. package/dist/block-explorer/etherscan.d.ts +16 -0
  2. package/dist/block-explorer/etherscan.d.ts.map +1 -1
  3. package/dist/block-explorer/etherscan.js +42 -30
  4. package/dist/block-explorer/etherscan.js.map +1 -1
  5. package/dist/ccip/consts.d.ts.map +1 -1
  6. package/dist/ccip/consts.js +0 -80
  7. package/dist/ccip/consts.js.map +1 -1
  8. package/dist/consts/multisigIsm.d.ts.map +1 -1
  9. package/dist/consts/multisigIsm.js +0 -118
  10. package/dist/consts/multisigIsm.js.map +1 -1
  11. package/dist/core/types.d.ts +136 -0
  12. package/dist/core/types.d.ts.map +1 -1
  13. package/dist/deploy/proxy.d.ts +41 -4
  14. package/dist/deploy/proxy.d.ts.map +1 -1
  15. package/dist/deploy/proxy.js +38 -8
  16. package/dist/deploy/proxy.js.map +1 -1
  17. package/dist/deploy/warp.d.ts.map +1 -1
  18. package/dist/deploy/warp.js +29 -3
  19. package/dist/deploy/warp.js.map +1 -1
  20. package/dist/ica/types.d.ts +80 -0
  21. package/dist/ica/types.d.ts.map +1 -1
  22. package/dist/ism/EvmIsmModule.d.ts +2 -0
  23. package/dist/ism/EvmIsmModule.d.ts.map +1 -1
  24. package/dist/ism/EvmIsmModule.hardhat-test.js +162 -9
  25. package/dist/ism/EvmIsmModule.hardhat-test.js.map +1 -1
  26. package/dist/ism/EvmIsmModule.js +35 -8
  27. package/dist/ism/EvmIsmModule.js.map +1 -1
  28. package/dist/ism/EvmIsmModule.test.d.ts +2 -0
  29. package/dist/ism/EvmIsmModule.test.d.ts.map +1 -0
  30. package/dist/ism/EvmIsmModule.test.js +200 -0
  31. package/dist/ism/EvmIsmModule.test.js.map +1 -0
  32. package/dist/ism/EvmIsmReader.d.ts +12 -0
  33. package/dist/ism/EvmIsmReader.d.ts.map +1 -1
  34. package/dist/ism/EvmIsmReader.js +29 -12
  35. package/dist/ism/EvmIsmReader.js.map +1 -1
  36. package/dist/ism/EvmIsmReader.test.js +227 -8
  37. package/dist/ism/EvmIsmReader.test.js.map +1 -1
  38. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  39. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +166 -2
  40. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  41. package/dist/ism/HyperlaneIsmFactory.js +3 -2
  42. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  43. package/dist/ism/blacklist.d.ts +62 -0
  44. package/dist/ism/blacklist.d.ts.map +1 -0
  45. package/dist/ism/blacklist.js +98 -0
  46. package/dist/ism/blacklist.js.map +1 -0
  47. package/dist/ism/types.test.js +20 -1
  48. package/dist/ism/types.test.js.map +1 -1
  49. package/dist/ism/utils.d.ts.map +1 -1
  50. package/dist/ism/utils.js +26 -8
  51. package/dist/ism/utils.js.map +1 -1
  52. package/dist/metadata/ChainMetadataManager.d.ts +6 -0
  53. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
  54. package/dist/metadata/ChainMetadataManager.js +21 -16
  55. package/dist/metadata/ChainMetadataManager.js.map +1 -1
  56. package/dist/metadata/ChainMetadataManager.test.js +30 -0
  57. package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
  58. package/dist/metadata/warpRouteConfig.d.ts +10 -8
  59. package/dist/metadata/warpRouteConfig.d.ts.map +1 -1
  60. package/dist/middleware/account/InterchainAccount.d.ts.map +1 -1
  61. package/dist/middleware/account/InterchainAccount.js +38 -10
  62. package/dist/middleware/account/InterchainAccount.js.map +1 -1
  63. package/dist/middleware/account/InterchainAccount.test.js +182 -2
  64. package/dist/middleware/account/InterchainAccount.test.js.map +1 -1
  65. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts.map +1 -1
  66. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js +21 -6
  67. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js.map +1 -1
  68. package/dist/providers/SmartProvider/SmartProvider.d.ts +4 -0
  69. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  70. package/dist/providers/SmartProvider/SmartProvider.js +1 -1
  71. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  72. package/dist/providers/SmartProvider/SmartProvider.test.js +82 -0
  73. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  74. package/dist/providers/transactionFeeEstimators.d.ts.map +1 -1
  75. package/dist/providers/transactionFeeEstimators.js +16 -10
  76. package/dist/providers/transactionFeeEstimators.js.map +1 -1
  77. package/dist/providers/transactionFeeEstimators.test.js +66 -1
  78. package/dist/providers/transactionFeeEstimators.test.js.map +1 -1
  79. package/dist/router/ProxiedRouterDeployer.d.ts.map +1 -1
  80. package/dist/router/ProxiedRouterDeployer.js +9 -0
  81. package/dist/router/ProxiedRouterDeployer.js.map +1 -1
  82. package/dist/router/types.d.ts +80 -0
  83. package/dist/router/types.d.ts.map +1 -1
  84. package/dist/router/types.js +4 -1
  85. package/dist/router/types.js.map +1 -1
  86. package/dist/router/types.test.js +76 -0
  87. package/dist/router/types.test.js.map +1 -1
  88. package/dist/rpc/evm/EvmEventLogsReader.d.ts +14 -0
  89. package/dist/rpc/evm/EvmEventLogsReader.d.ts.map +1 -1
  90. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +209 -3
  91. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
  92. package/dist/rpc/evm/EvmEventLogsReader.js +96 -11
  93. package/dist/rpc/evm/EvmEventLogsReader.js.map +1 -1
  94. package/dist/rpc/evm/utils.d.ts +7 -11
  95. package/dist/rpc/evm/utils.d.ts.map +1 -1
  96. package/dist/rpc/evm/utils.hardhat-test.js +34 -9
  97. package/dist/rpc/evm/utils.hardhat-test.js.map +1 -1
  98. package/dist/rpc/evm/utils.js +10 -20
  99. package/dist/rpc/evm/utils.js.map +1 -1
  100. package/dist/test/contractDouble.d.ts +8 -0
  101. package/dist/test/contractDouble.d.ts.map +1 -0
  102. package/dist/test/contractDouble.js +12 -0
  103. package/dist/test/contractDouble.js.map +1 -0
  104. package/dist/timelock/evm/constants.d.ts +1 -0
  105. package/dist/timelock/evm/constants.d.ts.map +1 -1
  106. package/dist/timelock/evm/constants.js +1 -0
  107. package/dist/timelock/evm/constants.js.map +1 -1
  108. package/dist/timelock/evm/errors.d.ts +2 -0
  109. package/dist/timelock/evm/errors.d.ts.map +1 -0
  110. package/dist/timelock/evm/errors.js +19 -0
  111. package/dist/timelock/evm/errors.js.map +1 -0
  112. package/dist/timelock/evm/errors.test.d.ts +2 -0
  113. package/dist/timelock/evm/errors.test.d.ts.map +1 -0
  114. package/dist/timelock/evm/errors.test.js +33 -0
  115. package/dist/timelock/evm/errors.test.js.map +1 -0
  116. package/dist/token/EvmWarpModule.d.ts +17 -0
  117. package/dist/token/EvmWarpModule.d.ts.map +1 -1
  118. package/dist/token/EvmWarpModule.hardhat-test.js +144 -0
  119. package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -1
  120. package/dist/token/EvmWarpModule.js +191 -6
  121. package/dist/token/EvmWarpModule.js.map +1 -1
  122. package/dist/token/EvmWarpModule.test.js +232 -8
  123. package/dist/token/EvmWarpModule.test.js.map +1 -1
  124. package/dist/token/EvmWarpRouteReader.d.ts +1 -0
  125. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  126. package/dist/token/EvmWarpRouteReader.hardhat-test.js +68 -3
  127. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
  128. package/dist/token/EvmWarpRouteReader.js +83 -6
  129. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  130. package/dist/token/ITokenMetadata.d.ts +3 -2
  131. package/dist/token/ITokenMetadata.d.ts.map +1 -1
  132. package/dist/token/Token.d.ts.map +1 -1
  133. package/dist/token/Token.js +4 -0
  134. package/dist/token/Token.js.map +1 -1
  135. package/dist/token/Token.test.js +16 -0
  136. package/dist/token/Token.test.js.map +1 -1
  137. package/dist/token/TokenStandard.d.ts +3 -1
  138. package/dist/token/TokenStandard.d.ts.map +1 -1
  139. package/dist/token/TokenStandard.js +6 -0
  140. package/dist/token/TokenStandard.js.map +1 -1
  141. package/dist/token/config.d.ts +2 -0
  142. package/dist/token/config.d.ts.map +1 -1
  143. package/dist/token/config.js +4 -0
  144. package/dist/token/config.js.map +1 -1
  145. package/dist/token/configUtils.d.ts +5 -0
  146. package/dist/token/configUtils.d.ts.map +1 -1
  147. package/dist/token/configUtils.js +30 -6
  148. package/dist/token/configUtils.js.map +1 -1
  149. package/dist/token/configUtils.test.js +21 -1
  150. package/dist/token/configUtils.test.js.map +1 -1
  151. package/dist/token/contracts.d.ts +3 -1
  152. package/dist/token/contracts.d.ts.map +1 -1
  153. package/dist/token/contracts.js +3 -1
  154. package/dist/token/contracts.js.map +1 -1
  155. package/dist/token/deploy.d.ts +3 -1
  156. package/dist/token/deploy.d.ts.map +1 -1
  157. package/dist/token/deploy.hardhat-test.js +111 -3
  158. package/dist/token/deploy.hardhat-test.js.map +1 -1
  159. package/dist/token/deploy.js +52 -3
  160. package/dist/token/deploy.js.map +1 -1
  161. package/dist/token/tokenMetadataUtils.d.ts.map +1 -1
  162. package/dist/token/tokenMetadataUtils.js +20 -2
  163. package/dist/token/tokenMetadataUtils.js.map +1 -1
  164. package/dist/token/types.d.ts +9807 -5533
  165. package/dist/token/types.d.ts.map +1 -1
  166. package/dist/token/types.js +49 -3
  167. package/dist/token/types.js.map +1 -1
  168. package/dist/token/types.test.js +21 -0
  169. package/dist/token/types.test.js.map +1 -1
  170. package/dist/token/warpCheck.d.ts.map +1 -1
  171. package/dist/token/warpCheck.js +100 -2
  172. package/dist/token/warpCheck.js.map +1 -1
  173. package/dist/token/warpCheck.test.js +101 -1
  174. package/dist/token/warpCheck.test.js.map +1 -1
  175. package/dist/warp/types.d.ts +5 -4
  176. package/dist/warp/types.d.ts.map +1 -1
  177. package/package.json +11 -11
@@ -1,20 +1,36 @@
1
1
  import { expect } from 'chai';
2
+ import { BigNumber } from 'ethers';
2
3
  import sinon from 'sinon';
4
+ import { ProxyAdmin__factory, TimelockController__factory, } from '@hyperlane-xyz/core';
3
5
  import { TestChainName } from '../consts/testChains.js';
6
+ import { HyperlaneDeployer } from '../deploy/HyperlaneDeployer.js';
4
7
  import { MultiProvider } from '../providers/MultiProvider.js';
8
+ import { CANCELLER_ROLE, EXECUTOR_ROLE, PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE, } from '../timelock/evm/constants.js';
5
9
  import { EvmWarpModule } from './EvmWarpModule.js';
6
10
  import { EvmXERC20Module } from './EvmXERC20Module.js';
7
11
  import { TokenType } from './config.js';
12
+ import { HypERC20Deployer } from './deploy.js';
8
13
  import { XERC20Type, } from './types.js';
9
14
  const TOKEN_ADDRESS = '0x1111111111111111111111111111111111111111';
10
15
  const MAILBOX_ADDRESS = '0x2222222222222222222222222222222222222222';
11
16
  const OWNER_ADDRESS = '0x3333333333333333333333333333333333333333';
12
17
  const ROUTER_ADDRESS = '0x4444444444444444444444444444444444444444';
18
+ const PROXY_ADMIN_ADDRESS = '0x5555555555555555555555555555555555555555';
19
+ const OTHER_PROXY_ADMIN_ADDRESS = '0x6666666666666666666666666666666666666666';
20
+ const TIMELOCK_PROPOSER_ADDRESS = '0x7777777777777777777777777777777777777777';
21
+ const TIMELOCK_EXECUTOR_ADDRESS = '0x8888888888888888888888888888888888888888';
22
+ const TIMELOCK_ADDRESS = '0x9999999999999999999999999999999999999999';
23
+ const OTHER_TIMELOCK_ADDRESS = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
13
24
  // Sentinel thrown by the createTokenFeeUpdateTxs stub to short-circuit
14
25
  // updateSplit immediately after the module.update() call, so the test does not
15
26
  // need to stub the ~20 downstream create*UpdateTxs helpers.
16
27
  class ShortCircuit extends Error {
17
28
  }
29
+ function errorMessage(error) {
30
+ if (!(error instanceof Error))
31
+ throw error;
32
+ return error.message;
33
+ }
18
34
  describe('EvmWarpModule', () => {
19
35
  let multiProvider;
20
36
  let sandbox;
@@ -31,6 +47,75 @@ describe('EvmWarpModule', () => {
31
47
  },
32
48
  },
33
49
  };
50
+ const timelockConfig = {
51
+ delay: 259200,
52
+ roles: {
53
+ executor: TIMELOCK_EXECUTOR_ADDRESS,
54
+ proposer: TIMELOCK_PROPOSER_ADDRESS,
55
+ },
56
+ };
57
+ function proxiedConfig(owner = OWNER_ADDRESS) {
58
+ // CAST: only proxyAdmin fields are read by the tested planning helper.
59
+ return {
60
+ proxyAdmin: { address: PROXY_ADMIN_ADDRESS, owner },
61
+ };
62
+ }
63
+ function configWithTimelock(proxyAdmin) {
64
+ return {
65
+ ...xERC20Config,
66
+ ...(proxyAdmin ? { proxyAdmin } : {}),
67
+ timelock: timelockConfig,
68
+ };
69
+ }
70
+ function stubDeployTimelocks(...addresses) {
71
+ const deployStub = sandbox.stub(HyperlaneDeployer.prototype, 'deployTimelock');
72
+ for (const [index, address] of addresses.entries()) {
73
+ deployStub.onCall(index).resolves(
74
+ // CAST: test needs only deployTimelock's returned address.
75
+ { address });
76
+ }
77
+ return deployStub;
78
+ }
79
+ function stubContractCode(...codes) {
80
+ const provider = multiProvider.getProvider(TestChainName.test1);
81
+ const getCode = sandbox.stub(provider, 'getCode');
82
+ for (const [index, code] of codes.entries()) {
83
+ getCode.onCall(index).resolves(code);
84
+ }
85
+ if (codes.length === 1)
86
+ getCode.resolves(codes[0]);
87
+ sandbox.stub(multiProvider, 'getProvider').returns(provider);
88
+ return getCode;
89
+ }
90
+ function createModule() {
91
+ // CAST: deploy-time fixture only needs the address fields used by update planning.
92
+ return new EvmWarpModule(multiProvider, {
93
+ chain: TestChainName.test1,
94
+ config: xERC20Config,
95
+ addresses: { deployedTokenRoute: ROUTER_ADDRESS },
96
+ });
97
+ }
98
+ function createModuleForTest() {
99
+ // CAST: tests intentionally exercise private planning helpers directly.
100
+ return createModule();
101
+ }
102
+ function stubTimelockController({ hasAdminSelf = true, getMinDelay = async () => BigNumber.from(timelockConfig.delay), }) {
103
+ return sandbox.stub(TimelockController__factory, 'connect').returns({
104
+ getMinDelay,
105
+ hasRole: async (role, account) => {
106
+ if (role === PROPOSER_ROLE)
107
+ return account === timelockConfig.roles.proposer;
108
+ if (role === EXECUTOR_ROLE)
109
+ return account === timelockConfig.roles.executor;
110
+ if (role === CANCELLER_ROLE)
111
+ return account === timelockConfig.roles.proposer;
112
+ if (role === TIMELOCK_ADMIN_ROLE)
113
+ return hasAdminSelf && account === TIMELOCK_ADDRESS;
114
+ return false;
115
+ },
116
+ // CAST: test stub implements only the TimelockController methods under test.
117
+ });
118
+ }
34
119
  beforeEach(() => {
35
120
  multiProvider = MultiProvider.createTestMultiProvider();
36
121
  sandbox = sinon.createSandbox();
@@ -54,14 +139,7 @@ describe('EvmWarpModule', () => {
54
139
  sandbox
55
140
  .stub(EvmWarpModule.prototype, 'createTokenFeeUpdateTxs')
56
141
  .rejects(new ShortCircuit());
57
- const module = new EvmWarpModule(multiProvider,
58
- // CAST: only deployedTokenRoute is read before the short-circuit; the
59
- // proxy-factory addresses in WarpRouteAddresses are never touched.
60
- {
61
- chain: TestChainName.test1,
62
- config: xERC20Config,
63
- addresses: { deployedTokenRoute: ROUTER_ADDRESS },
64
- });
142
+ const module = createModule();
65
143
  try {
66
144
  await module.updateSplit(xERC20Config);
67
145
  expect.fail('expected updateSplit to short-circuit via ShortCircuit');
@@ -73,5 +151,151 @@ describe('EvmWarpModule', () => {
73
151
  expect(updateStub.firstCall.args).to.have.length(1);
74
152
  expect(updateStub.firstCall.args[1]).to.equal(undefined);
75
153
  });
154
+ it('rejects timelock while changing ProxyAdmin address', async () => {
155
+ sandbox.stub(EvmWarpModule.prototype, 'read').resolves(proxiedConfig());
156
+ const module = createModule();
157
+ try {
158
+ await module.updateSplit(configWithTimelock({
159
+ address: OTHER_PROXY_ADMIN_ADDRESS,
160
+ owner: OWNER_ADDRESS,
161
+ }));
162
+ expect.fail('expected timelock plus ProxyAdmin address change to reject');
163
+ }
164
+ catch (error) {
165
+ expect(errorMessage(error)).to.include('Cannot configure timelock while changing ProxyAdmin address');
166
+ }
167
+ });
168
+ it('does not reuse a timelock missing self-admin', async () => {
169
+ stubContractCode('0x1234');
170
+ stubTimelockController({ hasAdminSelf: false });
171
+ const matches = await createModuleForTest().timelockMatchesConfig(TIMELOCK_ADDRESS, timelockConfig);
172
+ expect(matches).to.equal(false);
173
+ });
174
+ it('does not call the timelock ABI for an EOA ProxyAdmin owner', async () => {
175
+ const getCodeStub = stubContractCode('0x');
176
+ const connectStub = sandbox.stub(TimelockController__factory, 'connect');
177
+ const matches = await createModuleForTest().timelockMatchesConfig(OWNER_ADDRESS, timelockConfig);
178
+ expect(matches).to.equal(false);
179
+ expect(getCodeStub.calledOnce).to.equal(true);
180
+ expect(connectStub.called).to.equal(false);
181
+ });
182
+ it('propagates transient timelock reads without deploying a replacement', async () => {
183
+ stubContractCode('0x1234');
184
+ const transientError = Object.assign(new Error('rpc timeout'), {
185
+ code: 'SERVER_ERROR',
186
+ });
187
+ stubTimelockController({
188
+ getMinDelay: async () => {
189
+ throw transientError;
190
+ },
191
+ });
192
+ const deployStub = sandbox.stub(HyperlaneDeployer.prototype, 'deployTimelock');
193
+ try {
194
+ await createModuleForTest().configWithTimelockProxyAdminOwner(proxiedConfig(TIMELOCK_ADDRESS), configWithTimelock());
195
+ expect.fail('expected transient timelock read failure to propagate');
196
+ }
197
+ catch (error) {
198
+ expect(error).to.equal(transientError);
199
+ expect(deployStub.called).to.equal(false);
200
+ }
201
+ });
202
+ it('retries cached timelock reads before deploying another controller', async () => {
203
+ const firstModule = createModuleForTest();
204
+ const secondModule = createModuleForTest();
205
+ sandbox.stub(firstModule, 'timelockMatchesConfig').resolves(false);
206
+ const secondMatchStub = sandbox
207
+ .stub(secondModule, 'timelockMatchesConfig')
208
+ .onFirstCall()
209
+ .resolves(false)
210
+ .onSecondCall()
211
+ .resolves(true);
212
+ const getCodeStub = stubContractCode('0x', '0x', '0x1234');
213
+ const deployStub = stubDeployTimelocks(TIMELOCK_ADDRESS);
214
+ const actualConfig = proxiedConfig();
215
+ const expectedConfig = configWithTimelock();
216
+ await firstModule.configWithTimelockProxyAdminOwner(actualConfig, expectedConfig);
217
+ const secondConfig = await secondModule.configWithTimelockProxyAdminOwner(actualConfig, expectedConfig);
218
+ expect(deployStub.callCount).to.equal(1);
219
+ expect(getCodeStub.callCount).to.equal(3);
220
+ expect(secondMatchStub.calledTwice).to.equal(true);
221
+ expect(secondConfig.proxyAdmin?.owner).to.equal(TIMELOCK_ADDRESS);
222
+ });
223
+ for (const [name, deploy] of [
224
+ [
225
+ 'route-wide deploy',
226
+ (deployer, config) => deployer.deploy({ [TestChainName.test1]: config }),
227
+ ],
228
+ [
229
+ 'direct deployContracts',
230
+ (deployer, config) => deployer.deployContracts(TestChainName.test1, config),
231
+ ],
232
+ ]) {
233
+ it(`rejects timelock with ownerOverrides.proxyAdmin before ${name} side effects`, async () => {
234
+ const proxyAdminConnectStub = sandbox.stub(ProxyAdmin__factory, 'connect');
235
+ const deployTimelockStub = sandbox.stub(HyperlaneDeployer.prototype, 'deployTimelock');
236
+ const config = {
237
+ ...configWithTimelock({
238
+ address: PROXY_ADMIN_ADDRESS,
239
+ owner: OWNER_ADDRESS,
240
+ }),
241
+ ownerOverrides: { proxyAdmin: OTHER_PROXY_ADMIN_ADDRESS },
242
+ };
243
+ try {
244
+ await deploy(new HypERC20Deployer(multiProvider), config);
245
+ expect.fail('expected conflicting ProxyAdmin ownership to reject');
246
+ }
247
+ catch (error) {
248
+ expect(errorMessage(error)).to.include('Cannot configure timelock with ownerOverrides.proxyAdmin');
249
+ }
250
+ expect(proxyAdminConnectStub.called).to.equal(false);
251
+ expect(deployTimelockStub.called).to.equal(false);
252
+ });
253
+ }
254
+ it('rejects fresh timelock deploy with foreign-owned supplied ProxyAdmin before deploying', async () => {
255
+ // CAST: ProxyAdmin__factory.connect is stubbed, so the signer object is not inspected.
256
+ sandbox.stub(multiProvider, 'getSigner').returns({});
257
+ sandbox.stub(multiProvider, 'getSignerAddress').resolves(OWNER_ADDRESS);
258
+ sandbox.stub(ProxyAdmin__factory, 'connect').returns({
259
+ address: PROXY_ADMIN_ADDRESS,
260
+ owner: async () => OTHER_PROXY_ADMIN_ADDRESS,
261
+ // CAST: test stub implements only the ProxyAdmin methods under test.
262
+ });
263
+ const deployTimelockStub = sandbox.stub(HyperlaneDeployer.prototype, 'deployTimelock');
264
+ const deployProxiedContractStub = sandbox.stub(
265
+ // CAST: protected inherited method is stubbed only to assert it is not called.
266
+ HyperlaneDeployer.prototype, 'deployProxiedContract');
267
+ try {
268
+ await new HypERC20Deployer(multiProvider).deployContracts(TestChainName.test1, {
269
+ decimals: 18,
270
+ mailbox: MAILBOX_ADDRESS,
271
+ name: 'Token',
272
+ owner: OWNER_ADDRESS,
273
+ proxyAdmin: { address: PROXY_ADMIN_ADDRESS, owner: OWNER_ADDRESS },
274
+ symbol: 'TOKEN',
275
+ timelock: timelockConfig,
276
+ type: TokenType.synthetic,
277
+ });
278
+ expect.fail('expected foreign-owned ProxyAdmin to reject');
279
+ }
280
+ catch (error) {
281
+ expect(errorMessage(error)).to.include('Cannot configure timelock with supplied ProxyAdmin');
282
+ expect(deployTimelockStub.called).to.equal(false);
283
+ expect(deployProxiedContractStub.called).to.equal(false);
284
+ }
285
+ });
286
+ it('redeploys a cached timelock when the cached address no longer matches', async () => {
287
+ const firstModule = createModuleForTest();
288
+ const secondModule = createModuleForTest();
289
+ sandbox.stub(firstModule, 'timelockMatchesConfig').resolves(false);
290
+ sandbox.stub(secondModule, 'timelockMatchesConfig').resolves(false);
291
+ stubContractCode('0x1234');
292
+ const deployStub = stubDeployTimelocks(TIMELOCK_ADDRESS, OTHER_TIMELOCK_ADDRESS);
293
+ const actualConfig = proxiedConfig();
294
+ const expectedConfig = configWithTimelock();
295
+ await firstModule.configWithTimelockProxyAdminOwner(actualConfig, expectedConfig);
296
+ const secondConfig = await secondModule.configWithTimelockProxyAdminOwner(actualConfig, expectedConfig);
297
+ expect(deployStub.calledTwice).to.equal(true);
298
+ expect(secondConfig.proxyAdmin?.owner).to.equal(OTHER_TIMELOCK_ADDRESS);
299
+ });
76
300
  });
77
301
  //# sourceMappingURL=EvmWarpModule.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EvmWarpModule.test.js","sourceRoot":"","sources":["../../src/token/EvmWarpModule.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EvmWarpModule.test.js","sourceRoot":"","sources":["../../src/token/EvmWarpModule.test.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,7 @@ export declare class EvmWarpRouteReader extends EvmRouterReader {
74
74
  private deriveHypCollateralCctpTokenConfig;
75
75
  private deriveHypCollateralDepositAddressTokenConfig;
76
76
  private deriveHypCollateralOftTokenConfig;
77
+ private deriveAtomicLocalRebalancingBridgeTokenConfig;
77
78
  private deriveHypCollateralTokenConfig;
78
79
  private deriveHypCollateralFiatTokenConfig;
79
80
  private deriveHypCollateralVaultTokenConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"EvmWarpRouteReader.d.ts","sourceRoot":"","sources":["../../src/token/EvmWarpRouteReader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EvmWarpRouteReader.d.ts","sourceRoot":"","sources":["../../src/token/EvmWarpRouteReader.ts"],"names":[],"mappings":"AAiCA,OAAO,EACL,OAAO,EAaR,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,8BAA8B,EAE/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAiB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAO9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQvD,OAAO,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAIL,0BAA0B,EAE1B,wBAAwB,EAGxB,cAAc,EAEd,2BAA2B,EAK3B,WAAW,EACX,aAAa,EAEb,mBAAmB,EAKpB,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,0BAA0B,WAAW,CAAC;AAanD,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,eAAO,MAAM,0BAA0B,WAAW,CAAC;AAQnD,qBAAa,kBAAmB,SAAQ,eAAe;IAsBnD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAC/C,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IACvC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM;IAvBxC,SAAS,CAAC,QAAQ,CAAC,MAAM,oCAEtB;IACH,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAG7C;IAIJ,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAC7C,SAAS,EACT,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CACvD,CAAC;IACF,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,iBAAiB,CAAC;IAErC,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,YACqB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,aAAa,EACpB,WAAW,GAAE,MAA0C,EAC1E,gBAAgB,CAAC,EAAE,gBAAgB,EAoDpC;IAED;;;;;;OAMG;IACG,qBAAqB,CACzB,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,wBAAwB,CAAC,CAsLnC;IAED;;;;;;;;OAQG;YACW,4BAA4B;IAkD1C,OAAO,CAAC,0BAA0B;IAgBrB,YAAY,CACvB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAc9B;IAED,OAAO,CAAC,yBAAyB;IAUpB,aAAa,CACxB,aAAa,EAAE,OAAO,EACtB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,sBAAsB,CAAC,EAAE,8BAA8B,GACtD,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAmD5C;IAEK,6BAA6B,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,uDAqDrE;IAEK,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,wCAiDtD;IAEK,4BAA4B,CAChC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,2BAA2B,CAAC,CAYtC;IAED;;;;;OAKG;IACG,eAAe,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA2MnE;YAEa,iBAAiB;YAoCjB,oBAAoB;IAkC5B,iBAAiB,CACrB,aAAa,EAAE,OAAO,EACtB,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;IAED;;;;;;OAMG;IACG,gBAAgB,CACpB,IAAI,EAAE,SAAS,EACf,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CAuBzB;YAEa,0BAA0B;YAwB1B,iCAAiC;YAyBjC,kCAAkC;YAsElC,4CAA4C;YAuC5C,iCAAiC;YAiCjC,6CAA6C;YA6B7C,8BAA8B;YAuB9B,kCAAkC;YAYlC,mCAAmC;YAgBnC,yCAAyC;YAgBzC,6BAA6B;YAe7B,0BAA0B;YAuB1B,qBAAqB;YAmBrB,qBAAqB;YAsBrB,8BAA8B;YAyB9B,+BAA+B;YA+D/B,mCAAmC;YAqBnC,0CAA0C;IA+BxD;;OAEG;YACW,gCAAgC;IAmHxC,kBAAkB,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAStE;IAED;;;;;;;OAOG;IACG,UAAU,CACd,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgDtC;IAEK,mBAAmB,CAAC,OAAO,EAAE,OAAO,mBAEzC;IAEK,qBAAqB,CACzB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;IAEK,mBAAmB,CACvB,gBAAgB,EAAE,OAAO,EACzB,iBAAiB,GAAE,MAAM,EAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CA0BzB;CACF"}
@@ -797,10 +797,20 @@ describe('EvmWarpRouteReader', async () => {
797
797
  const remoteDomain = 31338;
798
798
  const localRouter = addressToBytes32('0x3000000000000000000000000000000000000003');
799
799
  const remoteRouter = addressToBytes32('0x4000000000000000000000000000000000000004');
800
+ const rebalanceTarget = addressToBytes32('0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
801
+ const rebalanceRecipient = addressToBytes32('0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
800
802
  const expectedScale = {
801
803
  numerator: 1n,
802
804
  denominator: 1000000000000n,
803
805
  };
806
+ const rebalanceTargetsStub = sinon
807
+ .stub()
808
+ .callsFake(async (domain) => domain === localDomain ? [rebalanceTarget] : []);
809
+ const allowedRecipientStub = sinon
810
+ .stub()
811
+ .callsFake(async (domain) => domain === localDomain
812
+ ? rebalanceRecipient
813
+ : hre.ethers.constants.HashZero);
804
814
  const mcConnectStub = sinon
805
815
  .stub(CrossCollateralRouter__factory, 'connect')
806
816
  .returns({
@@ -812,6 +822,8 @@ describe('EvmWarpRouteReader', async () => {
812
822
  getCrossCollateralRouters: sinon
813
823
  .stub()
814
824
  .callsFake(async (domain) => domain === localDomain ? [localRouter] : [remoteRouter]),
825
+ rebalanceTargets: rebalanceTargetsStub,
826
+ allowedRecipient: allowedRecipientStub,
815
827
  });
816
828
  const tokenRouterConnectStub = sinon
817
829
  .stub(TokenRouter__factory, 'connect')
@@ -829,6 +841,9 @@ describe('EvmWarpRouteReader', async () => {
829
841
  const scaleStub = sinon
830
842
  .stub(evmERC20WarpRouteReader, 'fetchScale')
831
843
  .resolves(expectedScale);
844
+ const packageVersionStub = sinon
845
+ .stub(evmERC20WarpRouteReader, 'fetchPackageVersion')
846
+ .resolves('12.0.0');
832
847
  const deriveCrossCollateralTokenConfig = evmERC20WarpRouteReader
833
848
  .deriveCrossCollateralTokenConfig;
834
849
  try {
@@ -840,12 +855,52 @@ describe('EvmWarpRouteReader', async () => {
840
855
  [localDomain.toString()]: [localRouter],
841
856
  [remoteDomain.toString()]: [remoteRouter],
842
857
  });
858
+ expect(derivedConfig.rebalanceTargets).to.deep.equal({
859
+ [localDomain.toString()]: [rebalanceTarget],
860
+ });
861
+ expect(derivedConfig.rebalanceRecipients).to.deep.equal({
862
+ [localDomain.toString()]: rebalanceRecipient,
863
+ });
864
+ packageVersionStub.resolves('11.3.1');
865
+ rebalanceTargetsStub.resetHistory();
866
+ rebalanceTargetsStub.resetBehavior();
867
+ rebalanceTargetsStub.rejects(new Error('Invalid response from provider'));
868
+ const legacyConfig = await deriveCrossCollateralTokenConfig.call(evmERC20WarpRouteReader, routerAddress);
869
+ expect(legacyConfig.rebalanceTargets).to.equal(undefined);
870
+ expect(legacyConfig.rebalanceRecipients).to.deep.equal({
871
+ [localDomain.toString()]: rebalanceRecipient,
872
+ });
873
+ sinon.assert.notCalled(rebalanceTargetsStub);
874
+ const missingSelector = Object.assign(new Error('missing selector'), {
875
+ code: 'CALL_EXCEPTION',
876
+ data: '0x',
877
+ });
878
+ allowedRecipientStub.resetBehavior();
879
+ allowedRecipientStub.rejects(missingSelector);
880
+ const legacyRecipientConfig = await deriveCrossCollateralTokenConfig.call(evmERC20WarpRouteReader, routerAddress);
881
+ expect(legacyRecipientConfig.rebalanceRecipients).to.equal(undefined);
882
+ packageVersionStub.resolves('12.0.0');
883
+ rebalanceTargetsStub.resetBehavior();
884
+ rebalanceTargetsStub.rejects(new Error('RPC unavailable'));
885
+ let error;
886
+ try {
887
+ await deriveCrossCollateralTokenConfig.call(evmERC20WarpRouteReader, routerAddress);
888
+ }
889
+ catch (caught) {
890
+ error = caught;
891
+ }
892
+ expect(error).to.be.instanceOf(Error);
893
+ if (!(error instanceof Error)) {
894
+ throw new Error('Expected RPC error');
895
+ }
896
+ expect(error.message).to.include('RPC unavailable');
843
897
  }
844
898
  finally {
845
899
  mcConnectStub.restore();
846
900
  tokenRouterConnectStub.restore();
847
901
  metadataStub.restore();
848
902
  scaleStub.restore();
903
+ packageVersionStub.restore();
849
904
  }
850
905
  });
851
906
  it('fetchDestinationGas includes MC-enrolled domains via additionalDomains', async () => {
@@ -898,10 +953,11 @@ describe('EvmWarpRouteReader', async () => {
898
953
  tokenRouterStub.restore();
899
954
  }
900
955
  });
901
- it('deriveWarpRouteConfig includes CCR-only destinations when deriving token fees', async () => {
956
+ it('deriveWarpRouteConfig includes CCR-only fee destinations and local allowed bridges', async () => {
902
957
  const routerAddress = token.address;
903
958
  const localDomain = multiProvider.getDomainId(chain);
904
959
  const ccrOnlyDomain = localDomain + 100;
960
+ const localBridge = '0x1000000000000000000000000000000000000003';
905
961
  const readRouterConfigStub = sinon
906
962
  .stub(evmERC20WarpRouteReader, 'readRouterConfig')
907
963
  .resolves({
@@ -928,20 +984,29 @@ describe('EvmWarpRouteReader', async () => {
928
984
  const fetchTokenFeeStub = sinon
929
985
  .stub(evmERC20WarpRouteReader, 'fetchTokenFee')
930
986
  .resolves(undefined);
987
+ const allowedBridgesStub = sinon
988
+ .stub()
989
+ .callsFake(async (domain) => Number(domain) === localDomain ? [localBridge] : []);
931
990
  const movableConnectStub = sinon
932
991
  .stub(MovableCollateralRouter__factory, 'connect')
933
992
  .returns({
934
993
  allowedRebalancers: sinon.stub().resolves([]),
935
994
  domains: sinon.stub().resolves([]),
936
- allowedBridges: sinon.stub().resolves([]),
995
+ allowedBridges: allowedBridgesStub,
937
996
  });
938
997
  try {
939
- await evmERC20WarpRouteReader.deriveWarpRouteConfig(routerAddress);
998
+ const config = await evmERC20WarpRouteReader.deriveWarpRouteConfig(routerAddress);
940
999
  expect(fetchTokenFeeStub.calledOnce).to.equal(true);
941
1000
  expect(fetchTokenFeeStub.firstCall.args[1]).to.deep.equal([
942
1001
  localDomain,
943
1002
  ccrOnlyDomain,
944
1003
  ]);
1004
+ expect('allowedRebalancingBridges' in config
1005
+ ? config.allowedRebalancingBridges
1006
+ : undefined).to.deep.equal({
1007
+ [localDomain]: [{ bridge: localBridge }],
1008
+ });
1009
+ sinon.assert.calledWith(allowedBridgesStub, localDomain.toString());
945
1010
  }
946
1011
  finally {
947
1012
  readRouterConfigStub.restore();