@funkit/fun-relay 2.1.3 → 2.1.4-next.1
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 +13 -0
- package/dist/index.js +57 -10
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +58 -10
- package/dist/index.mjs.map +3 -3
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/execution.d.ts +6 -1
- package/dist/src/execution.d.ts.map +1 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/package.json +7 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @funkit/fun-relay
|
|
2
2
|
|
|
3
|
+
## 2.1.4-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- chore: more account abstraction stuff, should not be merged into master before cleaned up
|
|
8
|
+
|
|
9
|
+
## 2.1.4-next.0
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- febe9b7: chore(fun-relay): additional options for account abstraction flow
|
|
14
|
+
- 6b531a6: chore: bump relay deps
|
|
15
|
+
|
|
3
16
|
## 2.1.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -111,8 +111,12 @@ function initializeRelayClient({
|
|
|
111
111
|
displayName: "Solana"
|
|
112
112
|
}
|
|
113
113
|
],
|
|
114
|
-
logger: (message) => {
|
|
115
|
-
|
|
114
|
+
logger: (message, level) => {
|
|
115
|
+
if (level === import_relay_sdk2.LogLevel.Error) {
|
|
116
|
+
logger.error("[RelayClient]:", message);
|
|
117
|
+
} else {
|
|
118
|
+
logger.info("[RelayClient]:", message);
|
|
119
|
+
}
|
|
116
120
|
}
|
|
117
121
|
});
|
|
118
122
|
}
|
|
@@ -151,7 +155,7 @@ function convertFunToRelayChainId(chainId) {
|
|
|
151
155
|
}
|
|
152
156
|
function getRelayExecutionRefundState(info) {
|
|
153
157
|
switch (info.status) {
|
|
154
|
-
case "refund"
|
|
158
|
+
case "refund" /* REFUND */:
|
|
155
159
|
return "REFUNDED" /* REFUNDED */;
|
|
156
160
|
default:
|
|
157
161
|
return void 0;
|
|
@@ -159,10 +163,10 @@ function getRelayExecutionRefundState(info) {
|
|
|
159
163
|
}
|
|
160
164
|
function getRelayExecutionState(info) {
|
|
161
165
|
switch (info.status) {
|
|
162
|
-
case "success"
|
|
166
|
+
case "success" /* SUCCESS */:
|
|
163
167
|
return "COMPLETED" /* COMPLETED */;
|
|
164
|
-
case "failure"
|
|
165
|
-
case "refund"
|
|
168
|
+
case "failure" /* FAILURE */:
|
|
169
|
+
case "refund" /* REFUND */:
|
|
166
170
|
return "CHECKOUT_ERROR" /* CHECKOUT_ERROR */;
|
|
167
171
|
default:
|
|
168
172
|
return "PENDING_RECEIVAL" /* PENDING_RECEIVAL */;
|
|
@@ -180,6 +184,33 @@ function jsonStringifyWithBigIntSanitization(serializable) {
|
|
|
180
184
|
}
|
|
181
185
|
|
|
182
186
|
// src/execution.ts
|
|
187
|
+
function getFinalTxHash({
|
|
188
|
+
smartWalletAdapter,
|
|
189
|
+
steps,
|
|
190
|
+
fallbackTxHash,
|
|
191
|
+
logger,
|
|
192
|
+
logPrefix
|
|
193
|
+
}) {
|
|
194
|
+
if (!smartWalletAdapter) {
|
|
195
|
+
return fallbackTxHash;
|
|
196
|
+
}
|
|
197
|
+
logger.info(`${logPrefix}:extractingTxHashFromReceipt`, {
|
|
198
|
+
message: "Smart wallet adapter detected, extracting txHash from receipt"
|
|
199
|
+
});
|
|
200
|
+
const receipt = steps[0].items[0].receipt;
|
|
201
|
+
if (receipt && "transactionHash" in receipt) {
|
|
202
|
+
const finalTxHash = receipt.transactionHash;
|
|
203
|
+
logger.info(`${logPrefix}:extractedTxHashFromReceipt`, {
|
|
204
|
+
originalTxHash: fallbackTxHash,
|
|
205
|
+
finalTxHash
|
|
206
|
+
});
|
|
207
|
+
return finalTxHash;
|
|
208
|
+
}
|
|
209
|
+
logger.error(`${logPrefix}:missingReceiptOrTransactionHash`, {
|
|
210
|
+
message: "Smart wallet transaction missing receipt or transactionHash"
|
|
211
|
+
});
|
|
212
|
+
return fallbackTxHash;
|
|
213
|
+
}
|
|
183
214
|
async function executeRelayQuote({
|
|
184
215
|
logger,
|
|
185
216
|
onError,
|
|
@@ -187,7 +218,8 @@ async function executeRelayQuote({
|
|
|
187
218
|
onTransactionConfirmed,
|
|
188
219
|
onUserActionsCompleted,
|
|
189
220
|
relayQuote,
|
|
190
|
-
walletClient
|
|
221
|
+
walletClient,
|
|
222
|
+
smartWalletAdapter = false
|
|
191
223
|
}) {
|
|
192
224
|
let isUserActionsCompleted = false;
|
|
193
225
|
let isTransactionConfirmed = false;
|
|
@@ -203,6 +235,7 @@ async function executeRelayQuote({
|
|
|
203
235
|
txHashes,
|
|
204
236
|
details,
|
|
205
237
|
error
|
|
238
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: remove before merging into main
|
|
206
239
|
}) => {
|
|
207
240
|
const logPrefix = "onRelayProgress";
|
|
208
241
|
logger.info(`${logPrefix}:params`, {
|
|
@@ -241,8 +274,15 @@ async function executeRelayQuote({
|
|
|
241
274
|
) {
|
|
242
275
|
logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes);
|
|
243
276
|
isUserActionsCompleted = true;
|
|
277
|
+
const finalTxHash = getFinalTxHash({
|
|
278
|
+
smartWalletAdapter,
|
|
279
|
+
steps,
|
|
280
|
+
fallbackTxHash: txHash,
|
|
281
|
+
logger,
|
|
282
|
+
logPrefix
|
|
283
|
+
});
|
|
244
284
|
try {
|
|
245
|
-
await onUserActionsCompleted?.(
|
|
285
|
+
await onUserActionsCompleted?.(finalTxHash);
|
|
246
286
|
} catch (e) {
|
|
247
287
|
logger.error(
|
|
248
288
|
`${logPrefix}:onUserActionsCompletedFailed`,
|
|
@@ -258,7 +298,14 @@ async function executeRelayQuote({
|
|
|
258
298
|
) {
|
|
259
299
|
logger.info(`${logPrefix}:onTransactionConfirmed`, txHashes);
|
|
260
300
|
isTransactionConfirmed = true;
|
|
261
|
-
|
|
301
|
+
const finalTxHash = getFinalTxHash({
|
|
302
|
+
smartWalletAdapter,
|
|
303
|
+
steps,
|
|
304
|
+
fallbackTxHash: txHash,
|
|
305
|
+
logger,
|
|
306
|
+
logPrefix
|
|
307
|
+
});
|
|
308
|
+
if (!smartWalletAdapter) {
|
|
262
309
|
manuallyRegisterIndex(logger, {
|
|
263
310
|
requestId: relayQuote.steps[0].requestId,
|
|
264
311
|
chainId: relayQuote.steps[0].items[0].data.chainId,
|
|
@@ -269,7 +316,7 @@ async function executeRelayQuote({
|
|
|
269
316
|
});
|
|
270
317
|
}
|
|
271
318
|
try {
|
|
272
|
-
await onTransactionConfirmed?.(
|
|
319
|
+
await onTransactionConfirmed?.(finalTxHash);
|
|
273
320
|
} catch (e) {
|
|
274
321
|
logger.error(
|
|
275
322
|
`${logPrefix}:onTransactionConfirmedFailed`,
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/bitcoin.ts", "../src/client.ts", "../src/types.ts", "../src/constants.ts", "../src/execution.ts", "../src/utils.ts", "../src/fees.ts", "../src/price.ts", "../src/currency.ts", "../src/quote.ts", "../src/solana.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n type BitcoinAddress,\n type BitcoinPsbt,\n type BitcoinPsbtDynamicParams,\n type BitcoinTxHash,\n type BitcoinWallet,\n getBitcoinWallet,\n getBitcoinWalletFromSigner,\n} from './src/bitcoin'\nexport {\n getRelayClient,\n initializeRelayClient,\n type InitializeRelayClientParams,\n} from './src/client'\nexport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_BITCOIN_CHAIN_ID,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN,\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 { getRelayAssetInfo } from './src/currency'\nexport {\n type GetRelayQuoteParams,\n type RelayQuote,\n getRelayQuote,\n getReferrer,\n RelayQuoteClientError,\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 convertFunToRelayChainId,\n} from './src/utils'\nexport {\n LogLevel,\n type RelayExecutionInfo,\n type RelayExecutionStatus,\n type RelayTokenPriceInfo,\n} from './src/types'\n", "import { adaptBitcoinWallet } from '@relayprotocol/relay-bitcoin-wallet-adapter'\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk'\n\ntype Base16 =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n\nexport type BitcoinAddress =\n | `1${string}`\n | `3${string}`\n | `bc1${string}`\n | `bc1p${string}`\n\nexport type BitcoinTxHash = `${Base16}${string}`\n\nexport type BitcoinWallet = {\n address(): Promise<BitcoinAddress>\n vmType: 'bvm'\n} & AdaptedWallet\n\n/** bitcoinjs-lib Psbt */\nexport type BitcoinPsbt = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[1]\n\nexport type BitcoinPsbtDynamicParams = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[2]\n\n/** bitcoinjs-lib Signer */\nexport type BitcoinSigner = Parameters<BitcoinPsbt['signAllInputs']>[0]\n\nexport function getBitcoinWallet(\n walletAddress: BitcoinAddress,\n signPsbt: (\n address: BitcoinAddress,\n psbt: BitcoinPsbt,\n dynamicParams: BitcoinPsbtDynamicParams,\n ) => Promise<string>,\n): BitcoinWallet {\n return adaptBitcoinWallet(walletAddress, (address, psbt, dynamicParams) =>\n signPsbt(address as BitcoinAddress, psbt, dynamicParams),\n ) as BitcoinWallet\n}\n\nexport function getBitcoinWalletFromSigner(\n walletAddress: BitcoinAddress,\n signer: BitcoinSigner,\n): BitcoinWallet {\n return getBitcoinWallet(walletAddress, async (_, psbt) =>\n psbt.signAllInputs(signer).toBase64(),\n )\n}\n", "import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\nimport type { Logger } from './types'\n\nexport type InitializeRelayClientParams = Omit<\n RelayClientOptions,\n 'baseApiUrl' | 'chains' | 'logger'\n> & {\n chains: Chain[]\n logger: Logger\n}\n\n/**\n * Initializes a global instance of the RelayClient\n * https://docs.relay.link/references/sdk/createClient\n */\nexport function initializeRelayClient({\n chains,\n logger,\n ...options\n}: InitializeRelayClientParams): RelayClient {\n 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 '@relayprotocol/relay-sdk'\nimport type { Abi, Address } from 'viem'\n\nexport { LogLevel }\n\n// https://docs.relay.link/references/api/get-intents-status-v2\nexport interface RelayExecutionInfo {\n status: RelayExecutionStatus\n details: string\n /** Incoming transaction hashes */\n inTxHashes: string[]\n /** Outgoing transaction hashes */\n txHashes: string[]\n /** The last timestamp the data was updated in milliseconds */\n time: number\n originChainId: number\n destinationChainId: number\n}\n\n// https://docs.relay.link/references/api/get-token-price\nexport interface RelayTokenPriceInfo {\n price: number\n}\n\n//// The types below are duplicated from @funkit/api-base atm, but this package should be used in BE as well\n//// TODO: Are we fine with BE importing @funkit/api-base and (by extension) @funkit/utils?\n//// See https://linear.app/funxyz/issue/PE-1342/sdk-extract-domainsrelayts-to-a-new-package#comment-d487d533\n\nexport interface Logger {\n error(message: string, data?: object): void\n info(message: string, data?: object): void\n}\n\n// Reference: https://github.com/reservoirprotocol/relay-kit/blob/211c645f9702a3b459ff545aa4e2e9d536c38455/packages/sdk/src/types/Execute.ts#L54-L61\nexport enum RelayExecutionStatus {\n DELAYED = 'delayed',\n FAILURE = 'failure',\n PENDING = 'pending',\n REFUND = 'refund',\n SUCCESS = 'success',\n WAITING = 'waiting',\n UNKNOWN = 'unknown',\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n\n // Any additional fields purely for frontend use\n metadata?: { [key: string]: unknown }\n}\n", "import type { Address } from 'viem'\nimport type { BitcoinAddress } from './bitcoin'\nimport type { SolanaAddress } from './solana'\nimport { RelayExecutionStatus } from './types'\n\n/**\n * Chain id that Relay uses to identify Bitcoin\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_BITCOIN_CHAIN_ID_NUMBER = 8253038 // Why cannot Relay export this themselves... -.-\nexport const RELAY_BITCOIN_CHAIN_ID = `${RELAY_BITCOIN_CHAIN_ID_NUMBER}`\n\n/**\n * Chain id that Relay uses to identify Solana\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809 // Why cannot Relay export this themselves... -.-\nexport const RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`\n\nexport const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710\nexport const FUN_HYPERCORE_CHAIN_ID_NUMBER = 1337\n\n/**\n * Fake address for a chain's native currency used by Funkit\n */\nexport const FUNKIT_NATIVE_TOKEN =\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' satisfies Address\n\n/**\n * Fake address for a chain's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN =\n '0x0000000000000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Hypercore's native currency used by Relay. This is shorter than the default native token...\n */\nexport const RELAY_NATIVE_TOKEN_HYPERCORE =\n '0x00000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_SOLANA =\n '11111111111111111111111111111111' satisfies SolanaAddress\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_BITCOIN =\n 'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8' satisfies BitcoinAddress\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\nexport const SUSHI_ORG_ID = 'fysix7gj5j'\nexport const HYPERSWAP_ORG_ID = '2ejzdxhfge'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\n", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@relayprotocol/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport type { BitcoinAddress, BitcoinTxHash, BitcoinWallet } from './bitcoin'\nimport { getRelayClient } from './client'\nimport type { RELAY_BITCOIN_CHAIN_ID, 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 = 'bvm' | 'evm' | 'svm'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinAddress\n evm: Address\n svm: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n bvm: typeof RELAY_BITCOIN_CHAIN_ID\n evm: string\n svm: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinTxHash\n evm: Hex\n svm: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinWallet\n evm: WalletClient | (AdaptedWallet & { vmType: 'evm' })\n svm: 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 // 'completed' - catch-all for items marked completed with no other info\n // - e.g. Batched items will not have txHash but will have their item marked 'complete'\n // 'pending' - for origin chain transactions that have been included on chain\n // - may sometimes be skipped, hence the need for 'submitted' condition below\n // 'submitted' - for destination chain transactions that have been submitted to the network\n // receipt - is present when the transaction has been mined/confirmed\n // Ensure onUserActionsCompleted is always called before onTransactionConfirmed\n (item) =>\n item.status === 'complete' ||\n item.checkStatus === 'pending' ||\n item.checkStatus === 'submitted' ||\n item.receipt !== undefined,\n ),\n )\n ) {\n logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes)\n isUserActionsCompleted = true\n\n try {\n await onUserActionsCompleted?.(txHash)\n } catch (e) {\n logger.error(\n `${logPrefix}:onUserActionsCompletedFailed`,\n e as Error,\n )\n }\n }\n\n if (\n // Call onTransactionConfirmed only once\n !isTransactionConfirmed &&\n steps.every((step) =>\n step.items.every((item) => item.status === 'complete'),\n )\n ) {\n logger.info(`${logPrefix}:onTransactionConfirmed`, txHashes)\n isTransactionConfirmed = true\n\n // 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 logPrefix = 'manuallyRegisterIndex'\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`${logPrefix}:onManuallyRegisterIndex`, {\n params: stringifiedRequest,\n })\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: 'Error !response.ok - request to manually register index',\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Data.message is not of type Success - ${data.message}`,\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n }\n return\n } catch (err) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}`,\n 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_HYPERCORE_CHAIN_ID_NUMBER,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN_SOLANA,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n} 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 chainId: number,\n): RelayAddress<T> {\n // convert Fun's NATIVE_TOKEN representation\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n switch (chainId) {\n case FUN_HYPERCORE_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_HYPERCORE as RelayAddress<T>\n\n case RELAY_BITCOIN_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_BITCOIN as RelayAddress<T>\n\n case RELAY_SOLANA_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_SOLANA as RelayAddress<T>\n\n default:\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n }\n\n return address\n}\n\n/**\n * Converts a chainId within Funkit to the corresponding Relay chainId.\n */\nexport function convertFunToRelayChainId(chainId: number): number {\n if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {\n return RELAY_SOLANA_CHAIN_ID_NUMBER\n }\n return chainId\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case '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 '@relayprotocol/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n config: {\n options: Record<string, unknown>\n }\n headers: Record<string, string>\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n recipientAddress,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n recipientAddress: string | undefined\n}): Promise<FunRelayFeeItem> {\n const params = new URLSearchParams({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: estUsdValue.toString(),\n clientId,\n ...(recipientAddress ? { recipientAddress } : {}),\n })\n const url = `https://frog.fun.xyz/api/fee?${params.toString()}`\n const response = await fetch(url)\n if (!response.ok) {\n throw Error(response.statusText)\n }\n\n const data = await response.json()\n return data\n}\n\nexport function parseRelayFees({\n fees,\n 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 '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport type { RelayTokenPriceInfo } from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${relayChainId}&address=${relayTokenAddress}`\n const 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 { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport interface RelayTokenInfo {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n vmType: string\n metadata: {\n logoURI: string\n verified: boolean\n isNative: boolean\n }\n}\n\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [relayChainId],\n address: relayTokenAddress,\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 {\n type APIError,\n type Execute,\n type GetQuoteParameters,\n isAPIError,\n} from '@relayprotocol/relay-sdk'\nimport { type Address, encodeFunctionData } from 'viem'\nimport { getRelayClient } from './client'\nimport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n} from './constants'\nimport { getRelayAssetInfo } from './currency'\nimport type {\n RelayAddress,\n RelayChainId,\n RelayVmType,\n RelayWallet,\n} from './execution'\nimport { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type { SolanaAddress } from './solana'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {\n // TODO: Relay does not yet explicitly handle this field in their SDK, nor is it in their typings - but it gets forwarded to API\n depositFeePayer?: SolanaAddress\n}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = {\n details?: {\n currencyIn?: NonNullable<Execute['details']>['currencyIn']\n currencyOut?: NonNullable<Execute['details']>['currencyOut']\n }\n steps: Execute['steps']\n vmType: VmType\n}\n\nexport type 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 Number(tokenChainId),\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 // FIXME: Temp hardcode until relay supports WUSDE on Ethereal\n const isWUsdeEthereal =\n normalizedChainId === '5064014' &&\n normalizedTokenAddress.toLowerCase() ===\n '0xB6fC4B1BFF391e5F6b4a3D2C7Bda1FeE3524692D'.toLowerCase()\n\n const price = tokenPriceRes.price\n const decimals = isWUsdeEthereal ? 18 : tokenInfoRes.decimals\n\n const absoluteAmount = BigInt(tokenAmountBaseUnit) / BigInt(10 ** decimals)\n return Number(price) * Number(absoluteAmount)\n } catch (err) {\n logger.error('getQuoteEstUsdValueError', {\n message: `Failed to get USD value for token ${tokenAddress} on chain ${tokenChainId}: ${\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 function getReferrer(clientId: string) {\n return clientId ? `${FUN_RELAY_REFERRER}|${clientId}` : FUN_RELAY_REFERRER\n}\n\nexport class RelayQuoteClientError extends Error {\n public constructor(\n public readonly statusCode: number,\n public readonly relayErrorCode: string,\n message: string,\n ) {\n super(\n `An error occurred trying to generate a relay quote: ${relayErrorCode} - ${message}`,\n )\n\n this.name = new.target.name\n Object.setPrototypeOf(this, new.target.prototype)\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 tradeType,\n userAddress,\n } = params\n\n const vmType = (\n walletClient && 'vmType' in walletClient ? walletClient.vmType : 'evm'\n ) as SourceVmType\n\n try {\n const relayClient = getRelayClient()\n\n 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 funRelayConfig = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n recipientAddress,\n })\n\n const appFeeBp = funRelayConfig.b + funRelayConfig.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n appFeeBp,\n estUsdValue,\n funRelayConfig,\n queryTokenAmountBaseUnit,\n txs,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote(\n {\n amount: queryTokenAmountBaseUnit.toString(),\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n currency: convertFunToRelayTokenAddress(\n fromTokenAddress,\n Number(fromChainId),\n ),\n recipient: recipientAddress,\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n toCurrency: convertFunToRelayTokenAddress(\n toTokenAddress,\n Number(toChainId),\n ),\n tradeType,\n txs,\n user: userAddress,\n wallet: walletClient,\n options: {\n referrer: getReferrer(clientId),\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n // Passed in options\n ...options,\n // Remote options will always override passed in options\n ...funRelayConfig.config.options,\n },\n },\n undefined,\n funRelayConfig.headers,\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: {\n ...relayQuote,\n vmType,\n },\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n if (err instanceof Error && isAPIError(err)) {\n const apiError = err as APIError\n const rawError = apiError.rawError as {\n errorCode?: string\n message?: string\n }\n\n if (rawError?.errorCode) {\n throw new RelayQuoteClientError(\n apiError.statusCode,\n rawError.errorCode,\n rawError.message ?? apiError.message,\n )\n }\n }\n\n const message = getErrorMessage(err)\n throw new Error(\n `An error occurred trying to generate a relay quote: ${message}`,\n )\n }\n}\n\nfunction getErrorMessage(err: unknown): string {\n return err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : JSON.stringify(err)\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptSolanaWallet } from '@relayprotocol/relay-svm-wallet-adapter'\nimport {\n type Connection,\n SendTransactionError,\n type VersionedTransaction,\n} from '@solana/web3.js'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\n\ntype Base58 =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\nexport type SolanaAddress = `${Base58}${string}`\n\nexport type SolanaTxHash = `${Base58}${string}`\n\nexport type SolanaWallet = {\n address(): Promise<SolanaAddress>\n vmType: 'svm'\n} & AdaptedWallet\n\nexport function getSolanaWallet(\n walletAddress: SolanaAddress,\n connection: Connection,\n signTransaction: (\n transaction: VersionedTransaction,\n ) => Promise<VersionedTransaction>,\n payerKey?: SolanaAddress,\n): SolanaWallet {\n return adaptSolanaWallet(\n walletAddress,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n connection,\n async (transaction, options) => {\n const signed = await signTransaction(transaction)\n try {\n const signature = await connection.sendTransaction(signed, {\n ...options,\n maxRetries: 5,\n })\n\n return { signature }\n } catch (error) {\n if (error instanceof SendTransactionError) {\n console.error(\n 'Failed transaction logs:',\n error,\n await error.getLogs(connection),\n )\n }\n\n throw error\n }\n },\n payerKey,\n ) as SolanaWallet\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export {\n type BitcoinAddress,\n type BitcoinPsbt,\n type BitcoinPsbtDynamicParams,\n type BitcoinTxHash,\n type BitcoinWallet,\n getBitcoinWallet,\n getBitcoinWalletFromSigner,\n} from './src/bitcoin'\nexport {\n getRelayClient,\n initializeRelayClient,\n type InitializeRelayClientParams,\n} from './src/client'\nexport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_BITCOIN_CHAIN_ID,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN,\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 { getRelayAssetInfo } from './src/currency'\nexport {\n type GetRelayQuoteParams,\n type RelayQuote,\n getRelayQuote,\n getReferrer,\n RelayQuoteClientError,\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 convertFunToRelayChainId,\n} from './src/utils'\nexport {\n LogLevel,\n type RelayExecutionInfo,\n type RelayExecutionStatus,\n type RelayTokenPriceInfo,\n} from './src/types'\n", "import { adaptBitcoinWallet } from '@relayprotocol/relay-bitcoin-wallet-adapter'\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk'\n\ntype Base16 =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n\nexport type BitcoinAddress =\n | `1${string}`\n | `3${string}`\n | `bc1${string}`\n | `bc1p${string}`\n\nexport type BitcoinTxHash = `${Base16}${string}`\n\nexport type BitcoinWallet = {\n address(): Promise<BitcoinAddress>\n vmType: 'bvm'\n} & AdaptedWallet\n\n/** bitcoinjs-lib Psbt */\nexport type BitcoinPsbt = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[1]\n\nexport type BitcoinPsbtDynamicParams = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[2]\n\n/** bitcoinjs-lib Signer */\nexport type BitcoinSigner = Parameters<BitcoinPsbt['signAllInputs']>[0]\n\nexport function getBitcoinWallet(\n walletAddress: BitcoinAddress,\n signPsbt: (\n address: BitcoinAddress,\n psbt: BitcoinPsbt,\n dynamicParams: BitcoinPsbtDynamicParams,\n ) => Promise<string>,\n): BitcoinWallet {\n return adaptBitcoinWallet(walletAddress, (address, psbt, dynamicParams) =>\n signPsbt(address as BitcoinAddress, psbt, dynamicParams),\n ) as BitcoinWallet\n}\n\nexport function getBitcoinWalletFromSigner(\n walletAddress: BitcoinAddress,\n signer: BitcoinSigner,\n): BitcoinWallet {\n return getBitcoinWallet(walletAddress, async (_, psbt) =>\n psbt.signAllInputs(signer).toBase64(),\n )\n}\n", "import {\n LogLevel,\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\nimport type { Logger } from './types'\n\nexport type InitializeRelayClientParams = Omit<\n RelayClientOptions,\n 'baseApiUrl' | 'chains' | 'logger'\n> & {\n chains: Chain[]\n logger: Logger\n}\n\n/**\n * Initializes a global instance of the RelayClient\n * https://docs.relay.link/references/sdk/createClient\n */\nexport function initializeRelayClient({\n chains,\n logger,\n ...options\n}: InitializeRelayClientParams): RelayClient {\n 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, level) => {\n if (level === LogLevel.Error) {\n logger.error('[RelayClient]:', message)\n } else {\n logger.info('[RelayClient]:', message)\n }\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 '@relayprotocol/relay-sdk'\nimport type { Abi, Address } from 'viem'\n\nexport { LogLevel }\n\n// https://docs.relay.link/references/api/get-intents-status-v2\nexport interface RelayExecutionInfo {\n status: RelayExecutionStatus\n details: string\n /** Incoming transaction hashes */\n inTxHashes: string[]\n /** Outgoing transaction hashes */\n txHashes: string[]\n /** The last timestamp the data was updated in milliseconds */\n time: number\n originChainId: number\n destinationChainId: number\n}\n\n// https://docs.relay.link/references/api/get-token-price\nexport interface RelayTokenPriceInfo {\n price: number\n}\n\n//// The types below are duplicated from @funkit/api-base atm, but this package should be used in BE as well\n//// TODO: Are we fine with BE importing @funkit/api-base and (by extension) @funkit/utils?\n//// See https://linear.app/funxyz/issue/PE-1342/sdk-extract-domainsrelayts-to-a-new-package#comment-d487d533\n\nexport interface Logger {\n error(message: string, data?: object): void\n info(message: string, data?: object): void\n}\n\n// Reference: https://github.com/reservoirprotocol/relay-kit/blob/211c645f9702a3b459ff545aa4e2e9d536c38455/packages/sdk/src/types/Execute.ts#L54-L61\nexport enum RelayExecutionStatus {\n DELAYED = 'delayed',\n FAILURE = 'failure',\n PENDING = 'pending',\n REFUND = 'refund',\n SUCCESS = 'success',\n WAITING = 'waiting',\n UNKNOWN = 'unknown',\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n\n // Any additional fields purely for frontend use\n metadata?: { [key: string]: unknown }\n}\n", "import type { Address } from 'viem'\nimport type { BitcoinAddress } from './bitcoin'\nimport type { SolanaAddress } from './solana'\nimport { RelayExecutionStatus } from './types'\n\n/**\n * Chain id that Relay uses to identify Bitcoin\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_BITCOIN_CHAIN_ID_NUMBER = 8253038 // Why cannot Relay export this themselves... -.-\nexport const RELAY_BITCOIN_CHAIN_ID = `${RELAY_BITCOIN_CHAIN_ID_NUMBER}`\n\n/**\n * Chain id that Relay uses to identify Solana\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809 // Why cannot Relay export this themselves... -.-\nexport const RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`\n\nexport const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710\nexport const FUN_HYPERCORE_CHAIN_ID_NUMBER = 1337\n\n/**\n * Fake address for a chain's native currency used by Funkit\n */\nexport const FUNKIT_NATIVE_TOKEN =\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' satisfies Address\n\n/**\n * Fake address for a chain's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN =\n '0x0000000000000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Hypercore's native currency used by Relay. This is shorter than the default native token...\n */\nexport const RELAY_NATIVE_TOKEN_HYPERCORE =\n '0x00000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_SOLANA =\n '11111111111111111111111111111111' satisfies SolanaAddress\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_BITCOIN =\n 'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8' satisfies BitcoinAddress\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\nexport const SUSHI_ORG_ID = 'fysix7gj5j'\nexport const HYPERSWAP_ORG_ID = '2ejzdxhfge'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\n", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@relayprotocol/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport type { BitcoinAddress, BitcoinTxHash, BitcoinWallet } from './bitcoin'\nimport { getRelayClient } from './client'\nimport type { RELAY_BITCOIN_CHAIN_ID, 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 = 'bvm' | 'evm' | 'svm'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinAddress\n evm: Address\n svm: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n bvm: typeof RELAY_BITCOIN_CHAIN_ID\n evm: string\n svm: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinTxHash\n evm: Hex\n svm: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinWallet\n evm: WalletClient | (AdaptedWallet & { vmType: 'evm' })\n svm: 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 /**\n * Whether to use a smart wallet adapter.\n * Used for account abstraction transactions.\n */\n smartWalletAdapter?: boolean\n}\n\nfunction getFinalTxHash<VmType extends RelayVmType>({\n smartWalletAdapter,\n steps,\n fallbackTxHash,\n logger,\n logPrefix,\n}: {\n smartWalletAdapter: boolean\n steps: RelayQuoteResult<VmType>['steps']\n fallbackTxHash: RelayTxHash<VmType>\n logger: Logger\n logPrefix: string\n}): RelayTxHash<VmType> {\n if (!smartWalletAdapter) {\n return fallbackTxHash\n }\n\n logger.info(`${logPrefix}:extractingTxHashFromReceipt`, {\n message: 'Smart wallet adapter detected, extracting txHash from receipt',\n })\n\n const receipt = steps[0].items[0].receipt\n if (receipt && 'transactionHash' in receipt) {\n const finalTxHash = receipt.transactionHash as RelayTxHash<VmType>\n logger.info(`${logPrefix}:extractedTxHashFromReceipt`, {\n originalTxHash: fallbackTxHash,\n finalTxHash,\n })\n return finalTxHash\n }\n\n logger.error(`${logPrefix}:missingReceiptOrTransactionHash`, {\n message: 'Smart wallet transaction missing receipt or transactionHash',\n })\n return fallbackTxHash\n}\n\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\n smartWalletAdapter = false,\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 // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: remove before merging into main\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 // 'completed' - catch-all for items marked completed with no other info\n // - e.g. Batched items will not have txHash but will have their item marked 'complete'\n // 'pending' - for origin chain transactions that have been included on chain\n // - may sometimes be skipped, hence the need for 'submitted' condition below\n // 'submitted' - for destination chain transactions that have been submitted to the network\n // receipt - is present when the transaction has been mined/confirmed\n // Ensure onUserActionsCompleted is always called before onTransactionConfirmed\n (item) =>\n item.status === 'complete' ||\n item.checkStatus === 'pending' ||\n item.checkStatus === 'submitted' ||\n item.receipt !== undefined,\n ),\n )\n ) {\n logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes)\n isUserActionsCompleted = true\n // Get the actual txHash from the receipt if using a smart wallet\n const finalTxHash = getFinalTxHash({\n smartWalletAdapter,\n steps,\n fallbackTxHash: txHash,\n logger,\n logPrefix,\n })\n\n try {\n await onUserActionsCompleted?.(finalTxHash)\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 // Get the actual txHash from the receipt if using a smart wallet\n const finalTxHash = getFinalTxHash({\n smartWalletAdapter,\n steps,\n fallbackTxHash: txHash,\n logger,\n logPrefix,\n })\n\n // fire and forget index registration - skip for smart wallet adapters\n if (!smartWalletAdapter) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId as string,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash: txHash,\n }),\n })\n }\n\n try {\n await onTransactionConfirmed?.(finalTxHash)\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 logPrefix = 'manuallyRegisterIndex'\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`${logPrefix}:onManuallyRegisterIndex`, {\n params: stringifiedRequest,\n })\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: 'Error !response.ok - request to manually register index',\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Data.message is not of type Success - ${data.message}`,\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n }\n return\n } catch (err) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}`,\n 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_HYPERCORE_CHAIN_ID_NUMBER,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN_SOLANA,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n RelayExecutionStatus,\n} from './types'\n\n/**\n * Converts a token address within Funkit to the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n chainId: number,\n): RelayAddress<T> {\n // convert Fun's NATIVE_TOKEN representation\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n switch (chainId) {\n case FUN_HYPERCORE_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_HYPERCORE as RelayAddress<T>\n\n case RELAY_BITCOIN_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_BITCOIN as RelayAddress<T>\n\n case RELAY_SOLANA_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_SOLANA as RelayAddress<T>\n\n default:\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n }\n\n return address\n}\n\n/**\n * Converts a chainId within Funkit to the corresponding Relay chainId.\n */\nexport function convertFunToRelayChainId(chainId: number): number {\n if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {\n return RELAY_SOLANA_CHAIN_ID_NUMBER\n }\n return chainId\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case RelayExecutionStatus.REFUND:\n return CheckoutRefundState.REFUNDED\n default:\n return undefined\n }\n}\n\nexport function getRelayExecutionState(\n info: RelayExecutionInfo,\n): CheckoutState {\n switch (info.status) {\n case RelayExecutionStatus.SUCCESS:\n return CheckoutState.COMPLETED\n case RelayExecutionStatus.FAILURE:\n case RelayExecutionStatus.REFUND:\n return CheckoutState.CHECKOUT_ERROR\n default:\n return CheckoutState.PENDING_RECEIVAL\n }\n}\n\n/**\n * Checks whether the Relay execution has reached a terminal status.\n */\nexport function isRelayExecutionTerminalStatus(\n info: RelayExecutionInfo,\n): boolean {\n return RELAY_TERMINAL_STATUSES.includes(info.status)\n}\n\nexport type Serializable =\n | bigint\n | boolean\n | null\n | number\n | string\n | Date\n | object // Should be '{ [key: string]: Serializable }' but helper gets called with loosely-typed 'object' and interfaces\n | Serializable[]\n\nexport function jsonStringifyWithBigIntSanitization(\n serializable: Serializable,\n): string {\n return JSON.stringify(\n serializable,\n (_, value) =>\n typeof value === 'bigint' ? `0x${value.toString(16)}` : value, // return everything else unchanged\n )\n}\n", "import type { CallFees } from '@relayprotocol/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n config: {\n options: Record<string, unknown>\n }\n headers: Record<string, string>\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n recipientAddress,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n recipientAddress: string | undefined\n}): Promise<FunRelayFeeItem> {\n const params = new URLSearchParams({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: estUsdValue.toString(),\n clientId,\n ...(recipientAddress ? { recipientAddress } : {}),\n })\n const url = `https://frog.fun.xyz/api/fee?${params.toString()}`\n const response = await fetch(url)\n if (!response.ok) {\n throw Error(response.statusText)\n }\n\n const data = await response.json()\n return data\n}\n\nexport function parseRelayFees({\n fees,\n 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 '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport type { RelayTokenPriceInfo } from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${relayChainId}&address=${relayTokenAddress}`\n const 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 { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport interface RelayTokenInfo {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n vmType: string\n metadata: {\n logoURI: string\n verified: boolean\n isNative: boolean\n }\n}\n\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [relayChainId],\n address: relayTokenAddress,\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 {\n type APIError,\n type Execute,\n type GetQuoteParameters,\n isAPIError,\n} from '@relayprotocol/relay-sdk'\nimport { type Address, encodeFunctionData } from 'viem'\nimport { getRelayClient } from './client'\nimport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n} from './constants'\nimport { getRelayAssetInfo } from './currency'\nimport type {\n RelayAddress,\n RelayChainId,\n RelayVmType,\n RelayWallet,\n} from './execution'\nimport { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type { SolanaAddress } from './solana'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {\n // TODO: Relay does not yet explicitly handle this field in their SDK, nor is it in their typings - but it gets forwarded to API\n depositFeePayer?: SolanaAddress\n}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = {\n details?: {\n currencyIn?: NonNullable<Execute['details']>['currencyIn']\n currencyOut?: NonNullable<Execute['details']>['currencyOut']\n }\n steps: Execute['steps']\n vmType: VmType\n}\n\nexport type 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 Number(tokenChainId),\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 // FIXME: Temp hardcode until relay supports WUSDE on Ethereal\n const isWUsdeEthereal =\n normalizedChainId === '5064014' &&\n normalizedTokenAddress.toLowerCase() ===\n '0xB6fC4B1BFF391e5F6b4a3D2C7Bda1FeE3524692D'.toLowerCase()\n\n const price = tokenPriceRes.price\n const decimals = isWUsdeEthereal ? 18 : tokenInfoRes.decimals\n\n const absoluteAmount = BigInt(tokenAmountBaseUnit) / BigInt(10 ** decimals)\n return Number(price) * Number(absoluteAmount)\n } catch (err) {\n logger.error('getQuoteEstUsdValueError', {\n message: `Failed to get USD value for token ${tokenAddress} on chain ${tokenChainId}: ${\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 function getReferrer(clientId: string) {\n return clientId ? `${FUN_RELAY_REFERRER}|${clientId}` : FUN_RELAY_REFERRER\n}\n\nexport class RelayQuoteClientError extends Error {\n public constructor(\n public readonly statusCode: number,\n public readonly relayErrorCode: string,\n message: string,\n ) {\n super(\n `An error occurred trying to generate a relay quote: ${relayErrorCode} - ${message}`,\n )\n\n this.name = new.target.name\n Object.setPrototypeOf(this, new.target.prototype)\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 tradeType,\n userAddress,\n } = params\n\n const vmType = (\n walletClient && 'vmType' in walletClient ? walletClient.vmType : 'evm'\n ) as SourceVmType\n\n try {\n const relayClient = getRelayClient()\n\n 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 funRelayConfig = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n recipientAddress,\n })\n\n const appFeeBp = funRelayConfig.b + funRelayConfig.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n appFeeBp,\n estUsdValue,\n funRelayConfig,\n queryTokenAmountBaseUnit,\n txs,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote(\n {\n amount: queryTokenAmountBaseUnit.toString(),\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n currency: convertFunToRelayTokenAddress(\n fromTokenAddress,\n Number(fromChainId),\n ),\n recipient: recipientAddress,\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n toCurrency: convertFunToRelayTokenAddress(\n toTokenAddress,\n Number(toChainId),\n ),\n tradeType,\n txs,\n user: userAddress,\n wallet: walletClient,\n options: {\n referrer: getReferrer(clientId),\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n // Passed in options\n ...options,\n // Remote options will always override passed in options\n ...funRelayConfig.config.options,\n },\n },\n undefined,\n funRelayConfig.headers,\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: {\n ...relayQuote,\n vmType,\n },\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n if (err instanceof Error && isAPIError(err)) {\n const apiError = err as APIError\n const rawError = apiError.rawError as {\n errorCode?: string\n message?: string\n }\n\n if (rawError?.errorCode) {\n throw new RelayQuoteClientError(\n apiError.statusCode,\n rawError.errorCode,\n rawError.message ?? apiError.message,\n )\n }\n }\n\n const message = getErrorMessage(err)\n throw new Error(\n `An error occurred trying to generate a relay quote: ${message}`,\n )\n }\n}\n\nfunction getErrorMessage(err: unknown): string {\n return err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : JSON.stringify(err)\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptSolanaWallet } from '@relayprotocol/relay-svm-wallet-adapter'\nimport {\n type Connection,\n SendTransactionError,\n type VersionedTransaction,\n} from '@solana/web3.js'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\n\ntype Base58 =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\nexport type SolanaAddress = `${Base58}${string}`\n\nexport type SolanaTxHash = `${Base58}${string}`\n\nexport type SolanaWallet = {\n address(): Promise<SolanaAddress>\n vmType: 'svm'\n} & AdaptedWallet\n\nexport function getSolanaWallet(\n walletAddress: SolanaAddress,\n connection: Connection,\n signTransaction: (\n transaction: VersionedTransaction,\n ) => Promise<VersionedTransaction>,\n payerKey?: SolanaAddress,\n): SolanaWallet {\n return adaptSolanaWallet(\n walletAddress,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n connection,\n async (transaction, options) => {\n const signed = await signTransaction(transaction)\n try {\n const signature = await connection.sendTransaction(signed, {\n ...options,\n maxRetries: 5,\n })\n\n return { signature }\n } catch (error) {\n if (error instanceof SendTransactionError) {\n console.error(\n 'Failed transaction logs:',\n error,\n await error.getLogs(connection),\n )\n }\n\n throw error\n }\n },\n payerKey,\n ) as SolanaWallet\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,0CAAmC;AA8C5B,SAAS,iBACd,eACA,UAKe;AACf,aAAO;AAAA,IAAmB;AAAA,IAAe,CAAC,SAAS,MAAM,kBACvD,SAAS,SAA2B,MAAM,aAAa;AAAA,EACzD;AACF;AAEO,SAAS,2BACd,eACA,QACe;AACf,SAAO;AAAA,IAAiB;AAAA,IAAe,OAAO,GAAG,SAC/C,KAAK,cAAc,MAAM,EAAE,SAAS;AAAA,EACtC;AACF;;;AClEA,IAAAA,oBAQO;;;ACRP,uBAAyB;;;ACUlB,IAAM,gCAAgC;AACtC,IAAM,yBAAyB,GAAG,6BAA6B;AAO/D,IAAM,+BAA+B;AACrC,IAAM,wBAAwB,GAAG,4BAA4B;AAE7D,IAAM,6BAA6B;AACnC,IAAM,gCAAgC;AAKtC,IAAM,sBACX;AAKK,IAAM,qBACX;AAKK,IAAM,+BACX;AAKK,IAAM,4BACX;AAKK,IAAM,6BACX;AAKK,IAAM,2BACX;AAKK,IAAM,qBAAqB;AAK3B,IAAM,sCAAsC;AAE5C,IAAM,0BAAkD;AAAA;AAAA;AAAA;AAI/D;;;AFjDO,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,SAAS,UAAU;AAC1B,UAAI,UAAU,2BAAS,OAAO;AAC5B,eAAO,MAAM,kBAAkB,OAAO;AAAA,MACxC,OAAO;AACL,eAAO,KAAK,kBAAkB,OAAO;AAAA,MACvC;AAAA,IACF;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;;;AG9DA,IAAAC,oBAIO;;;ACmBA,SAAS,8BACd,SACA,SACiB;AAEjB,MAAI,QAAQ,YAAY,MAAM,oBAAoB,YAAY,GAAG;AAC/D,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA,MAET;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,yBAAyB,SAAyB;AAChE,MAAI,YAAY,4BAA4B;AAC1C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,6BACd,MACiC;AACjC,UAAQ,KAAK,QAAQ;AAAA,IACnB;AACE;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,uBACd,MACe;AACf,UAAQ,KAAK,QAAQ;AAAA,IACnB;AACE;AAAA,IACF;AAAA,IACA;AACE;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;;;AD1CA,SAAS,eAA2C;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMwB;AACtB,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,GAAG,SAAS,gCAAgC;AAAA,IACtD,SAAS;AAAA,EACX,CAAC;AAED,QAAM,UAAU,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE;AAClC,MAAI,WAAW,qBAAqB,SAAS;AAC3C,UAAM,cAAc,QAAQ;AAC5B,WAAO,KAAK,GAAG,SAAS,+BAA+B;AAAA,MACrD,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,GAAG,SAAS,oCAAoC;AAAA,IAC3D,SAAS;AAAA,EACX,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,kBAA8C;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AACvB,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;AAAA,IAEF,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;AAAA;AAAA;AAAA;AAAA;AAAA,cAQT,CAAC,SACC,KAAK,WAAW,cAChB,KAAK,gBAAgB,aACrB,KAAK,gBAAgB,eACrB,KAAK,YAAY;AAAA,YACrB;AAAA,UACF;AAAA,UACA;AACA,iBAAO,KAAK,GAAG,SAAS,2BAA2B,QAAQ;AAC3D,mCAAyB;AAEzB,gBAAM,cAAc,eAAe;AAAA,YACjC;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA;AAAA,UACF,CAAC;AAED,cAAI;AACF,kBAAM,yBAAyB,WAAW;AAAA,UAC5C,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;AAEzB,gBAAM,cAAc,eAAe;AAAA,YACjC;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA;AAAA,UACF,CAAC;AAGD,cAAI,CAAC,oBAAoB;AACvB,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,WAAW;AAAA,UAC5C,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,YAAY;AAClB,QAAM,qBAAqB,KAAK,UAAU,eAAe;AACzD,QAAM,MAAM,GAAG,mCAAiB;AAChC,MAAI;AACF,WAAO,KAAK,GAAG,SAAS,4BAA4B;AAAA,MAClD,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,eAAe;AAAA,IACtC,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,MAAM,GAAG,SAAS,iCAAiC;AAAA,QACxD,SAAS;AAAA,QACT,UAAU,KAAK,UAAU,QAAQ;AAAA,QACjC,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAI,KAAK,YAAY,WAAW;AAC9B,aAAO,MAAM,GAAG,SAAS,iCAAiC;AAAA,QACxD,SAAS,yCAAyC,KAAK,OAAO;AAAA,QAC9D,UAAU,KAAK,UAAU,QAAQ;AAAA,QACjC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,GAAG,SAAS,iCAAiC;AAAA,MACxD,SAAS,8CAA8C,GAAG,KAAK,KAAK,UAAW,KAAe,OAAO,CAAC;AAAA,MACtG,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;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;;;AEzSA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQ6B;AAC3B,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,YAAY,SAAS;AAAA,IAClC;AAAA,IACA,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,EACjD,CAAC;AACD,QAAM,MAAM,gCAAgC,OAAO,SAAS,CAAC;AAC7D,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;;;ACjGA,IAAAC,oBAAkC;AAQlC,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AACF,GAGiC;AAC/B,QAAM,eAAe,yBAAyB,OAAO,OAAO,CAAC;AAC7D,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,MAAM,GAAG,mCAAiB,mCAAmC,YAAY,YAAY,iBAAiB;AAC5G,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;;;AC7BA,IAAAC,oBAAkC;AAqBlC,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAG4B;AAC1B,QAAM,eAAe,yBAAyB,OAAO,OAAO,CAAC;AAC7D,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,MAAM,GAAG,mCAAiB;AAChC,QAAM,OAAO;AAAA,IACX,UAAU,CAAC,YAAY;AAAA,IACvB,SAAS;AAAA,EACX;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;;;AClDA,IAAAC,oBAKO;AACP,kBAAiD;AAmFjD,eAAe,oBAAoB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI;AACF,UAAM,oBAAoB;AAAA,MACxB,OAAO,YAAY;AAAA,IACrB,EAAE,SAAS;AACX,UAAM,yBAAyB;AAAA,MAC7B;AAAA,MACA,OAAO,YAAY;AAAA,IACrB;AAEA,UAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtD,uBAAuB;AAAA,QACrB,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,MACD,kBAAkB;AAAA,QAChB,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,kBACJ,sBAAsB,aACtB,uBAAuB,YAAY,MACjC,6CAA6C,YAAY;AAE7D,UAAM,QAAQ,cAAc;AAC5B,UAAM,WAAW,kBAAkB,KAAK,aAAa;AAErD,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;AAEO,SAAS,YAAY,UAAkB;AAC5C,SAAO,WAAW,GAAG,kBAAkB,IAAI,QAAQ,KAAK;AAC1D;AAEO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACxC,YACW,YACA,gBAChB,SACA;AACA;AAAA,MACE,uDAAuD,cAAc,MAAM,OAAO;AAAA,IACpF;AANgB;AACA;AAOhB,SAAK,OAAO,WAAW;AACvB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;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,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,SACJ,gBAAgB,YAAY,eAAe,aAAa,SAAS;AAGnE,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,iBAAiB,MAAM,gBAAgB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,OAAO,WAAW,KAAK;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,WAAW,eAAe,IAAI,eAAe;AAEnD,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;AAAA,MAC3C;AAAA,QACE,QAAQ,yBAAyB,SAAS;AAAA,QAC1C,SAAS,yBAAyB,OAAO,WAAW,CAAC;AAAA,QACrD,UAAU;AAAA,UACR;AAAA,UACA,OAAO,WAAW;AAAA,QACpB;AAAA,QACA,WAAW;AAAA,QACX,WAAW,yBAAyB,OAAO,SAAS,CAAC;AAAA,QACrD,YAAY;AAAA,UACV;AAAA,UACA,OAAO,SAAS;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,UAAU,YAAY,QAAQ;AAAA,UAC9B,SAAS;AAAA,YACP;AAAA,cACE,KAAK,SAAS,SAAS;AAAA,cACvB,WAAW;AAAA,YACb;AAAA,UACF;AAAA;AAAA,UAEA,GAAG;AAAA;AAAA,UAEH,GAAG,eAAe,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAEA,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,YAAY;AAAA,UACV,GAAG;AAAA,UACH;AAAA,QACF;AAAA,QACA,kBAAkB,YACb,WAAW,QAAQ,YAAY,UAAU,MAC1C,yBAAyB,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,aAAS,8BAAW,GAAG,GAAG;AAC3C,YAAM,WAAW;AACjB,YAAM,WAAW,SAAS;AAK1B,UAAI,UAAU,WAAW;AACvB,cAAM,IAAI;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS,WAAW,SAAS;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB,GAAG;AACnC,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,SAAO,eAAe,QAClB,IAAI,UACJ,OAAO,QAAQ,WACb,MACA,KAAK,UAAU,GAAG;AAC1B;;;AC5XA,sCAAkC;AAClC,kBAIO;AAwEA,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;",
|
|
6
6
|
"names": ["import_relay_sdk", "import_relay_sdk", "import_relay_sdk", "import_relay_sdk", "import_relay_sdk"]
|
|
7
7
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -15,6 +15,7 @@ function getBitcoinWalletFromSigner(walletAddress, signer) {
|
|
|
15
15
|
|
|
16
16
|
// src/client.ts
|
|
17
17
|
import {
|
|
18
|
+
LogLevel as LogLevel2,
|
|
18
19
|
MAINNET_RELAY_API,
|
|
19
20
|
convertViemChainToRelayChain,
|
|
20
21
|
createClient,
|
|
@@ -62,8 +63,12 @@ function initializeRelayClient({
|
|
|
62
63
|
displayName: "Solana"
|
|
63
64
|
}
|
|
64
65
|
],
|
|
65
|
-
logger: (message) => {
|
|
66
|
-
|
|
66
|
+
logger: (message, level) => {
|
|
67
|
+
if (level === LogLevel2.Error) {
|
|
68
|
+
logger.error("[RelayClient]:", message);
|
|
69
|
+
} else {
|
|
70
|
+
logger.info("[RelayClient]:", message);
|
|
71
|
+
}
|
|
67
72
|
}
|
|
68
73
|
});
|
|
69
74
|
}
|
|
@@ -104,7 +109,7 @@ function convertFunToRelayChainId(chainId) {
|
|
|
104
109
|
}
|
|
105
110
|
function getRelayExecutionRefundState(info) {
|
|
106
111
|
switch (info.status) {
|
|
107
|
-
case "refund"
|
|
112
|
+
case "refund" /* REFUND */:
|
|
108
113
|
return "REFUNDED" /* REFUNDED */;
|
|
109
114
|
default:
|
|
110
115
|
return void 0;
|
|
@@ -112,10 +117,10 @@ function getRelayExecutionRefundState(info) {
|
|
|
112
117
|
}
|
|
113
118
|
function getRelayExecutionState(info) {
|
|
114
119
|
switch (info.status) {
|
|
115
|
-
case "success"
|
|
120
|
+
case "success" /* SUCCESS */:
|
|
116
121
|
return "COMPLETED" /* COMPLETED */;
|
|
117
|
-
case "failure"
|
|
118
|
-
case "refund"
|
|
122
|
+
case "failure" /* FAILURE */:
|
|
123
|
+
case "refund" /* REFUND */:
|
|
119
124
|
return "CHECKOUT_ERROR" /* CHECKOUT_ERROR */;
|
|
120
125
|
default:
|
|
121
126
|
return "PENDING_RECEIVAL" /* PENDING_RECEIVAL */;
|
|
@@ -133,6 +138,33 @@ function jsonStringifyWithBigIntSanitization(serializable) {
|
|
|
133
138
|
}
|
|
134
139
|
|
|
135
140
|
// src/execution.ts
|
|
141
|
+
function getFinalTxHash({
|
|
142
|
+
smartWalletAdapter,
|
|
143
|
+
steps,
|
|
144
|
+
fallbackTxHash,
|
|
145
|
+
logger,
|
|
146
|
+
logPrefix
|
|
147
|
+
}) {
|
|
148
|
+
if (!smartWalletAdapter) {
|
|
149
|
+
return fallbackTxHash;
|
|
150
|
+
}
|
|
151
|
+
logger.info(`${logPrefix}:extractingTxHashFromReceipt`, {
|
|
152
|
+
message: "Smart wallet adapter detected, extracting txHash from receipt"
|
|
153
|
+
});
|
|
154
|
+
const receipt = steps[0].items[0].receipt;
|
|
155
|
+
if (receipt && "transactionHash" in receipt) {
|
|
156
|
+
const finalTxHash = receipt.transactionHash;
|
|
157
|
+
logger.info(`${logPrefix}:extractedTxHashFromReceipt`, {
|
|
158
|
+
originalTxHash: fallbackTxHash,
|
|
159
|
+
finalTxHash
|
|
160
|
+
});
|
|
161
|
+
return finalTxHash;
|
|
162
|
+
}
|
|
163
|
+
logger.error(`${logPrefix}:missingReceiptOrTransactionHash`, {
|
|
164
|
+
message: "Smart wallet transaction missing receipt or transactionHash"
|
|
165
|
+
});
|
|
166
|
+
return fallbackTxHash;
|
|
167
|
+
}
|
|
136
168
|
async function executeRelayQuote({
|
|
137
169
|
logger,
|
|
138
170
|
onError,
|
|
@@ -140,7 +172,8 @@ async function executeRelayQuote({
|
|
|
140
172
|
onTransactionConfirmed,
|
|
141
173
|
onUserActionsCompleted,
|
|
142
174
|
relayQuote,
|
|
143
|
-
walletClient
|
|
175
|
+
walletClient,
|
|
176
|
+
smartWalletAdapter = false
|
|
144
177
|
}) {
|
|
145
178
|
let isUserActionsCompleted = false;
|
|
146
179
|
let isTransactionConfirmed = false;
|
|
@@ -156,6 +189,7 @@ async function executeRelayQuote({
|
|
|
156
189
|
txHashes,
|
|
157
190
|
details,
|
|
158
191
|
error
|
|
192
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: remove before merging into main
|
|
159
193
|
}) => {
|
|
160
194
|
const logPrefix = "onRelayProgress";
|
|
161
195
|
logger.info(`${logPrefix}:params`, {
|
|
@@ -194,8 +228,15 @@ async function executeRelayQuote({
|
|
|
194
228
|
) {
|
|
195
229
|
logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes);
|
|
196
230
|
isUserActionsCompleted = true;
|
|
231
|
+
const finalTxHash = getFinalTxHash({
|
|
232
|
+
smartWalletAdapter,
|
|
233
|
+
steps,
|
|
234
|
+
fallbackTxHash: txHash,
|
|
235
|
+
logger,
|
|
236
|
+
logPrefix
|
|
237
|
+
});
|
|
197
238
|
try {
|
|
198
|
-
await onUserActionsCompleted?.(
|
|
239
|
+
await onUserActionsCompleted?.(finalTxHash);
|
|
199
240
|
} catch (e) {
|
|
200
241
|
logger.error(
|
|
201
242
|
`${logPrefix}:onUserActionsCompletedFailed`,
|
|
@@ -211,7 +252,14 @@ async function executeRelayQuote({
|
|
|
211
252
|
) {
|
|
212
253
|
logger.info(`${logPrefix}:onTransactionConfirmed`, txHashes);
|
|
213
254
|
isTransactionConfirmed = true;
|
|
214
|
-
|
|
255
|
+
const finalTxHash = getFinalTxHash({
|
|
256
|
+
smartWalletAdapter,
|
|
257
|
+
steps,
|
|
258
|
+
fallbackTxHash: txHash,
|
|
259
|
+
logger,
|
|
260
|
+
logPrefix
|
|
261
|
+
});
|
|
262
|
+
if (!smartWalletAdapter) {
|
|
215
263
|
manuallyRegisterIndex(logger, {
|
|
216
264
|
requestId: relayQuote.steps[0].requestId,
|
|
217
265
|
chainId: relayQuote.steps[0].items[0].data.chainId,
|
|
@@ -222,7 +270,7 @@ async function executeRelayQuote({
|
|
|
222
270
|
});
|
|
223
271
|
}
|
|
224
272
|
try {
|
|
225
|
-
await onTransactionConfirmed?.(
|
|
273
|
+
await onTransactionConfirmed?.(finalTxHash);
|
|
226
274
|
} catch (e) {
|
|
227
275
|
logger.error(
|
|
228
276
|
`${logPrefix}:onTransactionConfirmedFailed`,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/bitcoin.ts", "../src/client.ts", "../src/types.ts", "../src/constants.ts", "../src/execution.ts", "../src/utils.ts", "../src/fees.ts", "../src/price.ts", "../src/currency.ts", "../src/quote.ts", "../src/solana.ts"],
|
|
4
|
-
"sourcesContent": ["import { adaptBitcoinWallet } from '@relayprotocol/relay-bitcoin-wallet-adapter'\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk'\n\ntype Base16 =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n\nexport type BitcoinAddress =\n | `1${string}`\n | `3${string}`\n | `bc1${string}`\n | `bc1p${string}`\n\nexport type BitcoinTxHash = `${Base16}${string}`\n\nexport type BitcoinWallet = {\n address(): Promise<BitcoinAddress>\n vmType: 'bvm'\n} & AdaptedWallet\n\n/** bitcoinjs-lib Psbt */\nexport type BitcoinPsbt = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[1]\n\nexport type BitcoinPsbtDynamicParams = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[2]\n\n/** bitcoinjs-lib Signer */\nexport type BitcoinSigner = Parameters<BitcoinPsbt['signAllInputs']>[0]\n\nexport function getBitcoinWallet(\n walletAddress: BitcoinAddress,\n signPsbt: (\n address: BitcoinAddress,\n psbt: BitcoinPsbt,\n dynamicParams: BitcoinPsbtDynamicParams,\n ) => Promise<string>,\n): BitcoinWallet {\n return adaptBitcoinWallet(walletAddress, (address, psbt, dynamicParams) =>\n signPsbt(address as BitcoinAddress, psbt, dynamicParams),\n ) as BitcoinWallet\n}\n\nexport function getBitcoinWalletFromSigner(\n walletAddress: BitcoinAddress,\n signer: BitcoinSigner,\n): BitcoinWallet {\n return getBitcoinWallet(walletAddress, async (_, psbt) =>\n psbt.signAllInputs(signer).toBase64(),\n )\n}\n", "import {\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\nimport type { Logger } from './types'\n\nexport type InitializeRelayClientParams = Omit<\n RelayClientOptions,\n 'baseApiUrl' | 'chains' | 'logger'\n> & {\n chains: Chain[]\n logger: Logger\n}\n\n/**\n * Initializes a global instance of the RelayClient\n * https://docs.relay.link/references/sdk/createClient\n */\nexport function initializeRelayClient({\n chains,\n logger,\n ...options\n}: InitializeRelayClientParams): RelayClient {\n 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 '@relayprotocol/relay-sdk'\nimport type { Abi, Address } from 'viem'\n\nexport { LogLevel }\n\n// https://docs.relay.link/references/api/get-intents-status-v2\nexport interface RelayExecutionInfo {\n status: RelayExecutionStatus\n details: string\n /** Incoming transaction hashes */\n inTxHashes: string[]\n /** Outgoing transaction hashes */\n txHashes: string[]\n /** The last timestamp the data was updated in milliseconds */\n time: number\n originChainId: number\n destinationChainId: number\n}\n\n// https://docs.relay.link/references/api/get-token-price\nexport interface RelayTokenPriceInfo {\n price: number\n}\n\n//// The types below are duplicated from @funkit/api-base atm, but this package should be used in BE as well\n//// TODO: Are we fine with BE importing @funkit/api-base and (by extension) @funkit/utils?\n//// See https://linear.app/funxyz/issue/PE-1342/sdk-extract-domainsrelayts-to-a-new-package#comment-d487d533\n\nexport interface Logger {\n error(message: string, data?: object): void\n info(message: string, data?: object): void\n}\n\n// Reference: https://github.com/reservoirprotocol/relay-kit/blob/211c645f9702a3b459ff545aa4e2e9d536c38455/packages/sdk/src/types/Execute.ts#L54-L61\nexport enum RelayExecutionStatus {\n DELAYED = 'delayed',\n FAILURE = 'failure',\n PENDING = 'pending',\n REFUND = 'refund',\n SUCCESS = 'success',\n WAITING = 'waiting',\n UNKNOWN = 'unknown',\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n\n // Any additional fields purely for frontend use\n metadata?: { [key: string]: unknown }\n}\n", "import type { Address } from 'viem'\nimport type { BitcoinAddress } from './bitcoin'\nimport type { SolanaAddress } from './solana'\nimport { RelayExecutionStatus } from './types'\n\n/**\n * Chain id that Relay uses to identify Bitcoin\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_BITCOIN_CHAIN_ID_NUMBER = 8253038 // Why cannot Relay export this themselves... -.-\nexport const RELAY_BITCOIN_CHAIN_ID = `${RELAY_BITCOIN_CHAIN_ID_NUMBER}`\n\n/**\n * Chain id that Relay uses to identify Solana\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809 // Why cannot Relay export this themselves... -.-\nexport const RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`\n\nexport const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710\nexport const FUN_HYPERCORE_CHAIN_ID_NUMBER = 1337\n\n/**\n * Fake address for a chain's native currency used by Funkit\n */\nexport const FUNKIT_NATIVE_TOKEN =\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' satisfies Address\n\n/**\n * Fake address for a chain's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN =\n '0x0000000000000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Hypercore's native currency used by Relay. This is shorter than the default native token...\n */\nexport const RELAY_NATIVE_TOKEN_HYPERCORE =\n '0x00000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_SOLANA =\n '11111111111111111111111111111111' satisfies SolanaAddress\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_BITCOIN =\n 'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8' satisfies BitcoinAddress\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\nexport const SUSHI_ORG_ID = 'fysix7gj5j'\nexport const HYPERSWAP_ORG_ID = '2ejzdxhfge'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\n", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@relayprotocol/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport type { BitcoinAddress, BitcoinTxHash, BitcoinWallet } from './bitcoin'\nimport { getRelayClient } from './client'\nimport type { RELAY_BITCOIN_CHAIN_ID, 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 = 'bvm' | 'evm' | 'svm'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinAddress\n evm: Address\n svm: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n bvm: typeof RELAY_BITCOIN_CHAIN_ID\n evm: string\n svm: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinTxHash\n evm: Hex\n svm: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinWallet\n evm: WalletClient | (AdaptedWallet & { vmType: 'evm' })\n svm: 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 // 'completed' - catch-all for items marked completed with no other info\n // - e.g. Batched items will not have txHash but will have their item marked 'complete'\n // 'pending' - for origin chain transactions that have been included on chain\n // - may sometimes be skipped, hence the need for 'submitted' condition below\n // 'submitted' - for destination chain transactions that have been submitted to the network\n // receipt - is present when the transaction has been mined/confirmed\n // Ensure onUserActionsCompleted is always called before onTransactionConfirmed\n (item) =>\n item.status === 'complete' ||\n item.checkStatus === 'pending' ||\n item.checkStatus === 'submitted' ||\n item.receipt !== undefined,\n ),\n )\n ) {\n logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes)\n isUserActionsCompleted = true\n\n try {\n await onUserActionsCompleted?.(txHash)\n } catch (e) {\n logger.error(\n `${logPrefix}:onUserActionsCompletedFailed`,\n e as Error,\n )\n }\n }\n\n if (\n // Call onTransactionConfirmed only once\n !isTransactionConfirmed &&\n steps.every((step) =>\n step.items.every((item) => item.status === 'complete'),\n )\n ) {\n logger.info(`${logPrefix}:onTransactionConfirmed`, txHashes)\n isTransactionConfirmed = true\n\n // 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 logPrefix = 'manuallyRegisterIndex'\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`${logPrefix}:onManuallyRegisterIndex`, {\n params: stringifiedRequest,\n })\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: 'Error !response.ok - request to manually register index',\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Data.message is not of type Success - ${data.message}`,\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n }\n return\n } catch (err) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}`,\n 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_HYPERCORE_CHAIN_ID_NUMBER,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN_SOLANA,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n} 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 chainId: number,\n): RelayAddress<T> {\n // convert Fun's NATIVE_TOKEN representation\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n switch (chainId) {\n case FUN_HYPERCORE_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_HYPERCORE as RelayAddress<T>\n\n case RELAY_BITCOIN_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_BITCOIN as RelayAddress<T>\n\n case RELAY_SOLANA_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_SOLANA as RelayAddress<T>\n\n default:\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n }\n\n return address\n}\n\n/**\n * Converts a chainId within Funkit to the corresponding Relay chainId.\n */\nexport function convertFunToRelayChainId(chainId: number): number {\n if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {\n return RELAY_SOLANA_CHAIN_ID_NUMBER\n }\n return chainId\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case '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 '@relayprotocol/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n config: {\n options: Record<string, unknown>\n }\n headers: Record<string, string>\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n recipientAddress,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n recipientAddress: string | undefined\n}): Promise<FunRelayFeeItem> {\n const params = new URLSearchParams({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: estUsdValue.toString(),\n clientId,\n ...(recipientAddress ? { recipientAddress } : {}),\n })\n const url = `https://frog.fun.xyz/api/fee?${params.toString()}`\n const response = await fetch(url)\n if (!response.ok) {\n throw Error(response.statusText)\n }\n\n const data = await response.json()\n return data\n}\n\nexport function parseRelayFees({\n fees,\n 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 '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport type { RelayTokenPriceInfo } from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${relayChainId}&address=${relayTokenAddress}`\n const 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 { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport interface RelayTokenInfo {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n vmType: string\n metadata: {\n logoURI: string\n verified: boolean\n isNative: boolean\n }\n}\n\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [relayChainId],\n address: relayTokenAddress,\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 {\n type APIError,\n type Execute,\n type GetQuoteParameters,\n isAPIError,\n} from '@relayprotocol/relay-sdk'\nimport { type Address, encodeFunctionData } from 'viem'\nimport { getRelayClient } from './client'\nimport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n} from './constants'\nimport { getRelayAssetInfo } from './currency'\nimport type {\n RelayAddress,\n RelayChainId,\n RelayVmType,\n RelayWallet,\n} from './execution'\nimport { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type { SolanaAddress } from './solana'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {\n // TODO: Relay does not yet explicitly handle this field in their SDK, nor is it in their typings - but it gets forwarded to API\n depositFeePayer?: SolanaAddress\n}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = {\n details?: {\n currencyIn?: NonNullable<Execute['details']>['currencyIn']\n currencyOut?: NonNullable<Execute['details']>['currencyOut']\n }\n steps: Execute['steps']\n vmType: VmType\n}\n\nexport type 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 Number(tokenChainId),\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 // FIXME: Temp hardcode until relay supports WUSDE on Ethereal\n const isWUsdeEthereal =\n normalizedChainId === '5064014' &&\n normalizedTokenAddress.toLowerCase() ===\n '0xB6fC4B1BFF391e5F6b4a3D2C7Bda1FeE3524692D'.toLowerCase()\n\n const price = tokenPriceRes.price\n const decimals = isWUsdeEthereal ? 18 : tokenInfoRes.decimals\n\n const absoluteAmount = BigInt(tokenAmountBaseUnit) / BigInt(10 ** decimals)\n return Number(price) * Number(absoluteAmount)\n } catch (err) {\n logger.error('getQuoteEstUsdValueError', {\n message: `Failed to get USD value for token ${tokenAddress} on chain ${tokenChainId}: ${\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 function getReferrer(clientId: string) {\n return clientId ? `${FUN_RELAY_REFERRER}|${clientId}` : FUN_RELAY_REFERRER\n}\n\nexport class RelayQuoteClientError extends Error {\n public constructor(\n public readonly statusCode: number,\n public readonly relayErrorCode: string,\n message: string,\n ) {\n super(\n `An error occurred trying to generate a relay quote: ${relayErrorCode} - ${message}`,\n )\n\n this.name = new.target.name\n Object.setPrototypeOf(this, new.target.prototype)\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 tradeType,\n userAddress,\n } = params\n\n const vmType = (\n walletClient && 'vmType' in walletClient ? walletClient.vmType : 'evm'\n ) as SourceVmType\n\n try {\n const relayClient = getRelayClient()\n\n 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 funRelayConfig = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n recipientAddress,\n })\n\n const appFeeBp = funRelayConfig.b + funRelayConfig.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n appFeeBp,\n estUsdValue,\n funRelayConfig,\n queryTokenAmountBaseUnit,\n txs,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote(\n {\n amount: queryTokenAmountBaseUnit.toString(),\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n currency: convertFunToRelayTokenAddress(\n fromTokenAddress,\n Number(fromChainId),\n ),\n recipient: recipientAddress,\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n toCurrency: convertFunToRelayTokenAddress(\n toTokenAddress,\n Number(toChainId),\n ),\n tradeType,\n txs,\n user: userAddress,\n wallet: walletClient,\n options: {\n referrer: getReferrer(clientId),\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n // Passed in options\n ...options,\n // Remote options will always override passed in options\n ...funRelayConfig.config.options,\n },\n },\n undefined,\n funRelayConfig.headers,\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: {\n ...relayQuote,\n vmType,\n },\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n if (err instanceof Error && isAPIError(err)) {\n const apiError = err as APIError\n const rawError = apiError.rawError as {\n errorCode?: string\n message?: string\n }\n\n if (rawError?.errorCode) {\n throw new RelayQuoteClientError(\n apiError.statusCode,\n rawError.errorCode,\n rawError.message ?? apiError.message,\n )\n }\n }\n\n const message = getErrorMessage(err)\n throw new Error(\n `An error occurred trying to generate a relay quote: ${message}`,\n )\n }\n}\n\nfunction getErrorMessage(err: unknown): string {\n return err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : JSON.stringify(err)\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptSolanaWallet } from '@relayprotocol/relay-svm-wallet-adapter'\nimport {\n type Connection,\n SendTransactionError,\n type VersionedTransaction,\n} from '@solana/web3.js'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\n\ntype Base58 =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\nexport type SolanaAddress = `${Base58}${string}`\n\nexport type SolanaTxHash = `${Base58}${string}`\n\nexport type SolanaWallet = {\n address(): Promise<SolanaAddress>\n vmType: 'svm'\n} & AdaptedWallet\n\nexport function getSolanaWallet(\n walletAddress: SolanaAddress,\n connection: Connection,\n signTransaction: (\n transaction: VersionedTransaction,\n ) => Promise<VersionedTransaction>,\n payerKey?: SolanaAddress,\n): SolanaWallet {\n return adaptSolanaWallet(\n walletAddress,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n connection,\n async (transaction, options) => {\n const signed = await signTransaction(transaction)\n try {\n const signature = await connection.sendTransaction(signed, {\n ...options,\n maxRetries: 5,\n })\n\n return { signature }\n } catch (error) {\n if (error instanceof SendTransactionError) {\n console.error(\n 'Failed transaction logs:',\n error,\n await error.getLogs(connection),\n )\n }\n\n throw error\n }\n },\n payerKey,\n ) as SolanaWallet\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API"]
|
|
4
|
+
"sourcesContent": ["import { adaptBitcoinWallet } from '@relayprotocol/relay-bitcoin-wallet-adapter'\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk'\n\ntype Base16 =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n\nexport type BitcoinAddress =\n | `1${string}`\n | `3${string}`\n | `bc1${string}`\n | `bc1p${string}`\n\nexport type BitcoinTxHash = `${Base16}${string}`\n\nexport type BitcoinWallet = {\n address(): Promise<BitcoinAddress>\n vmType: 'bvm'\n} & AdaptedWallet\n\n/** bitcoinjs-lib Psbt */\nexport type BitcoinPsbt = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[1]\n\nexport type BitcoinPsbtDynamicParams = Parameters<\n Parameters<typeof adaptBitcoinWallet>[1]\n>[2]\n\n/** bitcoinjs-lib Signer */\nexport type BitcoinSigner = Parameters<BitcoinPsbt['signAllInputs']>[0]\n\nexport function getBitcoinWallet(\n walletAddress: BitcoinAddress,\n signPsbt: (\n address: BitcoinAddress,\n psbt: BitcoinPsbt,\n dynamicParams: BitcoinPsbtDynamicParams,\n ) => Promise<string>,\n): BitcoinWallet {\n return adaptBitcoinWallet(walletAddress, (address, psbt, dynamicParams) =>\n signPsbt(address as BitcoinAddress, psbt, dynamicParams),\n ) as BitcoinWallet\n}\n\nexport function getBitcoinWalletFromSigner(\n walletAddress: BitcoinAddress,\n signer: BitcoinSigner,\n): BitcoinWallet {\n return getBitcoinWallet(walletAddress, async (_, psbt) =>\n psbt.signAllInputs(signer).toBase64(),\n )\n}\n", "import {\n LogLevel,\n MAINNET_RELAY_API,\n type RelayClient,\n type RelayClientOptions,\n convertViemChainToRelayChain,\n createClient,\n getClient,\n} from '@relayprotocol/relay-sdk'\nimport type { Chain } from 'viem'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\nimport type { Logger } from './types'\n\nexport type InitializeRelayClientParams = Omit<\n RelayClientOptions,\n 'baseApiUrl' | 'chains' | 'logger'\n> & {\n chains: Chain[]\n logger: Logger\n}\n\n/**\n * Initializes a global instance of the RelayClient\n * https://docs.relay.link/references/sdk/createClient\n */\nexport function initializeRelayClient({\n chains,\n logger,\n ...options\n}: InitializeRelayClientParams): RelayClient {\n 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, level) => {\n if (level === LogLevel.Error) {\n logger.error('[RelayClient]:', message)\n } else {\n logger.info('[RelayClient]:', message)\n }\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 '@relayprotocol/relay-sdk'\nimport type { Abi, Address } from 'viem'\n\nexport { LogLevel }\n\n// https://docs.relay.link/references/api/get-intents-status-v2\nexport interface RelayExecutionInfo {\n status: RelayExecutionStatus\n details: string\n /** Incoming transaction hashes */\n inTxHashes: string[]\n /** Outgoing transaction hashes */\n txHashes: string[]\n /** The last timestamp the data was updated in milliseconds */\n time: number\n originChainId: number\n destinationChainId: number\n}\n\n// https://docs.relay.link/references/api/get-token-price\nexport interface RelayTokenPriceInfo {\n price: number\n}\n\n//// The types below are duplicated from @funkit/api-base atm, but this package should be used in BE as well\n//// TODO: Are we fine with BE importing @funkit/api-base and (by extension) @funkit/utils?\n//// See https://linear.app/funxyz/issue/PE-1342/sdk-extract-domainsrelayts-to-a-new-package#comment-d487d533\n\nexport interface Logger {\n error(message: string, data?: object): void\n info(message: string, data?: object): void\n}\n\n// Reference: https://github.com/reservoirprotocol/relay-kit/blob/211c645f9702a3b459ff545aa4e2e9d536c38455/packages/sdk/src/types/Execute.ts#L54-L61\nexport enum RelayExecutionStatus {\n DELAYED = 'delayed',\n FAILURE = 'failure',\n PENDING = 'pending',\n REFUND = 'refund',\n SUCCESS = 'success',\n WAITING = 'waiting',\n UNKNOWN = 'unknown',\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n\n // Any additional fields purely for frontend use\n metadata?: { [key: string]: unknown }\n}\n", "import type { Address } from 'viem'\nimport type { BitcoinAddress } from './bitcoin'\nimport type { SolanaAddress } from './solana'\nimport { RelayExecutionStatus } from './types'\n\n/**\n * Chain id that Relay uses to identify Bitcoin\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_BITCOIN_CHAIN_ID_NUMBER = 8253038 // Why cannot Relay export this themselves... -.-\nexport const RELAY_BITCOIN_CHAIN_ID = `${RELAY_BITCOIN_CHAIN_ID_NUMBER}`\n\n/**\n * Chain id that Relay uses to identify Solana\n *\n * See https://docs.relay.link/references/sdk/adapters#how-can-i-use-an-adapter%3F\n */\nexport const RELAY_SOLANA_CHAIN_ID_NUMBER = 792703809 // Why cannot Relay export this themselves... -.-\nexport const RELAY_SOLANA_CHAIN_ID = `${RELAY_SOLANA_CHAIN_ID_NUMBER}`\n\nexport const FUN_SOLANA_CHAIN_ID_NUMBER = 1151111081099710\nexport const FUN_HYPERCORE_CHAIN_ID_NUMBER = 1337\n\n/**\n * Fake address for a chain's native currency used by Funkit\n */\nexport const FUNKIT_NATIVE_TOKEN =\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' satisfies Address\n\n/**\n * Fake address for a chain's native currency used by Relay\n */\nexport const RELAY_NATIVE_TOKEN =\n '0x0000000000000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for Hypercore's native currency used by Relay. This is shorter than the default native token...\n */\nexport const RELAY_NATIVE_TOKEN_HYPERCORE =\n '0x00000000000000000000000000000000' satisfies Address\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_SOLANA =\n '11111111111111111111111111111111' satisfies SolanaAddress\n\n/**\n * Fake address for native Bitcoin used by Relay\n */\nexport const RELAY_NATIVE_TOKEN_BITCOIN =\n 'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8' satisfies BitcoinAddress\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\nexport const SUSHI_ORG_ID = 'fysix7gj5j'\nexport const HYPERSWAP_ORG_ID = '2ejzdxhfge'\nexport const HYPERBEAT_ORG_ID = 'opzh9rydei'\n", "import {\n type AdaptedWallet,\n MAINNET_RELAY_API,\n type ProgressData,\n} from '@relayprotocol/relay-sdk'\nimport type { Address, Hex, WalletClient } from 'viem'\nimport type { BitcoinAddress, BitcoinTxHash, BitcoinWallet } from './bitcoin'\nimport { getRelayClient } from './client'\nimport type { RELAY_BITCOIN_CHAIN_ID, 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 = 'bvm' | 'evm' | 'svm'\n\nexport type RelayAddress<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinAddress\n evm: Address\n svm: SolanaAddress\n}[VmType]\n\nexport type RelayChainId<VmType extends RelayVmType = RelayVmType> = {\n bvm: typeof RELAY_BITCOIN_CHAIN_ID\n evm: string\n svm: typeof RELAY_SOLANA_CHAIN_ID\n}[VmType]\n\nexport type RelayTxHash<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinTxHash\n evm: Hex\n svm: SolanaTxHash\n}[VmType]\n\nexport type RelayWallet<VmType extends RelayVmType = RelayVmType> = {\n bvm: BitcoinWallet\n evm: WalletClient | (AdaptedWallet & { vmType: 'evm' })\n svm: 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 /**\n * Whether to use a smart wallet adapter.\n * Used for account abstraction transactions.\n */\n smartWalletAdapter?: boolean\n}\n\nfunction getFinalTxHash<VmType extends RelayVmType>({\n smartWalletAdapter,\n steps,\n fallbackTxHash,\n logger,\n logPrefix,\n}: {\n smartWalletAdapter: boolean\n steps: RelayQuoteResult<VmType>['steps']\n fallbackTxHash: RelayTxHash<VmType>\n logger: Logger\n logPrefix: string\n}): RelayTxHash<VmType> {\n if (!smartWalletAdapter) {\n return fallbackTxHash\n }\n\n logger.info(`${logPrefix}:extractingTxHashFromReceipt`, {\n message: 'Smart wallet adapter detected, extracting txHash from receipt',\n })\n\n const receipt = steps[0].items[0].receipt\n if (receipt && 'transactionHash' in receipt) {\n const finalTxHash = receipt.transactionHash as RelayTxHash<VmType>\n logger.info(`${logPrefix}:extractedTxHashFromReceipt`, {\n originalTxHash: fallbackTxHash,\n finalTxHash,\n })\n return finalTxHash\n }\n\n logger.error(`${logPrefix}:missingReceiptOrTransactionHash`, {\n message: 'Smart wallet transaction missing receipt or transactionHash',\n })\n return fallbackTxHash\n}\n\nexport async function executeRelayQuote<VmType extends RelayVmType>({\n logger,\n onError,\n onProgress,\n onTransactionConfirmed,\n onUserActionsCompleted,\n relayQuote,\n walletClient,\n smartWalletAdapter = false,\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 // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: remove before merging into main\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 // 'completed' - catch-all for items marked completed with no other info\n // - e.g. Batched items will not have txHash but will have their item marked 'complete'\n // 'pending' - for origin chain transactions that have been included on chain\n // - may sometimes be skipped, hence the need for 'submitted' condition below\n // 'submitted' - for destination chain transactions that have been submitted to the network\n // receipt - is present when the transaction has been mined/confirmed\n // Ensure onUserActionsCompleted is always called before onTransactionConfirmed\n (item) =>\n item.status === 'complete' ||\n item.checkStatus === 'pending' ||\n item.checkStatus === 'submitted' ||\n item.receipt !== undefined,\n ),\n )\n ) {\n logger.info(`${logPrefix}:onUserActionsCompleted`, txHashes)\n isUserActionsCompleted = true\n // Get the actual txHash from the receipt if using a smart wallet\n const finalTxHash = getFinalTxHash({\n smartWalletAdapter,\n steps,\n fallbackTxHash: txHash,\n logger,\n logPrefix,\n })\n\n try {\n await onUserActionsCompleted?.(finalTxHash)\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 // Get the actual txHash from the receipt if using a smart wallet\n const finalTxHash = getFinalTxHash({\n smartWalletAdapter,\n steps,\n fallbackTxHash: txHash,\n logger,\n logPrefix,\n })\n\n // fire and forget index registration - skip for smart wallet adapters\n if (!smartWalletAdapter) {\n manuallyRegisterIndex(logger, {\n requestId: relayQuote.steps[0].requestId as string,\n chainId: relayQuote.steps[0].items[0].data.chainId,\n tx: jsonStringifyWithBigIntSanitization({\n ...relayQuote.steps[0].items[0].data,\n txHash: txHash,\n }),\n })\n }\n\n try {\n await onTransactionConfirmed?.(finalTxHash)\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 logPrefix = 'manuallyRegisterIndex'\n const stringifiedRequest = JSON.stringify(registerRequest)\n const url = `${MAINNET_RELAY_API}/transactions/single`\n try {\n logger.info(`${logPrefix}:onManuallyRegisterIndex`, {\n params: stringifiedRequest,\n })\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(registerRequest),\n })\n if (!response.ok) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: 'Error !response.ok - request to manually register index',\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n return\n }\n\n const data = (await response.json()) as RegisterIndexingResponse\n if (data.message !== 'Success') {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Data.message is not of type Success - ${data.message}`,\n response: JSON.stringify(response),\n params: stringifiedRequest,\n })\n }\n return\n } catch (err) {\n logger.error(`${logPrefix}:onManuallyRegisterIndexError`, {\n message: `Error sending request to register index at ${url}: ${JSON.stringify((err as Error)?.message)}`,\n 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_HYPERCORE_CHAIN_ID_NUMBER,\n FUN_SOLANA_CHAIN_ID_NUMBER,\n RELAY_BITCOIN_CHAIN_ID_NUMBER,\n RELAY_NATIVE_TOKEN,\n RELAY_NATIVE_TOKEN_BITCOIN,\n RELAY_NATIVE_TOKEN_HYPERCORE,\n RELAY_NATIVE_TOKEN_SOLANA,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n RELAY_TERMINAL_STATUSES,\n} from './constants'\nimport type { RelayAddress, RelayVmType } from './execution'\nimport {\n CheckoutRefundState,\n CheckoutState,\n type RelayExecutionInfo,\n RelayExecutionStatus,\n} from './types'\n\n/**\n * Converts a token address within Funkit to the corresponding Relay token address.\n */\nexport function convertFunToRelayTokenAddress<T extends RelayVmType>(\n address: RelayAddress<T>,\n chainId: number,\n): RelayAddress<T> {\n // convert Fun's NATIVE_TOKEN representation\n if (address.toLowerCase() === FUNKIT_NATIVE_TOKEN.toLowerCase()) {\n switch (chainId) {\n case FUN_HYPERCORE_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_HYPERCORE as RelayAddress<T>\n\n case RELAY_BITCOIN_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_BITCOIN as RelayAddress<T>\n\n case RELAY_SOLANA_CHAIN_ID_NUMBER:\n return RELAY_NATIVE_TOKEN_SOLANA as RelayAddress<T>\n\n default:\n return RELAY_NATIVE_TOKEN as RelayAddress<T>\n }\n }\n\n return address\n}\n\n/**\n * Converts a chainId within Funkit to the corresponding Relay chainId.\n */\nexport function convertFunToRelayChainId(chainId: number): number {\n if (chainId === FUN_SOLANA_CHAIN_ID_NUMBER) {\n return RELAY_SOLANA_CHAIN_ID_NUMBER\n }\n return chainId\n}\n\nexport function getRelayExecutionRefundState(\n info: RelayExecutionInfo,\n): CheckoutRefundState | undefined {\n switch (info.status) {\n case RelayExecutionStatus.REFUND:\n return CheckoutRefundState.REFUNDED\n default:\n return undefined\n }\n}\n\nexport function getRelayExecutionState(\n info: RelayExecutionInfo,\n): CheckoutState {\n switch (info.status) {\n case RelayExecutionStatus.SUCCESS:\n return CheckoutState.COMPLETED\n case RelayExecutionStatus.FAILURE:\n case RelayExecutionStatus.REFUND:\n return CheckoutState.CHECKOUT_ERROR\n default:\n return CheckoutState.PENDING_RECEIVAL\n }\n}\n\n/**\n * Checks whether the Relay execution has reached a terminal status.\n */\nexport function isRelayExecutionTerminalStatus(\n info: RelayExecutionInfo,\n): boolean {\n return RELAY_TERMINAL_STATUSES.includes(info.status)\n}\n\nexport type Serializable =\n | bigint\n | boolean\n | null\n | number\n | string\n | Date\n | object // Should be '{ [key: string]: Serializable }' but helper gets called with loosely-typed 'object' and interfaces\n | Serializable[]\n\nexport function jsonStringifyWithBigIntSanitization(\n serializable: Serializable,\n): string {\n return JSON.stringify(\n serializable,\n (_, value) =>\n typeof value === 'bigint' ? `0x${value.toString(16)}` : value, // return everything else unchanged\n )\n}\n", "import type { CallFees } from '@relayprotocol/relay-sdk'\nimport type { Logger } from './types'\n\nexport interface FunRelayFeeItem {\n b: number\n v: number\n config: {\n options: Record<string, unknown>\n }\n headers: Record<string, string>\n}\n\nexport async function getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue,\n clientId,\n recipientAddress,\n}: {\n fromTokenAddress: string\n fromChainId: string\n toTokenAddress: string\n toChainId: string\n estUsdValue: number\n clientId: string\n recipientAddress: string | undefined\n}): Promise<FunRelayFeeItem> {\n const params = new URLSearchParams({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: estUsdValue.toString(),\n clientId,\n ...(recipientAddress ? { recipientAddress } : {}),\n })\n const url = `https://frog.fun.xyz/api/fee?${params.toString()}`\n const response = await fetch(url)\n if (!response.ok) {\n throw Error(response.statusText)\n }\n\n const data = await response.json()\n return data\n}\n\nexport function parseRelayFees({\n fees,\n 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 '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport type { RelayTokenPriceInfo } from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport async function getRelayAssetPriceInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenPriceInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/token/price?chainId=${relayChainId}&address=${relayTokenAddress}`\n const 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 { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayAddress } from './execution'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\nexport interface RelayTokenInfo {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n vmType: string\n metadata: {\n logoURI: string\n verified: boolean\n isNative: boolean\n }\n}\n\nexport async function getRelayAssetInfo({\n chainId,\n address,\n}: {\n chainId: string\n address: string\n}): Promise<RelayTokenInfo> {\n const relayChainId = convertFunToRelayChainId(Number(chainId))\n const relayTokenAddress = convertFunToRelayTokenAddress(\n address as RelayAddress,\n relayChainId,\n )\n\n const url = `${MAINNET_RELAY_API}/currencies/v2`\n const body = {\n chainIds: [relayChainId],\n address: relayTokenAddress,\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 {\n type APIError,\n type Execute,\n type GetQuoteParameters,\n isAPIError,\n} from '@relayprotocol/relay-sdk'\nimport { type Address, encodeFunctionData } from 'viem'\nimport { getRelayClient } from './client'\nimport {\n FUN_RELAY_REFERRER,\n FUN_RELAY_REVENUE_WALLET,\n RELAY_QUOTE_CHECKOUT_TIME_BUFFER_MS,\n} from './constants'\nimport { getRelayAssetInfo } from './currency'\nimport type {\n RelayAddress,\n RelayChainId,\n RelayVmType,\n RelayWallet,\n} from './execution'\nimport { getFunRelayFees, parseRelayFees } from './fees'\nimport { getRelayAssetPriceInfo } from './price'\nimport type { SolanaAddress } from './solana'\nimport type {\n ApiFunkitCheckoutActionParams,\n CheckoutQuoteResponse,\n Logger,\n} from './types'\nimport {\n convertFunToRelayChainId,\n convertFunToRelayTokenAddress,\n} from './utils'\n\ntype RelayQuoteOptions = GetQuoteParameters['options'] & {\n // TODO: Relay does not yet explicitly handle this field in their SDK, nor is it in their typings - but it gets forwarded to API\n depositFeePayer?: SolanaAddress\n}\n\nexport type RelayQuoteResult<VmType extends RelayVmType> = {\n details?: {\n currencyIn?: NonNullable<Execute['details']>['currencyIn']\n currencyOut?: NonNullable<Execute['details']>['currencyOut']\n }\n steps: Execute['steps']\n vmType: VmType\n}\n\nexport type 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 Number(tokenChainId),\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 // FIXME: Temp hardcode until relay supports WUSDE on Ethereal\n const isWUsdeEthereal =\n normalizedChainId === '5064014' &&\n normalizedTokenAddress.toLowerCase() ===\n '0xB6fC4B1BFF391e5F6b4a3D2C7Bda1FeE3524692D'.toLowerCase()\n\n const price = tokenPriceRes.price\n const decimals = isWUsdeEthereal ? 18 : tokenInfoRes.decimals\n\n const absoluteAmount = BigInt(tokenAmountBaseUnit) / BigInt(10 ** decimals)\n return Number(price) * Number(absoluteAmount)\n } catch (err) {\n logger.error('getQuoteEstUsdValueError', {\n message: `Failed to get USD value for token ${tokenAddress} on chain ${tokenChainId}: ${\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 function getReferrer(clientId: string) {\n return clientId ? `${FUN_RELAY_REFERRER}|${clientId}` : FUN_RELAY_REFERRER\n}\n\nexport class RelayQuoteClientError extends Error {\n public constructor(\n public readonly statusCode: number,\n public readonly relayErrorCode: string,\n message: string,\n ) {\n super(\n `An error occurred trying to generate a relay quote: ${relayErrorCode} - ${message}`,\n )\n\n this.name = new.target.name\n Object.setPrototypeOf(this, new.target.prototype)\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 tradeType,\n userAddress,\n } = params\n\n const vmType = (\n walletClient && 'vmType' in walletClient ? walletClient.vmType : 'evm'\n ) as SourceVmType\n\n try {\n const relayClient = getRelayClient()\n\n 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 funRelayConfig = await getFunRelayFees({\n fromTokenAddress,\n fromChainId,\n toTokenAddress,\n toChainId,\n estUsdValue: Number(estUsdValue) || 0,\n clientId,\n recipientAddress,\n })\n\n const appFeeBp = funRelayConfig.b + funRelayConfig.v\n\n logger.info('getRelayQuoteParams', {\n ...params,\n appFeeBp,\n estUsdValue,\n funRelayConfig,\n queryTokenAmountBaseUnit,\n txs,\n })\n\n // Get the full quote with fees\n const relayQuote = await relayClient.actions.getQuote(\n {\n amount: queryTokenAmountBaseUnit.toString(),\n chainId: convertFunToRelayChainId(Number(fromChainId)),\n currency: convertFunToRelayTokenAddress(\n fromTokenAddress,\n Number(fromChainId),\n ),\n recipient: recipientAddress,\n toChainId: convertFunToRelayChainId(Number(toChainId)),\n toCurrency: convertFunToRelayTokenAddress(\n toTokenAddress,\n Number(toChainId),\n ),\n tradeType,\n txs,\n user: userAddress,\n wallet: walletClient,\n options: {\n referrer: getReferrer(clientId),\n appFees: [\n {\n fee: appFeeBp.toString(),\n recipient: FUN_RELAY_REVENUE_WALLET,\n },\n ],\n // Passed in options\n ...options,\n // Remote options will always override passed in options\n ...funRelayConfig.config.options,\n },\n },\n undefined,\n funRelayConfig.headers,\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: {\n ...relayQuote,\n vmType,\n },\n toAmountBaseUnit: isExactIn\n ? (relayQuote.details.currencyOut.amount ?? '0')\n : queryTokenAmountBaseUnit.toString(),\n },\n }\n } catch (err) {\n if (err instanceof Error && isAPIError(err)) {\n const apiError = err as APIError\n const rawError = apiError.rawError as {\n errorCode?: string\n message?: string\n }\n\n if (rawError?.errorCode) {\n throw new RelayQuoteClientError(\n apiError.statusCode,\n rawError.errorCode,\n rawError.message ?? apiError.message,\n )\n }\n }\n\n const message = getErrorMessage(err)\n throw new Error(\n `An error occurred trying to generate a relay quote: ${message}`,\n )\n }\n}\n\nfunction getErrorMessage(err: unknown): string {\n return err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : JSON.stringify(err)\n}\n", "import type { AdaptedWallet } from '@relayprotocol/relay-sdk'\nimport { adaptSolanaWallet } from '@relayprotocol/relay-svm-wallet-adapter'\nimport {\n type Connection,\n SendTransactionError,\n type VersionedTransaction,\n} from '@solana/web3.js'\nimport { RELAY_SOLANA_CHAIN_ID_NUMBER } from './constants'\n\ntype Base58 =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\nexport type SolanaAddress = `${Base58}${string}`\n\nexport type SolanaTxHash = `${Base58}${string}`\n\nexport type SolanaWallet = {\n address(): Promise<SolanaAddress>\n vmType: 'svm'\n} & AdaptedWallet\n\nexport function getSolanaWallet(\n walletAddress: SolanaAddress,\n connection: Connection,\n signTransaction: (\n transaction: VersionedTransaction,\n ) => Promise<VersionedTransaction>,\n payerKey?: SolanaAddress,\n): SolanaWallet {\n return adaptSolanaWallet(\n walletAddress,\n RELAY_SOLANA_CHAIN_ID_NUMBER,\n connection,\n async (transaction, options) => {\n const signed = await signTransaction(transaction)\n try {\n const signature = await connection.sendTransaction(signed, {\n ...options,\n maxRetries: 5,\n })\n\n return { signature }\n } catch (error) {\n if (error instanceof SendTransactionError) {\n console.error(\n 'Failed transaction logs:',\n error,\n await error.getLogs(connection),\n )\n }\n\n throw error\n }\n },\n payerKey,\n ) as SolanaWallet\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["LogLevel", "LogLevel", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API", "MAINNET_RELAY_API"]
|
|
7
7
|
}
|
package/dist/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,kBAAkB,EAClB,YAAY,GAAG,QAAQ,GAAG,QAAQ,CACnC,GAAG;IACF,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,MAAM,EACN,GAAG,OAAO,EACX,EAAE,2BAA2B,GAAG,WAAW,CAoB3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAQ5C"}
|
package/dist/src/execution.d.ts
CHANGED
|
@@ -46,8 +46,13 @@ export interface ExecuteRelayQuoteParams<VmType extends RelayVmType> {
|
|
|
46
46
|
onUserActionsCompleted?: (txHash: RelayTxHash<VmType>) => Promise<void>;
|
|
47
47
|
relayQuote: RelayQuoteResult<VmType>;
|
|
48
48
|
walletClient: RelayWallet<VmType>;
|
|
49
|
+
/**
|
|
50
|
+
* Whether to use a smart wallet adapter.
|
|
51
|
+
* Used for account abstraction transactions.
|
|
52
|
+
*/
|
|
53
|
+
smartWalletAdapter?: boolean;
|
|
49
54
|
}
|
|
50
|
-
export declare function executeRelayQuote<VmType extends RelayVmType>({ logger, onError, onProgress, onTransactionConfirmed, onUserActionsCompleted, relayQuote, walletClient, }: ExecuteRelayQuoteParams<VmType>): Promise<void>;
|
|
55
|
+
export declare function executeRelayQuote<VmType extends RelayVmType>({ logger, onError, onProgress, onTransactionConfirmed, onUserActionsCompleted, relayQuote, walletClient, smartWalletAdapter, }: ExecuteRelayQuoteParams<VmType>): Promise<void>;
|
|
51
56
|
export interface PostRegistrationRequest {
|
|
52
57
|
requestId: string;
|
|
53
58
|
chainId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAGzD,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,EAAE,CAAA;AAEjE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE/C,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAAI;IACnE,GAAG,EAAE,cAAc,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,GAAG,EAAE,aAAa,CAAA;CACnB,CAAC,MAAM,CAAC,CAAA;AAET,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAAI;IACnE,GAAG,EAAE,OAAO,sBAAsB,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,OAAO,qBAAqB,CAAA;CAClC,CAAC,MAAM,CAAC,CAAA;AAET,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAAI;IAClE,GAAG,EAAE,aAAa,CAAA;IAClB,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,YAAY,CAAA;CAClB,CAAC,MAAM,CAAC,CAAA;AAET,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,IAAI;IAClE,GAAG,EAAE,aAAa,CAAA;IAClB,GAAG,EAAE,YAAY,GAAG,CAAC,aAAa,GAAG;QAAE,MAAM,EAAE,KAAK,CAAA;KAAE,CAAC,CAAA;IACvD,GAAG,EAAE,YAAY,CAAA;CAClB,CAAC,MAAM,CAAC,CAAA;AAET,MAAM,WAAW,uBAAuB,CAAC,MAAM,SAAS,WAAW;IACjE,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAAK,IAAI,CAAA;IACtD;;OAEG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACpC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,kBAAkB,EAExB,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,WAAW,EACjE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,GACd,YAAY,CAAC,CAAC,CAAC,CAmBjB;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": "2.1.
|
|
3
|
+
"version": "2.1.4-next.1",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist/src",
|
|
6
6
|
"dist/index.d.ts",
|
|
@@ -27,12 +27,15 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@relayprotocol/relay-bitcoin-wallet-adapter": "^
|
|
31
|
-
"@relayprotocol/relay-sdk": "^3.0
|
|
32
|
-
"@relayprotocol/relay-svm-wallet-adapter": "^
|
|
30
|
+
"@relayprotocol/relay-bitcoin-wallet-adapter": "^12.0.0",
|
|
31
|
+
"@relayprotocol/relay-sdk": "^3.1.0",
|
|
32
|
+
"@relayprotocol/relay-svm-wallet-adapter": "^13.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@solana/web3.js": "^1.98.2",
|
|
36
|
+
"bitcoinjs-lib": "^6.1.7",
|
|
37
|
+
"ecpair": "^3.0.0",
|
|
38
|
+
"tiny-secp256k1": "^2.2.4",
|
|
36
39
|
"viem": "2.29.4"
|
|
37
40
|
},
|
|
38
41
|
"peerDependencies": {
|