@pancakeswap/multicall 3.6.0 → 3.6.2
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/CallStats.d.ts +8 -0
- package/dist/CallStats.d.ts.map +1 -0
- package/dist/constants/contracts.d.ts.map +1 -1
- package/dist/index.js +52 -5
- package/dist/index.mjs +53 -6
- package/dist/multicall.d.ts +1 -0
- package/dist/multicall.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MulticallRequestWithGas } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Update the sliding‐window stats.
|
|
4
|
+
* @param calls Array of new calls to record
|
|
5
|
+
* @param windowMs How far back (in ms) to keep data (e.g. 1000 or 5000)
|
|
6
|
+
*/
|
|
7
|
+
export declare function logStatsInDev(calls: MulticallRequestWithGas[], windowMs?: number): void;
|
|
8
|
+
//# sourceMappingURL=CallStats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallStats.d.ts","sourceRoot":"","sources":["../src/CallStats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAyBjD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,uBAAuB,EAAE,EAChC,QAAQ,SAAO,QAgDhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/constants/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,eAAO,MAAM,iBAAiB,EAAE;KAAG,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/constants/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,eAAO,MAAM,iBAAiB,EAAE;KAAG,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO;CAqB3D,CAAA;AAED,eAAO,MAAM,kBAAkB,+CAA+C,CAAA;AAE9E,eAAO,MAAM,oBAAoB,EAAE;KAChC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO;CAiB3B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,8 @@ var MULTICALL_ADDRESS = {
|
|
|
25
25
|
[chains.ChainId.LINEA_TESTNET]: "0x990010b6DBA3e7faa025790bC0433A9f690c65F3",
|
|
26
26
|
[chains.ChainId.BASE_TESTNET]: "0x6F7f93D929d6FBaF16c245e42846EF21aee23437",
|
|
27
27
|
[chains.ChainId.OPBNB_TESTNET]: "0x6A70ED893D85cf6D4059e1CF3e63a48e4D204D32",
|
|
28
|
-
[chains.ChainId.SCROLL_SEPOLIA]: "0x052a99849Ef2e13a5CB28275862991671D4b6fF5"
|
|
28
|
+
[chains.ChainId.SCROLL_SEPOLIA]: "0x052a99849Ef2e13a5CB28275862991671D4b6fF5",
|
|
29
|
+
[chains.ChainId.MONAD_TESTNET]: "0xF490DB8D37520bb41d45B79a1c5749A1FdA9f4Ea"
|
|
29
30
|
};
|
|
30
31
|
var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
31
32
|
var MULTICALL3_ADDRESSES = {
|
|
@@ -42,7 +43,8 @@ var MULTICALL3_ADDRESSES = {
|
|
|
42
43
|
[chains.ChainId.OPBNB]: MULTICALL3_ADDRESS,
|
|
43
44
|
[chains.ChainId.OPBNB_TESTNET]: MULTICALL3_ADDRESS,
|
|
44
45
|
[chains.ChainId.BASE_TESTNET]: MULTICALL3_ADDRESS,
|
|
45
|
-
[chains.ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS
|
|
46
|
+
[chains.ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS,
|
|
47
|
+
[chains.ChainId.MONAD_TESTNET]: MULTICALL3_ADDRESS
|
|
46
48
|
};
|
|
47
49
|
var DEFAULT_BLOCK_CONFLICT_TOLERANCE = 0;
|
|
48
50
|
var BLOCK_CONFLICT_TOLERANCE = {
|
|
@@ -384,6 +386,47 @@ function abortInvariant(signal, message) {
|
|
|
384
386
|
function isViemAbortError(e) {
|
|
385
387
|
return e instanceof viem.BaseError && e.walk((err) => err instanceof viem.TimeoutError) instanceof viem.TimeoutError;
|
|
386
388
|
}
|
|
389
|
+
var stats = {};
|
|
390
|
+
var statsCalls = [];
|
|
391
|
+
var uniqTargets = /* @__PURE__ */ new Set();
|
|
392
|
+
var last = Date.now();
|
|
393
|
+
function logStatsInDev(calls, windowMs = 5e3) {
|
|
394
|
+
if (process.env.NODE_ENV !== "development") {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
statsCalls.push({
|
|
398
|
+
timestamp: Date.now(),
|
|
399
|
+
callNumber: calls.length,
|
|
400
|
+
targets: [...new Set(calls.map((call2) => call2.target))]
|
|
401
|
+
});
|
|
402
|
+
statsCalls = statsCalls.filter((call2) => call2.timestamp >= Date.now() - windowMs);
|
|
403
|
+
const now = Date.now();
|
|
404
|
+
for (const call2 of calls) {
|
|
405
|
+
const { target } = call2;
|
|
406
|
+
if (!uniqTargets.has(target)) {
|
|
407
|
+
console.log("target", call2.target);
|
|
408
|
+
uniqTargets.add(target);
|
|
409
|
+
}
|
|
410
|
+
const h = viem.keccak256(`0x${target}${call2.callData}`);
|
|
411
|
+
if (!stats[target]) {
|
|
412
|
+
stats[target] = { events: [], total: 0, uniq: 0 };
|
|
413
|
+
}
|
|
414
|
+
stats[target].events.push({ timestamp: now, hash: h });
|
|
415
|
+
}
|
|
416
|
+
const cutoff = now - windowMs;
|
|
417
|
+
for (const [target, stat] of Object.entries(stats)) {
|
|
418
|
+
stat.events = stat.events.filter((e) => e.timestamp >= cutoff);
|
|
419
|
+
stat.total = stat.events.length;
|
|
420
|
+
const uniqHashes = new Set(stat.events.map((e) => e.hash));
|
|
421
|
+
stat.uniq = uniqHashes.size;
|
|
422
|
+
}
|
|
423
|
+
const elapsed = Date.now() - last;
|
|
424
|
+
if (elapsed > 5e3) {
|
|
425
|
+
last = Date.now();
|
|
426
|
+
console.log(`Sliding call stats`, stats);
|
|
427
|
+
console.log(`history calls`, statsCalls);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
387
430
|
|
|
388
431
|
// src/getBlockConflictTolerance.ts
|
|
389
432
|
function getBlockConflictTolerance(chainId) {
|
|
@@ -400,6 +443,7 @@ async function multicallByGasLimit(calls, {
|
|
|
400
443
|
retryFailedCallsWithGreaterLimit,
|
|
401
444
|
...rest
|
|
402
445
|
}) {
|
|
446
|
+
logStatsInDev(calls);
|
|
403
447
|
const gasLimit = await getGasLimit({
|
|
404
448
|
chainId,
|
|
405
449
|
gasBuffer,
|
|
@@ -416,8 +460,13 @@ async function multicallByGasLimit(calls, {
|
|
|
416
460
|
if (!retryFailedCallsWithGreaterLimit) {
|
|
417
461
|
return callResult;
|
|
418
462
|
}
|
|
419
|
-
const { gasLimitMultiplier: retryGasLimitMultiplier } = retryFailedCallsWithGreaterLimit;
|
|
463
|
+
const { gasLimitMultiplier: retryGasLimitMultiplier, maxRetry = 2 } = retryFailedCallsWithGreaterLimit;
|
|
464
|
+
let retry = 0;
|
|
420
465
|
async function retryFailedCalls(result) {
|
|
466
|
+
retry += 1;
|
|
467
|
+
if (retry > maxRetry) {
|
|
468
|
+
return result;
|
|
469
|
+
}
|
|
421
470
|
if (result.results.every((r) => r.success)) {
|
|
422
471
|
return result;
|
|
423
472
|
}
|
|
@@ -612,5 +661,3 @@ exports.getMulticallContract = getMulticallContract;
|
|
|
612
661
|
exports.iMulticallABI = iMulticallABI;
|
|
613
662
|
exports.multicall3ABI = multicall3ABI;
|
|
614
663
|
exports.multicallByGasLimit = multicallByGasLimit;
|
|
615
|
-
//# sourceMappingURL=out.js.map
|
|
616
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChainId } from '@pancakeswap/chains';
|
|
2
|
-
import { getContract, BaseError, TimeoutError } from 'viem';
|
|
2
|
+
import { getContract, keccak256, BaseError, TimeoutError } from 'viem';
|
|
3
3
|
|
|
4
4
|
// ../utils/toBigInt.ts
|
|
5
5
|
function toBigInt(num) {
|
|
@@ -23,7 +23,8 @@ var MULTICALL_ADDRESS = {
|
|
|
23
23
|
[ChainId.LINEA_TESTNET]: "0x990010b6DBA3e7faa025790bC0433A9f690c65F3",
|
|
24
24
|
[ChainId.BASE_TESTNET]: "0x6F7f93D929d6FBaF16c245e42846EF21aee23437",
|
|
25
25
|
[ChainId.OPBNB_TESTNET]: "0x6A70ED893D85cf6D4059e1CF3e63a48e4D204D32",
|
|
26
|
-
[ChainId.SCROLL_SEPOLIA]: "0x052a99849Ef2e13a5CB28275862991671D4b6fF5"
|
|
26
|
+
[ChainId.SCROLL_SEPOLIA]: "0x052a99849Ef2e13a5CB28275862991671D4b6fF5",
|
|
27
|
+
[ChainId.MONAD_TESTNET]: "0xF490DB8D37520bb41d45B79a1c5749A1FdA9f4Ea"
|
|
27
28
|
};
|
|
28
29
|
var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
29
30
|
var MULTICALL3_ADDRESSES = {
|
|
@@ -40,7 +41,8 @@ var MULTICALL3_ADDRESSES = {
|
|
|
40
41
|
[ChainId.OPBNB]: MULTICALL3_ADDRESS,
|
|
41
42
|
[ChainId.OPBNB_TESTNET]: MULTICALL3_ADDRESS,
|
|
42
43
|
[ChainId.BASE_TESTNET]: MULTICALL3_ADDRESS,
|
|
43
|
-
[ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS
|
|
44
|
+
[ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS,
|
|
45
|
+
[ChainId.MONAD_TESTNET]: MULTICALL3_ADDRESS
|
|
44
46
|
};
|
|
45
47
|
var DEFAULT_BLOCK_CONFLICT_TOLERANCE = 0;
|
|
46
48
|
var BLOCK_CONFLICT_TOLERANCE = {
|
|
@@ -382,6 +384,47 @@ function abortInvariant(signal, message) {
|
|
|
382
384
|
function isViemAbortError(e) {
|
|
383
385
|
return e instanceof BaseError && e.walk((err) => err instanceof TimeoutError) instanceof TimeoutError;
|
|
384
386
|
}
|
|
387
|
+
var stats = {};
|
|
388
|
+
var statsCalls = [];
|
|
389
|
+
var uniqTargets = /* @__PURE__ */ new Set();
|
|
390
|
+
var last = Date.now();
|
|
391
|
+
function logStatsInDev(calls, windowMs = 5e3) {
|
|
392
|
+
if (process.env.NODE_ENV !== "development") {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
statsCalls.push({
|
|
396
|
+
timestamp: Date.now(),
|
|
397
|
+
callNumber: calls.length,
|
|
398
|
+
targets: [...new Set(calls.map((call2) => call2.target))]
|
|
399
|
+
});
|
|
400
|
+
statsCalls = statsCalls.filter((call2) => call2.timestamp >= Date.now() - windowMs);
|
|
401
|
+
const now = Date.now();
|
|
402
|
+
for (const call2 of calls) {
|
|
403
|
+
const { target } = call2;
|
|
404
|
+
if (!uniqTargets.has(target)) {
|
|
405
|
+
console.log("target", call2.target);
|
|
406
|
+
uniqTargets.add(target);
|
|
407
|
+
}
|
|
408
|
+
const h = keccak256(`0x${target}${call2.callData}`);
|
|
409
|
+
if (!stats[target]) {
|
|
410
|
+
stats[target] = { events: [], total: 0, uniq: 0 };
|
|
411
|
+
}
|
|
412
|
+
stats[target].events.push({ timestamp: now, hash: h });
|
|
413
|
+
}
|
|
414
|
+
const cutoff = now - windowMs;
|
|
415
|
+
for (const [target, stat] of Object.entries(stats)) {
|
|
416
|
+
stat.events = stat.events.filter((e) => e.timestamp >= cutoff);
|
|
417
|
+
stat.total = stat.events.length;
|
|
418
|
+
const uniqHashes = new Set(stat.events.map((e) => e.hash));
|
|
419
|
+
stat.uniq = uniqHashes.size;
|
|
420
|
+
}
|
|
421
|
+
const elapsed = Date.now() - last;
|
|
422
|
+
if (elapsed > 5e3) {
|
|
423
|
+
last = Date.now();
|
|
424
|
+
console.log(`Sliding call stats`, stats);
|
|
425
|
+
console.log(`history calls`, statsCalls);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
385
428
|
|
|
386
429
|
// src/getBlockConflictTolerance.ts
|
|
387
430
|
function getBlockConflictTolerance(chainId) {
|
|
@@ -398,6 +441,7 @@ async function multicallByGasLimit(calls, {
|
|
|
398
441
|
retryFailedCallsWithGreaterLimit,
|
|
399
442
|
...rest
|
|
400
443
|
}) {
|
|
444
|
+
logStatsInDev(calls);
|
|
401
445
|
const gasLimit = await getGasLimit({
|
|
402
446
|
chainId,
|
|
403
447
|
gasBuffer,
|
|
@@ -414,8 +458,13 @@ async function multicallByGasLimit(calls, {
|
|
|
414
458
|
if (!retryFailedCallsWithGreaterLimit) {
|
|
415
459
|
return callResult;
|
|
416
460
|
}
|
|
417
|
-
const { gasLimitMultiplier: retryGasLimitMultiplier } = retryFailedCallsWithGreaterLimit;
|
|
461
|
+
const { gasLimitMultiplier: retryGasLimitMultiplier, maxRetry = 2 } = retryFailedCallsWithGreaterLimit;
|
|
462
|
+
let retry = 0;
|
|
418
463
|
async function retryFailedCalls(result) {
|
|
464
|
+
retry += 1;
|
|
465
|
+
if (retry > maxRetry) {
|
|
466
|
+
return result;
|
|
467
|
+
}
|
|
419
468
|
if (result.results.every((r) => r.success)) {
|
|
420
469
|
return result;
|
|
421
470
|
}
|
|
@@ -592,5 +641,3 @@ function splitCallsIntoChunks(calls, gasLimit) {
|
|
|
592
641
|
}
|
|
593
642
|
|
|
594
643
|
export { BLOCK_CONFLICT_TOLERANCE, DEFAULT_BLOCK_CONFLICT_TOLERANCE, DEFAULT_GAS_BUFFER, DEFAULT_GAS_BUFFER_BY_CHAIN, DEFAULT_GAS_LIMIT, DEFAULT_GAS_LIMIT_BY_CHAIN, MULTICALL3_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL_ADDRESS, getBlockConflictTolerance, getDefaultGasBuffer, getDefaultGasLimit, getGasLimit, getGasLimitOnChain, getMulticall3ContractAddress, getMulticallContract, iMulticallABI, multicall3ABI, multicallByGasLimit };
|
|
595
|
-
//# sourceMappingURL=out.js.map
|
|
596
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/multicall.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type CallByGasLimitParams = AbortControl & GetGasLimitParams & {
|
|
|
6
6
|
dropUnexecutedCalls?: boolean;
|
|
7
7
|
retryFailedCallsWithGreaterLimit?: {
|
|
8
8
|
gasLimitMultiplier: number;
|
|
9
|
+
maxRetry?: number;
|
|
9
10
|
} | undefined;
|
|
10
11
|
};
|
|
11
12
|
export declare function multicallByGasLimit(calls: MulticallRequestWithGas[], { chainId, gasBuffer, client, dropUnexecutedCalls, signal, retryFailedCallsWithGreaterLimit, ...rest }: CallByGasLimitParams): Promise<CallResult>;
|
package/dist/multicall.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA8B,MAAM,iCAAiC,CAAA;AAM1F,OAAO,EAAE,iBAAiB,EAAoC,MAAM,eAAe,CAAA;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEjD,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAC7C,iBAAiB,GAAG;IAIlB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAG/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAG7B,gCAAgC,CAAC,EAC7B;QACE,kBAAkB,EAAE,MAAM,CAAA;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GACD,SAAS,CAAA;CACd,CAAA;AAEH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,uBAAuB,EAAE,EAChC,EACE,OAAO,EACP,SAAwC,EACxC,MAAM,EACN,mBAAmB,EACnB,MAAM,EACN,gCAAgC,EAChC,GAAG,IAAI,EACR,EAAE,oBAAoB,uBAgExB;AAOD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAE3B,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG;IACzC,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pancakeswap/multicall",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
"module": "dist/index.mjs",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"viem": "^2.22.23",
|
|
13
|
-
"@pancakeswap/chains": "0.5.
|
|
14
|
-
"@pancakeswap/sdk": "5.8.
|
|
13
|
+
"@pancakeswap/chains": "0.5.1",
|
|
14
|
+
"@pancakeswap/sdk": "5.8.13"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"tsup": "^6.7.0",
|
|
18
18
|
"@pancakeswap/tsconfig": "0.0.0",
|
|
19
|
-
"@pancakeswap/utils": "6.0
|
|
19
|
+
"@pancakeswap/utils": "6.1.0"
|
|
20
20
|
},
|
|
21
21
|
"exports": {
|
|
22
22
|
"./package.json": "./package.json",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../utils/toBigInt.ts","../src/constants/contracts.ts","../src/constants/blockConflictTolerance.ts","../src/constants/gasLimit.ts","../src/getMulticallContract.ts","../src/abis/IMulticall.ts","../src/getGasLimit.ts","../src/abis/IMulticall3.ts","../../utils/abortControl.ts","../../utils/viem/isAbortError.ts","../src/getBlockConflictTolerance.ts","../src/multicall.ts"],"names":["ChainId"],"mappings":"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","sourcesContent":["import { BigintIsh } from '@pancakeswap/swap-sdk-core'\n\nexport function toBigInt(num: BigintIsh): bigint {\n return typeof num === 'bigint' ? num : BigInt(num.toString())\n}\n","import { ChainId } from '@pancakeswap/chains'\nimport { Address } from 'viem'\n\nexport const MULTICALL_ADDRESS: { [key in ChainId]?: Address } = {\n [ChainId.ZKSYNC]: '0x95071cBD09184083E7F732a710c2e30c9882Fd5f',\n [ChainId.BSC]: '0x39eecaE833c944ebb94942Fa44CaE46e87a8Da17',\n [ChainId.ETHEREUM]: '0xC0916D7E360c31D5F6D0c497E6a36B7B0E80e3cf',\n [ChainId.ARBITRUM_ONE]: '0xbFfE39cDD04f0183e0493c1Deb6E275c5cf84AdF',\n [ChainId.POLYGON_ZKEVM]: '0xe05b539447B17630Cb087473F6b50E5c5f73FDeb',\n [ChainId.LINEA]: '0x6E6B30d65D605DAa4CaC65eB270100Ecca36b140',\n [ChainId.BASE]: '0x3EFaAb8D7A631cfF5ccF5f149d1Bbb3B5bfda2C0',\n [ChainId.OPBNB]: '0xeF1511D29fB37cb87E33339EeC9BE13AB46E3b50',\n\n // Testnets\n [ChainId.BSC_TESTNET]: '0xeeF6ff30cF5D5b8aBA0DE16A01d17A0697a275b5',\n [ChainId.GOERLI]: '0xD55CAFAB2Ffa1139Be46bc5C0b8259c620050dFC',\n [ChainId.ARBITRUM_GOERLI]: '0xe12a5c707Fb528acbE6117b20AF1f7c20b0A8077',\n [ChainId.POLYGON_ZKEVM_TESTNET]: '0x236e713bFF45adb30e25D1c29A887aBCb0Ea7E21',\n [ChainId.ZKSYNC_TESTNET]: '0x8A23CB45E5F4d5a1b2DB673663Ea2aAedc48acff',\n [ChainId.LINEA_TESTNET]: '0x990010b6DBA3e7faa025790bC0433A9f690c65F3',\n [ChainId.BASE_TESTNET]: '0x6F7f93D929d6FBaF16c245e42846EF21aee23437',\n [ChainId.OPBNB_TESTNET]: '0x6A70ED893D85cf6D4059e1CF3e63a48e4D204D32',\n [ChainId.SCROLL_SEPOLIA]: '0x052a99849Ef2e13a5CB28275862991671D4b6fF5',\n}\n\nexport const MULTICALL3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11'\n\nexport const MULTICALL3_ADDRESSES: {\n [key in ChainId]?: Address\n} = {\n [ChainId.ETHEREUM]: MULTICALL3_ADDRESS,\n [ChainId.GOERLI]: MULTICALL3_ADDRESS,\n [ChainId.BSC]: MULTICALL3_ADDRESS,\n [ChainId.BSC_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.ZKSYNC_TESTNET]: '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n [ChainId.ZKSYNC]: '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n [ChainId.ARBITRUM_ONE]: MULTICALL3_ADDRESS,\n [ChainId.ARBITRUM_GOERLI]: MULTICALL3_ADDRESS,\n [ChainId.POLYGON_ZKEVM]: MULTICALL3_ADDRESS,\n [ChainId.POLYGON_ZKEVM_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.OPBNB]: MULTICALL3_ADDRESS,\n [ChainId.OPBNB_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.BASE_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS,\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nexport const DEFAULT_BLOCK_CONFLICT_TOLERANCE = 0\n\nexport const BLOCK_CONFLICT_TOLERANCE: { [key in ChainId]?: number } = {\n [ChainId.BSC]: 3,\n [ChainId.ETHEREUM]: 1,\n [ChainId.ARBITRUM_ONE]: 5,\n [ChainId.POLYGON_ZKEVM]: 1,\n [ChainId.ZKSYNC]: 3,\n [ChainId.LINEA]: 3,\n [ChainId.BASE]: 3,\n [ChainId.OPBNB]: 3,\n\n // Testnets\n [ChainId.BSC_TESTNET]: 3,\n [ChainId.GOERLI]: 1,\n [ChainId.ARBITRUM_GOERLI]: 5,\n [ChainId.POLYGON_ZKEVM_TESTNET]: 1,\n [ChainId.ZKSYNC_TESTNET]: 3,\n [ChainId.LINEA_TESTNET]: 3,\n [ChainId.OPBNB_TESTNET]: 3,\n [ChainId.BASE_TESTNET]: 3,\n [ChainId.SCROLL_SEPOLIA]: 3,\n [ChainId.MONAD_TESTNET]: 3,\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nexport const DEFAULT_GAS_LIMIT = 150000000n\n\nexport const DEFAULT_GAS_LIMIT_BY_CHAIN: { [key in ChainId]?: bigint } = {\n [ChainId.BSC]: 100000000n,\n [ChainId.ZKSYNC]: 500000000n,\n [ChainId.POLYGON_ZKEVM]: 1500000n,\n [ChainId.BASE]: 60000000n,\n [ChainId.OPBNB]: 100_000_000n,\n [ChainId.OPBNB_TESTNET]: 100_000_000n,\n}\n\nexport const DEFAULT_GAS_BUFFER = 3000000n\n\nexport const DEFAULT_GAS_BUFFER_BY_CHAIN: { [key in ChainId]?: bigint } = {\n [ChainId.BSC]: DEFAULT_GAS_BUFFER,\n [ChainId.POLYGON_ZKEVM]: 0n,\n}\n","import { ChainId } from '@pancakeswap/chains'\nimport { Address, PublicClient, getContract } from 'viem'\n\nimport { iMulticallABI } from './abis/IMulticall'\nimport { MULTICALL3_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL_ADDRESS } from './constants/contracts'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({ chainId, client }: Params) {\n const address = MULTICALL_ADDRESS[chainId]\n if (!address) {\n throw new Error(`PancakeMulticall not supported on chain ${chainId}`)\n }\n\n return getContract({ abi: iMulticallABI, address, client: client as PublicClient })\n}\n\nexport function getMulticall3ContractAddress(chainId?: ChainId): Address {\n return MULTICALL3_ADDRESSES[chainId || ChainId.BSC] || MULTICALL3_ADDRESS\n}\n","export const iMulticallABI = [\n {\n inputs: [],\n name: 'gasLeft',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'gaslimit',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'uint256', name: 'gasLimit', type: 'uint256' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'multicall',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'uint256', name: 'gasUsed', type: 'uint256' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'uint256', name: 'gasLimit', type: 'uint256' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n { internalType: 'uint256', name: 'gasBuffer', type: 'uint256' },\n ],\n name: 'multicallWithGasLimitation',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'uint256', name: 'gasUsed', type: 'uint256' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n { internalType: 'uint256', name: 'lastSuccessIndex', type: 'uint256' },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n]\n","import { BigintIsh } from '@pancakeswap/sdk'\nimport { ChainId } from '@pancakeswap/chains'\nimport { toBigInt } from '@pancakeswap/utils/toBigInt'\nimport { PublicClient } from 'viem'\n\nimport {\n DEFAULT_GAS_BUFFER,\n DEFAULT_GAS_BUFFER_BY_CHAIN,\n DEFAULT_GAS_LIMIT,\n DEFAULT_GAS_LIMIT_BY_CHAIN,\n} from './constants'\nimport { getMulticallContract } from './getMulticallContract'\n\nexport type GetGasLimitParams = {\n chainId: ChainId\n client?: PublicClient\n\n // If provided then would override the gas limit got from on chain\n gasLimit?: BigintIsh\n\n // The gas limit should be whichever is smaller between gasLimit and maxGasLimit\n maxGasLimit?: BigintIsh\n\n gasBuffer?: BigintIsh\n}\n\nexport function getDefaultGasLimit(chainId?: ChainId) {\n const gasLimitOnChain = chainId && DEFAULT_GAS_LIMIT_BY_CHAIN[chainId]\n return gasLimitOnChain !== undefined ? gasLimitOnChain : DEFAULT_GAS_LIMIT\n}\n\nexport function getDefaultGasBuffer(chainId?: ChainId) {\n const gasBufferOnChain = chainId && DEFAULT_GAS_BUFFER_BY_CHAIN[chainId]\n return gasBufferOnChain !== undefined ? gasBufferOnChain : DEFAULT_GAS_BUFFER\n}\n\nexport type GetGasLimitOnChainParams = Pick<GetGasLimitParams, 'chainId' | 'client'>\n\nexport async function getGasLimitOnChain({ chainId, client }: GetGasLimitOnChainParams) {\n const multicall = getMulticallContract({ chainId, client })\n const gasLeft = (await multicall.read.gasLeft()) as bigint\n return gasLeft\n}\n\nexport async function getGasLimit({\n chainId,\n gasLimit: gasLimitInput,\n maxGasLimit: maxGasLimitInput = getDefaultGasLimit(chainId),\n gasBuffer: gasBufferInput = getDefaultGasBuffer(chainId),\n client,\n}: GetGasLimitParams) {\n const gasLimitOverride = gasLimitInput && toBigInt(gasLimitInput)\n const maxGasLimit = toBigInt(maxGasLimitInput)\n const gasBuffer = toBigInt(gasBufferInput)\n\n const gasLimit = gasLimitOverride || (await getGasLimitOnChain({ chainId, client })) || maxGasLimit\n const minGasLimit = gasLimit < maxGasLimit ? gasLimit : maxGasLimit\n return minGasLimit - gasBuffer\n}\n","export const multicall3ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes[]', name: 'returnData', type: 'bytes[]' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'blockAndAggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes32', name: 'blockHash', type: 'bytes32' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'blockNumber', type: 'uint256' }],\n name: 'getBlockHash',\n outputs: [{ internalType: 'bytes32', name: 'blockHash', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getBlockNumber',\n outputs: [{ internalType: 'uint256', name: 'blockNumber', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockCoinbase',\n outputs: [{ internalType: 'address', name: 'coinbase', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockDifficulty',\n outputs: [{ internalType: 'uint256', name: 'difficulty', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockGasLimit',\n outputs: [{ internalType: 'uint256', name: 'gaslimit', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockTimestamp',\n outputs: [{ internalType: 'uint256', name: 'timestamp', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getLastBlockHash',\n outputs: [{ internalType: 'bytes32', name: 'blockHash', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bool', name: 'requireSuccess', type: 'bool' },\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'tryAggregate',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bool', name: 'requireSuccess', type: 'bool' },\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'tryBlockAndAggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes32', name: 'blockHash', type: 'bytes32' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","export type AbortControl = {\n signal?: AbortSignal\n}\n\nexport class AbortError extends Error {\n constructor(message?: string) {\n super(message)\n this.name = 'AbortError'\n }\n}\n\nexport function abortInvariant(signal?: AbortSignal, message?: string) {\n if (signal?.aborted) {\n throw new AbortError(message || 'Signal aborted')\n }\n}\n\nexport function isAbortError(error: any) {\n // Not using instance is because the utils is bundled into different pkgs right now\n return error instanceof Error && error.name === 'AbortError'\n}\n","import { TimeoutError, BaseError } from 'viem'\n\nexport function isViemAbortError(e: any) {\n return e instanceof BaseError && e.walk((err) => err instanceof TimeoutError) instanceof TimeoutError\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nimport { BLOCK_CONFLICT_TOLERANCE, DEFAULT_BLOCK_CONFLICT_TOLERANCE } from './constants'\n\nexport function getBlockConflictTolerance(chainId: ChainId) {\n return BLOCK_CONFLICT_TOLERANCE[chainId] || DEFAULT_BLOCK_CONFLICT_TOLERANCE\n}\n","import { toBigInt } from '@pancakeswap/utils/toBigInt'\nimport { AbortControl, AbortError, abortInvariant } from '@pancakeswap/utils/abortControl'\nimport { isViemAbortError } from '@pancakeswap/utils/viem/isAbortError'\n\nimport { GetGasLimitParams, getDefaultGasBuffer, getGasLimit } from './getGasLimit'\nimport { MulticallRequestWithGas } from './types'\nimport { getMulticallContract } from './getMulticallContract'\nimport { getBlockConflictTolerance } from './getBlockConflictTolerance'\n\nexport type CallByGasLimitParams = AbortControl &\n GetGasLimitParams & {\n // Normally we expect to get quotes from within the same block\n // But for some chains like BSC the block time is quite short so need some extra tolerance\n // 0 means no block conflict and all the multicall results should be queried within the same block\n blockConflictTolerance?: number\n\n // Treat unexecuted calls as failed calls\n dropUnexecutedCalls?: boolean\n\n // Retry for failed calls with greater gas limit\n retryFailedCallsWithGreaterLimit?:\n | {\n gasLimitMultiplier: number\n }\n | undefined\n }\n\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n {\n chainId,\n gasBuffer = getDefaultGasBuffer(chainId),\n client,\n dropUnexecutedCalls,\n signal,\n retryFailedCallsWithGreaterLimit,\n ...rest\n }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callResult = await callByChunks(splitCallsIntoChunks(calls, gasLimit), {\n gasBuffer,\n client,\n chainId,\n dropUnexecutedCalls,\n signal,\n })\n if (!retryFailedCallsWithGreaterLimit) {\n return callResult\n }\n\n const { gasLimitMultiplier: retryGasLimitMultiplier } = retryFailedCallsWithGreaterLimit\n async function retryFailedCalls(result: CallResult) {\n if (result.results.every((r) => r.success)) {\n return result\n }\n\n let callsToRetry: MulticallRequestWithGas[] = []\n const failedCallIndexes: number[] = []\n for (const [index, { success }] of result.results.entries()) {\n if (!success) {\n failedCallIndexes.push(index)\n callsToRetry.push(calls[index])\n }\n }\n if (callsToRetry.some((c) => BigInt(c.gasLimit) > gasLimit)) {\n console.warn(\n 'Failed to retry with greater limit. The gas limit of some of the calls exceeds the maximum gas limit set by chain',\n )\n return result\n }\n callsToRetry = callsToRetry.map((c) => ({ ...c, gasLimit: BigInt(c.gasLimit) * BigInt(retryGasLimitMultiplier) }))\n const retryResult = await callByChunks(splitCallsIntoChunks(callsToRetry, gasLimit), {\n gasBuffer,\n client,\n chainId,\n dropUnexecutedCalls,\n signal,\n })\n const resultsAfterRetry = [...result.results]\n for (const [retryIndex, originalIndex] of failedCallIndexes.entries()) {\n resultsAfterRetry[originalIndex] = retryResult.results[retryIndex]\n }\n return retryFailedCalls({\n results: resultsAfterRetry,\n blockNumber: retryResult.blockNumber,\n })\n }\n\n return retryFailedCalls(callResult)\n}\n\ntype CallParams = Pick<\n CallByGasLimitParams,\n 'chainId' | 'client' | 'gasBuffer' | 'blockConflictTolerance' | 'dropUnexecutedCalls' | 'signal'\n>\n\nexport type SingleCallResult = {\n result: string\n gasUsed: bigint\n success: boolean\n}\n\nexport type CallResult = {\n results: SingleCallResult[]\n // Will be the greatest block number if block conflict tolerance is not 0\n blockNumber: bigint\n}\n\nexport type MulticallReturn = CallResult & {\n lastSuccessIndex: number\n}\n\ntype CallReturnFromContract = [bigint, { success: boolean; gasUsed: bigint; returnData: string }[], bigint]\n\nfunction formatCallReturn([blockNumber, results, successIndex]: CallReturnFromContract): MulticallReturn {\n const lastSuccessIndex = Number(successIndex)\n return {\n lastSuccessIndex,\n blockNumber,\n results: results.slice(0, lastSuccessIndex + 1).map(({ gasUsed, success, returnData }) => ({\n gasUsed,\n success,\n result: returnData,\n })),\n }\n}\n\nasync function call(calls: MulticallRequestWithGas[], params: CallParams): Promise<CallResult> {\n const {\n chainId,\n client,\n gasBuffer = getDefaultGasBuffer(chainId),\n blockConflictTolerance = getBlockConflictTolerance(chainId),\n dropUnexecutedCalls = false,\n signal,\n } = params\n if (!calls.length) {\n return {\n results: [],\n blockNumber: 0n,\n }\n }\n\n abortInvariant(signal, 'Multicall aborted')\n\n const contract = getMulticallContract({ chainId, client })\n try {\n const { result } = await contract.simulate.multicallWithGasLimitation([calls, gasBuffer])\n const { results, lastSuccessIndex, blockNumber } = formatCallReturn(result as CallReturnFromContract)\n if (lastSuccessIndex === calls.length - 1) {\n return {\n results,\n blockNumber,\n }\n }\n console.warn(\n `Gas limit reached. Total num of ${calls.length} calls. First ${\n lastSuccessIndex + 1\n } calls executed. The remaining ${\n calls.length - lastSuccessIndex - 1\n } calls are not executed. Pls try adjust the gas limit per call.`,\n )\n const remainingCalls = calls.slice(lastSuccessIndex + 1)\n if (dropUnexecutedCalls) {\n return {\n results: [...results, ...remainingCalls.map(() => ({ result: '0x', gasUsed: 0n, success: false }))],\n blockNumber,\n }\n }\n const { results: remainingResults, blockNumber: nextBlockNumber } = await call(\n calls.slice(lastSuccessIndex + 1),\n params,\n )\n if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {\n throw new Error(\n `Multicall failed because of block conflict. Latest calls are made at block ${nextBlockNumber} while last calls made at block ${blockNumber}. Block conflict tolerance is ${blockConflictTolerance}`,\n )\n }\n return {\n results: [...results, ...remainingResults],\n // Use the latest block number\n blockNumber: nextBlockNumber,\n }\n } catch (e: any) {\n if (isViemAbortError(e)) {\n throw new AbortError(e.message)\n }\n throw e\n }\n}\n\nasync function callByChunks(chunks: MulticallRequestWithGas[][], params: CallParams): Promise<CallResult> {\n try {\n const { blockConflictTolerance = getBlockConflictTolerance(params.chainId) } = params\n const callReturns = await Promise.all(chunks.map((chunk) => call(chunk, params)))\n\n let minBlock = 0n\n let maxBlock = 0n\n let results: SingleCallResult[] = []\n for (const { results: callResults, blockNumber } of callReturns) {\n if (minBlock === 0n || blockNumber < minBlock) {\n minBlock = blockNumber\n }\n if (blockNumber > maxBlock) {\n maxBlock = blockNumber\n }\n if (Number(maxBlock - minBlock) > blockConflictTolerance) {\n throw new Error(\n `Multicall failed because of block conflict. Min block is ${minBlock} while max block is ${maxBlock}. Block conflict tolerance is ${blockConflictTolerance}`,\n )\n }\n results = [...results, ...callResults]\n }\n return {\n results,\n blockNumber: maxBlock,\n }\n } catch (e: unknown) {\n // Happened on zksync\n if (e instanceof Error && e.message.includes('Storage invocations limit reached') && chunks[0].length > 1) {\n return callByChunks(divideChunks(chunks), params)\n }\n throw e\n }\n}\n\nfunction divideChunks<T>(chunks: T[][]) {\n const newChunks: T[][] = []\n\n for (const chunk of chunks) {\n const half = Math.ceil(chunk.length / 2)\n\n const firstHalf = chunk.slice(0, half)\n const secondHalf = chunk.slice(half)\n if (firstHalf.length) {\n newChunks.push(firstHalf)\n }\n if (secondHalf.length) {\n newChunks.push(secondHalf)\n }\n }\n\n return newChunks\n}\n\nfunction splitCallsIntoChunks(calls: MulticallRequestWithGas[], gasLimit: bigint): MulticallRequestWithGas[][] {\n const chunks: MulticallRequestWithGas[][] = [[]]\n\n let gasLeft = gasLimit\n for (const callRequest of calls) {\n const { target, callData, gasLimit: gasCostLimit } = callRequest\n const singleGasLimit = toBigInt(gasCostLimit)\n const currentChunk = chunks[chunks.length - 1]\n if (singleGasLimit > gasLeft) {\n chunks.push([callRequest])\n gasLeft = gasLimit - singleGasLimit\n\n // Single call exceeds the gas limit\n if (gasLeft < 0n) {\n console.warn(\n `Multicall request may fail as the gas cost of a single call exceeds the gas limit ${gasLimit}. Gas cost: ${singleGasLimit}. To: ${target}. Data: ${callData}`,\n )\n }\n continue\n }\n\n currentChunk.push(callRequest)\n gasLeft -= singleGasLimit\n }\n\n return chunks\n}\n"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../utils/toBigInt.ts","../src/constants/contracts.ts","../src/constants/blockConflictTolerance.ts","../src/constants/gasLimit.ts","../src/getMulticallContract.ts","../src/abis/IMulticall.ts","../src/getGasLimit.ts","../src/abis/IMulticall3.ts","../../utils/abortControl.ts","../../utils/viem/isAbortError.ts","../src/getBlockConflictTolerance.ts","../src/multicall.ts"],"names":["ChainId"],"mappings":"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","sourcesContent":["import { BigintIsh } from '@pancakeswap/swap-sdk-core'\n\nexport function toBigInt(num: BigintIsh): bigint {\n return typeof num === 'bigint' ? num : BigInt(num.toString())\n}\n","import { ChainId } from '@pancakeswap/chains'\nimport { Address } from 'viem'\n\nexport const MULTICALL_ADDRESS: { [key in ChainId]?: Address } = {\n [ChainId.ZKSYNC]: '0x95071cBD09184083E7F732a710c2e30c9882Fd5f',\n [ChainId.BSC]: '0x39eecaE833c944ebb94942Fa44CaE46e87a8Da17',\n [ChainId.ETHEREUM]: '0xC0916D7E360c31D5F6D0c497E6a36B7B0E80e3cf',\n [ChainId.ARBITRUM_ONE]: '0xbFfE39cDD04f0183e0493c1Deb6E275c5cf84AdF',\n [ChainId.POLYGON_ZKEVM]: '0xe05b539447B17630Cb087473F6b50E5c5f73FDeb',\n [ChainId.LINEA]: '0x6E6B30d65D605DAa4CaC65eB270100Ecca36b140',\n [ChainId.BASE]: '0x3EFaAb8D7A631cfF5ccF5f149d1Bbb3B5bfda2C0',\n [ChainId.OPBNB]: '0xeF1511D29fB37cb87E33339EeC9BE13AB46E3b50',\n\n // Testnets\n [ChainId.BSC_TESTNET]: '0xeeF6ff30cF5D5b8aBA0DE16A01d17A0697a275b5',\n [ChainId.GOERLI]: '0xD55CAFAB2Ffa1139Be46bc5C0b8259c620050dFC',\n [ChainId.ARBITRUM_GOERLI]: '0xe12a5c707Fb528acbE6117b20AF1f7c20b0A8077',\n [ChainId.POLYGON_ZKEVM_TESTNET]: '0x236e713bFF45adb30e25D1c29A887aBCb0Ea7E21',\n [ChainId.ZKSYNC_TESTNET]: '0x8A23CB45E5F4d5a1b2DB673663Ea2aAedc48acff',\n [ChainId.LINEA_TESTNET]: '0x990010b6DBA3e7faa025790bC0433A9f690c65F3',\n [ChainId.BASE_TESTNET]: '0x6F7f93D929d6FBaF16c245e42846EF21aee23437',\n [ChainId.OPBNB_TESTNET]: '0x6A70ED893D85cf6D4059e1CF3e63a48e4D204D32',\n [ChainId.SCROLL_SEPOLIA]: '0x052a99849Ef2e13a5CB28275862991671D4b6fF5',\n}\n\nexport const MULTICALL3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11'\n\nexport const MULTICALL3_ADDRESSES: {\n [key in ChainId]?: Address\n} = {\n [ChainId.ETHEREUM]: MULTICALL3_ADDRESS,\n [ChainId.GOERLI]: MULTICALL3_ADDRESS,\n [ChainId.BSC]: MULTICALL3_ADDRESS,\n [ChainId.BSC_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.ZKSYNC_TESTNET]: '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n [ChainId.ZKSYNC]: '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n [ChainId.ARBITRUM_ONE]: MULTICALL3_ADDRESS,\n [ChainId.ARBITRUM_GOERLI]: MULTICALL3_ADDRESS,\n [ChainId.POLYGON_ZKEVM]: MULTICALL3_ADDRESS,\n [ChainId.POLYGON_ZKEVM_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.OPBNB]: MULTICALL3_ADDRESS,\n [ChainId.OPBNB_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.BASE_TESTNET]: MULTICALL3_ADDRESS,\n [ChainId.SCROLL_SEPOLIA]: MULTICALL3_ADDRESS,\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nexport const DEFAULT_BLOCK_CONFLICT_TOLERANCE = 0\n\nexport const BLOCK_CONFLICT_TOLERANCE: { [key in ChainId]?: number } = {\n [ChainId.BSC]: 3,\n [ChainId.ETHEREUM]: 1,\n [ChainId.ARBITRUM_ONE]: 5,\n [ChainId.POLYGON_ZKEVM]: 1,\n [ChainId.ZKSYNC]: 3,\n [ChainId.LINEA]: 3,\n [ChainId.BASE]: 3,\n [ChainId.OPBNB]: 3,\n\n // Testnets\n [ChainId.BSC_TESTNET]: 3,\n [ChainId.GOERLI]: 1,\n [ChainId.ARBITRUM_GOERLI]: 5,\n [ChainId.POLYGON_ZKEVM_TESTNET]: 1,\n [ChainId.ZKSYNC_TESTNET]: 3,\n [ChainId.LINEA_TESTNET]: 3,\n [ChainId.OPBNB_TESTNET]: 3,\n [ChainId.BASE_TESTNET]: 3,\n [ChainId.SCROLL_SEPOLIA]: 3,\n [ChainId.MONAD_TESTNET]: 3,\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nexport const DEFAULT_GAS_LIMIT = 150000000n\n\nexport const DEFAULT_GAS_LIMIT_BY_CHAIN: { [key in ChainId]?: bigint } = {\n [ChainId.BSC]: 100000000n,\n [ChainId.ZKSYNC]: 500000000n,\n [ChainId.POLYGON_ZKEVM]: 1500000n,\n [ChainId.BASE]: 60000000n,\n [ChainId.OPBNB]: 100_000_000n,\n [ChainId.OPBNB_TESTNET]: 100_000_000n,\n}\n\nexport const DEFAULT_GAS_BUFFER = 3000000n\n\nexport const DEFAULT_GAS_BUFFER_BY_CHAIN: { [key in ChainId]?: bigint } = {\n [ChainId.BSC]: DEFAULT_GAS_BUFFER,\n [ChainId.POLYGON_ZKEVM]: 0n,\n}\n","import { ChainId } from '@pancakeswap/chains'\nimport { Address, PublicClient, getContract } from 'viem'\n\nimport { iMulticallABI } from './abis/IMulticall'\nimport { MULTICALL3_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL_ADDRESS } from './constants/contracts'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({ chainId, client }: Params) {\n const address = MULTICALL_ADDRESS[chainId]\n if (!address) {\n throw new Error(`PancakeMulticall not supported on chain ${chainId}`)\n }\n\n return getContract({ abi: iMulticallABI, address, client: client as PublicClient })\n}\n\nexport function getMulticall3ContractAddress(chainId?: ChainId): Address {\n return MULTICALL3_ADDRESSES[chainId || ChainId.BSC] || MULTICALL3_ADDRESS\n}\n","export const iMulticallABI = [\n {\n inputs: [],\n name: 'gasLeft',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'gaslimit',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'uint256', name: 'gasLimit', type: 'uint256' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'multicall',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'uint256', name: 'gasUsed', type: 'uint256' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'uint256', name: 'gasLimit', type: 'uint256' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n { internalType: 'uint256', name: 'gasBuffer', type: 'uint256' },\n ],\n name: 'multicallWithGasLimitation',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'uint256', name: 'gasUsed', type: 'uint256' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct MultiCallV2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n { internalType: 'uint256', name: 'lastSuccessIndex', type: 'uint256' },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n]\n","import { BigintIsh } from '@pancakeswap/sdk'\nimport { ChainId } from '@pancakeswap/chains'\nimport { toBigInt } from '@pancakeswap/utils/toBigInt'\nimport { PublicClient } from 'viem'\n\nimport {\n DEFAULT_GAS_BUFFER,\n DEFAULT_GAS_BUFFER_BY_CHAIN,\n DEFAULT_GAS_LIMIT,\n DEFAULT_GAS_LIMIT_BY_CHAIN,\n} from './constants'\nimport { getMulticallContract } from './getMulticallContract'\n\nexport type GetGasLimitParams = {\n chainId: ChainId\n client?: PublicClient\n\n // If provided then would override the gas limit got from on chain\n gasLimit?: BigintIsh\n\n // The gas limit should be whichever is smaller between gasLimit and maxGasLimit\n maxGasLimit?: BigintIsh\n\n gasBuffer?: BigintIsh\n}\n\nexport function getDefaultGasLimit(chainId?: ChainId) {\n const gasLimitOnChain = chainId && DEFAULT_GAS_LIMIT_BY_CHAIN[chainId]\n return gasLimitOnChain !== undefined ? gasLimitOnChain : DEFAULT_GAS_LIMIT\n}\n\nexport function getDefaultGasBuffer(chainId?: ChainId) {\n const gasBufferOnChain = chainId && DEFAULT_GAS_BUFFER_BY_CHAIN[chainId]\n return gasBufferOnChain !== undefined ? gasBufferOnChain : DEFAULT_GAS_BUFFER\n}\n\nexport type GetGasLimitOnChainParams = Pick<GetGasLimitParams, 'chainId' | 'client'>\n\nexport async function getGasLimitOnChain({ chainId, client }: GetGasLimitOnChainParams) {\n const multicall = getMulticallContract({ chainId, client })\n const gasLeft = (await multicall.read.gasLeft()) as bigint\n return gasLeft\n}\n\nexport async function getGasLimit({\n chainId,\n gasLimit: gasLimitInput,\n maxGasLimit: maxGasLimitInput = getDefaultGasLimit(chainId),\n gasBuffer: gasBufferInput = getDefaultGasBuffer(chainId),\n client,\n}: GetGasLimitParams) {\n const gasLimitOverride = gasLimitInput && toBigInt(gasLimitInput)\n const maxGasLimit = toBigInt(maxGasLimitInput)\n const gasBuffer = toBigInt(gasBufferInput)\n\n const gasLimit = gasLimitOverride || (await getGasLimitOnChain({ chainId, client })) || maxGasLimit\n const minGasLimit = gasLimit < maxGasLimit ? gasLimit : maxGasLimit\n return minGasLimit - gasBuffer\n}\n","export const multicall3ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes[]', name: 'returnData', type: 'bytes[]' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'blockAndAggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes32', name: 'blockHash', type: 'bytes32' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'blockNumber', type: 'uint256' }],\n name: 'getBlockHash',\n outputs: [{ internalType: 'bytes32', name: 'blockHash', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getBlockNumber',\n outputs: [{ internalType: 'uint256', name: 'blockNumber', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockCoinbase',\n outputs: [{ internalType: 'address', name: 'coinbase', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockDifficulty',\n outputs: [{ internalType: 'uint256', name: 'difficulty', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockGasLimit',\n outputs: [{ internalType: 'uint256', name: 'gaslimit', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getCurrentBlockTimestamp',\n outputs: [{ internalType: 'uint256', name: 'timestamp', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getLastBlockHash',\n outputs: [{ internalType: 'bytes32', name: 'blockHash', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bool', name: 'requireSuccess', type: 'bool' },\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'tryAggregate',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bool', name: 'requireSuccess', type: 'bool' },\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Call[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'tryBlockAndAggregate',\n outputs: [\n { internalType: 'uint256', name: 'blockNumber', type: 'uint256' },\n { internalType: 'bytes32', name: 'blockHash', type: 'bytes32' },\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall2.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","export type AbortControl = {\n signal?: AbortSignal\n}\n\nexport class AbortError extends Error {\n constructor(message?: string) {\n super(message)\n this.name = 'AbortError'\n }\n}\n\nexport function abortInvariant(signal?: AbortSignal, message?: string) {\n if (signal?.aborted) {\n throw new AbortError(message || 'Signal aborted')\n }\n}\n\nexport function isAbortError(error: any) {\n // Not using instance is because the utils is bundled into different pkgs right now\n return error instanceof Error && error.name === 'AbortError'\n}\n","import { TimeoutError, BaseError } from 'viem'\n\nexport function isViemAbortError(e: any) {\n return e instanceof BaseError && e.walk((err) => err instanceof TimeoutError) instanceof TimeoutError\n}\n","import { ChainId } from '@pancakeswap/chains'\n\nimport { BLOCK_CONFLICT_TOLERANCE, DEFAULT_BLOCK_CONFLICT_TOLERANCE } from './constants'\n\nexport function getBlockConflictTolerance(chainId: ChainId) {\n return BLOCK_CONFLICT_TOLERANCE[chainId] || DEFAULT_BLOCK_CONFLICT_TOLERANCE\n}\n","import { toBigInt } from '@pancakeswap/utils/toBigInt'\nimport { AbortControl, AbortError, abortInvariant } from '@pancakeswap/utils/abortControl'\nimport { isViemAbortError } from '@pancakeswap/utils/viem/isAbortError'\n\nimport { GetGasLimitParams, getDefaultGasBuffer, getGasLimit } from './getGasLimit'\nimport { MulticallRequestWithGas } from './types'\nimport { getMulticallContract } from './getMulticallContract'\nimport { getBlockConflictTolerance } from './getBlockConflictTolerance'\n\nexport type CallByGasLimitParams = AbortControl &\n GetGasLimitParams & {\n // Normally we expect to get quotes from within the same block\n // But for some chains like BSC the block time is quite short so need some extra tolerance\n // 0 means no block conflict and all the multicall results should be queried within the same block\n blockConflictTolerance?: number\n\n // Treat unexecuted calls as failed calls\n dropUnexecutedCalls?: boolean\n\n // Retry for failed calls with greater gas limit\n retryFailedCallsWithGreaterLimit?:\n | {\n gasLimitMultiplier: number\n }\n | undefined\n }\n\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n {\n chainId,\n gasBuffer = getDefaultGasBuffer(chainId),\n client,\n dropUnexecutedCalls,\n signal,\n retryFailedCallsWithGreaterLimit,\n ...rest\n }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callResult = await callByChunks(splitCallsIntoChunks(calls, gasLimit), {\n gasBuffer,\n client,\n chainId,\n dropUnexecutedCalls,\n signal,\n })\n if (!retryFailedCallsWithGreaterLimit) {\n return callResult\n }\n\n const { gasLimitMultiplier: retryGasLimitMultiplier } = retryFailedCallsWithGreaterLimit\n async function retryFailedCalls(result: CallResult) {\n if (result.results.every((r) => r.success)) {\n return result\n }\n\n let callsToRetry: MulticallRequestWithGas[] = []\n const failedCallIndexes: number[] = []\n for (const [index, { success }] of result.results.entries()) {\n if (!success) {\n failedCallIndexes.push(index)\n callsToRetry.push(calls[index])\n }\n }\n if (callsToRetry.some((c) => BigInt(c.gasLimit) > gasLimit)) {\n console.warn(\n 'Failed to retry with greater limit. The gas limit of some of the calls exceeds the maximum gas limit set by chain',\n )\n return result\n }\n callsToRetry = callsToRetry.map((c) => ({ ...c, gasLimit: BigInt(c.gasLimit) * BigInt(retryGasLimitMultiplier) }))\n const retryResult = await callByChunks(splitCallsIntoChunks(callsToRetry, gasLimit), {\n gasBuffer,\n client,\n chainId,\n dropUnexecutedCalls,\n signal,\n })\n const resultsAfterRetry = [...result.results]\n for (const [retryIndex, originalIndex] of failedCallIndexes.entries()) {\n resultsAfterRetry[originalIndex] = retryResult.results[retryIndex]\n }\n return retryFailedCalls({\n results: resultsAfterRetry,\n blockNumber: retryResult.blockNumber,\n })\n }\n\n return retryFailedCalls(callResult)\n}\n\ntype CallParams = Pick<\n CallByGasLimitParams,\n 'chainId' | 'client' | 'gasBuffer' | 'blockConflictTolerance' | 'dropUnexecutedCalls' | 'signal'\n>\n\nexport type SingleCallResult = {\n result: string\n gasUsed: bigint\n success: boolean\n}\n\nexport type CallResult = {\n results: SingleCallResult[]\n // Will be the greatest block number if block conflict tolerance is not 0\n blockNumber: bigint\n}\n\nexport type MulticallReturn = CallResult & {\n lastSuccessIndex: number\n}\n\ntype CallReturnFromContract = [bigint, { success: boolean; gasUsed: bigint; returnData: string }[], bigint]\n\nfunction formatCallReturn([blockNumber, results, successIndex]: CallReturnFromContract): MulticallReturn {\n const lastSuccessIndex = Number(successIndex)\n return {\n lastSuccessIndex,\n blockNumber,\n results: results.slice(0, lastSuccessIndex + 1).map(({ gasUsed, success, returnData }) => ({\n gasUsed,\n success,\n result: returnData,\n })),\n }\n}\n\nasync function call(calls: MulticallRequestWithGas[], params: CallParams): Promise<CallResult> {\n const {\n chainId,\n client,\n gasBuffer = getDefaultGasBuffer(chainId),\n blockConflictTolerance = getBlockConflictTolerance(chainId),\n dropUnexecutedCalls = false,\n signal,\n } = params\n if (!calls.length) {\n return {\n results: [],\n blockNumber: 0n,\n }\n }\n\n abortInvariant(signal, 'Multicall aborted')\n\n const contract = getMulticallContract({ chainId, client })\n try {\n const { result } = await contract.simulate.multicallWithGasLimitation([calls, gasBuffer])\n const { results, lastSuccessIndex, blockNumber } = formatCallReturn(result as CallReturnFromContract)\n if (lastSuccessIndex === calls.length - 1) {\n return {\n results,\n blockNumber,\n }\n }\n console.warn(\n `Gas limit reached. Total num of ${calls.length} calls. First ${\n lastSuccessIndex + 1\n } calls executed. The remaining ${\n calls.length - lastSuccessIndex - 1\n } calls are not executed. Pls try adjust the gas limit per call.`,\n )\n const remainingCalls = calls.slice(lastSuccessIndex + 1)\n if (dropUnexecutedCalls) {\n return {\n results: [...results, ...remainingCalls.map(() => ({ result: '0x', gasUsed: 0n, success: false }))],\n blockNumber,\n }\n }\n const { results: remainingResults, blockNumber: nextBlockNumber } = await call(\n calls.slice(lastSuccessIndex + 1),\n params,\n )\n if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {\n throw new Error(\n `Multicall failed because of block conflict. Latest calls are made at block ${nextBlockNumber} while last calls made at block ${blockNumber}. Block conflict tolerance is ${blockConflictTolerance}`,\n )\n }\n return {\n results: [...results, ...remainingResults],\n // Use the latest block number\n blockNumber: nextBlockNumber,\n }\n } catch (e: any) {\n if (isViemAbortError(e)) {\n throw new AbortError(e.message)\n }\n throw e\n }\n}\n\nasync function callByChunks(chunks: MulticallRequestWithGas[][], params: CallParams): Promise<CallResult> {\n try {\n const { blockConflictTolerance = getBlockConflictTolerance(params.chainId) } = params\n const callReturns = await Promise.all(chunks.map((chunk) => call(chunk, params)))\n\n let minBlock = 0n\n let maxBlock = 0n\n let results: SingleCallResult[] = []\n for (const { results: callResults, blockNumber } of callReturns) {\n if (minBlock === 0n || blockNumber < minBlock) {\n minBlock = blockNumber\n }\n if (blockNumber > maxBlock) {\n maxBlock = blockNumber\n }\n if (Number(maxBlock - minBlock) > blockConflictTolerance) {\n throw new Error(\n `Multicall failed because of block conflict. Min block is ${minBlock} while max block is ${maxBlock}. Block conflict tolerance is ${blockConflictTolerance}`,\n )\n }\n results = [...results, ...callResults]\n }\n return {\n results,\n blockNumber: maxBlock,\n }\n } catch (e: unknown) {\n // Happened on zksync\n if (e instanceof Error && e.message.includes('Storage invocations limit reached') && chunks[0].length > 1) {\n return callByChunks(divideChunks(chunks), params)\n }\n throw e\n }\n}\n\nfunction divideChunks<T>(chunks: T[][]) {\n const newChunks: T[][] = []\n\n for (const chunk of chunks) {\n const half = Math.ceil(chunk.length / 2)\n\n const firstHalf = chunk.slice(0, half)\n const secondHalf = chunk.slice(half)\n if (firstHalf.length) {\n newChunks.push(firstHalf)\n }\n if (secondHalf.length) {\n newChunks.push(secondHalf)\n }\n }\n\n return newChunks\n}\n\nfunction splitCallsIntoChunks(calls: MulticallRequestWithGas[], gasLimit: bigint): MulticallRequestWithGas[][] {\n const chunks: MulticallRequestWithGas[][] = [[]]\n\n let gasLeft = gasLimit\n for (const callRequest of calls) {\n const { target, callData, gasLimit: gasCostLimit } = callRequest\n const singleGasLimit = toBigInt(gasCostLimit)\n const currentChunk = chunks[chunks.length - 1]\n if (singleGasLimit > gasLeft) {\n chunks.push([callRequest])\n gasLeft = gasLimit - singleGasLimit\n\n // Single call exceeds the gas limit\n if (gasLeft < 0n) {\n console.warn(\n `Multicall request may fail as the gas cost of a single call exceeds the gas limit ${gasLimit}. Gas cost: ${singleGasLimit}. To: ${target}. Data: ${callData}`,\n )\n }\n continue\n }\n\n currentChunk.push(callRequest)\n gasLeft -= singleGasLimit\n }\n\n return chunks\n}\n"]}
|