@avalabs/fusion-sdk 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/mod.cjs +1 -1
  2. package/dist/mod.d.cts +5 -1
  3. package/dist/mod.d.ts +5 -1
  4. package/dist/mod.js +1 -1
  5. package/dist/transfer-manager.cjs +1 -1
  6. package/dist/transfer-manager.cjs.map +1 -1
  7. package/dist/transfer-manager.js +1 -1
  8. package/dist/transfer-manager.js.map +1 -1
  9. package/dist/transfer-service/_evm-approval.cjs +2 -0
  10. package/dist/transfer-service/_evm-approval.cjs.map +1 -0
  11. package/dist/transfer-service/_evm-approval.d.cts +23 -0
  12. package/dist/transfer-service/_evm-approval.d.ts +23 -0
  13. package/dist/transfer-service/_evm-approval.js +2 -0
  14. package/dist/transfer-service/_evm-approval.js.map +1 -0
  15. package/dist/transfer-service/_utils.cjs +1 -1
  16. package/dist/transfer-service/_utils.cjs.map +1 -1
  17. package/dist/transfer-service/_utils.d.ts +1 -0
  18. package/dist/transfer-service/_utils.js +1 -1
  19. package/dist/transfer-service/_utils.js.map +1 -1
  20. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +1 -1
  21. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +1 -1
  22. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +1 -1
  23. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +1 -1
  24. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +1 -1
  25. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +1 -1
  26. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +1 -1
  27. package/dist/transfer-service/avalanche-cct/_utils/fees.js +1 -1
  28. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +1 -1
  29. package/dist/transfer-service/avalanche-cct/_utils/polling.js +1 -1
  30. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +1 -1
  31. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +1 -1
  32. package/dist/transfer-service/markr/_api.cjs +1 -1
  33. package/dist/transfer-service/markr/_api.cjs.map +1 -1
  34. package/dist/transfer-service/markr/_api.js +1 -1
  35. package/dist/transfer-service/markr/_api.js.map +1 -1
  36. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  37. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  38. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  39. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
  40. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  41. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
  42. package/dist/transfer-service/markr/_schema.cjs +1 -1
  43. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  44. package/dist/transfer-service/markr/_schema.js +1 -1
  45. package/dist/transfer-service/markr/_schema.js.map +1 -1
  46. package/dist/transfer-service/markr/_utils.cjs +1 -1
  47. package/dist/transfer-service/markr/_utils.cjs.map +1 -1
  48. package/dist/transfer-service/markr/_utils.js +1 -1
  49. package/dist/transfer-service/markr/_utils.js.map +1 -1
  50. package/dist/transfer-service/markr/markr-service.cjs +1 -1
  51. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  52. package/dist/transfer-service/markr/markr-service.d.cts +26 -0
  53. package/dist/transfer-service/markr/markr-service.d.ts +26 -0
  54. package/dist/transfer-service/markr/markr-service.js +1 -1
  55. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  56. package/dist/transfer-service/markr/recurring/_api.cjs +2 -0
  57. package/dist/transfer-service/markr/recurring/_api.cjs.map +1 -0
  58. package/dist/transfer-service/markr/recurring/_api.js +2 -0
  59. package/dist/transfer-service/markr/recurring/_api.js.map +1 -0
  60. package/dist/transfer-service/markr/recurring/_chain-info.cjs +2 -0
  61. package/dist/transfer-service/markr/recurring/_chain-info.cjs.map +1 -0
  62. package/dist/transfer-service/markr/recurring/_chain-info.js +2 -0
  63. package/dist/transfer-service/markr/recurring/_chain-info.js.map +1 -0
  64. package/dist/transfer-service/markr/recurring/_eligibility.cjs +2 -0
  65. package/dist/transfer-service/markr/recurring/_eligibility.cjs.map +1 -0
  66. package/dist/transfer-service/markr/recurring/_eligibility.js +2 -0
  67. package/dist/transfer-service/markr/recurring/_eligibility.js.map +1 -0
  68. package/dist/transfer-service/markr/recurring/_frequency.cjs +2 -0
  69. package/dist/transfer-service/markr/recurring/_frequency.cjs.map +1 -0
  70. package/dist/transfer-service/markr/recurring/_frequency.d.cts +17 -0
  71. package/dist/transfer-service/markr/recurring/_frequency.d.ts +17 -0
  72. package/dist/transfer-service/markr/recurring/_frequency.js +2 -0
  73. package/dist/transfer-service/markr/recurring/_frequency.js.map +1 -0
  74. package/dist/transfer-service/markr/recurring/_namespace.cjs +2 -0
  75. package/dist/transfer-service/markr/recurring/_namespace.cjs.map +1 -0
  76. package/dist/transfer-service/markr/recurring/_namespace.js +2 -0
  77. package/dist/transfer-service/markr/recurring/_namespace.js.map +1 -0
  78. package/dist/transfer-service/markr/recurring/_schema.cjs +2 -0
  79. package/dist/transfer-service/markr/recurring/_schema.cjs.map +1 -0
  80. package/dist/transfer-service/markr/recurring/_schema.js +2 -0
  81. package/dist/transfer-service/markr/recurring/_schema.js.map +1 -0
  82. package/dist/transfer-service/markr/recurring/index.d.ts +2 -0
  83. package/dist/transfer-service/markr/recurring/types.cjs +2 -0
  84. package/dist/transfer-service/markr/recurring/types.cjs.map +1 -0
  85. package/dist/transfer-service/markr/recurring/types.d.cts +439 -0
  86. package/dist/transfer-service/markr/recurring/types.d.ts +439 -0
  87. package/dist/transfer-service/markr/recurring/types.js +2 -0
  88. package/dist/transfer-service/markr/recurring/types.js.map +1 -0
  89. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
  90. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
  91. package/dist/types/transfer-manager.d.cts +16 -0
  92. package/dist/types/transfer-manager.d.ts +16 -0
  93. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.cjs","names":["splitCaip2ChainId","InvalidParamsError","publicActions","AbortedError"],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { AbortedError, ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nexport async function wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_utils.cjs","names":["splitCaip2ChainId","InvalidParamsError","publicActions","AbortedError"],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { AbortedError, ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { GasSettings } from '../types/service';\nimport type { EvmTransactionRequest } from '../types/signer';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\n/**\n * Concrete viem client returned by {@link getEvmClientForChain}. Exported so\n * helpers like {@link buildErc20ApprovalRequest} and\n * {@link signApprovalAndAssertConfirmed} can structurally type the `client`\n * arg without rebuilding the viem-types tower.\n */\nexport type EvmSourceClient = Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions>;\n\nexport function getEvmClientForChain({ chain }: { chain: Chain }): EvmSourceClient {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\n/**\n * Pulls the EIP-1559 fee fields out of {@link GasSettings} as a spread-ready\n * object suitable for inclusion in an {@link EvmTransactionRequest} literal.\n * Returns an empty object when `gasSettings?.maxFeePerGas` is `undefined`\n * (legacy / wallet-default gas pricing) so the consumer's wallet picks the\n * fee tier — matches the convention used across every EVM signing path.\n */\nexport function maybe1559(\n gasSettings: GasSettings | undefined,\n): Pick<EvmTransactionRequest, 'maxFeePerGas' | 'maxPriorityFeePerGas'> {\n return gasSettings?.maxFeePerGas !== undefined\n ? { maxFeePerGas: gasSettings.maxFeePerGas, maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas }\n : {};\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nexport async function wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -1,2 +1,2 @@
1
- import{AbortedError as e,InvalidParamsError as t}from"../errors.js";import{splitCaip2ChainId as n}from"../utils/caip.js";import{createWalletClient as r,http as i,publicActions as a}from"viem";import{createSolanaRpc as o}from"@solana/kit";function s(e){let{namespace:r,reference:i}=n(e.chainId);if(r!==`eip155`)throw new t(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses?.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}}function c({chain:e}){return r({chain:s(e),transport:i(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(a)}function l({chain:e}){return o(e.rpcUrl)}function u(e,n){if(n===void 0)return e;if(!Number.isInteger(n)||n<0)throw new t(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return e*BigInt(1e4+n)/10000n}function d({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const f=Symbol(`aborted`);async function p(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(f),{once:!0})})]);return n===f||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function m(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}async function h(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e);n.addEventListener(`abort`,o)}})}export{u as applyFeeUnitsBpsMargin,p as awaitOrAbort,c as getEvmClientForChain,l as getSolanaRpcForChain,m as makeFailedTransferFromQuote,h as wait,d as waitForTimeoutOrAbort};
1
+ import{AbortedError as e,InvalidParamsError as t}from"../errors.js";import{splitCaip2ChainId as n}from"../utils/caip.js";import{createWalletClient as r,http as i,publicActions as a}from"viem";import{createSolanaRpc as o}from"@solana/kit";function s(e){let{namespace:r,reference:i}=n(e.chainId);if(r!==`eip155`)throw new t(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses?.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}}function c({chain:e}){return r({chain:s(e),transport:i(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(a)}function l({chain:e}){return o(e.rpcUrl)}function u(e){return e?.maxFeePerGas===void 0?{}:{maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas}}function d(e,n){if(n===void 0)return e;if(!Number.isInteger(n)||n<0)throw new t(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return e*BigInt(1e4+n)/10000n}function f({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const p=Symbol(`aborted`);async function m(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(p),{once:!0})})]);return n===p||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function h(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}async function g(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e);n.addEventListener(`abort`,o)}})}export{d as applyFeeUnitsBpsMargin,m as awaitOrAbort,c as getEvmClientForChain,l as getSolanaRpcForChain,h as makeFailedTransferFromQuote,u as maybe1559,g as wait,f as waitForTimeoutOrAbort};
2
2
  //# sourceMappingURL=_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.js","names":[],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { AbortedError, ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nexport async function wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_utils.js","names":[],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { AbortedError, ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { GasSettings } from '../types/service';\nimport type { EvmTransactionRequest } from '../types/signer';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\n/**\n * Concrete viem client returned by {@link getEvmClientForChain}. Exported so\n * helpers like {@link buildErc20ApprovalRequest} and\n * {@link signApprovalAndAssertConfirmed} can structurally type the `client`\n * arg without rebuilding the viem-types tower.\n */\nexport type EvmSourceClient = Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions>;\n\nexport function getEvmClientForChain({ chain }: { chain: Chain }): EvmSourceClient {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\n/**\n * Pulls the EIP-1559 fee fields out of {@link GasSettings} as a spread-ready\n * object suitable for inclusion in an {@link EvmTransactionRequest} literal.\n * Returns an empty object when `gasSettings?.maxFeePerGas` is `undefined`\n * (legacy / wallet-default gas pricing) so the consumer's wallet picks the\n * fee tier — matches the convention used across every EVM signing path.\n */\nexport function maybe1559(\n gasSettings: GasSettings | undefined,\n): Pick<EvmTransactionRequest, 'maxFeePerGas' | 'maxPriorityFeePerGas'> {\n return gasSettings?.maxFeePerGas !== undefined\n ? { maxFeePerGas: gasSettings.maxFeePerGas, maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas }\n : {};\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nexport async function wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n"],"mappings":"8OAmCA,SAAS,EAAa,EAAyB,CAC7C,GAAM,CAAE,YAAW,UAAW,GAAY,EAAkB,EAAM,QAAQ,CAE1E,GAAI,IAAc,SAChB,MAAM,IAAI,EACR,+CACA,gCAAgC,EAAU,qCAC3C,CAGH,MAAO,CACL,GAAI,OAAO,EAAQ,CACnB,KAAM,EAAM,UACZ,eAAgB,CACd,SAAU,EAAM,aAAa,SAC7B,OAAQ,EAAM,aAAa,OAC3B,KAAM,EAAM,aAAa,KAC1B,CACD,QAAS,CACP,QAAS,CACP,KAAM,CAAC,EAAM,OAAO,CACrB,CACD,OAAQ,CACN,KAAM,CAAC,EAAM,OAAO,CACrB,CACF,CACD,GAAI,EAAM,kBAAkB,WAAa,CACvC,UAAW,CACT,WAAY,CACV,QAAS,EAAM,iBAAiB,UACjC,CACF,CACF,CACF,CAWH,SAAgB,EAAqB,CAAE,SAA4C,CAejF,OALe,EAAmB,CAChC,MAVgB,EAAa,EAAM,CAWnC,UATgB,EAAK,EAAM,OAAQ,CACnC,MAAO,GACP,WAAY,EACZ,WAAY,IACZ,QAAS,KACV,CAAC,CAKD,CAAC,CAAC,OAAO,EAAc,CAK1B,SAAgB,EAAqB,CAAE,SAA8C,CACnF,OAAO,EAAgB,EAAM,OAAO,CAUtC,SAAgB,EACd,EACsE,CACtE,OAAO,GAAa,eAAiB,IAAA,GAEjC,EAAE,CADF,CAAE,aAAc,EAAY,aAAc,qBAAsB,EAAY,qBAAsB,CAIxG,SAAgB,EAAuB,EAAkB,EAA+C,CACtG,GAAI,IAAsB,IAAA,GACxB,OAAO,EAGT,GAAI,CAAC,OAAO,UAAU,EAAkB,EAAI,EAAoB,EAC9D,MAAM,IAAI,EACR,4BACA,6DAA6D,IAC9D,CAGH,OAAQ,EAAW,OAAO,IAAS,EAAkB,CAAI,OAiJ3D,SAAgB,EAAsB,CACpC,YACA,UAIiB,CACjB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAU,GAER,MAAqB,CACrB,IAIJ,EAAU,GACV,aAAa,EAAU,CACvB,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAS,GAGL,MAAsB,CAC1B,GAAQ,EAGJ,EAAY,eAAiB,CACjC,GAAQ,EACP,EAAU,CAEb,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,CAErD,EAAO,SACT,GAAQ,EAEV,CAGJ,MAAM,EAA2B,OAAO,UAAU,CA4BlD,eAAsB,EACpB,EACA,EAC6D,CAC7D,IAAM,EAAiB,MAAM,QAAQ,KAAK,CACxC,EACA,IAAI,QAA2B,GAAY,CACzC,EAAO,iBAAiB,YAAe,EAAQ,EAAU,CAAE,CAAE,KAAM,GAAM,CAAC,EAC1E,CACH,CAAC,CAMF,OAJI,IAAmB,GAAa,EAAO,QAClC,CAAE,OAAQ,UAAW,CAGvB,CAAE,OAAQ,KAAM,MAAO,EAAgB,CAShD,SAAgB,EACd,EACA,EAKgB,CAChB,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAQ,YACrB,UAAW,EAAQ,UACnB,YAAa,EAAQ,YACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb,CAGH,eAAsB,EAAK,EAAiB,EAAqC,CAC/E,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAI,GAAW,EACb,OAAO,GAAS,CAGlB,IAAM,EAAY,eAAiB,CACjC,GAAS,CACT,GAAS,EACR,EAAQ,CAEL,MAAgB,CACpB,GAAS,CACT,EAAO,IAAI,EAAe,EAGtB,MAAgB,CACpB,aAAa,EAAU,CAEnB,GACF,EAAO,oBAAoB,QAAS,EAAQ,EAIhD,GAAI,EAAQ,CACV,GAAI,EAAO,QAGT,OAFA,GAAS,CAEF,EAAO,IAAI,EAAe,CAGnC,EAAO,iBAAiB,QAAS,EAAQ,GAE3C"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils.cjs`),r=require(`../../_utils.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../_utils/fees.cjs`);function o({ajsContext:o,environment:s,getAtomicUtxos:c,getUtxos:l}){return async(u,d)=>{if(u.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=s===e.Environment.TEST,p=r.getEvmClientForChain({chain:f?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),m=d?.overrides?.maxFeePerGas??(await i.fetchSuggestedGasPrices(p))[d?.overrides?.feeRateTier??`fast`].maxFeePerGas,h=d?.feeUnitsMarginBps,g=n.getChainAlias(u.sourceChain.chainId,f),_=n.getChainAlias(u.targetChain.chainId,f),v=(await c(_,g)).getUTXOs(),y=u.amountIn>0n,b=y&&g===`P`?Math.max((await l(`P`)).getUTXOs().length,1):1,x=v.length+(y?1:0),S={context:o,environment:s,maxFeePerGas:m,numberInputs:b},C={context:o,environment:s,maxFeePerGas:m,numberInputs:x,numberSignatures:1},w=y?await a.getExportFeeInNanoAvax(g,{...S,feeUnitsMarginBps:h}):0n,T=await a.getImportFeeInNanoAvax(_,{...C,feeUnitsMarginBps:h}),E=y?await a.getExportFeeInNanoAvax(g,{...S,feeUnitsMarginBps:void 0}):0n,D=await a.getImportFeeInNanoAvax(_,{...C,feeUnitsMarginBps:void 0}),O=w+T,k=E+D,A=g===`C`,j=A?n.convertNanoAvaxToWei(O):O,M=A?n.convertNanoAvaxToWei(k):k;return{asset:n.getNativeTokenForChainAlias(g),totalFee:j,totalFeeWithoutMargin:M}}}exports.estimateNativeFeeFactory=o;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../_utils.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../_utils/fees.cjs`);function o({ajsContext:o,environment:s,getAtomicUtxos:c,getUtxos:l}){return async(u,d)=>{if(u.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=s===e.Environment.TEST,p=n.getEvmClientForChain({chain:f?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),m=d?.overrides?.maxFeePerGas??(await i.fetchSuggestedGasPrices(p))[d?.overrides?.feeRateTier??`fast`].maxFeePerGas,h=d?.feeUnitsMarginBps,g=r.getChainAlias(u.sourceChain.chainId,f),_=r.getChainAlias(u.targetChain.chainId,f),v=(await c(_,g)).getUTXOs(),y=u.amountIn>0n,b=y&&g===`P`?Math.max((await l(`P`)).getUTXOs().length,1):1,x=v.length+(y?1:0),S={context:o,environment:s,maxFeePerGas:m,numberInputs:b},C={context:o,environment:s,maxFeePerGas:m,numberInputs:x,numberSignatures:1},w=y?await a.getExportFeeInNanoAvax(g,{...S,feeUnitsMarginBps:h}):0n,T=await a.getImportFeeInNanoAvax(_,{...C,feeUnitsMarginBps:h}),E=y?await a.getExportFeeInNanoAvax(g,{...S,feeUnitsMarginBps:void 0}):0n,D=await a.getImportFeeInNanoAvax(_,{...C,feeUnitsMarginBps:void 0}),O=w+T,k=E+D,A=g===`C`,j=A?r.convertNanoAvaxToWei(O):O,M=A?r.convertNanoAvaxToWei(k):k;return{asset:r.getNativeTokenForChainAlias(g),totalFee:j,totalFeeWithoutMargin:M}}}exports.estimateNativeFeeFactory=o;
