@funkit/fun-relay 0.1.10 → 0.1.11

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @funkit/fun-relay
2
2
 
3
+ ## 0.1.11
4
+
5
+ ### Patch Changes
6
+
7
+ - 620d5ca: feat: handling for solana chain id
8
+
3
9
  ## 0.1.10
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -50,6 +50,7 @@ var import_relay_sdk = require("@reservoir0x/relay-sdk");
50
50
  // src/constants.ts
51
51
  var RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809;
52
52
  var RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`;
53
+ var FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710;
53
54
  var FUNKIT_NATIVE_TOKEN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
54
55
  var RELAY_NATIVE_TOKEN = "0x0000000000000000000000000000000000000000";
55
56
  var FUN_RELAY_REVENUE_WALLET = "0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E";
@@ -101,6 +102,12 @@ function convertFunToRelayTokenAddress(address) {
101
102
  }
102
103
  return address;
103
104
  }
105
+ function convertFunToRelayChainId(chainId) {
106
+ if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {
107
+ return RELAY_SOLANA_CHAIN_ID_NUMBER;
108
+ }
109
+ return chainId;
110
+ }
104
111
  function getRelayExecutionRefundState(info) {
105
112
  switch (info.status) {
106
113
  case "refund":
@@ -369,14 +376,20 @@ async function getQuoteEstUsdValue({
369
376
  logger
370
377
  }) {
371
378
  try {
379
+ const normalizedChainId = convertFunToRelayChainId(
380
+ Number(tokenChainId)
381
+ ).toString();
382
+ const normalizedTokenAddress = convertFunToRelayTokenAddress(
383
+ tokenAddress
384
+ );
372
385
  const [tokenPriceRes, tokenInfoRes] = await Promise.all([
373
386
  getRelayAssetPriceInfo({
374
- chainId: tokenChainId,
375
- address: convertFunToRelayTokenAddress(tokenAddress)
387
+ chainId: normalizedChainId,
388
+ address: normalizedTokenAddress
376
389
  }),
377
390
  getRelayAssetInfo({
378
- chainId: tokenChainId,
379
- address: convertFunToRelayTokenAddress(tokenAddress)
391
+ chainId: normalizedChainId,
392
+ address: normalizedTokenAddress
380
393
  })
381
394
  ]);
382
395
  const price = tokenPriceRes.price;
@@ -448,8 +461,8 @@ async function getRelayQuote({
448
461
  appFeeBp
449
462
  });
450
463
  const relayQuote = await relayClient.actions.getQuote({
451
- chainId: Number(fromChainId),
452
- toChainId: Number(toChainId),
464
+ chainId: convertFunToRelayChainId(Number(fromChainId)),
465
+ toChainId: convertFunToRelayChainId(Number(toChainId)),
453
466
  currency: convertFunToRelayTokenAddress(fromTokenAddress),
454
467
  toCurrency: convertFunToRelayTokenAddress(toTokenAddress),
455
468
  amount: queryTokenAmountBaseUnit.toString(),
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../index.ts", "../src/client.ts", "../src/types.ts", "../src/constants.ts", "../src/execution.ts", "../src/utils.ts", "../src/fees.ts", "../src/price.ts", "../src/quote.ts", "../src/currency.ts", "../src/solana.ts"],
4
- "sourcesContent": ["export {\n getRelayClient,\n initializeRelayClient,\n type InitializeRelayClientParams,\n} from './src/client'\nexport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_SOLANA_CHAIN_ID,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './src/constants'\nexport {\n type ExecuteRelayQuoteParams,\n type RelayAddress,\n type RelayChainId,\n type RelayExecutionStep,\n type RelayTxHash,\n type RelayVmType,\n type RelayWallet,\n executeRelayQuote,\n getRelayExecutionInfo,\n} from './src/execution'\nexport { parseRelayFees } from './src/fees'\nexport { getRelayAssetPriceInfo } from './src/price'\nexport {\n type GetRelayQuoteParams,\n type RelayQuote,\n getRelayQuote,\n} from './src/quote'\nexport {\n type SolanaAddress,\n type SolanaTxHash,\n type SolanaWallet,\n getSolanaWallet,\n} from './src/solana'\nexport {\n getRelayExecutionRefundState,\n getRelayExecutionState,\n isRelayExecutionTerminalStatus,\n convertFunToRelayTokenAddress,\n} from './src/utils'\nexport {\n LogLevel,\n type RelayExecutionInfo,\n type RelayExecutionStatus,\n type RelayTokenPriceInfo,\n} from './src/types'\n", "import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@reservoir0x/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 return createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n logger: (message) => {\n logger.info('[RelayClient]:', message)\n },\n })\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 '@reservoir0x/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 { RelayExecutionStatus } from './types'\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\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 * Wallet that receives the app fees collected by Relay\n */\nexport const FUN_RELAY_REVENUE_WALLET =\n '0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E' 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", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@reservoir0x/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport { getRelayClient } from './client'\nimport type { RELAY_SOLANA_CHAIN_ID } from './constants'\nimport type { RelayQuoteResult } from './quote'\nimport type { SolanaAddress, SolanaTxHash, SolanaWallet } from './solana'\nimport type { Logger, RelayExecutionInfo } from './types'\nimport { jsonStringifyWithBigIntSanitization } from './utils'\n\nexport type RelayExecutionStep = ProgressData['currentStep'] & {}\n\nexport type RelayVmType = 'evm' | 'solana'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n evm: Address\n solana: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n evm: string\n solana: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n evm: Hex\n solana: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n evm: WalletClient | AdaptedWallet\n solana: SolanaWallet\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\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\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 // 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 const txHash =\n typeof rawTxHashWithUnreliableTyping === 'object'\n ? rawTxHashWithUnreliableTyping.id\n : rawTxHashWithUnreliableTyping\n\n if (\n // Call onUserActionsCompleted only once\n !isUserActionsCompleted &&\n steps.every((step) =>\n step.items.every(\n // Step items may get batched - in which case there may not be a txHash in each, such items are marked as 'complete' directly instead\n // Also ensures that onUserActionsCompleted is always called before onTransactionConfirmed\n (item) => item.status === 'complete' || item.txHashes?.length,\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 // fire and forget index registration\n if (relayQuote.steps[0].requestId) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash,\n }),\n })\n }\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 interface PostRegistrationRequest {\n requestId: string\n chainId: string\n tx: string\n}\n\nexport type RegisterIndexingResponse =\n | { success: never; message: 'Success' }\n | { success: false; message: string }\n\nexport async function manuallyRegisterIndex(\n logger: Logger,\n registerRequest: PostRegistrationRequest,\n): Promise<void> {\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`[registerIndexing] request: ${stringifiedRequest}`)\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(\n `Error sending request to manually register index: ${JSON.stringify(response)}`,\n )\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${data.message}. Params: ${stringifiedRequest}`)\n }\n return\n } catch (err) {\n logger.error(\n `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}. Params: ${stringifiedRequest}`,\n )\n }\n}\n\nexport async function getRelayExecutionInfo(\n requestId: string,\n): Promise<RelayExecutionInfo> {\n const url = `${MAINNET_RELAY_API}/intents/status/v2?requestId=${requestId}`\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 as RelayExecutionInfo\n}\n", "import {\n FUNKIT_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n} from './types'\n\n/**\n * Converts a token address within Funkit the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n): RelayAddress<T> {\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n\n return address\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case '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 'success':\n return CheckoutState.COMPLETED\n case 'failure':\n case '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", "import type { CallFees } from '@reservoir0x/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n}): Promise<FunRelayFeeItem> {\n const url = `https://frog.fun.xyz/api/fee?fromTokenAddress=${fromTokenAddress}&fromChainId=${fromChainId}&toTokenAddress=${toTokenAddress}&toChainId=${toChainId}&estUsdValue=${estUsdValue}&clientId=${clientId}`\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 logger,\n}: {\n fees: CallFees | undefined\n logger: Logger\n}) {\n // Gas fees, denominated in source chain native token\n const relayGasFeesUsd = Number.parseFloat(fees?.gas?.amountUsd || '0')\n\n // App fees, denominated in source chain token\n const funLpFeesUsd = Number.parseFloat(fees?.app?.amountUsd || '0')\n const funLpFeesFromAmount = Number.parseFloat(\n fees?.app?.amountFormatted || '0',\n )\n const funLpFeesFromAmountBaseUnit = BigInt(fees?.app?.amount || '0')\n\n // Relay fees, denominated in source chain token\n const relayLpFeesUsd = Number.parseFloat(fees?.relayer?.amountUsd || '0')\n const relayLpFeesFromAmount = Number.parseFloat(\n fees?.relayer?.amountFormatted || '0',\n )\n const relayLpFeesFromAmountBaseUnit = BigInt(fees?.relayer?.amount || '0')\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 '@reservoir0x/relay-sdk'\nimport type { RelayTokenPriceInfo } from './types'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${chainId}&address=${address}`\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 as RelayTokenPriceInfo\n}\n", "import type { Execute, GetQuoteParameters } from '@reservoir0x/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 { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport { convertFunToRelayTokenAddress } from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = Execute & {\n __vm: VmType\n}\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} & (\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}: {\n tokenChainId: string\n tokenAddress: string\n tokenAmountBaseUnit: string\n logger: Logger\n}) {\n try {\n const [tokenPriceRes, tokenInfoRes] = await Promise.all([\n getRelayAssetPriceInfo({\n chainId: tokenChainId,\n address: convertFunToRelayTokenAddress(tokenAddress as Address),\n }),\n getRelayAssetInfo({\n chainId: tokenChainId,\n address: convertFunToRelayTokenAddress(tokenAddress as Address),\n }),\n ])\n\n const price = tokenPriceRes.price\n const decimals = 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}: ${\n err instanceof Error ? err.message : JSON.stringify(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 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 userAddress,\n } = params\n\n try {\n const relayClient = getRelayClient()\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 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 })\n\n const feeInfo = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n })\n\n const appFeeBp = feeInfo.b + feeInfo.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n queryTokenAmountBaseUnit,\n txs,\n estUsdValue,\n feeInfo,\n appFeeBp,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote({\n chainId: Number(fromChainId),\n toChainId: Number(toChainId),\n currency: convertFunToRelayTokenAddress(fromTokenAddress),\n toCurrency: convertFunToRelayTokenAddress(toTokenAddress),\n amount: queryTokenAmountBaseUnit.toString(),\n recipient: recipientAddress,\n tradeType: params.tradeType,\n user: userAddress,\n wallet: walletClient,\n ...(txs && { txs }),\n options: {\n referrer: clientId\n ? `${FUN_RELAY_REFERRER}|${clientId}`\n : FUN_RELAY_REFERRER,\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n ...options,\n },\n })\n\n logger.info('relayQuote', relayQuote)\n\n const estSubtotalUsd = Number(\n relayQuote.details?.currencyOut?.amountUsd || 0,\n )\n const estTotalUsd = 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\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({ fees: relayQuote.fees, logger })\n\n const estSubtotalFromAmount = (\n Number.parseFloat(fromAmountString) - 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,\n estTotalFromAmount: fromAmountString,\n estTotalFromAmountBaseUnit: fromAmountBaseUnitString,\n estTotalUsd,\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: relayQuote as RelayQuoteResult<SourceVmType>,\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n throw new Error(\n `An error occurred trying to generate a relay quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n", "import { MAINNET_RELAY_API } from '@reservoir0x/relay-sdk'\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\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [chainId],\n address,\n }\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 type { AdaptedWallet } from '@reservoir0x/relay-sdk'\nimport { adaptSolanaWallet } from '@reservoir0x/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 = AdaptedWallet & {\n address(): Promise<SolanaAddress>\n}\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,oBAOO;;;ACPP,uBAAyB;;;ACQlB,IAAM,+BAA+B;AACrC,IAAM,wBAAwB,GAAG,4BAA4B;AAK7D,IAAM,sBACX;AAKK,IAAM,qBACX;AAKK,IAAM,2BACX;AAKK,IAAM,qBAAqB;AAK3B,IAAM,sCAAsC;AAE5C,IAAM,0BAAkD;AAAA;AAAA;AAAA;AAI/D;;;AFnBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA6C;AAC3C,aAAO,gCAAa;AAAA,IAClB,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,GAAG,OAAO,IAAI,8CAA4B;AAAA,MAC1C;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,YAAY;AACnB,aAAO,KAAK,kBAAkB,OAAO;AAAA,IACvC;AAAA,EACF,CAAC;AACH;AAKO,SAAS,iBAA8B;AAC5C,QAAM,aAAS,6BAAU;AAEzB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,SAAO;AACT;;;AGzDA,IAAAC,oBAIO;;;ACWA,SAAS,8BACd,SACiB;AACjB,MAAI,QAAQ,YAAY,MAAM,oBAAoB,YAAY,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,6BACd,MACiC;AACjC,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,uBACd,MACe;AACf,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF;AACE;AAAA,EACJ;AACF;AAKO,SAAS,+BACd,MACS;AACT,SAAO,wBAAwB,SAAS,KAAK,MAAM;AACrD;AAYO,SAAS,oCACd,cACQ;AACR,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,GAAG,UACF,OAAO,UAAU,WAAW,KAAK,MAAM,SAAS,EAAE,CAAC,KAAK;AAAA;AAAA,EAC5D;AACF;;;ADrBA,eAAsB,kBAA8C;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,MAAI,yBAAyB;AAC7B,MAAI,yBAAyB;AAE7B,QAAM,eAAe,EAAE,QAAQ,QAAQ;AAAA,IACrC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,YAAY;AAClB,aAAO,KAAK,GAAG,SAAS,WAAW;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,eAAe,IAAI;AAEhC,UAAI,OAAO;AACT,eAAO,KAAK,GAAG,SAAS,kBAAkB,KAAK;AAC/C,cAAM,QAAQ,KAAK,EAAE,MAAM,CAAC,MAAM;AAChC,iBAAO,MAAM,GAAG,SAAS,kBAAkB,CAAC;AAAA,QAC9C,CAAC;AAAA,MACH,WAAW,UAAU,QAAQ;AAG3B,cAAM,gCAAgC,SAAS,CAAC,EAAE;AAIlD,cAAM,SACJ,OAAO,kCAAkC,WACrC,8BAA8B,KAC9B;AAEN;AAAA;AAAA,UAEE,CAAC,0BACD,MAAM;AAAA,YAAM,CAAC,SACX,KAAK,MAAM;AAAA;AAAA;AAAA,cAGT,CAAC,SAAS,KAAK,WAAW,cAAc,KAAK,UAAU;AAAA,YACzD;AAAA,UACF;AAAA,UACA;AACA,iBAAO,KAAK,GAAG,SAAS,2BAA2B,QAAQ;AAC3D,mCAAyB;AAEzB,cAAI;AACF,kBAAM,yBAAyB,MAAM;AAAA,UACvC,SAAS,GAAG;AACV,mBAAO;AAAA,cACL,GAAG,SAAS;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA;AAAA;AAAA,UAEE,CAAC,0BACD,MAAM;AAAA,YAAM,CAAC,SACX,KAAK,MAAM,MAAM,CAAC,SAAS,KAAK,WAAW,UAAU;AAAA,UACvD;AAAA,UACA;AACA,iBAAO,KAAK,GAAG,SAAS,2BAA2B,QAAQ;AAC3D,mCAAyB;AAGzB,cAAI,WAAW,MAAM,CAAC,EAAE,WAAW;AACjC,kCAAsB,QAAQ;AAAA,cAC5B,WAAW,WAAW,MAAM,CAAC,EAAE;AAAA,cAC/B,SAAS,WAAW,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK;AAAA,cAC3C,IAAI,oCAAoC;AAAA,gBACtC,GAAG,WAAW,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE;AAAA,gBAChC;AAAA,cACF,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAEA,cAAI;AACF,kBAAM,yBAAyB,MAAM;AAAA,UACvC,SAAS,GAAG;AACV,mBAAO;AAAA,cACL,GAAG,SAAS;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAYA,eAAsB,sBACpB,QACA,iBACe;AACf,QAAM,qBAAqB,KAAK,UAAU,eAAe;AACzD,QAAM,MAAM,GAAG,mCAAiB;AAChC,MAAI;AACF,WAAO,KAAK,+BAA+B,kBAAkB,EAAE;AAC/D,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,eAAe;AAAA,IACtC,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,QACL,qDAAqD,KAAK,UAAU,QAAQ,CAAC;AAAA,MAC/E;AACA;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAI,KAAK,YAAY,WAAW;AAC9B,aAAO,MAAM,GAAG,KAAK,OAAO,aAAa,kBAAkB,EAAE;AAAA,IAC/D;AACA;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,8CAA8C,GAAG,KAAK,KAAK,UAAW,KAAe,OAAO,CAAC,aAAa,kBAAkB;AAAA,IAC9H;AAAA,EACF;AACF;AAEA,eAAsB,sBACpB,WAC6B;AAC7B,QAAM,MAAM,GAAG,mCAAiB,gCAAgC,SAAS;AACzE,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,SAAS,UAAU;AAAA,EACjC;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;;;AExNA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAO6B;AAC3B,QAAM,MAAM,iDAAiD,gBAAgB,gBAAgB,WAAW,mBAAmB,cAAc,cAAc,SAAS,gBAAgB,WAAW,aAAa,QAAQ;AAChN,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,SAAS,UAAU;AAAA,EACjC;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AACF,GAGG;AAED,QAAM,kBAAkB,OAAO,WAAW,MAAM,KAAK,aAAa,GAAG;AAGrE,QAAM,eAAe,OAAO,WAAW,MAAM,KAAK,aAAa,GAAG;AAClE,QAAM,sBAAsB,OAAO;AAAA,IACjC,MAAM,KAAK,mBAAmB;AAAA,EAChC;AACA,QAAM,8BAA8B,OAAO,MAAM,KAAK,UAAU,GAAG;AAGnE,QAAM,iBAAiB,OAAO,WAAW,MAAM,SAAS,aAAa,GAAG;AACxE,QAAM,wBAAwB,OAAO;AAAA,IACnC,MAAM,SAAS,mBAAmB;AAAA,EACpC;AACA,QAAM,gCAAgC,OAAO,MAAM,SAAS,UAAU,GAAG;AAEzE,QAAM,iBAAiB,eAAe;AACtC,QAAM,wBAAwB,sBAAsB;AACpD,QAAM,gCACJ,8BAA8B;AAEhC,SAAO,KAAK,kBAAkB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,kBAAkB;AAAA,IAChC,qBAAqB;AAAA,IACrB,6BAA6B;AAAA,EAC/B;AACF;;;AClFA,IAAAC,oBAAkC;AAGlC,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AACF,GAGiC;AAC/B,QAAM,MAAM,GAAG,mCAAiB,mCAAmC,OAAO,YAAY,OAAO;AAC7F,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,SAAS,UAAU;AAAA,EACjC;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACT;;;ACjBA,kBAAiD;;;ACDjD,IAAAC,oBAAkC;AAgBlC,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAG4B;AAC1B,QAAM,MAAM,GAAG,mCAAiB;AAChC,QAAM,OAAO;AAAA,IACX,UAAU,CAAC,OAAO;AAAA,IAClB;AAAA,EACF;AACA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,SAAS,UAAU;AAAA,EACjC;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,OAAO,CAAC;AACjB;;;ADiCA,eAAe,oBAAoB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI;AACF,UAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtD,uBAAuB;AAAA,QACrB,SAAS;AAAA,QACT,SAAS,8BAA8B,YAAuB;AAAA,MAChE,CAAC;AAAA,MACD,kBAAkB;AAAA,QAChB,SAAS;AAAA,QACT,SAAS,8BAA8B,YAAuB;AAAA,MAChE,CAAC;AAAA,IACH,CAAC;AAED,UAAM,QAAQ,cAAc;AAC5B,UAAM,WAAW,aAAa;AAE9B,UAAM,iBAAiB,OAAO,mBAAmB,IAAI,OAAO,MAAM,QAAQ;AAC1E,WAAO,OAAO,KAAK,IAAI,OAAO,cAAc;AAAA,EAC9C,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA4B;AAAA,MACvC,SAAS,qCAAqC,YAAY,aAAa,YAAY,KACjF,eAAe,QAAQ,IAAI,UAAU,KAAK,UAAU,GAAG,CACzD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cAGpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEE;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI;AACF,UAAM,cAAc,eAAe;AAEnC,UAAM,MAAM,cAAc,IAAI,CAAC,WAAW;AACxC,YAAM,WAAO,gCAAmB;AAAA,QAC9B,KAAK,OAAO;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,cAAc,OAAO;AAAA,MACvB,CAAC;AAED,aAAO;AAAA,QACL;AAAA,QACA,IAAI,OAAO;AAAA,QACX,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,MAClC;AAAA,IACF,CAAC;AAED,UAAM,YAAY,OAAO,cAAc;AACvC,UAAM,2BAA2B,YAC7B,OAAO,0BACP,OAAO;AACX,UAAM,oBAAoB,YAAY,mBAAmB;AACzD,UAAM,oBAAoB,YAAY,cAAc;AAEpD,UAAM,cAAc,MAAM,oBAAoB;AAAA,MAC5C,cAAc;AAAA,MACd,cAAc;AAAA,MACd,qBAAqB,yBAAyB,SAAS;AAAA,MACvD;AAAA,IACF,CAAC;AAED,UAAM,UAAU,MAAM,gBAAgB;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,OAAO,WAAW,KAAK;AAAA,MACpC;AAAA,IACF,CAAC;AAED,UAAM,WAAW,QAAQ,IAAI,QAAQ;AAErC,WAAO,KAAK,uBAAuB;AAAA,MACjC,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,aAAa,MAAM,YAAY,QAAQ,SAAS;AAAA,MACpD,SAAS,OAAO,WAAW;AAAA,MAC3B,WAAW,OAAO,SAAS;AAAA,MAC3B,UAAU,8BAA8B,gBAAgB;AAAA,MACxD,YAAY,8BAA8B,cAAc;AAAA,MACxD,QAAQ,yBAAyB,SAAS;AAAA,MAC1C,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,GAAI,OAAO,EAAE,IAAI;AAAA,MACjB,SAAS;AAAA,QACP,UAAU,WACN,GAAG,kBAAkB,IAAI,QAAQ,KACjC;AAAA,QACJ,SAAS;AAAA,UACP;AAAA,YACE,KAAK,SAAS,SAAS;AAAA,YACvB,WAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAED,WAAO,KAAK,cAAc,UAAU;AAEpC,UAAM,iBAAiB;AAAA,MACrB,WAAW,SAAS,aAAa,aAAa;AAAA,IAChD;AACA,UAAM,cAAc,OAAO,WAAW,SAAS,YAAY,aAAa,CAAC;AAEzE,UAAM,mBACJ,WAAW,SAAS,YAAY,mBAAmB;AACrD,UAAM,2BACJ,WAAW,SAAS,YAAY,UAAU;AAI5C,UAAM,iBAAiB,WAAW,MAAM,CAAC,GAAG;AAG5C,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAGA,QAAI,CAAC,WAAW,SAAS,cAAc,CAAC,WAAW,SAAS,aAAa;AACvE,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,eAAe,EAAE,MAAM,WAAW,MAAM,OAAO,CAAC;AAEpD,UAAM,yBACJ,OAAO,WAAW,gBAAgB,IAAI,qBACtC,SAAS;AAEX,UAAM,iCACJ,OAAO,wBAAwB,IAAI,6BACnC,SAAS;AAEX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,oBACG,WAAW,QAAQ,gBAAgB,KAAK,MACzC;AAAA,MACF,mBAAmB,oBAAoB,SAAS;AAAA,MAChD,2BAA2B,4BAA4B,SAAS;AAAA,MAChE,YAAY;AAAA,MACZ,sBAAsB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,MACpB,4BAA4B;AAAA,MAC5B;AAAA,MACA,uBAAuB,WAAW,QAAQ,YAAY,UAAU;AAAA;AAAA,MAChE;AAAA;AAAA,MACA,iBAAiB;AAAA;AAAA,MACjB,UAAU;AAAA,MACV,UAAU;AAAA,QACR,oBAAoB,YAChB,yBAAyB,SAAS,IACjC,WAAW,QAAQ,WAAW,UAAU;AAAA,QAC7C;AAAA,QACA,kBAAkB,YACb,WAAW,QAAQ,YAAY,UAAU,MAC1C,yBAAyB,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,uDACE,eAAe,QAAQ,IAAI,UAAU,KAAK,UAAU,GAAG,CACzD;AAAA,IACF;AAAA,EACF;AACF;;;AE/RA,sCAAkC;AAClC,kBAIO;AAuEA,SAAS,gBACd,eACA,YACA,iBAGA,UACc;AACd,aAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,aAAa,YAAY;AAC9B,YAAM,SAAS,MAAM,gBAAgB,WAAW;AAChD,UAAI;AACF,cAAM,YAAY,MAAM,WAAW,gBAAgB,QAAQ;AAAA,UACzD,GAAG;AAAA,UACH,YAAY;AAAA,QACd,CAAC;AAED,eAAO,EAAE,UAAU;AAAA,MACrB,SAAS,OAAO;AACd,YAAI,iBAAiB,kCAAsB;AACzC,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA,MAAM,MAAM,QAAQ,UAAU;AAAA,UAChC;AAAA,QACF;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["export {\n getRelayClient,\n initializeRelayClient,\n type InitializeRelayClientParams,\n} from './src/client'\nexport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_SOLANA_CHAIN_ID,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './src/constants'\nexport {\n type ExecuteRelayQuoteParams,\n type RelayAddress,\n type RelayChainId,\n type RelayExecutionStep,\n type RelayTxHash,\n type RelayVmType,\n type RelayWallet,\n executeRelayQuote,\n getRelayExecutionInfo,\n} from './src/execution'\nexport { parseRelayFees } from './src/fees'\nexport { getRelayAssetPriceInfo } from './src/price'\nexport {\n type GetRelayQuoteParams,\n type RelayQuote,\n getRelayQuote,\n} from './src/quote'\nexport {\n type SolanaAddress,\n type SolanaTxHash,\n type SolanaWallet,\n getSolanaWallet,\n} from './src/solana'\nexport {\n getRelayExecutionRefundState,\n getRelayExecutionState,\n isRelayExecutionTerminalStatus,\n convertFunToRelayTokenAddress,\n} from './src/utils'\nexport {\n LogLevel,\n type RelayExecutionInfo,\n type RelayExecutionStatus,\n type RelayTokenPriceInfo,\n} from './src/types'\n", "import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@reservoir0x/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 return createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n logger: (message) => {\n logger.info('[RelayClient]:', message)\n },\n })\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 '@reservoir0x/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 { RelayExecutionStatus } from './types'\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\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 * Wallet that receives the app fees collected by Relay\n */\nexport const FUN_RELAY_REVENUE_WALLET =\n '0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E' 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", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@reservoir0x/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport { getRelayClient } from './client'\nimport type { RELAY_SOLANA_CHAIN_ID } from './constants'\nimport type { RelayQuoteResult } from './quote'\nimport type { SolanaAddress, SolanaTxHash, SolanaWallet } from './solana'\nimport type { Logger, RelayExecutionInfo } from './types'\nimport { jsonStringifyWithBigIntSanitization } from './utils'\n\nexport type RelayExecutionStep = ProgressData['currentStep'] & {}\n\nexport type RelayVmType = 'evm' | 'solana'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n evm: Address\n solana: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n evm: string\n solana: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n evm: Hex\n solana: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n evm: WalletClient | AdaptedWallet\n solana: SolanaWallet\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\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\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 // 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 const txHash =\n typeof rawTxHashWithUnreliableTyping === 'object'\n ? rawTxHashWithUnreliableTyping.id\n : rawTxHashWithUnreliableTyping\n\n if (\n // Call onUserActionsCompleted only once\n !isUserActionsCompleted &&\n steps.every((step) =>\n step.items.every(\n // Step items may get batched - in which case there may not be a txHash in each, such items are marked as 'complete' directly instead\n // Also ensures that onUserActionsCompleted is always called before onTransactionConfirmed\n (item) => item.status === 'complete' || item.txHashes?.length,\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 // fire and forget index registration\n if (relayQuote.steps[0].requestId) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash,\n }),\n })\n }\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 interface PostRegistrationRequest {\n requestId: string\n chainId: string\n tx: string\n}\n\nexport type RegisterIndexingResponse =\n | { success: never; message: 'Success' }\n | { success: false; message: string }\n\nexport async function manuallyRegisterIndex(\n logger: Logger,\n registerRequest: PostRegistrationRequest,\n): Promise<void> {\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`[registerIndexing] request: ${stringifiedRequest}`)\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(\n `Error sending request to manually register index: ${JSON.stringify(response)}`,\n )\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${data.message}. Params: ${stringifiedRequest}`)\n }\n return\n } catch (err) {\n logger.error(\n `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}. Params: ${stringifiedRequest}`,\n )\n }\n}\n\nexport async function getRelayExecutionInfo(\n requestId: string,\n): Promise<RelayExecutionInfo> {\n const url = `${MAINNET_RELAY_API}/intents/status/v2?requestId=${requestId}`\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 as RelayExecutionInfo\n}\n", "import {\n FUNKIT_NATIVE_TOKEN,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\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} from './types'\n\n/**\n * Converts a token address within Funkit to the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n): RelayAddress<T> {\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\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 '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 'success':\n return CheckoutState.COMPLETED\n case 'failure':\n case '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", "import type { CallFees } from '@reservoir0x/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n}): Promise<FunRelayFeeItem> {\n const url = `https://frog.fun.xyz/api/fee?fromTokenAddress=${fromTokenAddress}&fromChainId=${fromChainId}&toTokenAddress=${toTokenAddress}&toChainId=${toChainId}&estUsdValue=${estUsdValue}&clientId=${clientId}`\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 logger,\n}: {\n fees: CallFees | undefined\n logger: Logger\n}) {\n // Gas fees, denominated in source chain native token\n const relayGasFeesUsd = Number.parseFloat(fees?.gas?.amountUsd || '0')\n\n // App fees, denominated in source chain token\n const funLpFeesUsd = Number.parseFloat(fees?.app?.amountUsd || '0')\n const funLpFeesFromAmount = Number.parseFloat(\n fees?.app?.amountFormatted || '0',\n )\n const funLpFeesFromAmountBaseUnit = BigInt(fees?.app?.amount || '0')\n\n // Relay fees, denominated in source chain token\n const relayLpFeesUsd = Number.parseFloat(fees?.relayer?.amountUsd || '0')\n const relayLpFeesFromAmount = Number.parseFloat(\n fees?.relayer?.amountFormatted || '0',\n )\n const relayLpFeesFromAmountBaseUnit = BigInt(fees?.relayer?.amount || '0')\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 '@reservoir0x/relay-sdk'\nimport type { RelayTokenPriceInfo } from './types'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${chainId}&address=${address}`\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 as RelayTokenPriceInfo\n}\n", "import type { Execute, GetQuoteParameters } from '@reservoir0x/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 { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\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\nexport type RelayQuoteResult<VmType extends RelayVmType> = Execute & {\n __vm: VmType\n}\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} & (\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}: {\n tokenChainId: string\n tokenAddress: string\n tokenAmountBaseUnit: string\n logger: Logger\n}) {\n try {\n const normalizedChainId = convertFunToRelayChainId(\n Number(tokenChainId),\n ).toString()\n const normalizedTokenAddress = convertFunToRelayTokenAddress(\n tokenAddress as Address,\n )\n\n const [tokenPriceRes, tokenInfoRes] = await Promise.all([\n getRelayAssetPriceInfo({\n chainId: normalizedChainId,\n address: normalizedTokenAddress,\n }),\n getRelayAssetInfo({\n chainId: normalizedChainId,\n address: normalizedTokenAddress,\n }),\n ])\n\n const price = tokenPriceRes.price\n const decimals = 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}: ${\n err instanceof Error ? err.message : JSON.stringify(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 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 userAddress,\n } = params\n\n try {\n const relayClient = getRelayClient()\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 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 })\n\n const feeInfo = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n })\n\n const appFeeBp = feeInfo.b + feeInfo.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n queryTokenAmountBaseUnit,\n txs,\n estUsdValue,\n feeInfo,\n appFeeBp,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote({\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n currency: convertFunToRelayTokenAddress(fromTokenAddress),\n toCurrency: convertFunToRelayTokenAddress(toTokenAddress),\n amount: queryTokenAmountBaseUnit.toString(),\n recipient: recipientAddress,\n tradeType: params.tradeType,\n user: userAddress,\n wallet: walletClient,\n ...(txs && { txs }),\n options: {\n referrer: clientId\n ? `${FUN_RELAY_REFERRER}|${clientId}`\n : FUN_RELAY_REFERRER,\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n ...options,\n },\n })\n\n logger.info('relayQuote', relayQuote)\n\n const estSubtotalUsd = Number(\n relayQuote.details?.currencyOut?.amountUsd || 0,\n )\n const estTotalUsd = 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\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({ fees: relayQuote.fees, logger })\n\n const estSubtotalFromAmount = (\n Number.parseFloat(fromAmountString) - 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,\n estTotalFromAmount: fromAmountString,\n estTotalFromAmountBaseUnit: fromAmountBaseUnitString,\n estTotalUsd,\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: relayQuote as RelayQuoteResult<SourceVmType>,\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n throw new Error(\n `An error occurred trying to generate a relay quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n", "import { MAINNET_RELAY_API } from '@reservoir0x/relay-sdk'\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\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [chainId],\n address,\n }\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 type { AdaptedWallet } from '@reservoir0x/relay-sdk'\nimport { adaptSolanaWallet } from '@reservoir0x/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 = AdaptedWallet & {\n address(): Promise<SolanaAddress>\n}\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"],
5
+ "mappings": "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",
6
6
  "names": ["import_relay_sdk", "import_relay_sdk", "import_relay_sdk", "import_relay_sdk"]
