{
  "version": 3,
  "sources": ["../src/bitcoin.ts", "../src/client.ts", "../src/types.ts", "../src/constants.ts", "../src/execution.ts", "../src/fees.ts", "../src/price.ts", "../src/utils.ts", "../src/currency.ts", "../src/quote.ts", "../src/solana.ts", "../src/tron.ts", "../src/assets.ts", "../src/dynamicRoutes/lighter.ts", "../src/dynamicRoutes/abi.ts", "../src/dynamicRoutes/consts.ts", "../src/dynamicRoutes/utils.ts", "../src/dynamicRoutes/index.ts"],
  "sourcesContent": ["import { adaptBitcoinWallet } from '@relayprotocol/relay-bitcoin-wallet-adapter'\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk'\n\ntype Base16 =\n  | '0'\n  | '1'\n  | '2'\n  | '3'\n  | '4'\n  | '5'\n  | '6'\n  | '7'\n  | '8'\n  | '9'\n  | 'a'\n  | 'b'\n  | 'c'\n  | 'd'\n  | 'e'\n  | 'f'\n\nexport type BitcoinAddress =\n  | `1${string}`\n  | `3${string}`\n  | `bc1${string}`\n  | `bc1p${string}`\n\nexport type BitcoinTxHash = `${Base16}${string}`\n\nexport type BitcoinWallet = {\n  address(): Promise<BitcoinAddress>\n  vmType: 'bvm'\n} & AdaptedWallet\n\n/** bitcoinjs-lib Psbt */\nexport type BitcoinPsbt = Parameters<\n  Parameters<typeof adaptBitcoinWallet>[1]\n>[1]\n\nexport type BitcoinPsbtDynamicParams = Parameters<\n  Parameters<typeof adaptBitcoinWallet>[1]\n>[2]\n\n/** bitcoinjs-lib Signer */\nexport type BitcoinSigner = Parameters<BitcoinPsbt['signAllInputs']>[0]\n\nexport function getBitcoinWallet(\n  walletAddress: BitcoinAddress,\n  signPsbt: (\n    address: BitcoinAddress,\n    psbt: BitcoinPsbt,\n    dynamicParams: BitcoinPsbtDynamicParams,\n  ) => Promise<string>,\n): BitcoinWallet {\n  return adaptBitcoinWallet(walletAddress, (address, psbt, dynamicParams) =>\n    signPsbt(address as BitcoinAddress, psbt, dynamicParams),\n  ) as BitcoinWallet\n}\n\nexport function getBitcoinWalletFromSigner(\n  walletAddress: BitcoinAddress,\n  signer: BitcoinSigner,\n): BitcoinWallet {\n  return getBitcoinWallet(walletAddress, async (_, psbt) =>\n    psbt.signAllInputs(signer).toBase64(),\n  )\n}\n", "// Reach relay-sdk's runtime exports through a namespace import, not named\n// imports. Some integrator bundlers fail to bind individual named exports from\n// relay-sdk's CJS build (dydx hit `convertViemChainToRelayChain is not a\n// function`); a namespace read resolves off the live module object and is\n// robust to that CJS/ESM interop gap.\nimport * as relaySdk from '@relayprotocol/relay-sdk'\nimport type {\n  RelayClient,\n  RelayClientOptions,\n  log,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport {\n  RELAY_LIGHTER_CHAIN_ID_NUMBER,\n  RELAY_SOLANA_CHAIN_ID_NUMBER,\n} from './constants'\nimport type { Logger } from './types'\n\nexport type InitializeRelayClientParams = Omit<\n  RelayClientOptions,\n  'baseApiUrl' | 'chains' | 'logger'\n> & {\n  chains: Chain[]\n  logger: Logger\n}\n\n/**\n * Initializes a global instance of the RelayClient\n * https://docs.relay.link/references/sdk/createClient\n */\nexport function initializeRelayClient({\n  chains,\n  logger,\n  ...options\n}: InitializeRelayClientParams): RelayClient {\n  const relayLogger = (\n    message: Parameters<typeof log>[0],\n    level: relaySdk.LogLevel,\n  ) => {\n    const logType: keyof Logger =\n      level === relaySdk.LogLevel.Error ? 'error' : 'info'\n    const logMessage = message[0] ?? 'Unknown error'\n    const logData = message.length > 1 ? message.slice(1) : undefined\n\n    logger[logType]('[RelayClient]', {\n      message: logMessage,\n      relayLogLevel: level,\n      ...(logData && { data: logData }),\n    })\n  }\n\n  // relay-sdk v6 accepts the logger in createClient() directly, so the prior\n  // post-creation configure() workaround (needed up to v5) is gone.\n  return relaySdk.createClient({\n    ...options,\n    baseApiUrl: relaySdk.MAINNET_RELAY_API,\n    logLevel: options.logLevel ?? relaySdk.LogLevel.Verbose,\n    logger: relayLogger,\n    chains: [\n      ...chains.map(relaySdk.convertViemChainToRelayChain),\n      {\n        id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n        name: 'Solana',\n        displayName: 'Solana',\n      },\n      {\n        id: RELAY_LIGHTER_CHAIN_ID_NUMBER,\n        name: 'Lighter',\n        displayName: 'Lighter',\n      },\n    ],\n  })\n}\n\n/**\n * Gets the global instance of the RelayClient\n */\nexport function getRelayClient(): RelayClient {\n  const client = relaySdk.getClient()\n\n  if (!client) {\n    throw new Error('Relay client is not defined')\n  }\n\n  return client\n}\n", "import { LogLevel } from '@relayprotocol/relay-sdk'\nimport type { Abi, Address, Hex } from 'viem'\n\nexport { LogLevel }\n\n// https://docs.relay.link/references/api/get-intents-status-v2\nexport interface RelayExecutionInfo {\n  status: RelayExecutionStatus\n  details: string\n  /** Incoming transaction hashes */\n  inTxHashes: string[]\n  /** Outgoing transaction hashes */\n  txHashes: string[]\n  /** The last timestamp the data was updated in milliseconds */\n  time: number\n  originChainId: number\n  destinationChainId: number\n}\n\n// https://docs.relay.link/references/api/get-token-price\nexport interface RelayTokenPriceInfo {\n  price: number\n}\n\n//// The types below are duplicated from @funkit/api-base atm, but this package should be used in BE as well\n//// TODO: Are we fine with BE importing @funkit/api-base and (by extension) @funkit/utils?\n//// See https://linear.app/funxyz/issue/PE-1342/sdk-extract-domainsrelayts-to-a-new-package#comment-d487d533\n\nexport interface Logger {\n  error(message: string, data?: object): void\n  info(message: string, data?: object): void\n}\n\n// Reference: https://github.com/reservoirprotocol/relay-kit/blob/211c645f9702a3b459ff545aa4e2e9d536c38455/packages/sdk/src/types/Execute.ts#L54-L61\nexport enum RelayExecutionStatus {\n  DELAYED = 'delayed',\n  FAILURE = 'failure',\n  PENDING = 'pending',\n  REFUND = 'refund',\n  SUCCESS = 'success',\n  WAITING = 'waiting',\n  UNKNOWN = 'unknown',\n}\n\nexport interface BaseApiFunkitCheckoutActionParams {\n  contractAddress: Address\n  value?: bigint\n}\n\ninterface ApiFunkitCheckoutActionParamsRawCalldata extends BaseApiFunkitCheckoutActionParams {\n  rawCalldata: Hex\n  contractAbi?: never\n  functionName?: never\n  functionArgs?: never\n}\ninterface ApiFunkitCheckoutActionParamsContractAbi extends BaseApiFunkitCheckoutActionParams {\n  rawCalldata?: never\n  contractAbi: Abi\n  functionName: string\n  functionArgs: unknown[]\n}\n\nexport type ApiFunkitCheckoutActionParams =\n  | ApiFunkitCheckoutActionParamsRawCalldata\n  | ApiFunkitCheckoutActionParamsContractAbi\n\nexport enum CheckoutRefundState {\n  INITIATED = 'INITIATED',\n  ERROR = 'ERROR',\n  REFUNDED = 'REFUNDED',\n  PROCEEDED = 'PROCEEDED',\n  WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n  FULFILLED = 'FULFILLED',\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n  // In-progress States\n  FROM_UNFUNDED = 'FROM_UNFUNDED',\n  FROM_FUNDED = 'FROM_FUNDED',\n  FROM_POOLED = 'FROM_POOLED',\n  TO_UNFUNDED = 'TO_UNFUNDED',\n  TO_FUNDED = 'TO_FUNDED',\n  TO_POOLED = 'TO_POOLED',\n  TO_READY = 'TO_READY',\n  PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n  // Terminal States\n  COMPLETED = 'COMPLETED',\n  CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n  EXPIRED = 'EXPIRED',\n  CANCELLED = 'CANCELLED',\n}\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n  quoteId: string\n  estTotalFromAmountBaseUnit: string\n  estSubtotalFromAmountBaseUnit: string\n  estFeesFromAmountBaseUnit: string\n  fromTokenAddress: Address\n  estFeesUsd: number\n  estSubtotalUsd: number\n  estTotalUsd: number\n  estCheckoutTimeMs: number\n  estMarketMakerGasUsd: number\n  lpFeePercentage: number\n  lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n  estTotalFromAmount: string\n  estSubtotalFromAmount: string\n  estFeesFromAmount: string\n\n  // Any additional fields purely for frontend use\n  metadata?: { [key: string]: unknown }\n}\n", "import type { Address } from 'viem'\nimport type { BitcoinAddress } from './bitcoin'\nimport type { SolanaAddress } from './solana'\nimport { RelayExecutionStatus } from './types'\n\n/**\n * Chain id that Relay uses to identify Bitcoin\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_BITCOIN_CHAIN_ID_NUMBER = 8253038 // Why cannot Relay export this themselves... -.-\nexport const RELAY_BITCOIN_CHAIN_ID = `${RELAY_BITCOIN_CHAIN_ID_NUMBER}`\n\n/**\n * Chain id that Relay uses to identify Solana\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809 // Why cannot Relay export this themselves... -.-\nexport const RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`\n\nexport const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710\nexport const FUN_HYPERCORE_CHAIN_ID_NUMBER = 1337\n\nexport const RELAY_LIGHTER_CHAIN_ID_NUMBER = 3586256\nexport const RELAY_LIGHTER_CHAIN_ID = `${RELAY_LIGHTER_CHAIN_ID_NUMBER}`\n\nexport const RELAY_TRON_CHAIN_ID_NUMBER = 728126428\nexport const RELAY_TRON_CHAIN_ID = `${RELAY_TRON_CHAIN_ID_NUMBER}` as const\n\n/**\n * Fake address for a chain's native currency used by Funkit\n */\nexport const FUNKIT_NATIVE_TOKEN =\n  '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' satisfies Address\n\n/**\n * Fake address for a chain's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN =\n  '0x0000000000000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Hypercore's native currency used by Relay. This is shorter than the default native token...\n */\nexport const RELAY_NATIVE_TOKEN_HYPERCORE =\n  '0x00000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Solana's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_SOLANA =\n  '11111111111111111111111111111111' satisfies SolanaAddress\n\n/**\n * Fake address for Bitcoin's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_BITCOIN =\n  'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8' satisfies BitcoinAddress\n\n/**\n * Fake address for Lighter's native currency used by Relay\n */\nexport const RELAY_LIGHTER_USDC_PERPS = '0'\nexport const RELAY_LIGHTER_USDC_SPOT = '3'\nexport const RELAY_LIGHTER_ETH_SPOT = '1'\n\nexport const RELAY_LIGHTER_FUN_ADDRESS_MAP = {\n  '0x0000000000000000000000000000000000000000': RELAY_LIGHTER_USDC_PERPS,\n  '0x0000000000000000000000000000000000000001': RELAY_LIGHTER_ETH_SPOT,\n  '0x0000000000000000000000000000000000000003': RELAY_LIGHTER_USDC_SPOT,\n}\n\n/**\n * Wallet that receives the app fees collected by Relay\n * Prev: 0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E\n */\nexport const FUN_RELAY_REVENUE_WALLET =\n  '0xdfd877679e95c1276c85801805b2c2ab8f4f4cf6' satisfies Address\n\n/**\n * Referred field in Relay quote\n */\nexport const FUN_RELAY_REFERRER = 'funxyz'\n\n/**\n * Buffer added to Relay's time estimate (which sometimes is 0)\n */\nexport const RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS = 25_000 // 25 seconds\n\nexport const RELAY_TERMINAL_STATUSES: RelayExecutionStatus[] = [\n  RelayExecutionStatus.REFUND,\n  RelayExecutionStatus.FAILURE,\n  RelayExecutionStatus.SUCCESS,\n]\n\nexport const SUSHI_ORG_ID = 'fysix7gj5j'\nexport const HYPERSWAP_ORG_ID = '2ejzdxhfge'\n", "import {\n  type AdaptedWallet,\n  MAINNET_RELAY_API,\n  type ProgressData,\n} from '@relayprotocol/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport type { BitcoinAddress, BitcoinTxHash, BitcoinWallet } from './bitcoin'\nimport { getRelayClient } from './client'\nimport type {\n  RELAY_BITCOIN_CHAIN_ID,\n  RELAY_LIGHTER_CHAIN_ID,\n  RELAY_SOLANA_CHAIN_ID,\n  RELAY_TRON_CHAIN_ID,\n} from './constants'\nimport type { LighterAccountIndex, LighterWallet } from './lighter'\nimport type { RelayQuoteResult } from './quote'\nimport type { SolanaAddress, SolanaTxHash, SolanaWallet } from './solana'\nimport type { TronAddress, TronTxHash, TronWallet } from './tron'\nimport type { Logger, RelayExecutionInfo } from './types'\n\nexport type RelayExecutionStep = ProgressData['currentStep'] & {}\n\nexport const RELAY_VM_TYPES = [\n  'bvm',\n  'evm',\n  'hypevm',\n  'svm',\n  'lvm',\n  'tvm',\n] as const\n\nexport type RelayVmType = (typeof RELAY_VM_TYPES)[number]\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n  bvm: BitcoinAddress\n  evm: Address\n  hypevm: Address\n  svm: SolanaAddress\n  lvm: LighterAccountIndex\n  tvm: TronAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n  bvm: typeof RELAY_BITCOIN_CHAIN_ID\n  evm: string\n  hypevm: string\n  svm: typeof RELAY_SOLANA_CHAIN_ID\n  lvm: typeof RELAY_LIGHTER_CHAIN_ID\n  tvm: typeof RELAY_TRON_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n  bvm: BitcoinTxHash\n  evm: Hex\n  hypevm: Hex\n  svm: SolanaTxHash\n  lvm: Hex\n  tvm: TronTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n  bvm: BitcoinWallet\n  evm: WalletClient | (AdaptedWallet & { vmType: 'evm' })\n  hypevm: AdaptedWallet & { vmType: 'hypevm' }\n  svm: SolanaWallet\n  lvm: LighterWallet\n  tvm: TronWallet\n}[VmType]\n\nexport interface ExecuteRelayQuoteParams<VmType extends RelayVmType> {\n  logger: Logger\n  onError: (error: Error) => Promise<void>\n  onProgress?: (step: RelayExecutionStep | null) => void\n  /**\n   * Fired when all *input* transactions are confirmed on-chain.\n   */\n  onTransactionConfirmed?: (txHash: RelayTxHash<VmType>) => Promise<void>\n  /**\n   * Fired as soon as user has *signed* all input transactions, but before they are confirmed on-chain.\n   *\n   * After this event, no more action should be needed from the user.\n   * However, it is possible that the transactions will be rejected and the execution will NOT continue.\n   */\n  onUserActionsCompleted?: (txHash: RelayTxHash<VmType>) => Promise<void>\n  relayQuote: RelayQuoteResult<VmType>\n  walletClient: RelayWallet<VmType>\n\n  /**\n   * Type of transaction being executed\n   *\n   * - `'standard'` - regular transaction (default)\n   * - `'erc4337'` - ERC-4337 smart wallet transaction\n   */\n  transactionType?: 'standard' | 'erc4337'\n}\n\ninterface DefaultTxHashParams {\n  transactionType: 'standard' | 'erc4337'\n  logger: Logger\n\n  // This typing is not correct but that's what Relay returns\n  // Read Loic's PR #2565 for more details\n  txHashes: {\n    txHash: string\n  }[]\n}\n\n/**\n * Default mode. Supported for all VmTypes.\n * Uses `txHashes[0].txHash` property from onProgress callback to\n * extract the txHash.\n *\n * Used as a fallback for receipt mode\n */\ninterface TxHashesGetTxHashParams extends DefaultTxHashParams {\n  transactionType: 'standard'\n  steps?: unknown[] // steps is not used in this mode\n}\n\n/**\n * This is solely for ERC-4337 smart wallet transactions\n *\n * Uses `steps[0].items[0].receipt.transactionHash` property from onProgress callback\n * to extract the txHash\n *\n * Only used in smart wallet (account abstraction, ERC-4337) transactions\n */\ninterface ReceiptGetTxHashParams extends DefaultTxHashParams {\n  transactionType: 'erc4337'\n  steps: {\n    items: {\n      receipt?: RelayExecutionStep['items'][number]['receipt']\n    }[]\n  }[]\n}\n\ntype GetTxHashParams = TxHashesGetTxHashParams | ReceiptGetTxHashParams\n\nfunction getTxHash<VmType extends RelayVmType>({\n  logger,\n  transactionType,\n  txHashes,\n  steps,\n}: GetTxHashParams): RelayTxHash<VmType> {\n  const logPrefix = 'getTxHash'\n  const logProps = {\n    logger,\n    transactionType,\n    txHashes,\n    steps,\n  }\n  logger.info(`${logPrefix}:started`, logProps)\n\n  const getTxHashFromTxHashes = () => {\n    // From PR #2565 by Lo\u00EFc Nicolas\n    // Use first txHash as the main txHash in fun DE table\n    // Bad surprise from Relay: txHash may be an object, this is not present in their typing...\n    const rawTxHashWithUnreliableTyping = txHashes[0]?.txHash as\n      | RelayTxHash<VmType>\n      | { id: RelayTxHash<VmType> }\n\n    // rawTxHashWithUnreliableTyping cannot be null so typeof check is enough\n    const txHash =\n      typeof rawTxHashWithUnreliableTyping === 'object'\n        ? rawTxHashWithUnreliableTyping.id\n        : rawTxHashWithUnreliableTyping\n    logger.info(`${logPrefix}:txHashesMode`, {\n      ...logProps,\n      txHash,\n    })\n    if (!txHash) {\n      logger.error(`${logPrefix}:txHashesMode:noTxHash`, {\n        ...logProps,\n        txHash,\n      })\n    }\n    return txHash\n  }\n\n  const getTxHashFromReceipt = () => {\n    if (transactionType !== 'erc4337') {\n      throw new Error(\n        `Transaction type ${transactionType} is not supported for receipt mode`,\n      )\n    }\n\n    const receipt = steps?.[0]?.items?.[0]?.receipt\n\n    // This one excludes SVM and Sui receipts (which are not supported for this mode)\n    const txHash =\n      receipt && 'transactionHash' in receipt\n        ? receipt.transactionHash\n        : undefined\n    logger.info(`${logPrefix}:receiptMode`, {\n      ...logProps,\n      txHash,\n    })\n    return txHash as RelayTxHash<VmType>\n  }\n\n  switch (transactionType) {\n    // txHashes mode is the default mode\n    case 'standard': {\n      const txHash = getTxHashFromTxHashes()\n      return txHash\n    }\n    // receipt mode is used for ERC-4337 smart wallet transactions\n    // unsupported for Solana Virtual Machine (SVM) or Sui (sui) transactions\n    case 'erc4337': {\n      const txHash = getTxHashFromReceipt()\n      if (!txHash) {\n        logger.info(`${logPrefix}:receiptMode:fallbackToTxHashes`, {\n          ...logProps,\n          txHash,\n        })\n        return getTxHashFromTxHashes()\n      }\n\n      return txHash\n    }\n    default: {\n      throw new Error(`Unknown transactionType: ${transactionType}`)\n    }\n  }\n}\n\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n  logger,\n  onError,\n  onProgress,\n  onTransactionConfirmed,\n  onUserActionsCompleted,\n  relayQuote,\n  walletClient,\n  transactionType = 'standard',\n}: ExecuteRelayQuoteParams<VmType>): Promise<void> {\n  let isUserActionsCompleted = false\n  let isTransactionConfirmed = false\n\n  await getRelayClient().actions.execute({\n    quote: relayQuote,\n    wallet: walletClient,\n    onProgress: async ({\n      steps,\n      fees,\n      breakdown,\n      currentStep,\n      currentStepItem,\n      txHashes,\n      details,\n      error,\n    }) => {\n      const logPrefix = 'onRelayProgress'\n      logger.info(`${logPrefix}:params`, {\n        steps,\n        currentStep,\n        fees,\n        breakdown,\n        currentStepItem,\n        txHashes,\n        details,\n        error,\n      })\n\n      onProgress?.(currentStep ?? null)\n\n      if (error) {\n        logger.info(`${logPrefix}:errorDetected`, error)\n        await onError(error).catch((e) => {\n          logger.error(`${logPrefix}:onErrorFailed`, e)\n        })\n      } else if (txHashes?.length) {\n        const txHash = getTxHash<VmType>({\n          transactionType,\n          logger,\n          txHashes,\n          steps,\n        })\n\n        if (\n          // Call onUserActionsCompleted only once\n          !isUserActionsCompleted &&\n          steps.every((step) =>\n            step.items.every(\n              // 'completed' - catch-all for items marked completed with no other info\n              //    - e.g. Batched items will not have txHash but will have their item marked 'complete'\n              // 'pending' - for origin chain transactions that have been included on chain\n              //    - may sometimes be skipped, hence the need for 'submitted' condition below\n              // 'submitted' - for destination chain transactions that have been submitted to the network\n              // receipt - is present when the transaction has been mined/confirmed\n              // Ensure onUserActionsCompleted is always called before onTransactionConfirmed\n              (item) =>\n                item.status === 'complete' ||\n                item.checkStatus === 'pending' ||\n                item.checkStatus === 'submitted' ||\n                item.receipt !== undefined,\n            ),\n          )\n        ) {\n          logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes)\n          isUserActionsCompleted = true\n\n          try {\n            await onUserActionsCompleted?.(txHash)\n          } catch (e) {\n            logger.error(\n              `${logPrefix}:onUserActionsCompletedFailed`,\n              e as Error,\n            )\n          }\n        }\n\n        if (\n          // Call onTransactionConfirmed only once\n          !isTransactionConfirmed &&\n          steps.every((step) =>\n            step.items.every((item) => item.status === 'complete'),\n          )\n        ) {\n          logger.info(`${logPrefix}:onTransactionConfirmed`, txHashes)\n          isTransactionConfirmed = true\n\n          try {\n            await onTransactionConfirmed?.(txHash)\n          } catch (e) {\n            logger.error(\n              `${logPrefix}:onTransactionConfirmedFailed`,\n              e as Error,\n            )\n          }\n        }\n      }\n    },\n  })\n}\n\nexport async function getRelayExecutionInfo(\n  requestId: string,\n  apiKey: string,\n): Promise<RelayExecutionInfo> {\n  const url = `${MAINNET_RELAY_API}/intents/status/v2?requestId=${requestId}`\n  const response = await fetch(url, {\n    headers: { 'x-api-key': apiKey },\n  })\n  if (!response.ok) {\n    throw Error(response.statusText)\n  }\n\n  const data = await response.json()\n  return data as RelayExecutionInfo\n}\n", "import type { CallFees } from '@relayprotocol/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n  b: number\n  v: number\n  config: {\n    options: Record<string, unknown>\n  }\n  headers: Record<string, string>\n}\n\nexport async function getFunRelayFees({\n  clientId,\n  estUsdValue,\n  fromTokenAddress,\n  fromChainId,\n  recipientAddress,\n  senderAddress,\n  toTokenAddress,\n  toChainId,\n  usePermit,\n}: {\n  clientId: string\n  estUsdValue: number\n  fromTokenAddress: string\n  fromChainId: string\n  recipientAddress: string | undefined\n  senderAddress: string | undefined\n  toTokenAddress: string\n  toChainId: string\n  /**\n   * Optional explicit user preference for the source-side authorization\n   * step. Forwarded to frog as a query param so its `getUsePermit` can\n   * honor the FE toggle's choice. When omitted, frog falls back to its\n   * legacy auto-gasless decision based on (client, chain, token, gas).\n   */\n  usePermit?: boolean\n}): Promise<FunRelayFeeItem> {\n  const params = new URLSearchParams({\n    clientId,\n    estUsdValue: estUsdValue.toString(),\n    fromTokenAddress,\n    fromChainId,\n    toTokenAddress,\n    toChainId,\n    ...(recipientAddress ? { recipientAddress } : {}),\n    ...(senderAddress ? { senderAddress } : {}),\n    ...(usePermit !== undefined ? { usePermit: String(usePermit) } : {}),\n  })\n  const url = `https://frog.fun.xyz/api/fee?${params.toString()}`\n  const response = await fetch(url)\n  if (!response.ok) {\n    throw Error(response.statusText)\n  }\n\n  const data = await response.json()\n  return data\n}\n\nexport function parseRelayFees({\n  fees,\n  fromChainIdRelay,\n  fromTokenAddressRelay,\n  logger,\n  sourceAssetDecimals,\n  sourceUnitPrice,\n}: {\n  fees: CallFees | undefined\n  fromChainIdRelay: number\n  fromTokenAddressRelay: string\n  logger: Logger\n  sourceAssetDecimals: number\n  sourceUnitPrice: number\n}) {\n  // Gas fees, denominated in source chain native token\n  const relayGasFeesUsd = Number.parseFloat(fees?.gas?.amountUsd || '0')\n\n  // App fees, *usually* denominated in source chain token\n  const areFunLpFeesInSourceChainToken =\n    fees?.app?.currency?.chainId === fromChainIdRelay &&\n    fees?.app?.currency?.address?.toLowerCase() ===\n      fromTokenAddressRelay.toLowerCase()\n  const funLpFeesUsd = Number.parseFloat(fees?.app?.amountUsd || '0')\n  const funLpFeesFromAmount = areFunLpFeesInSourceChainToken\n    ? Number.parseFloat(fees?.app?.amountFormatted || '0')\n    : funLpFeesUsd / sourceUnitPrice || 0\n  const funLpFeesFromAmountBaseUnit = areFunLpFeesInSourceChainToken\n    ? BigInt(fees?.app?.amount || '0')\n    : BigInt(Math.floor(funLpFeesFromAmount * 10 ** sourceAssetDecimals))\n\n  // Relay fees, *usually* denominated in source chain token\n  const areRelayLpFeesInSourceChainToken =\n    fees?.relayer?.currency?.chainId === fromChainIdRelay &&\n    fees?.relayer?.currency?.address?.toLowerCase() ===\n      fromTokenAddressRelay.toLowerCase()\n  const relayLpFeesUsd = Number.parseFloat(fees?.relayer?.amountUsd || '0')\n  const relayLpFeesFromAmount = areRelayLpFeesInSourceChainToken\n    ? Number.parseFloat(fees?.relayer?.amountFormatted || '0')\n    : relayLpFeesUsd / sourceUnitPrice || 0\n  const relayLpFeesFromAmountBaseUnit = areRelayLpFeesInSourceChainToken\n    ? BigInt(fees?.relayer?.amount || '0')\n    : BigInt(Math.floor(relayLpFeesFromAmount * 10 ** sourceAssetDecimals))\n\n  const totalLpFeesUsd = funLpFeesUsd + relayLpFeesUsd\n  const totalLpFeesFromAmount = funLpFeesFromAmount + relayLpFeesFromAmount\n  const totalLpFeesFromAmountBaseUnit =\n    funLpFeesFromAmountBaseUnit + relayLpFeesFromAmountBaseUnit\n\n  logger.info('parseRelayFees', {\n    relayGasFeesUsd,\n    funLpFeesUsd,\n    funLpFeesFromAmount,\n    funLpFeesFromAmountBaseUnit,\n    relayLpFeesUsd,\n    relayLpFeesFromAmount,\n    relayLpFeesFromAmountBaseUnit,\n    totalLpFeesUsd,\n    totalLpFeesFromAmount,\n    totalLpFeesFromAmountBaseUnit,\n  })\n\n  return {\n    relayGasFeesUsd,\n    totalLpFeesUsd,\n    totalFeesUsd: relayGasFeesUsd + totalLpFeesUsd,\n    totalFeesFromAmount: totalLpFeesFromAmount,\n    totalFeesFromAmountBaseUnit: totalLpFeesFromAmountBaseUnit,\n  }\n}\n", "import { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport type { RelayTokenPriceInfo } from './types'\nimport {\n  convertFunToRelayChainId,\n  convertFunToRelayTokenAddress,\n  filterNullishHeaders,\n} from './utils'\n\ninterface GetRelayAssetPriceInfoParams {\n  chainId: string\n  address: string\n  apiKey?: string\n}\n\nexport async function getRelayAssetPriceInfo({\n  chainId,\n  address,\n  apiKey,\n}: GetRelayAssetPriceInfoParams): Promise<RelayTokenPriceInfo> {\n  const relayChainId = convertFunToRelayChainId(Number(chainId))\n  const relayTokenAddress = convertFunToRelayTokenAddress(\n    address as RelayAddress,\n    relayChainId,\n  )\n\n  const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${relayChainId}&address=${relayTokenAddress}`\n  const headers = filterNullishHeaders({ 'x-api-key': apiKey })\n  const response = await fetch(url, { headers })\n\n  if (!response.ok) {\n    throw Error(response.statusText)\n  }\n\n  const data = await response.json()\n  return data as RelayTokenPriceInfo\n}\n", "import {\n  FUNKIT_NATIVE_TOKEN,\n  FUN_HYPERCORE_CHAIN_ID_NUMBER,\n  FUN_SOLANA_CHAIN_ID_NUMBER,\n  RELAY_BITCOIN_CHAIN_ID_NUMBER,\n  RELAY_LIGHTER_CHAIN_ID_NUMBER,\n  RELAY_LIGHTER_FUN_ADDRESS_MAP,\n  RELAY_LIGHTER_USDC_PERPS,\n  RELAY_NATIVE_TOKEN,\n  RELAY_NATIVE_TOKEN_BITCOIN,\n  RELAY_NATIVE_TOKEN_HYPERCORE,\n  RELAY_NATIVE_TOKEN_SOLANA,\n  RELAY_SOLANA_CHAIN_ID_NUMBER,\n  RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n  CheckoutRefundState,\n  CheckoutState,\n  type RelayExecutionInfo,\n  RelayExecutionStatus,\n} from './types'\n\n/**\n * Converts a token address within Funkit to the corresponding Relay token address.\n * TODO: what is the chainId type here? fun chain id or relay chain id?\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n  address: RelayAddress<T>,\n  chainId: number,\n): RelayAddress<T> {\n  // convert Fun's NATIVE_TOKEN representation\n  if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n    switch (chainId) {\n      case FUN_HYPERCORE_CHAIN_ID_NUMBER:\n        return RELAY_NATIVE_TOKEN_HYPERCORE as RelayAddress<T>\n\n      case RELAY_BITCOIN_CHAIN_ID_NUMBER:\n        return RELAY_NATIVE_TOKEN_BITCOIN as RelayAddress<T>\n\n      // TODO: is it correct to assume chainId here is relay chain id?\n      case RELAY_SOLANA_CHAIN_ID_NUMBER:\n      case FUN_SOLANA_CHAIN_ID_NUMBER:\n        return RELAY_NATIVE_TOKEN_SOLANA as RelayAddress<T>\n\n      case RELAY_LIGHTER_CHAIN_ID_NUMBER:\n        // legacy address for Lighter USDC perps\n        return RELAY_LIGHTER_USDC_PERPS as RelayAddress<T>\n\n      default:\n        return RELAY_NATIVE_TOKEN as RelayAddress<T>\n    }\n  }\n\n  if (RELAY_LIGHTER_CHAIN_ID_NUMBER === chainId) {\n    const relayAddress =\n      RELAY_LIGHTER_FUN_ADDRESS_MAP[\n        address.toLowerCase() as keyof typeof RELAY_LIGHTER_FUN_ADDRESS_MAP\n      ]\n    if (relayAddress) {\n      return relayAddress as RelayAddress<T>\n    }\n  }\n\n  return address\n}\n\n/**\n * Converts a chainId within Funkit to the corresponding Relay chainId.\n */\nexport function convertFunToRelayChainId(chainId: number): number {\n  if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {\n    return RELAY_SOLANA_CHAIN_ID_NUMBER\n  }\n  return chainId\n}\n\nexport function getRelayExecutionRefundState(\n  info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n  switch (info.status) {\n    case RelayExecutionStatus.REFUND:\n      return CheckoutRefundState.REFUNDED\n    default:\n      return undefined\n  }\n}\n\nexport function getRelayExecutionState(\n  info: RelayExecutionInfo,\n): CheckoutState {\n  switch (info.status) {\n    case RelayExecutionStatus.SUCCESS:\n      return CheckoutState.COMPLETED\n    case RelayExecutionStatus.FAILURE:\n    case RelayExecutionStatus.REFUND:\n      return CheckoutState.CHECKOUT_ERROR\n    default:\n      return CheckoutState.PENDING_RECEIVAL\n  }\n}\n\n/**\n * Checks whether the Relay execution has reached a terminal status.\n */\nexport function isRelayExecutionTerminalStatus(\n  info: RelayExecutionInfo,\n): boolean {\n  return RELAY_TERMINAL_STATUSES.includes(info.status)\n}\n\nexport type Serializable =\n  | bigint\n  | boolean\n  | null\n  | number\n  | string\n  | Date\n  | object // Should be '{ [key: string]: Serializable }' but helper gets called with loosely-typed 'object' and interfaces\n  | Serializable[]\n\nexport function jsonStringifyWithBigIntSanitization(\n  serializable: Serializable,\n): string {\n  return JSON.stringify(\n    serializable,\n    (_, value) =>\n      typeof value === 'bigint' ? `0x${value.toString(16)}` : value, // return everything else unchanged\n  )\n}\n\nexport function indexBy<Item>(\n  items: Item[],\n  getKey: (item: Item) => string,\n): Record<string, Item> {\n  const indexedItems: Record<string, Item> = {}\n\n  for (const item of items) {\n    const key = getKey(item)\n\n    if (!key) {\n      continue\n    }\n\n    indexedItems[key] = item\n  }\n\n  return indexedItems\n}\n\nexport function filterNullishHeaders(\n  params: Record<string, string | undefined | null>,\n): Record<string, string> {\n  const result: Record<string, string> = {}\n  for (const [key, value] of Object.entries(params)) {\n    if (value != null) {\n      result[key] = value\n    }\n  }\n  return result\n}\n", "import { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport {\n  convertFunToRelayChainId,\n  convertFunToRelayTokenAddress,\n  filterNullishHeaders,\n} from './utils'\n\nexport interface RelayTokenInfo {\n  chainId: number\n  address: string\n  symbol: string\n  name: string\n  decimals: number\n  vmType: string\n  metadata: {\n    logoURI: string\n    verified: boolean\n    isNative: boolean\n  }\n}\n\ninterface GetRelayAssetInfoParams {\n  chainId: string\n  address: string\n  useExternalSearch?: boolean\n  apiKey?: string\n}\n\nexport async function getRelayAssetInfo({\n  chainId,\n  address,\n  // https://fun-xyz.slack.com/archives/C08MQ85QB2N/p1770674350731879?thread_ts=1770670744.270889&cid=C08MQ85QB2N\n  useExternalSearch = true,\n  apiKey,\n}: GetRelayAssetInfoParams): Promise<RelayTokenInfo> {\n  const relayChainId = convertFunToRelayChainId(Number(chainId))\n  const relayTokenAddress = convertFunToRelayTokenAddress(\n    address as RelayAddress,\n    relayChainId,\n  )\n  const url = `${MAINNET_RELAY_API}/currencies/v2`\n  const headers = filterNullishHeaders({\n    'Content-Type': 'application/json',\n    'x-api-key': apiKey,\n  })\n  const body = {\n    chainIds: [relayChainId],\n    address: relayTokenAddress,\n    useExternalSearch,\n  }\n  const response = await fetch(url, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify(body),\n  })\n  if (!response.ok) {\n    throw Error(response.statusText)\n  }\n\n  const data = await response.json()\n  return data?.[0] as RelayTokenInfo\n}\n", "import {\n  type APIError,\n  type Execute,\n  type GetQuoteParameters,\n  isAPIError,\n} from '@relayprotocol/relay-sdk'\nimport { type Address, encodeFunctionData } from 'viem'\nimport { getRelayClient } from './client'\nimport {\n  FUN_RELAY_REFERRER,\n  FUN_RELAY_REVENUE_WALLET,\n  RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n} from './constants'\nimport { getRelayAssetInfo } from './currency'\nimport type {\n  RelayAddress,\n  RelayChainId,\n  RelayVmType,\n  RelayWallet,\n} from './execution'\nimport { type FunRelayFeeItem, getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type { SolanaAddress } from './solana'\nimport type {\n  ApiFunkitCheckoutActionParams,\n  CheckoutQuoteResponse,\n  Logger,\n} from './types'\nimport {\n  convertFunToRelayChainId,\n  convertFunToRelayTokenAddress,\n} from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {\n  // TODO: Relay does not yet explicitly handle this field in their SDK, nor is it in their typings - but it gets forwarded to API\n  depositFeePayer?: SolanaAddress\n}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = {\n  details?: {\n    currencyIn?: NonNullable<Execute['details']>['currencyIn']\n    currencyOut?: NonNullable<Execute['details']>['currencyOut']\n  }\n  steps: Execute['steps']\n  vmType: VmType\n}\n\nexport type RelayExecute = Execute\n\nexport type GetRelayQuoteParams<\n  SourceVmType extends RelayVmType = RelayVmType,\n  TargetVmType extends RelayVmType = RelayVmType,\n> = {\n  actionParams?: ApiFunkitCheckoutActionParams[]\n  clientId: string\n  fromChainId: RelayChainId<SourceVmType>\n  fromTokenAddress: RelayAddress<SourceVmType>\n  logger: Logger\n  /**\n   * {@link getRelayQuote} already sets {@link RelayQuoteOptions.appFees|appFees} and {@link RelayQuoteOptions.referrer|referrer}.\n   * Only include them if you wish to override.\n   */\n  options?: RelayQuoteOptions\n  recipientAddress: RelayAddress<TargetVmType> | undefined\n  toChainId: RelayChainId<TargetVmType>\n  toTokenAddress: RelayAddress<TargetVmType>\n  tradeType: 'EXACT_INPUT' | 'EXACT_OUTPUT' | 'EXPECTED_OUTPUT'\n  userAddress: RelayAddress<SourceVmType> | undefined\n  walletClient?: RelayWallet<SourceVmType>\n  apiKey: string\n  /**\n   * Optional explicit user preference for the source-side authorization\n   * step (\"Sign message\" vs \"Approve transaction\"). Forwarded to frog's\n   * `/api/fee` so frog's `getUsePermit` can honor the FE toggle's choice.\n   * Only meaningful for FE-driven flows (Wallet checkout); server-driven\n   * flows (UDA, etc.) should omit this and let frog's auto-gasless\n   * fallback decide.\n   */\n  usePermit?: boolean\n} & (\n  | {\n      fromTokenAmountBaseUnit: bigint | string\n      tradeType: 'EXACT_INPUT'\n    }\n  | {\n      toTokenAmountBaseUnit: bigint | string\n      tradeType: 'EXACT_OUTPUT' | 'EXPECTED_OUTPUT'\n    }\n)\n\nexport type RelayQuote<VmType extends RelayVmType = RelayVmType> =\n  CheckoutQuoteResponse & {\n    /** Required for EXACT_INPUT checkouts */\n    finalToAmountBaseUnit: string\n    metadata: {\n      fromAmountBaseUnit: string\n      relayQuote: RelayQuoteResult<VmType>\n      toAmountBaseUnit: string\n    }\n  }\n\n// this quote type is only used by backend, not exposed to FE\n// and can contain additional fields that are not in the FE-facing quote type.\nexport type RelayBackendQuote<VmType extends RelayVmType = RelayVmType> =\n  CheckoutQuoteResponse & {\n    /** Required for EXACT_INPUT checkouts */\n    finalToAmountBaseUnit: string\n    metadata: {\n      fromAmountBaseUnit: string\n      relayQuote: Execute & { vmType: VmType }\n      toAmountBaseUnit: string\n    }\n  }\n\nasync function getQuoteEstUsdValue({\n  tokenChainId,\n  tokenAddress,\n  tokenAmountBaseUnit,\n  logger,\n  apiKey,\n}: {\n  tokenChainId: string\n  tokenAddress: string\n  tokenAmountBaseUnit: string\n  logger: Logger\n  apiKey: string\n}) {\n  try {\n    const normalizedChainId = convertFunToRelayChainId(\n      Number(tokenChainId),\n    ).toString()\n    const normalizedTokenAddress = convertFunToRelayTokenAddress(\n      tokenAddress as Address,\n      Number(tokenChainId),\n    )\n\n    const [tokenPriceRes, tokenInfoRes] = await Promise.all([\n      getRelayAssetPriceInfo({\n        chainId: normalizedChainId,\n        address: normalizedTokenAddress,\n        apiKey,\n      }),\n      getRelayAssetInfo({\n        chainId: normalizedChainId,\n        address: normalizedTokenAddress,\n        apiKey,\n      }),\n    ])\n\n    // FIXME: Temp hardcode until relay supports WUSDE on Ethereal\n    const isWUsdeEthereal =\n      normalizedChainId === '5064014' &&\n      normalizedTokenAddress.toLowerCase() ===\n        '0xB6fC4B1BFF391e5F6b4a3D2C7Bda1FeE3524692D'.toLowerCase()\n\n    const price = tokenPriceRes.price\n    const decimals = isWUsdeEthereal ? 18 : tokenInfoRes.decimals\n\n    const absoluteAmount = BigInt(tokenAmountBaseUnit) / BigInt(10 ** decimals)\n    return Number(price) * Number(absoluteAmount)\n  } catch (err) {\n    logger.error('getQuoteEstUsdValueError', {\n      message: `Failed to get USD value for token ${tokenAddress} on chain ${tokenChainId}: ${getErrorMessage(\n        err,\n      )}. Falling back to 0 USD.`,\n    })\n    // If any part fails, just fallback to 0 USD so that we do not block quote\n    return 0\n  }\n}\n\nexport function getReferrer(clientId: string) {\n  return clientId ? `${FUN_RELAY_REFERRER}|${clientId}` : FUN_RELAY_REFERRER\n}\n\nexport class RelayQuoteClientError extends Error {\n  public constructor(\n    public readonly statusCode: number,\n    public readonly relayErrorCode: string,\n    message: string,\n    requestId: string | undefined = '',\n  ) {\n    super(\n      `An error occurred trying to generate a relay quote: ${relayErrorCode} - ReqId ${requestId || 'NO_REQ_ID'} - ${message}`,\n    )\n\n    this.name = new.target.name\n    Object.setPrototypeOf(this, new.target.prototype)\n  }\n}\n\n/**\n * Get the headers for the quote request by the following logic:\n * - If subsidizeFeesSecretKey is provided, and subsidizeFees is true, set it to \"x-api-key\" header\n * - Apply funRelayConfig.headers as overrides if provided\n */\nexport const getHeaders = (funRelayConfig: FunRelayFeeItem, apiKey: string) => {\n  const headers = {\n    'x-api-key': apiKey,\n    // Remote headers will override passed in headers\n    ...(funRelayConfig.headers ? { ...funRelayConfig.headers } : {}),\n  }\n  return headers\n}\n\nexport async function getRelayQuote<\n  SourceVmType extends RelayVmType,\n  TargetVmType extends RelayVmType = RelayVmType,\n>({\n  logger,\n  walletClient,\n  ...params\n}: GetRelayQuoteParams<SourceVmType, TargetVmType>): Promise<\n  RelayBackendQuote<SourceVmType>\n> {\n  const {\n    actionParams,\n    clientId,\n    fromChainId,\n    fromTokenAddress,\n    options,\n    recipientAddress,\n    toChainId,\n    toTokenAddress,\n    tradeType,\n    userAddress,\n    apiKey,\n    usePermit,\n  } = params\n\n  const vmType = (\n    walletClient && 'vmType' in walletClient ? walletClient.vmType : 'evm'\n  ) as SourceVmType\n\n  try {\n    const relayClient = getRelayClient()\n\n    // Same chain\n    const isSameChainFlow = String(fromChainId) === String(toChainId)\n\n    const txs = actionParams?.map((action) => {\n      const data =\n        action.rawCalldata ??\n        encodeFunctionData({\n          abi: action.contractAbi,\n          args: action.functionArgs,\n          functionName: action.functionName,\n        })\n\n      return {\n        data,\n        to: action.contractAddress,\n        // Relay supports msg.value via 2 fields: `value` and `originalTxValue`\n        // Both `value` and `originalTxValue` are required to be set for `erc20` + gas transfers\n        // Only `value` is required for native token transfers. // TODO: This flow needs verification.\n        // Internally for Relay,\n        // - `originalTxValue` is designed to \"bubble up\" the value to the original tx. This only works for user-executed same-chain operations with calls. This does not work / apply to cross chain operations\n        // - `value` is the internal multicall value\n        ...(isSameChainFlow\n          ? { originalTxValue: String(action.value ?? 0n) }\n          : {}),\n        value: String(action.value ?? 0n),\n      }\n    })\n\n    const isExactIn = params.tradeType === 'EXACT_INPUT'\n    const queryTokenAmountBaseUnit = isExactIn\n      ? params.fromTokenAmountBaseUnit\n      : params.toTokenAmountBaseUnit\n    const queryTokenAddress = isExactIn ? fromTokenAddress : toTokenAddress\n    const queryTokenChainId = isExactIn ? fromChainId : toChainId\n\n    const estUsdValue = await getQuoteEstUsdValue({\n      tokenChainId: queryTokenChainId,\n      tokenAddress: queryTokenAddress,\n      tokenAmountBaseUnit: queryTokenAmountBaseUnit.toString(),\n      logger,\n      apiKey,\n    })\n\n    const funRelayConfig = await getFunRelayFees({\n      clientId,\n      estUsdValue: Number(estUsdValue) || 0,\n      fromTokenAddress,\n      fromChainId,\n      recipientAddress,\n      senderAddress: userAddress,\n      toTokenAddress,\n      toChainId,\n      usePermit,\n    })\n\n    const headers = getHeaders(funRelayConfig, apiKey)\n\n    const appFeeBp = funRelayConfig.b + funRelayConfig.v\n\n    logger.info('getRelayQuoteParams', {\n      ...params,\n      appFeeBp,\n      estUsdValue,\n      funRelayConfig,\n      queryTokenAmountBaseUnit,\n      txs,\n    })\n\n    // Get the full quote with fees\n    const relayQuote = await relayClient.actions.getQuote(\n      {\n        amount: queryTokenAmountBaseUnit.toString(),\n        chainId: convertFunToRelayChainId(Number(fromChainId)),\n        currency: convertFunToRelayTokenAddress(\n          fromTokenAddress,\n          Number(fromChainId),\n        ),\n        recipient: recipientAddress,\n        toChainId: convertFunToRelayChainId(Number(toChainId)),\n        toCurrency: convertFunToRelayTokenAddress(\n          toTokenAddress,\n          Number(toChainId),\n        ),\n        tradeType,\n        txs,\n        user: userAddress,\n        wallet: walletClient,\n        options: {\n          referrer: getReferrer(clientId),\n          appFees: [\n            {\n              fee: appFeeBp.toString(),\n              recipient: FUN_RELAY_REVENUE_WALLET,\n            },\n          ],\n          // Passed in options\n          ...options,\n          // Remote options will always override passed in options\n          ...funRelayConfig.config.options,\n        },\n      },\n      undefined,\n      headers,\n    )\n\n    logger.info('relayQuote', relayQuote)\n\n    const toAmountUsd = Number(relayQuote.details?.currencyOut?.amountUsd || 0)\n    const fromAmountUsd = Number(relayQuote.details?.currencyIn?.amountUsd || 0)\n    // Get how much fromAmount is needed for the quote\n    const fromAmountString =\n      relayQuote.details?.currencyIn?.amountFormatted || '0'\n    const fromAmountBaseUnitString =\n      relayQuote.details?.currencyIn?.amount || '0'\n    const fromAssetAmount = Number(fromAmountString || 0)\n\n    // RequestID will be consistent across steps in the quote\n    // https://fun-xyz.slack.com/archives/C08MQ85QB2N/p1747774944603209\n    const relayRequestId = relayQuote.steps[0]?.requestId\n\n    // TODO: Verify with relay team if this is possible?\n    if (!relayRequestId) {\n      throw new Error('Relay quote does not contain a requestId')\n    }\n\n    // TODO: Verify with relay team if this is possible?\n    if (!relayQuote.details?.currencyIn || !relayQuote.details?.currencyOut) {\n      throw new Error('Relay quote does not contain trade details')\n    }\n\n    const {\n      relayGasFeesUsd,\n      totalLpFeesUsd,\n      totalFeesUsd,\n      totalFeesFromAmount,\n      totalFeesFromAmountBaseUnit,\n    } = parseRelayFees({\n      fees: relayQuote.fees,\n      fromChainIdRelay: convertFunToRelayChainId(Number(fromChainId)),\n      fromTokenAddressRelay: convertFunToRelayTokenAddress(\n        fromTokenAddress,\n        Number(fromChainId),\n      ),\n      logger,\n      sourceAssetDecimals:\n        relayQuote.details.currencyIn.currency?.decimals ?? 18,\n      sourceUnitPrice: fromAmountUsd / fromAssetAmount || 1,\n    })\n\n    const estSubtotalFromAmount = (\n      fromAssetAmount - totalFeesFromAmount\n    ).toString()\n\n    const estSubtotalFromAmountBaseUnit = (\n      BigInt(fromAmountBaseUnitString) - totalFeesFromAmountBaseUnit\n    ).toString()\n\n    return {\n      quoteId: relayRequestId,\n      estCheckoutTimeMs:\n        (relayQuote.details.timeEstimate || 0) * 1000 +\n        RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n      estFeesFromAmount: totalFeesFromAmount.toString(),\n      estFeesFromAmountBaseUnit: totalFeesFromAmountBaseUnit.toString(),\n      estFeesUsd: totalFeesUsd,\n      estMarketMakerGasUsd: relayGasFeesUsd,\n      estSubtotalFromAmount,\n      estSubtotalFromAmountBaseUnit,\n      estSubtotalUsd: toAmountUsd,\n      estTotalFromAmount: fromAmountString,\n      estTotalFromAmountBaseUnit: fromAmountBaseUnitString,\n      estTotalUsd: fromAmountUsd,\n      finalToAmountBaseUnit: relayQuote.details.currencyOut.amount ?? '0', // TODO: Or do we want 'minimumAmount'?\n      fromTokenAddress: fromTokenAddress as Address, // TODO: fromTokenAddress is typed as `0x${string}` why does not accept SolanaAddress\n      lpFeePercentage: 0, // TODO: ?\n      lpFeeUsd: totalLpFeesUsd,\n      metadata: {\n        fromAmountBaseUnit: isExactIn\n          ? queryTokenAmountBaseUnit.toString()\n          : (relayQuote.details.currencyIn.amount ?? '0'),\n        relayQuote: {\n          ...relayQuote,\n          vmType,\n        },\n        toAmountBaseUnit: isExactIn\n          ? (relayQuote.details.currencyOut.amount ?? '0')\n          : queryTokenAmountBaseUnit.toString(),\n      },\n    }\n  } catch (err) {\n    if (err instanceof Error && isAPIError(err)) {\n      const apiError = err as APIError\n      // see the Error section in https://docs.relay.link/references/api/get-quote-v2\n      const rawError = apiError.rawError as {\n        errorCode?: string\n        message?: string\n        requestId?: string\n      }\n\n      if (rawError?.errorCode) {\n        throw new RelayQuoteClientError(\n          apiError.statusCode,\n          rawError.errorCode,\n          rawError.message ?? apiError.message,\n          rawError.requestId,\n        )\n      }\n    }\n\n    const message = getErrorMessage(err)\n    throw new Error(\n      `An error occurred trying to generate a relay quote: ${message}`,\n    )\n  }\n}\n\nfunction getErrorMessage(err: unknown): string {\n  return err instanceof Error\n    ? err.message\n    : typeof err === 'string'\n      ? err\n      : JSON.stringify(err)\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptSolanaWallet } from '@relayprotocol/relay-svm-wallet-adapter'\nimport {\n  type Connection,\n  SendTransactionError,\n  type VersionedTransaction,\n} from '@solana/web3.js'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\n\ntype Base58 =\n  | '1'\n  | '2'\n  | '3'\n  | '4'\n  | '5'\n  | '6'\n  | '7'\n  | '8'\n  | '9'\n  | 'A'\n  | 'B'\n  | 'C'\n  | 'D'\n  | 'E'\n  | 'F'\n  | 'G'\n  | 'H'\n  | 'J'\n  | 'K'\n  | 'L'\n  | 'M'\n  | 'N'\n  | 'P'\n  | 'Q'\n  | 'R'\n  | 'S'\n  | 'T'\n  | 'U'\n  | 'V'\n  | 'W'\n  | 'X'\n  | 'Y'\n  | 'Z'\n  | 'a'\n  | 'b'\n  | 'c'\n  | 'd'\n  | 'e'\n  | 'f'\n  | 'g'\n  | 'h'\n  | 'i'\n  | 'j'\n  | 'k'\n  | 'm'\n  | 'n'\n  | 'o'\n  | 'p'\n  | 'q'\n  | 'r'\n  | 's'\n  | 't'\n  | 'u'\n  | 'v'\n  | 'w'\n  | 'x'\n  | 'y'\n  | 'z'\n\nexport type SolanaAddress = `${Base58}${string}`\n\nexport type SolanaTxHash = `${Base58}${string}`\n\nexport type SolanaWallet = {\n  address(): Promise<SolanaAddress>\n  vmType: 'svm'\n} & AdaptedWallet\n\nexport function getSolanaWallet(\n  walletAddress: SolanaAddress,\n  connection: Connection,\n  signTransaction: (\n    transaction: VersionedTransaction,\n  ) => Promise<VersionedTransaction>,\n  payerKey?: SolanaAddress,\n): SolanaWallet {\n  return adaptSolanaWallet(\n    walletAddress,\n    RELAY_SOLANA_CHAIN_ID_NUMBER,\n    connection,\n    async (transaction, options) => {\n      const signed = await signTransaction(transaction)\n      try {\n        const signature = await connection.sendTransaction(signed, {\n          ...options,\n          maxRetries: 5,\n        })\n\n        return { signature }\n      } catch (error) {\n        if (error instanceof SendTransactionError) {\n          console.error(\n            'Failed transaction logs:',\n            error,\n            await error.getLogs(connection),\n          )\n        }\n\n        throw error\n      }\n    },\n    payerKey,\n  ) as SolanaWallet\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptTronWallet } from '@relayprotocol/relay-tron-wallet-adapter'\nimport type { TronWeb } from 'tronweb'\n\nexport type TronAddress = `T${string}`\n\nexport type TronTxHash = string\n\nexport type TronWallet = {\n  address(): Promise<TronAddress>\n  vmType: 'tvm'\n} & AdaptedWallet\n\nexport function getTronWallet(\n  walletAddress: TronAddress,\n  tronWeb: TronWeb,\n): TronWallet {\n  return adaptTronWallet(walletAddress, tronWeb) as TronWallet\n}\n", "export const ASSET_LOGO_SRCS: Record<string, string> = {\n  $MFER: 'https://sdk-cdn.fun.xyz/images/mfer.png',\n  AARBUSDCN: 'https://sdk-cdn.fun.xyz/images/aarbusdcn.png',\n  AAVE: 'https://sdk-cdn.fun.xyz/images/aave.svg',\n  AERO: 'https://sdk-cdn.fun.xyz/images/aero.svg',\n  APE: 'https://sdk-cdn.fun.xyz/images/ape.svg',\n  APOLWMATIC: 'https://sdk-cdn.fun.xyz/images/apolwmatic.png',\n  ARB: 'https://sdk-cdn.fun.xyz/images/arb.svg',\n  BEHYPE: 'https://sdk-cdn.fun.xyz/images/behype.svg',\n  BENTO: 'https://sdk-cdn.fun.xyz/images/bento.png',\n  BLERF: 'https://sdk-cdn.fun.xyz/images/blerf.png',\n  BRETT: 'https://sdk-cdn.fun.xyz/images/brett.svg',\n  BSHIB: 'https://sdk-cdn.fun.xyz/images/bshib.png',\n  BTC: 'https://sdk-cdn.fun.xyz/images/btc.svg',\n  CASH: 'https://sdk-cdn.fun.xyz/images/cash.svg',\n  CBBTC: 'https://sdk-cdn.fun.xyz/images/cbbtc.svg',\n  CBETH: 'https://sdk-cdn.fun.xyz/images/cbeth.png',\n  CRO: 'https://sdk-cdn.fun.xyz/images/cro.svg',\n  CRV: 'https://sdk-cdn.fun.xyz/images/crv.svg',\n  DAI: 'https://sdk-cdn.fun.xyz/images/dai.svg',\n  DEGEN: 'https://sdk-cdn.fun.xyz/images/degen.svg',\n  ETH: 'https://sdk-cdn.fun.xyz/images/eth.svg',\n  GMX: 'https://sdk-cdn.fun.xyz/images/gmx.svg',\n  GRT: 'https://sdk-cdn.fun.xyz/images/grt.svg',\n  HYPE: 'https://sdk-cdn.fun.xyz/images/hype.svg',\n  IMX: 'https://sdk-cdn.fun.xyz/images/imx.svg',\n  INJ: 'https://sdk-cdn.fun.xyz/images/inj.svg',\n  LDO: 'https://sdk-cdn.fun.xyz/images/ldo.svg',\n  LINK: 'https://sdk-cdn.fun.xyz/images/link.png',\n  LUCK: 'https://sdk-cdn.fun.xyz/images/luck.png',\n  MATIC: 'https://sdk-cdn.fun.xyz/images/matic.svg',\n  MFER: 'https://sdk-cdn.fun.xyz/images/mfer.png',\n  MKR: 'https://sdk-cdn.fun.xyz/images/mkr.svg',\n  MNT: 'https://sdk-cdn.fun.xyz/images/mnt.svg',\n  OP: 'https://sdk-cdn.fun.xyz/images/optimism.svg',\n  PENDLE: 'https://sdk-cdn.fun.xyz/images/pendle.svg',\n  POL: 'https://sdk-cdn.fun.xyz/images/matic.svg',\n  PYUSD: 'https://sdk-cdn.fun.xyz/images/pyusd.svg',\n  QNT: 'https://sdk-cdn.fun.xyz/images/qnt.svg',\n  RNDR: 'https://sdk-cdn.fun.xyz/images/rndr.svg',\n  ROOST: 'https://sdk-cdn.fun.xyz/images/roost.png',\n  SAND: 'https://sdk-cdn.fun.xyz/images/sand.svg',\n  SHIB: 'https://sdk-cdn.fun.xyz/images/shib.svg',\n  SNX: 'https://sdk-cdn.fun.xyz/images/snx.svg',\n  SOL: 'https://sdk-cdn.fun.xyz/images/sol.svg',\n  SUSDS: 'https://sdk-cdn.fun.xyz/images/susds.svg',\n  TYBG: 'https://sdk-cdn.fun.xyz/images/tybg.png',\n  UNI: 'https://sdk-cdn.fun.xyz/images/uni.png',\n  USDC: 'https://sdk-cdn.fun.xyz/images/usdc.svg',\n  'USDC.E': 'https://sdk-cdn.fun.xyz/images/usdc.svg',\n  USDBC: 'https://sdk-cdn.fun.xyz/images/usdc.svg',\n  USDE: 'https://sdk-cdn.fun.xyz/images/usde.svg',\n  WUSDE: 'https://sdk-cdn.fun.xyz/images/usde.svg',\n  EUSDE: 'https://sdk-cdn.fun.xyz/images/eusde.svg',\n  USDT: 'https://sdk-cdn.fun.xyz/images/usdt.svg',\n  'USD\u20AE0': 'https://sdk-cdn.fun.xyz/images/usdt0.svg',\n  USDT0: 'https://sdk-cdn.fun.xyz/images/usdt0.svg',\n  USDS: 'https://sdk-cdn.fun.xyz/images/usds.svg',\n  USDH: 'https://sdk-cdn.fun.xyz/images/usdh.svg',\n  USDG: 'https://sdk-cdn.fun.xyz/images/usdg.svg',\n  VRTX: 'https://sdk-cdn.fun.xyz/images/vrtx.svg',\n  WBTC: 'https://sdk-cdn.fun.xyz/images/wbtc.svg',\n  WEETH: 'https://sdk-cdn.fun.xyz/images/weeth.png',\n  WETH: 'https://sdk-cdn.fun.xyz/images/weth.svg',\n  WHYPE: 'https://sdk-cdn.fun.xyz/images/whype.png',\n  WSTETH: 'https://sdk-cdn.fun.xyz/images/wsteth.png',\n  TRUMP: 'https://sdk-cdn.fun.xyz/images/trump.png',\n  BNB: 'https://sdk-cdn.fun.xyz/images/bsc.svg',\n  WBNB: 'https://sdk-cdn.fun.xyz/images/bsc.svg',\n  BTCB: 'https://sdk-cdn.fun.xyz/images/btc.svg',\n  UBTC: 'https://sdk-cdn.fun.xyz/images/btc.svg',\n  BUSD: 'https://sdk-cdn.fun.xyz/images/busd.svg',\n  XAUT: 'https://sdk-cdn.fun.xyz/images/xaut.png',\n  ADA: 'https://sdk-cdn.fun.xyz/images/ada.svg',\n  XRP: 'https://sdk-cdn.fun.xyz/images/xrp.svg',\n  UDOGE: 'https://sdk-cdn.fun.xyz/images/doge.svg',\n  DOGE: 'https://sdk-cdn.fun.xyz/images/doge.svg',\n  LTC: 'https://sdk-cdn.fun.xyz/images/ltc.svg',\n  HNT: 'https://sdk-cdn.fun.xyz/images/hnt.svg',\n  COMP: 'https://sdk-cdn.fun.xyz/images/comp.svg',\n  PEPE: 'https://sdk-cdn.fun.xyz/images/pepe.svg',\n  LSTHYPE: 'https://sdk-cdn.fun.xyz/images/lsthype.svg',\n  HBUSDT: 'https://sdk-cdn.fun.xyz/images/hbusdt.svg',\n  WVLP: 'https://sdk-cdn.fun.xyz/images/wvlp.svg',\n  LIQUIDHYPE: 'https://sdk-cdn.fun.xyz/images/liquidhype.svg',\n  VHYPE: 'https://sdk-cdn.fun.xyz/images/vhype.png',\n  HBHYPE: 'https://sdk-cdn.fun.xyz/images/hbhype.svg',\n  MON: 'https://sdk-cdn.fun.xyz/images/monad.svg',\n  WMON: 'https://sdk-cdn.fun.xyz/images/wmon.svg',\n  AUSD: 'https://sdk-cdn.fun.xyz/images/ausd.svg',\n  SUSHI: 'https://sdk-cdn.fun.xyz/images/sushi.svg',\n  SKY: 'https://sdk-cdn.fun.xyz/images/sky.svg',\n  LIT: 'https://sdk-cdn.fun.xyz/images/lit.svg',\n  AZTEC: 'https://sdk-cdn.fun.xyz/images/aztec.svg',\n  U: 'https://sdk-cdn.fun.xyz/images/u.png',\n  PUSD: 'https://sdk-cdn.fun.xyz/images/pusd.svg',\n  KBTC: 'https://sdk-cdn.fun.xyz/images/kbtc.svg',\n  QQQX: 'https://sdk-cdn.fun.xyz/images/qqqx.svg',\n  SPYX: 'https://sdk-cdn.fun.xyz/images/spyx.svg',\n  WSPYX: 'https://sdk-cdn.fun.xyz/images/spyx.svg',\n  WQQQX: 'https://sdk-cdn.fun.xyz/images/qqqx.svg',\n  AAPLX: 'https://sdk-cdn.fun.xyz/images/applx.svg',\n  WAAPLX: 'https://sdk-cdn.fun.xyz/images/applx.svg',\n  GOOGLX: 'https://sdk-cdn.fun.xyz/images/googlx.svg',\n  WGOOGLX: 'https://sdk-cdn.fun.xyz/images/googlx.svg',\n  METAX: 'https://sdk-cdn.fun.xyz/images/metax.svg',\n  WMETAX: 'https://sdk-cdn.fun.xyz/images/metax.svg',\n  NVDAX: 'https://sdk-cdn.fun.xyz/images/nvdax.svg',\n  WNVDAX: 'https://sdk-cdn.fun.xyz/images/nvdax.svg',\n  TSLAX: 'https://sdk-cdn.fun.xyz/images/tslax.svg',\n  WTSLAX: 'https://sdk-cdn.fun.xyz/images/tslax.svg',\n  MSFTX: 'https://sdk-cdn.fun.xyz/images/msftx.svg',\n  WMSFTX: 'https://sdk-cdn.fun.xyz/images/msftx.svg',\n  AMZNX: 'https://sdk-cdn.fun.xyz/images/amznx.svg',\n  WAMZNX: 'https://sdk-cdn.fun.xyz/images/amznx.svg',\n}\n\nexport const FALLBACK_ASSET = 'https://sdk-cdn.fun.xyz/images/dollar_circle.png'\n\nexport function getAssetLogoSrc(symbol: string) {\n  return ASSET_LOGO_SRCS[symbol.toUpperCase()] || FALLBACK_ASSET\n}\n", "import {\n  type Address,\n  type Hex,\n  concat,\n  encodeAbiParameters,\n  encodeFunctionData,\n  toFunctionSelector,\n} from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { ASSET_LOGO_SRCS } from '../assets'\nimport { FUNKIT_NATIVE_TOKEN } from '../constants'\nimport type { ApiFunkitCheckoutActionParams } from '../types'\nimport { UNWRAP_AND_CALL_ABI, VAULT_DEPOSITOR_ABI } from './abi'\nimport { LIGHTER_DEPOSIT_ADDRESS } from './consts'\nimport {\n  AMOUNT_PLACEHOLDER,\n  UNWRAP_AND_CALL_ADDRESS,\n  VAULT_DEPOSITOR_ADDRESS,\n  tokenAddresses,\n} from './consts'\nimport type { DynamicRoute, FunAddress } from './types'\nimport {\n  MAX_APPROVAL,\n  createPath,\n  createRoute,\n  getApprovalCalldata,\n  getResetApprovalCalldata,\n  shouldResetApproval,\n} from './utils'\n\ntype FunkitCheckoutActionParams = ApiFunkitCheckoutActionParams\nconst NATIVE_TOKEN = FUNKIT_NATIVE_TOKEN\n\nconst RELAY_LIGHTER_CHAIN_ID = 3586256\nconst RELAY_LIGHTER_ETH_SPOT_ADDRESS =\n  '0x0000000000000000000000000000000000000001' satisfies Address\nconst RELAY_LIGHTER_USDC_PERPS_ADDRESS =\n  '0x0000000000000000000000000000000000000000' satisfies Address\nconst RELAY_LIGHTER_USDC_SPOT_ADDRESS =\n  '0x0000000000000000000000000000000000000003' satisfies Address\nenum RouteType {\n  Perps = 0,\n  Spot = 1,\n}\n\nenum AssetIndex {\n  USDC = 3,\n  ETH = 1,\n  LIT = 2,\n  LINK = 5,\n  UNI = 6,\n  AAVE = 7,\n  SKY = 8,\n  LDO = 9,\n  AZTEC = 10,\n}\n// get from https://etherscan.io/address/0x3b4d794a66304f130a4db8f2551b0070dfcf5ca7#readProxyContract#F26\nconst TICK_SIZE_FOR_ASSET_INDEX = {\n  [AssetIndex.USDC]: BigInt(1),\n  [AssetIndex.ETH]: BigInt(10 ** 10),\n  [AssetIndex.LIT]: BigInt(10 ** 10),\n  [AssetIndex.LINK]: BigInt(10 ** 10),\n  [AssetIndex.UNI]: BigInt(10 ** 10),\n  [AssetIndex.AAVE]: BigInt(10 ** 10),\n  [AssetIndex.SKY]: BigInt(10 ** 10),\n  [AssetIndex.LDO]: BigInt(10 ** 10),\n  [AssetIndex.AZTEC]: BigInt(10 ** 10),\n}\n// get from https://etherscan.io/address/0x3b4d794a66304f130a4db8f2551b0070dfcf5ca7#readProxyContract#F26\nconst DEPOSIT_TOKEN_FOR_ASSET_INDEX = {\n  [AssetIndex.USDC]: tokenAddresses.USDC[mainnet.id],\n  [AssetIndex.ETH]: NATIVE_TOKEN as Address,\n  [AssetIndex.LIT]: tokenAddresses.LIT[mainnet.id],\n  [AssetIndex.LINK]: tokenAddresses.LINK[mainnet.id],\n  [AssetIndex.UNI]: tokenAddresses.UNI[mainnet.id],\n  [AssetIndex.AAVE]: tokenAddresses.AAVE[mainnet.id],\n  [AssetIndex.SKY]: tokenAddresses.SKY[mainnet.id],\n  [AssetIndex.LDO]: tokenAddresses.LDO[mainnet.id],\n  [AssetIndex.AZTEC]: tokenAddresses.AZTEC[mainnet.id],\n}\n\nconst USDC_PERPS_SYMBOL = 'USDC (Perps)'\nconst USDC_SPOT_SYMBOL = 'USDC (Spot)'\nconst ETH_SPOT_SYMBOL = 'ETH (Spot)'\nconst LINK_SPOT_SYMBOL = 'LINK (Spot)'\nconst UNI_SPOT_SYMBOL = 'UNI (Spot)'\nconst AAVE_SPOT_SYMBOL = 'AAVE (Spot)'\nconst SKY_SPOT_SYMBOL = 'SKY (Spot)'\nconst LDO_SPOT_SYMBOL = 'LDO (Spot)'\nconst LIT_SPOT_SYMBOL = 'LIT (Spot)'\nconst AZTEC_SPOT_SYMBOL = 'AZTEC (Spot)'\n\nconst generateLighterMainnetDepositActions = ({\n  address,\n  assetIndex,\n  routeType,\n}: {\n  address: Address\n  assetIndex: AssetIndex\n  routeType: RouteType\n}) => {\n  // Create Lighter deposit calldata\n  // deposit(address _to, uint16 _assetIndex, TxTypes.RouteType _routeType, uint256 _amount)\n  const depositSelector = toFunctionSelector(\n    'deposit(address,uint16,uint8,uint256)',\n  ) as Hex\n\n  const encodedLighterParams = encodeAbiParameters(\n    [\n      { type: 'address' },\n      { type: 'uint16' },\n      { type: 'uint8' },\n      { type: 'uint256' },\n    ],\n    [address, assetIndex, routeType, AMOUNT_PLACEHOLDER],\n  )\n\n  // Lighter deposit calldata\n  const lighterDepositCalldata = concat([depositSelector, encodedLighterParams])\n\n  const depositToken = DEPOSIT_TOKEN_FOR_ASSET_INDEX[assetIndex]\n  const tickSize = TICK_SIZE_FOR_ASSET_INDEX[assetIndex]\n  const dustRecipient = address\n\n  // Special handling of ETH Spot deposit flow as we need to unwrap WETH to ETH\n  if (depositToken === NATIVE_TOKEN) {\n    // VaultWrapper.deposit calldata for native ETH\n    const vaultWrapperCalldata = encodeFunctionData({\n      abi: VAULT_DEPOSITOR_ABI,\n      functionName: 'depositWithTick',\n      args: [\n        depositToken, // token (native ETH)\n        LIGHTER_DEPOSIT_ADDRESS, // vault (Lighter deposit contract)\n        lighterDepositCalldata, // callData\n        0n, // minAmountOut\n        tickSize, // tickSize\n        dustRecipient, // dustRecipient\n      ],\n    })\n    // Flow: UnwrapWETHAndCall \u2192 VaultWrapper \u2192 Lighter deposit\n    return [\n      // Step 1: Approve WETH to UnwrapWETHAndCall\n      getApprovalCalldata({\n        tokenAddress: tokenAddresses.WETH[mainnet.id],\n        spenderAddress: UNWRAP_AND_CALL_ADDRESS[mainnet.id],\n        amount: MAX_APPROVAL,\n      }),\n      // Step 2: UnwrapWETHAndCall pulls WETH, unwraps to ETH, sends to VaultWrapper, calls deposit\n      {\n        contractAbi: UNWRAP_AND_CALL_ABI,\n        contractAddress: UNWRAP_AND_CALL_ADDRESS[mainnet.id],\n        functionName: 'unwrapAndCall',\n        functionArgs: [\n          VAULT_DEPOSITOR_ADDRESS[mainnet.id], // target (VaultWrapper)\n          vaultWrapperCalldata, // VaultWrapper.deposit() calldata\n        ],\n      },\n    ] satisfies FunkitCheckoutActionParams[]\n  }\n\n  const resetApprovalNeeded = shouldResetApproval(depositToken)\n\n  // ERC20 tokens\n  return [\n    // Special handling of LDO token as it requires approval reset before approval can be set to a new value due to non-standard implementation of the approve function.\n    ...(resetApprovalNeeded\n      ? [\n          getResetApprovalCalldata({\n            tokenAddress: depositToken,\n            spenderAddress: VAULT_DEPOSITOR_ADDRESS[mainnet.id],\n          }),\n        ]\n      : []),\n\n    // Step 1: Approve deposit token to VaultDepositor\n    getApprovalCalldata({\n      tokenAddress: depositToken,\n      spenderAddress: VAULT_DEPOSITOR_ADDRESS[mainnet.id],\n      amount: MAX_APPROVAL,\n    }),\n    // Step 2: VaultDepositor pulls deposit token and calls Lighter deposit\n    {\n      contractAbi: VAULT_DEPOSITOR_ABI,\n      contractAddress: VAULT_DEPOSITOR_ADDRESS[mainnet.id],\n      functionName: 'depositWithTick',\n      functionArgs: [\n        depositToken, // token (deposit token)\n        LIGHTER_DEPOSIT_ADDRESS, // vault (Lighter deposit contract)\n        lighterDepositCalldata, // callData\n        0n, // minAmountOut\n        tickSize, // tickSize\n        dustRecipient, // dustRecipient\n      ],\n    },\n  ] as FunkitCheckoutActionParams[]\n}\n\nconst LIGHTER_USDC_PERPS_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.USDC[mainnet.id],\n  targetAssetTicker: USDC_PERPS_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.USDC,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.USDC,\n        routeType: RouteType.Perps,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_USDC_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.USDC[mainnet.id],\n  targetAssetTicker: USDC_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.USDC,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.USDC,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_ETH_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.WETH[mainnet.id],\n  targetAssetTicker: ETH_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.ETH,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.ETH,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\n// LINK, UNI, AAVE, SKY, LDO tokens\nconst LIGHTER_LIT_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.LIT[mainnet.id],\n  targetAssetTicker: LIT_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.LIT,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.LIT,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_LINK_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.LINK[mainnet.id],\n  targetAssetTicker: LINK_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.LINK,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.LINK,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_SKY_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.SKY[mainnet.id],\n  targetAssetTicker: SKY_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.SKY,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.SKY,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_UNI_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.UNI[mainnet.id],\n  targetAssetTicker: UNI_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.UNI,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.UNI,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_AAVE_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.AAVE[mainnet.id],\n  targetAssetTicker: AAVE_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.AAVE,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.AAVE,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_LDO_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.LDO[mainnet.id],\n  targetAssetTicker: LDO_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.LDO,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.LDO,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst LIGHTER_AZTEC_SPOT_FUN_MAINNET_DEPOSIT = createPath({\n  targetChain: mainnet.id.toString(),\n  targetAsset: tokenAddresses.AZTEC[mainnet.id],\n  targetAssetTicker: AZTEC_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.AZTEC,\n  generateActionsParams:\n    (address) => async (_finalTargetAssetAmount, outputConfig) => {\n      if (!outputConfig) {\n        return []\n      }\n      if (outputConfig.targetChain !== mainnet.id.toString()) {\n        return []\n      }\n      return generateLighterMainnetDepositActions({\n        address,\n        assetIndex: AssetIndex.AZTEC,\n        routeType: RouteType.Spot,\n      }) as FunkitCheckoutActionParams[]\n    },\n})\n\nconst USDC_PERPS_RL_TRANSFER = createPath({\n  targetChain: RELAY_LIGHTER_CHAIN_ID.toString(),\n  targetAsset: RELAY_LIGHTER_USDC_PERPS_ADDRESS,\n  targetAssetTicker: USDC_PERPS_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.USDC,\n  getCustomRecipient: ({ l2Address }) => {\n    return l2Address as FunAddress\n  },\n})\n\nconst USDC_SPOT_RL_TRANSFER = createPath({\n  targetChain: RELAY_LIGHTER_CHAIN_ID.toString(),\n  targetAsset: RELAY_LIGHTER_USDC_SPOT_ADDRESS,\n  targetAssetTicker: USDC_SPOT_SYMBOL,\n  iconSrc: ASSET_LOGO_SRCS.USDC,\n  getCustomRecipient: ({ l2Address }) => {\n    return l2Address as FunAddress\n  },\n})\n\nexport const LIGHTER_DYNAMIC_ROUTES: DynamicRoute[] = [\n  createRoute({\n    id: 'LIGHTER_ETH_SPOT',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_ETH_SPOT_FUN_MAINNET_DEPOSIT,\n      RL_TRANSFER: createPath({\n        targetChain: RELAY_LIGHTER_CHAIN_ID.toString(),\n        targetAsset: RELAY_LIGHTER_ETH_SPOT_ADDRESS,\n        targetAssetTicker: ETH_SPOT_SYMBOL,\n        iconSrc: ASSET_LOGO_SRCS.ETH,\n        getCustomRecipient: ({ l2Address }) => {\n          return l2Address as FunAddress\n        },\n      }),\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_USDC_PERPS',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_USDC_PERPS_FUN_MAINNET_DEPOSIT,\n      RL_TRANSFER: USDC_PERPS_RL_TRANSFER,\n      ACROSS_TRANSFER: USDC_PERPS_RL_TRANSFER,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_USDC_PERPS_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_USDC_PERPS_FUN_MAINNET_DEPOSIT,\n      ACROSS_TRANSFER: USDC_PERPS_RL_TRANSFER,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_USDC_SPOT',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_USDC_SPOT_FUN_MAINNET_DEPOSIT,\n      RL_TRANSFER: USDC_SPOT_RL_TRANSFER,\n      ACROSS_TRANSFER: USDC_SPOT_RL_TRANSFER,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_USDC_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_USDC_SPOT_FUN_MAINNET_DEPOSIT,\n      ACROSS_TRANSFER: USDC_SPOT_RL_TRANSFER,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_ETH_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_ETH_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  // LINK, UNI, AAVE, SKY, LDO tokens\n  createRoute({\n    id: 'LIGHTER_LIT_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_LIT_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_LINK_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_LINK_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_SKY_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_SKY_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_UNI_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_UNI_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_AAVE_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_AAVE_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_LDO_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_LDO_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n  createRoute({\n    id: 'LIGHTER_AZTEC_SPOT_NEW_USER',\n    paths: {\n      FUN_MAINNET_DEPOSIT: LIGHTER_AZTEC_SPOT_FUN_MAINNET_DEPOSIT,\n    },\n  }),\n]\n", "import type { Abi } from 'viem'\n\nexport const UNWRAP_AND_CALL_ABI: Abi = [\n  {\n    name: 'unwrapAndCall',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'target', type: 'address' },\n      { name: 'callData', type: 'bytes' },\n    ],\n    outputs: [{ name: 'returnData', type: 'bytes' }],\n  },\n]\n\nexport const VAULT_DEPOSITOR_ABI: Abi = [\n  {\n    inputs: [\n      { internalType: 'address', name: 'initialOwner', type: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'constructor',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: 'amount', type: 'uint256' },\n      { internalType: 'uint256', name: 'tickSize', type: 'uint256' },\n    ],\n    name: 'AmountBelowMinimumTick',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'bytes', name: 'returnData', type: 'bytes' }],\n    name: 'DepositFailed',\n    type: 'error',\n  },\n  { inputs: [], name: 'DustRefundFailed', type: 'error' },\n  { inputs: [], name: 'EmptyMethodSignature', type: 'error' },\n  { inputs: [], name: 'InsufficientETHAmount', type: 'error' },\n  { inputs: [], name: 'InsufficientTokenAmount', type: 'error' },\n  {\n    inputs: [{ internalType: 'string', name: 'reason', type: 'string' }],\n    name: 'InvalidCalldata',\n    type: 'error',\n  },\n  { inputs: [], name: 'InvalidDustRecipient', type: 'error' },\n  { inputs: [], name: 'InvalidFunctionSelector', type: 'error' },\n  { inputs: [], name: 'InvalidTickSize', type: 'error' },\n  { inputs: [], name: 'InvalidVault', type: 'error' },\n  { inputs: [], name: 'NoETHInContract', type: 'error' },\n  {\n    inputs: [{ internalType: 'address', name: 'owner', type: 'address' }],\n    name: 'OwnableInvalidOwner',\n    type: 'error',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n    name: 'OwnableUnauthorizedAccount',\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: [\n      { internalType: 'address', name: 'vault', type: 'address' },\n      { internalType: 'bytes4', name: 'selector', type: 'bytes4' },\n    ],\n    name: 'SelectorNotAllowed',\n    type: 'error',\n  },\n  { inputs: [], name: 'VaultAlreadyRegistered', type: 'error' },\n  { inputs: [], name: 'VaultDoesNotSupportNative', type: 'error' },\n  { inputs: [], name: 'VaultNotRegistered', type: 'error' },\n  { inputs: [], name: 'VaultNotRegisteredForDeposit', type: 'error' },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'recipient',\n        type: 'address',\n      },\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'token',\n        type: 'address',\n      },\n      {\n        indexed: false,\n        internalType: 'uint256',\n        name: 'dust',\n        type: 'uint256',\n      },\n      {\n        indexed: false,\n        internalType: 'uint256',\n        name: 'originalAmount',\n        type: 'uint256',\n      },\n      {\n        indexed: false,\n        internalType: 'uint256',\n        name: 'depositedAmount',\n        type: 'uint256',\n      },\n    ],\n    name: 'DustRefunded',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'vault',\n        type: 'address',\n      },\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'token',\n        type: 'address',\n      },\n      {\n        indexed: false,\n        internalType: 'uint256',\n        name: 'amount',\n        type: 'uint256',\n      },\n      {\n        indexed: false,\n        internalType: 'bytes',\n        name: 'returnData',\n        type: 'bytes',\n      },\n    ],\n    name: 'FunMediatedDeposit',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'previousOwner',\n        type: 'address',\n      },\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'newOwner',\n        type: 'address',\n      },\n    ],\n    name: 'OwnershipTransferred',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'vault',\n        type: 'address',\n      },\n      {\n        indexed: true,\n        internalType: 'bytes4',\n        name: 'newSelector',\n        type: 'bytes4',\n      },\n    ],\n    name: 'SelectorUpdated',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'vault',\n        type: 'address',\n      },\n      {\n        indexed: false,\n        internalType: 'string',\n        name: 'methodSignature',\n        type: 'string',\n      },\n      {\n        indexed: false,\n        internalType: 'bool',\n        name: 'convertTo18Decimals',\n        type: 'bool',\n      },\n    ],\n    name: 'VaultRegistered',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      {\n        indexed: true,\n        internalType: 'address',\n        name: 'vault',\n        type: 'address',\n      },\n    ],\n    name: 'VaultRemoved',\n    type: 'event',\n  },\n  {\n    inputs: [],\n    name: 'AMOUNT_PLACEHOLDER',\n    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'AMOUNT_PLACEHOLDER_BYTES32',\n    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'NATIVE_TOKEN',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: 'amount', type: 'uint256' },\n      { internalType: 'uint256', name: 'tickSize', type: 'uint256' },\n    ],\n    name: 'calculateTickRounding',\n    outputs: [\n      { internalType: 'uint256', name: 'roundedAmount', type: 'uint256' },\n      { internalType: 'uint256', name: 'dust', type: 'uint256' },\n    ],\n    stateMutability: 'pure',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'token', type: 'address' },\n      { internalType: 'address', name: 'vault', type: 'address' },\n      { internalType: 'bytes', name: 'callData', type: 'bytes' },\n      { internalType: 'uint256', name: 'minAmountOut', type: 'uint256' },\n    ],\n    name: 'deposit',\n    outputs: [{ internalType: 'bytes', name: 'returnData', type: 'bytes' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'token', type: 'address' },\n      { internalType: 'address', name: 'vault', type: 'address' },\n      { internalType: 'bytes', name: 'callData', type: 'bytes' },\n      { internalType: 'uint256', name: 'minAmountOut', type: 'uint256' },\n      { internalType: 'uint256', name: 'tickSize', type: 'uint256' },\n      { internalType: 'address', name: 'dustRecipient', type: 'address' },\n    ],\n    name: 'depositWithTick',\n    outputs: [{ internalType: 'bytes', name: 'returnData', type: 'bytes' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'getAllowedSelector',\n    outputs: [{ internalType: 'bytes4', name: '', type: 'bytes4' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'uint256', name: 'tickSize', type: 'uint256' }],\n    name: 'getMinimumDepositForTick',\n    outputs: [{ internalType: 'uint256', name: 'minAmount', type: 'uint256' }],\n    stateMutability: 'pure',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'getVaultConfig',\n    outputs: [\n      {\n        components: [\n          { internalType: 'bool', name: 'isRegistered', type: 'bool' },\n          { internalType: 'bool', name: 'convertTo18Decimals', type: 'bool' },\n          { internalType: 'bool', name: 'allowsNative', type: 'bool' },\n          { internalType: 'bytes4', name: 'allowedSelector', type: 'bytes4' },\n        ],\n        internalType: 'struct VaultConfigLib.VaultConfig',\n        name: 'config',\n        type: 'tuple',\n      },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'isVaultRegistered',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'owner',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'vault', type: 'address' },\n      { internalType: 'string', name: 'vaultABI', type: 'string' },\n      {\n        internalType: 'bytes4',\n        name: 'allowedFunctionSelector',\n        type: 'bytes4',\n      },\n      { internalType: 'bool', name: 'convertTo18Decimals', type: 'bool' },\n      { internalType: 'bool', name: 'allowsNative', type: 'bool' },\n    ],\n    name: 'registerVault',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'removeVault',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'renounceOwnership',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n    name: 'transferOwnership',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: 'vault', type: 'address' },\n      { internalType: 'bytes4', name: 'newSelector', type: 'bytes4' },\n    ],\n    name: 'updateAllowedSelector',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: 'amount', type: 'uint256' },\n      { internalType: 'uint256', name: 'tickSize', type: 'uint256' },\n    ],\n    name: 'validateAmountForTick',\n    outputs: [\n      { internalType: 'bool', name: 'isValid', type: 'bool' },\n      { internalType: 'uint256', name: 'roundedAmount', type: 'uint256' },\n      { internalType: 'uint256', name: 'dust', type: 'uint256' },\n    ],\n    stateMutability: 'pure',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'vaultAllowsNative',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: '', type: 'address' }],\n    name: 'vaultConfigs',\n    outputs: [{ internalType: 'uint40', name: '', type: 'uint40' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'address', name: 'vault', type: 'address' }],\n    name: 'vaultRequires18Decimals',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  { stateMutability: 'payable', type: 'receive' },\n]\n", "import { type Address, getAddress } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport type { MatchAllCondition } from './types'\n\nexport { erc20Abi as ERC20_ABI } from 'viem'\n\n// Amount placeholder that gets replaced by user's balance at runtime\nexport const AMOUNT_PLACEHOLDER =\n  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeadbeefn\n\nexport const tokenAddresses = {\n  WETH: {\n    [mainnet.id]: getAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n  },\n  USDC: {\n    [mainnet.id]: getAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),\n  },\n  LIT: {\n    [mainnet.id]: getAddress('0x232CE3bd40fCd6f80f3d55A522d03f25Df784Ee2'),\n  },\n  LINK: {\n    [mainnet.id]: getAddress('0x514910771AF9Ca656af840dff83E8264EcF986CA'),\n  },\n  UNI: {\n    [mainnet.id]: getAddress('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'),\n  },\n  AAVE: {\n    [mainnet.id]: getAddress('0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'),\n  },\n  SKY: {\n    [mainnet.id]: getAddress('0x56072C95FAA701256059aa122697B133aDEd9279'),\n  },\n  LDO: {\n    [mainnet.id]: getAddress('0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32'),\n  },\n  AZTEC: {\n    [mainnet.id]: getAddress('0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2'),\n  },\n} as const\n\nexport const UNWRAP_AND_CALL_ADDRESS = {\n  [mainnet.id]: getAddress('0x177591f2F4DcC3a47F768f6533eC6Edf564d6927'),\n} as const\n\nexport const VAULT_DEPOSITOR_ADDRESS = {\n  [mainnet.id]: getAddress('0x40b72bB73B1E9380629B205e7880Fa409ae7fcc9'),\n} as const\n\nexport const LIGHTER_DEPOSIT_ADDRESS = getAddress(\n  '0x3b4d794a66304f130a4db8f2551b0070dfcf5ca7',\n) as Address\n\nexport const MATCH_ALL_CONDITION: MatchAllCondition = '*'\n", "import { type Address, erc20Abi as ERC20_ABI } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { indexBy } from '../utils'\nimport { MATCH_ALL_CONDITION, tokenAddresses } from './consts'\nimport type {\n  DynamicRoute,\n  DynamicRouteConfig,\n  DynamicRoutePath,\n  DynamicRoutingConfig,\n  IndexedDynamicRoutingConfig,\n  RuleDefinition,\n} from './types'\n\nexport const createPath = (config: DynamicRoutePath): DynamicRoutePath => {\n  return config\n}\n\nexport const createRoute = (config: DynamicRouteConfig): DynamicRoute => {\n  const getPathById = (pathId: string): DynamicRoutePath | null => {\n    const path = config.paths[pathId]\n    if (!path) {\n      return null\n    }\n    return path\n  }\n\n  return {\n    id: config.id,\n    config,\n    getPathById,\n  }\n}\n\nconst resolveBadge = (rule: RuleDefinition) => {\n  if ('badge' in rule.use) {\n    return rule.use.badge\n  }\n  return undefined\n}\n\nconst resolveForceBridge = (rule: RuleDefinition) => {\n  if ('bridgeOverride' in rule.use) {\n    return rule.use.bridgeOverride\n  }\n  return undefined\n}\n\nexport const initDynamicRouting = (\n  dynamicRoutes: DynamicRoute[],\n  dynamicRoutingConfig: DynamicRoutingConfig,\n) => {\n  const indexedRoutes = indexBy(dynamicRoutes, (route) => route.id)\n  const indexedDynamicRoutingConfig = dynamicRoutingConfig.reduce(\n    (acc, routeConfig) => {\n      const route = indexedRoutes[routeConfig.routeId]\n      if (!route) {\n        return acc\n      }\n      const { rules } = routeConfig\n\n      // index rules by when.chainId and when.tokenAddress\n      const indexedRules = indexBy([...rules], (rule) => {\n        if (rule.when === MATCH_ALL_CONDITION) {\n          return MATCH_ALL_CONDITION\n        }\n        return `${rule.when.chainId}-${rule.when.tokenAddress}`.toLowerCase()\n      })\n\n      const resolveRule = (rule: RuleDefinition) => {\n        const path = route.getPathById(rule.use.path)\n        if (!path) {\n          return null\n        }\n        const badge = resolveBadge(rule)\n        const bridgeOverride = resolveForceBridge(rule)\n        return {\n          path,\n          badge,\n          bridgeOverride,\n        }\n      }\n\n      const findPath = ({\n        chainId,\n        tokenAddress,\n      }: {\n        chainId: string\n        tokenAddress: string\n      }) => {\n        // try to match rule definitively (by chainId and tokenAddress) first\n        const specificRule =\n          indexedRules[`${chainId}-${tokenAddress}`.toLowerCase()]\n        if (specificRule) {\n          return resolveRule(specificRule)\n        }\n\n        // if no specific rule found, fallback to wildcard rule\n        // FIRST, check if there is a rule with chainId = '*' and tokenAddress matching\n        const anyChainSpecificTokenAddress =\n          indexedRules[`${MATCH_ALL_CONDITION}-${tokenAddress}`.toLowerCase()]\n        if (anyChainSpecificTokenAddress) {\n          return resolveRule(anyChainSpecificTokenAddress)\n        }\n\n        // SECOND, check if there is a rule with tokenAddress = '*' and chainId matching\n        const anyTokenAddressSpecificChain =\n          indexedRules[`${chainId}-${MATCH_ALL_CONDITION}`.toLowerCase()]\n        if (anyTokenAddressSpecificChain) {\n          return resolveRule(anyTokenAddressSpecificChain)\n        }\n\n        // Third - check general purpose wildcard rule\n        const wildcardRule = indexedRules[MATCH_ALL_CONDITION]\n        if (wildcardRule) {\n          return resolveRule(wildcardRule)\n        }\n\n        // This should never happen\n        // As there should always be a fallback defined\n        return null\n      }\n\n      acc[routeConfig.routeId] = {\n        route,\n        rules,\n        findPath,\n      }\n      return acc\n    },\n    {} as IndexedDynamicRoutingConfig,\n  )\n\n  return indexedDynamicRoutingConfig\n}\n\nexport const MAX_APPROVAL =\n  '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n/**\n * Returns args for the approve function call.\n * @param tokenAddress - The address of the token to approve\n * @param spenderAddress - The address of the spender to approve\n * @param amount - The amount of tokens to approve\n */\nexport const getApprovalCalldata = ({\n  tokenAddress,\n  spenderAddress,\n  amount,\n}: {\n  tokenAddress: Address\n  spenderAddress: Address\n  amount: string\n}) => {\n  return {\n    contractAbi: ERC20_ABI,\n    contractAddress: tokenAddress,\n    functionName: 'approve' as const,\n    functionArgs: [spenderAddress, amount],\n  }\n}\n\n/**\n * Returns args for the approve function call to reset the approval to 0.\n * @param tokenAddress - The address of the token to reset the approval for\n * @param spenderAddress - The address of the spender to reset the approval for\n */\nexport const getResetApprovalCalldata = ({\n  tokenAddress,\n  spenderAddress,\n}: {\n  tokenAddress: Address\n  spenderAddress: Address\n}) => {\n  return getApprovalCalldata({\n    tokenAddress,\n    spenderAddress,\n    amount: '0',\n  })\n}\n\n/**\n * These tokens have a brain dead implementation of the approve function.\n * They require the approval to be reset to 0 before the approval can be set to a new value.\n */\nexport const RESET_APPROVAL_TOKENS = [tokenAddresses.LDO[mainnet.id]].map(\n  (address) => address.toLowerCase(),\n)\n\n/**\n * Checks if a token requires approval reset before approval can be set to a new value due to non-standard implementation of the approve function.\n *\n * @param tokenAddress - The address of the token to check if it requires approval reset before approval can be set to a new value.\n * @returns true if the token requires approval reset before approval can be set to a new value, false otherwise.\n */\nexport const shouldResetApproval = (tokenAddress: Address) => {\n  return RESET_APPROVAL_TOKENS.includes(tokenAddress.toLowerCase())\n}\n", "import { LIGHTER_DYNAMIC_ROUTES } from './lighter'\nexport * from './abi'\nexport * from './types'\nexport * from './utils'\n\nexport const DYNAMIC_ROUTES = [...LIGHTER_DYNAMIC_ROUTES]\n"],
  "mappings": "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",
  "names": ["MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "encodeFunctionData", "mainnet", "mainnet", "mainnet", "RELAY_LIGHTER_CHAIN_ID", "mainnet", "encodeFunctionData", "RELAY_LIGHTER_CHAIN_ID"]
}
