@rhea-finance/cross-chain-aggregation-dex 0.1.9 → 0.2.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/dist/index.d.mts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +123 -88
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +119 -89
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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/utils/bitgetUtils.ts","../src/chains/evm/BitgetRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big","ethers","gasPriceEstimate"],"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 /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\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\";\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 if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\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 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 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/**\n * Normalize EVM address to checksum format (lowercase for comparison)\n */\nexport function normalizeEvmAddress(address: string): string {\n if (!address) return address;\n // Remove 0x prefix if present, convert to lowercase, then add 0x back\n const addr = address.startsWith(\"0x\") ? address.slice(2) : address;\n return \"0x\" + addr.toLowerCase();\n}\n\n/** True if the token matches an Intents-supported bluechip token for EVM chains (by symbol + address). */\nexport function isEvmIntentsSupportedToken(\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 // EVM bluechip tokens: USDT, USDC, ETH, WETH\n const symbolKey =\n normalizedSymbol === \"ETH\" || normalizedSymbol === \"WETH\"\n ? \"ETH\"\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) => normalizeEvmAddress(addr);\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/**\n * Find best bluechip token for EVM chains (priority: USDT > USDC > ETH/WETH)\n */\nexport function findBestEvmBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n nativeTokenAddress?: string // e.g., WETH address\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: \"evm\",\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: \"evm\",\n });\n }\n\n if (bluechipTokens.ETH?.address) {\n preferredTokens.push({\n address: bluechipTokens.ETH.address,\n symbol: bluechipTokens.ETH.symbol || \"WETH\",\n decimals: bluechipTokens.ETH.decimals || 18,\n chain: \"evm\",\n });\n }\n\n // Fallback to native wrapped token if provided\n if (preferredTokens.length === 0 && nativeTokenAddress) {\n return {\n address: nativeTokenAddress,\n symbol: \"WETH\",\n decimals: 18,\n chain: \"evm\",\n };\n }\n\n if (preferredTokens.length === 0) {\n throw new Error(\"No EVM bluechip token configured\");\n }\n\n return preferredTokens[0];\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 return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\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 // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\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 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\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\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 {\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 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\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\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 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 const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\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: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\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 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 const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\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 {\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 // AGGREGATE_DEX_CONTRACT_ID not configured\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: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\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 sender or 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 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\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\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 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: \"Failed to get quote\",\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 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: \"Failed to get quote\",\n };\n }\n }\n\n /**\n * @deprecated No longer needed. 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 private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(\"Failed to get quote\");\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"Missing sender or receiveUser\",\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: \"Missing receiveUser\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: \"Invalid receiveUser address\",\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\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.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\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: \"Failed to get quote\",\n };\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 native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\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 // 1.5. Handle case where tokenIn is wNEAR but user doesn't have wNEAR balance\n // If tokenIn is wNEAR, check balance and convert NEAR to wNEAR if needed\n const isWrappedNear =\n finalQuote.tokenIn.address === this.wrapNearContractId ||\n (finalQuote.tokenIn.symbol === \"WNEAR\" &&\n finalQuote.tokenIn.address === this.wrapNearContractId);\n\n if (isWrappedNear && !isNativeNear) {\n // Check wNEAR balance\n let wNearBalance = \"0\";\n try {\n const wNearBalanceResult = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n wNearBalance = wNearBalanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors, assume no balance\n }\n\n const requiredAmount = new Big(finalQuote.amountIn);\n const currentBalance = new Big(wNearBalance);\n\n // If user doesn't have enough wNEAR, convert NEAR to wNEAR\n if (currentBalance.lt(requiredAmount)) {\n // Calculate how much NEAR we need to convert\n const amountToConvert = requiredAmount.minus(currentBalance);\n\n // Check wrap.near storage balance\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 // Convert NEAR to wNEAR\n // Note: Gas fees will be deducted from NEAR balance automatically\n // If user doesn't have enough NEAR, this will fail at execution time\n // which is expected behavior\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: amountToConvert.toFixed(0),\n });\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 if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\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 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 // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.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: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\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: \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n }\n\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 return tokens.map(() => false);\n }\n }\n}\n","import { ethers } from \"ethers\";\nimport type {\n BitgetQuoteResponse,\n BitgetSwapResponse,\n EvmChainAdapter,\n} from \"../adapters/types\";\nimport type { QuoteParams, QuoteResult, ExecuteResult } from \"../types\";\n\nexport const EIP1559_CHAINS = [8453, 1, 42161, 10, 137] as const;\nexport type Eip1559ChainId = typeof EIP1559_CHAINS[number];\nexport const BASE_CHAIN_ID = 8453;\n\nexport function isEip1559Chain(chainId: number): chainId is Eip1559ChainId {\n return (EIP1559_CHAINS as readonly number[]).includes(chainId);\n}\n\nexport const DEFAULT_GAS_LIMIT = \"800000\";\nexport const CONSERVATIVE_GAS_LIMIT = \"1000000\";\nexport const APPROVAL_RETRY_DELAY_MS = 1000;\nexport const MAX_APPROVAL_RETRIES = 5;\n\nexport const BASE_MAX_FEE_PER_GAS = \"0.1\";\nexport const BASE_MAX_PRIORITY_FEE_PER_GAS = \"0.01\";\nexport const BASE_MAX_FEE_CAP = \"1\";\nexport const BASE_PRIORITY_FEE_CAP = \"0.1\";\nexport const DEFAULT_MAX_FEE_PER_GAS = \"20\";\nexport const ETH_MAX_FEE_PER_GAS = \"50\";\nexport const POLYGON_MAX_FEE_PER_GAS = \"200\";\nexport const DEFAULT_MAX_FEE_PER_GAS_OTHER = \"100\";\nexport const MAX_PRIORITY_FEE_CAP = \"2\";\n\nexport const BASE_GAS_BUFFER = 105;\nexport const DEFAULT_GAS_BUFFER = 110;\n\nexport function isBitgetResponseSuccess(\n response: BitgetQuoteResponse | BitgetSwapResponse\n): boolean {\n return (\n response.code === \"00000\" ||\n response.error_code === 0 ||\n response.status === 0\n );\n}\n\nexport function createQuoteError(\n params: QuoteParams,\n error: string\n): QuoteResult {\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,\n };\n}\n\nexport function createExecuteError(error: string): ExecuteResult {\n return {\n success: false,\n error,\n };\n}\n\nexport function getGasBuffer(chainId: number): number {\n return chainId === BASE_CHAIN_ID ? BASE_GAS_BUFFER : DEFAULT_GAS_BUFFER;\n}\n\nexport function getMaxFeePerGas(chainId: number): string {\n if (chainId === 1) return ETH_MAX_FEE_PER_GAS;\n if (chainId === 137) return POLYGON_MAX_FEE_PER_GAS;\n return DEFAULT_MAX_FEE_PER_GAS_OTHER;\n}\n\nexport async function getGasPriceEstimate(\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<ethers.BigNumber> {\n const isBase = chainId === BASE_CHAIN_ID;\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const feeData = await signer.provider.getFeeData();\n if (isBase) {\n const baseMaxFeePerGas = ethers.utils.parseUnits(\n BASE_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n return feeData.maxFeePerGas &&\n feeData.maxFeePerGas.lte(ethers.utils.parseUnits(BASE_MAX_FEE_CAP, \"gwei\"))\n ? feeData.maxFeePerGas\n : baseMaxFeePerGas;\n } else {\n return (\n feeData.maxFeePerGas ||\n feeData.gasPrice ||\n ethers.utils.parseUnits(DEFAULT_MAX_FEE_PER_GAS, \"gwei\")\n );\n }\n }\n } catch (error) {\n }\n\n return ethers.utils.parseUnits(\n isBase ? BASE_MAX_FEE_PER_GAS : DEFAULT_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n}\n\n// Returns [gasLimit, hasReliableEstimate, rpcEstimateError]\n// rpcEstimateError: null if no error, or error object if RPC estimation failed\nexport async function estimateGasLimit(\n gas: string | undefined,\n to: string,\n transactionData: string,\n value: string,\n sender: string,\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<[ethers.BigNumber, boolean, { code?: string; reason?: string; message?: string } | null]> {\n const bufferPercent = getGasBuffer(chainId);\n let estimatedGasLimit: ethers.BigNumber | undefined;\n let hasReliableEstimate = false;\n let rpcEstimateError: { code?: string; reason?: string; message?: string } | null = null;\n\n if (gas) {\n try {\n const gasBN = ethers.BigNumber.from(gas);\n if (gasBN.gt(0)) {\n estimatedGasLimit = gasBN.mul(bufferPercent).div(100);\n hasReliableEstimate = true;\n }\n } catch (error) {\n }\n }\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n try {\n const rpcEstimatedGas = await signer.provider.estimateGas({\n to,\n data: transactionData,\n value: value || \"0\",\n from: sender,\n });\n\n if (rpcEstimatedGas && rpcEstimatedGas.gt(0)) {\n const rpcGasWithBuffer = rpcEstimatedGas.mul(bufferPercent).div(100);\n\n if (!estimatedGasLimit || rpcGasWithBuffer.gt(estimatedGasLimit)) {\n estimatedGasLimit = rpcGasWithBuffer;\n }\n hasReliableEstimate = true;\n }\n } catch (estimateError: any) {\n // Capture RPC estimation error details\n rpcEstimateError = {\n code: estimateError?.code,\n reason: estimateError?.reason,\n message: estimateError?.message || String(estimateError),\n };\n console.warn(\"RPC gas estimate failed:\", {\n error: estimateError?.message || String(estimateError),\n code: estimateError?.code,\n reason: estimateError?.reason,\n });\n }\n }\n } catch (error: any) {\n console.warn(\"Gas estimation error:\", {\n error: error?.message || String(error),\n });\n }\n\n if (estimatedGasLimit && estimatedGasLimit.gt(0) && hasReliableEstimate) {\n return [estimatedGasLimit, true, rpcEstimateError];\n }\n\n if (estimatedGasLimit && estimatedGasLimit.gt(0)) {\n return [estimatedGasLimit, false, rpcEstimateError];\n }\n\n return [ethers.BigNumber.from(CONSERVATIVE_GAS_LIMIT), false, rpcEstimateError];\n}\n\nexport async function getEip1559FeeData(\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<{\n maxFeePerGas?: ethers.BigNumber;\n maxPriorityFeePerGas?: ethers.BigNumber;\n gasPrice?: ethers.BigNumber;\n}> {\n const feeData: {\n maxFeePerGas?: ethers.BigNumber;\n maxPriorityFeePerGas?: ethers.BigNumber;\n gasPrice?: ethers.BigNumber;\n } = {};\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const providerFeeData = await signer.provider.getFeeData();\n\n if (chainId === BASE_CHAIN_ID) {\n const baseMaxFeePerGas = ethers.utils.parseUnits(BASE_MAX_FEE_PER_GAS, \"gwei\");\n const baseMaxPriorityFeePerGas = ethers.utils.parseUnits(\n BASE_MAX_PRIORITY_FEE_PER_GAS,\n \"gwei\"\n );\n\n feeData.maxFeePerGas =\n providerFeeData.maxFeePerGas &&\n providerFeeData.maxFeePerGas.gt(0) &&\n providerFeeData.maxFeePerGas.lte(ethers.utils.parseUnits(BASE_MAX_FEE_CAP, \"gwei\"))\n ? providerFeeData.maxFeePerGas\n : baseMaxFeePerGas;\n\n feeData.maxPriorityFeePerGas =\n providerFeeData.maxPriorityFeePerGas &&\n providerFeeData.maxPriorityFeePerGas.gt(0) &&\n providerFeeData.maxPriorityFeePerGas.lte(\n ethers.utils.parseUnits(BASE_PRIORITY_FEE_CAP, \"gwei\")\n )\n ? providerFeeData.maxPriorityFeePerGas\n : baseMaxPriorityFeePerGas;\n } else {\n if (\n providerFeeData.maxFeePerGas &&\n providerFeeData.maxPriorityFeePerGas &&\n providerFeeData.maxFeePerGas.gt(0) &&\n providerFeeData.maxPriorityFeePerGas.gt(0)\n ) {\n const maxAllowedFeePerGas = ethers.utils.parseUnits(\n getMaxFeePerGas(chainId),\n \"gwei\"\n );\n\n feeData.maxFeePerGas = providerFeeData.maxFeePerGas.gt(maxAllowedFeePerGas)\n ? maxAllowedFeePerGas\n : providerFeeData.maxFeePerGas;\n\n if (feeData.maxFeePerGas) {\n const maxPriorityFeeCap = feeData.maxFeePerGas\n .div(10)\n .gt(ethers.utils.parseUnits(MAX_PRIORITY_FEE_CAP, \"gwei\"))\n ? ethers.utils.parseUnits(MAX_PRIORITY_FEE_CAP, \"gwei\")\n : feeData.maxFeePerGas.div(10);\n\n feeData.maxPriorityFeePerGas =\n providerFeeData.maxPriorityFeePerGas.gt(maxPriorityFeeCap)\n ? maxPriorityFeeCap\n : providerFeeData.maxPriorityFeePerGas;\n }\n }\n }\n }\n } catch (error) {\n }\n\n if (!feeData.maxFeePerGas || feeData.maxFeePerGas.lte(0)) {\n feeData.maxFeePerGas = ethers.utils.parseUnits(\n chainId === BASE_CHAIN_ID ? BASE_MAX_FEE_PER_GAS : DEFAULT_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n }\n\n if (!feeData.maxPriorityFeePerGas || feeData.maxPriorityFeePerGas.lte(0)) {\n feeData.maxPriorityFeePerGas = feeData.maxFeePerGas.div(10);\n }\n\n return feeData;\n}\n","\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport { convertSlippageToBasisPoints } from \"../../utils\";\nimport {\n BitgetAdapter,\n EvmChainAdapter,\n} from \"../../adapters/types\";\nimport { logger } from \"../../utils/logger\";\nimport {\n isBitgetResponseSuccess,\n createQuoteError,\n createExecuteError,\n getGasPriceEstimate,\n estimateGasLimit,\n getEip1559FeeData,\n isEip1559Chain,\n MAX_APPROVAL_RETRIES,\n APPROVAL_RETRY_DELAY_MS,\n} from \"../../utils/bitgetUtils\";\n\nexport interface BitgetRouterConfig {\n bitgetAdapter: BitgetAdapter;\n evmChainAdapter: EvmChainAdapter;\n chainId: number; // EVM chain ID (e.g., 1 for Ethereum, 56 for BSC)\n}\n\n/**\n * Bitget Router implementation for EVM chains\n */\nexport class BitgetRouter implements DexRouter {\n private bitgetAdapter: BitgetAdapter;\n private evmChainAdapter: EvmChainAdapter;\n private chainId: number;\n\n constructor(config: BitgetRouterConfig) {\n this.bitgetAdapter = config.bitgetAdapter;\n this.evmChainAdapter = config.evmChainAdapter;\n this.chainId = config.chainId;\n }\n\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"evm\",\n };\n }\n\n getSupportedChain(): \"evm\" {\n return \"evm\";\n }\n\n getChainId(): number {\n return this.chainId;\n }\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: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\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 sender or recipient\",\n };\n }\n\n if (tokenIn?.address === undefined || tokenOut?.address === undefined) {\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 = tokenIn.address === \"\" \n ? \"\" \n : this.normalizeEvmAddress(tokenIn.address);\n const normalizedTokenOut = tokenOut.address === \"\"\n ? \"\"\n : this.normalizeEvmAddress(tokenOut.address);\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.bitgetAdapter.quote({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n userAddress: sender,\n tokenInSymbol: tokenIn.symbol,\n tokenInDecimals: tokenIn.decimals,\n tokenOutSymbol: tokenOut.symbol,\n tokenOutDecimals: tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(response) || !response.data) {\n return createQuoteError(\n params,\n response.msg || \"Failed to get quote\"\n );\n }\n\n const {\n inAmount,\n outAmount,\n toAmount,\n minOutAmount,\n toMinAmount,\n data,\n to,\n value,\n gas,\n market,\n } = response.data;\n\n const readableOutAmount = outAmount || toAmount || \"0\";\n const readableMinOutAmount = minOutAmount || toMinAmount || \"0\";\n \n let formattedOutAmount = readableOutAmount;\n let formattedMinOutAmount = readableMinOutAmount;\n \n if (readableOutAmount !== \"0\" && tokenOut.decimals !== undefined) {\n try {\n const readableAmount = new Big(readableOutAmount);\n const multiplier = new Big(10).pow(tokenOut.decimals);\n formattedOutAmount = readableAmount.mul(multiplier).toFixed(0);\n \n if (readableMinOutAmount !== \"0\") {\n const readableMinAmount = new Big(readableMinOutAmount);\n formattedMinOutAmount = readableMinAmount.mul(multiplier).toFixed(0);\n }\n } catch (error: any) {\n formattedOutAmount = readableOutAmount;\n formattedMinOutAmount = readableMinOutAmount;\n }\n }\n\n let formattedInAmount = inAmount || amountIn;\n if (inAmount && tokenIn.decimals !== undefined && inAmount.includes(\".\")) {\n try {\n const readableAmount = new Big(inAmount);\n const multiplier = new Big(10).pow(tokenIn.decimals);\n formattedInAmount = readableAmount.mul(multiplier).toFixed(0);\n } catch (error: any) {\n formattedInAmount = inAmount;\n }\n }\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: formattedInAmount,\n amountOut: formattedOutAmount,\n minAmountOut: formattedMinOutAmount,\n routes: [],\n transactionData: data,\n gasEstimate: gas,\n routerMsg: JSON.stringify({\n to,\n data,\n value: value || \"0\",\n gas,\n market: market || \"\",\n }),\n recipient,\n slippage,\n };\n } catch (error: any) {\n return createQuoteError(\n params,\n error?.message || \"Failed to get quote\"\n );\n }\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return createExecuteError(\"Missing sender or receiveUser\");\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return createExecuteError(\"Invalid quote\");\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return createExecuteError(\"Missing receiveUser\");\n }\n\n let market: string;\n try {\n if (quote.routerMsg) {\n const routerMsg = JSON.parse(quote.routerMsg);\n market = routerMsg.market || \"\";\n } else {\n return createExecuteError(\"Missing market from quote, please re-fetch quote\");\n }\n } catch (error) {\n return createExecuteError(\"Invalid quote format: missing market\");\n }\n\n if (!market) {\n return createExecuteError(\"Missing market from quote response\");\n }\n\n const normalizedTokenIn = this.normalizeEvmAddress(\n quote.tokenIn.address\n );\n const normalizedTokenOut = this.normalizeEvmAddress(\n quote.tokenOut.address\n );\n\n const slippageBps = convertSlippageToBasisPoints(quote.slippage || 0.5);\n const executionSlippage = slippageBps / 10000;\n \n const reQuoteResponse = await this.bitgetAdapter.quote({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n slippage: executionSlippage,\n userAddress: receiveUser,\n tokenInSymbol: quote.tokenIn.symbol,\n tokenInDecimals: quote.tokenIn.decimals,\n tokenOutSymbol: quote.tokenOut.symbol,\n tokenOutDecimals: quote.tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(reQuoteResponse) || !reQuoteResponse.data) {\n return createExecuteError(\n `Re-quote failed: ${reQuoteResponse.msg || \"Please refresh quote and try again\"}`\n );\n }\n\n market = reQuoteResponse.data?.market || market;\n\n const swapResponse = await this.bitgetAdapter.swap({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n slippage: executionSlippage,\n fromAddress: sender,\n toAddress: receiveUser,\n market: market,\n tokenInSymbol: quote.tokenIn.symbol,\n tokenInDecimals: quote.tokenIn.decimals,\n tokenOutSymbol: quote.tokenOut.symbol,\n tokenOutDecimals: quote.tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(swapResponse) || !swapResponse.data) {\n return createExecuteError(\n swapResponse.msg || \"Failed to get swap calldata\"\n );\n }\n\n if (swapResponse.data?.estimateRevert === true) {\n return createExecuteError(\n \"Transaction will fail on-chain (slippage too high or price changed). Please refresh quote.\"\n );\n }\n\n let transactionData = swapResponse.data?.calldata || swapResponse.data?.data;\n const to = swapResponse.data?.contract || swapResponse.data?.to;\n let value = swapResponse.data?.value || \"0\";\n \n if (transactionData && !transactionData.startsWith(\"0x\")) {\n transactionData = \"0x\" + transactionData;\n }\n \n const isNativeTokenIn = !normalizedTokenIn || normalizedTokenIn === \"\";\n if (isNativeTokenIn) {\n value = quote.amountIn;\n }\n \n const gas = swapResponse.data?.gas || \n (swapResponse.data?.computeUnits !== undefined \n ? String(swapResponse.data.computeUnits) \n : undefined);\n\n if (!to || !transactionData) {\n return createExecuteError(\"Invalid swap response: missing to or data\");\n }\n \n if (transactionData.length < 10 || !/^0x[0-9a-fA-F]+$/.test(transactionData)) {\n return createExecuteError(\"Invalid calldata format: must be hex string starting with 0x\");\n }\n\n // Check balance and approval for ERC20 tokens\n if (normalizedTokenIn && normalizedTokenIn !== \"\") {\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"getBalance method not available on evmChainAdapter\");\n }\n const tokenBalanceFormatted = await this.evmChainAdapter.getBalance({\n address: sender,\n tokenAddress: normalizedTokenIn,\n });\n \n const tokenDecimals = quote.tokenIn.decimals || 18;\n const balanceBN = ethers.utils.parseUnits(tokenBalanceFormatted || \"0\", tokenDecimals);\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n if (balanceBN.lt(amountInBN)) {\n return createExecuteError(\n `Insufficient token balance: have ${tokenBalanceFormatted}, need ${ethers.utils.formatUnits(amountInBN, tokenDecimals)}`\n );\n }\n\n const currentAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n\n const allowanceBN = ethers.BigNumber.from(currentAllowance);\n\n if (allowanceBN.lt(amountInBN)) {\n try {\n const approveResult = await this.evmChainAdapter.approve({\n tokenAddress: normalizedTokenIn,\n spender: to,\n amount: ethers.constants.MaxUint256.toString(),\n });\n \n let retryCount = 0;\n let newAllowanceBN = ethers.BigNumber.from(\"0\");\n\n while (retryCount < MAX_APPROVAL_RETRIES) {\n await new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_RETRY_DELAY_MS * (retryCount + 1))\n );\n \n const newAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n \n newAllowanceBN = ethers.BigNumber.from(newAllowance);\n \n if (newAllowanceBN.gte(amountInBN)) {\n break;\n }\n \n retryCount++;\n }\n \n if (newAllowanceBN.lt(amountInBN)) {\n return createExecuteError(\n `Token approval insufficient after ${MAX_APPROVAL_RETRIES} retries. Approval tx: ${approveResult.txHash}`\n );\n }\n } catch (error: any) {\n return createExecuteError(\n `Token approval failed: ${error?.message || \"Unknown error\"}`\n );\n }\n }\n } else {\n // Check native token balance (including gas)\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"getBalance method not available on evmChainAdapter\");\n }\n const nativeBalanceFormatted = await this.evmChainAdapter.getBalance({\n address: sender,\n tokenAddress: undefined,\n });\n const balanceBN = ethers.utils.parseEther(nativeBalanceFormatted || \"0\");\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n const gasPriceEstimate = await getGasPriceEstimate(\n this.chainId,\n this.evmChainAdapter\n );\n \n const [estimatedGasLimitForBalance] = await estimateGasLimit(\n gas,\n to,\n transactionData,\n value,\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n \n const gasCostEstimate = estimatedGasLimitForBalance.mul(gasPriceEstimate);\n const totalRequired = amountInBN.add(gasCostEstimate);\n \n if (balanceBN.lt(totalRequired)) {\n return createExecuteError(\n `Insufficient native token balance: have ${nativeBalanceFormatted} ETH, need ${ethers.utils.formatEther(totalRequired)} ETH`\n );\n }\n }\n\n if (normalizedTokenIn && normalizedTokenIn !== \"\") {\n const finalAllowanceCheck = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n const finalAllowanceBN = ethers.BigNumber.from(finalAllowanceCheck);\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n if (finalAllowanceBN.lt(amountInBN)) {\n return createExecuteError(\n `Insufficient allowance: current ${finalAllowanceBN.toString()}, required ${amountInBN.toString()}`\n );\n }\n }\n\n const [estimatedGasLimit, hasReliableEstimate, rpcEstimateError] = await estimateGasLimit(\n gas,\n to,\n transactionData,\n value,\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n\n if (rpcEstimateError) {\n const isUnpredictableGasLimit = \n rpcEstimateError.code === \"UNPREDICTABLE_GAS_LIMIT\" ||\n (rpcEstimateError.message && rpcEstimateError.message.includes(\"UNPREDICTABLE_GAS_LIMIT\")) ||\n (rpcEstimateError.reason && rpcEstimateError.reason.includes(\"execution reverted\"));\n \n if (isUnpredictableGasLimit) {\n logger.warn(\"Blocking transaction due to RPC gas estimation failure\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n rpcError: rpcEstimateError,\n });\n return createExecuteError(\n \"Insufficient liquidity, transaction may fail. Please refresh quote and try again.\"\n );\n }\n\n if (!gas || gas === \"0\") {\n return createExecuteError(\n \"Unable to estimate gas fee, possibly due to insufficient liquidity. Please refresh quote and try again.\"\n );\n }\n\n logger.warn(\"RPC gas estimation failed, using Bitget estimate\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n estimatedGasLimit: estimatedGasLimit.toString(),\n bitgetGas: gas || \"not provided\",\n rpcError: rpcEstimateError,\n });\n } else if (!hasReliableEstimate) {\n // No RPC error but also no reliable estimate\n logger.warn(\"Gas estimation unreliable, using conservative default\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n estimatedGasLimit: estimatedGasLimit.toString(),\n bitgetGas: gas || \"not provided\",\n });\n }\n\n const supportsEip1559 = isEip1559Chain(this.chainId);\n \n let gasPriceEstimate: ethers.BigNumber | undefined;\n const getCachedGasPrice = async () => {\n if (!gasPriceEstimate) {\n gasPriceEstimate = await getGasPriceEstimate(this.chainId, this.evmChainAdapter);\n }\n return gasPriceEstimate;\n };\n \n let feeData: { maxFeePerGas?: ethers.BigNumber; maxPriorityFeePerGas?: ethers.BigNumber; gasPrice?: ethers.BigNumber } = {};\n \n if (supportsEip1559) {\n feeData = await getEip1559FeeData(this.chainId, this.evmChainAdapter);\n \n // Validate and ensure we have valid fee data\n if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas || \n feeData.maxFeePerGas.lte(0) || feeData.maxPriorityFeePerGas.lte(0)) {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.maxFeePerGas = cachedGasPrice;\n feeData.maxPriorityFeePerGas = cachedGasPrice.div(10);\n const minPriorityFee = ethers.utils.parseUnits(\"1\", \"gwei\");\n if (feeData.maxPriorityFeePerGas.lt(minPriorityFee)) {\n feeData.maxPriorityFeePerGas = minPriorityFee;\n }\n }\n } else {\n try {\n const signer = await this.evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const providerFeeData = await signer.provider.getFeeData();\n if (providerFeeData.gasPrice && providerFeeData.gasPrice.gt(0)) {\n feeData.gasPrice = providerFeeData.gasPrice;\n } else {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n } else {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n } catch (error) {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n }\n\n // Final validation before building transaction\n if (!to || !ethers.utils.isAddress(to)) {\n return createExecuteError(`Invalid contract address: ${to}`);\n }\n\n if (!transactionData || transactionData.length < 10) {\n return createExecuteError(`Invalid calldata: length ${transactionData?.length || 0}`);\n }\n\n // Validate gas limit\n if (!estimatedGasLimit || estimatedGasLimit.lte(0)) {\n return createExecuteError(\"Invalid gas limit estimate. Please refresh quote and try again.\");\n }\n\n // Validate fee data based on chain type\n if (supportsEip1559) {\n if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas ||\n feeData.maxFeePerGas.lte(0) || feeData.maxPriorityFeePerGas.lte(0)) {\n return createExecuteError(\"Invalid gas fee data. Please try again.\");\n }\n } else {\n if (!feeData.gasPrice || feeData.gasPrice.lte(0)) {\n return createExecuteError(\"Invalid gas price. Please try again.\");\n }\n }\n\n const txParams: Parameters<EvmChainAdapter[\"sendTransaction\"]>[0] = {\n to,\n data: transactionData,\n value: value || \"0\",\n gasLimit: estimatedGasLimit.toString(),\n };\n\n if (supportsEip1559 && feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {\n txParams.type = 2;\n txParams.maxFeePerGas = feeData.maxFeePerGas.toString();\n txParams.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas.toString();\n } else if (feeData.gasPrice) {\n txParams.gasPrice = feeData.gasPrice.toString();\n }\n\n const result = await this.evmChainAdapter.sendTransaction(txParams);\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHash ? [result.txHash] : [],\n };\n } else {\n return createExecuteError(result.message || \"Execute swap failed\");\n }\n } catch (error: any) {\n return createExecuteError(error?.message || \"Execute swap failed\");\n }\n }\n\n private normalizeEvmAddress(address: string): string {\n if (!address) return address;\n try {\n return ethers.utils.getAddress(address);\n } catch (e) {\n const addr = address.startsWith(\"0x\") ? address.slice(2) : address;\n return \"0x\" + addr.toLowerCase();\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 isEvmIntentsSupportedToken,\n findBestBluechipToken,\n findBestEvmBluechipToken,\n normalizeTokenId,\n normalizeEvmAddress,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\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 customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n /** Optional: EVM chain ID for precise chain identification (e.g., 1 for Ethereum, 56 for BSC) */\n evmChainId?: number;\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 routeType?: \"v1\" | \"v2\" | \"evm\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"evm\" | \"intents\"; // Route type used\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouters?: DexRouter[];\n dexRouter?: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n /** Optional: Get native wrapped token address for EVM chains (e.g., WETH) */\n getEvmNativeWrappedTokenAddress?(): string;\n };\n currentUserAddress?: string;\n /** Optional function to check if token supports Intents (beyond bluechip tokens) */\n isIntentsSupportedToken?: (token: TokenInfo) => boolean;\n}\n\n/**\n * Build a complete quote with optional pre-swap\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 customRecipientMsg,\n appFees,\n evmChainId,\n } = params;\n\n const {\n intentsQuotationAdapter,\n dexRouters,\n dexRouter,\n bluechipTokens,\n configAdapter,\n currentUserAddress,\n isIntentsSupportedToken: customIsIntentsSupportedToken,\n } = config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n const routers = dexRouters || (dexRouter ? [dexRouter] : []);\n // Allow routers to be empty (non-Bitget supported chains direct Intents)\n // Ensure isTokenIntentsSupported is true\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for routers that require recipient\");\n }\n\n // Check if token address is undefined (not provided)\n // Note: Empty string \"\" is valid for native tokens (ETH), so we only check for undefined\n if (sourceToken?.address === undefined) {\n throw new Error(\"Source token address is required\");\n }\n if (targetToken?.address === undefined) {\n throw new Error(\"Target token address is required\");\n }\n\n const isEvmChain = evmChainId !== undefined ||\n sourceChain === \"evm\" || \n sourceChain === \"ethereum\" || \n sourceChain === \"bsc\" || \n sourceChain === \"polygon\" ||\n sourceChain === \"base\" ||\n sourceChain === \"monad\" ||\n sourceToken.chain === \"evm\";\n\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isEvmChain\n ? isEvmIntentsSupportedToken(sourceToken, bluechipTokens)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = isEvmChain\n ? findBestEvmBluechipToken(\n bluechipTokens,\n configAdapter.getEvmNativeWrappedTokenAddress?.()\n )\n : findBestBluechipToken(bluechipTokens, wrapNearContractId);\n\n if (!bluechipToken?.address) {\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"evm\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n routers.forEach((router, index) => {\n const supportedChain = router.getSupportedChain();\n const isEvmRouter = supportedChain === \"evm\";\n \n let routeType: \"v1\" | \"v2\" | \"evm\";\n if (isEvmRouter) {\n routeType = \"evm\";\n } else {\n routeType = index === 0 ? \"v1\" : \"v2\";\n }\n \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 quotePaths.push({\n type: routeType,\n router,\n promise: (async () => {\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error || \"Unknown error\"}`);\n }\n\n let normalizedSourceAsset: string;\n if (isEvmChain) {\n const bluechipKey = bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `evm:${normalizeEvmAddress(bluechipToken.address)}`;\n } else {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1 format\n } else 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 if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n \n let formattedAmountOut = preSwapQuote.amountOut;\n if (isEvmChain && bluechipToken.decimals !== undefined) {\n try {\n const amountBN = new Big(preSwapQuote.amountOut);\n if (amountBN.lte(0)) {\n throw new Error(`Invalid amountOut: ${preSwapQuote.amountOut}`);\n }\n formattedAmountOut = amountBN.toFixed(0, Big.roundDown);\n } catch (error: any) {\n throw new Error(`Failed to process amountOut: ${error?.message || String(error)}`);\n }\n }\n \n try {\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: formattedAmountOut,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"FLEX_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n ...(appFees ? { appFees } : {}),\n });\n \n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(`Intents quote failed: ${intentsQuote.message || \"Unknown error\"}`);\n }\n \n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n } catch (error: any) {\n throw error;\n }\n })(),\n });\n });\n\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n let normalizedSourceAsset: string;\n if (isEvmChain) {\n const sourceKey = sourceToken.symbol?.toUpperCase();\n const sourceTokenConfig = sourceKey ? bluechipTokens[sourceKey] : undefined;\n // Handle native token (empty address)\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else if (sourceToken.address === \"\") {\n // Native token (ETH) - use symbol-based assetId or fallback\n normalizedSourceAsset = `evm-${sourceChain}-native`;\n } else {\n normalizedSourceAsset = `evm:${normalizeEvmAddress(sourceToken.address)}`;\n }\n } else {\n const sourceKey = sourceToken.symbol?.toUpperCase();\n const sourceTokenConfig = sourceKey ? bluechipTokens[sourceKey] : undefined;\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(sourceToken.address, wrapNearContractId);\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1 format\n } else 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 if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"evm\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(\"Failed to get quote\");\n }\n\n const bestPath = validPaths.reduce((best, current) => {\n const bestAmount = new Big(best.finalAmountOut);\n const currentAmount = new Big(current.finalAmountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n\n const depositAddress =\n bestPath.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: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\" | \"evm\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\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 throw new Error(`All router quotes failed: ${errors.join(\"; \")}`);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/utils/errorMessages.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/utils/bitgetUtils.ts","../src/chains/evm/BitgetRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big","ethers","gasPriceEstimate"],"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 /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\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 * Unified error messages for the SDK\n * All error messages should be defined here for consistency\n */\n\nexport const TRANSACTION_EXECUTION_ERROR_MESSAGE =\n \"Transaction execution error occurred. Please contact support\";\n\nexport const ErrorMessages = {\n // Quote errors\n QUOTE_FAILED: \"Failed to get quote\",\n \n // Execution errors\n EXECUTE_FAILED: \"Transaction failed\",\n} as const;\n\n/**\n * Get user-friendly error message\n * Prioritizes API error messages, falls back to standardized messages\n */\nexport function getErrorMessage(\n error: string | undefined | null,\n fallback: string = ErrorMessages.EXECUTE_FAILED\n): string {\n if (!error) return fallback;\n \n // Use API error if available\n if (error && error.length > 0) {\n return error;\n }\n \n return fallback;\n}\n\n/**\n * Process error message to determine if it's a user action or system error\n * Returns original message for user actions, unified message for system errors\n */\nexport function processErrorMessage(errorMessage: string): string {\n // Convert to lowercase for case-insensitive matching\n const errorString = errorMessage.toLowerCase();\n\n // Keywords that indicate user-initiated actions (keep original message)\n const userActionKeywords = [\n \"user\",\n \"rejected\",\n \"cancelled\",\n \"cancel\",\n \"denied\",\n \"undefined\",\n \"null\",\n ];\n\n // Check if error message contains any of the user action keywords\n const containsUserActionKeyword = userActionKeywords.some((keyword) =>\n errorString.includes(keyword)\n );\n\n // If contains user action keyword, return original message\n if (containsUserActionKeyword) {\n return errorMessage;\n }\n\n // Otherwise, return generic error message\n return TRANSACTION_EXECUTION_ERROR_MESSAGE;\n}\n\n/**\n * Normalize common error patterns\n */\nexport function normalizeError(error: string | undefined | null): string {\n if (!error) return ErrorMessages.EXECUTE_FAILED;\n \n const errorLower = error.toLowerCase();\n \n // All quote/validation errors -> QUOTE_FAILED\n if (errorLower.includes(\"quote\") || errorLower.includes(\"route\") || errorLower.includes(\"missing\") || \n errorLower.includes(\"required\") || errorLower.includes(\"invalid\") || errorLower.includes(\"balance\") ||\n errorLower.includes(\"liquidity\") || errorLower.includes(\"slippage\") || errorLower.includes(\"gas\") ||\n errorLower.includes(\"network\")) {\n return ErrorMessages.QUOTE_FAILED;\n }\n \n // For other system errors, use processErrorMessage to return unified message\n return processErrorMessage(error);\n}\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 { ErrorMessages } from \"./errorMessages\";\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 if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\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 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 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/**\n * Normalize EVM address to checksum format (lowercase for comparison)\n */\nexport function normalizeEvmAddress(address: string): string {\n if (!address) return address;\n // Remove 0x prefix if present, convert to lowercase, then add 0x back\n const addr = address.startsWith(\"0x\") ? address.slice(2) : address;\n return \"0x\" + addr.toLowerCase();\n}\n\n/** True if the token matches an Intents-supported bluechip token for EVM chains (by symbol + address). */\nexport function isEvmIntentsSupportedToken(\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 // EVM bluechip tokens: USDT, USDC, ETH, WETH\n const symbolKey =\n normalizedSymbol === \"ETH\" || normalizedSymbol === \"WETH\"\n ? \"ETH\"\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) => normalizeEvmAddress(addr);\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/**\n * Find best bluechip token for EVM chains (priority: USDT > USDC > ETH/WETH)\n */\nexport function findBestEvmBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n nativeTokenAddress?: string // e.g., WETH address\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: \"evm\",\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: \"evm\",\n });\n }\n\n if (bluechipTokens.ETH?.address) {\n preferredTokens.push({\n address: bluechipTokens.ETH.address,\n symbol: bluechipTokens.ETH.symbol || \"WETH\",\n decimals: bluechipTokens.ETH.decimals || 18,\n chain: \"evm\",\n });\n }\n\n // Fallback to native wrapped token if provided\n if (preferredTokens.length === 0 && nativeTokenAddress) {\n return {\n address: nativeTokenAddress,\n symbol: \"WETH\",\n decimals: 18,\n chain: \"evm\",\n };\n }\n\n if (preferredTokens.length === 0) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n return preferredTokens[0];\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 return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\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 // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\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 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\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n}\n\nexport { logger } from \"./logger\";\nexport { ErrorMessages, normalizeError, getErrorMessage, processErrorMessage, TRANSACTION_EXECUTION_ERROR_MESSAGE } from \"./errorMessages\";\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 { ErrorMessages, normalizeError } from \"../../utils/errorMessages\";\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: ErrorMessages.QUOTE_FAILED,\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 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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\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 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: normalizeError(response?.result_msg || response?.result_message) || ErrorMessages.QUOTE_FAILED,\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: normalizeError(error?.message) || ErrorMessages.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: ErrorMessages.QUOTE_FAILED,\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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\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: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\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 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 const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\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: normalizeError(result.message) || ErrorMessages.EXECUTE_FAILED,\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: normalizeError(error?.message) || ErrorMessages.EXECUTE_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 { ErrorMessages, normalizeError } from \"../../utils/errorMessages\";\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 // AGGREGATE_DEX_CONTRACT_ID not configured\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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\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: ErrorMessages.QUOTE_FAILED,\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: ErrorMessages.QUOTE_FAILED,\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 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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\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 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: ErrorMessages.QUOTE_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 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: normalizeError(error?.message) || ErrorMessages.QUOTE_FAILED,\n };\n }\n }\n\n /**\n * @deprecated No longer needed. 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(ErrorMessages.QUOTE_FAILED);\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\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.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: normalizeError(error?.message) || ErrorMessages.QUOTE_FAILED,\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: ErrorMessages.QUOTE_FAILED,\n };\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 native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\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 // 1.5. Handle case where tokenIn is wNEAR but user doesn't have wNEAR balance\n // If tokenIn is wNEAR, check balance and convert NEAR to wNEAR if needed\n const isWrappedNear =\n finalQuote.tokenIn.address === this.wrapNearContractId ||\n (finalQuote.tokenIn.symbol === \"WNEAR\" &&\n finalQuote.tokenIn.address === this.wrapNearContractId);\n\n if (isWrappedNear && !isNativeNear) {\n // Check wNEAR balance\n let wNearBalance = \"0\";\n try {\n const wNearBalanceResult = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n wNearBalance = wNearBalanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors, assume no balance\n }\n\n const requiredAmount = new Big(finalQuote.amountIn);\n const currentBalance = new Big(wNearBalance);\n\n // If user doesn't have enough wNEAR, convert NEAR to wNEAR\n if (currentBalance.lt(requiredAmount)) {\n // Calculate how much NEAR we need to convert\n const amountToConvert = requiredAmount.minus(currentBalance);\n\n // Check wrap.near storage balance\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 // Convert NEAR to wNEAR\n // Note: Gas fees will be deducted from NEAR balance automatically\n // If user doesn't have enough NEAR, this will fail at execution time\n // which is expected behavior\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: amountToConvert.toFixed(0),\n });\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 if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\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 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 // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: normalizeError(error?.message) || ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.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: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\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: normalizeError(result.message) || ErrorMessages.EXECUTE_FAILED,\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: normalizeError(error?.message) || ErrorMessages.EXECUTE_FAILED,\n };\n }\n }\n\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 return tokens.map(() => false);\n }\n }\n}\n","import { ethers } from \"ethers\";\nimport type {\n BitgetQuoteResponse,\n BitgetSwapResponse,\n EvmChainAdapter,\n} from \"../adapters/types\";\nimport type { QuoteParams, QuoteResult, ExecuteResult } from \"../types\";\n\nexport const EIP1559_CHAINS = [8453, 1, 42161, 10, 137] as const;\nexport type Eip1559ChainId = typeof EIP1559_CHAINS[number];\nexport const BASE_CHAIN_ID = 8453;\n\nexport function isEip1559Chain(chainId: number): chainId is Eip1559ChainId {\n return (EIP1559_CHAINS as readonly number[]).includes(chainId);\n}\n\nexport const DEFAULT_GAS_LIMIT = \"800000\";\nexport const CONSERVATIVE_GAS_LIMIT = \"1000000\";\nexport const APPROVAL_RETRY_DELAY_MS = 1000;\nexport const MAX_APPROVAL_RETRIES = 5;\n\nexport const BASE_MAX_FEE_PER_GAS = \"0.1\";\nexport const BASE_MAX_PRIORITY_FEE_PER_GAS = \"0.01\";\nexport const BASE_MAX_FEE_CAP = \"1\";\nexport const BASE_PRIORITY_FEE_CAP = \"0.1\";\nexport const DEFAULT_MAX_FEE_PER_GAS = \"20\";\nexport const ETH_MAX_FEE_PER_GAS = \"50\";\nexport const POLYGON_MAX_FEE_PER_GAS = \"200\";\nexport const DEFAULT_MAX_FEE_PER_GAS_OTHER = \"100\";\nexport const MAX_PRIORITY_FEE_CAP = \"2\";\n\nexport const BASE_GAS_BUFFER = 105;\nexport const DEFAULT_GAS_BUFFER = 110;\n\nexport function isBitgetResponseSuccess(\n response: BitgetQuoteResponse | BitgetSwapResponse\n): boolean {\n return (\n response.code === \"00000\" ||\n response.error_code === 0 ||\n response.status === 0\n );\n}\n\nexport function createQuoteError(\n params: QuoteParams,\n error: string\n): QuoteResult {\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,\n };\n}\n\nexport function createExecuteError(error: string): ExecuteResult {\n return {\n success: false,\n error,\n };\n}\n\nexport function getGasBuffer(chainId: number): number {\n return chainId === BASE_CHAIN_ID ? BASE_GAS_BUFFER : DEFAULT_GAS_BUFFER;\n}\n\nexport function getMaxFeePerGas(chainId: number): string {\n if (chainId === 1) return ETH_MAX_FEE_PER_GAS;\n if (chainId === 137) return POLYGON_MAX_FEE_PER_GAS;\n return DEFAULT_MAX_FEE_PER_GAS_OTHER;\n}\n\nexport async function getGasPriceEstimate(\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<ethers.BigNumber> {\n const isBase = chainId === BASE_CHAIN_ID;\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const feeData = await signer.provider.getFeeData();\n if (isBase) {\n const baseMaxFeePerGas = ethers.utils.parseUnits(\n BASE_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n return feeData.maxFeePerGas &&\n feeData.maxFeePerGas.lte(ethers.utils.parseUnits(BASE_MAX_FEE_CAP, \"gwei\"))\n ? feeData.maxFeePerGas\n : baseMaxFeePerGas;\n } else {\n return (\n feeData.maxFeePerGas ||\n feeData.gasPrice ||\n ethers.utils.parseUnits(DEFAULT_MAX_FEE_PER_GAS, \"gwei\")\n );\n }\n }\n } catch (error) {\n }\n\n return ethers.utils.parseUnits(\n isBase ? BASE_MAX_FEE_PER_GAS : DEFAULT_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n}\n\n// Returns [gasLimit, hasReliableEstimate, rpcEstimateError]\n// rpcEstimateError: null if no error, or error object if RPC estimation failed\nexport async function estimateGasLimit(\n gas: string | undefined,\n to: string,\n transactionData: string,\n value: string,\n sender: string,\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<[ethers.BigNumber, boolean, { code?: string; reason?: string; message?: string } | null]> {\n const bufferPercent = getGasBuffer(chainId);\n let estimatedGasLimit: ethers.BigNumber | undefined;\n let hasReliableEstimate = false;\n let rpcEstimateError: { code?: string; reason?: string; message?: string } | null = null;\n\n if (gas) {\n try {\n const gasBN = ethers.BigNumber.from(gas);\n if (gasBN.gt(0)) {\n estimatedGasLimit = gasBN.mul(bufferPercent).div(100);\n hasReliableEstimate = true;\n }\n } catch (error) {\n }\n }\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n try {\n const rpcEstimatedGas = await signer.provider.estimateGas({\n to,\n data: transactionData,\n value: value || \"0\",\n from: sender,\n });\n\n if (rpcEstimatedGas && rpcEstimatedGas.gt(0)) {\n const rpcGasWithBuffer = rpcEstimatedGas.mul(bufferPercent).div(100);\n\n if (!estimatedGasLimit || rpcGasWithBuffer.gt(estimatedGasLimit)) {\n estimatedGasLimit = rpcGasWithBuffer;\n }\n hasReliableEstimate = true;\n }\n } catch (estimateError: any) {\n // Capture RPC estimation error details\n rpcEstimateError = {\n code: estimateError?.code,\n reason: estimateError?.reason,\n message: estimateError?.message || String(estimateError),\n };\n console.warn(\"RPC gas estimate failed:\", {\n error: estimateError?.message || String(estimateError),\n code: estimateError?.code,\n reason: estimateError?.reason,\n });\n }\n }\n } catch (error: any) {\n console.warn(\"Gas estimation error:\", {\n error: error?.message || String(error),\n });\n }\n\n if (estimatedGasLimit && estimatedGasLimit.gt(0) && hasReliableEstimate) {\n return [estimatedGasLimit, true, rpcEstimateError];\n }\n\n if (estimatedGasLimit && estimatedGasLimit.gt(0)) {\n return [estimatedGasLimit, false, rpcEstimateError];\n }\n\n return [ethers.BigNumber.from(CONSERVATIVE_GAS_LIMIT), false, rpcEstimateError];\n}\n\nexport async function getEip1559FeeData(\n chainId: number,\n evmChainAdapter: EvmChainAdapter\n): Promise<{\n maxFeePerGas?: ethers.BigNumber;\n maxPriorityFeePerGas?: ethers.BigNumber;\n gasPrice?: ethers.BigNumber;\n}> {\n const feeData: {\n maxFeePerGas?: ethers.BigNumber;\n maxPriorityFeePerGas?: ethers.BigNumber;\n gasPrice?: ethers.BigNumber;\n } = {};\n\n try {\n const signer = await evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const providerFeeData = await signer.provider.getFeeData();\n\n if (chainId === BASE_CHAIN_ID) {\n const baseMaxFeePerGas = ethers.utils.parseUnits(BASE_MAX_FEE_PER_GAS, \"gwei\");\n const baseMaxPriorityFeePerGas = ethers.utils.parseUnits(\n BASE_MAX_PRIORITY_FEE_PER_GAS,\n \"gwei\"\n );\n\n feeData.maxFeePerGas =\n providerFeeData.maxFeePerGas &&\n providerFeeData.maxFeePerGas.gt(0) &&\n providerFeeData.maxFeePerGas.lte(ethers.utils.parseUnits(BASE_MAX_FEE_CAP, \"gwei\"))\n ? providerFeeData.maxFeePerGas\n : baseMaxFeePerGas;\n\n feeData.maxPriorityFeePerGas =\n providerFeeData.maxPriorityFeePerGas &&\n providerFeeData.maxPriorityFeePerGas.gt(0) &&\n providerFeeData.maxPriorityFeePerGas.lte(\n ethers.utils.parseUnits(BASE_PRIORITY_FEE_CAP, \"gwei\")\n )\n ? providerFeeData.maxPriorityFeePerGas\n : baseMaxPriorityFeePerGas;\n } else {\n if (\n providerFeeData.maxFeePerGas &&\n providerFeeData.maxPriorityFeePerGas &&\n providerFeeData.maxFeePerGas.gt(0) &&\n providerFeeData.maxPriorityFeePerGas.gt(0)\n ) {\n const maxAllowedFeePerGas = ethers.utils.parseUnits(\n getMaxFeePerGas(chainId),\n \"gwei\"\n );\n\n feeData.maxFeePerGas = providerFeeData.maxFeePerGas.gt(maxAllowedFeePerGas)\n ? maxAllowedFeePerGas\n : providerFeeData.maxFeePerGas;\n\n if (feeData.maxFeePerGas) {\n const maxPriorityFeeCap = feeData.maxFeePerGas\n .div(10)\n .gt(ethers.utils.parseUnits(MAX_PRIORITY_FEE_CAP, \"gwei\"))\n ? ethers.utils.parseUnits(MAX_PRIORITY_FEE_CAP, \"gwei\")\n : feeData.maxFeePerGas.div(10);\n\n feeData.maxPriorityFeePerGas =\n providerFeeData.maxPriorityFeePerGas.gt(maxPriorityFeeCap)\n ? maxPriorityFeeCap\n : providerFeeData.maxPriorityFeePerGas;\n }\n }\n }\n }\n } catch (error) {\n }\n\n if (!feeData.maxFeePerGas || feeData.maxFeePerGas.lte(0)) {\n feeData.maxFeePerGas = ethers.utils.parseUnits(\n chainId === BASE_CHAIN_ID ? BASE_MAX_FEE_PER_GAS : DEFAULT_MAX_FEE_PER_GAS,\n \"gwei\"\n );\n }\n\n if (!feeData.maxPriorityFeePerGas || feeData.maxPriorityFeePerGas.lte(0)) {\n feeData.maxPriorityFeePerGas = feeData.maxFeePerGas.div(10);\n }\n\n return feeData;\n}\n","\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport { convertSlippageToBasisPoints } from \"../../utils\";\nimport {\n BitgetAdapter,\n EvmChainAdapter,\n} from \"../../adapters/types\";\nimport { logger } from \"../../utils/logger\";\nimport {\n isBitgetResponseSuccess,\n createQuoteError,\n createExecuteError,\n getGasPriceEstimate,\n estimateGasLimit,\n getEip1559FeeData,\n isEip1559Chain,\n MAX_APPROVAL_RETRIES,\n APPROVAL_RETRY_DELAY_MS,\n} from \"../../utils/bitgetUtils\";\nimport { ErrorMessages, normalizeError } from \"../../utils/errorMessages\";\n\nexport interface BitgetRouterConfig {\n bitgetAdapter: BitgetAdapter;\n evmChainAdapter: EvmChainAdapter;\n chainId: number; // EVM chain ID (e.g., 1 for Ethereum, 56 for BSC)\n}\n\n/**\n * Bitget Router implementation for EVM chains\n */\nexport class BitgetRouter implements DexRouter {\n private bitgetAdapter: BitgetAdapter;\n private evmChainAdapter: EvmChainAdapter;\n private chainId: number;\n\n constructor(config: BitgetRouterConfig) {\n this.bitgetAdapter = config.bitgetAdapter;\n this.evmChainAdapter = config.evmChainAdapter;\n this.chainId = config.chainId;\n }\n\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"evm\",\n };\n }\n\n getSupportedChain(): \"evm\" {\n return \"evm\";\n }\n\n getChainId(): number {\n return this.chainId;\n }\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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n if (tokenIn?.address === undefined || tokenOut?.address === undefined) {\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: ErrorMessages.QUOTE_FAILED,\n };\n }\n\n const normalizedTokenIn = tokenIn.address === \"\" \n ? \"\" \n : this.normalizeEvmAddress(tokenIn.address);\n const normalizedTokenOut = tokenOut.address === \"\"\n ? \"\"\n : this.normalizeEvmAddress(tokenOut.address);\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.bitgetAdapter.quote({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n userAddress: sender,\n tokenInSymbol: tokenIn.symbol,\n tokenInDecimals: tokenIn.decimals,\n tokenOutSymbol: tokenOut.symbol,\n tokenOutDecimals: tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(response) || !response.data) {\n return createQuoteError(\n params,\n normalizeError(response.msg) || ErrorMessages.QUOTE_FAILED\n );\n }\n\n const {\n inAmount,\n outAmount,\n toAmount,\n minOutAmount,\n toMinAmount,\n data,\n to,\n value,\n gas,\n market,\n } = response.data;\n\n const readableOutAmount = outAmount || toAmount || \"0\";\n const readableMinOutAmount = minOutAmount || toMinAmount || \"0\";\n \n let formattedOutAmount = readableOutAmount;\n let formattedMinOutAmount = readableMinOutAmount;\n \n if (readableOutAmount !== \"0\" && tokenOut.decimals !== undefined) {\n try {\n const readableAmount = new Big(readableOutAmount);\n const multiplier = new Big(10).pow(tokenOut.decimals);\n formattedOutAmount = readableAmount.mul(multiplier).toFixed(0);\n \n if (readableMinOutAmount !== \"0\") {\n const readableMinAmount = new Big(readableMinOutAmount);\n formattedMinOutAmount = readableMinAmount.mul(multiplier).toFixed(0);\n }\n } catch (error: any) {\n formattedOutAmount = readableOutAmount;\n formattedMinOutAmount = readableMinOutAmount;\n }\n }\n\n let formattedInAmount = inAmount || amountIn;\n if (inAmount && tokenIn.decimals !== undefined && inAmount.includes(\".\")) {\n try {\n const readableAmount = new Big(inAmount);\n const multiplier = new Big(10).pow(tokenIn.decimals);\n formattedInAmount = readableAmount.mul(multiplier).toFixed(0);\n } catch (error: any) {\n formattedInAmount = inAmount;\n }\n }\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: formattedInAmount,\n amountOut: formattedOutAmount,\n minAmountOut: formattedMinOutAmount,\n routes: [],\n transactionData: data,\n gasEstimate: gas,\n routerMsg: JSON.stringify({\n to,\n data,\n value: value || \"0\",\n gas,\n market: market || \"\",\n }),\n recipient,\n slippage,\n };\n } catch (error: any) {\n return createQuoteError(\n params,\n normalizeError(error?.message) || ErrorMessages.QUOTE_FAILED\n );\n }\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n let market: string;\n try {\n if (quote.routerMsg) {\n const routerMsg = JSON.parse(quote.routerMsg);\n market = routerMsg.market || \"\";\n } else {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n } catch (error) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n if (!market) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n const normalizedTokenIn = this.normalizeEvmAddress(\n quote.tokenIn.address\n );\n const normalizedTokenOut = this.normalizeEvmAddress(\n quote.tokenOut.address\n );\n\n const slippageBps = convertSlippageToBasisPoints(quote.slippage || 0.5);\n const executionSlippage = slippageBps / 10000;\n \n const reQuoteResponse = await this.bitgetAdapter.quote({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n slippage: executionSlippage,\n userAddress: receiveUser,\n tokenInSymbol: quote.tokenIn.symbol,\n tokenInDecimals: quote.tokenIn.decimals,\n tokenOutSymbol: quote.tokenOut.symbol,\n tokenOutDecimals: quote.tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(reQuoteResponse) || !reQuoteResponse.data) {\n return createExecuteError(\n normalizeError(reQuoteResponse.msg) || ErrorMessages.QUOTE_FAILED\n );\n }\n\n market = reQuoteResponse.data?.market || market;\n\n const swapResponse = await this.bitgetAdapter.swap({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n slippage: executionSlippage,\n fromAddress: sender,\n toAddress: receiveUser,\n market: market,\n tokenInSymbol: quote.tokenIn.symbol,\n tokenInDecimals: quote.tokenIn.decimals,\n tokenOutSymbol: quote.tokenOut.symbol,\n tokenOutDecimals: quote.tokenOut.decimals,\n });\n\n if (!isBitgetResponseSuccess(swapResponse) || !swapResponse.data) {\n return createExecuteError(\n normalizeError(swapResponse.msg) || ErrorMessages.QUOTE_FAILED\n );\n }\n\n if (swapResponse.data?.estimateRevert === true) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n let transactionData = swapResponse.data?.calldata || swapResponse.data?.data;\n const to = swapResponse.data?.contract || swapResponse.data?.to;\n let value = swapResponse.data?.value || \"0\";\n \n if (transactionData && !transactionData.startsWith(\"0x\")) {\n transactionData = \"0x\" + transactionData;\n }\n \n const isNativeTokenIn = !normalizedTokenIn || normalizedTokenIn === \"\";\n if (isNativeTokenIn) {\n value = quote.amountIn;\n }\n \n const gas = swapResponse.data?.gas || \n (swapResponse.data?.computeUnits !== undefined \n ? String(swapResponse.data.computeUnits) \n : undefined);\n\n if (!to || !transactionData) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n \n if (transactionData.length < 10 || !/^0x[0-9a-fA-F]+$/.test(transactionData)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n // Check balance and approval for ERC20 tokens\n if (normalizedTokenIn && normalizedTokenIn !== \"\") {\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n const tokenBalanceFormatted = await this.evmChainAdapter.getBalance({\n address: sender,\n tokenAddress: normalizedTokenIn,\n });\n \n const tokenDecimals = quote.tokenIn.decimals || 18;\n const balanceBN = ethers.utils.parseUnits(tokenBalanceFormatted || \"0\", tokenDecimals);\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n if (balanceBN.lt(amountInBN)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n const currentAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n\n const allowanceBN = ethers.BigNumber.from(currentAllowance);\n\n if (allowanceBN.lt(amountInBN)) {\n try {\n await this.evmChainAdapter.approve({\n tokenAddress: normalizedTokenIn,\n spender: to,\n amount: ethers.constants.MaxUint256.toString(),\n });\n \n let retryCount = 0;\n let newAllowanceBN = ethers.BigNumber.from(\"0\");\n\n while (retryCount < MAX_APPROVAL_RETRIES) {\n await new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_RETRY_DELAY_MS * (retryCount + 1))\n );\n \n const newAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n \n newAllowanceBN = ethers.BigNumber.from(newAllowance);\n \n if (newAllowanceBN.gte(amountInBN)) {\n break;\n }\n \n retryCount++;\n }\n \n if (newAllowanceBN.lt(amountInBN)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n } catch (error: any) {\n return createExecuteError(\n normalizeError(error?.message) || ErrorMessages.QUOTE_FAILED\n );\n }\n }\n } else {\n // Check native token balance (including gas)\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n const nativeBalanceFormatted = await this.evmChainAdapter.getBalance({\n address: sender,\n tokenAddress: undefined,\n });\n const balanceBN = ethers.utils.parseEther(nativeBalanceFormatted || \"0\");\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n const gasPriceEstimate = await getGasPriceEstimate(\n this.chainId,\n this.evmChainAdapter\n );\n \n const [estimatedGasLimitForBalance] = await estimateGasLimit(\n gas,\n to,\n transactionData,\n value,\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n \n const gasCostEstimate = estimatedGasLimitForBalance.mul(gasPriceEstimate);\n const totalRequired = amountInBN.add(gasCostEstimate);\n \n if (balanceBN.lt(totalRequired)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n }\n\n if (normalizedTokenIn && normalizedTokenIn !== \"\") {\n const finalAllowanceCheck = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: to,\n });\n const finalAllowanceBN = ethers.BigNumber.from(finalAllowanceCheck);\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n if (finalAllowanceBN.lt(amountInBN)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n }\n\n const [estimatedGasLimit, hasReliableEstimate, rpcEstimateError] = await estimateGasLimit(\n gas,\n to,\n transactionData,\n value,\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n\n if (rpcEstimateError) {\n const isUnpredictableGasLimit = \n rpcEstimateError.code === \"UNPREDICTABLE_GAS_LIMIT\" ||\n (rpcEstimateError.message && rpcEstimateError.message.includes(\"UNPREDICTABLE_GAS_LIMIT\")) ||\n (rpcEstimateError.reason && rpcEstimateError.reason.includes(\"execution reverted\"));\n \n if (isUnpredictableGasLimit) {\n logger.warn(\"Blocking transaction due to RPC gas estimation failure\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n rpcError: rpcEstimateError,\n });\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n if (!gas || gas === \"0\") {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n logger.warn(\"RPC gas estimation failed, using Bitget estimate\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n estimatedGasLimit: estimatedGasLimit.toString(),\n bitgetGas: gas || \"not provided\",\n rpcError: rpcEstimateError,\n });\n } else if (!hasReliableEstimate) {\n // No RPC error but also no reliable estimate\n logger.warn(\"Gas estimation unreliable, using conservative default\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n estimatedGasLimit: estimatedGasLimit.toString(),\n bitgetGas: gas || \"not provided\",\n });\n }\n\n const supportsEip1559 = isEip1559Chain(this.chainId);\n \n let gasPriceEstimate: ethers.BigNumber | undefined;\n const getCachedGasPrice = async () => {\n if (!gasPriceEstimate) {\n gasPriceEstimate = await getGasPriceEstimate(this.chainId, this.evmChainAdapter);\n }\n return gasPriceEstimate;\n };\n \n let feeData: { maxFeePerGas?: ethers.BigNumber; maxPriorityFeePerGas?: ethers.BigNumber; gasPrice?: ethers.BigNumber } = {};\n \n if (supportsEip1559) {\n feeData = await getEip1559FeeData(this.chainId, this.evmChainAdapter);\n \n // Validate and ensure we have valid fee data\n if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas || \n feeData.maxFeePerGas.lte(0) || feeData.maxPriorityFeePerGas.lte(0)) {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n feeData.maxFeePerGas = cachedGasPrice;\n feeData.maxPriorityFeePerGas = cachedGasPrice.div(10);\n const minPriorityFee = ethers.utils.parseUnits(\"1\", \"gwei\");\n if (feeData.maxPriorityFeePerGas.lt(minPriorityFee)) {\n feeData.maxPriorityFeePerGas = minPriorityFee;\n }\n }\n } else {\n try {\n const signer = await this.evmChainAdapter.getSigner?.();\n if (signer?.provider) {\n const providerFeeData = await signer.provider.getFeeData();\n if (providerFeeData.gasPrice && providerFeeData.gasPrice.gt(0)) {\n feeData.gasPrice = providerFeeData.gasPrice;\n } else {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n } else {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(\"Failed to get valid gas price. Please try again.\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n } catch (error) {\n const cachedGasPrice = await getCachedGasPrice();\n if (!cachedGasPrice || cachedGasPrice.lte(0)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n feeData.gasPrice = cachedGasPrice;\n }\n }\n\n // Final validation before building transaction\n if (!to || !ethers.utils.isAddress(to)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n if (!transactionData || transactionData.length < 10) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n // Validate gas limit\n if (!estimatedGasLimit || estimatedGasLimit.lte(0)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n\n // Validate fee data based on chain type\n if (supportsEip1559) {\n if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas ||\n feeData.maxFeePerGas.lte(0) || feeData.maxPriorityFeePerGas.lte(0)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n } else {\n if (!feeData.gasPrice || feeData.gasPrice.lte(0)) {\n return createExecuteError(ErrorMessages.QUOTE_FAILED);\n }\n }\n\n const txParams: Parameters<EvmChainAdapter[\"sendTransaction\"]>[0] = {\n to,\n data: transactionData,\n value: value || \"0\",\n gasLimit: estimatedGasLimit.toString(),\n };\n\n if (supportsEip1559 && feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {\n txParams.type = 2;\n txParams.maxFeePerGas = feeData.maxFeePerGas.toString();\n txParams.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas.toString();\n } else if (feeData.gasPrice) {\n txParams.gasPrice = feeData.gasPrice.toString();\n }\n\n const result = await this.evmChainAdapter.sendTransaction(txParams);\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHash ? [result.txHash] : [],\n };\n } else {\n return createExecuteError(normalizeError(result.message) || ErrorMessages.EXECUTE_FAILED);\n }\n } catch (error: any) {\n return createExecuteError(normalizeError(error?.message) || ErrorMessages.EXECUTE_FAILED);\n }\n }\n\n private normalizeEvmAddress(address: string): string {\n if (!address) return address;\n try {\n return ethers.utils.getAddress(address);\n } catch (e) {\n const addr = address.startsWith(\"0x\") ? address.slice(2) : address;\n return \"0x\" + addr.toLowerCase();\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 isEvmIntentsSupportedToken,\n findBestBluechipToken,\n findBestEvmBluechipToken,\n normalizeTokenId,\n normalizeEvmAddress,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\nimport { ErrorMessages } from \"../utils/errorMessages\";\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 customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n /** Optional: EVM chain ID for precise chain identification (e.g., 1 for Ethereum, 56 for BSC) */\n evmChainId?: number;\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 routeType?: \"v1\" | \"v2\" | \"evm\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"evm\" | \"intents\"; // Route type used\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouters?: DexRouter[];\n dexRouter?: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n /** Optional: Get native wrapped token address for EVM chains (e.g., WETH) */\n getEvmNativeWrappedTokenAddress?(): string;\n };\n currentUserAddress?: string;\n /** Optional function to check if token supports Intents (beyond bluechip tokens) */\n isIntentsSupportedToken?: (token: TokenInfo) => boolean;\n}\n\n/**\n * Build a complete quote with optional pre-swap\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 customRecipientMsg,\n appFees,\n evmChainId,\n } = params;\n\n const {\n intentsQuotationAdapter,\n dexRouters,\n dexRouter,\n bluechipTokens,\n configAdapter,\n currentUserAddress,\n isIntentsSupportedToken: customIsIntentsSupportedToken,\n } = config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n const routers = dexRouters || (dexRouter ? [dexRouter] : []);\n // Allow routers to be empty (non-Bitget supported chains direct Intents)\n // Ensure isTokenIntentsSupported is true\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n // Check if token address is undefined (not provided)\n // Note: Empty string \"\" is valid for native tokens (ETH), so we only check for undefined\n if (sourceToken?.address === undefined) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n if (targetToken?.address === undefined) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n const isEvmChain = evmChainId !== undefined ||\n sourceChain === \"evm\" || \n sourceChain === \"ethereum\" || \n sourceChain === \"bsc\" || \n sourceChain === \"polygon\" ||\n sourceChain === \"base\" ||\n sourceChain === \"monad\" ||\n sourceToken.chain === \"evm\";\n\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isEvmChain\n ? isEvmIntentsSupportedToken(sourceToken, bluechipTokens)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = isEvmChain\n ? findBestEvmBluechipToken(\n bluechipTokens,\n configAdapter.getEvmNativeWrappedTokenAddress?.()\n )\n : findBestBluechipToken(bluechipTokens, wrapNearContractId);\n\n if (!bluechipToken?.address) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"evm\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n routers.forEach((router, index) => {\n const supportedChain = router.getSupportedChain();\n const isEvmRouter = supportedChain === \"evm\";\n \n let routeType: \"v1\" | \"v2\" | \"evm\";\n if (isEvmRouter) {\n routeType = \"evm\";\n } else {\n routeType = index === 0 ? \"v1\" : \"v2\";\n }\n \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 quotePaths.push({\n type: routeType,\n router,\n promise: (async () => {\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n let normalizedSourceAsset: string;\n if (isEvmChain) {\n const bluechipKey = bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `evm:${normalizeEvmAddress(bluechipToken.address)}`;\n } else {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1 format\n } else 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 if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n \n let formattedAmountOut = preSwapQuote.amountOut;\n if (isEvmChain && bluechipToken.decimals !== undefined) {\n try {\n const amountBN = new Big(preSwapQuote.amountOut);\n if (amountBN.lte(0)) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n formattedAmountOut = amountBN.toFixed(0, Big.roundDown);\n } catch (error: any) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n }\n \n try {\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: formattedAmountOut,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"FLEX_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n ...(appFees ? { appFees } : {}),\n });\n \n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n \n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n } catch (error: any) {\n throw error;\n }\n })(),\n });\n });\n\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n let normalizedSourceAsset: string;\n if (isEvmChain) {\n const sourceKey = sourceToken.symbol?.toUpperCase();\n const sourceTokenConfig = sourceKey ? bluechipTokens[sourceKey] : undefined;\n // Handle native token (empty address)\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else if (sourceToken.address === \"\") {\n // Native token (ETH) - use symbol-based assetId or fallback\n normalizedSourceAsset = `evm-${sourceChain}-native`;\n } else {\n normalizedSourceAsset = `evm:${normalizeEvmAddress(sourceToken.address)}`;\n }\n } else {\n const sourceKey = sourceToken.symbol?.toUpperCase();\n const sourceTokenConfig = sourceKey ? bluechipTokens[sourceKey] : undefined;\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(sourceToken.address, wrapNearContractId);\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1 format\n } else 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 if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"evm\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n const bestPath = validPaths.reduce((best, current) => {\n const bestAmount = new Big(best.finalAmountOut);\n const currentAmount = new Big(current.finalAmountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n\n const depositAddress =\n bestPath.intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(ErrorMessages.QUOTE_FAILED);\n }\n\n return {\n intents: {\n quote: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\" | \"evm\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\nimport { ErrorMessages } from \"../utils/errorMessages\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\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 const errorMessage = errors.length > 0 \n ? `${ErrorMessages.QUOTE_FAILED}: ${errors.join(\"; \")}`\n : ErrorMessages.QUOTE_FAILED;\n throw new Error(errorMessage);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|