@rhea-finance/cross-chain-aggregation-dex 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +653 -0
- package/dist/index.d.mts +465 -0
- package/dist/index.d.ts +465 -0
- package/dist/index.js +1295 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1275 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/integration/completeQuote.ts"],"names":["Big","totalDeposit"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Cross-chain DEX aggregation SDK core type definitions\n */\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n chain: string;\n}\n\nexport interface Route {\n pools: PoolInfo[];\n amountIn: string;\n amountOut: string;\n}\n\nexport interface PoolInfo {\n pool_id: number;\n token_in: string;\n token_out: string;\n amount_in?: string;\n amount_out?: string;\n fee?: number;\n}\n\n/**\n * Base quote parameters (common to all routers)\n */\nexport interface BaseQuoteParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n /** Slippage tolerance in bps (e.g. 50 = 0.5%). */\n slippage: number;\n swapType?: \"EXACT_INPUT\" | \"EXACT_OUTPUT\";\n recipient?: string;\n}\n\n/**\n * Simple quote parameters (V1 NEAR, etc., no recipient required)\n */\nexport interface SimpleQuoteParams extends BaseQuoteParams {\n}\n\n/**\n * Recipient quote parameters (V2 NEAR, EVM, etc., recipient required)\n */\nexport interface RecipientQuoteParams extends BaseQuoteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (equals sender during quote, equals depositAddress during execution) */\n recipient: string;\n}\n\n/**\n * Unified quote parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type QuoteParams = SimpleQuoteParams | RecipientQuoteParams;\n\n/**\n * Type guard: check if recipient parameters are required\n */\nexport function requiresRecipient(\n params: QuoteParams\n): params is RecipientQuoteParams {\n return \"sender\" in params && \"recipient\" in params;\n}\n\nexport interface QuoteResult {\n success: boolean;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n amountOut: string;\n minAmountOut: string;\n routes: Route[];\n /**\n * Optional: Raw route data returned by chain router/aggregator\n * - Used for scenarios where aggregator-specific fields need to be passed through in executeSwap\n * - Kept optional to avoid tightly coupling implementation details into core logic\n */\n rawRoutes?: any[];\n priceImpact?: number;\n avgFee?: number;\n estimatedGas?: string;\n error?: string;\n \n // V2 Router specific fields (NEAR, EVM, etc.)\n routerMsg?: string;\n signature?: string;\n tokens?: string[];\n dexs?: string[];\n recipient?: string;\n slippage?: number;\n \n // EVM-specific fields (future extension)\n transactionData?: string;\n gasEstimate?: string;\n}\n\n/**\n * Base execute parameters (common to all routers)\n */\nexport interface BaseExecuteParams {\n quote: QuoteResult;\n recipient: string;\n depositAddress?: string;\n deadline?: number;\n}\n\n/**\n * Recipient execute parameters (V2 NEAR, EVM, etc.)\n */\nexport interface RecipientExecuteParams extends BaseExecuteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (usually depositAddress) */\n receiveUser: string;\n}\n\n/**\n * Unified execute parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type ExecuteParams = BaseExecuteParams | RecipientExecuteParams;\n\n/**\n * Type guard: check if execute parameters require recipient\n */\nexport function requiresRecipientInExecute(\n params: ExecuteParams\n): params is RecipientExecuteParams {\n return \"sender\" in params && \"receiveUser\" in params;\n}\n\nexport interface ExecuteResult {\n success: boolean;\n txHash?: string;\n txHashArray?: string[];\n error?: string;\n}\n\nexport type SupportedChain = \"near\" | \"evm\" | \"solana\";\n\n/**\n * Router capabilities\n * Used to declare router features and requirements\n */\nexport interface RouterCapabilities {\n /** Whether recipient parameters (sender/recipient) are required */\n requiresRecipient: boolean;\n /** Whether two API calls are needed (quote + finalize) */\n requiresFinalizeQuote: boolean;\n /** Whether complex token registration is required */\n requiresComplexRegistration: boolean;\n /** Supported chain */\n supportedChain: SupportedChain | string;\n}\n\n/**\n * DEX aggregator router abstract interface\n * Each chain/aggregator implements its own quote/executeSwap\n * \n * Extended to support common architecture:\n * - Capabilities (RouterCapabilities)\n * - Optional finalize quote method (finalizeQuote)\n * - Unified parameter interface (supports both simple and recipient modes)\n */\nexport interface DexRouter {\n getCapabilities(): RouterCapabilities;\n \n getSupportedChain(): SupportedChain | string;\n \n /**\n * Quote method\n * - Simple router: only needs BaseQuoteParams\n * - Recipient router: needs RecipientQuoteParams\n */\n quote(params: QuoteParams): Promise<QuoteResult>;\n \n /**\n * Execute swap\n * - Simple router: only needs BaseExecuteParams\n * - Recipient router: needs RecipientExecuteParams\n */\n executeSwap(params: ExecuteParams): Promise<ExecuteResult>;\n \n /**\n * Finalize quote (if two API calls are needed)\n * - Only implemented when requiresFinalizeQuote = true\n * - Used to call API again after getting depositAddress\n */\n finalizeQuote?(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult>;\n}\n\n/**\n * Bluechip token configuration\n */\nexport interface BluechipTokenConfig {\n address: string;\n symbol: string;\n decimals: number;\n assetId?: string; // AssetId for NearIntents (may include nep141: prefix)\n}\n\n/**\n * Bluechip tokens list configuration\n */\nexport interface BluechipTokensConfig {\n USDT?: BluechipTokenConfig;\n USDC?: BluechipTokenConfig;\n NEAR?: BluechipTokenConfig;\n [key: string]: BluechipTokenConfig | undefined;\n}\n","/**\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\n/**\n * Format gas value from yoctoNEAR to Tgas string, avoiding scientific notation.\n * @param gasInYoctoNEAR Gas value in yoctoNEAR (string or number)\n * @returns Formatted gas string in Tgas units (e.g., \"795\" for 795 Tgas)\n */\nexport function formatGasToTgas(gasInYoctoNEAR: string | number): string {\n if (!gasInYoctoNEAR) return \"0\";\n \n // Convert to string first to handle both string and number inputs\n const gasStr = String(gasInYoctoNEAR);\n \n // Check if it's already in scientific notation\n if (/[eE]/.test(gasStr)) {\n // Parse scientific notation manually to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n return (newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos)).replace(/\\.?0+$/, \"\");\n }\n }\n }\n }\n \n // Convert yoctoNEAR to Tgas (1 Tgas = 10^12 yoctoNEAR)\n // Use BigInt for precise integer division\n try {\n const gasBigInt = BigInt(gasStr.split(\".\")[0]); // Take integer part only\n const tgasBigInt = gasBigInt / BigInt(\"1000000000000\");\n return tgasBigInt.toString();\n } catch (error) {\n logger.error(\"formatGasToTgas - Error formatting gas:\", {\n gasInYoctoNEAR,\n error,\n });\n return \"0\";\n }\n}\n\n/**\n * Ensure gas value is a string without scientific notation.\n * This is used to format gas values before passing to wallet selector.\n * @param gas Gas value (string, number, or BigInt)\n * @returns Formatted gas string in yoctoNEAR\n */\nexport function formatGasString(gas: string | number | bigint): string {\n if (typeof gas === \"bigint\") {\n return gas.toString();\n }\n \n const gasStr = String(gas);\n \n // If already a clean string without scientific notation, return as is\n if (!/[eE]/.test(gasStr) && !gasStr.includes(\".\")) {\n return gasStr;\n }\n \n // Handle scientific notation\n if (/[eE]/.test(gasStr)) {\n // Use manual parsing to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n const result = newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos);\n return result.replace(/\\.?0+$/, \"\").replace(/\\.$/, \"\");\n }\n } else if (exponent < 0) {\n // Negative exponent: move decimal point left\n const absExp = Math.abs(exponent);\n const zerosToAdd = absExp - intPart.length;\n if (zerosToAdd > 0) {\n return \"0.\" + \"0\".repeat(zerosToAdd - 1) + intPart.replace(/^-/, \"\") + fracPart;\n } else {\n const pointPos = intPart.length - absExp;\n return intPart.slice(0, pointPos) + \".\" + intPart.slice(pointPos) + fracPart;\n }\n }\n }\n }\n \n // Handle decimal numbers - convert to integer string\n if (gasStr.includes(\".\")) {\n const [intPart, fracPart = \"\"] = gasStr.split(\".\");\n return intPart + fracPart;\n }\n \n return gasStr;\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 RouterCapabilities,\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 Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: false,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"near\",\n };\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** V2 Router implementation (Aggregate DEX Router). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n SwapMultiDexPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface AggregateDexRouterConfig {\n swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\n/**\n * V2 Router implementation for NEAR\n * Uses Aggregate DEX contract for routing\n */\nexport class AggregateDexRouter implements DexRouter {\n private swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private aggregateDexContractId: string;\n private wrapNearContractId: string;\n private readonly NEW_ACCOUNT_STORAGE_COST = \"1250000000000000000000\"; // 0.00125 NEAR in yoctoNEAR\n private readonly ONE_YOCTO_NEAR = \"1\";\n\n constructor(config: AggregateDexRouterConfig) {\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || \"\";\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n\n if (!this.aggregateDexContractId) {\n logger.error(\n \"AggregateDexRouter - AGGREGATE_DEX_CONTRACT_ID not configured\"\n );\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: true,\n supportedChain: \"near\",\n };\n }\n\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n\n /**\n * Get a swap quote from V2 Router API\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n if (!requiresRecipient(params)) {\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: \"V2 Router requires sender and recipient parameters\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n logger.error(\"AggregateDexRouter quote - Missing sender or recipient:\", {\n sender,\n recipient,\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: `V2 Router requires non-empty sender and recipient. Got sender=\"${sender}\", recipient=\"${recipient}\"`,\n };\n }\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(\"AggregateDexRouter 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(\"AggregateDexRouter quote - Calling swapMultiDexPath:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n sender,\n recipient,\n });\n\n const response = await this.swapMultiDexPathAdapter.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n user: sender,\n receiveUser: recipient,\n });\n\n logger.debug(\"AggregateDexRouter quote - swapMultiDexPath response:\", {\n result_code: response?.result_code,\n result_message: response?.result_message,\n hasData: !!response?.result_data,\n });\n\n if (response.result_code !== 0 || !response.result_data) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n response.result_message ||\n \"V2 Router API call failed\",\n };\n }\n\n const {\n amount_in,\n amount_out,\n min_amount_out,\n msg,\n signature,\n tokens,\n dexs,\n } = response.result_data;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: amount_in || amountIn,\n amountOut: amount_out || \"0\",\n minAmountOut: min_amount_out || \"0\",\n routes: [],\n routerMsg: msg,\n signature: signature,\n tokens: tokens || [],\n dexs: dexs || [],\n recipient: recipient,\n slippage: slippage,\n };\n } catch (error: any) {\n logger.error(\"AggregateDexRouter quote - Error:\", error);\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 * Finalize quote with depositAddress (deprecated)\n * \n * @deprecated No longer needed. executeSwap automatically fetches final quote using receiveUser (depositAddress).\n * Kept for interface compatibility only.\n */\n async finalizeQuote(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult> {\n if (!requiresRecipient(params)) {\n throw new Error(\"V2 Router requires recipient parameters\");\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n /**\n * Execute swap with V2 Router\n * Automatically fetches final quote using receiveUser (depositAddress) to ensure correct routerMsg and signature.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"V2 Router requires sender and receiveUser parameters\",\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: \"receiveUser (depositAddress) is required\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: `receiveUser appears to be an EVM address (${receiveUser}). For NEAR chain swaps, depositAddress must be a NEAR account (64 hex chars or .near format)`,\n };\n }\n\n logger.debug(\"AggregateDexRouter - executeSwap params:\", {\n sender,\n receiveUser,\n tokenIn: quote.tokenIn.address,\n tokenOut: quote.tokenOut.address,\n amountIn: quote.amountIn,\n tokens: quote.tokens,\n dexs: quote.dexs,\n });\n\n // Always fetch fresh quote with receiveUser (depositAddress) to ensure correct routerMsg and signature\n const slippage = quote.slippage || 0.005;\n \n const finalQuoteParams: QuoteParams = {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuote: QuoteResult;\n try {\n finalQuote = await this.quote(finalQuoteParams);\n \n if (!finalQuote.success) {\n return {\n success: false,\n error: `Failed to fetch quote with receiveUser=\"${receiveUser}\": ${finalQuote.error}`,\n };\n }\n } catch (error: any) {\n logger.error(\"AggregateDexRouter - Failed to fetch quote with receiveUser:\", error);\n return {\n success: false,\n error: `Failed to fetch quote with receiveUser=\"${receiveUser}\": ${error?.message || \"Unknown error\"}`,\n };\n }\n\n const routerMsg = finalQuote.routerMsg;\n const signature = finalQuote.signature;\n\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: `Quote fetched with receiveUser=\"${receiveUser}\" is missing routerMsg or signature.`,\n };\n }\n\n logger.debug(\"AggregateDexRouter - Successfully fetched final quote:\", {\n receiveUser,\n quoteRecipient: finalQuote.recipient,\n routerMsgLength: routerMsg.length,\n signatureLength: signature.length,\n });\n\n const tokens = finalQuote.tokens || [];\n const dexs = finalQuote.dexs || [];\n\n const transactions: Array<{\n contractId: string;\n methodName: string;\n args: any;\n gas?: string;\n expandDeposit?: string;\n }> = [];\n\n const getStorageBalance = async (\n tokenId: string,\n accountId: string\n ): Promise<any> => {\n try {\n return await this.nearChainAdapter.view({\n contractId: tokenId,\n methodName: \"storage_balance_of\",\n args: { account_id: accountId },\n });\n } catch (error) {\n return null;\n }\n };\n\n // 1. Convert NEAR to wNEAR if tokenIn is NEAR\n const isNativeNear =\n finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: finalQuote.amountIn,\n });\n }\n\n // 2. Check if user is registered in each token\n const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];\n const tokenStorageBalances = await Promise.all(\n tokensToCheck.map((tokenId) =>\n getStorageBalance(tokenId, sender).catch(() => null)\n )\n );\n\n tokensToCheck.forEach((tokenId, index) => {\n if (!tokenStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 3. Check if receiveUser is registered in tokenOut\n // Required: receiveUser must be registered in tokenOut contract for the aggregate contract to send tokens\n if (receiveUser && receiveUser !== sender) {\n logger.debug(\"AggregateDexRouter - Checking receiveUser registration in tokenOut:\", {\n receiveUser,\n tokenOut: finalQuote.tokenOut.address,\n tokenOutSymbol: finalQuote.tokenOut.symbol,\n });\n\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch((error) => {\n logger.warn(\"AggregateDexRouter - Failed to check receiveUser storage balance:\", {\n receiveUser,\n tokenOut: finalQuote.tokenOut.address,\n error: error?.message,\n });\n return null;\n });\n\n if (!receiveUserStorageBalance) {\n logger.debug(\"AggregateDexRouter - receiveUser not registered in tokenOut, adding registration transaction:\", {\n receiveUser,\n tokenOut: finalQuote.tokenOut.address,\n tokenOutSymbol: finalQuote.tokenOut.symbol,\n storageCost: this.NEW_ACCOUNT_STORAGE_COST,\n });\n\n transactions.push({\n contractId: finalQuote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: receiveUser,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n }\n\n // 4. Check if AGGREGATE_DEX_CONTRACT_ID is registered in each token\n const aggregateDexStorageBalances = await Promise.all(\n tokens.map((tokenId) =>\n getStorageBalance(tokenId, this.aggregateDexContractId).catch(\n () => null\n )\n )\n );\n\n tokens.forEach((tokenId, index) => {\n if (!aggregateDexStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: this.aggregateDexContractId,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 5. Check if tokens are registered in aggregate dex (only for sender, not receiveUser)\n if (tokens.length > 0) {\n const registeredStatus = await this.queryUserTokensRegistered({\n user: sender,\n tokens,\n });\n\n const unregisteredTokens = tokens.filter(\n (_, index) => !registeredStatus[index]\n );\n\n if (unregisteredTokens.length > 0) {\n // Each token requires 0.005 NEAR storage fee\n const depositPerToken = new Big(\"0.005\").mul(\n new Big(\"1000000000000000000000000\")\n );\n const totalDeposit = depositPerToken.mul(unregisteredTokens.length);\n\n transactions.push({\n contractId: this.aggregateDexContractId,\n methodName: \"tokens_storage_deposit\",\n args: {\n user: sender,\n tokens: unregisteredTokens,\n },\n gas: \"30000000000000\",\n expandDeposit: totalDeposit.toFixed(0),\n });\n }\n }\n\n // 6. Main swap transaction\n const msgString = JSON.stringify({\n msg: routerMsg,\n signature: signature,\n });\n\n transactions.push({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.aggregateDexContractId,\n amount: finalQuote.amountIn,\n msg: msgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\n });\n\n const totalDeposit = transactions.reduce((sum, tx) => {\n if (tx.expandDeposit) {\n return sum.plus(tx.expandDeposit);\n }\n return sum;\n }, new Big(0));\n\n logger.debug(\"AggregateDexRouter - Executing swap (following mature codebase logic):\", {\n contractId: finalQuote.tokenIn.address,\n receiver_id: this.aggregateDexContractId,\n amount: finalQuote.amountIn,\n transactionsCount: transactions.length,\n sender,\n receiveUser,\n tokens: tokens.length,\n dexs: dexs.length,\n totalDepositYocto: totalDeposit.toFixed(0),\n totalDepositNEAR: totalDeposit.div(new Big(\"1000000000000000000000000\")).toFixed(6),\n transactions: transactions.map((tx, idx) => ({\n index: idx,\n contractId: tx.contractId,\n methodName: tx.methodName,\n expandDeposit: tx.expandDeposit,\n expandDepositNEAR: tx.expandDeposit\n ? new Big(tx.expandDeposit)\n .div(new Big(\"1000000000000000000000000\"))\n .toFixed(6)\n : \"0\",\n })),\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 logger.error(\"AggregateDexRouter executeSwap - Error:\", error);\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n\n /**\n * Query user token registration status in AGGREGATE_DEX contract\n */\n private async queryUserTokensRegistered({\n user,\n tokens,\n }: {\n user: string;\n tokens: string[];\n }): Promise<boolean[]> {\n try {\n return await this.nearChainAdapter.view({\n contractId: this.aggregateDexContractId,\n methodName: \"query_user_tokens_registered\",\n args: {\n user,\n tokens,\n },\n });\n } catch (error) {\n logger.error(\n \"AggregateDexRouter - Failed to query user tokens registered:\",\n error\n );\n return tokens.map(() => false);\n }\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport {\n TokenInfo,\n QuoteResult,\n DexRouter,\n BluechipTokensConfig,\n QuoteParams,\n} 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 dexRouters?: DexRouter[];\n dexRouter?: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n currentUserAddress?: string;\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 {\n intentsQuotationAdapter,\n dexRouters,\n dexRouter,\n bluechipTokens,\n configAdapter,\n currentUserAddress,\n } = config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n const routers = dexRouters || (dexRouter ? [dexRouter] : []);\n if (routers.length === 0) {\n throw new Error(\"At least one DEX router is required\");\n }\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for V2 Router\");\n }\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 let bestRouter: DexRouter | 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 routersCount: routers.length,\n userAddress,\n });\n\n const quotes = await Promise.allSettled(\n routers.map((router) => {\n const capabilities = router.getCapabilities();\n\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: userAddress,\n recipient: userAddress,\n }\n : {\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n };\n\n return router.quote(quoteParams);\n })\n );\n\n const validQuotes = quotes\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r) => r.value);\n\n if (validQuotes.length === 0) {\n const errors = quotes\n .map((r, index) => {\n if (r.status === \"rejected\") {\n return `Router ${index}: ${r.reason}`;\n }\n if (r.status === \"fulfilled\" && !r.value.success) {\n return `Router ${index}: ${r.value.error}`;\n }\n return null;\n })\n .filter(Boolean);\n logger.error(\"DEX Aggregator - All router quotes failed:\", errors);\n throw new Error(\n `All router quotes failed: ${errors.join(\"; \")}`\n );\n }\n\n const bestQuote = validQuotes.reduce((best, current) => {\n const bestAmount = new Big(best.amountOut);\n const currentAmount = new Big(current.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n\n const bestQuoteIndex = validQuotes.indexOf(bestQuote);\n bestRouter = routers[bestQuoteIndex];\n preSwapQuote = bestQuote;\n\n logger.debug(\"DEX Aggregator - Selected best router:\", {\n routerIndex: bestQuoteIndex,\n amountOut: bestQuote.amountOut,\n routerType: bestRouter.getCapabilities().requiresRecipient\n ? \"V2 (Recipient)\"\n : \"V1 (Simple)\",\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 // executeSwap will automatically fetch final quote using receiveUser (depositAddress)\n const finalQuote = preSwapQuote;\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap && finalQuote && bestRouter\n ? {\n quote: finalQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rhea-finance/cross-chain-aggregation-dex",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "TypeScript SDK for cross-chain DEX aggregation and routing on NEAR. Supports multi-DEX routing, automatic token registration, pre-swap handling, and NearIntents bridge integration for seamless cross-chain token swaps.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"type-check": "tsc --noEmit",
|
|
24
|
+
"lint": "eslint src --ext .ts",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"defi",
|
|
29
|
+
"dex",
|
|
30
|
+
"aggregator",
|
|
31
|
+
"router",
|
|
32
|
+
"swap",
|
|
33
|
+
"cross-chain",
|
|
34
|
+
"near",
|
|
35
|
+
"multi-chain",
|
|
36
|
+
"rhea-finance"
|
|
37
|
+
],
|
|
38
|
+
"author": "Rhea Finance",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/rhea-finance/crossChain-aggregation-sdk.git"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"big.js": "^6.1.1"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/big.js": "^6.1.2",
|
|
49
|
+
"@types/node": "^20.0.0",
|
|
50
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
51
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
52
|
+
"eslint": "^9.0.0",
|
|
53
|
+
"tsup": "^8.0.0",
|
|
54
|
+
"typescript": "^5.0.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@near-js/providers": "*"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"@near-js/providers": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": ">=16.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|