@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/README.md +24 -1
- package/dist/index.d.mts +52 -1
- package/dist/index.d.ts +52 -1
- package/dist/index.js +214 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +214 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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:
|
|
243
|
-
result_msg:
|
|
244
|
-
hasRoutes: !!
|
|
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 (
|
|
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:
|
|
321
|
+
error: findPathResp?.result_msg || findPathResp?.result_message || "No route found"
|
|
256
322
|
};
|
|
257
323
|
}
|
|
258
|
-
const { routes: serverRoutes, amount_out } =
|
|
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
|
-
|
|
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,
|