@hyperlane-xyz/sdk 45.0.0 → 45.0.1

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 (47) hide show
  1. package/dist/consts/multisigIsm.d.ts.map +1 -1
  2. package/dist/consts/multisigIsm.js +0 -64
  3. package/dist/consts/multisigIsm.js.map +1 -1
  4. package/dist/deploy/warp.d.ts.map +1 -1
  5. package/dist/deploy/warp.js +6 -2
  6. package/dist/deploy/warp.js.map +1 -1
  7. package/dist/deploy/warp.test.js +62 -1
  8. package/dist/deploy/warp.test.js.map +1 -1
  9. package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -1
  10. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  11. package/dist/providers/SmartProvider/SmartProvider.js +20 -16
  12. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  13. package/dist/providers/SmartProvider/SmartProvider.test.js +22 -2
  14. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
  15. package/dist/test/errors.d.ts +4 -0
  16. package/dist/test/errors.d.ts.map +1 -1
  17. package/dist/test/errors.js +7 -1
  18. package/dist/test/errors.js.map +1 -1
  19. package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
  20. package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
  21. package/dist/test/fixtures/warp-route-replay/record.js +32 -0
  22. package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
  23. package/dist/test/replayRpc.d.ts +82 -0
  24. package/dist/test/replayRpc.d.ts.map +1 -0
  25. package/dist/test/replayRpc.js +331 -0
  26. package/dist/test/replayRpc.js.map +1 -0
  27. package/dist/test/replayScenarios.d.ts +19 -0
  28. package/dist/test/replayScenarios.d.ts.map +1 -0
  29. package/dist/test/replayScenarios.js +89 -0
  30. package/dist/test/replayScenarios.js.map +1 -0
  31. package/dist/token/EvmWarpRouteReader.d.ts +1 -0
  32. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  33. package/dist/token/EvmWarpRouteReader.js +43 -9
  34. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  35. package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
  36. package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
  37. package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
  38. package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
  39. package/dist/token/EvmWarpRouteReader.test.js +187 -40
  40. package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
  41. package/dist/utils/contract.d.ts +2 -1
  42. package/dist/utils/contract.d.ts.map +1 -1
  43. package/dist/utils/contract.js +29 -3
  44. package/dist/utils/contract.js.map +1 -1
  45. package/dist/utils/contract.test.js +63 -0
  46. package/dist/utils/contract.test.js.map +1 -1
  47. package/package.json +10 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayRpc.d.ts","sourceRoot":"","sources":["../../src/test/replayRpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ // eslint-disable-next-line import/no-nodejs-modules