2
2
  //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -1,2 +1,2 @@
1
- import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r}from"../../../constants.js";import{ErrorCode as i,ErrorReason as a,SdkError as o}from"../../../errors.js";import{convertNanoAvaxToWei as s,getChainAlias as c,getNativeTokenForChainAlias as l}from"../_utils.js";import{getEvmClientForChain as u}from"../../_utils.js";import{fetchSuggestedGasPrices as d}from"../../_evm-gas.js";import{getExportFeeInNanoAvax as f,getImportFeeInNanoAvax as p}from"../_utils/fees.js";function m({ajsContext:m,environment:h,getAtomicUtxos:g,getUtxos:_}){return async(v,y)=>{if(v.serviceType!==r.AVALANCHE_CCT)throw new o(a.INCORRECT_PROVIDER_PROVIDED,i.INVALID_PARAMS);let b=h===n.TEST,x=u({chain:b?e:t}),S=y?.overrides?.maxFeePerGas??(await d(x))[y?.overrides?.feeRateTier??`fast`].maxFeePerGas,C=y?.feeUnitsMarginBps,w=c(v.sourceChain.chainId,b),T=c(v.targetChain.chainId,b),E=(await g(T,w)).getUTXOs(),D=v.amountIn>0n,O=D&&w===`P`?Math.max((await _(`P`)).getUTXOs().length,1):1,k=E.length+(D?1:0),A={context:m,environment:h,maxFeePerGas:S,numberInputs:O},j={context:m,environment:h,maxFeePerGas:S,numberInputs:k,numberSignatures:1},M=D?await f(w,{...A,feeUnitsMarginBps:C}):0n,N=await p(T,{...j,feeUnitsMarginBps:C}),P=D?await f(w,{...A,feeUnitsMarginBps:void 0}):0n,F=await p(T,{...j,feeUnitsMarginBps:void 0}),I=M+N,L=P+F,R=w===`C`,z=R?s(I):I,B=R?s(L):L;return{asset:l(w),totalFee:z,totalFeeWithoutMargin:B}}}export{m as estimateNativeFeeFactory};
1
+ import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r}from"../../../constants.js";import{ErrorCode as i,ErrorReason as a,SdkError as o}from"../../../errors.js";import{getEvmClientForChain as s}from"../../_utils.js";import{convertNanoAvaxToWei as c,getChainAlias as l,getNativeTokenForChainAlias as u}from"../_utils.js";import{fetchSuggestedGasPrices as d}from"../../_evm-gas.js";import{getExportFeeInNanoAvax as f,getImportFeeInNanoAvax as p}from"../_utils/fees.js";function m({ajsContext:m,environment:h,getAtomicUtxos:g,getUtxos:_}){return async(v,y)=>{if(v.serviceType!==r.AVALANCHE_CCT)throw new o(a.INCORRECT_PROVIDER_PROVIDED,i.INVALID_PARAMS);let b=h===n.TEST,x=s({chain:b?e:t}),S=y?.overrides?.maxFeePerGas??(await d(x))[y?.overrides?.feeRateTier??`fast`].maxFeePerGas,C=y?.feeUnitsMarginBps,w=l(v.sourceChain.chainId,b),T=l(v.targetChain.chainId,b),E=(await g(T,w)).getUTXOs(),D=v.amountIn>0n,O=D&&w===`P`?Math.max((await _(`P`)).getUTXOs().length,1):1,k=E.length+(D?1:0),A={context:m,environment:h,maxFeePerGas:S,numberInputs:O},j={context:m,environment:h,maxFeePerGas:S,numberInputs:k,numberSignatures:1},M=D?await f(w,{...A,feeUnitsMarginBps:C}):0n,N=await p(T,{...j,feeUnitsMarginBps:C}),P=D?await f(w,{...A,feeUnitsMarginBps:void 0}):0n,F=await p(T,{...j,feeUnitsMarginBps:void 0}),I=M+N,L=P+F,R=w===`C`,z=R?c(I):I,B=R?c(L):L;return{asset:u(w),totalFee:z,totalFeeWithoutMargin:B}}}export{m as estimateNativeFeeFactory};
2
2
  //# sourceMappingURL=estimate-native-fee.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../../errors.cjs`),t=require(`../_utils.cjs`),n=require(`../../_utils.cjs`),r=require(`../_utils/polling.cjs`);function i({environment:e}){return({transfer:t,updateListener:r})=>{let i=new AbortController,s=()=>{i.abort()};return t.status===`completed`||t.status===`failed`?{cancel:s,result:Promise.resolve(t)}:{cancel:s,result:(async()=>{let s=structuredClone(t);for(;!i.signal.aborted;){let t=s.status;switch(s.status){case`source-pending`:s=await a({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;case`target-pending`:s=await o({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;default:return s}s.status===t&&await n.waitForTimeoutOrAbort({timeoutMs:1500,signal:i.signal})}return s})()}}}async function a({currentTransfer:n,environment:i}){let a=t.getEnvironmentIsTestnet(i),o=t.getChainAlias(n.sourceChain.chainId,a);try{return await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:n.source.txHash})?{...n,source:{...n.source,confirmationCount:n.source.requiredConfirmationCount},status:`source-completed`}:{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return n}}async function o({currentTransfer:n,environment:i}){if(!n.target?.txHash)return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let a=t.getEnvironmentIsTestnet(i),o=t.getChainAlias(n.targetChain.chainId,a);try{if(!await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:n.target.txHash}))return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let t=n.source.txHash===n.target.txHash;return{...n,completedAtMs:Date.now(),source:{...n.source,confirmationCount:t?n.source.requiredConfirmationCount:n.source.confirmationCount},status:`completed`,target:{...n.target,confirmationCount:n.target.requiredConfirmationCount}}}catch{return n}}exports.trackTransferFactory=i;
