@funkit/fun-relay 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +2 -2
- package/dist/src/currency.d.ts +2 -1
- package/dist/src/currency.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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"],
|
|
4
|
-
"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", "import {\n LogLevel,\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n type log,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } 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 client = createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n logLevel: options.logLevel ?? LogLevel.Verbose,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n })\n\n const relayLogger = (message: Parameters<typeof log>[0], level: LogLevel) => {\n const logType: keyof Logger = level === 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 /**\n * Configure the logger after creation as a workaround for relay-sdk bug.\n * Logger is not passed in the createClient() constructor only in the configure method.\n * Issue was raised to Relay on 1/20/25\n * Relay will be patching their SDK in their next release (anything after v5.0.1)\n *\n * Todo: We can remove the configure() call once we can bump to latest relay-sdk.\n */\n client.configure({\n logger: relayLogger,\n logLevel: options.logLevel ?? LogLevel.Verbose,\n })\n\n return client\n}\n\n/**\n * Gets the global instance of the RelayClient\n */\nexport function getRelayClient(): RelayClient {\n const client = 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 } 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 ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\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'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\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 type RelayVmType = 'bvm' | 'evm' | 'hypevm' | 'svm' | 'lvm' | 'tvm'\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}: {\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}): 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 })\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 apiKey?: string\n}\n\nexport async function getRelayAssetInfo({\n chainId,\n address,\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 }\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 | {\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\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 RelayQuote<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 } = 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 = 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 })\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 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 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}\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\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}\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}\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}\n\nconst USDC_PERPS_SYMBOL = 'USDC (Perps)'\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)'\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_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\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: 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 },\n }),\n createRoute({\n id: 'LIGHTER_USDC_PERPS_NEW_USER',\n paths: {\n FUN_MAINNET_DEPOSIT: LIGHTER_USDC_PERPS_FUN_MAINNET_DEPOSIT,\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]\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} 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\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 return {\n path,\n badge,\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 './types'\nexport * from './utils'\n\nexport const DYNAMIC_ROUTES = [...LIGHTER_DYNAMIC_ROUTES]\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"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", "import {\n LogLevel,\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n type log,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } 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 client = createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n logLevel: options.logLevel ?? LogLevel.Verbose,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n })\n\n const relayLogger = (message: Parameters<typeof log>[0], level: LogLevel) => {\n const logType: keyof Logger = level === 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 /**\n * Configure the logger after creation as a workaround for relay-sdk bug.\n * Logger is not passed in the createClient() constructor only in the configure method.\n * Issue was raised to Relay on 1/20/25\n * Relay will be patching their SDK in their next release (anything after v5.0.1)\n *\n * Todo: We can remove the configure() call once we can bump to latest relay-sdk.\n */\n client.configure({\n logger: relayLogger,\n logLevel: options.logLevel ?? LogLevel.Verbose,\n })\n\n return client\n}\n\n/**\n * Gets the global instance of the RelayClient\n */\nexport function getRelayClient(): RelayClient {\n const client = 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 } 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 ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\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'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\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 type RelayVmType = 'bvm' | 'evm' | 'hypevm' | 'svm' | 'lvm' | 'tvm'\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}: {\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}): 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 })\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 | {\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\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 RelayQuote<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 } = 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 = 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 })\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 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 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}\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\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}\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}\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}\n\nconst USDC_PERPS_SYMBOL = 'USDC (Perps)'\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)'\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_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\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: 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 },\n }),\n createRoute({\n id: 'LIGHTER_USDC_PERPS_NEW_USER',\n paths: {\n FUN_MAINNET_DEPOSIT: LIGHTER_USDC_PERPS_FUN_MAINNET_DEPOSIT,\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]\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} 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\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 return {\n path,\n badge,\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 './types'\nexport * from './utils'\n\nexport const DYNAMIC_ROUTES = [...LIGHTER_DYNAMIC_ROUTES]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["LogLevel", "LogLevel", "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"]
|
|
7
7
|
}
|