@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.
- package/dist/consts/multisigIsm.d.ts.map +1 -1
- package/dist/consts/multisigIsm.js +0 -64
- package/dist/consts/multisigIsm.js.map +1 -1
- package/dist/deploy/warp.d.ts.map +1 -1
- package/dist/deploy/warp.js +6 -2
- package/dist/deploy/warp.js.map +1 -1
- package/dist/deploy/warp.test.js +62 -1
- package/dist/deploy/warp.test.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.d.ts +1 -1
- package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.js +20 -16
- package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
- package/dist/providers/SmartProvider/SmartProvider.test.js +22 -2
- package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -1
- package/dist/test/errors.d.ts +4 -0
- package/dist/test/errors.d.ts.map +1 -1
- package/dist/test/errors.js +7 -1
- package/dist/test/errors.js.map +1 -1
- package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
- package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
- package/dist/test/fixtures/warp-route-replay/record.js +32 -0
- package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
- package/dist/test/replayRpc.d.ts +82 -0
- package/dist/test/replayRpc.d.ts.map +1 -0
- package/dist/test/replayRpc.js +331 -0
- package/dist/test/replayRpc.js.map +1 -0
- package/dist/test/replayScenarios.d.ts +19 -0
- package/dist/test/replayScenarios.d.ts.map +1 -0
- package/dist/test/replayScenarios.js +89 -0
- package/dist/test/replayScenarios.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.d.ts +1 -0
- package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
- package/dist/token/EvmWarpRouteReader.js +43 -9
- package/dist/token/EvmWarpRouteReader.js.map +1 -1
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
- package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
- package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
- package/dist/token/EvmWarpRouteReader.test.js +187 -40
- package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
- package/dist/utils/contract.d.ts +2 -1
- package/dist/utils/contract.d.ts.map +1 -1
- package/dist/utils/contract.js +29 -3
- package/dist/utils/contract.js.map +1 -1
- package/dist/utils/contract.test.js +63 -0
- package/dist/utils/contract.test.js.map +1 -1
- 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":"AAiCA,OAAO,EACL,OAAO,EAcR,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;AAEtD,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;AAQ9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAUvD,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;
|
|
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
|
|
495
|
-
if (
|
|
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 (
|
|
500
|
-
return
|
|
501
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|