{"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 '@plexswap/sdk-core'\n\nexport function toBigInt(num: BigintIsh): bigint {\n  return BigInt(num.toString())\n}\n","import { ChainId } from '@plexswap/chains'\nimport { Address } from 'viem'\n\nexport const MULTICALL_ADDRESS: { [key in ChainId]?: Address } = {\n  [ChainId.BSC]: '0x39eecaE833c944ebb94942Fa44CaE46e87a8Da17',\n\n  // Testnets\n  [ChainId.BSC_TESTNET]: '0xeeF6ff30cF5D5b8aBA0DE16A01d17A0697a275b5',\n}\n\nexport const MULTICALL3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11'\n\nexport const MULTICALL3_ADDRESSES: {\n  [key in ChainId]?: Address\n} = {\n  [ChainId.BSC]: MULTICALL3_ADDRESS,\n  [ChainId.BSC_TESTNET]: MULTICALL3_ADDRESS,\n  [ChainId.PLEXCHAIN]:    '0x2210e34629E5B17B5F2D875a76098223d71F1D3E',\n}\n\nexport const multicalAddresses = {\n  [ChainId.BSC]:          MULTICALL3_ADDRESS,\n  [ChainId.BSC_TESTNET]:  MULTICALL3_ADDRESS,\n  [ChainId.PLEXCHAIN]:    '0x2210e34629E5B17B5F2D875a76098223d71F1D3E',\n} as const\n","import { ChainId } from '@plexswap/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.PLEXCHAIN]: 1,\n\n  // Testnets\n  [ChainId.BSC_TESTNET]: 3,\n}\n","import { ChainId } from '@plexswap/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.PLEXCHAIN]: DEFAULT_GAS_LIMIT,\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.PLEXCHAIN]: DEFAULT_GAS_BUFFER,\n}\n","import { ChainId } from '@plexswap/chains'\nimport { Address, PublicClient, getContract } from 'viem'\n\nimport { iMulticallABI } from './abis/IMulticall'\nimport { MULTICALL3_ADDRESS, MULTICALL3_ADDRESSES, MULTICALL_ADDRESS } from './constants/contracts'\n\ntype Params = {\n  chainId: ChainId\n  client?: PublicClient\n}\n\nexport function getMulticallContract({ chainId, client }: Params) {\n  const address = MULTICALL_ADDRESS[chainId]\n  if (!address) {\n    throw new Error(`PlexswapMulticall not supported on chain ${chainId}`)\n  }\n\n  return getContract({ abi: iMulticallABI, address, client: client as PublicClient })\n}\n\nexport function getMulticall3ContractAddress(chainId?: ChainId): Address {\n  return MULTICALL3_ADDRESSES[chainId || ChainId.BSC] || MULTICALL3_ADDRESS\n}","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 { ChainId } from '@plexswap/chains'\nimport { BigintIsh } from '@plexswap/sdk-core'\nimport { toBigInt } from '@plexswap/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 '@plexswap/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 { AbortControl, AbortError, abortInvariant } from '@plexswap/utils/abortControl'\nimport { toBigInt } from '@plexswap/utils/toBigInt'\nimport { isViemAbortError } from '@plexswap/utils/viem/isAbortError'\n\nimport { getBlockConflictTolerance } from './getBlockConflictTolerance'\nimport { GetGasLimitParams, getDefaultGasBuffer, getGasLimit } from './getGasLimit'\nimport { getMulticallContract } from './getMulticallContract'\nimport { MulticallRequestWithGas } from './types'\n\nexport type CallByGasLimitParams = AbortControl &\n  GetGasLimitParams & {\n    // Normally we expect to get quotes from within the same block\n    // But for some chains like BSC the block time is quite short so need some extra tolerance\n    // 0 means no block conflict and all the multicall results should be queried within the same block\n    blockConflictTolerance?: number\n\n    // Treat unexecuted calls as failed calls\n    dropUnexecutedCalls?: boolean\n\n    // Retry for failed calls with greater gas limit\n    retryFailedCallsWithGreaterLimit?:\n      | {\n          gasLimitMultiplier: number\n        }\n      | undefined\n  }\n\nexport async function multicallByGasLimit(\n  calls: MulticallRequestWithGas[],\n  {\n    chainId,\n    gasBuffer = getDefaultGasBuffer(chainId),\n    client,\n    dropUnexecutedCalls,\n    signal,\n    retryFailedCallsWithGreaterLimit,\n    ...rest\n  }: CallByGasLimitParams,\n) {\n  const gasLimit = await getGasLimit({\n    chainId,\n    gasBuffer,\n    client,\n    ...rest,\n  })\n  const callResult = await callByChunks(splitCallsIntoChunks(calls, gasLimit), {\n    gasBuffer,\n    client,\n    chainId,\n    dropUnexecutedCalls,\n    signal,\n  })\n  if (!retryFailedCallsWithGreaterLimit) {\n    return callResult\n  }\n\n  const { gasLimitMultiplier: retryGasLimitMultiplier } = retryFailedCallsWithGreaterLimit\n  async function retryFailedCalls(result: CallResult) {\n    if (result.results.every((r) => r.success)) {\n      return result\n    }\n\n    let callsToRetry: MulticallRequestWithGas[] = []\n    const failedCallIndexes: number[] = []\n    for (const [index, { success }] of result.results.entries()) {\n      if (!success) {\n        failedCallIndexes.push(index)\n        callsToRetry.push(calls[index])\n      }\n    }\n    if (callsToRetry.some((c) => BigInt(c.gasLimit) > gasLimit)) {\n      console.warn(\n        'Failed to retry with greater limit. The gas limit of some of the calls exceeds the maximum gas limit set by chain',\n      )\n      return result\n    }\n    callsToRetry = callsToRetry.map((c) => ({ ...c, gasLimit: BigInt(c.gasLimit) * BigInt(retryGasLimitMultiplier) }))\n    const retryResult = await callByChunks(splitCallsIntoChunks(callsToRetry, gasLimit), {\n      gasBuffer,\n      client,\n      chainId,\n      dropUnexecutedCalls,\n      signal,\n    })\n    const resultsAfterRetry = [...result.results]\n    for (const [retryIndex, originalIndex] of failedCallIndexes.entries()) {\n      resultsAfterRetry[originalIndex] = retryResult.results[retryIndex]\n    }\n    return retryFailedCalls({\n      results: resultsAfterRetry,\n      blockNumber: retryResult.blockNumber,\n    })\n  }\n\n  return retryFailedCalls(callResult)\n}\n\ntype CallParams = Pick<\n  CallByGasLimitParams,\n  'chainId' | 'client' | 'gasBuffer' | 'blockConflictTolerance' | 'dropUnexecutedCalls' | 'signal'\n>\n\nexport type SingleCallResult = {\n  result: string\n  gasUsed: bigint\n  success: boolean\n}\n\nexport type CallResult = {\n  results: SingleCallResult[]\n  // Will be the greatest block number if block conflict tolerance is not 0\n  blockNumber: bigint\n}\n\nexport type MulticallReturn = CallResult & {\n  lastSuccessIndex: number\n}\n\ntype CallReturnFromContract = [bigint, { success: boolean; gasUsed: bigint; returnData: string }[], bigint]\n\nfunction formatCallReturn([blockNumber, results, successIndex]: CallReturnFromContract): MulticallReturn {\n  const lastSuccessIndex = Number(successIndex)\n  return {\n    lastSuccessIndex,\n    blockNumber,\n    results: results.slice(0, lastSuccessIndex + 1).map(({ gasUsed, success, returnData }) => ({\n      gasUsed,\n      success,\n      result: returnData,\n    })),\n  }\n}\n\nasync function call(calls: MulticallRequestWithGas[], params: CallParams): Promise<CallResult> {\n  const {\n    chainId,\n    client,\n    gasBuffer = getDefaultGasBuffer(chainId),\n    blockConflictTolerance = getBlockConflictTolerance(chainId),\n    dropUnexecutedCalls = false,\n    signal,\n  } = params\n  if (!calls.length) {\n    return {\n      results: [],\n      blockNumber: 0n,\n    }\n  }\n\n  abortInvariant(signal, 'Multicall aborted')\n\n  const contract = getMulticallContract({ chainId, client })\n  try {\n    const { result } = await contract.simulate.multicallWithGasLimitation([calls, gasBuffer])\n    const { results, lastSuccessIndex, blockNumber } = formatCallReturn(result as CallReturnFromContract)\n    if (lastSuccessIndex === calls.length - 1) {\n      return {\n        results,\n        blockNumber,\n      }\n    }\n    console.warn(\n      `Gas limit reached. Total num of ${calls.length} calls. First ${\n        lastSuccessIndex + 1\n      } calls executed. The remaining ${\n        calls.length - lastSuccessIndex - 1\n      } calls are not executed. Pls try adjust the gas limit per call.`,\n    )\n    const remainingCalls = calls.slice(lastSuccessIndex + 1)\n    if (dropUnexecutedCalls) {\n      return {\n        results: [...results, ...remainingCalls.map(() => ({ result: '0x', gasUsed: 0n, success: false }))],\n        blockNumber,\n      }\n    }\n    const { results: remainingResults, blockNumber: nextBlockNumber } = await call(\n      calls.slice(lastSuccessIndex + 1),\n      params,\n    )\n    if (Number(nextBlockNumber - blockNumber) > blockConflictTolerance) {\n      throw new Error(\n        `Multicall failed because of block conflict. Latest calls are made at block ${nextBlockNumber} while last calls made at block ${blockNumber}. Block conflict tolerance is ${blockConflictTolerance}`,\n      )\n    }\n    return {\n      results: [...results, ...remainingResults],\n      // Use the latest block number\n      blockNumber: nextBlockNumber,\n    }\n  } catch (e: any) {\n    if (isViemAbortError(e)) {\n      throw new AbortError(e.message)\n    }\n    throw e\n  }\n}\n\nasync function callByChunks(chunks: MulticallRequestWithGas[][], params: CallParams): Promise<CallResult> {\n  try {\n    const { blockConflictTolerance = getBlockConflictTolerance(params.chainId) } = params\n    const callReturns = await Promise.all(chunks.map((chunk) => call(chunk, params)))\n\n    let minBlock = 0n\n    let maxBlock = 0n\n    let results: SingleCallResult[] = []\n    for (const { results: callResults, blockNumber } of callReturns) {\n      if (minBlock === 0n || blockNumber < minBlock) {\n        minBlock = blockNumber\n      }\n      if (blockNumber > maxBlock) {\n        maxBlock = blockNumber\n      }\n      if (Number(maxBlock - minBlock) > blockConflictTolerance) {\n        throw new Error(\n          `Multicall failed because of block conflict. Min block is ${minBlock} while max block is ${maxBlock}. Block conflict tolerance is ${blockConflictTolerance}`,\n        )\n      }\n      results = [...results, ...callResults]\n    }\n    return {\n      results,\n      blockNumber: maxBlock,\n    }\n  } catch (e: unknown) {\n    // Happened on zksync\n    if (e instanceof Error && e.message.includes('Storage invocations limit reached') && chunks[0].length > 1) {\n      return callByChunks(divideChunks(chunks), params)\n    }\n    throw e\n  }\n}\n\nfunction divideChunks<T>(chunks: T[][]) {\n  const newChunks: T[][] = []\n\n  for (const chunk of chunks) {\n    const half = Math.ceil(chunk.length / 2)\n\n    const firstHalf = chunk.slice(0, half)\n    const secondHalf = chunk.slice(half)\n    if (firstHalf.length) {\n      newChunks.push(firstHalf)\n    }\n    if (secondHalf.length) {\n      newChunks.push(secondHalf)\n    }\n  }\n\n  return newChunks\n}\n\nfunction splitCallsIntoChunks(calls: MulticallRequestWithGas[], gasLimit: bigint): MulticallRequestWithGas[][] {\n  const chunks: MulticallRequestWithGas[][] = [[]]\n\n  let gasLeft = gasLimit\n  for (const callRequest of calls) {\n    const { target, callData, gasLimit: gasCostLimit } = callRequest\n    const singleGasLimit = toBigInt(gasCostLimit)\n    const currentChunk = chunks[chunks.length - 1]\n    if (singleGasLimit > gasLeft) {\n      chunks.push([callRequest])\n      gasLeft = gasLimit - singleGasLimit\n\n      // Single call exceeds the gas limit\n      if (gasLeft < 0n) {\n        console.warn(\n          `Multicall request may fail as the gas cost of a single call exceeds the gas limit ${gasLimit}. Gas cost: ${singleGasLimit}. To: ${target}. Data: ${callData}`,\n        )\n      }\n      continue\n    }\n\n    currentChunk.push(callRequest)\n    gasLeft -= singleGasLimit\n  }\n\n  return chunks\n}\n"]}