@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.
- package/dist/block-explorer/etherscan.d.ts +16 -0
- package/dist/block-explorer/etherscan.d.ts.map +1 -1
- package/dist/block-explorer/etherscan.js +42 -30
- package/dist/block-explorer/etherscan.js.map +1 -1
- package/dist/ccip/consts.d.ts.map +1 -1
- package/dist/ccip/consts.js +0 -80
- package/dist/ccip/consts.js.map +1 -1
- package/dist/consts/multisigIsm.d.ts.map +1 -1
- package/dist/consts/multisigIsm.js +0 -118
- package/dist/consts/multisigIsm.js.map +1 -1
- package/dist/core/types.d.ts +136 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/deploy/proxy.d.ts +41 -4
- package/dist/deploy/proxy.d.ts.map +1 -1
- package/dist/deploy/proxy.js +38 -8
- package/dist/deploy/proxy.js.map +1 -1
- package/dist/deploy/warp.d.ts.map +1 -1
- package/dist/deploy/warp.js +29 -3
- package/dist/deploy/warp.js.map +1 -1
- package/dist/ica/types.d.ts +80 -0
- package/dist/ica/types.d.ts.map +1 -1
- package/dist/ism/EvmIsmModule.d.ts +2 -0
- package/dist/ism/EvmIsmModule.d.ts.map +1 -1
- package/dist/ism/EvmIsmModule.hardhat-test.js +162 -9
- package/dist/ism/EvmIsmModule.hardhat-test.js.map +1 -1
- package/dist/ism/EvmIsmModule.js +35 -8
- package/dist/ism/EvmIsmModule.js.map +1 -1
- package/dist/ism/EvmIsmModule.test.d.ts +2 -0
- package/dist/ism/EvmIsmModule.test.d.ts.map +1 -0
- package/dist/ism/EvmIsmModule.test.js +200 -0
- package/dist/ism/EvmIsmModule.test.js.map +1 -0
- package/dist/ism/EvmIsmReader.d.ts +12 -0
- package/dist/ism/EvmIsmReader.d.ts.map +1 -1
- package/dist/ism/EvmIsmReader.js +29 -12
- package/dist/ism/EvmIsmReader.js.map +1 -1
- package/dist/ism/EvmIsmReader.test.js +227 -8
- package/dist/ism/EvmIsmReader.test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +166 -2
- package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
- package/dist/ism/HyperlaneIsmFactory.js +3 -2
- package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
- package/dist/ism/blacklist.d.ts +62 -0
- package/dist/ism/blacklist.d.ts.map +1 -0
- package/dist/ism/blacklist.js +98 -0
- package/dist/ism/blacklist.js.map +1 -0
- package/dist/ism/types.test.js +20 -1
- package/dist/ism/types.test.js.map +1 -1
- package/dist/ism/utils.d.ts.map +1 -1
- package/dist/ism/utils.js +26 -8
- package/dist/ism/utils.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.d.ts +6 -0
- package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
- package/dist/metadata/ChainMetadataManager.js +21 -16
- package/dist/metadata/ChainMetadataManager.js.map +1 -1
- package/dist/metadata/ChainMetadataManager.test.js +30 -0
- package/dist/metadata/ChainMetadataManager.test.js.map +1 -1
- package/dist/metadata/warpRouteConfig.d.ts +10 -8
- package/dist/metadata/warpRouteConfig.d.ts.map +1 -1
- package/dist/middleware/account/InterchainAccount.d.ts.map +1 -1
- package/dist/middleware/account/InterchainAccount.js +38 -10
- package/dist/middleware/account/InterchainAccount.js.map +1 -1
- package/dist/middleware/account/InterchainAccount.test.js +182 -2
- package/dist/middleware/account/InterchainAccount.test.js.map +1 -1
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js +21 -6
- package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.d.ts +4 -0
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.js +1 -1
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.test.js +82 -0
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
- package/dist/providers/transactionFeeEstimators.d.ts.map +1 -1
- package/dist/providers/transactionFeeEstimators.js +16 -10
- package/dist/providers/transactionFeeEstimators.js.map +1 -1
- package/dist/providers/transactionFeeEstimators.test.js +66 -1
- package/dist/providers/transactionFeeEstimators.test.js.map +1 -1
- package/dist/router/ProxiedRouterDeployer.d.ts.map +1 -1
- package/dist/router/ProxiedRouterDeployer.js +9 -0
- package/dist/router/ProxiedRouterDeployer.js.map +1 -1
- package/dist/router/types.d.ts +80 -0
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/types.js +4 -1
- package/dist/router/types.js.map +1 -1
- package/dist/router/types.test.js +76 -0
- package/dist/router/types.test.js.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.d.ts +14 -0
- package/dist/rpc/evm/EvmEventLogsReader.d.ts.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +209 -3
- package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -1
- package/dist/rpc/evm/EvmEventLogsReader.js +96 -11
- package/dist/rpc/evm/EvmEventLogsReader.js.map +1 -1
- package/dist/rpc/evm/utils.d.ts +7 -11
- package/dist/rpc/evm/utils.d.ts.map +1 -1
- package/dist/rpc/evm/utils.hardhat-test.js +34 -9
- package/dist/rpc/evm/utils.hardhat-test.js.map +1 -1
- package/dist/rpc/evm/utils.js +10 -20
- package/dist/rpc/evm/utils.js.map +1 -1
- package/dist/test/contractDouble.d.ts +8 -0
- package/dist/test/contractDouble.d.ts.map +1 -0
- package/dist/test/contractDouble.js +12 -0
- package/dist/test/contractDouble.js.map +1 -0
- package/dist/timelock/evm/constants.d.ts +1 -0
- package/dist/timelock/evm/constants.d.ts.map +1 -1
- package/dist/timelock/evm/constants.js +1 -0
- package/dist/timelock/evm/constants.js.map +1 -1
- package/dist/timelock/evm/errors.d.ts +2 -0
- package/dist/timelock/evm/errors.d.ts.map +1 -0
- package/dist/timelock/evm/errors.js +19 -0
- package/dist/timelock/evm/errors.js.map +1 -0
- package/dist/timelock/evm/errors.test.d.ts +2 -0
- package/dist/timelock/evm/errors.test.d.ts.map +1 -0
- package/dist/timelock/evm/errors.test.js +33 -0
- package/dist/timelock/evm/errors.test.js.map +1 -0
- package/dist/token/EvmWarpModule.d.ts +17 -0
- package/dist/token/EvmWarpModule.d.ts.map +1 -1
- package/dist/token/EvmWarpModule.hardhat-test.js +144 -0
- package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -1
- package/dist/token/EvmWarpModule.js +191 -6
- package/dist/token/EvmWarpModule.js.map +1 -1
- package/dist/token/EvmWarpModule.test.js +232 -8
- package/dist/token/EvmWarpModule.test.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.d.ts +1 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
- package/dist/token/EvmWarpRouteReader.hardhat-test.js +68 -3
- package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.js +83 -6
- package/dist/token/EvmWarpRouteReader.js.map +1 -1
- package/dist/token/ITokenMetadata.d.ts +3 -2
- package/dist/token/ITokenMetadata.d.ts.map +1 -1
- package/dist/token/Token.d.ts.map +1 -1
- package/dist/token/Token.js +4 -0
- package/dist/token/Token.js.map +1 -1
- package/dist/token/Token.test.js +16 -0
- package/dist/token/Token.test.js.map +1 -1
- package/dist/token/TokenStandard.d.ts +3 -1
- package/dist/token/TokenStandard.d.ts.map +1 -1
- package/dist/token/TokenStandard.js +6 -0
- package/dist/token/TokenStandard.js.map +1 -1
- package/dist/token/config.d.ts +2 -0
- package/dist/token/config.d.ts.map +1 -1
- package/dist/token/config.js +4 -0
- package/dist/token/config.js.map +1 -1
- package/dist/token/configUtils.d.ts +5 -0
- package/dist/token/configUtils.d.ts.map +1 -1
- package/dist/token/configUtils.js +30 -6
- package/dist/token/configUtils.js.map +1 -1
- package/dist/token/configUtils.test.js +21 -1
- package/dist/token/configUtils.test.js.map +1 -1
- package/dist/token/contracts.d.ts +3 -1
- package/dist/token/contracts.d.ts.map +1 -1
- package/dist/token/contracts.js +3 -1
- package/dist/token/contracts.js.map +1 -1
- package/dist/token/deploy.d.ts +3 -1
- package/dist/token/deploy.d.ts.map +1 -1
- package/dist/token/deploy.hardhat-test.js +111 -3
- package/dist/token/deploy.hardhat-test.js.map +1 -1
- package/dist/token/deploy.js +52 -3
- package/dist/token/deploy.js.map +1 -1
- package/dist/token/tokenMetadataUtils.d.ts.map +1 -1
- package/dist/token/tokenMetadataUtils.js +20 -2
- package/dist/token/tokenMetadataUtils.js.map +1 -1
- package/dist/token/types.d.ts +9807 -5533
- package/dist/token/types.d.ts.map +1 -1
- package/dist/token/types.js +49 -3
- package/dist/token/types.js.map +1 -1
- package/dist/token/types.test.js +21 -0
- package/dist/token/types.test.js.map +1 -1
- package/dist/token/warpCheck.d.ts.map +1 -1
- package/dist/token/warpCheck.js +100 -2
- package/dist/token/warpCheck.js.map +1 -1
- package/dist/token/warpCheck.test.js +101 -1
- package/dist/token/warpCheck.test.js.map +1 -1
- package/dist/warp/types.d.ts +5 -4
- package/dist/warp/types.d.ts.map +1 -1
- 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 =
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAGL,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,MAAM,aAAa,GAAG,4CAA4C,CAAC;AACnE,MAAM,eAAe,GAAG,4CAA4C,CAAC;AACrE,MAAM,aAAa,GAAG,4CAA4C,CAAC;AACnE,MAAM,cAAc,GAAG,4CAA4C,CAAC;AACpE,MAAM,mBAAmB,GAAG,4CAA4C,CAAC;AACzE,MAAM,yBAAyB,GAAG,4CAA4C,CAAC;AAC/E,MAAM,yBAAyB,GAAG,4CAA4C,CAAC;AAC/E,MAAM,yBAAyB,GAAG,4CAA4C,CAAC;AAC/E,MAAM,gBAAgB,GAAG,4CAA4C,CAAC;AACtE,MAAM,sBAAsB,GAAG,4CAA4C,CAAC;AAc5E,uEAAuE;AACvE,+EAA+E;AAC/E,4DAA4D;AAC5D,MAAM,YAAa,SAAQ,KAAK;CAAG;AAEnC,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,aAA4B,CAAC;IACjC,IAAI,OAA2B,CAAC;IAEhC,MAAM,YAAY,GAAyB;QACzC,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE;YACN,eAAe,EAAE;gBACf,IAAI,EAAE,UAAU,CAAC,QAAQ;gBACzB,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,qBAAqB;aAC5B;SACF;KACF,CAAC;IAEF,MAAM,cAAc,GAAkD;QACpE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE;YACL,QAAQ,EAAE,yBAAyB;YACnC,QAAQ,EAAE,yBAAyB;SACpC;KACF,CAAC;IAEF,SAAS,aAAa,CAAC,KAAK,GAAG,aAAa;QAC1C,uEAAuE;QACvE,OAAO;YACL,UAAU,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE;SACxB,CAAC;IAChC,CAAC;IAED,SAAS,kBAAkB,CACzB,UAA+C;QAE/C,OAAO;YACL,GAAG,YAAY;YACf,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,QAAQ,EAAE,cAAc;SACzB,CAAC;IACJ,CAAC;IAED,SAAS,mBAAmB,CAAC,GAAG,SAAmB;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,iBAAiB,CAAC,SAAS,EAC3B,gBAAgB,CACjB,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ;YAC/B,2DAA2D;YAC3D,EAAE,OAAO,EAA6D,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,SAAS,gBAAgB,CAAC,GAAG,KAAe;QAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,YAAY;QACnB,mFAAmF;QACnF,OAAO,IAAI,aAAa,CAAC,aAAa,EAAE;YACtC,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,EAAE,kBAAkB,EAAE,cAAc,EAAE;SACA,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,mBAAmB;QAC1B,wEAAwE;QACxE,OAAO,YAAY,EAAqC,CAAC;IAC3D,CAAC;IAED,SAAS,sBAAsB,CAAC,EAC9B,YAAY,GAAG,IAAI,EACnB,WAAW,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAI/D;QACC,OAAO,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC;YAClE,WAAW;YACX,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,OAAe,EAAE,EAAE;gBAC/C,IAAI,IAAI,KAAK,aAAa;oBACxB,OAAO,OAAO,KAAK,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnD,IAAI,IAAI,KAAK,aAAa;oBACxB,OAAO,OAAO,KAAK,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnD,IAAI,IAAI,KAAK,cAAc;oBACzB,OAAO,OAAO,KAAK,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnD,IAAI,IAAI,KAAK,mBAAmB;oBAC9B,OAAO,YAAY,IAAI,OAAO,KAAK,gBAAgB,CAAC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,6EAA6E;SACpB,CAAC,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,aAAa,CAAC,uBAAuB,EAAE,CAAC;QACxD,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,wEAAwE;IACxE,+EAA+E;IAC/E,gFAAgF;IAChF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,UAAU,GAAG,OAAO;aACvB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC;aACzC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEhB,8EAA8E;QAC9E,OAAO;aACJ,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC;YACtC,wEAAwE;aACvE,QAAQ,CAAC,EAA8B,CAAC,CAAC;QAE5C,OAAO;aACJ,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,yBAAyB,CAAC;aACxD,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,WAAW,CACtB,kBAAkB,CAAC;gBACjB,OAAO,EAAE,yBAAyB;gBAClC,KAAK,EAAE,aAAa;aACrB,CAAC,CACH,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CACpC,6DAA6D,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,sBAAsB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC,qBAAqB,CAC/D,gBAAgB,EAChB,cAAc,CACf,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC,qBAAqB,CAC/D,aAAa,EACb,cAAc,CACf,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE;YAC7D,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QACH,sBAAsB,CAAC;YACrB,WAAW,EAAE,KAAK,IAAI,EAAE;gBACtB,MAAM,cAAc,CAAC;YACvB,CAAC;SACF,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,iBAAiB,CAAC,SAAS,EAC3B,gBAAgB,CACjB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,mBAAmB,EAAE,CAAC,iCAAiC,CAC3D,aAAa,CAAC,gBAAgB,CAAC,EAC/B,kBAAkB,EAAE,CACrB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACvC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,eAAe,GAAG,OAAO;aAC5B,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC;aAC3C,WAAW,EAAE;aACb,QAAQ,CAAC,KAAK,CAAC;aACf,YAAY,EAAE;aACd,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;QAE5C,MAAM,WAAW,CAAC,iCAAiC,CACjD,YAAY,EACZ,cAAc,CACf,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,iCAAiC,CACvE,YAAY,EACZ,cAAc,CACf,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI;QAC3B;YACE,mBAAmB;YACnB,CACE,QAA0B,EAC1B,MAA4B,EACV,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;SAC1E;QACD;YACE,wBAAwB;YACxB,CACE,QAA0B,EAC1B,MAA4B,EACV,EAAE,CACpB,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;SACxD;KACO,EAAE,CAAC;QACX,EAAE,CAAC,0DAA0D,IAAI,eAAe,EAAE,KAAK,IAAI,EAAE;YAC3F,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CACxC,mBAAmB,EACnB,SAAS,CACV,CAAC;YACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CACrC,iBAAiB,CAAC,SAAS,EAC3B,gBAAgB,CACjB,CAAC;YACF,MAAM,MAAM,GAAyB;gBACnC,GAAG,kBAAkB,CAAC;oBACpB,OAAO,EAAE,mBAAmB;oBAC5B,KAAK,EAAE,aAAa;iBACrB,CAAC;gBACF,cAAc,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE;aAC1D,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CACpC,0DAA0D,CAC3D,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,uFAAuF;QACvF,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC;YACnD,OAAO,EAAE,mBAAmB;YAC5B,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,yBAAyB;YAC5C,qEAAqE;SACpB,CAAC,CAAC;QACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CACrC,iBAAiB,CAAC,SAAS,EAC3B,gBAAgB,CACjB,CAAC;QACF,MAAM,yBAAyB,GAAG,OAAO,CAAC,IAAI;QAC5C,+EAA+E;QAC/E,iBAAiB,CAAC,SAAgB,EAClC,uBAAuB,CACxB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC,eAAe,CACvD,aAAa,CAAC,KAAK,EACnB;gBACE,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,EAAE;gBAClE,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,cAAc;gBACxB,IAAI,EAAE,SAAS,CAAC,SAAS;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CACpC,oDAAoD,CACrD,CAAC;YACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,mBAAmB,CACpC,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;QACF,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;QAE5C,MAAM,WAAW,CAAC,iCAAiC,CACjD,YAAY,EACZ,cAAc,CACf,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,iCAAiC,CACvE,YAAY,EACZ,cAAc,CACf,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"EvmWarpRouteReader.d.ts","sourceRoot":"","sources":["../../src/token/EvmWarpRouteReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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:
|
|
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();
|