7
7
  }
package/dist/index.mjs CHANGED
@@ -12,6 +12,7 @@ import { LogLevel } from "@reservoir0x/relay-sdk";
12
12
  // src/constants.ts
13
13
  var RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809;
14
14
  var RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`;
15
+ var FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710;
15
16
  var FUNKIT_NATIVE_TOKEN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
16
17
  var RELAY_NATIVE_TOKEN = "0x0000000000000000000000000000000000000000";
17
18
  var FUN_RELAY_REVENUE_WALLET = "0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E";
@@ -65,6 +66,12 @@ function convertFunToRelayTokenAddress(address) {
65
66
  }
66
67
  return address;
67
68
  }
69
+ function convertFunToRelayChainId(chainId) {
70
+ if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {
71
+ return RELAY_SOLANA_CHAIN_ID_NUMBER;
72
+ }
73
+ return chainId;
74
+ }
68
75
  function getRelayExecutionRefundState(info) {
69
76
  switch (info.status) {
70
77
  case "refund":
@@ -333,14 +340,20 @@ async function getQuoteEstUsdValue({
333
340
  logger
334
341
  }) {
335
342
  try {
343
+ const normalizedChainId = convertFunToRelayChainId(
344
+ Number(tokenChainId)
345
+ ).toString();
346
+ const normalizedTokenAddress = convertFunToRelayTokenAddress(
347
+ tokenAddress
348
+ );
336
349
  const [tokenPriceRes, tokenInfoRes] = await Promise.all([
337
350
  getRelayAssetPriceInfo({
338
- chainId: tokenChainId,
339
- address: convertFunToRelayTokenAddress(tokenAddress)
351
+ chainId: normalizedChainId,
352
+ address: normalizedTokenAddress
340
353
  }),
341
354
  getRelayAssetInfo({
342
- chainId: tokenChainId,
343
- address: convertFunToRelayTokenAddress(tokenAddress)
355
+ chainId: normalizedChainId,
356
+ address: normalizedTokenAddress
344
357
  })
345
358
  ]);
346
359
  const price = tokenPriceRes.price;
@@ -412,8 +425,8 @@ async function getRelayQuote({
412
425
  appFeeBp
413
426
  });
414
427
  const relayQuote = await relayClient.actions.getQuote({
415
- chainId: Number(fromChainId),
416
- toChainId: Number(toChainId),
428
+ chainId: convertFunToRelayChainId(Number(fromChainId)),
429
+ toChainId: convertFunToRelayChainId(Number(toChainId)),
417
430
  currency: convertFunToRelayTokenAddress(fromTokenAddress),
418
431
  toCurrency: convertFunToRelayTokenAddress(toTokenAddress),
419
432
  amount: queryTokenAmountBaseUnit.toString(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client.ts", "../src/types.ts", "../src/constants.ts", "../src/execution.ts", "../src/utils.ts", "../src/fees.ts", "../src/price.ts", "../src/quote.ts", "../src/currency.ts", "../src/solana.ts"],
4
- "sourcesContent": ["import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@reservoir0x/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 return createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n logger: (message) => {\n logger.info('[RelayClient]:', message)\n },\n })\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 '@reservoir0x/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 { RelayExecutionStatus } from './types'\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\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 * Wallet that receives the app fees collected by Relay\n */\nexport const FUN_RELAY_REVENUE_WALLET =\n '0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E' 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", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@reservoir0x/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport { getRelayClient } from './client'\nimport type { RELAY_SOLANA_CHAIN_ID } from './constants'\nimport type { RelayQuoteResult } from './quote'\nimport type { SolanaAddress, SolanaTxHash, SolanaWallet } from './solana'\nimport type { Logger, RelayExecutionInfo } from './types'\nimport { jsonStringifyWithBigIntSanitization } from './utils'\n\nexport type RelayExecutionStep = ProgressData['currentStep'] & {}\n\nexport type RelayVmType = 'evm' | 'solana'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n evm: Address\n solana: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n evm: string\n solana: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n evm: Hex\n solana: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n evm: WalletClient | AdaptedWallet\n solana: SolanaWallet\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\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\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 // 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 const txHash =\n typeof rawTxHashWithUnreliableTyping === 'object'\n ? rawTxHashWithUnreliableTyping.id\n : rawTxHashWithUnreliableTyping\n\n if (\n // Call onUserActionsCompleted only once\n !isUserActionsCompleted &&\n steps.every((step) =>\n step.items.every(\n // Step items may get batched - in which case there may not be a txHash in each, such items are marked as 'complete' directly instead\n // Also ensures that onUserActionsCompleted is always called before onTransactionConfirmed\n (item) => item.status === 'complete' || item.txHashes?.length,\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 // fire and forget index registration\n if (relayQuote.steps[0].requestId) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash,\n }),\n })\n }\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 interface PostRegistrationRequest {\n requestId: string\n chainId: string\n tx: string\n}\n\nexport type RegisterIndexingResponse =\n | { success: never; message: 'Success' }\n | { success: false; message: string }\n\nexport async function manuallyRegisterIndex(\n logger: Logger,\n registerRequest: PostRegistrationRequest,\n): Promise<void> {\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`[registerIndexing] request: ${stringifiedRequest}`)\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(\n `Error sending request to manually register index: ${JSON.stringify(response)}`,\n )\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${data.message}. Params: ${stringifiedRequest}`)\n }\n return\n } catch (err) {\n logger.error(\n `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}. Params: ${stringifiedRequest}`,\n )\n }\n}\n\nexport async function getRelayExecutionInfo(\n requestId: string,\n): Promise<RelayExecutionInfo> {\n const url = `${MAINNET_RELAY_API}/intents/status/v2?requestId=${requestId}`\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 as RelayExecutionInfo\n}\n", "import {\n FUNKIT_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n} from './types'\n\n/**\n * Converts a token address within Funkit the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n): RelayAddress<T> {\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n\n return address\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case '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 'success':\n return CheckoutState.COMPLETED\n case 'failure':\n case '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", "import type { CallFees } from '@reservoir0x/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n}): Promise<FunRelayFeeItem> {\n const url = `https://frog.fun.xyz/api/fee?fromTokenAddress=${fromTokenAddress}&fromChainId=${fromChainId}&toTokenAddress=${toTokenAddress}&toChainId=${toChainId}&estUsdValue=${estUsdValue}&clientId=${clientId}`\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 logger,\n}: {\n fees: CallFees | undefined\n logger: Logger\n}) {\n // Gas fees, denominated in source chain native token\n const relayGasFeesUsd = Number.parseFloat(fees?.gas?.amountUsd || '0')\n\n // App fees, denominated in source chain token\n const funLpFeesUsd = Number.parseFloat(fees?.app?.amountUsd || '0')\n const funLpFeesFromAmount = Number.parseFloat(\n fees?.app?.amountFormatted || '0',\n )\n const funLpFeesFromAmountBaseUnit = BigInt(fees?.app?.amount || '0')\n\n // Relay fees, denominated in source chain token\n const relayLpFeesUsd = Number.parseFloat(fees?.relayer?.amountUsd || '0')\n const relayLpFeesFromAmount = Number.parseFloat(\n fees?.relayer?.amountFormatted || '0',\n )\n const relayLpFeesFromAmountBaseUnit = BigInt(fees?.relayer?.amount || '0')\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 '@reservoir0x/relay-sdk'\nimport type { RelayTokenPriceInfo } from './types'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${chainId}&address=${address}`\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 as RelayTokenPriceInfo\n}\n", "import type { Execute, GetQuoteParameters } from '@reservoir0x/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 { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport { convertFunToRelayTokenAddress } from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = Execute & {\n __vm: VmType\n}\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} & (\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}: {\n tokenChainId: string\n tokenAddress: string\n tokenAmountBaseUnit: string\n logger: Logger\n}) {\n try {\n const [tokenPriceRes, tokenInfoRes] = await Promise.all([\n getRelayAssetPriceInfo({\n chainId: tokenChainId,\n address: convertFunToRelayTokenAddress(tokenAddress as Address),\n }),\n getRelayAssetInfo({\n chainId: tokenChainId,\n address: convertFunToRelayTokenAddress(tokenAddress as Address),\n }),\n ])\n\n const price = tokenPriceRes.price\n const decimals = 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}: ${\n err instanceof Error ? err.message : JSON.stringify(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 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 userAddress,\n } = params\n\n try {\n const relayClient = getRelayClient()\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 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 })\n\n const feeInfo = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n })\n\n const appFeeBp = feeInfo.b + feeInfo.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n queryTokenAmountBaseUnit,\n txs,\n estUsdValue,\n feeInfo,\n appFeeBp,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote({\n chainId: Number(fromChainId),\n toChainId: Number(toChainId),\n currency: convertFunToRelayTokenAddress(fromTokenAddress),\n toCurrency: convertFunToRelayTokenAddress(toTokenAddress),\n amount: queryTokenAmountBaseUnit.toString(),\n recipient: recipientAddress,\n tradeType: params.tradeType,\n user: userAddress,\n wallet: walletClient,\n ...(txs && { txs }),\n options: {\n referrer: clientId\n ? `${FUN_RELAY_REFERRER}|${clientId}`\n : FUN_RELAY_REFERRER,\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n ...options,\n },\n })\n\n logger.info('relayQuote', relayQuote)\n\n const estSubtotalUsd = Number(\n relayQuote.details?.currencyOut?.amountUsd || 0,\n )\n const estTotalUsd = 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\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({ fees: relayQuote.fees, logger })\n\n const estSubtotalFromAmount = (\n Number.parseFloat(fromAmountString) - 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,\n estTotalFromAmount: fromAmountString,\n estTotalFromAmountBaseUnit: fromAmountBaseUnitString,\n estTotalUsd,\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: relayQuote as RelayQuoteResult<SourceVmType>,\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n throw new Error(\n `An error occurred trying to generate a relay quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n", "import { MAINNET_RELAY_API } from '@reservoir0x/relay-sdk'\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\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [chainId],\n address,\n }\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 type { AdaptedWallet } from '@reservoir0x/relay-sdk'\nimport { adaptSolanaWallet } from '@reservoir0x/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 = AdaptedWallet & {\n address(): Promise<SolanaAddress>\n}\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@reservoir0x/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 return createClient({\n ...options,\n baseApiUrl: MAINNET_RELAY_API,\n chains: [\n ...chains.map(convertViemChainToRelayChain),\n {\n id: RELAY_SOLANA_CHAIN_ID_NUMBER,\n name: 'Solana',\n displayName: 'Solana',\n },\n ],\n logger: (message) => {\n logger.info('[RelayClient]:', message)\n },\n })\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 '@reservoir0x/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 { RelayExecutionStatus } from './types'\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\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 * Wallet that receives the app fees collected by Relay\n */\nexport const FUN_RELAY_REVENUE_WALLET =\n '0xb61562d83aEC43a050A06BED12Ac2bD8f9BFfd5E' 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", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@reservoir0x/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport { getRelayClient } from './client'\nimport type { RELAY_SOLANA_CHAIN_ID } from './constants'\nimport type { RelayQuoteResult } from './quote'\nimport type { SolanaAddress, SolanaTxHash, SolanaWallet } from './solana'\nimport type { Logger, RelayExecutionInfo } from './types'\nimport { jsonStringifyWithBigIntSanitization } from './utils'\n\nexport type RelayExecutionStep = ProgressData['currentStep'] & {}\n\nexport type RelayVmType = 'evm' | 'solana'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n evm: Address\n solana: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n evm: string\n solana: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n evm: Hex\n solana: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n evm: WalletClient | AdaptedWallet\n solana: SolanaWallet\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\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\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 // 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 const txHash =\n typeof rawTxHashWithUnreliableTyping === 'object'\n ? rawTxHashWithUnreliableTyping.id\n : rawTxHashWithUnreliableTyping\n\n if (\n // Call onUserActionsCompleted only once\n !isUserActionsCompleted &&\n steps.every((step) =>\n step.items.every(\n // Step items may get batched - in which case there may not be a txHash in each, such items are marked as 'complete' directly instead\n // Also ensures that onUserActionsCompleted is always called before onTransactionConfirmed\n (item) => item.status === 'complete' || item.txHashes?.length,\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 // fire and forget index registration\n if (relayQuote.steps[0].requestId) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash,\n }),\n })\n }\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 interface PostRegistrationRequest {\n requestId: string\n chainId: string\n tx: string\n}\n\nexport type RegisterIndexingResponse =\n | { success: never; message: 'Success' }\n | { success: false; message: string }\n\nexport async function manuallyRegisterIndex(\n logger: Logger,\n registerRequest: PostRegistrationRequest,\n): Promise<void> {\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`[registerIndexing] request: ${stringifiedRequest}`)\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(\n `Error sending request to manually register index: ${JSON.stringify(response)}`,\n )\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${data.message}. Params: ${stringifiedRequest}`)\n }\n return\n } catch (err) {\n logger.error(\n `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}. Params: ${stringifiedRequest}`,\n )\n }\n}\n\nexport async function getRelayExecutionInfo(\n requestId: string,\n): Promise<RelayExecutionInfo> {\n const url = `${MAINNET_RELAY_API}/intents/status/v2?requestId=${requestId}`\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 as RelayExecutionInfo\n}\n", "import {\n FUNKIT_NATIVE_TOKEN,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\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} from './types'\n\n/**\n * Converts a token address within Funkit to the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n): RelayAddress<T> {\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\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 '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 'success':\n return CheckoutState.COMPLETED\n case 'failure':\n case '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", "import type { CallFees } from '@reservoir0x/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n}): Promise<FunRelayFeeItem> {\n const url = `https://frog.fun.xyz/api/fee?fromTokenAddress=${fromTokenAddress}&fromChainId=${fromChainId}&toTokenAddress=${toTokenAddress}&toChainId=${toChainId}&estUsdValue=${estUsdValue}&clientId=${clientId}`\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 logger,\n}: {\n fees: CallFees | undefined\n logger: Logger\n}) {\n // Gas fees, denominated in source chain native token\n const relayGasFeesUsd = Number.parseFloat(fees?.gas?.amountUsd || '0')\n\n // App fees, denominated in source chain token\n const funLpFeesUsd = Number.parseFloat(fees?.app?.amountUsd || '0')\n const funLpFeesFromAmount = Number.parseFloat(\n fees?.app?.amountFormatted || '0',\n )\n const funLpFeesFromAmountBaseUnit = BigInt(fees?.app?.amount || '0')\n\n // Relay fees, denominated in source chain token\n const relayLpFeesUsd = Number.parseFloat(fees?.relayer?.amountUsd || '0')\n const relayLpFeesFromAmount = Number.parseFloat(\n fees?.relayer?.amountFormatted || '0',\n )\n const relayLpFeesFromAmountBaseUnit = BigInt(fees?.relayer?.amount || '0')\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 '@reservoir0x/relay-sdk'\nimport type { RelayTokenPriceInfo } from './types'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${chainId}&address=${address}`\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 as RelayTokenPriceInfo\n}\n", "import type { Execute, GetQuoteParameters } from '@reservoir0x/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 { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\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\nexport type RelayQuoteResult<VmType extends RelayVmType> = Execute & {\n __vm: VmType\n}\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} & (\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}: {\n tokenChainId: string\n tokenAddress: string\n tokenAmountBaseUnit: string\n logger: Logger\n}) {\n try {\n const normalizedChainId = convertFunToRelayChainId(\n Number(tokenChainId),\n ).toString()\n const normalizedTokenAddress = convertFunToRelayTokenAddress(\n tokenAddress as Address,\n )\n\n const [tokenPriceRes, tokenInfoRes] = await Promise.all([\n getRelayAssetPriceInfo({\n chainId: normalizedChainId,\n address: normalizedTokenAddress,\n }),\n getRelayAssetInfo({\n chainId: normalizedChainId,\n address: normalizedTokenAddress,\n }),\n ])\n\n const price = tokenPriceRes.price\n const decimals = 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}: ${\n err instanceof Error ? err.message : JSON.stringify(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 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 userAddress,\n } = params\n\n try {\n const relayClient = getRelayClient()\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 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 })\n\n const feeInfo = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n })\n\n const appFeeBp = feeInfo.b + feeInfo.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n queryTokenAmountBaseUnit,\n txs,\n estUsdValue,\n feeInfo,\n appFeeBp,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote({\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n currency: convertFunToRelayTokenAddress(fromTokenAddress),\n toCurrency: convertFunToRelayTokenAddress(toTokenAddress),\n amount: queryTokenAmountBaseUnit.toString(),\n recipient: recipientAddress,\n tradeType: params.tradeType,\n user: userAddress,\n wallet: walletClient,\n ...(txs && { txs }),\n options: {\n referrer: clientId\n ? `${FUN_RELAY_REFERRER}|${clientId}`\n : FUN_RELAY_REFERRER,\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n ...options,\n },\n })\n\n logger.info('relayQuote', relayQuote)\n\n const estSubtotalUsd = Number(\n relayQuote.details?.currencyOut?.amountUsd || 0,\n )\n const estTotalUsd = 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\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({ fees: relayQuote.fees, logger })\n\n const estSubtotalFromAmount = (\n Number.parseFloat(fromAmountString) - 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,\n estTotalFromAmount: fromAmountString,\n estTotalFromAmountBaseUnit: fromAmountBaseUnitString,\n estTotalUsd,\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: relayQuote as RelayQuoteResult<SourceVmType>,\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n throw new Error(\n `An error occurred trying to generate a relay quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n", "import { MAINNET_RELAY_API } from '@reservoir0x/relay-sdk'\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\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [chainId],\n address,\n }\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 type { AdaptedWallet } from '@reservoir0x/relay-sdk'\nimport { adaptSolanaWallet } from '@reservoir0x/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 = AdaptedWallet & {\n address(): Promise<SolanaAddress>\n}\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"],
5
+ "mappings": "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",
6
6
  "names": ["MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API"]
