{"version":3,"sources":["../../src/utils/common.ts","../../src/constants/common.ts","../../src/contracts/addreses/zap.ts","../../src/utils/index.ts","../../src/contracts/abis/IERC7412.ts","../../src/utils/parseError.ts","../../src/contracts/addreses/oracleProxy.ts"],"sourcesContent":["import { Address, formatEther, maxUint128, parseEther } from 'viem';\n\nimport { mainnet, base, optimism, arbitrum, baseSepolia, arbitrumSepolia, Chain } from 'viem/chains';\nimport { randomBytes } from 'crypto';\nimport { publicRpcEndpoints } from '../constants';\nimport { ZAP_BY_CHAIN } from '../contracts/addreses/zap';\n\nexport function getPublicRpcEndpoint(chainId: number) {\n  return publicRpcEndpoints[chainId];\n}\n\n/**\n * Gets the chain object for the given chain id.\n * @param chainId - Chain id of the target EVM chain.\n * @returns Viem's chain object.\n */\nexport function getChain(chainId: number): Chain {\n  const chains = [mainnet, base, optimism, arbitrum, baseSepolia, arbitrumSepolia];\n  for (const chain of Object.values(chains)) {\n    if (chain.id === chainId) {\n      return chain;\n    }\n  }\n  throw new Error(`Chain with id ${chainId} not found`);\n}\n\nexport function convertWeiToEther(amountInWei: string | bigint | undefined): number {\n  if (amountInWei == undefined) {\n    throw new Error('Invalid amount received during conversion: undefined');\n  }\n  if (typeof amountInWei == 'bigint') {\n    return Number(formatEther(amountInWei));\n  } else if (typeof amountInWei == 'string') {\n    return Number(formatEther(BigInt(amountInWei)));\n  } else {\n    throw new Error('Expected string or bigint for conversion');\n  }\n}\n\nexport function convertEtherToWei(amount: string | number | undefined): bigint {\n  if (amount == undefined) {\n    throw new Error('Invalid amount received during conversion: undefined');\n  }\n  if (typeof amount == 'number') {\n    return parseEther(amount.toString());\n  } else if (typeof amount == 'string') {\n    return parseEther(amount);\n  } else {\n    throw new Error('Expected string or bigint for conversion');\n  }\n}\n\nexport function sleep(seconds: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n\nexport function generateRandomAccountId(): bigint {\n  const maxUint128Half = maxUint128 / BigInt(2);\n\n  const buffer = randomBytes(8); // 8 bytes * 8 bits/byte = 64 bits\n  const randomAccountId = BigInt('0x' + buffer.toString('hex'));\n  if (randomAccountId > maxUint128Half) {\n    throw new Error('Account ID greater than Maxuint128');\n  }\n  return randomAccountId;\n}\n\n/**\n * @name batchArray\n * @description This function batches an array into smaller subarrays based on a given size. It uses the reduce method to iterate over the array and push each batch into an accumulator array.\n * @param {any[]} arr - The array that needs to be batched.\n * @param {number} batchSize - The number of elements to include in each subarray.\n * @returns {any[][]} - An array of arrays, where each inner array contains the batched subarrays.\n */\nexport const batchArray = <T>(arr: T[], batchSize: number): T[][] => {\n  return arr.reduce((acc, _, i) => (i % batchSize ? acc : [...acc, arr.slice(i, i + batchSize)]), [] as T[][]);\n};\n\nexport type QuoteParams = {\n  fromChain: number;\n  fromToken: Address;\n  toToken: Address;\n  fromAmount: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FetcherArgs = Omit<RequestInit, 'body'> & { body?: any };\n\nexport const fetcher = (\n  url: string,\n  init: FetcherArgs = {\n    headers: {\n      'Content-Type': 'application/json',\n    },\n  },\n) =>\n  fetch(url, {\n    ...init,\n    body: JSON.stringify(init.body),\n    headers: init.headers,\n    method: init.body && !init.method ? 'POST' : init.method,\n  });\n\nconst odoFetcher = async (url: string, options: FetcherArgs) => {\n  return fetcher(`https://api.odos.xyz/sor${url}`, options);\n};\n\nconst assemblePath = async (user: string, pathId: string) => {\n  const response = await odoFetcher(`/assemble`, {\n    body: {\n      userAddr: user,\n      pathId,\n    },\n    headers: {\n      'Content-Type': 'application/json',\n    },\n  });\n\n  if (!response.ok) return '';\n  const data = (await response.json()) as { transaction: { data: string } };\n\n  return data.transaction.data;\n};\n\nexport const getOdosPath = async (quoteParams: QuoteParams) => {\n  if (!quoteParams.fromToken || !quoteParams.toToken || !quoteParams.fromAmount) {\n    throw new Error('Missing required parameters for Odos path generation');\n  }\n\n  const data = {\n    chainId: quoteParams.fromChain,\n    inputTokens: [{ tokenAddress: quoteParams.fromToken, amount: quoteParams.fromAmount }],\n    outputTokens: [{ tokenAddress: quoteParams.toToken, proportion: 1 }],\n    userAddr: ZAP_BY_CHAIN[quoteParams.fromChain],\n  };\n\n  const response = await odoFetcher('/quote/v2', {\n    body: data,\n    headers: {\n      'Content-Type': 'application/json',\n    },\n  });\n\n  if (!response.ok) {\n    console.error(`Failed to get Odos quote: ${response.status} ${response.statusText}`);\n    return { path: '' };\n  }\n\n  const quote = (await response.json()) as { pathId: string };\n  if (!quote?.pathId) {\n    console.error('Invalid response from Odos API: missing pathId');\n    return { path: '' };\n  }\n  const quoteId = quote.pathId;\n\n  const path = await assemblePath(data.userAddr, quoteId);\n  if (!path) {\n    console.error('Failed to assemble path from pathId');\n  }\n\n  return { path };\n};\n","import { Hex, zeroAddress } from 'viem';\nimport { MarketIdOrName } from '../interface/commonTypes';\nimport { SUPPORTED_CHAINS } from './chains';\n\nexport const ZERO_ADDRESS: Hex = zeroAddress;\n\nexport const SIG_ORACLE_DATA_REQUIRED = '0xcf2cabdf';\nexport const SIG_FEE_REQUIRED = '0x0e7186fb';\nexport const SIG_ERRORS = '0x0b42fd17';\n\n// for markets metadata it is requesting too much oracle updates\nexport const MAX_ERC7412_RETRIES = 80; // Limit the max failures to prevent infinite loops\n\n// List of market ids disabled by chainId\nexport const DISABLED_MARKETS: { [key: number]: number[] } = {\n  84532: [3, 6300],\n  8453: [6300],\n};\n\nexport const publicRpcEndpoints: { [key: number]: string } = {\n  8453: 'https://base.llamarpc.com',\n  84532: 'https://sepolia.base.org',\n  42161: 'https://arbitrum.llamarpc.com',\n  421614: 'https://sepolia-rollup.arbitrum.io/rpc',\n};\n\n// Logger constants\nexport type LOGGER_MESSAGE_TYPE = 'json' | 'pretty' | 'hidden';\n\n// 0: silly, 1: trace, 2: debug, 3: info, 4: warn, 5: error, 6: fatal\nexport const DEFAULT_LOGGER_LEVEL = 4; // https://tslog.js.org/#/?id=highlights to see more levels\nexport const CUSTOM_DECIMALS: Record<number, Record<MarketIdOrName, number>> = {\n  [SUPPORTED_CHAINS.ARBITUM_SEPOLIA]: {\n    2: 6,\n    USDC: 6,\n  },\n  [SUPPORTED_CHAINS.ARBITRUM]: {\n    2: 6,\n    USDC: 6,\n  },\n  [SUPPORTED_CHAINS.BASE_SEPOLIA]: {\n    1: 6,\n    USDC: 6,\n  },\n  [SUPPORTED_CHAINS.BASE]: {\n    1: 6,\n    USDC: 6,\n  },\n};\n","import { Address, zeroAddress } from 'viem';\nimport { SUPPORTED_CHAINS } from '../../constants/chains';\n\nexport const ZAP_BY_CHAIN: Record<number, Address> = {\n  [SUPPORTED_CHAINS.BASE]: '0x459Bbb4231f0a606DC514BacD5712A5922CBe6c8',\n  [SUPPORTED_CHAINS.BASE_SEPOLIA]: zeroAddress,\n  [SUPPORTED_CHAINS.ARBITRUM]: '0x9ec181B2E69fB36C50031F0c87Bc0749b766A9f4',\n  [SUPPORTED_CHAINS.ARBITUM_SEPOLIA]: '0xb569ed692206a1d73996088ae646333b1d59d9c5',\n};\n\nexport const SYNTHETIX_ZAP: Record<number, Address> = {\n  [SUPPORTED_CHAINS.BASE_SEPOLIA]: '0xA6Fab50eB36F3eB2118eE2f4C12C968F8608bbc9',\n  [SUPPORTED_CHAINS.BASE]: '0xA6Fab50eB36F3eB2118eE2f4C12C968F8608bbc9',\n};\n","export * from './common';\n\nimport {\n  Abi,\n  Address,\n  CallExecutionError,\n  CallParameters,\n  decodeAbiParameters,\n  decodeErrorResult,\n  decodeFunctionResult,\n  encodeAbiParameters,\n  encodeFunctionData,\n  Hash,\n  Hex,\n  parseAbiParameters,\n  StateMapping,\n  StateOverride,\n} from 'viem';\nimport { SynthetixSdk } from '..';\nimport { IERC7412Abi } from '../contracts/abis/IERC7412';\nimport { Call3Value, Result } from '../interface/contractTypes';\nimport { parseError } from './parseError';\nimport { MAX_ERC7412_RETRIES, SIG_ERRORS, SIG_FEE_REQUIRED, SIG_ORACLE_DATA_REQUIRED } from '../constants';\nimport {\n  OverrideParamsRead,\n  OverrideParamsWrite,\n  TransactionData,\n  WriteContractParams,\n  WriteErc7412,\n  WriteReturnType,\n} from '../interface/commonTypes';\nimport { batchArray } from './common';\nimport { ORACLE_PROXY_BY_CHAIN } from '../contracts/addreses/oracleProxy';\n/**\n * Utility class\n *\n */\nexport class Utils {\n  sdk: SynthetixSdk;\n  constructor(synthetixSdk: SynthetixSdk) {\n    this.sdk = synthetixSdk;\n  }\n\n  public async isOracleCall(data: TransactionData | Address) {\n    return Object.values(ORACLE_PROXY_BY_CHAIN)\n      .map((a) => a.toLowerCase())\n      .includes(typeof data === 'string' ? data.toLowerCase() : data.to.toLowerCase());\n  }\n\n  /**\n   * Returns the Pyth price ids array\n   * @param oracleQueryData\n   * @returns Pyth Price IDs array\n   */\n  public getPythPriceIdsFromOracleQuery(oracleQueryData: Hex): Hex[] {\n    const values = decodeAbiParameters(parseAbiParameters('uint8, uint64, bytes32[]'), oracleQueryData);\n    return values[2] as Hex[];\n  }\n\n  /**\n   * Decodes the response from a Smart contract function call\n   * @param abi Contract ABI\n   * @param functionName Function name to decode\n   * @param result Response from function call that needs to be decoded\n   * @returns Decoded result\n   */\n  public decodeResponse(abi: unknown, functionName: string, result: Hex) {\n    const decodedResult = decodeFunctionResult({\n      abi: abi as Abi,\n      functionName: functionName,\n      data: result,\n    });\n\n    return decodedResult;\n  }\n\n  /**\n   * Determines the type of Error emitted by ERC7412 contract and prepares signed update data\n   * @param data Error data emitted from ERC7412 contract\n   * @returns Encoded data for oracle price update transaction\n   */\n  public async fetchOracleUpdateData(data: Hex): Promise<Hex> {\n    const [updateType] = decodeAbiParameters([{ name: 'updateType', type: 'uint8' }], data);\n\n    if (updateType === 1) {\n      const [updateType, stalenessOrTime, priceIds] = decodeAbiParameters(\n        [\n          { name: 'updateType', type: 'uint8' },\n          { name: 'stalenessTolerance', type: 'uint64' },\n          { name: 'priceIds', type: 'bytes32[]' },\n        ],\n        data,\n      );\n\n      const stalenessTolerance = stalenessOrTime;\n      const updateData = (await this.sdk.pyth.pythConnection.getPriceFeedsUpdateData(\n        priceIds as string[],\n      )) as unknown as Address[];\n\n      return encodeAbiParameters(\n        [\n          { type: 'uint8', name: 'updateType' },\n          { type: 'uint64', name: 'stalenessTolerance' },\n          { type: 'bytes32[]', name: 'priceIds' },\n          { type: 'bytes[]', name: 'updateData' },\n        ],\n        [updateType, stalenessTolerance, priceIds, updateData],\n      );\n    } else if (updateType === 2) {\n      const [updateType, requestedTime, priceId] = decodeAbiParameters(\n        [\n          { name: 'updateType', type: 'uint8' },\n          { name: 'requestedTime', type: 'uint64' },\n          { name: 'priceIds', type: 'bytes32' },\n        ],\n        data,\n      );\n      this.sdk.logger.info('Update type: ', updateType);\n      this.sdk.logger.info('priceIds: ', priceId);\n\n      const [priceFeedUpdateVaa] = await this.sdk.pyth.pythConnection.getVaa(\n        priceId as string,\n        Number((requestedTime as unknown as bigint).toString()),\n      );\n      const priceFeedUpdate = '0x' + Buffer.from(priceFeedUpdateVaa, 'base64').toString('hex');\n\n      return encodeAbiParameters(\n        [\n          { type: 'uint8', name: 'updateType' },\n          { type: 'uint64', name: 'timestamp' },\n          { type: 'bytes32[]', name: 'priceIds' },\n          { type: 'bytes[]', name: 'updateData' },\n        ],\n        [updateType, requestedTime, [priceId], [priceFeedUpdate as Address]],\n      );\n    } else {\n      throw new Error(`Error encoding/decoding data`);\n    }\n  }\n\n  async handleOracleDataRequiredError(parsedError: Hash): Promise<Call3Value> {\n    const err = decodeErrorResult({\n      abi: IERC7412Abi,\n      data: parsedError,\n    });\n\n    const oracleAddress = err.args![0] as Address;\n    const oracleQuery = err.args![1] as Hex;\n    const signedRequiredData = await this.fetchOracleUpdateData(oracleQuery);\n    const dataVerificationTx = this.generateDataVerificationTx(oracleAddress, signedRequiredData);\n\n    return dataVerificationTx;\n  }\n\n  /**\n   * Handles ERC7412 error by creating a price update tx which is prepended to the existing calls\n   * @param error Error thrown by the call function\n   * @param calls Multicall call data\n   * @returns call array with ERC7412 fulfillOracleQuery transaction\n   */\n  public async handleErc7412Error(parsedError: Hash): Promise<Call3Value[]> {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let err: any;\n\n    try {\n      err = decodeErrorResult({\n        abi: IERC7412Abi,\n        data: parsedError,\n      });\n    } catch (decodeErr) {\n      this.sdk.logger.error('Decode Error: ', decodeErr);\n      throw new Error('Handle ERC7412 error');\n    }\n    if (!['OracleDataRequired', 'FeeRequired', 'Errors'].includes(err?.errorName))\n      throw new Error('Handle ERC7412 error');\n\n    if (err?.errorName === 'Errors') {\n      const oracleErrors = err.args[0] as Hex[];\n      let oracleCalls: Call3Value[] = [];\n      const batchedOracleErrors = batchArray<Hex>(oracleErrors, 10);\n\n      for (const oracleErrors of batchedOracleErrors) {\n        const promiseOracleCalls = oracleErrors.map((oracleError) => {\n          return this.handleErc7412Error(oracleError);\n        });\n        const resolvedCalls = await Promise.all(promiseOracleCalls);\n        oracleCalls = [...oracleCalls, ...resolvedCalls.flat()];\n      }\n\n      return oracleCalls.flat();\n    }\n\n    if (err?.errorName === 'OracleDataRequired') {\n      return [await this.handleOracleDataRequiredError(parsedError)];\n    }\n\n    // this.sdk.logger.info('Fee Required oracle error. Adding fee to tx.value', err);\n    // if (!calls.length) throw new Error('Handle ERC7412 error: Calls.length == 0');\n    //\n    // calls[0].value = err.args[0] as bigint;\n\n    return [];\n  }\n\n  /**\n   * Generates Call3Value tx for Price update data of Oracle\n   * @param oracleContract Oracle Contract address\n   * @param signedRequiredData Encoded Price Update data\n   * @returns Transaction Request for Oracle price update\n   */\n  public generateDataVerificationTx(_oracleContract: Hex, signedRequiredData: string): Call3Value {\n    const priceUpdateCall: Call3Value = {\n      target: ORACLE_PROXY_BY_CHAIN[this.sdk.rpcConfig.chainId],\n      callData: encodeFunctionData({\n        abi: IERC7412Abi as unknown as Abi,\n        functionName: 'fulfillOracleQuery',\n        args: [signedRequiredData],\n      }),\n      value: 0n,\n      requireSuccess: false,\n    };\n    return priceUpdateCall;\n  }\n\n  /**\n   * Calls the `functionName` on `contractAddress` target using the Multicall contract. If the call requires\n   * a price update, ERC7412 price update tx is prepended to the tx.\n   * @param contractAddress Target contract address for the call\n   * @param abi Contract ABI\n   * @param functionName Function to be called on the contract\n   * @param args Arguments list for the function call\n   * @param calls Array of Call3Value calls for Multicall contract\n   * @returns Response from the contract function call\n   */\n  public async callErc7412({ contractAddress, abi, args, functionName, calls = [] }: WriteContractParams) {\n    const multicallInstance = await this.sdk.contracts.getMulticallInstance();\n\n    const currentCall: Call3Value = {\n      target: contractAddress,\n      callData: encodeFunctionData({\n        abi: abi as Abi,\n        functionName: functionName,\n        args: args,\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n\n    calls.push(currentCall);\n\n    const publicClient = this.sdk.getPublicClient();\n\n    const oracleCalls = await this.getMissingOracleCalls(calls);\n    const multicallData = encodeFunctionData({\n      abi: multicallInstance.abi,\n      functionName: 'aggregate3Value',\n      args: [[...oracleCalls, ...calls]],\n    });\n\n    const totalValue = [...oracleCalls, ...calls].reduce((acc, tx) => {\n      return acc + (tx.value || 0n);\n    }, 0n);\n\n    const finalTx = {\n      account: this.sdk.accountAddress,\n      to: multicallInstance.address,\n      data: multicallData,\n      value: totalValue,\n    };\n\n    const response = await publicClient.call(finalTx);\n    this.sdk.logger.info('=== response', response);\n    if (!response.data) throw new Error('Error decoding call data');\n    const multicallResult: Result[] = this.decodeResponse(\n      multicallInstance.abi,\n      'aggregate3Value',\n      response.data as Hex,\n    ) as unknown as Result[];\n\n    const returnData = multicallResult.at(-1);\n\n    if (!returnData?.success) throw new Error('Error decoding call data');\n\n    const decodedResult = this.decodeResponse(abi, functionName, returnData.returnData);\n    return decodedResult;\n  }\n\n  /**\n   * Calls the `functionName` on `contractAddress` target using the Multicall contract. If the call requires\n   * a price update, ERC7412 price update tx is prepended to the tx.\n   * @param contractAddress Target contract address for the call\n   * @param abi Contract ABI\n   * @param functionName Function to be called on the contract\n   * @param argsList Array of arguments list for the function call\n   * @param calls Array of Call3Value calls for Multicall contract\n   * @returns Array of responses from the contract function call for the multicalls\n   */\n  public async multicallErc7412({\n    contractAddress,\n    abi,\n    functionName,\n    args: argsList,\n    calls = [],\n  }: WriteContractParams) {\n    const multicallInstance = await this.sdk.contracts.getMulticallInstance();\n    // Format the args to the required array format\n    argsList = argsList.map((args) => (Array.isArray(args) ? args : [args]));\n\n    argsList.forEach((args) => {\n      const currentCall: Call3Value = {\n        target: contractAddress,\n        callData: encodeFunctionData({\n          abi: abi as Abi,\n          functionName: functionName,\n          args: args as unknown[],\n        }),\n        value: 0n,\n        requireSuccess: true,\n      };\n      calls.push(currentCall);\n    });\n    calls = calls.map((call) => {\n      return {\n        ...call,\n        requireSuccess: call.value === 0n ? true : false,\n      };\n    });\n    const oracleCalls = await this.getMissingOracleCalls(calls);\n\n    const numCalls = calls.length - oracleCalls.length;\n\n    const publicClient = this.sdk.getPublicClient();\n\n    const totalValue = [...oracleCalls, ...calls].reduce((acc, tx) => {\n      return acc + (tx.value || 0n);\n    }, 0n);\n\n    const multicallData = encodeFunctionData({\n      abi: multicallInstance.abi,\n      functionName: 'aggregate3Value',\n      args: [[...oracleCalls, ...calls]],\n    });\n\n    const finalTx = {\n      account: this.sdk.accountAddress,\n      to: multicallInstance.address,\n      data: multicallData,\n      value: totalValue,\n    };\n\n    const response = await publicClient.call(finalTx);\n    const multicallResult: Result[] = this.decodeResponse(\n      multicallInstance.abi,\n      'aggregate3Value',\n      response.data as Hex,\n    ) as unknown as Result[];\n\n    const callsToDecode = multicallResult.slice(-numCalls);\n\n    const decodedResult = callsToDecode.map((result) => this.decodeResponse(abi, functionName, result.returnData));\n    return decodedResult;\n  }\n  protected isWriteContractParams(data: WriteErc7412): data is WriteContractParams {\n    return (data as WriteContractParams).contractAddress !== undefined;\n  }\n\n  /**\n   * Simulates the `functionName` on `contractAddress` target using the Multicall contract and returns the\n   * final transaction call with ERC7412 price update data if required\n   * @param contractAddress Target contract address for the call\n   * @param abi Contract ABI\n   * @param functionName Function to be called on the contract\n   * @param args Arguments list for the function call\n   * @param calls Array of Call3Value calls for Multicall contract\n   * @param override Override parameters for the transaction\n   * @returns Final transaction call with ERC7412 price update data if required\n   */\n  public async writeErc7412(\n    data: WriteErc7412,\n    override: OverrideParamsWrite = {\n      shouldRevertOnTxFailure: true,\n    },\n  ): Promise<TransactionData> {\n    const calls: Call3Value[] = data.calls ?? [];\n    const multicallInstance = await this.sdk.contracts.getMulticallInstance();\n\n    if (this.isWriteContractParams(data)) {\n      const { contractAddress, abi, functionName, args } = data as WriteContractParams;\n      const currentCall: Call3Value = {\n        target: contractAddress,\n        callData: encodeFunctionData({\n          abi: abi as Abi,\n          functionName: functionName,\n          args: args,\n        }),\n        value: 0n,\n        requireSuccess: true,\n      };\n      calls.push(currentCall);\n    }\n\n    const multicallData = encodeFunctionData({\n      abi: multicallInstance.abi,\n      functionName: 'aggregate3Value',\n      args: [calls],\n    });\n\n    let totalValue = 0n;\n    for (const tx of calls) {\n      totalValue += tx.value || 0n;\n    }\n\n    const finalTx = {\n      account: override.account || this.sdk.accountAddress,\n      to: multicallInstance.address,\n      data: multicallData,\n      value: totalValue,\n    };\n\n    const publicClient = this.sdk.getPublicClient();\n\n    if (override.shouldRevertOnTxFailure) await publicClient.call(finalTx);\n\n    return this._fromCallDataToTransactionData(finalTx);\n  }\n\n  /**\n   * Calls the `functionName` on `contractAddress` target using the Multicall contract. If the call requires\n   * a price update, ERC7412 price update tx is prepended to the tx.\n   * @param contractAddress Target contract address for the call\n   * @param abi Contract ABI\n   * @param functionNames Function to be called on the contract\n   * @param argsList Array of arguments list for the function call\n   * @param calls Array of Call3Value calls for Multicall contract\n   * @returns Array of responses from the contract function call for the multicalls\n   */\n  public async multicallMultifunctionErc7412(\n    {\n      contractAddress,\n      abi,\n      functionNames,\n      args: argsList,\n      calls = [],\n    }: Omit<WriteContractParams, 'functionName'> & { functionNames: string[] },\n    override: OverrideParamsRead = {},\n  ) {\n    const multicallInstance = await this.sdk.contracts.getMulticallInstance();\n\n    // Format the args to the required array format\n    argsList = argsList.map((args) => (Array.isArray(args) ? args : [args]));\n\n    if (argsList.length != functionNames.length) {\n      throw new Error(\"Inconsistent data: args and functionName don't match\");\n    }\n    argsList.forEach((args, index) => {\n      const currentCall: Call3Value = {\n        target: contractAddress,\n        callData: encodeFunctionData({\n          abi: abi as Abi,\n          functionName: functionNames[index],\n          args: args as unknown[],\n        }),\n        value: 0n,\n        requireSuccess: true,\n      };\n      calls.push(currentCall);\n    });\n\n    const publicClient = this.sdk.getPublicClient();\n    const oracleCalls = await this.getMissingOracleCalls(calls);\n\n    const multicallData = encodeFunctionData({\n      abi: multicallInstance.abi,\n      functionName: 'aggregate3Value',\n      args: [[...oracleCalls, ...calls]],\n    });\n\n    let totalValue = 0n;\n    for (const tx of [...oracleCalls, ...calls]) {\n      totalValue += tx.value || 0n;\n    }\n\n    const finalTx = {\n      account: override.account || this.sdk.accountAddress,\n      to: multicallInstance.address,\n      data: multicallData,\n      value: totalValue,\n    };\n\n    const response = await publicClient.call(finalTx);\n    this.sdk.logger.info('=== response', response);\n    const multicallResult: Result[] = this.decodeResponse(\n      multicallInstance.abi,\n      'aggregate3Value',\n      response.data as Hex,\n    ) as unknown as Result[];\n\n    const callsToDecode = multicallResult.slice(-oracleCalls.length);\n\n    const decodedResult = callsToDecode.map((result, idx) =>\n      this.decodeResponse(abi, functionNames[idx], result.returnData),\n    );\n    return decodedResult;\n  }\n\n  public async getMissingOracleCalls(\n    calls: Call3Value[],\n    oracleCalls: Call3Value[] = [],\n    {\n      attemps = MAX_ERC7412_RETRIES,\n      account,\n      stateOverride,\n    }: { account?: Address; attemps?: number; stateOverride?: StateOverride } = {},\n  ): Promise<Call3Value[]> {\n    const publicClient = this.sdk.getPublicClient();\n    const totalValue = [...oracleCalls, ...calls].reduce((acc, tx) => {\n      return acc + (tx.value || 0n);\n    }, 0n);\n    this.sdk.logger.info('=== init data', { oracleCalls, calls, attemps });\n    const multicallInstance = await this.sdk.contracts.getMulticallInstance();\n    const multicallData = encodeFunctionData({\n      abi: multicallInstance.abi,\n      functionName: 'aggregate3Value',\n      args: [[...oracleCalls, ...calls]],\n    });\n\n    const parsedTx = {\n      account: account || this.sdk.accountAddress,\n      to: multicallInstance.address,\n      data: multicallData,\n      value: totalValue,\n      stateOverride,\n    };\n\n    try {\n      await publicClient.call(parsedTx);\n      return oracleCalls;\n    } catch (error) {\n      const parsedError = parseError(error as CallExecutionError);\n      this.sdk.logger.error('=== parsedError in getMissingOracleCalls', parsedError);\n      const shouldRetry = this.shouldRetryLogic(error, attemps);\n      console.log('=== shouldRetry', { shouldRetry, error, attemps, parsedError });\n\n      if (!shouldRetry) return oracleCalls;\n      const data = await this.handleErc7412Error(parsedError);\n\n      return await this.getMissingOracleCalls(calls, [...oracleCalls, ...data], {\n        account,\n        attemps: attemps - 1,\n        stateOverride,\n      });\n    }\n  }\n\n  _fromCall3ToTransactionData(call: Call3Value): TransactionData {\n    return {\n      to: call.target,\n      data: call.callData,\n      value: call?.value?.toString() ?? '0',\n    } as TransactionData;\n  }\n\n  _fromTransactionDataToCall3(data: TransactionData, requireSuccess = true): Call3Value {\n    return {\n      target: data.to,\n      callData: data.data,\n      value: BigInt(data.value || 0),\n      requireSuccess,\n    } as Call3Value;\n  }\n\n  _fromCallDataToTransactionData(calls: CallParameters): TransactionData {\n    return {\n      to: calls.to as Address,\n\n      data: calls.data as Hash,\n      value: calls?.value?.toString() ?? '0',\n    } as TransactionData;\n  }\n  _fromTransactionDataToCallData(data: TransactionData): CallParameters {\n    return {\n      account: this.sdk.accountAddress,\n      to: data.to,\n      data: data.data,\n      value: BigInt(data.value || 0),\n    } as CallParameters;\n  }\n\n  async processTransactions(data: Call3Value[], override: OverrideParamsWrite): Promise<WriteReturnType> {\n    const useOracleCall = override.useOracleCalls ?? true;\n\n    const oracleCalls = useOracleCall\n      ? ((await this.getMissingOracleCalls(data, undefined, {\n          account: override.account,\n          stateOverride: override?.stateOverride?.reduce(\n            (acc, state) => {\n              const includedIndex = acc.findIndex((s) => s.address === state.address);\n              const included = override?.stateOverride?.[includedIndex];\n\n              if (!included && state.stateDiff) acc.push(state);\n\n              if (included) {\n                acc[includedIndex] = {\n                  address: state.address,\n                  stateDiff: [...state.stateDiff, ...included.stateDiff],\n                };\n              }\n              return acc;\n            },\n            [] as { address: Address; stateDiff: StateMapping }[],\n          ),\n        })) ?? undefined)\n      : [];\n\n    const txs = [\n      ...(!override.useMultiCall ? (override.prepend || []).map((a) => this._fromTransactionDataToCall3(a, true)) : []),\n      ...oracleCalls,\n      ...data,\n    ];\n    if (!override.useMultiCall && !override.submit) return txs.map(this.sdk.utils._fromCall3ToTransactionData);\n\n    const tx = await this.sdk.utils.writeErc7412({ calls: txs }, override);\n    if (!override.submit) return [...(override.prepend || []), tx];\n\n    return this.sdk.executeTransaction(this.sdk.utils._fromTransactionDataToCallData(tx));\n  }\n\n  shouldRetryLogic(error: unknown, attemps: number = 0): boolean {\n    const parsedError = parseError(error as CallExecutionError);\n    const isErc7412Error = this.isErc7412Error(parsedError);\n\n    this.sdk.logger.error('=== parsedError in  processTransactions ', {\n      parsedError,\n      isErc7412Error,\n    });\n    if (!attemps && !isErc7412Error) return false;\n    if (!isErc7412Error) {\n      return false;\n    }\n\n    return true;\n  }\n\n  isErc7412Error(parsedError: Hash): boolean {\n    return (\n      parsedError.startsWith(SIG_ORACLE_DATA_REQUIRED) ||\n      parsedError.startsWith(SIG_FEE_REQUIRED) ||\n      parsedError.startsWith(SIG_ERRORS)\n    );\n  }\n}\n","export const IERC7412Abi = [\n  {\n    type: 'function',\n    name: 'fulfillOracleQuery',\n    inputs: [{ name: 'signedOffchainData', type: 'bytes', internalType: 'bytes' }],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'oracleId',\n    inputs: [],\n    outputs: [{ name: '', type: 'bytes32', internalType: 'bytes32' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'error',\n    name: 'FeeRequired',\n    inputs: [{ name: 'feeAmount', type: 'uint256', internalType: 'uint256' }],\n  },\n  {\n    type: 'error',\n    name: 'OracleDataRequired',\n    inputs: [\n      { name: 'oracleContract', type: 'address', internalType: 'address' },\n      { name: 'oracleQuery', type: 'bytes', internalType: 'bytes' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'Errors',\n    inputs: [\n      {\n        type: 'bytes[]',\n        name: 'revertReasons',\n      },\n    ],\n  },\n];\n","import { Hex } from 'viem';\n\n// TODO: Generalize this. See https://github.com/usecannon/cannon/blob/main/packages/builder/src/error/index.ts\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseError(error: any): Hex {\n  try {\n    if (error.cause?.data) {\n      return error.cause?.data;\n    }\n    if (error.cause?.cause?.data) {\n      return error.cause?.cause?.data;\n    }\n    if (error.cause?.cause?.cause?.data) {\n      return error.cause?.cause?.cause?.data;\n    }\n    if (error.cause?.cause?.error?.data) {\n      return error.cause?.cause?.error?.data;\n    }\n    if (error.cause?.cause?.cause?.error?.data) {\n      return error.cause?.cause?.cause?.error?.data;\n    }\n  } catch (err) {\n    console.log('=== exception in erc7412 error parser:', err);\n  }\n  console.log('=== a', JSON.stringify(error, null, 2));\n  // rethrow the error (and log it so we can see the original)\n  console.error('=== got unknown error in erc7412 parse', error);\n  return '0x';\n}\n","import { Address } from 'viem';\nimport { SUPPORTED_CHAINS } from '../../constants/chains';\n\nexport const ORACLE_PROXY_BY_CHAIN: Record<number, Address> = {\n  [SUPPORTED_CHAINS.ARBITUM_SEPOLIA]: '0x59d6ec32e05900949d7fff679a4adc7f94f0208c',\n  [SUPPORTED_CHAINS.ARBITRUM]: '0xe87ceB87b63267ef925E2897B629052eb815bB7d',\n  [SUPPORTED_CHAINS.BASE]: '0xa03A0Be2f3B85B76765A442683d62E992972d816',\n  [SUPPORTED_CHAINS.BASE_SEPOLIA]: '0x4Bc47c016EE6Ead253152CCfe6427D0bC06F544c',\n};\n"],"mappings":"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","names":["zeroAddress","zeroAddress","updateType","oracleErrors"]}