1
+ const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils.cjs`),r=require(`../_utils/polling.cjs`);function i({environment:e}){return({transfer:n,updateListener:r})=>{let i=new AbortController,s=()=>{i.abort()};return n.status===`completed`||n.status===`failed`?{cancel:s,result:Promise.resolve(n)}:{cancel:s,result:(async()=>{let s=structuredClone(n);for(;!i.signal.aborted;){let n=s.status;switch(s.status){case`source-pending`:s=await a({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;case`target-pending`:s=await o({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;default:return s}s.status===n&&await t.waitForTimeoutOrAbort({timeoutMs:1500,signal:i.signal})}return s})()}}}async function a({currentTransfer:t,environment:i}){let a=n.getEnvironmentIsTestnet(i),o=n.getChainAlias(t.sourceChain.chainId,a);try{return await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:t.source.txHash})?{...t,source:{...t.source,confirmationCount:t.source.requiredConfirmationCount},status:`source-completed`}:{...t,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return t}}async function o({currentTransfer:t,environment:i}){if(!t.target?.txHash)return{...t,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let a=n.getEnvironmentIsTestnet(i),o=n.getChainAlias(t.targetChain.chainId,a);try{if(!await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:t.target.txHash}))return{...t,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let n=t.source.txHash===t.target.txHash;return{...t,completedAtMs:Date.now(),source:{...t.source,confirmationCount:n?t.source.requiredConfirmationCount:t.source.confirmationCount},status:`completed`,target:{...t.target,confirmationCount:t.target.requiredConfirmationCount}}}catch{return t}}exports.trackTransferFactory=i;
2
2
  //# sourceMappingURL=track-transfer.cjs.map
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"../../../errors.js";import{getChainAlias as t,getEnvironmentIsTestnet as n}from"../_utils.js";import{waitForTimeoutOrAbort as r}from"../../_utils.js";import{pollPrimaryNetworkTxStatus as i}from"../_utils/polling.js";function a({environment:e}){return({transfer:t,updateListener:n})=>{let i=new AbortController,a=()=>{i.abort()};return t.status===`completed`||t.status===`failed`?{cancel:a,result:Promise.resolve(t)}:{cancel:a,result:(async()=>{let a=structuredClone(t);for(;!i.signal.aborted;){let t=a.status;switch(a.status){case`source-pending`:a=await o({currentTransfer:a,environment:e}),i.signal.aborted||n(a);break;case`target-pending`:a=await s({currentTransfer:a,environment:e}),i.signal.aborted||n(a);break;default:return a}a.status===t&&await r({timeoutMs:1500,signal:i.signal})}return a})()}}}async function o({currentTransfer:r,environment:a}){let o=n(a),s=t(r.sourceChain.chainId,o);try{return await i({chainAlias:s,environment:a,txId:r.source.txHash})?{...r,source:{...r.source,confirmationCount:r.source.requiredConfirmationCount},status:`source-completed`}:{...r,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return r}}async function s({currentTransfer:r,environment:a}){if(!r.target?.txHash)return{...r,errorCode:e.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let o=n(a),s=t(r.targetChain.chainId,o);try{if(!await i({chainAlias:s,environment:a,txId:r.target.txHash}))return{...r,errorCode:e.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let t=r.source.txHash===r.target.txHash;return{...r,completedAtMs:Date.now(),source:{...r.source,confirmationCount:t?r.source.requiredConfirmationCount:r.source.confirmationCount},status:`completed`,target:{...r.target,confirmationCount:r.target.requiredConfirmationCount}}}catch{return r}}export{a as trackTransferFactory};
1
+ import{ErrorCode as e}from"../../../errors.js";import{waitForTimeoutOrAbort as t}from"../../_utils.js";import{getChainAlias as n,getEnvironmentIsTestnet as r}from"../_utils.js";import{pollPrimaryNetworkTxStatus as i}from"../_utils/polling.js";function a({environment:e}){return({transfer:n,updateListener:r})=>{let i=new AbortController,a=()=>{i.abort()};return n.status===`completed`||n.status===`failed`?{cancel:a,result:Promise.resolve(n)}:{cancel:a,result:(async()=>{let a=structuredClone(n);for(;!i.signal.aborted;){let n=a.status;switch(a.status){case`source-pending`:a=await o({currentTransfer:a,environment:e}),i.signal.aborted||r(a);break;case`target-pending`:a=await s({currentTransfer:a,environment:e}),i.signal.aborted||r(a);break;default:return a}a.status===n&&await t({timeoutMs:1500,signal:i.signal})}return a})()}}}async function o({currentTransfer:t,environment:a}){let o=r(a),s=n(t.sourceChain.chainId,o);try{return await i({chainAlias:s,environment:a,txId:t.source.txHash})?{...t,source:{...t.source,confirmationCount:t.source.requiredConfirmationCount},status:`source-completed`}:{...t,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return t}}async function s({currentTransfer:t,environment:a}){if(!t.target?.txHash)return{...t,errorCode:e.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let o=r(a),s=n(t.targetChain.chainId,o);try{if(!await i({chainAlias:s,environment:a,txId:t.target.txHash}))return{...t,errorCode:e.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let n=t.source.txHash===t.target.txHash;return{...t,completedAtMs:Date.now(),source:{...t.source,confirmationCount:n?t.source.requiredConfirmationCount:t.source.confirmationCount},status:`completed`,target:{...t.target,confirmationCount:t.target.requiredConfirmationCount}}}catch{return t}}export{a as trackTransferFactory};
2
2
  //# sourceMappingURL=track-transfer.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../constants.cjs`),r=require(`../_utils.cjs`),i=require(`../../_transfer-utilities.cjs`),a=require(`../../_utils.cjs`),o=require(`../_utils/p-chain.cjs`),s=require(`../_utils/polling.cjs`),c=require(`../_utils/transactions.cjs`),l=require(`../_utils/fees.cjs`),u=require(`../_utils/addresses.cjs`);function d({ajsContext:n,avalancheSendTx:a,environment:o,getCoreEthAddress:c,getAtomicUtxos:l,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let b=r.getEnvironmentIsTestnet(o),x=r.getChainAlias(y.sourceChain.chainId,b),S=r.getChainAlias(y.targetChain.chainId,b),C=u.getExportFromAddressEvm(y.fromAddress,x),w=x===`C`?void 0:u.assertXpAddress(y.fromAddress),T=await u.getExportToAddress({destinationChainAlias:S,getCoreEthAddress:c,quoteToAddress:y.toAddress}),E=u.getImportToAddress(y.toAddress,S),D=S===`C`?T:u.assertXpAddress(y.toAddress),O=y.amountIn>0n,k=O?2:1,A=Date.now(),j=f(y,o),M;if(O){v?.({currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainExport,quote:y,requiredSignatures:k});let c=await r.tryOrThrow(()=>h({ajsContext:n,environment:o,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:x,destinationChainAlias:S,fromAddress:C,requiredFromAddress:w,toAddress:T}),e=>new t.SdkError(`Failed to build Avalanche export transaction.`,t.ErrorCode.UNKNOWN,{cause:e}));M=await r.tryOrThrow(()=>a({baseFeeInNanoAvax:c.baseFeeInNanoAvax,chainAlias:x,txType:`export`,unsignedTx:c.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche export transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));let l;try{l=await s.pollPrimaryNetworkTxStatus({chainAlias:x,environment:o,txId:M})}catch{return i.sourcePendingTransferFromQuote(y,{environment:o,requiredConfirmationCount:1,startedAtMs:A,txHash:M})}if(!l)return p({errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j})}let N=await r.tryOrThrow(async()=>(await l(S,x)).getUTXOs(),e=>new t.SdkError(`Failed to fetch Avalanche atomic UTXOs.`,t.ErrorCode.UNKNOWN,{cause:e}));if(N.length===0)return p({errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j});v?.({currentSignature:O?2:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainImport,quote:y,requiredSignatures:k});let P=await r.tryOrThrow(()=>g({ajsContext:n,atomicUtxos:N,destinationChainAlias:S,environment:o,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,sourceChainAlias:x,requiredFromAddress:D,toAddress:E}),e=>new t.SdkError(`Failed to build Avalanche import transaction.`,t.ErrorCode.UNKNOWN,{cause:e})),F=await r.tryOrThrow(()=>a({baseFeeInNanoAvax:P.baseFeeInNanoAvax,chainAlias:S,txType:`import`,unsignedTx:P.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche import transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));return{...j,source:{confirmationCount:M?1:0,requiredConfirmationCount:1,startedAtMs:A,txHash:M??F},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:F}}}}function f(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function p({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function m(e,t){return e===`C`?t/n.WEI_PER_NANO_AVAX_BIGINT:t}async function h({ajsContext:n,destinationChainAlias:r,environment:i,fromAddress:s,getUtxos:d,getWalletAddressesForChainAlias:f,getWalletChangeAddressForChainAlias:p,quoteAmountIn:h,requiredFromAddress:g,sourceChainAlias:_,toAddress:v}){let y=m(_,h);switch(_){case`C`:{if(r===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);if(!s)throw new t.InvalidParamsError(`fromAddress must be an EVM address when exporting from C-Chain.`);let o=a.getEvmClientForChain({chain:i===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),[u,d]=await Promise.all([o.getTransactionCount({address:s}),l.getCChainBaseFeeInNanoAvax(i)]);return{baseFeeInNanoAvax:d,unsignedTx:c.exportTx({amountInNanoAvax:y,baseFeeInNanoAvax:d,context:n,destinationChainAlias:r,fromAddress:s,nonce:BigInt(u),sourceChainAlias:_,toAddress:v})}}case`P`:{if(r===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,a,s,l]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),o.getFeeState(i),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`P`)]);return{baseFeeInNanoAvax:a.price,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:n,destinationChainAlias:r,feeState:a,fromAddresses:s,sourceChainAlias:_,toAddress:v,utxos:l.getUTXOs()})}}case`X`:{if(r===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,i,a]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`X`)]);return{baseFeeInNanoAvax:n.baseTxFee,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:n,destinationChainAlias:r,fromAddresses:i,sourceChainAlias:_,toAddress:v,utxos:a.getUTXOs()})}}}}async function g({ajsContext:e,atomicUtxos:n,destinationChainAlias:r,environment:i,getWalletAddressesForChainAlias:a,getWalletChangeAddressForChainAlias:s,requiredFromAddress:d,sourceChainAlias:f,toAddress:p}){switch(r){case`C`:{if(f===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[o,s]=await Promise.all([l.getCChainBaseFeeInNanoAvax(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:o,unsignedTx:c.importTx({atomicUtxos:n,baseFeeInNanoAvax:o,context:e,destinationChainAlias:r,fromAddresses:s,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`C`)})}}case`P`:{if(f===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[s,l]=await Promise.all([o.getFeeState(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:s.price,unsignedTx:c.importTx({atomicUtxos:n,context:e,destinationChainAlias:r,feeState:s,fromAddresses:l,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`P`)})}}case`X`:{if(f===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[i,o]=await Promise.all([u.getWalletChangeAddress({chainAlias:r,getWalletChangeAddressForChainAlias:s}),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:c.importTx({atomicUtxos:n,changeAddress:i,context:e,destinationChainAlias:r,fromAddresses:o,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`X`)})}}}}exports.transferAssetFactory=d;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../constants.cjs`),i=require(`../_utils.cjs`),a=require(`../../_transfer-utilities.cjs`),o=require(`../_utils/p-chain.cjs`),s=require(`../_utils/polling.cjs`),c=require(`../_utils/transactions.cjs`),l=require(`../_utils/fees.cjs`),u=require(`../_utils/addresses.cjs`);function d({ajsContext:n,avalancheSendTx:r,environment:o,getCoreEthAddress:c,getAtomicUtxos:l,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let b=i.getEnvironmentIsTestnet(o),x=i.getChainAlias(y.sourceChain.chainId,b),S=i.getChainAlias(y.targetChain.chainId,b),C=u.getExportFromAddressEvm(y.fromAddress,x),w=x===`C`?void 0:u.assertXpAddress(y.fromAddress),T=await u.getExportToAddress({destinationChainAlias:S,getCoreEthAddress:c,quoteToAddress:y.toAddress}),E=u.getImportToAddress(y.toAddress,S),D=S===`C`?T:u.assertXpAddress(y.toAddress),O=y.amountIn>0n,k=O?2:1,A=Date.now(),j=f(y,o),M;if(O){v?.({currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainExport,quote:y,requiredSignatures:k});let c=await i.tryOrThrow(()=>h({ajsContext:n,environment:o,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:x,destinationChainAlias:S,fromAddress:C,requiredFromAddress:w,toAddress:T}),e=>new t.SdkError(`Failed to build Avalanche export transaction.`,t.ErrorCode.UNKNOWN,{cause:e}));M=await i.tryOrThrow(()=>r({baseFeeInNanoAvax:c.baseFeeInNanoAvax,chainAlias:x,txType:`export`,unsignedTx:c.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche export transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));let l;try{l=await s.pollPrimaryNetworkTxStatus({chainAlias:x,environment:o,txId:M})}catch{return a.sourcePendingTransferFromQuote(y,{environment:o,requiredConfirmationCount:1,startedAtMs:A,txHash:M})}if(!l)return p({errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j})}let N=await i.tryOrThrow(async()=>(await l(S,x)).getUTXOs(),e=>new t.SdkError(`Failed to fetch Avalanche atomic UTXOs.`,t.ErrorCode.UNKNOWN,{cause:e}));if(N.length===0)return p({errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j});v?.({currentSignature:O?2:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainImport,quote:y,requiredSignatures:k});let P=await i.tryOrThrow(()=>g({ajsContext:n,atomicUtxos:N,destinationChainAlias:S,environment:o,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,sourceChainAlias:x,requiredFromAddress:D,toAddress:E}),e=>new t.SdkError(`Failed to build Avalanche import transaction.`,t.ErrorCode.UNKNOWN,{cause:e})),F=await i.tryOrThrow(()=>r({baseFeeInNanoAvax:P.baseFeeInNanoAvax,chainAlias:S,txType:`import`,unsignedTx:P.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche import transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));return{...j,source:{confirmationCount:M?1:0,requiredConfirmationCount:1,startedAtMs:A,txHash:M??F},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:F}}}}function f(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function p({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function m(e,t){return e===`C`?t/r.WEI_PER_NANO_AVAX_BIGINT:t}async function h({ajsContext:r,destinationChainAlias:i,environment:a,fromAddress:s,getUtxos:d,getWalletAddressesForChainAlias:f,getWalletChangeAddressForChainAlias:p,quoteAmountIn:h,requiredFromAddress:g,sourceChainAlias:_,toAddress:v}){let y=m(_,h);switch(_){case`C`:{if(i===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);if(!s)throw new t.InvalidParamsError(`fromAddress must be an EVM address when exporting from C-Chain.`);let o=n.getEvmClientForChain({chain:a===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),[u,d]=await Promise.all([o.getTransactionCount({address:s}),l.getCChainBaseFeeInNanoAvax(a)]);return{baseFeeInNanoAvax:d,unsignedTx:c.exportTx({amountInNanoAvax:y,baseFeeInNanoAvax:d,context:r,destinationChainAlias:i,fromAddress:s,nonce:BigInt(u),sourceChainAlias:_,toAddress:v})}}case`P`:{if(i===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,n,s,l]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),o.getFeeState(a),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`P`)]);return{baseFeeInNanoAvax:n.price,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:r,destinationChainAlias:i,feeState:n,fromAddresses:s,sourceChainAlias:_,toAddress:v,utxos:l.getUTXOs()})}}case`X`:{if(i===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,n,a]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`X`)]);return{baseFeeInNanoAvax:r.baseTxFee,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:r,destinationChainAlias:i,fromAddresses:n,sourceChainAlias:_,toAddress:v,utxos:a.getUTXOs()})}}}}async function g({ajsContext:e,atomicUtxos:n,destinationChainAlias:r,environment:i,getWalletAddressesForChainAlias:a,getWalletChangeAddressForChainAlias:s,requiredFromAddress:d,sourceChainAlias:f,toAddress:p}){switch(r){case`C`:{if(f===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[o,s]=await Promise.all([l.getCChainBaseFeeInNanoAvax(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:o,unsignedTx:c.importTx({atomicUtxos:n,baseFeeInNanoAvax:o,context:e,destinationChainAlias:r,fromAddresses:s,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`C`)})}}case`P`:{if(f===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[s,l]=await Promise.all([o.getFeeState(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:s.price,unsignedTx:c.importTx({atomicUtxos:n,context:e,destinationChainAlias:r,feeState:s,fromAddresses:l,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`P`)})}}case`X`:{if(f===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[i,o]=await Promise.all([u.getWalletChangeAddress({chainAlias:r,getWalletChangeAddressForChainAlias:s}),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:c.importTx({atomicUtxos:n,changeAddress:i,context:e,destinationChainAlias:r,fromAddresses:o,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`X`)})}}}}exports.transferAssetFactory=d;
2
2
  //# sourceMappingURL=transfer-asset.cjs.map
@@ -1,2 +1,2 @@
1
- import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r,TransferSignatureReason as i}from"../../../constants.js";import{ErrorCode as a,ErrorReason as o,InvalidParamsError as s,SdkError as c}from"../../../errors.js";import{WEI_PER_NANO_AVAX_BIGINT as l}from"../constants.js";import{getChainAlias as u,getEnvironmentIsTestnet as d,tryOrThrow as f}from"../_utils.js";import{sourcePendingTransferFromQuote as p}from"../../_transfer-utilities.js";import{getEvmClientForChain as m}from"../../_utils.js";import{getFeeState as h}from"../_utils/p-chain.js";import{pollPrimaryNetworkTxStatus as g}from"../_utils/polling.js";import{exportTx as _,importTx as v}from"../_utils/transactions.js";import{getCChainBaseFeeInNanoAvax as y}from"../_utils/fees.js";import{assertXpAddress as b,getExportFromAddressEvm as x,getExportToAddress as S,getImportToAddress as C,getWalletChangeAddress as w,getWalletFromAddresses as T}from"../_utils/addresses.js";function E({ajsContext:e,avalancheSendTx:t,environment:n,getCoreEthAddress:s,getAtomicUtxos:l,getUtxos:m,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==r.AVALANCHE_CCT)throw new c(o.INCORRECT_PROVIDER_PROVIDED,a.INVALID_PARAMS);let w=d(n),T=u(y.sourceChain.chainId,w),E=u(y.targetChain.chainId,w),k=x(y.fromAddress,T),M=T===`C`?void 0:b(y.fromAddress),N=await S({destinationChainAlias:E,getCoreEthAddress:s,quoteToAddress:y.toAddress}),P=C(y.toAddress,E),F=E===`C`?N:b(y.toAddress),I=y.amountIn>0n,L=I?2:1,R=Date.now(),z=D(y,n),B;if(I){v?.({currentSignature:1,currentSignatureReason:i.AvalancheCrossChainExport,quote:y,requiredSignatures:L});let r=await f(()=>A({ajsContext:e,environment:n,getUtxos:m,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:T,destinationChainAlias:E,fromAddress:k,requiredFromAddress:M,toAddress:N}),e=>new c(`Failed to build Avalanche export transaction.`,a.UNKNOWN,{cause:e}));B=await f(()=>t({baseFeeInNanoAvax:r.baseFeeInNanoAvax,chainAlias:T,txType:`export`,unsignedTx:r.unsignedTx}),e=>new c(`Failed to sign/send Avalanche export transaction.`,a.SIGNING_FAILED,{cause:e}));let o;try{o=await g({chainAlias:T,environment:n,txId:B})}catch{return p(y,{environment:n,requiredConfirmationCount:1,startedAtMs:R,txHash:B})}if(!o)return O({errorCode:a.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z})}let V=await f(async()=>(await l(E,T)).getUTXOs(),e=>new c(`Failed to fetch Avalanche atomic UTXOs.`,a.UNKNOWN,{cause:e}));if(V.length===0)return O({errorCode:a.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z});v?.({currentSignature:I?2:1,currentSignatureReason:i.AvalancheCrossChainImport,quote:y,requiredSignatures:L});let H=await f(()=>j({ajsContext:e,atomicUtxos:V,destinationChainAlias:E,environment:n,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,sourceChainAlias:T,requiredFromAddress:F,toAddress:P}),e=>new c(`Failed to build Avalanche import transaction.`,a.UNKNOWN,{cause:e})),U=await f(()=>t({baseFeeInNanoAvax:H.baseFeeInNanoAvax,chainAlias:E,txType:`import`,unsignedTx:H.unsignedTx}),e=>new c(`Failed to sign/send Avalanche import transaction.`,a.SIGNING_FAILED,{cause:e}));return{...z,source:{confirmationCount:B?1:0,requiredConfirmationCount:1,startedAtMs:R,txHash:B??U},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:U}}}}function D(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function O({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function k(e,t){return e===`C`?t/l:t}async function A({ajsContext:r,destinationChainAlias:i,environment:a,fromAddress:o,getUtxos:c,getWalletAddressesForChainAlias:l,getWalletChangeAddressForChainAlias:u,quoteAmountIn:d,requiredFromAddress:f,sourceChainAlias:p,toAddress:g}){let v=k(p,d);switch(p){case`C`:{if(i===`C`)throw new s(`Source and destination chain aliases must be different.`);if(!o)throw new s(`fromAddress must be an EVM address when exporting from C-Chain.`);let c=m({chain:a===n.TEST?e:t}),[l,u]=await Promise.all([c.getTransactionCount({address:o}),y(a)]);return{baseFeeInNanoAvax:u,unsignedTx:_({amountInNanoAvax:v,baseFeeInNanoAvax:u,context:r,destinationChainAlias:i,fromAddress:o,nonce:BigInt(l),sourceChainAlias:p,toAddress:g})}}case`P`:{if(i===`P`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n,o]=await Promise.all([w({chainAlias:p,getWalletChangeAddressForChainAlias:u}),h(a),T({chainAlias:p,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`P`)]);return{baseFeeInNanoAvax:t.price,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,feeState:t,fromAddresses:n,sourceChainAlias:p,toAddress:g,utxos:o.getUTXOs()})}}case`X`:{if(i===`X`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n]=await Promise.all([w({chainAlias:p,getWalletChangeAddressForChainAlias:u}),T({chainAlias:p,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`X`)]);return{baseFeeInNanoAvax:r.baseTxFee,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,fromAddresses:t,sourceChainAlias:p,toAddress:g,utxos:n.getUTXOs()})}}}}async function j({ajsContext:e,atomicUtxos:t,destinationChainAlias:n,environment:r,getWalletAddressesForChainAlias:i,getWalletChangeAddressForChainAlias:a,requiredFromAddress:o,sourceChainAlias:c,toAddress:l}){switch(n){case`C`:{if(c===`C`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([y(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a,unsignedTx:v({atomicUtxos:t,baseFeeInNanoAvax:a,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`C`)})}}case`P`:{if(c===`P`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([h(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a.price,unsignedTx:v({atomicUtxos:t,context:e,destinationChainAlias:n,feeState:a,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`P`)})}}case`X`:{if(c===`X`)throw new s(`Source and destination chain aliases must be different.`);let[r,u]=await Promise.all([w({chainAlias:n,getWalletChangeAddressForChainAlias:a}),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:v({atomicUtxos:t,changeAddress:r,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`X`)})}}}}export{E as transferAssetFactory};
1
+ import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r,TransferSignatureReason as i}from"../../../constants.js";import{ErrorCode as a,ErrorReason as o,InvalidParamsError as s,SdkError as c}from"../../../errors.js";import{getEvmClientForChain as l}from"../../_utils.js";import{WEI_PER_NANO_AVAX_BIGINT as u}from"../constants.js";import{getChainAlias as d,getEnvironmentIsTestnet as f,tryOrThrow as p}from"../_utils.js";import{sourcePendingTransferFromQuote as m}from"../../_transfer-utilities.js";import{getFeeState as h}from"../_utils/p-chain.js";import{pollPrimaryNetworkTxStatus as g}from"../_utils/polling.js";import{exportTx as _,importTx as v}from"../_utils/transactions.js";import{getCChainBaseFeeInNanoAvax as y}from"../_utils/fees.js";import{assertXpAddress as b,getExportFromAddressEvm as x,getExportToAddress as S,getImportToAddress as C,getWalletChangeAddress as w,getWalletFromAddresses as T}from"../_utils/addresses.js";function E({ajsContext:e,avalancheSendTx:t,environment:n,getCoreEthAddress:s,getAtomicUtxos:l,getUtxos:u,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==r.AVALANCHE_CCT)throw new c(o.INCORRECT_PROVIDER_PROVIDED,a.INVALID_PARAMS);let w=f(n),T=d(y.sourceChain.chainId,w),E=d(y.targetChain.chainId,w),k=x(y.fromAddress,T),M=T===`C`?void 0:b(y.fromAddress),N=await S({destinationChainAlias:E,getCoreEthAddress:s,quoteToAddress:y.toAddress}),P=C(y.toAddress,E),F=E===`C`?N:b(y.toAddress),I=y.amountIn>0n,L=I?2:1,R=Date.now(),z=D(y,n),B;if(I){v?.({currentSignature:1,currentSignatureReason:i.AvalancheCrossChainExport,quote:y,requiredSignatures:L});let r=await p(()=>A({ajsContext:e,environment:n,getUtxos:u,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:T,destinationChainAlias:E,fromAddress:k,requiredFromAddress:M,toAddress:N}),e=>new c(`Failed to build Avalanche export transaction.`,a.UNKNOWN,{cause:e}));B=await p(()=>t({baseFeeInNanoAvax:r.baseFeeInNanoAvax,chainAlias:T,txType:`export`,unsignedTx:r.unsignedTx}),e=>new c(`Failed to sign/send Avalanche export transaction.`,a.SIGNING_FAILED,{cause:e}));let o;try{o=await g({chainAlias:T,environment:n,txId:B})}catch{return m(y,{environment:n,requiredConfirmationCount:1,startedAtMs:R,txHash:B})}if(!o)return O({errorCode:a.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z})}let V=await p(async()=>(await l(E,T)).getUTXOs(),e=>new c(`Failed to fetch Avalanche atomic UTXOs.`,a.UNKNOWN,{cause:e}));if(V.length===0)return O({errorCode:a.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z});v?.({currentSignature:I?2:1,currentSignatureReason:i.AvalancheCrossChainImport,quote:y,requiredSignatures:L});let H=await p(()=>j({ajsContext:e,atomicUtxos:V,destinationChainAlias:E,environment:n,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,sourceChainAlias:T,requiredFromAddress:F,toAddress:P}),e=>new c(`Failed to build Avalanche import transaction.`,a.UNKNOWN,{cause:e})),U=await p(()=>t({baseFeeInNanoAvax:H.baseFeeInNanoAvax,chainAlias:E,txType:`import`,unsignedTx:H.unsignedTx}),e=>new c(`Failed to sign/send Avalanche import transaction.`,a.SIGNING_FAILED,{cause:e}));return{...z,source:{confirmationCount:B?1:0,requiredConfirmationCount:1,startedAtMs:R,txHash:B??U},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:U}}}}function D(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function O({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function k(e,t){return e===`C`?t/u:t}async function A({ajsContext:r,destinationChainAlias:i,environment:a,fromAddress:o,getUtxos:c,getWalletAddressesForChainAlias:u,getWalletChangeAddressForChainAlias:d,quoteAmountIn:f,requiredFromAddress:p,sourceChainAlias:m,toAddress:g}){let v=k(m,f);switch(m){case`C`:{if(i===`C`)throw new s(`Source and destination chain aliases must be different.`);if(!o)throw new s(`fromAddress must be an EVM address when exporting from C-Chain.`);let c=l({chain:a===n.TEST?e:t}),[u,d]=await Promise.all([c.getTransactionCount({address:o}),y(a)]);return{baseFeeInNanoAvax:d,unsignedTx:_({amountInNanoAvax:v,baseFeeInNanoAvax:d,context:r,destinationChainAlias:i,fromAddress:o,nonce:BigInt(u),sourceChainAlias:m,toAddress:g})}}case`P`:{if(i===`P`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n,o]=await Promise.all([w({chainAlias:m,getWalletChangeAddressForChainAlias:d}),h(a),T({chainAlias:m,getWalletAddressesForChainAlias:u,requiredAddress:p}),c(`P`)]);return{baseFeeInNanoAvax:t.price,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,feeState:t,fromAddresses:n,sourceChainAlias:m,toAddress:g,utxos:o.getUTXOs()})}}case`X`:{if(i===`X`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n]=await Promise.all([w({chainAlias:m,getWalletChangeAddressForChainAlias:d}),T({chainAlias:m,getWalletAddressesForChainAlias:u,requiredAddress:p}),c(`X`)]);return{baseFeeInNanoAvax:r.baseTxFee,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,fromAddresses:t,sourceChainAlias:m,toAddress:g,utxos:n.getUTXOs()})}}}}async function j({ajsContext:e,atomicUtxos:t,destinationChainAlias:n,environment:r,getWalletAddressesForChainAlias:i,getWalletChangeAddressForChainAlias:a,requiredFromAddress:o,sourceChainAlias:c,toAddress:l}){switch(n){case`C`:{if(c===`C`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([y(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a,unsignedTx:v({atomicUtxos:t,baseFeeInNanoAvax:a,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`C`)})}}case`P`:{if(c===`P`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([h(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a.price,unsignedTx:v({atomicUtxos:t,context:e,destinationChainAlias:n,feeState:a,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`P`)})}}case`X`:{if(c===`X`)throw new s(`Source and destination chain aliases must be different.`);let[r,u]=await Promise.all([w({chainAlias:n,getWalletChangeAddressForChainAlias:a}),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:v({atomicUtxos:t,changeAddress:r,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`X`)})}}}}export{E as transferAssetFactory};
2
2
  //# sourceMappingURL=transfer-asset.js.map
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../constants.cjs`),r=require(`../../_utils.cjs`),i=require(`./p-chain.cjs`),a=require(`../../_evm-gas.cjs`);let o=require(`@avalabs/avalanchejs`);function s(e,n){if(!Number.isInteger(e)||e<=0)throw new t.InvalidParamsError(`Expected a positive integer greater than 0 for ${n}, but received: ${e}`)}function c(e=1,t=1){return s(e,`numberInputs`),s(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function l(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function u(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function d(e,t){let i=(r.applyFeeUnitsBpsMargin(e,t)+n.WEI_PER_NANO_AVAX_BIGINT-1n)/n.WEI_PER_NANO_AVAX_BIGINT;return i<=0n?1n:i}async function f(t){let n=(await a.fetchSuggestedGasPrices(r.getEvmClientForChain({chain:t===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}))).fast.maxFeePerGas;return d(n,void 0)}function p({feeUnitsMarginBps:e,maxFeePerGas:t}){return d(t,e)*11230n}function m({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return d(t,e)*c(n,r)}async function h({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*l(n,e.platformFeeConfig.weights)}async function g({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*u(n,e.platformFeeConfig.weights)}function _({context:e}){return e.baseTxFee}function v({context:e}){return e.baseTxFee}async function y(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=n;switch(e){case`C`:return p({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await h({context:r,environment:i,numberInputs:s});case`X`:return _({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}async function b(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=n;switch(e){case`C`:return m({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await g({context:r,environment:i,numberInputs:s});case`X`:return v({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}exports.getCChainBaseFeeInNanoAvax=f,exports.getExportFeeInNanoAvax=y,exports.getImportFeeInNanoAvax=b;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../constants.cjs`),i=require(`./p-chain.cjs`),a=require(`../../_evm-gas.cjs`);let o=require(`@avalabs/avalanchejs`);function s(e,n){if(!Number.isInteger(e)||e<=0)throw new t.InvalidParamsError(`Expected a positive integer greater than 0 for ${n}, but received: ${e}`)}function c(e=1,t=1){return s(e,`numberInputs`),s(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function l(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function u(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function d(e,t){let i=(n.applyFeeUnitsBpsMargin(e,t)+r.WEI_PER_NANO_AVAX_BIGINT-1n)/r.WEI_PER_NANO_AVAX_BIGINT;return i<=0n?1n:i}async function f(t){let r=(await a.fetchSuggestedGasPrices(n.getEvmClientForChain({chain:t===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}))).fast.maxFeePerGas;return d(r,void 0)}function p({feeUnitsMarginBps:e,maxFeePerGas:t}){return d(t,e)*11230n}function m({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return d(t,e)*c(n,r)}async function h({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*l(n,e.platformFeeConfig.weights)}async function g({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*u(n,e.platformFeeConfig.weights)}function _({context:e}){return e.baseTxFee}function v({context:e}){return e.baseTxFee}async function y(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=n;switch(e){case`C`:return p({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await h({context:r,environment:i,numberInputs:s});case`X`:return _({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}async function b(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=n;switch(e){case`C`:return m({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await g({context:r,environment:i,numberInputs:s});case`X`:return v({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}exports.getCChainBaseFeeInNanoAvax=f,exports.getExportFeeInNanoAvax=y,exports.getImportFeeInNanoAvax=b;
2
2
  //# sourceMappingURL=fees.cjs.map
@@ -1,2 +1,2 @@
1
- import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n}from"../../../constants.js";import{InvalidParamsError as r}from"../../../errors.js";import{WEI_PER_NANO_AVAX_BIGINT as i}from"../constants.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o}from"../../_utils.js";import{getFeeState as s}from"./p-chain.js";import{fetchSuggestedGasPrices as c}from"../../_evm-gas.js";import{Common as l}from"@avalabs/avalanchejs";function u(e,t){if(!Number.isInteger(e)||e<=0)throw new r(`Expected a positive integer greater than 0 for ${t}, but received: ${e}`)}function d(e=1,t=1){return u(e,`numberInputs`),u(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function f(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function p(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function m(e,t){let n=(a(e,t)+i-1n)/i;return n<=0n?1n:n}async function h(r){let i=(await c(o({chain:r===n.TEST?e:t}))).fast.maxFeePerGas;return m(i,void 0)}function g({feeUnitsMarginBps:e,maxFeePerGas:t}){return m(t,e)*11230n}function _({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return m(t,e)*d(n,r)}async function v({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*f(n,e.platformFeeConfig.weights)}async function y({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*p(n,e.platformFeeConfig.weights)}function b({context:e}){return e.baseTxFee}function x({context:e}){return e.baseTxFee}async function S(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=t;switch(e){case`C`:return g({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await v({context:n,environment:i,numberInputs:s});case`X`:return b({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}async function C(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=t;switch(e){case`C`:return _({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await y({context:n,environment:i,numberInputs:s});case`X`:return x({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}export{h as getCChainBaseFeeInNanoAvax,S as getExportFeeInNanoAvax,C as getImportFeeInNanoAvax};
1
+ import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n}from"../../../constants.js";import{InvalidParamsError as r}from"../../../errors.js";import{applyFeeUnitsBpsMargin as i,getEvmClientForChain as a}from"../../_utils.js";import{WEI_PER_NANO_AVAX_BIGINT as o}from"../constants.js";import{getFeeState as s}from"./p-chain.js";import{fetchSuggestedGasPrices as c}from"../../_evm-gas.js";import{Common as l}from"@avalabs/avalanchejs";function u(e,t){if(!Number.isInteger(e)||e<=0)throw new r(`Expected a positive integer greater than 0 for ${t}, but received: ${e}`)}function d(e=1,t=1){return u(e,`numberInputs`),u(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function f(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function p(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function m(e,t){let n=(i(e,t)+o-1n)/o;return n<=0n?1n:n}async function h(r){let i=(await c(a({chain:r===n.TEST?e:t}))).fast.maxFeePerGas;return m(i,void 0)}function g({feeUnitsMarginBps:e,maxFeePerGas:t}){return m(t,e)*11230n}function _({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return m(t,e)*d(n,r)}async function v({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*f(n,e.platformFeeConfig.weights)}async function y({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*p(n,e.platformFeeConfig.weights)}function b({context:e}){return e.baseTxFee}function x({context:e}){return e.baseTxFee}async function S(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=t;switch(e){case`C`:return g({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await v({context:n,environment:i,numberInputs:s});case`X`:return b({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}async function C(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=t;switch(e){case`C`:return _({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await y({context:n,environment:i,numberInputs:s});case`X`:return x({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}export{h as getCChainBaseFeeInNanoAvax,S as getExportFeeInNanoAvax,C as getImportFeeInNanoAvax};
2
2
  //# sourceMappingURL=fees.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../../errors.cjs`),t=require(`../_utils.cjs`),n=require(`../../_utils.cjs`);function r(n,r){switch(r){case`C`:return e=>t.getAvalancheProvider(n,r).getAtomicTxStatus(e);case`P`:return e=>t.getAvalancheProvider(n,r).getTxStatus({txID:e});case`X`:return e=>t.getAvalancheProvider(n,r).getTxStatus({txID:e});default:throw new e.InvalidParamsError(`Unsupported chain alias: ${r}`,`Can not get transaction status function for unsupported chain alias.`)}}async function i({chainAlias:t,count:a=13,environment:o,signal:s,txId:c}){if(a<0)return!1;try{let{status:e}=await r(o,t)(c);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await n.wait(1500*1.2**(13-a),s),await i({chainAlias:t,count:a-1,environment:o,signal:s,txId:c})}catch(t){throw new e.SdkError(`Failed to poll transaction status from Avalanche.`,e.ErrorCode.UNKNOWN,{cause:t})}}exports.pollPrimaryNetworkTxStatus=i;
1
+ const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils.cjs`);function r(t,r){switch(r){case`C`:return e=>n.getAvalancheProvider(t,r).getAtomicTxStatus(e);case`P`:return e=>n.getAvalancheProvider(t,r).getTxStatus({txID:e});case`X`:return e=>n.getAvalancheProvider(t,r).getTxStatus({txID:e});default:throw new e.InvalidParamsError(`Unsupported chain alias: ${r}`,`Can not get transaction status function for unsupported chain alias.`)}}async function i({chainAlias:n,count:a=13,environment:o,signal:s,txId:c}){if(a<0)return!1;try{let{status:e}=await r(o,n)(c);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await t.wait(1500*1.2**(13-a),s),await i({chainAlias:n,count:a-1,environment:o,signal:s,txId:c})}catch(t){throw new e.SdkError(`Failed to poll transaction status from Avalanche.`,e.ErrorCode.UNKNOWN,{cause:t})}}exports.pollPrimaryNetworkTxStatus=i;
2
2
  //# sourceMappingURL=polling.cjs.map
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e,InvalidParamsError as t,SdkError as n}from"../../../errors.js";import{getAvalancheProvider as r}from"../_utils.js";import{wait as i}from"../../_utils.js";function a(e,n){switch(n){case`C`:return t=>r(e,n).getAtomicTxStatus(t);case`P`:return t=>r(e,n).getTxStatus({txID:t});case`X`:return t=>r(e,n).getTxStatus({txID:t});default:throw new t(`Unsupported chain alias: ${n}`,`Can not get transaction status function for unsupported chain alias.`)}}async function o({chainAlias:t,count:r=13,environment:s,signal:c,txId:l}){if(r<0)return!1;try{let{status:e}=await a(s,t)(l);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await i(1500*1.2**(13-r),c),await o({chainAlias:t,count:r-1,environment:s,signal:c,txId:l})}catch(t){throw new n(`Failed to poll transaction status from Avalanche.`,e.UNKNOWN,{cause:t})}}export{o as pollPrimaryNetworkTxStatus};
1
+ import{ErrorCode as e,InvalidParamsError as t,SdkError as n}from"../../../errors.js";import{wait as r}from"../../_utils.js";import{getAvalancheProvider as i}from"../_utils.js";function a(e,n){switch(n){case`C`:return t=>i(e,n).getAtomicTxStatus(t);case`P`:return t=>i(e,n).getTxStatus({txID:t});case`X`:return t=>i(e,n).getTxStatus({txID:t});default:throw new t(`Unsupported chain alias: ${n}`,`Can not get transaction status function for unsupported chain alias.`)}}async function o({chainAlias:t,count:i=13,environment:s,signal:c,txId:l}){if(i<0)return!1;try{let{status:e}=await a(s,t)(l);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await r(1500*1.2**(13-i),c),await o({chainAlias:t,count:i-1,environment:s,signal:c,txId:l})}catch(t){throw new n(`Failed to poll transaction status from Avalanche.`,e.UNKNOWN,{cause:t})}}export{o as pollPrimaryNetworkTxStatus};
2
2
  //# sourceMappingURL=polling.js.map
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../type-guards.cjs`),n=require(`../../_utils.cjs`),r=require(`../../_evm-gas.cjs`),i=require(`../../_evm-errors.cjs`),a=require(`../../_abis.cjs`),o=require(`../_utils/transfer-data.cjs`);let s=require(`viem`);function c({config:c}){let l=c.walletAddresses.ethereum;return async({amountIn:u,assetIn:d,fromAddress:f,sourceChain:p,targetChain:m},h)=>{if(!(0,s.isAddress)(f))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${f}`);let{ethToAva:g,source:_}=o.getTransferData({assetIn:d,sourceChainId:p.chainId,targetChainId:m.chainId},c),v=n.getEvmClientForChain({chain:p}),y=0n;if(t.isNativeAsset(d)&&g){y+=await i.estimateGasWithRevert(v,{account:f,to:_.token.address,data:(0,s.encodeFunctionData)({abi:a.WETH_ABI,functionName:`deposit`})},a.WETH_ABI,`Failed to estimate gas for WETH deposit.`);let e=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[l,u]});try{y+=await i.estimateGasWithRevert(v,{account:f,to:_.token.address,data:e},s.erc20Abi,`Failed to estimate gas for ERC20 transfer.`)}catch{y+=await i.estimateGasWithRevert(v,{account:f,to:l,data:e,value:u},s.erc20Abi,`Failed to estimate gas for ERC20 transfer (fallback).`)}}else{let e=g?s.erc20Abi:a.WAVAX_ABI;y=await i.estimateGasWithRevert(v,{account:f,to:_.token.address,data:(0,s.encodeFunctionData)({abi:e,functionName:g?`transfer`:`unwrap`,args:g?[l,u]:[u,0n]})},e,`Failed to estimate gas for ${g?`ERC20 transfer`:`WAVAX unwrap`}.`)}let b=await r.estimateEvmFeesPerGas(v,p,h?.overrides?.feeRateTier),x=h?.overrides?.maxFeePerGas??b.maxFeePerGas,S=h?.overrides?.maxPriorityFeePerGas??b.maxPriorityFeePerGas,C=y*x,w=n.applyFeeUnitsBpsMargin(C,h?.feeUnitsMarginBps);return{asset:p.networkToken,totalFee:w,totalFeeWithoutMargin:C,meta:{maxFeePerGas:x,maxPriorityFeePerGas:S}}}}exports.estimateNativeFeeFactory=c;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../type-guards.cjs`),n=require(`../../_utils.cjs`),r=require(`../../_evm-errors.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_abis.cjs`),o=require(`../_utils/transfer-data.cjs`);let s=require(`viem`);function c({config:c}){let l=c.walletAddresses.ethereum;return async({amountIn:u,assetIn:d,fromAddress:f,sourceChain:p,targetChain:m},h)=>{if(!(0,s.isAddress)(f))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${f}`);let{ethToAva:g,source:_}=o.getTransferData({assetIn:d,sourceChainId:p.chainId,targetChainId:m.chainId},c),v=n.getEvmClientForChain({chain:p}),y=0n;if(t.isNativeAsset(d)&&g){y+=await r.estimateGasWithRevert(v,{account:f,to:_.token.address,data:(0,s.encodeFunctionData)({abi:a.WETH_ABI,functionName:`deposit`})},a.WETH_ABI,`Failed to estimate gas for WETH deposit.`);let e=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[l,u]});try{y+=await r.estimateGasWithRevert(v,{account:f,to:_.token.address,data:e},s.erc20Abi,`Failed to estimate gas for ERC20 transfer.`)}catch{y+=await r.estimateGasWithRevert(v,{account:f,to:l,data:e,value:u},s.erc20Abi,`Failed to estimate gas for ERC20 transfer (fallback).`)}}else{let e=g?s.erc20Abi:a.WAVAX_ABI;y=await r.estimateGasWithRevert(v,{account:f,to:_.token.address,data:(0,s.encodeFunctionData)({abi:e,functionName:g?`transfer`:`unwrap`,args:g?[l,u]:[u,0n]})},e,`Failed to estimate gas for ${g?`ERC20 transfer`:`WAVAX unwrap`}.`)}let b=await i.estimateEvmFeesPerGas(v,p,h?.overrides?.feeRateTier),x=h?.overrides?.maxFeePerGas??b.maxFeePerGas,S=h?.overrides?.maxPriorityFeePerGas??b.maxPriorityFeePerGas,C=y*x,w=n.applyFeeUnitsBpsMargin(C,h?.feeUnitsMarginBps);return{asset:p.networkToken,totalFee:w,totalFeeWithoutMargin:C,meta:{maxFeePerGas:x,maxPriorityFeePerGas:S}}}}exports.estimateNativeFeeFactory=c;
2
2
  //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -1,2 +1,2 @@
1
- import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{isNativeAsset as n}from"../../../type-guards.js";import{applyFeeUnitsBpsMargin as r,getEvmClientForChain as i}from"../../_utils.js";import{estimateEvmFeesPerGas as a}from"../../_evm-gas.js";import{estimateGasWithRevert as o}from"../../_evm-errors.js";import{WAVAX_ABI as s,WETH_ABI as c}from"../../_abis.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{encodeFunctionData as u,erc20Abi as d,isAddress as f}from"viem";function p({config:p}){let m=p.walletAddresses.ethereum;return async({amountIn:h,assetIn:g,fromAddress:_,sourceChain:v,targetChain:y},b)=>{if(!f(_))throw new t(e.INVALID_PARAMS,`Invalid fromAddress: ${_}`);let{ethToAva:x,source:S}=l({assetIn:g,sourceChainId:v.chainId,targetChainId:y.chainId},p),C=i({chain:v}),w=0n;if(n(g)&&x){w+=await o(C,{account:_,to:S.token.address,data:u({abi:c,functionName:`deposit`})},c,`Failed to estimate gas for WETH deposit.`);let e=u({abi:d,functionName:`transfer`,args:[m,h]});try{w+=await o(C,{account:_,to:S.token.address,data:e},d,`Failed to estimate gas for ERC20 transfer.`)}catch{w+=await o(C,{account:_,to:m,data:e,value:h},d,`Failed to estimate gas for ERC20 transfer (fallback).`)}}else{let e=x?d:s;w=await o(C,{account:_,to:S.token.address,data:u({abi:e,functionName:x?`transfer`:`unwrap`,args:x?[m,h]:[h,0n]})},e,`Failed to estimate gas for ${x?`ERC20 transfer`:`WAVAX unwrap`}.`)}let T=await a(C,v,b?.overrides?.feeRateTier),E=b?.overrides?.maxFeePerGas??T.maxFeePerGas,D=b?.overrides?.maxPriorityFeePerGas??T.maxPriorityFeePerGas,O=w*E,k=r(O,b?.feeUnitsMarginBps);return{asset:v.networkToken,totalFee:k,totalFeeWithoutMargin:O,meta:{maxFeePerGas:E,maxPriorityFeePerGas:D}}}}export{p as estimateNativeFeeFactory};
1
+ import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{isNativeAsset as n}from"../../../type-guards.js";import{applyFeeUnitsBpsMargin as r,getEvmClientForChain as i}from"../../_utils.js";import{estimateGasWithRevert as a}from"../../_evm-errors.js";import{estimateEvmFeesPerGas as o}from"../../_evm-gas.js";import{WAVAX_ABI as s,WETH_ABI as c}from"../../_abis.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{encodeFunctionData as u,erc20Abi as d,isAddress as f}from"viem";function p({config:p}){let m=p.walletAddresses.ethereum;return async({amountIn:h,assetIn:g,fromAddress:_,sourceChain:v,targetChain:y},b)=>{if(!f(_))throw new t(e.INVALID_PARAMS,`Invalid fromAddress: ${_}`);let{ethToAva:x,source:S}=l({assetIn:g,sourceChainId:v.chainId,targetChainId:y.chainId},p),C=i({chain:v}),w=0n;if(n(g)&&x){w+=await a(C,{account:_,to:S.token.address,data:u({abi:c,functionName:`deposit`})},c,`Failed to estimate gas for WETH deposit.`);let e=u({abi:d,functionName:`transfer`,args:[m,h]});try{w+=await a(C,{account:_,to:S.token.address,data:e},d,`Failed to estimate gas for ERC20 transfer.`)}catch{w+=await a(C,{account:_,to:m,data:e,value:h},d,`Failed to estimate gas for ERC20 transfer (fallback).`)}}else{let e=x?d:s;w=await a(C,{account:_,to:S.token.address,data:u({abi:e,functionName:x?`transfer`:`unwrap`,args:x?[m,h]:[h,0n]})},e,`Failed to estimate gas for ${x?`ERC20 transfer`:`WAVAX unwrap`}.`)}let T=await o(C,v,b?.overrides?.feeRateTier),E=b?.overrides?.maxFeePerGas??T.maxFeePerGas,D=b?.overrides?.maxPriorityFeePerGas??T.maxPriorityFeePerGas,O=w*E,k=r(O,b?.feeUnitsMarginBps);return{asset:v.networkToken,totalFee:k,totalFeeWithoutMargin:O,meta:{maxFeePerGas:E,maxPriorityFeePerGas:D}}}}export{p as estimateNativeFeeFactory};
2
2
  //# sourceMappingURL=estimate-native-fee.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../errors.cjs`),t=require(`./_schema.cjs`),n=require(`../fetch-utilities.cjs`);function r(e){if(e)return{Authorization:`Bearer ${e}`}}async function i({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/chains`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.SupportedChainsResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function a({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/tokens/${s}/list`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{headers:r(a),fetch:o}),u=t.TokenListResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function o({apiBaseUrl:i,apiToken:a,fetch:o},s,{onDone:c,onError:l,onQuote:u,signal:d}){let f=`/quote`,p=n.combineUrlPathnames(i,f),m=[];try{for await(let i of n.fetchEventStream(p,{body:JSON.stringify(s),fetch:o,headers:r(a),signal:d})){let n=t.QuoteResponseSchema.safeParse(JSON.parse(i.data));if(!n.success){l(new e.ResponseValidationError(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?c():(u(n.data),m.push(n.data))}}catch(e){e instanceof Error?l(e):l(Error(`An unknown error occurred during the quote stream.`,{cause:e})),c()}return m}async function s({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/swap`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`}),u=t.SwapResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function c({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/partner`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.PartnerInfoResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function l({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/cross-chain/status/${s}`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{headers:r(a),fetch:o,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:c}),d=t.CrossChainStatusResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues,u);return d.data}async function u({apiBaseUrl:i,apiToken:a,fetch:o},{chainId:s,crossChainSwap:c,quoteId:l}){let u=`/spender-address?chainId=${s}&cross=${c?`true`:`false`}&uuid=${l}`,d=await n.fetchJson(n.combineUrlPathnames(i,u),{headers:r(a),fetch:o}),f=t.SpenderAddressResponseSchema.safeParse(d);if(!f.success)throw new e.ResponseValidationError(`Invalid response from Markr "${u}" endpoint.`,f.error.issues);return f.data}async function d({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/authorize`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`,signal:c}),d=t.MarkrAuthorizeResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues)}exports.markrGetCrossChainStatus=l,exports.markrGetInfoChains=i,exports.markrGetPartnerInfo=c,exports.markrGetSpenderAddress=u,exports.markrGetTokenList=a,exports.markrPostAuthorize=d,exports.markrStreamQuote=o,exports.markrSwap=s;
1
+ const e=require(`../../errors.cjs`),t=require(`./_schema.cjs`),n=require(`../fetch-utilities.cjs`);function r(e){if(e)return{Authorization:`Bearer ${e}`}}async function i({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/chains`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.SupportedChainsResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function a({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/tokens/${s}/list`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{headers:r(a),fetch:o}),u=t.TokenListResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function o({apiBaseUrl:i,apiToken:a,fetch:o},s,{onDone:c,onError:l,onQuote:u,signal:d}){let f=`/quote`,p=n.combineUrlPathnames(i,f),m=[];try{for await(let i of n.fetchEventStream(p,{body:JSON.stringify(s),fetch:o,headers:r(a),signal:d})){let n=t.QuoteResponseSchema.safeParse(JSON.parse(i.data));if(!n.success){l(new e.ResponseValidationError(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?c():(u(n.data),m.push(n.data))}}catch(e){e instanceof Error?l(e):l(Error(`An unknown error occurred during the quote stream.`,{cause:e})),c()}return m}async function s({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/swap`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`}),u=t.SwapResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function c({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/partner`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.PartnerInfoResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function l({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/cross-chain/status/${s}`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{headers:r(a),fetch:o,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:c}),d=t.CrossChainStatusResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues,u);return d.data}async function u({apiBaseUrl:i,apiToken:a,fetch:o},{chainId:s,crossChainSwap:c,quoteId:l}){let u=`/spender-address?${new URLSearchParams({chainId:String(s),cross:c?`true`:`false`,uuid:l}).toString()}`,d=await n.fetchJson(n.combineUrlPathnames(i,u),{headers:r(a),fetch:o}),f=t.SpenderAddressResponseSchema.safeParse(d);if(!f.success)throw new e.ResponseValidationError(`Invalid response from Markr "${u}" endpoint.`,f.error.issues);return f.data}async function d({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/authorize`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`,signal:c}),d=t.MarkrAuthorizeResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues)}exports.getAuthHeaders=r,exports.markrGetCrossChainStatus=l,exports.markrGetInfoChains=i,exports.markrGetPartnerInfo=c,exports.markrGetSpenderAddress=u,exports.markrGetTokenList=a,exports.markrPostAuthorize=d,exports.markrStreamQuote=o,exports.markrSwap=s;
2
2
  //# sourceMappingURL=_api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_api.cjs","names":["fetchJson","combineUrlPathnames","SupportedChainsResponseSchema","ResponseValidationError","TokenListResponseSchema","fetchEventStream","QuoteResponseSchema","SwapResponseSchema","PartnerInfoResponseSchema","AbortedError","CrossChainStatusResponseSchema","SpenderAddressResponseSchema","MarkrAuthorizeResponseSchema"],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n MarkrAuthorizeResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nfunction getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n /**\n * Pin the quote to a single upstream aggregator (e.g. `\"relay\"`). When\n * omitted, Markr races every eligible aggregator. Used to obtain\n * native-fee-free routes that only a specific aggregator supports.\n */\n aggregator?: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n const endpoint = `/spender-address?chainId=${chainId}&cross=${crossChainSwap ? 'true' : 'false'}&uuid=${quoteId}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\n// ---------------------------------------------------------------------------\n// Hyperliquid 2-phase withdrawal: nonce-mapping authorize\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy (`protocolVersion: 1`) authorize body — Markr rebuilds the upstream\n * Relay request from a fixed schema. Kept for back-compat; new integrations\n * should use {@link MarkrPostAuthorizeParamsV2}.\n *\n * **Caveat:** when Relay adds a required field (as it did with `depositor` in\n * v2), the rebuilt body silently omits it and the order is orphaned upstream.\n */\nexport interface MarkrPostAuthorizeParamsV1 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over the `RelayNonceMapping` typed data (`0x{r}{s}{v}`, 65 bytes hex). */\n readonly signature: `0x${string}`;\n /** EVM address of the signer. */\n readonly wallet: EvmAddress;\n /** Always `1337` (Hyperliquid). */\n readonly walletChainId: 1337;\n /** EIP-712 domain.chainId used in the signature — the wallet's active chain. */\n readonly signatureChainId: number;\n /**\n * Shared nonce — JSON number, matching Relay's upstream `/authorize` contract\n * and HL `/exchange`. HL nonces are millisecond timestamps, well under\n * `Number.MAX_SAFE_INTEGER`. Sending it as a string makes Relay reject the\n * payload (strict type validation), so we coerce here at the wire boundary.\n */\n readonly nonce: number;\n /** Relay request id (`0x{64hex}`). */\n readonly id: `0x${string}`;\n}\n\n/**\n * Pass-through (`protocolVersion: 2`) authorize body. The SDK forwards Relay's\n * `authorize.body` envelope from the `/swap` response **verbatim**. Markr only\n * normalizes `nonce` to a JSON number and defaults `referrer`; every other\n * field is untouched, so additive Relay schema changes don't break SDKs.\n */\nexport interface MarkrPostAuthorizeParamsV2 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over `swap.sign.value` using `swap.sign.domain` / `swap.sign.types`. */\n readonly signature: `0x${string}`;\n /** Relay's `/authorize` POST body, taken from `swap.authorize.body`. Forwarded verbatim. */\n readonly body: Record<string, unknown>;\n}\n\nexport type MarkrPostAuthorizeParams = MarkrPostAuthorizeParamsV1 | MarkrPostAuthorizeParamsV2;\n\n/**\n * Submit the user's signed nonce-mapping to Markr's `/authorize` endpoint.\n *\n * Markr proxies the request to Relay's upstream `/authorize`. Returns on any\n * 2xx; throws `HttpError` otherwise.\n */\nexport async function markrPostAuthorize(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrPostAuthorizeParams,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<void> {\n const endpoint = '/authorize';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n // `fetchJson` throws `HttpError` on non-2xx; the schema additionally rejects\n // upstream error envelopes that come back with a 200 (Relay sometimes does\n // this when authorize is rejected after HTTP success).\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n signal,\n });\n\n const parsed = MarkrAuthorizeResponseSchema.safeParse(rawJson);\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_api.cjs","names":["fetchJson","combineUrlPathnames","SupportedChainsResponseSchema","ResponseValidationError","TokenListResponseSchema","fetchEventStream","QuoteResponseSchema","SwapResponseSchema","PartnerInfoResponseSchema","AbortedError","CrossChainStatusResponseSchema","SpenderAddressResponseSchema","MarkrAuthorizeResponseSchema"],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n MarkrAuthorizeResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nexport function getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n /**\n * Pin the quote to a single upstream aggregator (e.g. `\"relay\"`). When\n * omitted, Markr races every eligible aggregator. Used to obtain\n * native-fee-free routes that only a specific aggregator supports.\n */\n aggregator?: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n // Use `URLSearchParams` rather than template-string concatenation so the\n // `quoteId` is URL-encoded — defense-in-depth against a caller passing a\n // value with a stray `&`/`=` that would otherwise inject extra query params.\n const searchParams = new URLSearchParams({\n chainId: String(chainId),\n cross: crossChainSwap ? 'true' : 'false',\n uuid: quoteId,\n });\n const endpoint = `/spender-address?${searchParams.toString()}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\n// ---------------------------------------------------------------------------\n// Hyperliquid 2-phase withdrawal: nonce-mapping authorize\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy (`protocolVersion: 1`) authorize body — Markr rebuilds the upstream\n * Relay request from a fixed schema. Kept for back-compat; new integrations\n * should use {@link MarkrPostAuthorizeParamsV2}.\n *\n * **Caveat:** when Relay adds a required field (as it did with `depositor` in\n * v2), the rebuilt body silently omits it and the order is orphaned upstream.\n */\nexport interface MarkrPostAuthorizeParamsV1 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over the `RelayNonceMapping` typed data (`0x{r}{s}{v}`, 65 bytes hex). */\n readonly signature: `0x${string}`;\n /** EVM address of the signer. */\n readonly wallet: EvmAddress;\n /** Always `1337` (Hyperliquid). */\n readonly walletChainId: 1337;\n /** EIP-712 domain.chainId used in the signature — the wallet's active chain. */\n readonly signatureChainId: number;\n /**\n * Shared nonce — JSON number, matching Relay's upstream `/authorize` contract\n * and HL `/exchange`. HL nonces are millisecond timestamps, well under\n * `Number.MAX_SAFE_INTEGER`. Sending it as a string makes Relay reject the\n * payload (strict type validation), so we coerce here at the wire boundary.\n */\n readonly nonce: number;\n /** Relay request id (`0x{64hex}`). */\n readonly id: `0x${string}`;\n}\n\n/**\n * Pass-through (`protocolVersion: 2`) authorize body. The SDK forwards Relay's\n * `authorize.body` envelope from the `/swap` response **verbatim**. Markr only\n * normalizes `nonce` to a JSON number and defaults `referrer`; every other\n * field is untouched, so additive Relay schema changes don't break SDKs.\n */\nexport interface MarkrPostAuthorizeParamsV2 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over `swap.sign.value` using `swap.sign.domain` / `swap.sign.types`. */\n readonly signature: `0x${string}`;\n /** Relay's `/authorize` POST body, taken from `swap.authorize.body`. Forwarded verbatim. */\n readonly body: Record<string, unknown>;\n}\n\nexport type MarkrPostAuthorizeParams = MarkrPostAuthorizeParamsV1 | MarkrPostAuthorizeParamsV2;\n\n/**\n * Submit the user's signed nonce-mapping to Markr's `/authorize` endpoint.\n *\n * Markr proxies the request to Relay's upstream `/authorize`. Returns on any\n * 2xx; throws `HttpError` otherwise.\n */\nexport async function markrPostAuthorize(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrPostAuthorizeParams,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<void> {\n const endpoint = '/authorize';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n // `fetchJson` throws `HttpError` on non-2xx; the schema additionally rejects\n // upstream error envelopes that come back with a 200 (Relay sometimes does\n // this when authorize is rejected after HTTP success).\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n signal,\n });\n\n const parsed = MarkrAuthorizeResponseSchema.safeParse(rawJson);\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{AbortedError as e,ResponseValidationError as t}from"../../errors.js";import{CrossChainStatusResponseSchema as n,MarkrAuthorizeResponseSchema as r,PartnerInfoResponseSchema as i,QuoteResponseSchema as a,SpenderAddressResponseSchema as o,SupportedChainsResponseSchema as s,SwapResponseSchema as c,TokenListResponseSchema as l}from"./_schema.js";import{combineUrlPathnames as u,fetchEventStream as d,fetchJson as f}from"../fetch-utilities.js";function p(e){if(e)return{Authorization:`Bearer ${e}`}}async function m({apiBaseUrl:e,apiToken:n,fetch:r}){let i=`/info/chains`,a=await f(u(e,i),{headers:p(n),fetch:r}),o=s.safeParse(a);if(!o.success)throw new t(`Invalid response from Markr "${i}" endpoint.`,o.error.issues);return o.data}async function h({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/tokens/${i}/list`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=l.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function g({apiBaseUrl:e,apiToken:n,fetch:r},i,{onDone:o,onError:s,onQuote:c,signal:l}){let f=`/quote`,m=u(e,f),h=[];try{for await(let e of d(m,{body:JSON.stringify(i),fetch:r,headers:p(n),signal:l})){let n=a.safeParse(JSON.parse(e.data));if(!n.success){s(new t(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?o():(c(n.data),h.push(n.data))}}catch(e){e instanceof Error?s(e):s(Error(`An unknown error occurred during the quote stream.`,{cause:e})),o()}return h}async function _({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/swap`,o=await f(u(e,a),{body:JSON.stringify(i),fetch:r,headers:p(n),method:`POST`}),s=c.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function v({apiBaseUrl:e,apiToken:n,fetch:r}){let a=`/info/partner`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=i.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function y({apiBaseUrl:r,apiToken:i,fetch:a},o,{signal:s}={}){let c=`/cross-chain/status/${o}`,l=await f(u(r,c),{headers:p(i),fetch:a,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:s}),d=n.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues,l);return d.data}async function b({apiBaseUrl:e,apiToken:n,fetch:r},{chainId:i,crossChainSwap:a,quoteId:s}){let c=`/spender-address?chainId=${i}&cross=${a?`true`:`false`}&uuid=${s}`,l=await f(u(e,c),{headers:p(n),fetch:r}),d=o.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues);return d.data}async function x({apiBaseUrl:e,apiToken:n,fetch:i},a,{signal:o}={}){let s=`/authorize`,c=await f(u(e,s),{body:JSON.stringify(a),fetch:i,headers:p(n),method:`POST`,signal:o}),l=r.safeParse(c);if(!l.success)throw new t(`Invalid response from Markr "${s}" endpoint.`,l.error.issues)}export{y as markrGetCrossChainStatus,m as markrGetInfoChains,v as markrGetPartnerInfo,b as markrGetSpenderAddress,h as markrGetTokenList,x as markrPostAuthorize,g as markrStreamQuote,_ as markrSwap};
1
+ import{AbortedError as e,ResponseValidationError as t}from"../../errors.js";import{CrossChainStatusResponseSchema as n,MarkrAuthorizeResponseSchema as r,PartnerInfoResponseSchema as i,QuoteResponseSchema as a,SpenderAddressResponseSchema as o,SupportedChainsResponseSchema as s,SwapResponseSchema as c,TokenListResponseSchema as l}from"./_schema.js";import{combineUrlPathnames as u,fetchEventStream as d,fetchJson as f}from"../fetch-utilities.js";function p(e){if(e)return{Authorization:`Bearer ${e}`}}async function m({apiBaseUrl:e,apiToken:n,fetch:r}){let i=`/info/chains`,a=await f(u(e,i),{headers:p(n),fetch:r}),o=s.safeParse(a);if(!o.success)throw new t(`Invalid response from Markr "${i}" endpoint.`,o.error.issues);return o.data}async function h({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/tokens/${i}/list`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=l.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function g({apiBaseUrl:e,apiToken:n,fetch:r},i,{onDone:o,onError:s,onQuote:c,signal:l}){let f=`/quote`,m=u(e,f),h=[];try{for await(let e of d(m,{body:JSON.stringify(i),fetch:r,headers:p(n),signal:l})){let n=a.safeParse(JSON.parse(e.data));if(!n.success){s(new t(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?o():(c(n.data),h.push(n.data))}}catch(e){e instanceof Error?s(e):s(Error(`An unknown error occurred during the quote stream.`,{cause:e})),o()}return h}async function _({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/swap`,o=await f(u(e,a),{body:JSON.stringify(i),fetch:r,headers:p(n),method:`POST`}),s=c.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function v({apiBaseUrl:e,apiToken:n,fetch:r}){let a=`/info/partner`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=i.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function y({apiBaseUrl:r,apiToken:i,fetch:a},o,{signal:s}={}){let c=`/cross-chain/status/${o}`,l=await f(u(r,c),{headers:p(i),fetch:a,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:s}),d=n.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues,l);return d.data}async function b({apiBaseUrl:e,apiToken:n,fetch:r},{chainId:i,crossChainSwap:a,quoteId:s}){let c=`/spender-address?${new URLSearchParams({chainId:String(i),cross:a?`true`:`false`,uuid:s}).toString()}`,l=await f(u(e,c),{headers:p(n),fetch:r}),d=o.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues);return d.data}async function x({apiBaseUrl:e,apiToken:n,fetch:i},a,{signal:o}={}){let s=`/authorize`,c=await f(u(e,s),{body:JSON.stringify(a),fetch:i,headers:p(n),method:`POST`,signal:o}),l=r.safeParse(c);if(!l.success)throw new t(`Invalid response from Markr "${s}" endpoint.`,l.error.issues)}export{p as getAuthHeaders,y as markrGetCrossChainStatus,m as markrGetInfoChains,v as markrGetPartnerInfo,b as markrGetSpenderAddress,h as markrGetTokenList,x as markrPostAuthorize,g as markrStreamQuote,_ as markrSwap};
2
2
  //# sourceMappingURL=_api.js.map