7
7
  }
@@ -6,6 +6,7 @@ import { RelayExecutionStatus } from './types';
6
6
  */
7
7
  export declare const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809;
8
8
  export declare const RELAY_SOLANA_CHAIN_ID = "792703809";
9
+ export declare const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710;
9
10
  /**
10
11
  * Fake address for a chain's native currency used by Funkit
11
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,qBAAqB,cAAoC,CAAA;AAEtE;;GAEG;AACH,eAAO,MAAM,mBAAmB,+CACgC,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,kBAAkB,+CACiC,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,wBAAwB,+CAC2B,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C;;GAEG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAA;AAEzD,eAAO,MAAM,uBAAuB,EAAE,oBAAoB,EAIzD,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,qBAAqB,cAAoC,CAAA;AAEtE,eAAO,MAAM,0BAA0B,mBAAmB,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,mBAAmB,+CACgC,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,kBAAkB,+CACiC,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,wBAAwB,+CAC2B,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C;;GAEG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAA;AAEzD,eAAO,MAAM,uBAAuB,EAAE,oBAAoB,EAIzD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../src/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AASzE,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,MAAM,EACP,MAAM,SAAS,CAAA;AAGhB,KAAK,iBAAiB,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAA;AAE3D,MAAM,MAAM,gBAAgB,CAAC,MAAM,SAAS,WAAW,IAAI,OAAO,GAAG;IACnE,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C;IACF,YAAY,CAAC,EAAE,6BAA6B,EAAE,CAAA;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACvC,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACxD,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACrC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IAC1C,SAAS,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC7D,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACnD,YAAY,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;CACzC,GAAG,CACA;IACE,uBAAuB,EAAE,MAAM,GAAG,MAAM,CAAA;IACxC,SAAS,EAAE,aAAa,CAAA;CACzB,GACD;IACE,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAAA;IACtC,SAAS,EAAE,cAAc,GAAG,iBAAiB,CAAA;CAC9C,CACJ,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAC7D,qBAAqB,GAAG;IACtB,yCAAyC;IACzC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,CAAA;QAC1B,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACpC,gBAAgB,EAAE,MAAM,CAAA;KACzB,CAAA;CACF,CAAA;AAyCH,wBAAsB,aAAa,CACjC,YAAY,SAAS,WAAW,EAChC,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,MAAM,EACN,YAAY,EACZ,GAAG,MAAM,EACV,EAAE,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO,CAC1D,UAAU,CAAC,YAAY,CAAC,CACzB,CAwKA"}
1
+ {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../src/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AASzE,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,MAAM,EACP,MAAM,SAAS,CAAA;AAMhB,KAAK,iBAAiB,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAA;AAE3D,MAAM,MAAM,gBAAgB,CAAC,MAAM,SAAS,WAAW,IAAI,OAAO,GAAG;IACnE,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C;IACF,YAAY,CAAC,EAAE,6BAA6B,EAAE,CAAA;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACvC,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACxD,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IACrC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,CAAA;IAC1C,SAAS,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC7D,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACnD,YAAY,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;CACzC,GAAG,CACA;IACE,uBAAuB,EAAE,MAAM,GAAG,MAAM,CAAA;IACxC,SAAS,EAAE,aAAa,CAAA;CACzB,GACD;IACE,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAAA;IACtC,SAAS,EAAE,cAAc,GAAG,iBAAiB,CAAA;CAC9C,CACJ,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAC7D,qBAAqB,GAAG;IACtB,yCAAyC;IACzC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,CAAA;QAC1B,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACpC,gBAAgB,EAAE,MAAM,CAAA;KACzB,CAAA;CACF,CAAA;AAgDH,wBAAsB,aAAa,CACjC,YAAY,SAAS,WAAW,EAChC,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,MAAM,EACN,YAAY,EACZ,GAAG,MAAM,EACV,EAAE,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO,CAC1D,UAAU,CAAC,YAAY,CAAC,CACzB,CAwKA"}
@@ -1,9 +1,13 @@
1
1
  import type { RelayAddress, RelayVmType } from './execution';
2
2
  import { CheckoutRefundState, CheckoutState, type RelayExecutionInfo } from './types';
3
3
  /**
4
- * Converts a token address within Funkit the corresponding Relay token address.
4
+ * Converts a token address within Funkit to the corresponding Relay token address.
5
5
  */
