@rhea-finance/cross-chain-aggregation-dex 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["Big"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n logger.debug(\"SmartRouter quote - Calling findPath:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n });\n\n const response = await this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n supportLedger: false,\n });\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: response?.result_code,\n result_msg: response?.result_msg || response?.result_message,\n hasRoutes: !!response?.result_data?.routes?.length,\n });\n\n if (\n response?.result_code !== 0 ||\n !response?.result_data?.routes?.length\n ) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: response?.result_msg || response?.result_message || \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = response.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n accountId: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["smartxData","Big","transactions","finalRecipient","swapMsg","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n SwapMultiDexPathAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n /** Optional: SmartX quote adapter. When provided, quote() will compare results and return the best. */\n swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n private aggregateDexContractId?: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || undefined;\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n recipient,\n accountId,\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n // SmartX user/receiveUser fallback: recipient first, then accountId; if both missing, skip SmartX.\n const smartxUser = recipient || accountId || \"\";\n const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;\n\n logger.debug(\"SmartRouter quote - Calling quote backends:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n hasSmartX: canCallSmartX,\n smartxUser: smartxUser || \"none\",\n });\n\n const [findPathResp, smartxResp] = await Promise.all([\n this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n // v1 requires pathDeep=3 (handled by adapter implementation)\n supportLedger: false,\n }),\n canCallSmartX\n ? this.swapMultiDexPathAdapter!.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n chainId: 0,\n routerCount: 1,\n skipUnwrapNativeToken: false,\n user: smartxUser,\n receiveUser: smartxUser,\n })\n : Promise.resolve(null),\n ]);\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: findPathResp?.result_code,\n result_msg: findPathResp?.result_msg || findPathResp?.result_message,\n hasRoutes: !!findPathResp?.result_data?.routes?.length,\n });\n if (smartxResp) {\n logger.debug(\"SmartRouter quote - SmartX response:\", {\n result_code: smartxResp?.result_code,\n result_msg: smartxResp?.result_message,\n hasData: !!smartxResp?.result_data,\n });\n }\n\n if (\n findPathResp?.result_code !== 0 ||\n !findPathResp?.result_data?.routes?.length\n ) {\n // If v1 fails but SmartX succeeds, still return SmartX quote (quote-only; executeSwap is not supported yet).\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmt = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmt.lte(0) || smartxMin.lt(0)) {\n // treat as failure\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = findPathResp.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n const findPathQuote: QuoteResult = {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n quoteSource: \"findPath\",\n };\n\n // Compare with SmartX (if available) and return best amountOut. If SmartX wins, return quote-only result.\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmountOut = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n }\n\n return findPathQuote;\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (quote.quoteSource === \"smartx\") {\n const smartx = quote.smartxResult;\n const aggDexId = this.aggregateDexContractId;\n if (!smartx || !aggDexId) {\n return {\n success: false,\n error:\n \"SmartX quote missing execution context (smartxResult or aggregateDexContractId).\",\n };\n }\n\n if (!quote.tokenIn?.address) {\n return { success: false, error: \"tokenIn address is required\" };\n }\n\n const transactions: any[] = [];\n const finalRecipient = depositAddress || recipient;\n\n if (!finalRecipient) {\n return { success: false, error: \"recipient is required for SmartX execution\" };\n }\n\n // Collect tokens to check storage: SmartX tokens + tokenIn + tokenOut (if present)\n // SmartX tokens may include intermediate tokens used in the swap path\n const tokensToCheck = Array.from(\n new Set(\n [\n ...(smartx.tokens || []),\n quote.tokenIn.address || \"\",\n quote.tokenOut?.address || \"\",\n ].filter(Boolean)\n )\n );\n\n if (tokensToCheck.length === 0) {\n return {\n success: false,\n error: \"SmartX tokens list is empty, cannot proceed with execution\",\n };\n }\n\n const targets = [finalRecipient, aggDexId];\n\n // storage_deposit for each (token, target) if not registered\n // Check all tokens for both recipient and aggregate contract\n for (const token of tokensToCheck) {\n for (const target of targets) {\n if (!token || !target) continue;\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: token,\n methodName: \"storage_balance_of\",\n args: {\n account_id: target,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n // View call failure typically means not registered\n logger.debug(\n `Storage check failed for ${token} -> ${target}, assuming not registered:`,\n err\n );\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: token,\n methodName: \"storage_deposit\",\n args: {\n account_id: target,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n }\n\n const routerMsg = smartx.msg;\n const signature = smartx.signature;\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"SmartX smartxResult missing msg or signature.\",\n };\n }\n\n // Build ft_transfer_call to aggregate dex contract\n const swapMsg = {\n msg: routerMsg,\n signature: signature,\n };\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: aggDexId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"300000000000000\", // ~300 Tgas reference\n expandDeposit: \"1\", // 1 yoctoNEAR\n });\n\n const result = await this.nearChainAdapter.call({ transactions });\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n }\n return { success: false, error: result.message || \"Execute swap failed\" };\n }\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n accountId: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -161,11 +161,13 @@ function normalizeDestinationAsset(assetId, wrapNearContractId = "wrap.near") {
161
161
  var NearSmartRouter = class {
162
162
  constructor(config) {
163
163
  this.findPathAdapter = config.findPathAdapter;
164
+ this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;
164
165
  this.nearChainAdapter = config.nearChainAdapter;
165
166
  this.configAdapter = config.configAdapter;
166
167
  this.wrapNearContractId = this.configAdapter.getWrapNearContractId();
167
168
  this.refExchangeId = this.configAdapter.getRefExchangeId();
168
169
  this.tokenStorageDepositRead = this.configAdapter.getTokenStorageDepositRead?.() || "1250000000000000000000";
170
+ this.aggregateDexContractId = this.configAdapter.getAggregateDexContractId?.() || void 0;
169
171
  }
170
172
  /**
171
173
  * Get a swap quote (normalizes token ids and queries FindPath for routes).
@@ -177,8 +179,10 @@ var NearSmartRouter = class {
177
179
  tokenOut,
178
180
  amountIn,
179
181
  slippage,
180
- swapType: _swapType = "EXACT_INPUT"
182
+ swapType: _swapType = "EXACT_INPUT",
181
183
  // Currently not used, reserved for future use
184
+ recipient,
185
+ accountId
182
186
  } = params;
183
187
  if (!tokenIn?.address || !tokenOut?.address) {
184
188
  return {
@@ -224,26 +228,88 @@ var NearSmartRouter = class {
224
228
  }
225
229
  const slippageBps = convertSlippageToBasisPoints(slippage);
226
230
  const slippageDecimalForApi = slippageBps / 1e4;
227
- logger.debug("SmartRouter quote - Calling findPath:", {
231
+ const smartxUser = recipient || accountId || "";
232
+ const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;
233
+ logger.debug("SmartRouter quote - Calling quote backends:", {
228
234
  tokenIn: normalizedTokenIn,
229
235
  tokenOut: normalizedTokenOut,
230
236
  amountIn,
231
237
  slippage: slippageDecimalForApi,
232
- slippageBps
233
- });
234
- const response = await this.findPathAdapter.findPath({
235
- tokenIn: normalizedTokenIn,
236
- tokenOut: normalizedTokenOut,
237
- amountIn: String(amountIn),
238
- slippage: slippageDecimalForApi,
239
- supportLedger: false
238
+ slippageBps,
239
+ hasSmartX: canCallSmartX,
240
+ smartxUser: smartxUser || "none"
240
241
  });
242
+ const [findPathResp, smartxResp] = await Promise.all([
243
+ this.findPathAdapter.findPath({
244
+ tokenIn: normalizedTokenIn,
245
+ tokenOut: normalizedTokenOut,
246
+ amountIn: String(amountIn),
247
+ slippage: slippageDecimalForApi,
248
+ // v1 requires pathDeep=3 (handled by adapter implementation)
249
+ supportLedger: false
250
+ }),
251
+ canCallSmartX ? this.swapMultiDexPathAdapter.swapMultiDexPath({
252
+ amountIn: String(amountIn),
253
+ tokenIn: normalizedTokenIn,
254
+ tokenOut: normalizedTokenOut,
255
+ slippage: slippageDecimalForApi,
256
+ pathDeep: 2,
257
+ chainId: 0,
258
+ routerCount: 1,
259
+ skipUnwrapNativeToken: false,
260
+ user: smartxUser,
261
+ receiveUser: smartxUser
262
+ }) : Promise.resolve(null)
263
+ ]);
241
264
  logger.debug("SmartRouter quote - findPath response:", {
242
- result_code: response?.result_code,
243
- result_msg: response?.result_msg || response?.result_message,
244
- hasRoutes: !!response?.result_data?.routes?.length
265
+ result_code: findPathResp?.result_code,
266
+ result_msg: findPathResp?.result_msg || findPathResp?.result_message,
267
+ hasRoutes: !!findPathResp?.result_data?.routes?.length
245
268
  });
246
- if (response?.result_code !== 0 || !response?.result_data?.routes?.length) {
269
+ if (smartxResp) {
270
+ logger.debug("SmartRouter quote - SmartX response:", {
271
+ result_code: smartxResp?.result_code,
272
+ result_msg: smartxResp?.result_message,
273
+ hasData: !!smartxResp?.result_data
274
+ });
275
+ }
276
+ if (findPathResp?.result_code !== 0 || !findPathResp?.result_data?.routes?.length) {
277
+ const smartxData2 = smartxResp?.result_code === 0 ? smartxResp?.result_data : null;
278
+ if (smartxData2?.amount_out) {
279
+ const smartxAmt = new Big(smartxData2.amount_out || 0);
280
+ const smartxMin = new Big(smartxData2.min_amount_out || 0);
281
+ if (smartxAmt.lte(0) || smartxMin.lt(0)) {
282
+ return {
283
+ success: false,
284
+ tokenIn,
285
+ tokenOut,
286
+ amountIn,
287
+ amountOut: "0",
288
+ minAmountOut: "0",
289
+ routes: [],
290
+ error: findPathResp?.result_msg || findPathResp?.result_message || "No route found"
291
+ };
292
+ }
293
+ return {
294
+ success: true,
295
+ tokenIn,
296
+ tokenOut,
297
+ amountIn,
298
+ amountOut: String(smartxData2.amount_out),
299
+ minAmountOut: String(smartxData2.min_amount_out || "0"),
300
+ routes: [],
301
+ quoteSource: "smartx",
302
+ smartxResult: {
303
+ amountIn: String(smartxData2.amount_in || amountIn),
304
+ amountOut: String(smartxData2.amount_out),
305
+ minAmountOut: String(smartxData2.min_amount_out || "0"),
306
+ dexs: smartxData2.dexs,
307
+ msg: smartxData2.msg,
308
+ signature: smartxData2.signature,
309
+ tokens: smartxData2.tokens
310
+ }
311
+ };
312
+ }
247
313
  return {
248
314
  success: false,
249
315
  tokenIn,
@@ -252,10 +318,10 @@ var NearSmartRouter = class {
252
318
  amountOut: "0",
253
319
  minAmountOut: "0",
254
320
  routes: [],
255
- error: response?.result_msg || response?.result_message || "No route found"
321
+ error: findPathResp?.result_msg || findPathResp?.result_message || "No route found"
256
322
  };
257
323
  }
258
- const { routes: serverRoutes, amount_out } = response.result_data;
324
+ const { routes: serverRoutes, amount_out } = findPathResp.result_data;
259
325
  const slippageDecimal = new Big(slippageBps).div(1e4);
260
326
  const routes = serverRoutes.map((route) => ({
261
327
  pools: route.pools.map((pool) => ({
@@ -271,7 +337,7 @@ var NearSmartRouter = class {
271
337
  }));
272
338
  const amountOut = new Big(amount_out || 0);
273
339
  const minAmountOut = amountOut.mul(new Big(1).minus(slippageDecimal)).toFixed(0, Big.roundDown);
274
- return {
340
+ const findPathQuote = {
275
341
  success: true,
276
342
  tokenIn,
277
343
  tokenOut,
@@ -280,8 +346,36 @@ var NearSmartRouter = class {
280
346
  minAmountOut,
281
347
  routes,
282
348
  // Save raw serverRoutes data for executeSwap
283
- rawRoutes: serverRoutes
349
+ rawRoutes: serverRoutes,
350
+ quoteSource: "findPath"
284
351
  };
352
+ const smartxData = smartxResp?.result_code === 0 ? smartxResp?.result_data : null;
353
+ if (smartxData?.amount_out) {
354
+ const smartxAmountOut = new Big(smartxData.amount_out || 0);
355
+ const smartxMin = new Big(smartxData.min_amount_out || 0);
356
+ if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {
357
+ return {
358
+ success: true,
359
+ tokenIn,
360
+ tokenOut,
361
+ amountIn,
362
+ amountOut: String(smartxData.amount_out),
363
+ minAmountOut: String(smartxData.min_amount_out || "0"),
364
+ routes: [],
365
+ quoteSource: "smartx",
366
+ smartxResult: {
367
+ amountIn: String(smartxData.amount_in || amountIn),
368
+ amountOut: String(smartxData.amount_out),
369
+ minAmountOut: String(smartxData.min_amount_out || "0"),
370
+ dexs: smartxData.dexs,
371
+ msg: smartxData.msg,
372
+ signature: smartxData.signature,
373
+ tokens: smartxData.tokens
374
+ }
375
+ };
376
+ }
377
+ }
378
+ return findPathQuote;
285
379
  } catch (error) {
286
380
  return {
287
381
  success: false,
@@ -301,6 +395,108 @@ var NearSmartRouter = class {
301
395
  async executeSwap(params) {
302
396
  try {
303
397
  const { quote, recipient, depositAddress } = params;
398
+ if (quote.quoteSource === "smartx") {
399
+ const smartx = quote.smartxResult;
400
+ const aggDexId = this.aggregateDexContractId;
401
+ if (!smartx || !aggDexId) {
402
+ return {
403
+ success: false,
404
+ error: "SmartX quote missing execution context (smartxResult or aggregateDexContractId)."
405
+ };
406
+ }
407
+ if (!quote.tokenIn?.address) {
408
+ return { success: false, error: "tokenIn address is required" };
409
+ }
410
+ const transactions2 = [];
411
+ const finalRecipient2 = depositAddress || recipient;
412
+ if (!finalRecipient2) {
413
+ return { success: false, error: "recipient is required for SmartX execution" };
414
+ }
415
+ const tokensToCheck = Array.from(
416
+ new Set(
417
+ [
418
+ ...smartx.tokens || [],
419
+ quote.tokenIn.address || "",
420
+ quote.tokenOut?.address || ""
421
+ ].filter(Boolean)
422
+ )
423
+ );
424
+ if (tokensToCheck.length === 0) {
425
+ return {
426
+ success: false,
427
+ error: "SmartX tokens list is empty, cannot proceed with execution"
428
+ };
429
+ }
430
+ const targets = [finalRecipient2, aggDexId];
431
+ for (const token of tokensToCheck) {
432
+ for (const target of targets) {
433
+ if (!token || !target) continue;
434
+ let isRegistered = false;
435
+ try {
436
+ const storageBalance = await this.nearChainAdapter.view({
437
+ contractId: token,
438
+ methodName: "storage_balance_of",
439
+ args: {
440
+ account_id: target
441
+ }
442
+ });
443
+ isRegistered = !!storageBalance;
444
+ } catch (err) {
445
+ logger.debug(
446
+ `Storage check failed for ${token} -> ${target}, assuming not registered:`,
447
+ err
448
+ );
449
+ isRegistered = false;
450
+ }
451
+ if (!isRegistered) {
452
+ transactions2.push({
453
+ contractId: token,
454
+ methodName: "storage_deposit",
455
+ args: {
456
+ account_id: target,
457
+ registration_only: true
458
+ },
459
+ gas: "50",
460
+ expandDeposit: this.tokenStorageDepositRead
461
+ });
462
+ }
463
+ }
464
+ }
465
+ const routerMsg = smartx.msg;
466
+ const signature = smartx.signature;
467
+ if (!routerMsg || !signature) {
468
+ return {
469
+ success: false,
470
+ error: "SmartX smartxResult missing msg or signature."
471
+ };
472
+ }
473
+ const swapMsg2 = {
474
+ msg: routerMsg,
475
+ signature
476
+ };
477
+ transactions2.push({
478
+ contractId: quote.tokenIn.address,
479
+ methodName: "ft_transfer_call",
480
+ args: {
481
+ receiver_id: aggDexId,
482
+ amount: quote.amountIn,
483
+ msg: JSON.stringify(swapMsg2)
484
+ },
485
+ gas: "300000000000000",
486
+ // ~300 Tgas reference
487
+ expandDeposit: "1"
488
+ // 1 yoctoNEAR
489
+ });
490
+ const result2 = await this.nearChainAdapter.call({ transactions: transactions2 });
491
+ if (result2.status === "success") {
492
+ return {
493
+ success: true,
494
+ txHash: result2.txHash,
495
+ txHashArray: result2.txHashArr || (result2.txHash ? [result2.txHash] : [])
496
+ };
497
+ }
498
+ return { success: false, error: result2.message || "Execute swap failed" };
499
+ }
304
500
  if (!quote.success || !quote.routes.length) {
305
501
  return {
306
502
  success: false,