@pancakeswap/multicall 3.3.3 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +64 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +65 -33
- package/dist/index.mjs.map +1 -1
- package/dist/multicall.d.ts +3 -2
- package/dist/multicall.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -371,13 +371,36 @@ var multicall3ABI = [
|
|
|
371
371
|
}
|
|
372
372
|
];
|
|
373
373
|
|
|
374
|
+
// ../utils/abortControl.ts
|
|
375
|
+
var AbortError = class extends Error {
|
|
376
|
+
constructor(message) {
|
|
377
|
+
super(message);
|
|
378
|
+
this.name = "AbortError";
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
function abortInvariant(signal, message) {
|
|
382
|
+
if (signal?.aborted) {
|
|
383
|
+
throw new AbortError(message || "Signal aborted");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function isViemAbortError(e) {
|
|
387
|
+
return e instanceof viem.BaseError && e.walk((err) => err instanceof viem.TimeoutError) instanceof viem.TimeoutError;
|
|
388
|
+
}
|
|
389
|
+
|
|
374
390
|
// src/getBlockConflictTolerance.ts
|
|
375
391
|
function getBlockConflictTolerance(chainId) {
|
|
376
392
|
return BLOCK_CONFLICT_TOLERANCE[chainId] || DEFAULT_BLOCK_CONFLICT_TOLERANCE;
|
|
377
393
|
}
|
|
378
394
|
|
|
379
395
|
// src/multicall.ts
|
|
380
|
-
async function multicallByGasLimit(calls, {
|
|
396
|
+
async function multicallByGasLimit(calls, {
|
|
397
|
+
chainId,
|
|
398
|
+
gasBuffer = getDefaultGasBuffer(chainId),
|
|
399
|
+
client,
|
|
400
|
+
dropUnexecutedCalls,
|
|
401
|
+
signal,
|
|
402
|
+
...rest
|
|
403
|
+
}) {
|
|
381
404
|
const gasLimit = await getGasLimit({
|
|
382
405
|
chainId,
|
|
383
406
|
gasBuffer,
|
|
@@ -385,7 +408,7 @@ async function multicallByGasLimit(calls, { chainId, gasBuffer = getDefaultGasBu
|
|
|
385
408
|
...rest
|
|
386
409
|
});
|
|
387
410
|
const callChunks = splitCallsIntoChunks(calls, gasLimit);
|
|
388
|
-
return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls });
|
|
411
|
+
return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls, signal });
|
|
389
412
|
}
|
|
390
413
|
function formatCallReturn([blockNumber, results, successIndex]) {
|
|
391
414
|
const lastSuccessIndex = Number(successIndex);
|
|
@@ -405,7 +428,8 @@ async function call(calls, params) {
|
|
|
405
428
|
client,
|
|
406
429
|
gasBuffer = getDefaultGasBuffer(chainId),
|
|
407
430
|
blockConflictTolerance = getBlockConflictTolerance(chainId),
|
|
408
|
-
dropUnexecutedCalls = false
|
|
431
|
+
dropUnexecutedCalls = false,
|
|
432
|
+
signal
|
|
409
433
|
} = params;
|
|
410
434
|
if (!calls.length) {
|
|
411
435
|
return {
|
|
@@ -413,39 +437,47 @@ async function call(calls, params) {
|
|
|
413
437
|
blockNumber: 0n
|
|
414
438
|
};
|
|
415
439
|
}
|
|
440
|
+
abortInvariant(signal, "Multicall aborted");
|
|
416
441
|
const contract = getMulticallContract({ chainId, client });
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
442
|
+
try {
|
|
443
|
+
const { result } = await contract.simulate.multicallWithGasLimitation([calls, gasBuffer]);
|
|
444
|
+
const { results, lastSuccessIndex, blockNumber } = formatCallReturn(result);
|
|
445
|
+
if (lastSuccessIndex === calls.length - 1) {
|
|
446
|
+
return {
|
|
447
|
+
results,
|
|
448
|
+
blockNumber
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
console.warn(
|
|
452
|
+
`Gas limit reached. Total num of ${calls.length} calls. First ${lastSuccessIndex + 1} calls executed. The remaining ${calls.length - lastSuccessIndex - 1} calls are not executed. Pls try adjust the gas limit per call.`
|
|
453
|
+
);
|
|
454
|
+
const remainingCalls = calls.slice(lastSuccessIndex + 1);
|
|
455
|
+
if (dropUnexecutedCalls) {
|
|
456
|
+
return {
|
|
457
|
+
results: [...results, ...remainingCalls.map(() => ({ result: "0x", gasUsed: 0n, success: false }))],
|
|
458
|
+
blockNumber
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
const { results: remainingResults, blockNumber: nextBlockNumber } = await call(
|
|
462
|
+
calls.slice(lastSuccessIndex + 1),
|
|
463
|
+
params
|
|
464
|
+
);
|
|
465
|
+
if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {
|
|
466
|
+
throw new Error(
|
|
467
|
+
`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}`
|
|
468
|
+
);
|
|
469
|
+
}
|
|
430
470
|
return {
|
|
431
|
-
results: [...results, ...
|
|
432
|
-
|
|
471
|
+
results: [...results, ...remainingResults],
|
|
472
|
+
// Use the latest block number
|
|
473
|
+
blockNumber: nextBlockNumber
|
|
433
474
|
};
|
|
475
|
+
} catch (e) {
|
|
476
|
+
if (isViemAbortError(e)) {
|
|
477
|
+
throw new AbortError(e.message);
|
|
478
|
+
}
|
|
479
|
+
throw e;
|
|
434
480
|
}
|
|
435
|
-
const { results: remainingResults, blockNumber: nextBlockNumber } = await call(
|
|
436
|
-
calls.slice(lastSuccessIndex + 1),
|
|
437
|
-
params
|
|
438
|
-
);
|
|
439
|
-
if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {
|
|
440
|
-
throw new Error(
|
|
441
|
-
`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}`
|
|
442
|
-
);
|
|
443
|
-
}
|
|
444
|
-
return {
|
|
445
|
-
results: [...results, ...remainingResults],
|
|
446
|
-
// Use the latest block number
|
|
447
|
-
blockNumber: nextBlockNumber
|
|
448
|
-
};
|
|
449
481
|
}
|
|
450
482
|
async function callByChunks(chunks, params) {
|
|
451
483
|
const { blockConflictTolerance = getBlockConflictTolerance(params.chainId) } = params;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","../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 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}\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 { GetContractReturnType, PublicClient, getContract, Address } from 'viem'\n\nimport { MULTICALL_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL3_ADDRESS } from './constants/contracts'\nimport { iMulticallABI } from './abis/IMulticall'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({\n chainId,\n client,\n}: Params): GetContractReturnType<typeof iMulticallABI, PublicClient> {\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, publicClient: client })\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","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'\n\nimport { GetGasLimitParams, getDefaultGasBuffer, getGasLimit } from './getGasLimit'\nimport { MulticallRequestWithGas } from './types'\nimport { getMulticallContract } from './getMulticallContract'\nimport { getBlockConflictTolerance } from './getBlockConflictTolerance'\n\nexport type CallByGasLimitParams = 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\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n { chainId, gasBuffer = getDefaultGasBuffer(chainId), client, dropUnexecutedCalls, ...rest }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callChunks = splitCallsIntoChunks(calls, gasLimit)\n return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls })\n}\n\ntype CallParams = Pick<\n CallByGasLimitParams,\n 'chainId' | 'client' | 'gasBuffer' | 'blockConflictTolerance' | 'dropUnexecutedCalls'\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 } = params\n if (!calls.length) {\n return {\n results: [],\n blockNumber: 0n,\n }\n }\n\n const contract = getMulticallContract({ chainId, client })\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}\n\nasync function callByChunks(chunks: MulticallRequestWithGas[][], params: CallParams): Promise<CallResult> {\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}\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"]}
|
|
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 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}\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 { GetContractReturnType, PublicClient, getContract, Address } from 'viem'\n\nimport { MULTICALL_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL3_ADDRESS } from './constants/contracts'\nimport { iMulticallABI } from './abis/IMulticall'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({\n chainId,\n client,\n}: Params): GetContractReturnType<typeof iMulticallABI, PublicClient> {\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, publicClient: client })\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\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n {\n chainId,\n gasBuffer = getDefaultGasBuffer(chainId),\n client,\n dropUnexecutedCalls,\n signal,\n ...rest\n }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callChunks = splitCallsIntoChunks(calls, gasLimit)\n return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls, signal })\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 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}\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
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChainId } from '@pancakeswap/chains';
|
|
2
|
-
import { getContract } from 'viem';
|
|
2
|
+
import { getContract, BaseError, TimeoutError } from 'viem';
|
|
3
3
|
|
|
4
4
|
// ../utils/toBigInt.ts
|
|
5
5
|
function toBigInt(num) {
|
|
@@ -369,13 +369,36 @@ var multicall3ABI = [
|
|
|
369
369
|
}
|
|
370
370
|
];
|
|
371
371
|
|
|
372
|
+
// ../utils/abortControl.ts
|
|
373
|
+
var AbortError = class extends Error {
|
|
374
|
+
constructor(message) {
|
|
375
|
+
super(message);
|
|
376
|
+
this.name = "AbortError";
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
function abortInvariant(signal, message) {
|
|
380
|
+
if (signal?.aborted) {
|
|
381
|
+
throw new AbortError(message || "Signal aborted");
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function isViemAbortError(e) {
|
|
385
|
+
return e instanceof BaseError && e.walk((err) => err instanceof TimeoutError) instanceof TimeoutError;
|
|
386
|
+
}
|
|
387
|
+
|
|
372
388
|
// src/getBlockConflictTolerance.ts
|
|
373
389
|
function getBlockConflictTolerance(chainId) {
|
|
374
390
|
return BLOCK_CONFLICT_TOLERANCE[chainId] || DEFAULT_BLOCK_CONFLICT_TOLERANCE;
|
|
375
391
|
}
|
|
376
392
|
|
|
377
393
|
// src/multicall.ts
|
|
378
|
-
async function multicallByGasLimit(calls, {
|
|
394
|
+
async function multicallByGasLimit(calls, {
|
|
395
|
+
chainId,
|
|
396
|
+
gasBuffer = getDefaultGasBuffer(chainId),
|
|
397
|
+
client,
|
|
398
|
+
dropUnexecutedCalls,
|
|
399
|
+
signal,
|
|
400
|
+
...rest
|
|
401
|
+
}) {
|
|
379
402
|
const gasLimit = await getGasLimit({
|
|
380
403
|
chainId,
|
|
381
404
|
gasBuffer,
|
|
@@ -383,7 +406,7 @@ async function multicallByGasLimit(calls, { chainId, gasBuffer = getDefaultGasBu
|
|
|
383
406
|
...rest
|
|
384
407
|
});
|
|
385
408
|
const callChunks = splitCallsIntoChunks(calls, gasLimit);
|
|
386
|
-
return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls });
|
|
409
|
+
return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls, signal });
|
|
387
410
|
}
|
|
388
411
|
function formatCallReturn([blockNumber, results, successIndex]) {
|
|
389
412
|
const lastSuccessIndex = Number(successIndex);
|
|
@@ -403,7 +426,8 @@ async function call(calls, params) {
|
|
|
403
426
|
client,
|
|
404
427
|
gasBuffer = getDefaultGasBuffer(chainId),
|
|
405
428
|
blockConflictTolerance = getBlockConflictTolerance(chainId),
|
|
406
|
-
dropUnexecutedCalls = false
|
|
429
|
+
dropUnexecutedCalls = false,
|
|
430
|
+
signal
|
|
407
431
|
} = params;
|
|
408
432
|
if (!calls.length) {
|
|
409
433
|
return {
|
|
@@ -411,39 +435,47 @@ async function call(calls, params) {
|
|
|
411
435
|
blockNumber: 0n
|
|
412
436
|
};
|
|
413
437
|
}
|
|
438
|
+
abortInvariant(signal, "Multicall aborted");
|
|
414
439
|
const contract = getMulticallContract({ chainId, client });
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
440
|
+
try {
|
|
441
|
+
const { result } = await contract.simulate.multicallWithGasLimitation([calls, gasBuffer]);
|
|
442
|
+
const { results, lastSuccessIndex, blockNumber } = formatCallReturn(result);
|
|
443
|
+
if (lastSuccessIndex === calls.length - 1) {
|
|
444
|
+
return {
|
|
445
|
+
results,
|
|
446
|
+
blockNumber
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
console.warn(
|
|
450
|
+
`Gas limit reached. Total num of ${calls.length} calls. First ${lastSuccessIndex + 1} calls executed. The remaining ${calls.length - lastSuccessIndex - 1} calls are not executed. Pls try adjust the gas limit per call.`
|
|
451
|
+
);
|
|
452
|
+
const remainingCalls = calls.slice(lastSuccessIndex + 1);
|
|
453
|
+
if (dropUnexecutedCalls) {
|
|
454
|
+
return {
|
|
455
|
+
results: [...results, ...remainingCalls.map(() => ({ result: "0x", gasUsed: 0n, success: false }))],
|
|
456
|
+
blockNumber
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
const { results: remainingResults, blockNumber: nextBlockNumber } = await call(
|
|
460
|
+
calls.slice(lastSuccessIndex + 1),
|
|
461
|
+
params
|
|
462
|
+
);
|
|
463
|
+
if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {
|
|
464
|
+
throw new Error(
|
|
465
|
+
`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}`
|
|
466
|
+
);
|
|
467
|
+
}
|
|
428
468
|
return {
|
|
429
|
-
results: [...results, ...
|
|
430
|
-
|
|
469
|
+
results: [...results, ...remainingResults],
|
|
470
|
+
// Use the latest block number
|
|
471
|
+
blockNumber: nextBlockNumber
|
|
431
472
|
};
|
|
473
|
+
} catch (e) {
|
|
474
|
+
if (isViemAbortError(e)) {
|
|
475
|
+
throw new AbortError(e.message);
|
|
476
|
+
}
|
|
477
|
+
throw e;
|
|
432
478
|
}
|
|
433
|
-
const { results: remainingResults, blockNumber: nextBlockNumber } = await call(
|
|
434
|
-
calls.slice(lastSuccessIndex + 1),
|
|
435
|
-
params
|
|
436
|
-
);
|
|
437
|
-
if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {
|
|
438
|
-
throw new Error(
|
|
439
|
-
`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}`
|
|
440
|
-
);
|
|
441
|
-
}
|
|
442
|
-
return {
|
|
443
|
-
results: [...results, ...remainingResults],
|
|
444
|
-
// Use the latest block number
|
|
445
|
-
blockNumber: nextBlockNumber
|
|
446
|
-
};
|
|
447
479
|
}
|
|
448
480
|
async function callByChunks(chunks, params) {
|
|
449
481
|
const { blockConflictTolerance = getBlockConflictTolerance(params.chainId) } = params;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","../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 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}\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 { GetContractReturnType, PublicClient, getContract, Address } from 'viem'\n\nimport { MULTICALL_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL3_ADDRESS } from './constants/contracts'\nimport { iMulticallABI } from './abis/IMulticall'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({\n chainId,\n client,\n}: Params): GetContractReturnType<typeof iMulticallABI, PublicClient> {\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, publicClient: client })\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","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'\n\nimport { GetGasLimitParams, getDefaultGasBuffer, getGasLimit } from './getGasLimit'\nimport { MulticallRequestWithGas } from './types'\nimport { getMulticallContract } from './getMulticallContract'\nimport { getBlockConflictTolerance } from './getBlockConflictTolerance'\n\nexport type CallByGasLimitParams = 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\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n { chainId, gasBuffer = getDefaultGasBuffer(chainId), client, dropUnexecutedCalls, ...rest }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callChunks = splitCallsIntoChunks(calls, gasLimit)\n return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls })\n}\n\ntype CallParams = Pick<\n CallByGasLimitParams,\n 'chainId' | 'client' | 'gasBuffer' | 'blockConflictTolerance' | 'dropUnexecutedCalls'\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 } = params\n if (!calls.length) {\n return {\n results: [],\n blockNumber: 0n,\n }\n }\n\n const contract = getMulticallContract({ chainId, client })\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}\n\nasync function callByChunks(chunks: MulticallRequestWithGas[][], params: CallParams): Promise<CallResult> {\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}\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"]}
|
|
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 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}\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 { GetContractReturnType, PublicClient, getContract, Address } from 'viem'\n\nimport { MULTICALL_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL3_ADDRESS } from './constants/contracts'\nimport { iMulticallABI } from './abis/IMulticall'\n\ntype Params = {\n chainId: ChainId\n client?: PublicClient\n}\n\nexport function getMulticallContract({\n chainId,\n client,\n}: Params): GetContractReturnType<typeof iMulticallABI, PublicClient> {\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, publicClient: client })\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\nexport async function multicallByGasLimit(\n calls: MulticallRequestWithGas[],\n {\n chainId,\n gasBuffer = getDefaultGasBuffer(chainId),\n client,\n dropUnexecutedCalls,\n signal,\n ...rest\n }: CallByGasLimitParams,\n) {\n const gasLimit = await getGasLimit({\n chainId,\n gasBuffer,\n client,\n ...rest,\n })\n const callChunks = splitCallsIntoChunks(calls, gasLimit)\n return callByChunks(callChunks, { gasBuffer, client, chainId, dropUnexecutedCalls, signal })\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 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}\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/multicall.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { AbortControl } from '@pancakeswap/utils/abortControl';
|
|
1
2
|
import { GetGasLimitParams } from './getGasLimit';
|
|
2
3
|
import { MulticallRequestWithGas } from './types';
|
|
3
|
-
export type CallByGasLimitParams = GetGasLimitParams & {
|
|
4
|
+
export type CallByGasLimitParams = AbortControl & GetGasLimitParams & {
|
|
4
5
|
blockConflictTolerance?: number;
|
|
5
6
|
dropUnexecutedCalls?: boolean;
|
|
6
7
|
};
|
|
7
|
-
export declare function multicallByGasLimit(calls: MulticallRequestWithGas[], { chainId, gasBuffer, client, dropUnexecutedCalls, ...rest }: CallByGasLimitParams): Promise<CallResult>;
|
|
8
|
+
export declare function multicallByGasLimit(calls: MulticallRequestWithGas[], { chainId, gasBuffer, client, dropUnexecutedCalls, signal, ...rest }: CallByGasLimitParams): Promise<CallResult>;
|
|
8
9
|
export type SingleCallResult = {
|
|
9
10
|
result: string;
|
|
10
11
|
gasUsed: bigint;
|
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":"AACA,OAAO,EAAE,YAAY,EAA8B,MAAM,iCAAiC,CAAA;AAG1F,OAAO,EAAE,iBAAiB,EAAoC,MAAM,eAAe,CAAA;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAIjD,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAC7C,iBAAiB,GAAG;IAIlB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAG/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,CAAA;AAEH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,uBAAuB,EAAE,EAChC,EACE,OAAO,EACP,SAAwC,EACxC,MAAM,EACN,mBAAmB,EACnB,MAAM,EACN,GAAG,IAAI,EACR,EAAE,oBAAoB,uBAUxB;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.
|
|
3
|
+
"version": "3.4.0",
|
|
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": "1.19.11",
|
|
13
|
-
"@pancakeswap/sdk": "5.7.
|
|
14
|
-
"@pancakeswap/chains": "0.
|
|
13
|
+
"@pancakeswap/sdk": "5.7.5",
|
|
14
|
+
"@pancakeswap/chains": "0.4.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"tsup": "^6.7.0",
|
|
18
18
|
"@pancakeswap/tsconfig": "0.0.0",
|
|
19
|
-
"@pancakeswap/utils": "
|
|
19
|
+
"@pancakeswap/utils": "6.0.0"
|
|
20
20
|
},
|
|
21
21
|
"exports": {
|
|
22
22
|
"./package.json": "./package.json",
|