6
6
  export declare function convertFunToRelayTokenAddress<T extends RelayVmType>(address: RelayAddress<T>): RelayAddress<T>;
7
+ /**
8
+ * Converts a chainId within Funkit to the corresponding Relay chainId.
9
+ */
10
+ export declare function convertFunToRelayChainId(chainId: number): number;
7
11
  export declare function getRelayExecutionRefundState(info: RelayExecutionInfo): CheckoutRefundState | undefined;
8
12
  export declare function getRelayExecutionState(info: RelayExecutionInfo): CheckoutState;
9
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,WAAW,EACjE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,YAAY,CAAC,CAAC,CAAC,CAMjB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,kBAAkB,GACvB,mBAAmB,GAAG,SAAS,CAOjC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,kBAAkB,GACvB,aAAa,CAUf;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAET;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,GACN,MAAM,GACN,IAAI,GACJ,MAAM,GACN,YAAY,EAAE,CAAA;AAElB,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GACzB,MAAM,CAMR"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,WAAW,EACjE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,YAAY,CAAC,CAAC,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,kBAAkB,GACvB,mBAAmB,GAAG,SAAS,CAOjC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,kBAAkB,GACvB,aAAa,CAUf;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAET;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,GACN,MAAM,GACN,IAAI,GACJ,MAAM,GACN,YAAY,EAAE,CAAA;AAElB,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GACzB,MAAM,CAMR"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funkit/fun-relay",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "files": [
5
5
  "dist/src",
6
6
  "dist/index.d.ts",