2
+ import { readFileSync } from 'fs';
3
+ // eslint-disable-next-line import/no-nodejs-modules
4
+ import http from 'http';
5
+ // eslint-disable-next-line import/no-nodejs-modules
6
+ import { gunzipSync, gzipSync } from 'zlib';
7
+ import { ProtocolType, assert } from '@hyperlane-xyz/utils';
8
+ import { ExplorerFamily } from '../metadata/chainMetadataTypes.js';
9
+ import { MultiProvider } from '../providers/MultiProvider.js';
10
+ import { EvmWarpRouteReader } from '../token/EvmWarpRouteReader.js';
11
+ export const REPLAY_FIXTURE_DIR = new URL('./fixtures/warp-route-replay/', import.meta.url);
12
+ export const REPLAY_CHAIN_NAME = 'replaychain';
13
+ const RECORDED_METHODS = [
14
+ 'eth_getCode',
15
+ 'eth_getStorageAt',
16
+ 'eth_call',
17
+ 'eth_estimateGas',
18
+ ];
19
+ const CALL_LIKE_METHODS = ['eth_call', 'eth_estimateGas'];
20
+ const GZIP_THRESHOLD = 512;
21
+ // The repo's pre-commit private-key heuristic rejects any added line holding a
22
+ // 64-nibble hex word, which EVM storage slots and ABI words all are. Fixtures
23
+ // store such words split in the middle by an underscore; the loader joins them
24
+ // back, so replayed values are byte-identical to the recorded ones.
25
+ const HEX_WORD_HALVES = /\b((?:0x)?[0-9a-fA-F]{32})([0-9a-fA-F]{32})\b/g;
26
+ const SPLIT_HEX_WORD = /\b((?:0x)?[0-9a-fA-F]{32})_([0-9a-fA-F]{32})\b/g;
27
+ // Providers can echo URLs or API keys in error bodies; fixtures must never
28
+ // carry them.
29
+ const SECRET_LIKE = /https?:\/\/|key=|apikey/i;
30
+ export function serializeReplayFixture(fixture) {
31
+ const text = JSON.stringify(fixture, null, 2);
32
+ assert(!SECRET_LIKE.test(text), `Fixture ${fixture.scenario} contains a URL or key-like text; refusing to serialize it`);
33
+ return `${text.replace(HEX_WORD_HALVES, '$1_$2')}\n`;
34
+ }
35
+ export function parseReplayFixture(text) {
36
+ return JSON.parse(text.replace(SPLIT_HEX_WORD, '$1$2'));
37
+ }
38
+ export function loadReplayFixture(scenario) {
39
+ return parseReplayFixture(readFileSync(new URL(`${scenario}.json`, REPLAY_FIXTURE_DIR), 'utf8'));
40
+ }
41
+ export function recordedResult(request) {
42
+ if (request.resultGzBase64 === undefined)
43
+ return request.result;
44
+ return gunzipSync(Buffer.from(request.resultGzBase64, 'base64')).toString('utf8');
45
+ }
46
+ export function recordedCode(fixture, address) {
47
+ const request = fixture.requests.find((r) => r.method === 'eth_getCode' &&
48
+ r.address?.toLowerCase() === address.toLowerCase());
49
+ return request && recordedResult(request);
50
+ }
51
+ /**
52
+ * Derives a variant of a recording by replacing the recorded response of the
53
+ * eth_call to `to` with calldata starting with `dataPrefix`. Variants are
54
+ * synthetic: only the replaced response is not a recording.
55
+ */
56
+ export function withCallResult(fixture, to, dataPrefix, result) {
57
+ let replaced = 0;
58
+ const requests = fixture.requests.map((r) => {
59
+ if (r.method !== 'eth_call' ||
60
+ r.to?.toLowerCase() !== to.toLowerCase() ||
61
+ !r.data?.startsWith(dataPrefix)) {
62
+ return r;
63
+ }
64
+ replaced += 1;
65
+ return { method: r.method, to: r.to, data: r.data, result };
66
+ });
67
+ assert(replaced === 1, `Expected one recorded call ${to} ${dataPrefix}`);
68
+ return { ...fixture, requests };
69
+ }
70
+ /**
71
+ * Derives a variant of a recording by replacing the recorded response of the
72
+ * eth_call to `to` with calldata starting with `dataPrefix` by a JSON-RPC
73
+ * error.
74
+ */
75
+ export function withCallError(fixture, to, dataPrefix, error) {
76
+ let replaced = 0;
77
+ const requests = fixture.requests.map((r) => {
78
+ if (r.method !== 'eth_call' ||
79
+ r.to?.toLowerCase() !== to.toLowerCase() ||
80
+ !r.data?.startsWith(dataPrefix)) {
81
+ return r;
82
+ }
83
+ replaced += 1;
84
+ return { method: r.method, to: r.to, data: r.data, error };
85
+ });
86
+ assert(replaced === 1, `Expected one recorded call ${to} ${dataPrefix}`);
87
+ return { ...fixture, requests };
88
+ }
89
+ /**
90
+ * Derives a variant of a recording whose storage `slot` at `address` reads as
91
+ * `value`, adding the read when it was not recorded.
92
+ */
93
+ export function withStorage(fixture, address, slot, value) {
94
+ const entry = {
95
+ method: 'eth_getStorageAt',
96
+ address: address.toLowerCase(),
97
+ slot,
98
+ result: value,
99
+ };
100
+ const matches = (r) => r.method === 'eth_getStorageAt' &&
101
+ r.address?.toLowerCase() === address.toLowerCase() &&
102
+ BigInt(r.slot ?? '0x0') === BigInt(slot);
103
+ const requests = fixture.requests.some(matches)
104
+ ? fixture.requests.map((r) => (matches(r) ? entry : r))
105
+ : [...fixture.requests, entry];
106
+ return { ...fixture, requests };
107
+ }
108
+ /**
109
+ * Derives a variant of a recording whose contract code at `address` has
110
+ * `hexSuffix` appended.
111
+ */
112
+ export function withCodeSuffix(fixture, address, hexSuffix) {
113
+ let replaced = 0;
114
+ const requests = fixture.requests.map((r) => {
115
+ if (r.method !== 'eth_getCode' ||
116
+ r.address?.toLowerCase() !== address.toLowerCase()) {
117
+ return r;
118
+ }
119
+ replaced += 1;
120
+ return {
121
+ method: r.method,
122
+ address: r.address,
123
+ result: `${recordedResult(r)}${hexSuffix}`,
124
+ };
125
+ });
126
+ assert(replaced === 1, `Expected one recorded code for ${address}`);
127
+ return { ...fixture, requests };
128
+ }
129
+ function str(value) {
130
+ return typeof value === 'string' ? value.toLowerCase() : '';
131
+ }
132
+ function requestKey(method, params) {
133
+ const [first, second] = params;
134
+ if (CALL_LIKE_METHODS.includes(method)) {
135
+ const call = typeof first === 'object' && first !== null ? first : {};
136
+ return `${method}|${str(Reflect.get(call, 'to'))}|${str(Reflect.get(call, 'data') ?? Reflect.get(call, 'input'))}`;
137
+ }
138
+ if (method === 'eth_getStorageAt') {
139
+ return `${method}|${str(first)}|${BigInt(typeof second === 'string' ? second : '0x0')}`;
140
+ }
141
+ return `${method}|${str(first)}`;
142
+ }
143
+ function recordedKey(request) {
144
+ return requestKey(request.method, CALL_LIKE_METHODS.includes(request.method)
145
+ ? [{ to: request.to, data: request.data }]
146
+ : [request.address, request.slot]);
147
+ }
148
+ function isJsonRpcRequest(value) {
149
+ return (typeof value === 'object' &&
150
+ value !== null &&
151
+ typeof Reflect.get(value, 'method') === 'string');
152
+ }
153
+ function listen(handler, onFailure) {
154
+ const server = http.createServer((req, res) => {
155
+ const chunks = [];
156
+ const respond = (payload) => {
157
+ res.setHeader('content-type', 'application/json');
158
+ res.end(JSON.stringify(payload));
159
+ };
160
+ const fail = (error) => {
161
+ const message = error instanceof Error ? error.message : String(error);
162
+ onFailure(`replay server failure: ${message}`);
163
+ respond({
164
+ jsonrpc: '2.0',
165
+ id: null,
166
+ error: { code: -32603, message: `replay: ${message}` },
167
+ });
168
+ };
169
+ req.on('error', fail);
170
+ req.on('data', (chunk) => chunks.push(chunk));
171
+ req.on('end', async () => {
172
+ try {
173
+ const body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
174
+ const requests = Array.isArray(body) ? body : [body];
175
+ const responses = [];
176
+ for (const request of requests) {
177
+ assert(isJsonRpcRequest(request), 'Malformed JSON-RPC request');
178
+ const params = Array.isArray(request.params) ? request.params : [];
179
+ responses.push({
180
+ jsonrpc: '2.0',
181
+ id: request.id,
182
+ ...(await handler({ ...request, params })),
183
+ });
184
+ }
185
+ respond(Array.isArray(body) ? responses : responses[0]);
186
+ }
187
+ catch (error) {
188
+ fail(error);
189
+ }
190
+ });
191
+ });
192
+ return new Promise((resolve, reject) => {
193
+ server.once('error', reject);
194
+ server.listen(0, '127.0.0.1', () => {
195
+ server.off('error', reject);
196
+ const address = server.address();
197
+ if (!address || typeof address !== 'object') {
198
+ reject(new Error('Replay server not bound'));
199
+ return;
200
+ }
201
+ resolve({ server, url: `http://127.0.0.1:${address.port}` });
202
+ });
203
+ });
204
+ }
205
+ function closer(server) {
206
+ return () => new Promise((resolve) => {
207
+ server.closeAllConnections();
208
+ server.close(() => resolve());
209
+ });
210
+ }
211
+ function chainStateResult(fixtureMeta, method) {
212
+ switch (method) {
213
+ case 'eth_chainId':
214
+ return { result: `0x${fixtureMeta.chainId.toString(16)}` };
215
+ case 'net_version':
216
+ return { result: String(fixtureMeta.chainId) };
217
+ case 'eth_blockNumber':
218
+ return { result: `0x${fixtureMeta.blockNumber.toString(16)}` };
219
+ default:
220
+ return undefined;
221
+ }
222
+ }
223
+ /**
224
+ * Serves the recorded JSON-RPC responses (results and error bodies exactly as
225
+ * recorded). Requests without a recording are answered with an error and listed
226
+ * in `unexpected`.
227
+ */
228
+ export async function startReplayServer(fixture) {
229
+ const recorded = new Map(fixture.requests.map((r) => [recordedKey(r), r]));
230
+ const ethCalls = [];
231
+ const unexpected = [];
232
+ const { server, url } = await listen(async ({ method, params }) => {
233
+ const state = chainStateResult(fixture, method);
234
+ if (state)
235
+ return state;
236
+ const [first] = params;
237
+ if (method === 'eth_call') {
238
+ ethCalls.push(`${str(Reflect.get(Object(first), 'to'))}:${str(Reflect.get(Object(first), 'data'))}`);
239
+ }
240
+ const match = recorded.get(requestKey(method, params));
241
+ if (!match) {
242
+ unexpected.push(`${method} ${JSON.stringify(params)}`);
243
+ return {
244
+ error: { code: -32601, message: 'replay: no recorded response' },
245
+ };
246
+ }
247
+ if (match.error)
248
+ return { error: match.error };
249
+ return { result: recordedResult(match) };
250
+ }, (message) => unexpected.push(message));
251
+ return { url, ethCalls, unexpected, close: closer(server) };
252
+ }
253
+ /**
254
+ * Forwards requests to a real node and records the eth_getCode,
255
+ * eth_getStorageAt, eth_call and eth_estimateGas responses.
256
+ */
257
+ export async function startRecordingServer(upstreamUrl, meta) {
258
+ const upstream = async (method, params) => {
259
+ const response = await fetch(upstreamUrl, {
260
+ method: 'POST',
261
+ headers: { 'content-type': 'application/json' },
262
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
263
+ });
264
+ return response.json();
265
+ };
266
+ const blockNumber = Number(BigInt((await upstream('eth_blockNumber', [])).result));
267
+ const fixture = {
268
+ ...meta,
269
+ blockNumber,
270
+ capturedAt: new Date().toISOString(),
271
+ requests: [],
272
+ };
273
+ const failures = [];
274
+ const { server, url } = await listen(async ({ method, params }) => {
275
+ const state = chainStateResult(fixture, method);
276
+ if (state)
277
+ return state;
278
+ const body = await upstream(method, params);
279
+ if (RECORDED_METHODS.includes(method)) {
280
+ const [first, second] = params;
281
+ const request = { method };
282
+ if (CALL_LIKE_METHODS.includes(method)) {
283
+ request.to = str(Reflect.get(Object(first), 'to'));
284
+ request.data = str(Reflect.get(Object(first), 'data'));
285
+ }
286
+ else {
287
+ request.address = str(first);
288
+ if (method === 'eth_getStorageAt')
289
+ request.slot = str(second);
290
+ }
291
+ if (body.error)
292
+ request.error = body.error;
293
+ else if (typeof body.result === 'string') {
294
+ if (body.result.length > GZIP_THRESHOLD) {
295
+ request.resultGzBase64 = gzipSync(body.result).toString('base64');
296
+ }
297
+ else
298
+ request.result = body.result;
299
+ }
300
+ if (!fixture.requests.some((r) => recordedKey(r) === recordedKey(request)))
301
+ fixture.requests.push(request);
302
+ }
303
+ return body.error ? { error: body.error } : { result: body.result };
304
+ }, (message) => failures.push(message));
305
+ return { url, fixture, failures, close: closer(server) };
306
+ }
307
+ export function createReplayReader(rpcUrl, chainId) {
308
+ const multiProvider = new MultiProvider({
309
+ [REPLAY_CHAIN_NAME]: {
310
+ name: REPLAY_CHAIN_NAME,
311
+ chainId,
312
+ domainId: chainId,
313
+ protocol: ProtocolType.Ethereum,
314
+ rpcUrls: [{ http: rpcUrl }],
315
+ nativeToken: { decimals: 18, name: 'Ether', symbol: 'ETH' },
316
+ blockExplorers: [
317
+ {
318
+ name: 'replay',
319
+ url: 'http://127.0.0.1',
320
+ apiUrl: 'http://127.0.0.1',
321
+ family: ExplorerFamily.Other,
322
+ },
323
+ ],
324
+ },
325
+ });
326
+ return {
327
+ reader: new EvmWarpRouteReader(multiProvider, REPLAY_CHAIN_NAME),
328
+ provider: multiProvider.getProvider(REPLAY_CHAIN_NAME),
329
+ };
330
+ }
331
+ //# sourceMappingURL=replayRpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayRpc.js","sourceRoot":"","sources":["../../src/test/replayRpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type providers } from 'ethers';
2
+ import type { EvmWarpRouteReader } from '../token/EvmWarpRouteReader.js';
3
+ export interface ReplayProbe {
4
+ to: string;
5
+ signature: string;
6
+ args: unknown[];
7
+ }
8
+ export interface ReplayScenario {
9
+ scenario: string;
10
+ chain: string;
11
+ chainId: number;
12
+ router: string;
13
+ run(reader: EvmWarpRouteReader, router: string): Promise<unknown>;
14
+ probes: ReplayProbe[];
15
+ }
16
+ export declare const REPLAY_SCENARIOS: ReplayScenario[];
17
+ export declare const EXPECTED_TOKEN_TYPE: "collateral";
18
+ export declare function runProbe(provider: providers.Provider, probe: ReplayProbe): Promise<unknown>;
19
+ //# sourceMappingURL=replayScenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayScenarios.d.ts","sourceRoot":"","sources":["../../src/test/replayScenarios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IAEX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA+E5C,CAAC;AAEF,eAAO,MAAM,mBAAmB,cAAuB,CAAC;AAExD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,OAAO,CAAC,CAQlB"}
@@ -0,0 +1,89 @@
1
+ import { Contract } from 'ethers';
2
+ import { TokenType } from '../token/config.js';
3
+ export const REPLAY_SCENARIOS = [
4
+ {
5
+ scenario: 'bat-aleo-ethereum-collateral',
6
+ chain: 'ethereum',
7
+ chainId: 1,
8
+ router: '0x516e156e987175d74614cc2bC960f148A610f0b3',
9
+ run: (reader, router) => reader.deriveTokenType(router),
10
+ probes: [
11
+ {
12
+ to: '0x0D8775F648430679A709E98d2b0Cb6250d2887EF',
13
+ signature: 'mintingCurrentLimitOf(address) view returns (uint256)',
14
+ args: ['0x516e156e987175d74614cc2bC960f148A610f0b3'],
15
+ },
16
+ ],
17
+ },
18
+ {
19
+ scenario: 'magic-abstract-base-router',
20
+ chain: 'base',
21
+ chainId: 8453,
22
+ router: '0xF1572d1Da5c3CcE14eE5a1c9327d17e9ff0E3f43',
23
+ run: (reader, router) => reader.fetchScale(router),
24
+ probes: [
25
+ {
26
+ to: '0xF1572d1Da5c3CcE14eE5a1c9327d17e9ff0E3f43',
27
+ signature: 'scale() view returns (uint256)',
28
+ args: [],
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ scenario: 'usdc-lukso-router',
34
+ chain: 'lukso',
35
+ chainId: 42,
36
+ router: '0xE0C2e4F894D4Cd33626e33b24582559F3156E1Ab',
37
+ run: async (reader, router) => ({
38
+ feeHook: await reader.fetchFeeHook(router),
39
+ scale: await reader.fetchScale(router),
40
+ }),
41
+ probes: [
42
+ {
43
+ to: '0xE0C2e4F894D4Cd33626e33b24582559F3156E1Ab',
44
+ signature: 'feeHook() view returns (address)',
45
+ args: [],
46
+ },
47
+ ],
48
+ },
49
+ {
50
+ scenario: 'lyx-lukso-native-router',
51
+ chain: 'lukso',
52
+ chainId: 42,
53
+ router: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
54
+ run: (reader, router) => reader.deriveWarpRouteConfig(router),
55
+ probes: [
56
+ {
57
+ to: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
58
+ signature: 'feeRecipient() view returns (address)',
59
+ args: [],
60
+ },
61
+ {
62
+ to: '0xC210B2cB65ed3484892167F5e05F7ab496Ab0598',
63
+ signature: 'feeHook() view returns (address)',
64
+ args: [],
65
+ },
66
+ ],
67
+ },
68
+ {
69
+ scenario: 'blend-fluent-collateral',
70
+ chain: 'fluent',
71
+ chainId: 25363,
72
+ router: '0x2bef59e84615371304bd731601f6344F5F304504',
73
+ run: (reader, router) => reader.deriveTokenType(router),
74
+ probes: [
75
+ {
76
+ to: '0x1385B8f55A84f2BdA13EeD4099d29Eae03d553b2',
77
+ signature: 'mintingCurrentLimitOf(address) view returns (uint256)',
78
+ args: ['0x2bef59e84615371304bd731601f6344F5F304504'],
79
+ },
80
+ ],
81
+ },
82
+ ];
83
+ export const EXPECTED_TOKEN_TYPE = TokenType.collateral;
84
+ export async function runProbe(provider, probe) {
85
+ const contract = new Contract(probe.to, [`function ${probe.signature}`], provider);
86
+ const name = probe.signature.slice(0, probe.signature.indexOf('('));
87
+ return contract[name](...probe.args);
88
+ }
89
+ //# sourceMappingURL=replayScenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayScenarios.js","sourceRoot":"","sources":["../../src/test/replayScenarios.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,7 @@ export declare class EvmWarpRouteReader extends EvmRouterReader {
70
70
  private fetchImplementationBytecode;
71
71
  private readonly implementationBytecodeCache;
72
72
  private fetchImplementationBytecodeCached;
73
+ private implementationSelectorStatus;
73
74
  /**
74
75
  * Checks whether the implementation bytecode contains the selector.
75
76
  * Returns undefined when the bytecode is empty/unreadable or is unresolved
@@ -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":"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"}
@@ -36,6 +36,14 @@ function containsDelegateCall(bytecode) {
36
36
  }
37
37
  return false;
38
38
  }
39
+ const SelectorStatus = {
40
+ Present: 'present',
41
+ Absent: 'absent',
42
+ // selector absent but the bytecode contains DELEGATECALL, so it may forward
43
+ Forwarding: 'forwarding',
44
+ // beacon proxy, unreadable or empty code
45
+ Unresolved: 'unresolved',
46
+ };
39
47
  const REBALANCING_CONTRACT_VERSION = '8.0.0';
40
48
  export const TOKEN_FEE_CONTRACT_VERSION = '10.0.0';
41
49
  // version that introduced the fractional scale interface
@@ -484,6 +492,16 @@ export class EvmWarpRouteReader extends EvmRouterReader {
484
492
  });
485
493
  return pending;
486
494
  }
495
+ async implementationSelectorStatus(address, selector) {
496
+ const bytecode = await this.fetchImplementationBytecodeCached(address);
497
+ if (isNullish(bytecode) || isStorageEmpty(bytecode))
498
+ return SelectorStatus.Unresolved;
499
+ if (bytecode.includes(strip0x(selector)))
500
+ return SelectorStatus.Present;
501
+ if (containsDelegateCall(bytecode))
502
+ return SelectorStatus.Forwarding;
503
+ return SelectorStatus.Absent;
504
+ }
487
505
  /**
488
506
  * Checks whether the implementation bytecode contains the selector.
489
507
  * Returns undefined when the bytecode is empty/unreadable or is unresolved
@@ -491,14 +509,12 @@ export class EvmWarpRouteReader extends EvmRouterReader {
491
509
  * handling.
492
510
  */
493
511
  async implementationHasSelector(address, selector) {
494
- const bytecode = await this.fetchImplementationBytecodeCached(address);
495
- if (isNullish(bytecode) || isStorageEmpty(bytecode))
496
- return undefined;
497
- if (bytecode.includes(strip0x(selector)))
512
+ const status = await this.implementationSelectorStatus(address, selector);
513
+ if (status === SelectorStatus.Present)
498
514
  return true;
499
- if (containsDelegateCall(bytecode))
500
- return undefined;
501
- return false;
515
+ if (status === SelectorStatus.Absent)
516
+ return false;
517
+ return undefined;
502
518
  }
503
519
  /**
504
520
  * Derives the token type for a given Warp Route address using specific methods
@@ -1209,12 +1225,30 @@ export class EvmWarpRouteReader extends EvmRouterReader {
1209
1225
  }
1210
1226
  else {
1211
1227
  // Read old format (single scale value) using low-level call
1212
- if ((await this.implementationHasSelector(tokenRouterAddress, LEGACY_SCALE_INTERFACE.getSighash('scale()'))) === false) {
1228
+ const scaleStatus = await this.implementationSelectorStatus(tokenRouterAddress, LEGACY_SCALE_INTERFACE.getSighash('scale()'));
1229
+ if (scaleStatus === SelectorStatus.Absent) {
1213
1230
  this.logger.debug(`Router at address "${tokenRouterAddress}" on chain "${this.chain}" reports ${packageVersion} but has no scale() getter; treating as identity`);
1214
1231
  return undefined;
1215
1232
  }
1216
1233
  const legacyContract = new Contract(tokenRouterAddress, LEGACY_SCALE_INTERFACE, this.provider);
1217
- const scale = await legacyContract.scale();
1234
+ let scale;
1235
+ try {
1236
+ scale = await legacyContract.scale();
1237
+ }
1238
+ catch (error) {
1239
+ // scale() is immutable, so a getter the bytecode proves present must
1240
+ // answer. An empty provider response only reads as a missing getter
1241
+ // when the code is known to forward; for unresolved code it may hide
1242
+ // a real scale.
1243
+ if (scaleStatus === SelectorStatus.Present)
1244
+ throw error;
1245
+ if (scaleStatus === SelectorStatus.Forwarding)
1246
+ throwIfNotMissingSelector(error);
1247
+ else
1248
+ throwIfNotMissingSelectorRevert(error);
1249
+ this.logger.debug(`Router at address "${tokenRouterAddress}" on chain "${this.chain}" reports ${packageVersion} but scale() reverted or returned nothing (${scaleStatus} implementation); treating as identity`, error);
1250
+ return undefined;
1251
+ }
1218
1252
  result = { numerator: scale.toBigInt(), denominator: 1n };
1219
1253
  }
1220
1254
  // Omit identity scale so derived config matches deploy configs that