{"version":3,"sources":["../../src/perps/index.ts","../../src/utils/common.ts","../../src/constants/protocol.ts","../../src/constants/common.ts","../../src/contracts/addreses/zap.ts","../../src/utils/index.ts","../../src/contracts/addreses/oracleProxy.ts","../../src/utils/market.ts","../../src/utils/override.ts","../../src/constants/slots.ts","../../src/contracts/abis/zap.ts"],"sourcesContent":["import { encodeFunctionData, erc20Abi, formatEther, formatUnits, getAbiItem, Hex } from 'viem';\nimport { SynthetixSdk } from '..';\nimport {\n  CollateralData,\n  FundingParameters,\n  MarketData,\n  MarketMetadata,\n  MarketSummary,\n  MarketSummaryResponse,\n  MaxMarketValue,\n  OpenPositionData,\n  OrderData,\n  OrderFees,\n  OrderQuote,\n  PayDebtAndWithdraw,\n  SettlementStrategy,\n  SettlementStrategyResponse,\n  SpotMarketData,\n} from './interface';\nimport {\n  batchArray,\n  convertEtherToWei,\n  convertWeiToEther,\n  generateRandomAccountId,\n  getOdosPath,\n  sleep,\n} from '../utils';\nimport { Call3Value } from '../interface/contractTypes';\nimport { MarketIdOrName, OverrideParamsRead, OverrideParamsWrite, WriteReturnType } from '../interface/commonTypes';\nimport {\n  AccountPermissions,\n  CommitOrder,\n  CreateAccountAndDeposit,\n  CreateAccountAndDepositMany,\n  CreateAccountDepositAndCreateOrder,\n  CreateIsolateOrder,\n  GetPermissions,\n  GetPerpsQuote,\n  GrantPermission,\n  ModifyCollateral,\n  PayDebt,\n} from '../interface/Perps';\nimport { PerpsRepository } from '../interface/Perps/repositories';\nimport { Market } from '../utils/market';\nimport { PERPS_PERMISSIONS } from '../constants/perpsPermissions';\nimport { MetadataResponse, PythPriceId } from '../interface/Markets';\nimport { erc20StateOverrideBalanceAndAllowance } from '../utils/override';\nimport { SYNTHETIX_ZAP_ABI } from '../contracts/abis/zap';\nimport { SYNTHETIX_ZAP } from '../contracts/addreses/zap';\nimport { DEFAULT_DECIMALS } from '../constants';\n\n/**\n * Class for interacting with Synthetix Perps V3 contracts\n * Provides methods for creating and managing accounts, depositing and withdrawing\n * collateral, committing and settling orders, and liquidating accounts.\n *\n * Use ``get`` methods to fetch information about accounts, markets, and orders::\n *    const markets = await sdk.perps.getMarkets()\n *    const openPositions = await sdk.perps.getOpenPositions()\n * Other methods prepare transactions, and submit them to your RPC::\n *    const createTxHash = await sdk.perps.createAccount(submit=True)\n *    const collateralTxHash = await sdk.perps.modifyCollateral(amount=1000, market_name='sUSD', submit=True)\n *    const orderTxHash = await sdk.perps.commitOrder(size=10, market_name='ETH', desired_fill_price=2000, submit=True)\n * An instance of this module is available as ``sdk.perps``. If you are using a network without\n * perps deployed, the contracts will be unavailable and the methods will raise an error.\n * The following contracts are required:\n * - PerpsMarketProxy\n * - PerpsAccountProxy\n * - PythERC7412Wrapper\n * @param synthetixSdk An instance of the Synthetix class\n */\nexport class Perps extends Market<MarketData> implements PerpsRepository {\n  sdk: SynthetixSdk;\n  defaultAccountId?: bigint;\n  accountIds: bigint[];\n  marketMetadata: Map<number, MarketMetadata>;\n\n  // Markets data\n\n  isErc7412Enabled: boolean = true;\n  // Set multicollateral to false by default\n  isMulticollateralEnabled: boolean = false;\n  disabledMarkets: number[] = [];\n  isInitialized: boolean = false;\n\n  constructor(synthetixSdk: SynthetixSdk) {\n    super(synthetixSdk);\n    this.sdk = synthetixSdk;\n    this.accountIds = [];\n\n    this.marketMetadata = new Map<number, MarketMetadata>();\n  }\n\n  // === READ CALLS ===\n\n  async initPerps() {\n    if (this.isInitialized) return;\n    await this.getAccountIds();\n\n    // Check if the Multicollateral is enabled\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const debtFunctionData = getAbiItem({\n      abi: marketProxy.abi,\n      name: 'debt',\n    });\n\n    const payDebtFunctionData = getAbiItem({\n      abi: marketProxy.abi,\n      name: 'payDebt',\n    });\n\n    if (debtFunctionData != undefined && payDebtFunctionData != undefined) {\n      this.isMulticollateralEnabled = true;\n      this.sdk.logger.info('Multicollateral perps is enabled');\n    }\n    this.isInitialized = true;\n  }\n\n  /**\n   * Fetch a list of perps ``account_id`` owned by an address. Perps accounts\n   * are minted as an NFT to the owner's address. The ``account_id`` is the\n   * token id of the NFTs held by the address.\n   * @param {string} address The address to get accounts for. Uses connected address if not provided.\n   * @param {bigint} defaultAccountId The default account ID to set after fetching.\n   * @returns A list of account IDs owned by the address\n   */\n\n  public async getAccountIds(accountAddress = this.sdk.accountAddress, defaultAccountId?: bigint): Promise<bigint[]> {\n    if (!accountAddress) throw new Error('Invalid address');\n\n    const accountProxy = await this.sdk.contracts.getPerpsAccountProxyInstance();\n    const balance = await accountProxy.read.balanceOf([accountAddress]);\n    this.sdk.logger.info('balance', balance);\n    const argsList = [];\n\n    for (let index = 0; index < Number(balance); index++) {\n      argsList.push([accountAddress, index]);\n    }\n    const accountIds = (await this.sdk.utils.multicallErc7412({\n      contractAddress: accountProxy.address,\n      abi: accountProxy.abi,\n      functionName: 'tokenOfOwnerByIndex',\n      args: argsList,\n    })) as unknown[];\n\n    if (accountIds == undefined) return [];\n    // Set Perps account ids\n    this.accountIds = accountIds as bigint[];\n    this.sdk.logger.info('accountIds', accountIds);\n    if (defaultAccountId) {\n      this.defaultAccountId = defaultAccountId;\n    } else if (this.accountIds.length > 0) {\n      this.defaultAccountId = this.accountIds[0] as bigint;\n      this.sdk.logger.info('Using default account id as ', this.defaultAccountId);\n    }\n    return accountIds as bigint[];\n  }\n\n  public async getMarkets(): Promise<MarketData[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const marketIdResponse: bigint[] = (await perpsMarketProxy.read.getMarkets()) as bigint[];\n\n    const marketMetadataResponse = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'metadata',\n      args: marketIdResponse as unknown[],\n    })) as MetadataResponse[];\n\n    const marketIds = marketIdResponse.map((id) => Number(id));\n\n    const settlementStrategies = await this.getSettlementStrategies(marketIds);\n    const { marketMetadatas, pythPriceIds } = marketMetadataResponse.reduce(\n      (acc, market, index) => {\n        const [name, symbol] = market;\n        const strategy = settlementStrategies.find((strategy) => strategy.marketId == marketIds[index]);\n\n        acc.pythPriceIds.push({\n          symbol,\n          feedId: strategy?.feedId ?? '0x',\n        });\n\n        acc.marketMetadatas.push({\n          marketName: name,\n          symbol,\n          feedId: strategy?.feedId ?? '0x',\n        });\n\n        return acc;\n      },\n      {\n        pythPriceIds: [],\n        marketMetadatas: [],\n      } as { pythPriceIds: PythPriceId[]; marketMetadatas: MarketMetadata[] },\n    );\n\n    this.sdk.pyth.updatePriceFeedIds(pythPriceIds);\n\n    const [marketSummaries, fundingParameters, orderFees, maxMarketValues] = await Promise.all([\n      this.getMarketSummaries(marketIds),\n      this.getFundingParameters(marketIds),\n      this.getOrderFees(marketIds),\n      this.getMaxMarketValues(marketIds),\n    ]);\n\n    const datas = marketMetadatas.map((marketMetadata, index) => {\n      const marketId = Number(marketIds.at(index) || 0);\n      const marketSummary = marketSummaries.find((summary) => summary.marketId == marketId);\n      const fundingParam = fundingParameters.find((fundingParam) => fundingParam.marketId == marketId);\n      const orderFee = orderFees.find((orderFee) => orderFee.marketId == marketId);\n      const maxMarketValue = maxMarketValues.find((maxMarketValue) => maxMarketValue.marketId == marketId);\n      const result = {\n        marketId: marketIds[index],\n        marketName: marketMetadata.marketName,\n        symbol: marketMetadata.symbol,\n        feedId: marketMetadata.feedId,\n        skew: marketSummary?.skew,\n        size: marketSummary?.size,\n        maxOpenInterest: marketSummary?.maxOpenInterest,\n        interestRate: marketSummary?.interestRate,\n        currentFundingRate: marketSummary?.currentFundingRate,\n        currentFundingVelocity: marketSummary?.currentFundingVelocity,\n        indexPrice: marketSummary?.indexPrice,\n        skewScale: fundingParam?.skewScale,\n        maxFundingVelocity: fundingParam?.maxFundingVelocity,\n        makerFee: orderFee?.makerFeeRatio,\n        takerFee: orderFee?.takerFeeRatio,\n        maxMarketValue: maxMarketValue?.maxMarketValue,\n      };\n\n      this.marketMetadata.set(marketId, marketMetadata);\n      this.marketsById.set(marketId, result);\n      this.marketsByName.set(marketMetadata.marketName, result);\n      this.marketsBySymbol.set(marketMetadata.symbol, result);\n\n      return result;\n    });\n\n    return datas;\n  }\n\n  public async getMarket(marketIdOrName: MarketIdOrName): Promise<MarketData> {\n    // Smart contract calls to populate MarketData\n    // 0. Fetch all marketIds - Only if marketName is provided, else use the market id\n    // 1. metadata - To get market name and symbol\n    // 2. getSettlementStrategy - To get feedId\n    // 3. getMarketSummary - To get skew, size, maxOi, currentFundingRate, currentFundingVelocity, indexPrice\n    // 4. interestRate - To get interestRate\n    // 5. getFundingParameters - To get skewScale and maxFundingVelocity\n    // 6. getOrderFees - To get maker and taker fee\n    // 7. getMaxMarketValue - To get maxMarketValue\n\n    const market =\n      (this.marketsById.get(Number(marketIdOrName)) ?? this.marketsByName.get(marketIdOrName as string)) || {};\n    if (market.marketId) {\n      return market;\n    }\n\n    let marketId, marketName, marketSymbol;\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    // If the market id is known, avoid fetching fetching all the markets and their metadata\n    if (typeof marketIdOrName === 'number' || typeof marketIdOrName === 'bigint') {\n      const marketMetadataResponse = (await this.sdk.utils.callErc7412({\n        contractAddress: perpsMarketProxy.address,\n        abi: perpsMarketProxy.abi,\n\n        functionName: 'metadata',\n        args: [marketIdOrName],\n      })) as MetadataResponse;\n\n      marketId = Number(marketIdOrName);\n      marketName = marketMetadataResponse[0];\n      marketSymbol = marketMetadataResponse[1];\n    } else {\n      const marketIdResponse: bigint[] = (await perpsMarketProxy.read.getMarkets()) as bigint[];\n      const marketMetadataResponse = (await this.sdk.utils.multicallErc7412({\n        contractAddress: perpsMarketProxy.address,\n        abi: perpsMarketProxy.abi,\n        functionName: 'metadata',\n        args: marketIdResponse as unknown[],\n      })) as MetadataResponse[];\n\n      marketMetadataResponse.forEach((metadata, idx) => {\n        if (metadata[0] == marketIdOrName) {\n          marketId = marketIdResponse[idx];\n          marketName = metadata[0];\n          marketSymbol = metadata[1];\n        }\n      });\n    }\n\n    const functionNames: string[] = [];\n    const argsList: unknown[] = [];\n\n    // 0. Get settlement strategy\n    functionNames.push('getSettlementStrategy');\n    argsList.push([marketId, 0]);\n\n    // 1. Get market Summary\n    functionNames.push('getMarketSummary');\n    argsList.push([marketId]);\n\n    // 2. Get interest rate\n    functionNames.push('interestRate');\n    argsList.push([]);\n\n    // 3. Get funding values\n    functionNames.push('getFundingParameters');\n    argsList.push([marketId]);\n\n    // 4. Get maker and taker fees\n    functionNames.push('getOrderFees');\n    argsList.push([marketId]);\n\n    // 5. Get max market value\n    functionNames.push('getMaxMarketValue');\n    argsList.push([marketId]);\n\n    const multicallResponse: unknown[] = await this.sdk.utils.multicallMultifunctionErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionNames,\n      args: argsList,\n    });\n\n    const settlementStrategy = multicallResponse.at(0) as SettlementStrategyResponse;\n    const marketSummary = multicallResponse.at(1) as MarketSummaryResponse;\n    const interestRate = multicallResponse.at(2) as bigint;\n    const fundingParams = multicallResponse.at(3) as bigint[];\n    const orderFees = multicallResponse.at(4) as bigint[];\n    const maxMarketValue = multicallResponse.at(5) as bigint;\n\n    market.marketId = marketId || 0;\n    market.marketName = marketName || 'INVALID MARKET';\n    market.symbol = marketSymbol || 'INVALID';\n\n    // From settlementStrategy data\n    market.feedId = settlementStrategy.feedId;\n\n    // From marketSummary data\n    market.skew = Number(formatEther(marketSummary.skew));\n    market.size = Number(formatEther(marketSummary.size));\n    market.maxOpenInterest = Number(formatEther(marketSummary.maxOpenInterest));\n    market.interestRate = Number(formatEther(interestRate));\n    market.currentFundingRate = Number(formatEther(marketSummary.currentFundingRate));\n    market.currentFundingVelocity = Number(formatEther(marketSummary.currentFundingVelocity));\n    market.indexPrice = Number(formatEther(marketSummary.indexPrice));\n    // From fundingParams data\n    market.skewScale = Number(formatEther(fundingParams.at(0) || 0n));\n    market.maxFundingVelocity = Number(formatEther(fundingParams.at(1) || 0n));\n\n    // From orderFees data\n    market.makerFee = Number(formatEther(orderFees.at(0) || 0n));\n    market.takerFee = Number(formatEther(orderFees.at(1) || 0n));\n\n    market.maxMarketValue = Number(formatEther(maxMarketValue));\n\n    this.marketMetadata.set(market.marketId || 0, {\n      marketName: market.marketName,\n      symbol: market.symbol,\n      feedId: market.feedId,\n    });\n\n    this.marketsById.set(market.marketId, market);\n    this.marketsByName.set(market.marketName, market);\n    this.marketsBySymbol.set(market.symbol, market);\n    return market;\n  }\n\n  /**\n   * Fetch the market summaries for an array of marketIds\n   * @param marketIds Array of market ids to fetch\n   * @returns Summary of market ids data fetched from the contract\n   */\n  public async getMarketSummaries(marketIds: number[]): Promise<MarketSummary[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const interestRate = await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'interestRate',\n      args: [],\n    });\n\n    const marketSummariesInput = marketIds.map((marketId) => [marketId]);\n    const marketSummariesResponse: MarketSummaryResponse[] = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getMarketSummary',\n      args: marketSummariesInput,\n    })) as MarketSummaryResponse[];\n\n    if (marketIds.length !== marketSummariesResponse.length) {\n      this.sdk.logger.info('Inconsistent data');\n    }\n\n    const marketSummaries: MarketSummary[] = [];\n    const batchedResponse = batchArray(\n      marketSummariesResponse.map((market, index) => {\n        return {\n          ...market,\n          marketId: marketIds[index],\n        };\n      }),\n      10,\n    );\n\n    for (const batch of batchedResponse) {\n      const promises = batch.map(async (market) => {\n        const marketId = market.marketId;\n\n        marketSummaries.push({\n          marketId: marketId,\n          marketName: (await this.getMarket(marketId)).marketName,\n          feedId: (await this.getMarket(marketId)).feedId,\n          indexPrice: Number(formatEther(market.indexPrice)),\n          skew: Number(formatEther(market.skew)),\n          size: Number(formatEther(market.size)),\n          maxOpenInterest: Number(formatEther(market.maxOpenInterest)),\n          interestRate: Number(formatEther(interestRate as bigint)),\n          currentFundingRate: Number(formatEther(market.currentFundingRate)),\n          currentFundingVelocity: Number(formatEther(market.currentFundingVelocity)),\n        });\n      });\n      await Promise.allSettled(promises);\n    }\n    return marketSummaries;\n  }\n\n  /**\n   * @name getMarketSummary\n   * @description Fetches the summary of a given market. This includes information like skew, size, max open interest, current funding rate, and more.\n   * @param {string|number} marketIdOrName - The identifier or name of the market to fetch the summary for.\n   * @returns {MarketSummary} - An object containing the summary data for the specified market.\n   */\n\n  public async getMarketSummary(marketIdOrName: MarketIdOrName): Promise<MarketSummary> {\n    const { resolvedMarketId, resolvedMarketName } = await this.resolveMarket(marketIdOrName);\n\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const interestRate = await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n\n      abi: perpsMarketProxy.abi,\n      functionName: 'interestRate',\n      args: [],\n    });\n\n    const marketSummaryResponse: MarketSummaryResponse = (await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getMarketSummary',\n      args: [resolvedMarketId],\n    })) as MarketSummaryResponse;\n    this.sdk.logger.info('marketSummaryResponse', marketSummaryResponse);\n    return {\n      marketId: resolvedMarketId,\n      marketName: resolvedMarketName,\n      feedId: '',\n      indexPrice: Number(formatEther(marketSummaryResponse.indexPrice)),\n      skew: Number(formatEther(marketSummaryResponse.skew)),\n      size: Number(formatEther(marketSummaryResponse.size)),\n      maxOpenInterest: Number(formatEther(marketSummaryResponse.maxOpenInterest)),\n      interestRate: Number(formatEther(interestRate as bigint)),\n      currentFundingRate: Number(formatEther(marketSummaryResponse.currentFundingRate)),\n      currentFundingVelocity: Number(formatEther(marketSummaryResponse.currentFundingVelocity)),\n    } as MarketSummary;\n  }\n\n  /**\n   * @name getSettlementStrategy\n   * @description This function retrieves the settlement strategy for a given market by its ID and either Market ID or Name.\n   * @param {number} settlementStrategyId - The ID of the settlement strategy to retrieve.\n   * @param {MarketIdOrName} marketIdOrName - The unique identifier (ID or Name) of the market this settlement strategy belongs to.\n   * @returns {SettlementStrategy} - An object containing the details of the retrieved settlement strategy, including its strategy type, delay times, associated contract addresses, feed ID, settlement reward, and whether it is disabled or not.\n   */\n  public async getSettlementStrategy(\n    settlementStrategyId: number,\n    marketIdOrName: MarketIdOrName,\n  ): Promise<SettlementStrategy> {\n    const { resolvedMarketId } = await this.resolveMarket(marketIdOrName);\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const settlementStrategy: SettlementStrategyResponse = (await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n\n      functionName: 'getSettlementStrategy',\n      args: [resolvedMarketId, settlementStrategyId],\n    })) as SettlementStrategyResponse;\n\n    return {\n      marketId: resolvedMarketId,\n      strategyType: settlementStrategy.strategyType,\n      settlementDelay: Number(settlementStrategy.settlementDelay),\n      settlementWindowDuration: Number(settlementStrategy.settlementWindowDuration),\n      priceVerificationContract: settlementStrategy.priceVerificationContract,\n      feedId: settlementStrategy.feedId,\n      settlementReward: Number(formatEther(settlementStrategy.settlementReward ?? 0n)),\n      disabled: settlementStrategy.disabled,\n      commitmentPriceDelay: Number(settlementStrategy.commitmentPriceDelay),\n    } as SettlementStrategy;\n  }\n\n  /**\n   * Fetch the settlement strategies for an array of market ids. Settlement strategies describe the\n   * conditions under which an order can be settled.\n   * @param marketIds Array of marketIds to fetch settlement strategy\n   * @returns Settlement strategy array for markets\n   */\n  public async getSettlementStrategies(marketIds: number[]): Promise<SettlementStrategy[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const settlementStrategies: SettlementStrategy[] = [];\n\n    const argsList: [number, number][] = marketIds.map((marketId) => [marketId, 0]);\n\n    const settlementStrategiesResponse: SettlementStrategyResponse[] = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getSettlementStrategy',\n      args: argsList,\n    })) as SettlementStrategyResponse[];\n\n    settlementStrategiesResponse.forEach((strategy, index) => {\n      settlementStrategies.push({\n        marketId: marketIds[index],\n        strategyType: strategy.strategyType,\n        settlementDelay: Number(strategy.settlementDelay),\n        settlementWindowDuration: Number(strategy.settlementWindowDuration),\n        priceVerificationContract: strategy.priceVerificationContract,\n        feedId: strategy.feedId,\n        settlementReward: Number(formatEther(strategy.settlementReward ?? 0n)),\n        disabled: strategy.disabled,\n        commitmentPriceDelay: Number(strategy.commitmentPriceDelay),\n      });\n    });\n    return settlementStrategies;\n  }\n\n  /**\n   * Fetch funding parameters for an array of market ids.\n   * @param marketIds Array of marketIds to fetch settlement strategy\n   * @returns Funding Parameters array for markets\n   */\n  public async getFundingParameters(marketIds: number[]): Promise<FundingParameters[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    type FundingParamsResponse = [bigint, bigint];\n    const fundingParams: FundingParameters[] = [];\n\n    const fundingParamsResponse = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getFundingParameters',\n      args: marketIds,\n    })) as FundingParamsResponse[];\n\n    fundingParamsResponse.forEach((param, index) => {\n      fundingParams.push({\n        marketId: marketIds[index],\n        skewScale: Number(formatEther(param[0])),\n        maxFundingVelocity: Number(formatEther(param[1])),\n      });\n    });\n    return fundingParams;\n  }\n\n  /**\n   * Gets the order fees of a market.\n   * @param marketIds Array of market ids.\n   * @return Order fees array for markets\n   */\n  public async getOrderFees(marketIds: number[]): Promise<OrderFees[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    type OrderFeesResponse = [bigint, bigint];\n    const orderFees: OrderFees[] = [];\n\n    const orderFeesResponse = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getOrderFees',\n      args: marketIds,\n    })) as OrderFeesResponse[];\n\n    orderFeesResponse.forEach((param, index) => {\n      orderFees.push({\n        marketId: marketIds[index],\n        makerFeeRatio: Number(formatEther(param[0])),\n        takerFeeRatio: Number(formatEther(param[1])),\n      });\n    });\n    return orderFees;\n  }\n\n  /**\n   * Gets the max size (in value) of an array of marketIds.\n   * @param marketIds Array of market ids.\n   * @return Max market size in market USD value for each market\n   */\n  public async getMaxMarketValues(marketIds: number[]): Promise<MaxMarketValue[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const maxMarketValues: MaxMarketValue[] = [];\n\n    const maxMarketValuesResponse = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getMaxMarketValue',\n      args: marketIds,\n    })) as bigint[];\n\n    maxMarketValuesResponse.forEach((maxMarketValue, index) => {\n      maxMarketValues.push({\n        marketId: marketIds[index],\n        maxMarketValue: Number(formatEther(maxMarketValue)),\n      });\n    });\n    return maxMarketValues;\n  }\n\n  /**\n   *   Fetches the open order for an account. Optionally fetches the settlement strategy,\n   * which can be useful for order settlement and debugging.\n   * @param {bigint} accountId The id of the account. If not provided, the default account is used\n   * @param {boolean} fetchSettlementStrategy Flag to indicate whether to fetch the settlement strategy\n   * @returns {OrderData} The order data for the account\n   */\n  public async getOrder(\n    accountId = this.defaultAccountId,\n    fetchSettlementStrategy: boolean = true,\n  ): Promise<OrderData> {\n    if (!accountId) throw new Error('Invalid account id');\n\n    interface OrderCommitmentRequestRes {\n      marketId: bigint;\n      accountId: bigint;\n      sizeDelta: bigint;\n      settlementStrategyId: bigint;\n      acceptablePrice: bigint;\n      trackingCode: string;\n      referrer: string;\n    }\n\n    interface AsyncOrderDataRes {\n      commitmentTime: bigint;\n      request: OrderCommitmentRequestRes;\n    }\n\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const orderResponse = (await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'getOrder',\n      args: [accountId],\n    })) as AsyncOrderDataRes;\n    const orderReq = orderResponse.request;\n\n    const orderData: OrderData = {\n      marketId: Number(orderReq.marketId),\n      commitmentTime: Number(orderResponse.commitmentTime),\n      accountId: orderReq.accountId,\n      sizeDelta: Number(formatEther(orderReq.sizeDelta)),\n      settlementStrategyId: Number(orderReq.settlementStrategyId),\n      acceptablePrice: Number(orderReq.acceptablePrice),\n      trackingCode: orderReq.trackingCode,\n      referrer: orderReq.referrer,\n    };\n\n    if (fetchSettlementStrategy) {\n      const strategy = await this.getSettlementStrategy(\n        Number(orderReq.settlementStrategyId),\n        Number(orderReq.marketId),\n      );\n      orderData.settlementStrategy = strategy;\n    }\n    return orderData;\n  }\n\n  /**\n   * Fetch information about an account's margin requirements and balances.\n   * Accounts must maintain an ``available_margin`` above the ``maintenance_margin_requirement``\n   * to avoid liquidation. Accounts with ``available_margin`` below the ``initial_margin_requirement``\n   * can not interact with their position unless they deposit more collateral.\n   * @param {bigint} accountId  The id of the account to fetch the margin info for. If not provided, the default account is used\n   * @returns {CollateralData} The margin information for the account\n   */\n  public async getMarginInfo(accountId = this.defaultAccountId): Promise<CollateralData> {\n    if (!accountId) throw new Error('Invalid account ID');\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const functionNames: string[] = [];\n    const argsList: unknown[] = [];\n\n    // 0. Get Total collateral value\n    functionNames.push('totalCollateralValue');\n    argsList.push([accountId]);\n\n    // 1. Get available margin\n    functionNames.push('getAvailableMargin');\n    argsList.push([accountId]);\n\n    // 2. Get withdrawable margin\n    functionNames.push('getWithdrawableMargin');\n    argsList.push([accountId]);\n\n    // 3. Get required margins\n    functionNames.push('getRequiredMargins');\n    argsList.push([accountId]);\n\n    const multicallResponse: unknown[] = await this.sdk.utils.multicallMultifunctionErc7412({\n      contractAddress: marketProxy.address,\n      abi: marketProxy.abi,\n      functionNames,\n      args: argsList,\n    });\n\n    const totalCollateralValue = multicallResponse.at(0) as bigint;\n    const availableMargin = multicallResponse.at(1) as bigint;\n    const withdrawableMargin = multicallResponse.at(2) as bigint;\n\n    // returns (uint256 requiredInitialMargin,uint256 requiredMaintenanceMargin,uint256 maxLiquidationReward)\n    const requiredMarginsResponse = multicallResponse.at(3) as bigint[];\n    const requiredInitialMargin = requiredMarginsResponse.at(0) as bigint;\n    const requiredMaintenanceMargin = requiredMarginsResponse.at(1) as bigint;\n    const maxLiquidationReward = requiredMarginsResponse.at(2) as bigint;\n\n    const collateralAmountsRecord: Record<number, number> = [];\n    let debt = 0;\n    if (this.isMulticollateralEnabled) {\n      const fNames: string[] = []; // Function names\n      const aList: unknown[] = []; // Argument list\n\n      // 0. Get account collateral ids\n      fNames.push('getAccountCollateralIds');\n      aList.push([accountId]);\n\n      // 1. Get account debt\n      fNames.push('debt');\n      aList.push([accountId]);\n\n      const response: unknown[] = await this.sdk.utils.multicallMultifunctionErc7412({\n        contractAddress: marketProxy.address,\n        abi: marketProxy.abi,\n        functionNames: fNames,\n        args: aList,\n      });\n\n      // returns and array of collateral ids(uint256[] memory)\n      const collateralIds = response.at(0) as bigint[];\n      debt = convertWeiToEther(response.at(1) as bigint);\n\n      // 'debt' function is only available for markets with Multicollateral enabled\n      if (collateralIds.length != 0) {\n        const inputs = collateralIds.map((id) => {\n          return [accountId, id];\n        });\n        this.sdk.logger.info('inputs', inputs);\n        const collateralAmounts = (await this.sdk.utils.multicallErc7412({\n          contractAddress: marketProxy.address,\n          abi: marketProxy.abi,\n          functionName: 'getCollateralAmount',\n          args: inputs,\n        })) as bigint[];\n\n        collateralIds.forEach((collateralId, index) => {\n          collateralAmountsRecord[Number(collateralId)] = convertWeiToEther(collateralAmounts.at(index));\n        });\n      }\n    } else {\n      collateralAmountsRecord[0] = convertWeiToEther(totalCollateralValue);\n    }\n\n    const marginInfo: CollateralData = {\n      totalCollateralValue: convertWeiToEther(totalCollateralValue),\n      collateralBalances: collateralAmountsRecord,\n      debt,\n      availableMargin: convertWeiToEther(availableMargin),\n      withdrawableMargin: convertWeiToEther(withdrawableMargin),\n      initialMarginRequirement: convertWeiToEther(requiredInitialMargin),\n      maintenanceMarginRequirement: convertWeiToEther(requiredMaintenanceMargin),\n      maxLiquidationReward: convertWeiToEther(maxLiquidationReward),\n    };\n    this.sdk.logger.info(`${marginInfo}marginInfo`);\n    return marginInfo;\n  }\n\n  /**\n   * @name buildModifyCollateral\n   * @description This function builds the call to modify collateral in a perp market. It takes an amount, market ID or name, account ID, and collateral ID as parameters and returns an array of Call3Value objects.\n   * @param {string | number} data.amount - The amount of the underlying asset to modify collateral for.\n   * @param {string | number} data.marketIdOrName - The ID or name of the perp market where the collateral will be modified.\n   * @param {string} data.accountId - The ID of the account whose collateral is being modified.\n   * @param {string} data.collateralId - The ID of the collateral being modified.\n   * @returns {Call3Value[]} - An array of Call3Value objects containing the target contract address, call data, value, requireSuccess flag, and other relevant information for executing the 'modifyCollateral' function on the market proxy contract.\n   */\n  async buildModifyCollateral({ amount, collateralMarketIdOrName, accountId }: ModifyCollateral): Promise<Call3Value> {\n    const { resolvedMarketId: collateralMarketId, resolvedMarketName: collateralMarketName } =\n      await this.sdk.spot.resolveMarket(collateralMarketIdOrName);\n\n    this.sdk.logger.info(`Building ${amount} ${collateralMarketName} for account ${accountId}`);\n\n    const synthCollateral = await this.sdk.spot.getMarket(collateralMarketId);\n\n    // Remove Synthetix asset's `s` from market name.\n    // For example, remove `s` from `sUSDe` to get `USDe`\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n    const formattedAmount = await this.formatSize(amount, amount > 0 ? collateralMarketId : 0);\n\n    if (amount > 0)\n      return {\n        target: zapContract,\n        callData: encodeFunctionData({\n          abi: SYNTHETIX_ZAP_ABI,\n          functionName: 'deposit',\n          // all wrap versions have 18 decimals so setting collateralId default to 0\n          args: [accountId, collateral.address, synthCollateral.contractAddress, formattedAmount, collateralMarketId],\n        }),\n        value: 0n,\n        requireSuccess: true,\n      };\n\n    return {\n      target: zapContract,\n      callData: encodeFunctionData({\n        abi: SYNTHETIX_ZAP_ABI,\n        functionName: 'withdraw',\n        args: [accountId, collateral.address, formattedAmount, collateralMarketId],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n  }\n\n  /**\n   * Fetch the balance of each collateral type for an account.\n   * @param {bigint} accountId The id of the account to fetch the collateral balances for. If not provided, the default account is used.\n   * @returns {Promise<number>} The balance of the account's collateral.\n   */\n\n  public async getCollateralBalances(accountId?: bigint): Promise<number> {\n    // const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    // if (accountId == undefined) {\n    // accountId = this.defaultAccountId;\n    // }\n    throw new Error('Not implemented ' + accountId);\n  }\n\n  /**\n   * Check if an `accountId` is eligible for liquidation.\n   * @param accountId The id of the account to check. If not provided, the default account is used.\n   * @returns {Promise<boolean>} A boolean indicating whether the account can be liquidated.\n   */\n  public async getCanLiquidate(accountId = this.defaultAccountId): Promise<boolean> {\n    if (!accountId) throw new Error('Invalid account ID');\n\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const canBeLiquidated = (await this.sdk.utils.callErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'canLiquidate',\n      args: [accountId],\n    })) as boolean;\n    this.sdk.logger.info('canBeLiquidated', canBeLiquidated);\n    return canBeLiquidated;\n  }\n\n  /**\n   * Check if a batch of `accountId`'s are eligible for liquidation.\n   * @param {string[]} accountIds An array of account ids\n   * @returns {Promise<{ accountId: bigint; canLiquidate: boolean }[]>} An array of objects containing the account id and whether the account can be liquidated.\n   */\n  public async getCanLiquidates(\n    accountIds: bigint[] | undefined = undefined,\n  ): Promise<{ accountId: bigint; canLiquidate: boolean }[]> {\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    if (accountIds == undefined) {\n      if (this.defaultAccountId != undefined) {\n        accountIds = this.accountIds;\n      } else {\n        throw new Error('Invalid account ID');\n      }\n    }\n\n    // Format the args to the required array format\n    const input = accountIds.map((accountId) => [accountId]);\n\n    const canLiquidatesResponse = (await this.sdk.utils.multicallErc7412({\n      contractAddress: perpsMarketProxy.address,\n      abi: perpsMarketProxy.abi,\n      functionName: 'canLiquidate',\n      args: input,\n    })) as boolean[];\n\n    const canLiquidates = canLiquidatesResponse.map((response, index) => {\n      return {\n        accountId: accountIds.at(index) ?? 0n,\n        canLiquidate: response,\n      };\n    });\n    this.sdk.logger.info('canLiquidates', canLiquidates);\n    return canLiquidates;\n  }\n\n  /**\n   * Fetch the position for a specified account and market. The result includes the unrealized\n   * pnl since the last interaction with this position, any accrued funding, and the position size.\n   * Provide either a ``marketId`` or a ``marketName``::\n   * @param {string | number} marketIdOrName - The identifier or name of the market for which the collateral is being modified\n   * @param {bigint} accountId The id of the account to fetch the position for. If not provided, the default account is used.\n   * @returns {OpenPositionData} An object containing the open position data for the specified market.\n   */\n  public async getOpenPosition(\n    marketIdOrName: MarketIdOrName,\n    accountId = this.defaultAccountId,\n  ): Promise<OpenPositionData> {\n    if (!accountId) throw new Error('Account ID is required');\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const { resolvedMarketId, resolvedMarketName } = await this.resolveMarket(marketIdOrName);\n\n    // Smart contract response:\n    // returns (int256 totalPnl, int256 accruedFunding, int128 positionSize, uint256 owedInterest);\n    const response = (await this.sdk.utils.callErc7412({\n      contractAddress: marketProxy.address,\n      abi: marketProxy.abi,\n      functionName: 'getOpenPosition',\n      args: [accountId, resolvedMarketId],\n    })) as bigint[];\n\n    const openPositionData: OpenPositionData = {\n      accountId: accountId,\n      marketId: resolvedMarketId,\n      marketName: resolvedMarketName,\n      totalPnl: convertWeiToEther(response.at(0)),\n      accruedFunding: convertWeiToEther(response.at(1)),\n      positionSize: convertWeiToEther(response.at(2)),\n      owedInterest: convertWeiToEther(response.at(3)),\n    };\n    this.sdk.logger.info('openPositionData', openPositionData);\n    return openPositionData;\n  }\n\n  /**\n   * Fetch positions for an array of specified markets. The result includes the unrealized\n   * pnl since the last interaction with this position, any accrued funding, and the position size.\n   * Provide either an array of ``marketIds`` or a ``marketNames``::\n   * @param {MarketIdOrName} marketIdsOrNames - The ID or name of the Perpetual market to get a quote for.\n   * @param {bigint} accountId The id of the account to fetch the position for. If not provided, the default account is used.\n   * @returns {OpenPositionData[]} An array of objects containing the open position data for the specified markets.\n   */\n  // NOTE: maybe is better use subgraph?\n  public async getOpenPositions(\n    marketIdsOrNames?: MarketIdOrName[],\n    accountId = this.defaultAccountId,\n  ): Promise<OpenPositionData[]> {\n    if (!accountId) throw new Error('Account ID is required');\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const marketIds: number[] = !marketIdsOrNames\n      ? Array.from(this.marketsById.keys())\n      : await Promise.all(marketIdsOrNames.map(async (market) => (await this.resolveMarket(market)).resolvedMarketId));\n\n    const inputs = marketIds?.map((marketId) => {\n      return [accountId, marketId];\n    }) as unknown[];\n\n    // Smart contract response:\n    // returns (int256 totalPnl, int256 accruedFunding, int128 positionSize, uint256 owedInterest);\n    const response = (await this.sdk.utils.multicallErc7412({\n      contractAddress: marketProxy.address,\n      abi: marketProxy.abi,\n      functionName: 'getOpenPosition',\n      args: inputs,\n    })) as bigint[][];\n\n    const openPositionsData: OpenPositionData[] = [];\n    const batchedResponse = batchArray(\n      response.map((data, index) => {\n        return {\n          data,\n          marketId: marketIds?.at(index) ?? 0,\n        };\n      }),\n      10,\n    );\n\n    for (const batch of batchedResponse) {\n      const promises = batch.map(async ({ data: positionData, marketId }) => {\n        const positionSize = convertWeiToEther(positionData.at(2));\n        if (Math.abs(positionSize) > 0) {\n          openPositionsData.push({\n            accountId: accountId,\n            marketId: marketId,\n            marketName: (await this.getMarket(marketId)).marketName ?? 'Unresolved market',\n            totalPnl: convertWeiToEther(positionData.at(0)),\n            accruedFunding: convertWeiToEther(positionData.at(1)),\n            positionSize: positionSize,\n            owedInterest: convertWeiToEther(positionData.at(3)),\n          });\n        }\n      });\n      await Promise.allSettled(promises);\n    }\n\n    return openPositionsData;\n  }\n\n  /**\n   * Retrieves open positions for multiple accounts and markets using a multicall.\n   * @param positions - An array of objects representing the positions,\n   * where each object contains:\n   * - accountId: {bigint} The id of the account to fetch the position for .\n   * - marketIdOrName: {MarketIdOrName} The market ID or name.\n   * @returns An array of OpenPositionData objects. */\n  public async getOpenPositionsMulticall(\n    positions: { accountId: bigint; marketIdOrName: MarketIdOrName }[],\n  ): Promise<OpenPositionData[]> {\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const marketIds: number[] = await Promise.all(\n      positions.map(async (position) => (await this.resolveMarket(position.marketIdOrName)).resolvedMarketId),\n    );\n\n    const inputs = positions.map((position, idx) => {\n      return [position.accountId, marketIds.at(idx)];\n    }) as unknown[];\n\n    // Smart contract response:\n    // returns (int256 totalPnl, int256 accruedFunding, int128 positionSize, uint256 owedInterest);\n    const response = (await this.sdk.utils.multicallErc7412({\n      contractAddress: marketProxy.address,\n      abi: marketProxy.abi,\n      functionName: 'getOpenPosition',\n      args: inputs,\n    })) as bigint[][];\n\n    const openPositionsData: OpenPositionData[] = [];\n    const batchedResponse = batchArray(\n      response.map((market, index) => {\n        return { data: market, marketId: marketIds.at(index)! };\n      }),\n      10,\n    );\n    for (const batch of batchedResponse) {\n      const promises = batch.map(async ({ data: positionData, marketId }, idx) => {\n        const positionSize = convertWeiToEther(positionData.at(2));\n        if (Math.abs(positionSize) > 0) {\n          openPositionsData.push({\n            accountId: positions.at(idx)?.accountId ?? 0n,\n            marketId: marketId,\n            marketName: (await this.getMarket(marketId)).marketName ?? 'Unresolved market',\n            totalPnl: convertWeiToEther(positionData.at(0)),\n            accruedFunding: convertWeiToEther(positionData.at(1)),\n            positionSize: positionSize,\n            owedInterest: convertWeiToEther(positionData.at(3)),\n          });\n        }\n      });\n      await Promise.allSettled(promises);\n    }\n    return openPositionsData;\n  }\n\n  /**\n   * @name getQuote\n   * @description Fetches a quote for a Perpetual market, calculating the fees, fill price and required margin.\n   * @param {number} data.size - The size of the order in base asset units\n   * @param {number} data.price - The price of the order in quote asset units. If not provided, it will be fetched from Pyth Oracle.\n   * @param {MarketIdOrName} data.marketIdOrName - The ID or name of the Perpetual market to get a quote for.\n   * @param {number} [data.accountId=this.defaultAccountId] - The account ID of the user requesting the quote. Defaults to the default account ID.\n   * @param {number} [data.settlementStrategyId=0] - The settlement strategy ID of the market. Defaults to 0 (no leverage).\n   * @param {boolean} [data.includeRequiredMargin=true] - Whether to include the required margin in the quote. Defaults to true.\n   * @returns {OrderQuote} An object containing the order size, index price, order fees, settlement reward cost, fill price and required margin (if provided).\n   */\n  public async getQuote({\n    size,\n    price,\n    marketIdOrName,\n    accountId = this.defaultAccountId,\n    settlementStrategyId = 0,\n    includeRequiredMargin = true,\n  }: GetPerpsQuote): Promise<OrderQuote> {\n    if (!accountId) throw new Error('No account Id!');\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const { resolvedMarketId } = await this.resolveMarket(marketIdOrName);\n\n    const feedId = (await this.getMarket(resolvedMarketId)).feedId;\n    if (!feedId) throw new Error('Invalid feed id received from market data');\n\n    if (!price) {\n      price = await this.sdk.pyth.getFormattedPrice(feedId as Hex);\n      this.sdk.logger.info('Formatted price:', price);\n    }\n    const [orderFeesWithPriceResponse, settlementRewardCost, requiredMargin] = await Promise.all([\n      this.sdk.utils.callErc7412({\n        contractAddress: marketProxy.address,\n        abi: marketProxy.abi,\n        functionName: 'computeOrderFeesWithPrice',\n        args: [resolvedMarketId, convertEtherToWei(size), convertEtherToWei(price)],\n      }) as Promise<[bigint, bigint]>,\n      this.sdk.utils.callErc7412({\n        contractAddress: marketProxy.address,\n        abi: marketProxy.abi,\n        functionName: 'getSettlementRewardCost',\n        args: [resolvedMarketId, settlementStrategyId],\n      }) as Promise<bigint>,\n      includeRequiredMargin && accountId\n        ? (this.sdk.utils.callErc7412({\n            contractAddress: marketProxy.address,\n            abi: marketProxy.abi,\n            functionName: 'requiredMarginForOrderWithPrice',\n            args: [accountId, resolvedMarketId, convertEtherToWei(size), convertEtherToWei(price)],\n          }) as Promise<bigint>)\n        : 0n,\n    ]);\n    const orderQuote: OrderQuote = {\n      orderSize: size,\n      indexPrice: price,\n      orderFees: convertWeiToEther(orderFeesWithPriceResponse[0]),\n      settlementRewardCost: convertWeiToEther(settlementRewardCost),\n      fillPrice: convertWeiToEther(orderFeesWithPriceResponse[1]),\n    };\n\n    if (includeRequiredMargin && accountId) {\n      orderQuote.requiredMargin = convertWeiToEther(requiredMargin);\n    }\n    return orderQuote;\n  }\n\n  /**\n   * Returns the debt of the account id\n   * @param accountId The id of the account to get the debt for. If not provided, the default account is used.\n   * @returns debt Account debt in ether\n   */\n  public async getDebt(accountId = this.defaultAccountId): Promise<number> {\n    if (!accountId) throw new Error('No account id selected');\n    if (!this.isMulticollateralEnabled)\n      throw new Error(`Multicollateral is not enabled for chainId ${this.sdk.rpcConfig.chainId}`);\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const debt = (await this.sdk.utils.callErc7412({\n      contractAddress: marketProxy.address,\n      abi: marketProxy.abi,\n      functionName: 'debt',\n      args: [accountId],\n    })) as bigint;\n    this.sdk.logger.info('Account Debt: ', debt);\n    return convertWeiToEther(debt);\n  }\n\n  /**\n   * Fetch Position and related margin details from contracts\n   * @param accountId The id of the account to get the debt for\n   * @param marketIdOrName Market\n   * @param override override params for the call\n   * @returns Formatted values in decimal numbers for position and margin data\n   */\n  protected async _getPositionData(accountId: bigint, marketIdOrName: MarketIdOrName, override?: OverrideParamsRead) {\n    if (!accountId) throw new Error('Account ID is required');\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const { resolvedMarketId } = await this.resolveMarket(marketIdOrName);\n\n    const functionNames: string[] = [];\n    const argsList: unknown[] = [];\n\n    // 0. Get available margin\n    functionNames.push('getAvailableMargin');\n    argsList.push([accountId]);\n\n    // 1. Get required margins\n    functionNames.push('getRequiredMargins');\n    argsList.push([accountId]);\n\n    // 2. Get position size\n    functionNames.push('getOpenPositionSize');\n    argsList.push([accountId, resolvedMarketId]);\n\n    // 3. Get market index price\n    functionNames.push('indexPrice');\n    argsList.push([resolvedMarketId]);\n\n    const multicallResponse: unknown[] = await this.sdk.utils.multicallMultifunctionErc7412(\n      {\n        contractAddress: marketProxy.address,\n        abi: marketProxy.abi,\n        functionNames,\n        args: argsList,\n      },\n      override,\n    );\n\n    const availableMargin = multicallResponse.at(0) as bigint;\n    const requiredMaintenanceMargin = (multicallResponse.at(1) as bigint[]).at(1) as bigint;\n    const requiredInitialMargin = (multicallResponse.at(1) as bigint[]).at(0) as bigint;\n    const positionSize = multicallResponse.at(2) as bigint;\n    const indexPrice = multicallResponse.at(3) as bigint;\n\n    return {\n      availableMargin: Number(formatUnits(availableMargin, DEFAULT_DECIMALS)),\n      requiredMaintenanceMargin: Number(formatUnits(requiredMaintenanceMargin, DEFAULT_DECIMALS)),\n      requiredInitialMargin: Number(formatUnits(requiredInitialMargin, DEFAULT_DECIMALS)),\n      positionSize: Number(formatUnits(positionSize, DEFAULT_DECIMALS)),\n      indexPrice: Number(formatUnits(indexPrice, DEFAULT_DECIMALS)),\n    };\n  }\n\n  /**\n   * Calculate the approximate liquidation price for an account with single position\n   * Provide either a ``marketId`` or a ``marketName``\n   * @param {string | number} marketIdOrName - The identifier or name of the market for which the collateral is being modified\n   * @param {bigint} accountId The id of the account to fetch the position for. If not provided, the default account is used.\n   * @returns {healthFactor: bigint, liquidationPrice: bigint}\n   * liquidation price = ((maintenance margin -  available margin) / position size) + index price\n   */\n  public async getApproxLiquidationPrice(\n    marketIdOrName: MarketIdOrName,\n    accountId = this.defaultAccountId,\n    override?: OverrideParamsRead,\n  ): Promise<{ healthFactor: number; liquidationPrice: number }> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const { positionSize, availableMargin, requiredMaintenanceMargin, indexPrice } = await this._getPositionData(\n      accountId,\n      marketIdOrName,\n      override,\n    );\n\n    const healthFactor = (availableMargin * 100) / (requiredMaintenanceMargin + 1);\n\n    // For invalid position, return current market price\n    if (positionSize == 0) return { healthFactor, liquidationPrice: indexPrice };\n\n    const lossPerToken = Math.abs((requiredMaintenanceMargin - availableMargin) / positionSize);\n\n    let liquidationPrice;\n    if (positionSize > 0) {\n      liquidationPrice = indexPrice - lossPerToken;\n    } else {\n      liquidationPrice = indexPrice + lossPerToken;\n    }\n\n    return { healthFactor, liquidationPrice };\n  }\n\n  /**\n   * Calculate the health factor for an account\n   * @param {bigint} accountId The id of the account to calculate health factor.\n   * If not provided, the default account is used.\n   * @returns healthFactor percentage;\n   * @returns availableMargin Formatted available margin in USD;\n   * @returns requiredMaintenanceMargin Formatted required maintenance margin in USD\n   * healthFactor = (available margin * 100) / maintenance margin\n   */\n  public async getHealthFactor(\n    accountId = this.defaultAccountId,\n    override?: OverrideParamsRead,\n  ): Promise<{ healthFactor: number; availableMargin: number; requiredMaintenanceMargin: number }> {\n    if (!accountId) throw new Error('Account ID is required');\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const functionNames: string[] = [];\n    const argsList: unknown[] = [];\n\n    // 0. Get available margin\n    functionNames.push('getAvailableMargin');\n    argsList.push([accountId]);\n\n    // 1. Get required margins\n    functionNames.push('getRequiredMargins');\n    argsList.push([accountId]);\n\n    const multicallResponse: unknown[] = await this.sdk.utils.multicallMultifunctionErc7412(\n      {\n        contractAddress: marketProxy.address,\n        abi: marketProxy.abi,\n        functionNames,\n        args: argsList,\n      },\n      override,\n    );\n\n    // 0. Available Margin\n    const availableMargin = Number(formatUnits(multicallResponse.at(0) as bigint, DEFAULT_DECIMALS));\n\n    // 1. Required margin\n    // returns (uint256 requiredInitialMargin,uint256 requiredMaintenanceMargin,uint256 maxLiquidationReward)\n    const requiredMarginsResponse = multicallResponse.at(1) as bigint[];\n    const requiredMaintenanceMargin = Number(formatUnits(requiredMarginsResponse.at(1) as bigint, DEFAULT_DECIMALS));\n\n    const healthFactor = (availableMargin * 100) / (requiredMaintenanceMargin + 1);\n    return { healthFactor, availableMargin, requiredMaintenanceMargin };\n  }\n\n  /**\n   * Returns an array of supported collaterals for perps\n   * @returns Array of supported collateral ids;\n   */\n  public async getSupportedCollaterals(): Promise<SpotMarketData[]> {\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const response = (await marketProxy.read.getSupportedCollaterals()) as bigint[];\n    const supportedCollaterals: SpotMarketData[] = [];\n\n    response.forEach((collateralId) => {\n      const spotMarket = this.sdk.spot.marketsById.get(Number(collateralId));\n      if (spotMarket) {\n        supportedCollaterals.push(spotMarket);\n      }\n    });\n    return supportedCollaterals;\n  }\n\n  // === WRITE CALLS ===\n\n  /**\n   * @name buildCommitOrder\n   * @description Builds a commit order for a given size, settlement strategy ID, market ID or name, account ID (default to the defaultAccountId), desired fill price, and max price impact.\n   * @param {number} size - The size of the order in the base asset unit.\n   * @param {string|number} data.settlementStrategyId - The ID of the settlement strategy for the market.\n   * @param {string|number} data.marketIdOrName - The ID or name of the market to trade on.\n   * @param {string|undefined} data.accountId - The ID of the account for which the order is being built (default to defaultAccountId).\n   * @param {number|undefined} data.desiredFillPrice - The desired fill price for the order in the base asset unit.\n   * @param {number|undefined} data.maxPriceImpact - The maximum price impact for the order as a percentage of the market index price.\n   * @returns {Call3Value[]} An array containing the details of the transaction to be executed on the contract, including the target contract address, call data, value, and requireSuccess flag.\n   */\n  async buildCommitOrder({\n    size,\n    settlementStrategyId,\n    marketIdOrName,\n    accountId = this.defaultAccountId,\n    desiredFillPrice,\n    maxPriceImpact,\n  }: CommitOrder): Promise<Call3Value> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    const { resolvedMarketId, resolvedMarketName: marketName } = await this.resolveMarket(marketIdOrName);\n    if (desiredFillPrice != undefined && maxPriceImpact != undefined) {\n      throw new Error('Cannot set both desiredFillPrice and maxPriceImpact');\n    }\n    const isShort = size < 0 ? -1 : 1;\n    const sizeInWei = (await this.sdk.perps.formatSize(Math.abs(size), resolvedMarketId)) * BigInt(isShort);\n    let acceptablePrice: number;\n    this.sdk.logger.info(\n      `Building order size ${sizeInWei} (${size}) to ${marketName} (id: ${resolvedMarketId}) for account ${accountId}`,\n    );\n    // If desired price is provided, use the provided price, else fetch price\n    if (desiredFillPrice) {\n      acceptablePrice = desiredFillPrice;\n    } else {\n      const updatedMaxPriceImpact = maxPriceImpact ?? this.sdk.maxPriceImpact;\n      const market = await this.getMarket(resolvedMarketId);\n      const priceImpact = 1 + (isShort * updatedMaxPriceImpact) / 100;\n      acceptablePrice = (market.indexPrice ?? 0) * priceImpact;\n    }\n\n    const txArgs = [\n      resolvedMarketId,\n      accountId,\n      sizeInWei,\n      settlementStrategyId,\n      convertEtherToWei(acceptablePrice),\n      this.sdk.trackingCode,\n      this.sdk.referrer,\n    ];\n\n    return {\n      target: perpsMarketProxy.address,\n      callData: encodeFunctionData({ abi: perpsMarketProxy.abi, functionName: 'commitOrder', args: [txArgs] }),\n      value: 0n,\n      requireSuccess: true,\n    };\n  }\n\n  /**\n   * @name commitOrder\n   * @description This function commits an order by building the necessary transactions and either executing them or returning them for later submission.\n   * @param {CommitOrder} data - The details of the order to be committed.\n   * @param {OverrideParamsWrite} [override] - Optional parameters to override default write settings, specifically whether to submit the transaction immediately (when `submit` is true). If not provided, the function will return the transaction object.\n   * @returns {WriteReturnType} - Returns either a transaction hash if `submit` is true, or the transaction object for later submission when `submit` is false.\n   */\n  public async commitOrder(data: CommitOrder, override: OverrideParamsWrite = {}): Promise<WriteReturnType> {\n    const builtTx = await this.buildCommitOrder(data);\n    const txs = [builtTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n  /**\n   * @name modifyCollateral\n   * @description This function modifies the collateral for a given market and account. It builds the necessary transaction, then writes it to the ERC7412 contract. If submit is not provided in the override object, it returns the built transaction object. Otherwise, it executes the transaction and logs the transaction hash.\n   * @param {string} data.amount - The amount of collateral to modify\n   * @param {string | number} data.marketIdOrName - The identifier or name of the market for which the collateral is being modified\n   * @param {string} data.accountId - The ID of the account (default is the defaultAccountId)\n   * @param {OverrideParamsWrite} [override] - An optional object that overrides the function behavior. If provided, submit must be truthy to execute the transaction and log the transaction hash.\n   * @returns {WriteReturnType} The built transaction object if override.submit is falsy, otherwise the transaction hash.\n   */\n  public async modifyCollateral(\n    { amount, collateralMarketIdOrName, accountId = this.defaultAccountId }: ModifyCollateral,\n    override: OverrideParamsWrite = {},\n  ): Promise<WriteReturnType> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const modifyPerpsPermission = PERPS_PERMISSIONS.PERPS_MODIFY_COLLATERAL;\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n    console.log('=== collateralMarketIdOrName', collateralMarketIdOrName);\n\n    const { resolvedMarketId: spotCollateralId } = await this.sdk.spot.resolveMarket(collateralMarketIdOrName);\n    console.log('=== spotCollateralId', spotCollateralId);\n\n    const formattedAmount = amount > 0 ? await this.formatSize(amount, spotCollateralId) : 0n;\n\n    const synthCollateral = await this.sdk.spot.getMarket(spotCollateralId);\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n\n    const processedTx = await this.buildModifyCollateral({\n      amount,\n      collateralMarketIdOrName,\n      accountId,\n    });\n\n    const grantPermissionTx = await this.buildGrantPermission({\n      accountId: accountId,\n      permission: modifyPerpsPermission,\n      user: zapContract,\n    });\n\n    const approveTx =\n      amount > 0\n        ? {\n            to: collateral.address,\n            data: encodeFunctionData({\n              abi: erc20Abi,\n              functionName: 'approve',\n              args: [zapContract, formattedAmount],\n            }),\n            value: '0',\n          }\n        : undefined;\n\n    const txs = [grantPermissionTx, processedTx];\n    const stateOverrideSpot = erc20StateOverrideBalanceAndAllowance({\n      token: collateral.address,\n      owner: this.sdk.accountAddress,\n      spender: zapContract,\n    });\n\n    return this.sdk.utils.processTransactions(txs, {\n      ...override,\n      stateOverride: [...stateOverrideSpot],\n      prepend: [\n        ...(approveTx ? [approveTx] : []),\n        // this.sdk.utils._fromCall3ToTransactionData(grantPermissionTx),\n        ...(override.prepend || []),\n      ],\n    });\n  }\n  /**\n   * @name payDebt\n   * @description This function is used to repay a debt on Perps market using the SDK. It takes an amount and accountId as parameters, and optionally accepts an override for write operations. If no amount is provided, it will first fetch the current debt of the given accountId.\n   * @param {number} data.amount - The amount to be repaid in Ether. Defaults to 0 if not provided.\n   * @param {string} data.accountId - The ID of the account whose debt is being repaid. If not provided, it defaults to the defaultAccountId of the SDK instance.\n   * @param {OverrideParamsWrite} override - An optional object for overriding parameters for write operations.\n   * @returns {Promise<ReturnWriteCall>} A promise that resolves to a transaction hash when the debt is successfully repaid.\n   */\n  public async payDebt(\n    { amount = 0, accountId = this.defaultAccountId }: PayDebt = { amount: 0 },\n    override: OverrideParamsWrite = {},\n  ): Promise<WriteReturnType> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    if (!this.isMulticollateralEnabled) {\n      throw new Error(`Multicollateral is not enabled for chainId ${this.sdk.rpcConfig.chainId}`);\n    }\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    // `debt` and `payDebt` functions are only available for multicollateral perps\n    if (!amount) {\n      amount = await this.getDebt(accountId);\n    }\n\n    const rawTx: Call3Value = {\n      target: marketProxy.address,\n      callData: encodeFunctionData({\n        abi: marketProxy.abi,\n        functionName: 'payDebt',\n        args: [accountId, convertEtherToWei(amount)],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n    const txs = [rawTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n  /**\n   * Submit a liquidation for an account, or static call the liquidation function to fetch\n   * the liquidation reward. The static call is important for accounts which have been\n   * partially liquidated. Due to the throughput limit on liquidated value, the static call\n   * returning a nonzero value means more value can be liquidated (and rewards collected).\n   * This function can not be called if ``submit`` and ``staticCall`` are true.\n   * @param {bigint} accountId The id of the account to liquidate. If not provided, the default account is used.\n   * @param {OverrideParamsWrite} override - An optional object for overriding parameters for write operations.\n   */\n  public async liquidate(\n    accountId = this.defaultAccountId,\n    override: OverrideParamsWrite = {},\n  ): Promise<WriteReturnType> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    // if (override.staticCall) {\n    //   const liquidationReward = (await this.sdk.utils.callErc7412({\n    //     contractAddress: marketProxy.address,\n    //     abi: marketProxy.abi,\n    //     functionName: 'liquidate',\n    //     args: [accountId],\n    //   })) as bigint;\n    //   return convertWeiToEther(liquidationReward);\n    // }\n    const rawTx: Call3Value = {\n      target: marketProxy.address,\n      callData: encodeFunctionData({\n        abi: marketProxy.abi,\n        functionName: 'liquidate',\n        args: [accountId],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n\n    const txs = [rawTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n  /**\n   * @name settleOrderperps\n   * @description Settles an open order by executing the 'settleOrder' function on Perps Market Proxy contract.\n   * @param {bigint} accountId - The ID of the account associated with the order. Defaults to `this.defaultAccountId`.\n   * @param {OverrideParamsWrite} override - Optional override parameters for writing transactions (defaults to default values).\n   * @returns The transaction receipt if the order is successfully settled, otherwise throws an error.\n   */\n  public async settleOrder(\n    accountId = this.defaultAccountId,\n    override: OverrideParamsWrite = {},\n  ): Promise<WriteReturnType> {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const marketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const order = await this.getOrder(accountId);\n    const settlementStrategy = order.settlementStrategy;\n    const settlementTime = order.commitmentTime + (settlementStrategy?.settlementDelay ?? 0);\n    const expirationTime = order.commitmentTime + (settlementStrategy?.settlementWindowDuration ?? 0);\n    const currentTimestamp = Math.floor(Date.now() / 1000);\n\n    if (order.sizeDelta == 0) {\n      throw new Error(`Order is already settled for account ${accountId}`);\n    } else if (settlementTime > currentTimestamp) {\n      const duration = settlementTime - currentTimestamp;\n      this.sdk.logger.info(`Waiting ${duration} seconds to settle order`);\n      await sleep(duration);\n    } else if (expirationTime < currentTimestamp) {\n      throw new Error(`Order has expired for account ${accountId}`);\n    } else {\n      this.sdk.logger.info('Order is ready to be settled');\n    }\n\n    const settleTx: Call3Value = {\n      requireSuccess: true,\n      target: marketProxy.address,\n      callData: encodeFunctionData({\n        abi: marketProxy.abi,\n        functionName: 'settleOrder',\n        args: [accountId],\n      }),\n      value: 0n,\n    };\n    const txs = [settleTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n\n  /**\n   * @name buildCreateAccount\n   * @description This function builds the data for creating an account in the PerpsMarketProxy contract using the given accountId.\n   * @param {bigint} accountId - The optional accountId to be created. If not provided, a new account will be generated.\n   * @returns {Call3Value[]} - An array of Call3Value objects representing the target contract, call data, value, requireSuccess flag and other necessary details for executing the function in the blockchain.\n   */\n  async buildCreateAccount(accountId?: bigint): Promise<Call3Value> {\n    const txArgs = [];\n    if (accountId != undefined) {\n      txArgs.push(accountId);\n    }\n    const perpsMarketProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    return {\n      target: perpsMarketProxy.address,\n      callData: encodeFunctionData({\n        abi: perpsMarketProxy.abi,\n        functionName: 'createAccount',\n        args: txArgs,\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n  }\n\n  /**\n   * @ame createAccount\n   * @description Creates a new account and returns either the transaction hash or the transaction parameters. If `submit` is provided in `override`, the transaction will be submitted and the transaction hash will be returned. Otherwise, the transaction parameters will be returned.\n   * @param {bigint | undefined} accountId - The ID of the account to create (optional)\n   * @param {OverrideParamsWrite} override - Options for submitting or returning the transaction parameters\n   * @returns {WriteReturnType} - If `submit` is provided in `override`, a string representing the transaction hash. Otherwise, an object containing the transaction parameters as defined by the CallParameters type.\n   */\n  public async createAccount(\n    accountId?: bigint,\n    override: Omit<OverrideParamsWrite, 'useOracleCalls'> = {},\n  ): Promise<WriteReturnType> {\n    const processedTx = await this.buildCreateAccount(accountId);\n    const txs = [processedTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n\n  /*\n   * @name _createAccountAndDeposit\n   * @ description create a synthetix account and then deposits fund\n   * */\n  protected async _createAccountAndDeposit({\n    amount,\n    collateralMarketIdOrName,\n    accountId: _accountId,\n  }: ModifyCollateral) {\n    const accountId = _accountId || generateRandomAccountId();\n\n    const { resolvedMarketId: spotCollateralId } = await this.sdk.spot.resolveMarket(collateralMarketIdOrName);\n    const formattedSize = await this.formatSize(amount, spotCollateralId);\n\n    const synthCollateral = await this.sdk.spot.getMarket(spotCollateralId);\n\n    // Remove Synthetix asset's `s` from market name.\n    // For example, remove `s` from `sUSDe` to get `USDe`\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n\n    const data = encodeFunctionData({\n      abi: SYNTHETIX_ZAP_ABI,\n      functionName: 'createAccountAndDeposit',\n      args: [accountId, collateral.address, synthCollateral.contractAddress, formattedSize, spotCollateralId],\n    });\n\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    return [\n      {\n        target: zapContract,\n        callData: data,\n        value: 0n,\n        requireSuccess: true,\n      },\n    ];\n  }\n\n  protected async _createAccountDepositAndCommit({\n    amount,\n    collateralMarketIdOrName,\n    accountId: _accountId,\n    order: rawOrder,\n  }: CreateAccountDepositAndCreateOrder) {\n    const accountId = _accountId || generateRandomAccountId();\n\n    const { resolvedMarketId: spotCollateralId } = await this.sdk.spot.resolveMarket(collateralMarketIdOrName);\n    const { resolvedMarketId: perpsMarketId } = await this.resolveMarket(rawOrder.marketIdOrName);\n    const formattedCollateral = await this.formatSize(amount, spotCollateralId);\n\n    const synthCollateral = await this.sdk.spot.getMarket(spotCollateralId);\n\n    // Remove Synthetix asset's `s` from market name.\n    // For example, remove `s` from `sUSDe` to get `USDe`\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n\n    const isShort = rawOrder.size < 0 ? -1 : 1;\n\n    const order = {\n      marketId: perpsMarketId,\n      sizeDelta: (await this.formatSize(Math.abs(rawOrder.size), perpsMarketId)) * BigInt(isShort),\n      settlementStrategyId: rawOrder.settlementStrategyId || 0,\n      acceptablePrice: convertEtherToWei(rawOrder.acceptablePrice),\n      trackingCode: rawOrder.trackingCode,\n      referrer: rawOrder.referrer,\n    };\n\n    const data = encodeFunctionData({\n      abi: SYNTHETIX_ZAP_ABI,\n      functionName: 'createAccountDepositAndCommit',\n      args: [\n        accountId,\n        collateral.address,\n        synthCollateral.contractAddress,\n        formattedCollateral,\n        spotCollateralId,\n        order,\n      ],\n    });\n\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    return [\n      {\n        target: zapContract,\n        callData: data,\n        value: 0n,\n        requireSuccess: true,\n      },\n    ];\n  }\n\n  public async createAccountAndDeposit(data: CreateAccountAndDeposit, override: OverrideParamsWrite = {}) {\n    const txs = await this._createAccountAndDeposit(data);\n    const { resolvedMarketId: spotCollateralId } = await this.sdk.spot.resolveMarket(data.collateralMarketIdOrName);\n    const synthCollateral = await this.sdk.spot.getMarket(spotCollateralId);\n    const formattedSize = await this.formatSize(data.amount, spotCollateralId);\n\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    const stateOverrideZap = erc20StateOverrideBalanceAndAllowance({\n      token: collateral.address,\n      owner: this.sdk.accountAddress,\n      spender: zapContract,\n    });\n\n    const approveTx = {\n      target: collateral.address,\n      callData: encodeFunctionData({\n        abi: erc20Abi,\n        functionName: 'approve',\n        args: [zapContract, formattedSize],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n\n    return this.sdk.utils.processTransactions(txs, {\n      ...override,\n      stateOverride: [...stateOverrideZap],\n      prepend: [this.sdk.utils._fromCallDataToTransactionData(approveTx)],\n    });\n  }\n\n  protected async _createAccountAndDepositMany({\n    tokens,\n    sTokens,\n    amounts,\n    collateralIds,\n    accountId: _accountId,\n  }: {\n    tokens: string[];\n    sTokens: string[];\n    amounts: bigint[];\n    collateralIds: MarketIdOrName[];\n    accountId?: bigint;\n  }) {\n    const accountId = _accountId || generateRandomAccountId();\n\n    const data = encodeFunctionData({\n      abi: SYNTHETIX_ZAP_ABI,\n      functionName: 'createAccountAndDeposits',\n      args: [accountId, tokens, sTokens, amounts, collateralIds],\n    });\n\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    return [\n      {\n        target: zapContract,\n        callData: data,\n        value: 0n,\n        requireSuccess: true,\n      },\n    ];\n  }\n\n  public async createAccountAndDepositMany(data: CreateAccountAndDepositMany, override: OverrideParamsWrite = {}) {\n    const collateralsPromise = data.collateralMarketIdOrNames.map(async (collateralId) => {\n      const { resolvedMarketId } = await this.sdk.spot.resolveMarket(collateralId);\n      const synthCollateral = await this.sdk.spot.getMarket(resolvedMarketId);\n\n      const collateral = await this.sdk.contracts.getCollateralInstance(\n        (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n      );\n\n      return {\n        synthCollateral,\n        collateral,\n        resolvedMarketId,\n      };\n    });\n\n    const collaterals = await Promise.all(collateralsPromise);\n\n    const formattedAmountsPromise = data.amounts.map(async (amount, index) => {\n      return await this.formatSize(amount, collaterals[index].resolvedMarketId);\n    });\n    const formattedAmounts = await Promise.all(formattedAmountsPromise);\n\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    const stateOverrideZap = collaterals.map((collateral) =>\n      erc20StateOverrideBalanceAndAllowance({\n        token: collateral.collateral.address,\n        owner: this.sdk.accountAddress,\n        spender: zapContract,\n      }),\n    );\n\n    const approveTxs = collaterals.map((collateral, index) => ({\n      to: collateral.collateral.address,\n      data: encodeFunctionData({\n        abi: erc20Abi,\n        functionName: 'approve',\n        args: [zapContract, formattedAmounts[index]],\n      }),\n      value: '0',\n    }));\n    console.log('=== approveTxs', approveTxs);\n\n    const txs = await this._createAccountAndDepositMany({\n      tokens: collaterals.map((collateral) => collateral.collateral.address),\n      sTokens: collaterals.map((collateral) => collateral.synthCollateral.contractAddress),\n      amounts: formattedAmounts,\n      collateralIds: data.collateralMarketIdOrNames,\n      accountId: data.accountId,\n    });\n\n    return this.sdk.utils.processTransactions(txs, {\n      ...override,\n      stateOverride: [...stateOverrideZap].flat(),\n      prepend: approveTxs,\n    });\n  }\n\n  /**\n   * @name createIsolatedAccountOrder\n   * @description Creates an isolated account order for a given market, adding the specified collateral and creating the order.\n   * @param {CreateIsolateOrder} params - The parameters to create an isolated account order.\n   * @param {OverrideParamsWrite} override - Optional override parameters for writing transactions (defaults to default values).\n   * @returns An array of CallParameters if multi-call is not used, or the transaction hash if it is submitted.\n   */\n  public async createIsolatedAccountOrder(\n    {\n      collateralAmount,\n      size,\n      marketIdOrName,\n      settlementStrategyId = 0,\n      accountId = generateRandomAccountId(),\n      desiredFillPrice,\n      maxPriceImpact,\n      collateralMarketId,\n    }: CreateIsolateOrder,\n    override: OverrideParamsWrite = {},\n  ): Promise<WriteReturnType> {\n    const { resolvedMarketId: spotCollateralId } = await this.sdk.spot.resolveMarket(collateralMarketId);\n\n    const synthCollateral = await this.sdk.spot.getMarket(spotCollateralId);\n\n    // Remove Synthetix asset's `s` from market name.\n    // For example, remove `s` from `sUSDe` to get `USDe`\n    const collateral = await this.sdk.contracts.getCollateralInstance(\n      (synthCollateral.marketName ?? 'Unresolved Market').replace('s', ''),\n    );\n    const zapContract = SYNTHETIX_ZAP[this.sdk.rpcConfig.chainId];\n\n    const approveTx = {\n      to: collateral.address,\n      data: encodeFunctionData({\n        abi: erc20Abi,\n        functionName: 'approve',\n        args: [zapContract, await this.formatSize(collateralAmount, spotCollateralId)],\n      }),\n\n      value: '0',\n    };\n\n    let acceptablePrice = desiredFillPrice;\n\n    if (!acceptablePrice) {\n      const isShort = size < 0 ? -1 : 1;\n      const { resolvedMarketId } = await this.sdk.spot.resolveMarket(marketIdOrName);\n      const updatedMaxPriceImpact = maxPriceImpact ?? this.sdk.maxPriceImpact;\n      const market = await this.getMarket(resolvedMarketId);\n      const priceImpact = 1 + (isShort * updatedMaxPriceImpact) / 100;\n      acceptablePrice = (market.indexPrice ?? 0) * priceImpact;\n    }\n\n    // 1. create and deposit\n    const createAndDepositTx = await this._createAccountDepositAndCommit({\n      amount: collateralAmount,\n      collateralMarketIdOrName: spotCollateralId,\n      accountId,\n      order: {\n        size,\n        settlementStrategyId,\n        marketIdOrName,\n        acceptablePrice,\n        trackingCode: this.sdk.trackingCode,\n        referrer: this.sdk.referrer,\n      },\n    });\n\n    const rawTxs = [...createAndDepositTx].flat();\n\n    const stateOverrideSpot = erc20StateOverrideBalanceAndAllowance({\n      token: collateral.address,\n      owner: this.sdk.accountAddress,\n      spender: zapContract,\n    });\n\n    return this.sdk.utils.processTransactions(rawTxs, {\n      ...override,\n      prepend: [approveTx, ...(override?.prepend ? override.prepend : [])],\n      stateOverride: [...stateOverrideSpot],\n    });\n  }\n\n  async buildGrantPermission({ accountId, permission, user }: GrantPermission): Promise<Call3Value> {\n    const coreProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const grantPermissionTx: Call3Value = {\n      target: coreProxy.address,\n      callData: encodeFunctionData({\n        abi: coreProxy.abi,\n        functionName: 'grantPermission',\n        args: [accountId, permission, user],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n\n    return grantPermissionTx;\n  }\n\n  /*\n   * @notice Grant a permission to a user for a specific account\n   * @param accountId Account ID\n   * @param permission Permission to grant\n   * @param user Address of the user to grant permission to\n   * @param override Override parameters\n   * */\n\n  public async grantPermission(\n    { accountId = this.defaultAccountId, permission, user }: GrantPermission,\n    override: Omit<OverrideParamsWrite, 'useOracleCalls'> = {},\n  ) {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const grantPermissionTx = await this.buildGrantPermission({ accountId, permission, user });\n\n    const txs = [grantPermissionTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override, useOracleCalls: false });\n  }\n\n  /*\n   * @notice Revoke a permission from a user for a specific account\n   * @param accountId Account ID\n   * @param permission Permission to revoke\n   * @param user Address of the user to revoke permission from\n   * @param override Override parameters\n   * */\n\n  public async revokePermission(\n    { accountId = this.defaultAccountId, permission, user }: GrantPermission,\n    override: Omit<OverrideParamsWrite, 'useOracleCalls'> = {},\n  ) {\n    if (!accountId) throw new Error('Account ID is required');\n\n    const coreProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n\n    const grantPermissionTx: Call3Value = {\n      target: coreProxy.address,\n      callData: encodeFunctionData({\n        abi: coreProxy.abi,\n        functionName: 'revokePermission',\n        args: [accountId, permission, user],\n      }),\n      value: 0n,\n      requireSuccess: true,\n    };\n\n    const txs = [grantPermissionTx];\n\n    return this.sdk.utils.processTransactions(txs, { ...override, useOracleCalls: false });\n  }\n\n  /*\n   * @notice Get account permissions\n   * @param accountId Account ID\n   * @param override Override parameters\n   * */\n\n  public async getAccountPermissions({ accountId = this.defaultAccountId }: GetPermissions) {\n    if (!accountId) throw new Error('Account ID is required to get permission');\n\n    const coreProxy = await this.sdk.contracts.getPerpsMarketProxyInstance();\n    return (await coreProxy.read.getAccountPermissions([accountId])) as AccountPermissions[];\n  }\n\n  public async payDebtAndWithdraw(params: PayDebtAndWithdraw, override: OverrideParamsWrite) {\n    const zapInstance = await this.sdk.contracts.getZapInstance();\n    const modifyPerpsPermission = PERPS_PERMISSIONS.PERPS_MODIFY_COLLATERAL;\n    const { resolvedMarketId } = await this.sdk.spot.resolveMarket(params.collateralIdOrName);\n\n    const grantPermissionTx = await this.buildGrantPermission({\n      accountId: params.accountId,\n      permission: modifyPerpsPermission,\n      user: zapInstance.address,\n    });\n\n    const amount = await this.formatSize(params.collateralAmount, 18);\n\n    const swapMaxAmountIn = amount;\n\n    const minAmount = await this.formatSize(params.minToReceive, resolvedMarketId);\n\n    params.path =\n      params.path ??\n      (\n        await getOdosPath({\n          fromToken: params.collateral,\n          fromChain: this.sdk.rpcConfig.chainId,\n          toToken: (await this.sdk.contracts.getCollateralInstance('USDC')).address,\n          fromAmount: amount.toString(),\n        })\n      ).path;\n\n    const unwindTx = {\n      target: zapInstance.address,\n      callData: encodeFunctionData({\n        abi: zapInstance.abi,\n        functionName: 'unwind',\n        args: [\n          params.accountId,\n          resolvedMarketId,\n          amount,\n          params.collateral,\n          params.path,\n          minAmount,\n          minAmount,\n          swapMaxAmountIn,\n          params.receiver,\n        ],\n      }),\n      requireSuccess: true,\n      value: 0n,\n    } as Call3Value;\n    const txs = [grantPermissionTx, unwindTx];\n    return this.sdk.utils.processTransactions(txs, { ...override });\n  }\n}\n","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","export const DEFAULT_NETWORK_ID = 8453;\n\nexport const DEFAULT_DECIMALS = 18;\nexport const DEFAULT_SLIPPAGE = 2.0;\nexport const DEFAULT_GAS_MULTIPLIER = 2.0;\n\nexport const PUBLIC_PYTH_ENDPOINT = 'https://hermes.pyth.network';\nexport const DEFAULT_PYTH_TIMEOUT = 15000; // 15 sec\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","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","import { encodeAbiParameters, Hex, parseUnits } from 'viem';\nimport { SynthetixSdk } from '..';\nimport { CUSTOM_DECIMALS, DISABLED_MARKETS } from '../constants';\nimport { MarketIdOrName } from '../interface/commonTypes';\nimport { MarketData, SpotMarketData } from '../perps/interface';\nimport { Call3Value } from '../interface/contractTypes';\n\nexport abstract class Market<T extends MarketData | SpotMarketData> {\n  sdk: SynthetixSdk;\n  marketsById: Map<number, T>;\n  marketsByName: Map<string, T>;\n\n  // Mapping of Market Symbol to T.\n  // @note Ideally prefer using market symbol over market name\n  marketsBySymbol: Map<string, T>;\n  disabledMarkets: number[] = [];\n\n  constructor(synthetixSdk: SynthetixSdk) {\n    this.sdk = synthetixSdk;\n    // Initialize empty market data\n    this.marketsById = new Map<number, T>();\n    this.marketsByName = new Map<string, T>();\n    this.marketsBySymbol = new Map<string, T>();\n\n    // Set disabled markets\n    if (synthetixSdk.rpcConfig.chainId in DISABLED_MARKETS) {\n      this.disabledMarkets = DISABLED_MARKETS[synthetixSdk.rpcConfig.chainId];\n    }\n  }\n  /**\n   * Look up the market_id and market_name for a market. If only one is provided,\n   * the other is resolved. If both are provided, they are checked for consistency.\n   * @param marketIdOrName Id or name of the market to resolve\n   */\n  public async resolveMarket(\n    marketIdOrName: MarketIdOrName,\n  ): Promise<{ resolvedMarketId: number; resolvedMarketName: string }> {\n    // Do not resolve markets if flag is not set or if market name is passed as\n    // an argument\n    if (!this.sdk.resolveMarketNames && typeof marketIdOrName === 'number') {\n      console.log('Resolve markets set to false. Returning market id without validating...');\n      return { resolvedMarketName: 'Unresolved Market', resolvedMarketId: Number(marketIdOrName) };\n    }\n\n    const market = await this.getMarket(marketIdOrName);\n    if (!market?.marketName || market?.marketId === undefined)\n      throw new Error(`Market not found for ${marketIdOrName}`);\n\n    return { resolvedMarketName: market.marketName, resolvedMarketId: market.marketId };\n  }\n\n  /**\n   * Format the size of a synth for an order. This is used for synths whose base asset\n   * does not use 18 decimals. For example, USDC uses 6 decimals, so we need to handle size\n   * differently from other assets.\n   * @param size The size as an ether value (e.g. 100).\n   * @param marketId The id of the market.\n   * @returns The formatted size in wei. (e.g. 100 = 100000000000000000000)\n   */\n  public async formatSize(size: number, marketId: MarketIdOrName) {\n    // TODO: think in a better solution maybe get the collateral and query the decimals from the contract\n\n    return parseUnits(size.toString(), CUSTOM_DECIMALS[this.sdk.rpcConfig.chainId][marketId] || 18);\n  }\n\n  async prepareOracleCallsWithPriceId(priceFeedIds: string[]): Promise<Call3Value[]> {\n    if (!priceFeedIds.length) {\n      return [];\n    }\n    const stalenessTolerance = 30n; // 30 seconds\n    const updateData = await this.sdk.pyth.getPriceFeedsUpdateData(priceFeedIds as Hex[]);\n\n    const signedRequiredData = encodeAbiParameters(\n      [\n        { type: 'uint8', name: 'updateType' },\n        { type: 'uint64', name: 'stalenessTolerance' },\n        { type: 'bytes32[]', name: 'priceIds' },\n        { type: 'bytes[]', name: 'updateData' },\n      ],\n      [1, stalenessTolerance, priceFeedIds as Hex[], updateData],\n    );\n\n    const pythWrapper = await this.sdk.contracts.getPythErc7412WrapperInstance();\n    const dataVerificationTx = this.sdk.utils.generateDataVerificationTx(pythWrapper.address, signedRequiredData);\n\n    // set `requireSuccess` to false in this case, since sometimes\n    // the wrapper will return an error if the price has already been updated\n\n    // @note A better approach would be to fetch the priceUpdateFee for tx dynamically\n    // from the Pyth contract instead of using arbitrary values for pyth price update fees\n    return [{ ...dataVerificationTx, value: 0n, requireSuccess: false }];\n  }\n\n  /**\n   *   Prepare a call to the external node with oracle updates for the specified market names.\n   * The result can be passed as the first argument to a multicall function to improve performance\n   * of ERC-7412 calls. If no market names are provided, all markets are fetched. This is useful for\n   * read functions since the user does not pay gas for those oracle calls, and reduces RPC calls and\n   * runtime.\n   * @param {number[]} marketIds An array of market ids to fetch prices for. If not provided, all markets are fetched\n   * @returns {Promise<Call3Value[]>} objects representing the target contract, call data, value, requireSuccess flag and other necessary details for executing the function in the blockchain.\n   */\n  public async prepareOracleCall(marketIds: number[] = []): Promise<Call3Value[]> {\n    let priceFeedIds: string[] = [];\n\n    if (marketIds.length != 0) {\n      const marketSymbols: string[] = [];\n      marketIds.forEach((marketId) => {\n        const marketSymbol = this.marketsById.get(marketId)?.symbol;\n        if (!marketSymbol) return;\n        marketSymbols.push(marketSymbol);\n      });\n\n      marketSymbols.forEach((marketSymbol) => {\n        const feedId = this.sdk.pyth.priceFeedIds.get(marketSymbol);\n        if (!feedId) return;\n        priceFeedIds.push(feedId);\n      });\n    } else {\n      priceFeedIds = Array.from(this.sdk.pyth.priceFeedIds.values());\n    }\n\n    return this.prepareOracleCallsWithPriceId(priceFeedIds);\n  }\n\n  public async getMarket(marketIdOrName: MarketIdOrName): Promise<T> {\n    throw new Error('Method not implemented. ' + marketIdOrName);\n  }\n}\n","import { keccak256, encodeAbiParameters, toHex, Address, StateMapping } from 'viem';\nimport { tokensSlots } from '../constants/slots';\n\nexport type Erc20BalanceOverrideParameters = {\n  token: string;\n  owner: string;\n  slot: bigint;\n  balance?: bigint;\n};\n\nexport function erc20BalanceOverride({\n  token,\n  owner,\n  slot,\n  balance = BigInt('0x100000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'),\n}: Erc20BalanceOverrideParameters): { address: Address; stateDiff: StateMapping }[] {\n  const smartAccountErc20BalanceSlot = keccak256(\n    encodeAbiParameters(\n      [\n        {\n          type: 'address',\n        },\n        {\n          type: 'uint256',\n        },\n      ],\n      [owner as Address, slot],\n    ),\n  );\n\n  return [\n    {\n      address: token as Address,\n      stateDiff: [\n        {\n          slot: smartAccountErc20BalanceSlot,\n          value: toHex(balance),\n        },\n      ],\n    },\n  ];\n}\n\nexport type Erc20AllowanceOverrideParameters = {\n  token: string;\n  owner: string;\n  spender: string;\n  slot: bigint;\n  amount?: bigint;\n};\n\nexport function erc20AllowanceOverride({\n  token,\n  owner,\n  spender,\n  slot,\n  amount = BigInt('0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'),\n}: Erc20AllowanceOverrideParameters): { address: Address; stateDiff: StateMapping }[] {\n  const smartAccountErc20AllowanceSlot = keccak256(\n    encodeAbiParameters(\n      [\n        {\n          type: 'address',\n        },\n        {\n          type: 'bytes32',\n        },\n      ],\n      [\n        spender as Address,\n        keccak256(\n          encodeAbiParameters(\n            [\n              {\n                type: 'address',\n              },\n              {\n                type: 'uint256',\n              },\n            ],\n            [owner as Address, BigInt(slot)],\n          ),\n        ),\n      ],\n    ),\n  );\n\n  return [\n    {\n      address: token as Address,\n      stateDiff: [\n        {\n          slot: smartAccountErc20AllowanceSlot,\n          value: toHex(amount),\n        },\n      ],\n    },\n  ];\n}\nexport const erc20StateOverrideBalanceAndAllowance = ({\n  token,\n  owner,\n  balance = BigInt('0x100000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'),\n  spender,\n}: {\n  token: string;\n  owner: string;\n  balance?: bigint;\n  spender: string;\n}) => {\n  const balanceSlot = tokensSlots.find((slotData) => slotData.address.toLowerCase() === token.toLowerCase());\n\n  if (!balanceSlot) throw new Error('No balance slot');\n\n  const balanceOverride = erc20BalanceOverride({ balance, slot: BigInt(balanceSlot.balanceSlot), token, owner });\n  const approveOverride = erc20AllowanceOverride({\n    spender,\n    amount: balance,\n    token,\n    slot: BigInt(balanceSlot.approveSlot),\n    owner,\n  });\n\n  return [...balanceOverride, ...approveOverride];\n};\n","export const tokensSlots = [\n  { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', balanceSlot: 9, approveSlot: 10 },\n  { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', balanceSlot: 9, approveSlot: 10 },\n  { address: '0x4EA71A20e655794051D1eE8b6e4A3269B13ccaCc', balanceSlot: 5, approveSlot: 6 },\n  { address: '0x4EA71A20e655794051D1eE8b6e4A3269B13ccaCc', balanceSlot: 5, approveSlot: 6 },\n  { address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', balanceSlot: 9, approveSlot: 10 },\n  { address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', balanceSlot: 9, approveSlot: 10 },\n  { address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22', balanceSlot: 51, approveSlot: 52 },\n  { address: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22', balanceSlot: 51, approveSlot: 52 },\n  { address: '0x4200000000000000000000000000000000000006', balanceSlot: 3, approveSlot: 4 },\n  { address: '0x4200000000000000000000000000000000000006', balanceSlot: 3, approveSlot: 4 },\n  { address: '0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452', balanceSlot: 1, approveSlot: 2 },\n  { address: '0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452', balanceSlot: 1, approveSlot: 2 },\n\n  {\n    address: '0xc43708f8987Df3f3681801e5e640667D86Ce3C30',\n    balanceSlot: 0,\n    approveSlot: 1,\n  },\n  {\n    address: '0x8608d511E224180051A36d34121725D978064e6E',\n    balanceSlot: 0,\n    approveSlot: 1,\n  },\n  {\n    address: '0x4200000000000000000000000000000000000006',\n    balanceSlot: 3,\n    approveSlot: 4,\n  },\n  {\n    address: '0xB3f05d39504dA95876EA0174D25Ae51Ac2422a70',\n    balanceSlot: 0,\n    approveSlot: 1,\n  },\n  {\n    address: '0x00ab6b818652bB3bFE334983171edFD38184DbeD',\n    balanceSlot: 0,\n    approveSlot: 1,\n  },\n  {\n    address: '0x7Bf65af7EFBd0E933fb87dD2C9cE7A17d959b822',\n    balanceSlot: 0,\n    approveSlot: 1,\n  },\n];\n","export const ZAP_ABI = [\n  {\n    inputs: [\n      { internalType: 'address', name: '_usdc', type: 'address' },\n      { internalType: 'address', name: '_usdx', type: 'address' },\n      { internalType: 'address', name: '_spotMarket', type: 'address' },\n      { internalType: 'address', name: '_perpsMarket', type: 'address' },\n      { internalType: 'address', name: '_referrer', type: 'address' },\n      { internalType: 'uint128', name: '_susdcSpotId', type: 'uint128' },\n      { internalType: 'address', name: '_aave', type: 'address' },\n      { internalType: 'address', name: '_router', type: 'address' },\n      { internalType: 'address', name: '_quoter', type: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'constructor',\n  },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'BuyFailed',\n    type: 'error',\n  },\n  { inputs: [], name: 'NotPermitted', type: 'error' },\n  {\n    inputs: [{ internalType: 'address', name: 'caller', type: 'address' }],\n    name: 'OnlyAave',\n    type: 'error',\n  },\n  { inputs: [], name: 'OnlyPlumber', type: 'error' },\n  {\n    inputs: [{ internalType: 'bytes', name: 'reason', type: 'bytes' }],\n    name: 'PullFailed',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'bytes', name: 'reason', type: 'bytes' }],\n    name: 'PushFailed',\n    type: 'error',\n  },\n  {\n    inputs: [\n      { internalType: 'enum Reentrancy.Stage', name: 'actual', type: 'uint8' },\n      {\n        internalType: 'enum Reentrancy.Stage',\n        name: 'expected',\n        type: 'uint8',\n      },\n    ],\n    name: 'ReentrancyDetected',\n    type: 'error',\n  },\n  { inputs: [], name: 'ReentrancyGuardReentrantCall', type: 'error' },\n  {\n    inputs: [{ internalType: 'address', name: 'token', type: 'address' }],\n    name: 'SafeERC20FailedOperation',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'SellFailed',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'SwapFailed',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'UnwrapFailed',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'WrapFailed',\n    type: 'error',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: false,\n        internalType: 'address',\n        name: 'plumber',\n        type: 'address',\n      },\n    ],\n    name: 'PlumberDesignated',\n    type: 'event',\n  },\n  {\n    inputs: [],\n    name: 'AAVE',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'BURN_PERMISSION',\n    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'FEE_TIER',\n    outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'MODIFY_PERMISSION',\n    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'PERPS_MARKET',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'PLUMBER',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'QUOTER',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'REFERRAL_CODE',\n    outputs: [{ internalType: 'uint16', name: '', type: 'uint16' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'REFERRER',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'ROUTER',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'SPOT_MARKET',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'SUSDC_SPOT_ID',\n    outputs: [{ internalType: 'uint128', name: '', type: 'uint128' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'USDC',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'USDX',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'USDX_ID',\n    outputs: [{ internalType: 'uint128', name: '', type: 'uint128' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint128', name: '_accountId', type: 'uint128' },\n    ],\n    name: 'burn',\n    outputs: [{ internalType: 'uint256', name: 'excess', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint128', name: '_synthId', type: 'uint128' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'buy',\n    outputs: [\n      { internalType: 'uint256', name: 'received', type: 'uint256' },\n      { internalType: 'address', name: 'synth', type: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: '_newPlumber', type: 'address' }],\n    name: 'designatePlumber',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '', type: 'address' },\n      { internalType: 'uint256', name: '_flashloan', type: 'uint256' },\n      { internalType: 'uint256', name: '_premium', type: 'uint256' },\n      { internalType: 'address', name: '', type: 'address' },\n      { internalType: 'bytes', name: '_params', type: 'bytes' },\n    ],\n    name: 'executeOperation',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: '_token', type: 'address' }],\n    name: 'flush',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes', name: '_path', type: 'bytes' },\n      { internalType: 'uint256', name: '_amountOut', type: 'uint256' },\n    ],\n    name: 'quoteSwapFor',\n    outputs: [\n      { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n      {\n        internalType: 'uint160[]',\n        name: 'sqrtPriceX96AfterList',\n        type: 'uint160[]',\n      },\n      {\n        internalType: 'uint32[]',\n        name: 'initializedTicksCrossedList',\n        type: 'uint32[]',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes', name: '_path', type: 'bytes' },\n      { internalType: 'uint256', name: '_amountIn', type: 'uint256' },\n    ],\n    name: 'quoteSwapWith',\n    outputs: [\n      { internalType: 'uint256', name: 'amountOut', type: 'uint256' },\n      {\n        internalType: 'uint160[]',\n        name: 'sqrtPriceX96AfterList',\n        type: 'uint160[]',\n      },\n      {\n        internalType: 'uint32[]',\n        name: 'initializedTicksCrossedList',\n        type: 'uint32[]',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint128', name: '_synthId', type: 'uint128' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'sell',\n    outputs: [{ internalType: 'uint256', name: 'received', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '_from', type: 'address' },\n      { internalType: 'bytes', name: '_path', type: 'bytes' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_maxAmountIn', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'swapFor',\n    outputs: [{ internalType: 'uint256', name: 'deducted', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '_from', type: 'address' },\n      { internalType: 'bytes', name: '_path', type: 'bytes' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_amountOutMinimum', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'swapWith',\n    outputs: [{ internalType: 'uint256', name: 'received', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint128', name: '_accountId', type: 'uint128' },\n      { internalType: 'uint128', name: '_collateralId', type: 'uint128' },\n      { internalType: 'uint256', name: '_collateralAmount', type: 'uint256' },\n      { internalType: 'address', name: '_collateral', type: 'address' },\n      { internalType: 'bytes', name: '_path', type: 'bytes' },\n      { internalType: 'uint256', name: '_zapMinAmountOut', type: 'uint256' },\n      { internalType: 'uint256', name: '_unwrapMinAmountOut', type: 'uint256' },\n      { internalType: 'uint256', name: '_swapMaxAmountIn', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'unwind',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '_token', type: 'address' },\n      { internalType: 'uint128', name: '_synthId', type: 'uint128' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'unwrap',\n    outputs: [{ internalType: 'uint256', name: 'unwrapped', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint128', name: '_synthId', type: 'uint128' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint128', name: '_accountId', type: 'uint128' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'withdraw',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '_token', type: 'address' },\n      { internalType: 'uint128', name: '_synthId', type: 'uint128' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'wrap',\n    outputs: [{ internalType: 'uint256', name: 'wrapped', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'zapIn',\n    outputs: [{ internalType: 'uint256', name: 'zapped', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_minAmountOut', type: 'uint256' },\n      { internalType: 'address', name: '_receiver', type: 'address' },\n    ],\n    name: 'zapOut',\n    outputs: [{ internalType: 'uint256', name: 'zapped', type: 'uint256' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n];\n\nexport const SYNTHETIX_ZAP_ABI = [\n  {\n    type: 'constructor',\n    inputs: [\n      { name: 'perps', type: 'address', internalType: 'address' },\n      { name: 'spot', type: 'address', internalType: 'address' },\n      { name: 'account', type: 'address', internalType: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'createAccountAndDeposit',\n    inputs: [\n      { name: 'accountId', type: 'uint128', internalType: 'uint128' },\n      { name: 'token', type: 'address', internalType: 'contract IERC20' },\n      { name: 'sToken', type: 'address', internalType: 'contract IERC20' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'collateralId', type: 'uint128', internalType: 'uint128' },\n    ],\n    outputs: [{ name: '', type: 'uint128', internalType: 'uint128' }],\n    stateMutability: 'nonpayable',\n  },\n\n  {\n    inputs: [\n      {\n        internalType: 'uint128',\n        name: 'accountId',\n        type: 'uint128',\n      },\n      {\n        internalType: 'contract IERC20[]',\n        name: 'token',\n        type: 'address[]',\n      },\n      {\n        internalType: 'contract IERC20[]',\n        name: 'sToken',\n        type: 'address[]',\n      },\n      {\n        internalType: 'uint256[]',\n        name: 'amount',\n        type: 'uint256[]',\n      },\n      {\n        internalType: 'uint128[]',\n        name: 'collateralId',\n        type: 'uint128[]',\n      },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n    name: 'createAccountAndDeposits',\n    outputs: [{ internalType: 'uint128', name: '', type: 'uint128' }],\n  },\n\n  {\n    type: 'function',\n    name: 'deposit',\n    inputs: [\n      { name: 'accountId', type: 'uint128', internalType: 'uint128' },\n      { name: 'token', type: 'address', internalType: 'contract IERC20' },\n      { name: 'sToken', type: 'address', internalType: 'contract IERC20' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'collateralId', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n\n  {\n    type: 'function',\n    name: 'withdraw',\n    inputs: [\n      { name: 'accountId', type: 'uint128', internalType: 'uint128' },\n      {\n        name: 'token',\n        type: 'address',\n        internalType: 'contract IERC20',\n      },\n      { name: 'amount', type: 'int256', internalType: 'int256' },\n      { name: 'collateralId', type: 'uint128', internalType: 'uint128' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'createAccountDepositAndCommit',\n    inputs: [\n      { name: 'accountId', type: 'uint128', internalType: 'uint128' },\n      {\n        name: 'token',\n        type: 'address',\n        internalType: 'contract IERC20',\n      },\n      {\n        name: 'sToken',\n        type: 'address',\n        internalType: 'contract IERC20',\n      },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'collateralId',\n        type: 'uint128',\n        internalType: 'uint128',\n      },\n      {\n        name: 'commit',\n        type: 'tuple',\n        internalType: 'struct SynthetixZap.Commit',\n        components: [\n          {\n            name: 'marketId',\n            type: 'uint128',\n            internalType: 'uint128',\n          },\n          { name: 'sizeDelta', type: 'int128', internalType: 'int128' },\n          {\n            name: 'settlementStrategyId',\n            type: 'uint128',\n            internalType: 'uint128',\n          },\n          {\n            name: 'acceptablePrice',\n            type: 'uint256',\n            internalType: 'uint256',\n          },\n          {\n            name: 'trackingCode',\n            type: 'bytes32',\n            internalType: 'bytes32',\n          },\n          { name: 'referrer', type: 'address', internalType: 'address' },\n        ],\n      },\n    ],\n    outputs: [{ name: '', type: 'uint128', internalType: 'uint128' }],\n    stateMutability: 'nonpayable',\n  },\n];\n"],"mappings":"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","names":["encodeFunctionData","formatEther","zeroAddress","zeroAddress","encodeAbiParameters","encodeAbiParameters","encodeAbiParameters","encodeAbiParameters","strategy","fundingParam","orderFee","maxMarketValue","formatEther","encodeFunctionData"]}