@rhea-finance/cross-chain-aggregation-dex 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +189 -1
- package/dist/index.d.ts +189 -1
- package/dist/index.js +1100 -182
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1098 -183
- 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/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"]}
|
|
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/chains/evm/OkxRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big","ethers","gasPriceEstimate","slippageBps","feeData"],"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 /** Optional: Intents assetId (e.g., nep245:..., nep141:...) provided by backend */\n assetId?: string;\n /** Optional: Platform identifier (\"nearIntents\" | \"okx\" | \"bitget\") */\n platform?: 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 const errorString = errorMessage.toLowerCase();\n\n const userActionKeywords = [\n \"user\",\n \"rejected\",\n \"cancelled\",\n \"cancel\",\n \"denied\",\n \"undefined\",\n \"null\",\n ];\n\n const containsUserActionKeyword = userActionKeywords.some((keyword) =>\n errorString.includes(keyword)\n );\n\n if (containsUserActionKeyword) {\n return errorMessage;\n }\n\n return TRANSACTION_EXECUTION_ERROR_MESSAGE;\n}\n\n/**\n * Normalize error for Intents API only\n */\nexport function normalizeErrorForIntents(error: string | undefined | null): string {\n if (!error) return ErrorMessages.QUOTE_FAILED;\n \n const errorLower = error.toLowerCase();\n \n if (\n errorLower.includes(\"quote\") ||\n errorLower.includes(\"route\") ||\n errorLower.includes(\"missing\") ||\n errorLower.includes(\"required\") ||\n errorLower.includes(\"invalid\") ||\n errorLower.includes(\"balance\") ||\n errorLower.includes(\"liquidity\") ||\n errorLower.includes(\"gas\") ||\n errorLower.includes(\"network\")\n ) {\n return ErrorMessages.QUOTE_FAILED;\n }\n \n return processErrorMessage(error);\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 return error;\n}\n\n/**\n * Format error message for intents API errors\n * Simplified version that preserves detailed error messages while applying common formatting rules\n */\nexport function formatErrorMessage({\n error,\n fallbackMessage,\n originAsset,\n friendly,\n}: {\n error?: any;\n fallbackMessage?: string;\n originAsset?: string;\n friendly?: boolean;\n}): string {\n let messageStr: string = \"\";\n if (error) {\n if (typeof error === \"string\") {\n messageStr = error;\n } else if (typeof error === \"object\") {\n messageStr = error?.message || error?.error || JSON.stringify(error);\n } else {\n messageStr = String(error);\n }\n }\n if (!messageStr || messageStr === \"null\" || messageStr === \"undefined\") {\n messageStr =\n fallbackMessage ||\n \"Transaction execution error occurred. Please contact support\";\n }\n\n if (messageStr?.includes(\"low\") && originAsset) {\n return \"Amount is too low for bridge.\";\n } else if (messageStr?.includes(\"(\")) {\n const index = messageStr.indexOf(\"(\");\n return friendly\n ? processErrorMessage(messageStr.slice(0, index))\n : messageStr.slice(0, index);\n } else if (\n messageStr?.includes(\"timed out\") ||\n messageStr?.includes(\"not allowed\")\n ) {\n return \"transaction has been cancelled\";\n } else if (\n (messageStr?.toLowerCase().includes(\"tokenin\") ||\n messageStr?.toLowerCase().includes(\"tokenout\")) &&\n messageStr?.toLowerCase().includes(\"not valid\")\n ) {\n return \"Failed to get quote\";\n } else if (\n messageStr?.toLowerCase().includes(\"liquidity\") &&\n messageStr?.toLowerCase().includes(\"available\")\n ) {\n return \"Failed to get quote\";\n }\n return friendly ? processErrorMessage(messageStr) : messageStr;\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, normalizeErrorForIntents, getErrorMessage, processErrorMessage, formatErrorMessage, 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: 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: 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\",\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 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: 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: 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 // ✅ 预交易阶段:保留原始错误信息,不简化\n error: 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 // Silently fail\n }\n }\n } catch (error: any) {\n // Silently fail\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: \"Bitget quote failed: Router requires recipient address\",\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: \"Bitget quote failed: Sender and recipient addresses are required\",\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: \"Bitget quote failed: Token addresses are required\",\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 || \"Bitget API error: 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 || \"Bitget quote failed: Unknown error\"\n );\n }\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return createExecuteError(\"Bitget swap failed: Router requires recipient address\");\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return createExecuteError(\n quote.error || \"Bitget swap failed: Invalid quote\"\n );\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return createExecuteError(\"Bitget swap failed: Recipient address is required\");\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(\"Bitget swap failed: Missing router message data\");\n }\n } catch (error) {\n return createExecuteError(\"Bitget swap failed: Invalid router message format\");\n }\n\n if (!market) {\n return createExecuteError(\"Bitget swap failed: Market information is required\");\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 const errorMsg = reQuoteResponse.msg || \"Bitget re-quote failed: No data returned\";\n return createExecuteError(errorMsg);\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 || \"Bitget swap failed: No transaction data\"\n );\n }\n\n if (swapResponse.data?.estimateRevert === true) {\n return createExecuteError(\n swapResponse.msg || \"Bitget swap failed: Transaction would revert (slippage or price impact too high)\"\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(\n swapResponse.msg || \"Bitget swap failed: Missing transaction data or recipient address\"\n );\n }\n \n if (transactionData.length < 10 || !/^0x[0-9a-fA-F]+$/.test(transactionData)) { \n return createExecuteError(\n swapResponse.msg || \"Bitget swap failed: Invalid transaction data format\"\n );\n }\n\n // Check balance and approval for ERC20 tokens\n if (normalizedTokenIn && normalizedTokenIn !== \"\") {\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"Bitget swap failed: Balance check not supported\");\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(\"Bitget swap failed: Insufficient token balance\");\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(\"Bitget swap failed: Token approval failed or insufficient\");\n }\n } catch (error: any) {\n return createExecuteError(\n error?.message || \"Bitget approval check failed\"\n );\n }\n }\n } else {\n // Check native token balance (including gas)\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"Bitget swap failed: Balance check not supported\");\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(\"Bitget swap failed: Insufficient balance (including gas fee)\");\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(\"Bitget swap failed: Insufficient token allowance\");\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 const errorMsg = rpcEstimateError?.message || rpcEstimateError?.reason || \"\";\n return createExecuteError(\n errorMsg || \"Bitget swap failed: Transaction would revert (slippage or price impact too high)\"\n );\n }\n\n if (!gas || gas === \"0\") {\n return createExecuteError(\"Bitget swap failed: Invalid gas estimate from Bitget\");\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(\"Bitget swap failed: Unable to get valid gas price\");\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(\"Bitget swap failed: Unable to get valid gas price\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n }\n\n // Final validation before building transaction\n if (!to || !ethers.utils.isAddress(to)) {\n return createExecuteError(\"Bitget swap failed: Invalid recipient address\");\n }\n\n if (!transactionData || transactionData.length < 10) {\n return createExecuteError(\"Bitget swap failed: Invalid transaction data\");\n }\n\n // Validate gas limit\n if (!estimatedGasLimit || estimatedGasLimit.lte(0)) {\n return createExecuteError(\"Bitget swap failed: Invalid gas limit\");\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(\"Bitget swap failed: Invalid gas fee data (EIP-1559)\");\n }\n } else {\n if (!feeData.gasPrice || feeData.gasPrice.lte(0)) {\n return createExecuteError(\"Bitget swap failed: Invalid gas price\");\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","import { 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 OkxAdapter,\n EvmChainAdapter,\n} from \"../../adapters/types\";\nimport { logger } from \"../../utils/logger\";\nimport {\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 OkxRouterConfig {\n okxAdapter: OkxAdapter;\n evmChainAdapter: EvmChainAdapter;\n chainId: number; // EVM chain ID (e.g., 1 for Ethereum, 56 for BSC)\n}\n\n/**\n * OKX Router implementation for EVM chains\n */\nexport class OkxRouter implements DexRouter {\n private okxAdapter: OkxAdapter;\n private evmChainAdapter: EvmChainAdapter;\n private chainId: number;\n\n constructor(config: OkxRouterConfig) {\n this.okxAdapter = config.okxAdapter;\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 createQuoteError(params, \"OKX quote failed: Router requires recipient address\");\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n return createQuoteError(params, \"OKX quote failed: Sender and recipient addresses are required\");\n }\n\n if (tokenIn?.address === undefined || tokenOut?.address === undefined) {\n return createQuoteError(params, \"OKX quote failed: Token addresses are required\");\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 slippageDecimal = slippageBps / 10000;\n\n const response = await this.okxAdapter.quote({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimal,\n userAddress: sender,\n tokenInSymbol: tokenIn.symbol,\n tokenInDecimals: tokenIn.decimals,\n tokenOutSymbol: tokenOut.symbol,\n tokenOutDecimals: tokenOut.decimals,\n });\n\n const is429Error =\n response.code === \"429\" ||\n response.code === 429 ||\n (response.msg && response.msg.toLowerCase().includes(\"rate limit\"));\n\n if (is429Error) {\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: \"Rate limit exceeded\",\n };\n }\n \n if (\n response.code !== \"0\" &&\n response.code !== 0 &&\n response.code !== undefined\n ) {\n const errorCode = response.code;\n const errorMsg = response.msg || \"Unknown error\";\n\n logger.error(\"OKX quote API error\", {\n code: errorCode,\n msg: errorMsg,\n tokenIn: params.tokenIn.symbol,\n tokenOut: params.tokenOut.symbol,\n amountIn: params.amountIn,\n fullResponse: response,\n });\n\n return createQuoteError(params, `OKX API error (${errorCode}): ${errorMsg}`);\n }\n\n if (!response.data || response.data.length === 0) {\n logger.error(\"OKX quote empty data\", {\n code: response.code,\n msg: response.msg,\n hasData: !!response.data,\n dataLength: response.data?.length || 0,\n tokenIn: params.tokenIn.symbol,\n tokenOut: params.tokenOut.symbol,\n fullResponse: response,\n });\n\n return createQuoteError(\n params,\n response.msg || \"OKX API returned empty data\"\n );\n }\n\n const quoteData = response.data[0];\n \n const fromTokenAmount = quoteData.fromTokenAmount || quoteData.fromAmount;\n const toTokenAmount = quoteData.toTokenAmount || quoteData.toAmount;\n const estimateGasFee = quoteData.estimateGasFee || quoteData.estimatedGas;\n \n let minToAmount: string;\n \n if (toTokenAmount) {\n const toAmountBN = ethers.BigNumber.from(toTokenAmount);\n const slippageAmount = toAmountBN.mul(Math.floor(slippageDecimal * 10000)).div(10000);\n minToAmount = toAmountBN.sub(slippageAmount).toString();\n } else {\n minToAmount = \"0\";\n }\n\n const formattedAmountOut = toTokenAmount\n ? ethers.BigNumber.from(toTokenAmount).toString()\n : \"0\";\n const formattedMinAmountOut = minToAmount || formattedAmountOut;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: fromTokenAmount || String(amountIn),\n amountOut: formattedAmountOut,\n minAmountOut: formattedMinAmountOut,\n routes: [],\n gasEstimate: estimateGasFee,\n routerMsg: JSON.stringify({\n chainId: this.chainId,\n adapter: \"okx\",\n }),\n recipient,\n slippage,\n };\n } catch (error: any) {\n const errorMessage = error?.message || String(error);\n const isRateLimit = errorMessage?.includes(\"429\") ||\n errorMessage?.toLowerCase().includes(\"rate limit\") ||\n errorMessage?.toLowerCase().includes(\"too many requests\");\n\n logger.error(\"OKX quote exception\", {\n error: errorMessage,\n isRateLimit,\n tokenIn: params.tokenIn.symbol,\n tokenOut: params.tokenOut.symbol,\n amountIn: params.amountIn,\n errorStack: error?.stack,\n fullError: error,\n });\n\n const detailedError = isRateLimit\n ? `OKX API rate limit error: ${errorMessage}. Please try again later.`\n : `OKX quote failed: ${errorMessage}`;\n\n return createQuoteError(params, detailedError);\n }\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return createExecuteError(\"OKX swap failed: Router requires recipient address\");\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return createExecuteError(\n quote.error || \"OKX swap failed: Invalid quote\"\n );\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return createExecuteError(\"OKX swap failed: Recipient address is required\");\n }\n\n const normalizedTokenIn = this.normalizeEvmAddress(quote.tokenIn.address);\n const normalizedTokenOut = this.normalizeEvmAddress(\n quote.tokenOut.address\n );\n\n const slippageBps = convertSlippageToBasisPoints(quote.slippage || 0.005);\n const executionSlippage = slippageBps / 10000;\n\n const reQuoteResponse = await this.okxAdapter.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 (\n reQuoteResponse.code !== \"0\" &&\n reQuoteResponse.code !== 0 &&\n reQuoteResponse.code !== undefined\n ) {\n const errorMsg = reQuoteResponse.msg || `OKX re-quote failed: Error code ${reQuoteResponse.code}`;\n return createExecuteError(errorMsg);\n }\n\n if (!reQuoteResponse.data || reQuoteResponse.data.length === 0) {\n const errorMsg = reQuoteResponse.msg || \"OKX re-quote failed: No data returned\";\n return createExecuteError(errorMsg);\n }\n\n const reQuoteData = reQuoteResponse.data[0];\n const toTokenAmount = reQuoteData.toTokenAmount || reQuoteData.toAmount;\n const okxEstimateGasFee = reQuoteData.estimateGasFee || reQuoteData.estimatedGas;\n \n const isCrossChain = receiveUser.toLowerCase() !== sender.toLowerCase();\n \n let minAmountOut: string;\n \n if (reQuoteData.minToAmount && reQuoteData.minToAmount !== \"0\") {\n minAmountOut = reQuoteData.minToAmount;\n \n if (isCrossChain) {\n logger.info(\"OKX swap: Using API minToAmount for cross-chain swap\", {\n minToAmount: minAmountOut,\n toTokenAmount,\n });\n }\n } else if (toTokenAmount) {\n const toAmountBN = ethers.BigNumber.from(toTokenAmount);\n \n const effectiveSlippage = isCrossChain \n ? executionSlippage + 0.02\n : executionSlippage;\n \n const slippageBps = ethers.BigNumber.from(Math.floor(effectiveSlippage * 10000));\n const slippageAmount = toAmountBN.mul(slippageBps).div(10000);\n minAmountOut = toAmountBN.sub(slippageAmount).toString();\n \n if (isCrossChain) {\n logger.info(\"OKX swap: Calculated minAmountOut for cross-chain swap\", {\n toTokenAmount,\n executionSlippage,\n effectiveSlippage,\n slippageBps: slippageBps.toString(),\n slippageAmount: slippageAmount.toString(),\n minAmountOut,\n });\n }\n } else {\n minAmountOut = \"0\";\n }\n\n logger.info(\"OKX swap: calling swap API\", {\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n minAmountOut,\n fromAddress: sender,\n toAddress: receiveUser,\n receiveUser,\n tokenInSymbol: quote.tokenIn.symbol,\n tokenInDecimals: quote.tokenIn.decimals,\n tokenOutSymbol: quote.tokenOut.symbol,\n tokenOutDecimals: quote.tokenOut.decimals,\n });\n\n const swapResponse = await this.okxAdapter.swap({\n chainId: this.chainId,\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: quote.amountIn,\n minAmountOut,\n slippage: executionSlippage,\n fromAddress: sender,\n toAddress: 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 (\n swapResponse.code !== \"0\" &&\n swapResponse.code !== 0 &&\n swapResponse.code !== undefined\n ) {\n return createExecuteError(\n swapResponse.msg || `OKX swap failed: Error code ${swapResponse.code}`\n );\n }\n\n if (!swapResponse.data) {\n return createExecuteError(\n swapResponse.msg || \"OKX swap failed: No transaction data\"\n );\n }\n\n let txData: any = null;\n if (Array.isArray(swapResponse.data) && swapResponse.data.length > 0) {\n const firstItem = swapResponse.data[0] as any;\n txData = firstItem?.tx || firstItem;\n } else if (swapResponse.data && !Array.isArray(swapResponse.data)) {\n const data = swapResponse.data as any;\n if (data.tx) {\n txData = data.tx;\n } else if (data.transaction) {\n txData = data.transaction;\n } else {\n txData = data;\n }\n }\n\n if (!txData) {\n logger.error(\"OKX swap response: no txData found\", {\n swapResponse: swapResponse,\n });\n return createExecuteError(\n swapResponse.msg || \"OKX swap failed: No transaction data in response\"\n );\n }\n\n const dataObj = Array.isArray(swapResponse.data) \n ? (swapResponse.data[0] as any) \n : (swapResponse.data as any);\n if (dataObj?.estimateRevert === true || txData?.estimateRevert === true) {\n logger.error(\"OKX swap: estimateRevert is true, transaction would fail\", {\n swapResponse: swapResponse,\n txData,\n });\n return createExecuteError(\n swapResponse.msg || \"OKX swap failed: Transaction would revert (slippage or price impact too high)\"\n );\n }\n\n let transactionData = txData.data || \"\";\n const to = txData.to || \"\";\n let value = txData.value || \"0\";\n\n if (transactionData && !transactionData.startsWith(\"0x\")) {\n transactionData = \"0x\" + transactionData;\n }\n\n const isNativeTokenIn =\n !normalizedTokenIn ||\n normalizedTokenIn === \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n if (isNativeTokenIn) {\n value = quote.amountIn;\n }\n\n const gas =\n txData.gas ||\n txData.gasPrice ||\n okxEstimateGasFee ||\n undefined;\n\n if (!to || !transactionData) {\n logger.error(\"OKX swap response: missing to or transactionData\", {\n to,\n hasTransactionData: !!transactionData,\n txData,\n });\n return createExecuteError(\n swapResponse.msg || \"OKX swap failed: Missing transaction data or recipient address\"\n );\n }\n\n if (\n transactionData.length < 10 ||\n !/^0x[0-9a-fA-F]+$/.test(transactionData)\n ) {\n logger.error(\"OKX swap: invalid transaction data format\", {\n transactionDataLength: transactionData.length,\n transactionDataPrefix: transactionData.substring(0, 20),\n });\n return createExecuteError(\n swapResponse.msg || \"OKX swap failed: Invalid transaction data format\"\n );\n }\n\n logger.info(\"OKX swap: starting balance and allowance checks\");\n\n let dexContractAddress: string | undefined;\n\n if (normalizedTokenIn && normalizedTokenIn !== \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\") {\n logger.info(\"OKX swap: checking ERC20 token balance and allowance\", {\n tokenIn: normalizedTokenIn,\n sender,\n to,\n });\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"OKX swap failed: Balance check not supported\");\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(\n tokenBalanceFormatted || \"0\",\n tokenDecimals\n );\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n\n logger.info(\"OKX swap: token balance check\", {\n balance: balanceBN.toString(),\n amountIn: amountInBN.toString(),\n hasEnoughBalance: balanceBN.gte(amountInBN),\n });\n\n if (balanceBN.lt(amountInBN)) {\n logger.error(\"OKX swap: insufficient token balance\", {\n balance: balanceBN.toString(),\n amountIn: amountInBN.toString(),\n });\n return createExecuteError(\"OKX swap failed: Insufficient token balance\");\n }\n\n logger.info(\"OKX swap: getting approve transaction to find dexContractAddress\", {\n tokenIn: normalizedTokenIn,\n amountIn: quote.amountIn,\n });\n\n const approveResponse = await this.okxAdapter.getApproveTransaction({\n chainId: this.chainId,\n tokenAddress: normalizedTokenIn,\n approveAmount: quote.amountIn,\n });\n\n if (approveResponse.code !== \"0\" && approveResponse.code !== 0) {\n logger.error(\"OKX swap: failed to get approve transaction\", {\n code: approveResponse.code,\n msg: approveResponse.msg,\n });\n return createExecuteError(\n approveResponse.msg || \"Failed to get OKX approve transaction\"\n );\n }\n\n dexContractAddress = approveResponse.data?.dexContractAddress;\n if (!dexContractAddress) {\n logger.error(\"OKX swap: no dexContractAddress in approve response\");\n return createExecuteError(\"Failed to get OKX DEX contract address\");\n }\n\n logger.info(\"OKX swap: checking token allowance\", {\n tokenIn: normalizedTokenIn,\n owner: sender,\n spender: dexContractAddress,\n });\n\n const currentAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: dexContractAddress,\n });\n\n const allowanceBN = ethers.BigNumber.from(currentAllowance);\n \n logger.info(\"OKX swap: token allowance check\", {\n allowance: allowanceBN.toString(),\n amountIn: amountInBN.toString(),\n hasEnoughAllowance: allowanceBN.gte(amountInBN),\n dexContractAddress,\n sender,\n tokenIn: normalizedTokenIn,\n });\n\n if (allowanceBN.lt(amountInBN)) {\n logger.warn(\"OKX swap: insufficient token allowance, need to approve\", {\n allowance: allowanceBN.toString(),\n amountIn: amountInBN.toString(),\n dexContractAddress,\n sender,\n tokenIn: normalizedTokenIn,\n });\n\n if (!approveResponse.data?.data) {\n logger.error(\"OKX swap: no approve transaction data\");\n return createExecuteError(\"Failed to get OKX approve transaction data\");\n }\n\n try {\n const [estimatedGasLimit, hasReliableEstimate] = await estimateGasLimit(\n approveResponse.data.gasLimit,\n normalizedTokenIn,\n approveResponse.data.data,\n \"0\",\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n\n const approveTxParams: Parameters<EvmChainAdapter[\"sendTransaction\"]>[0] = {\n to: normalizedTokenIn,\n data: approveResponse.data.data,\n value: \"0\",\n gasLimit: estimatedGasLimit.toString(),\n };\n\n if (isEip1559Chain(this.chainId)) {\n const feeData = await getEip1559FeeData(this.chainId, this.evmChainAdapter);\n if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {\n approveTxParams.type = 2;\n approveTxParams.maxFeePerGas = feeData.maxFeePerGas.toString();\n approveTxParams.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas.toString();\n } else {\n if (approveResponse.data.gasPrice) {\n approveTxParams.gasPrice = approveResponse.data.gasPrice;\n }\n }\n } else {\n if (approveResponse.data.gasPrice) {\n approveTxParams.gasPrice = approveResponse.data.gasPrice;\n } else {\n const estimatedGasPrice = await getGasPriceEstimate(\n this.chainId,\n this.evmChainAdapter\n );\n approveTxParams.gasPrice = estimatedGasPrice.toString();\n }\n }\n\n logger.info(\"OKX swap: sending approve transaction\", {\n to: normalizedTokenIn,\n tokenIn: normalizedTokenIn,\n dexContractAddress,\n hasData: !!approveResponse.data.data,\n gasLimit: estimatedGasLimit.toString(),\n okxGasLimit: approveResponse.data.gasLimit,\n hasReliableEstimate,\n });\n\n const approveResult = await this.evmChainAdapter.sendTransaction(approveTxParams);\n\n if (approveResult.status !== \"success\") {\n logger.error(\"OKX swap: approve transaction failed\", {\n status: approveResult.status,\n message: approveResult.message,\n });\n return createExecuteError(\n approveResult.message || \"Approve transaction failed\"\n );\n }\n\n logger.info(\"OKX swap: approve transaction successful\", {\n txHash: approveResult.txHash,\n });\n\n let retryCount = 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: dexContractAddress,\n });\n\n const newAllowanceBN = ethers.BigNumber.from(newAllowance);\n\n logger.info(\"OKX swap: checking approval status\", {\n retryCount,\n allowance: newAllowanceBN.toString(),\n amountIn: amountInBN.toString(),\n hasEnoughAllowance: newAllowanceBN.gte(amountInBN),\n });\n\n if (newAllowanceBN.gte(amountInBN)) {\n logger.info(\"OKX swap: approval confirmed\");\n break;\n }\n\n retryCount++;\n }\n\n const finalAllowance = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: dexContractAddress,\n });\n\n const finalAllowanceBN = ethers.BigNumber.from(finalAllowance);\n\n if (finalAllowanceBN.lt(amountInBN)) {\n logger.error(\"OKX swap: approval still insufficient after retries\", {\n allowance: finalAllowanceBN.toString(),\n amountIn: amountInBN.toString(),\n });\n return createExecuteError(\"Token approval failed or insufficient\");\n }\n } catch (error: any) {\n logger.error(\"OKX swap: approve transaction error\", {\n error: error?.message,\n });\n return createExecuteError(\n normalizeError(error?.message) || \"Approve transaction failed\"\n );\n }\n }\n } else {\n if (!this.evmChainAdapter.getBalance) {\n return createExecuteError(\"OKX swap failed: Balance check not supported\");\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(\"OKX swap failed: Insufficient balance (including gas fee)\");\n }\n }\n\n if (normalizedTokenIn && normalizedTokenIn !== \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" && dexContractAddress) {\n const finalAllowanceCheck = await this.evmChainAdapter.getAllowance({\n tokenAddress: normalizedTokenIn,\n owner: sender,\n spender: dexContractAddress,\n });\n const finalAllowanceBN = ethers.BigNumber.from(finalAllowanceCheck);\n const amountInBN = ethers.BigNumber.from(quote.amountIn);\n \n if (finalAllowanceBN.lt(amountInBN)) {\n logger.error(\"OKX swap: final allowance check failed\", {\n allowance: finalAllowanceBN.toString(),\n amountIn: amountInBN.toString(),\n dexContractAddress,\n });\n return createExecuteError(\"OKX swap failed: Insufficient token allowance\");\n }\n }\n\n const [rpcEstimatedGasLimit, hasReliableRpcEstimate, rpcEstimateError] =\n await estimateGasLimit(\n undefined,\n to,\n transactionData,\n value,\n sender,\n this.chainId,\n this.evmChainAdapter\n );\n\n let finalGasLimit: ethers.BigNumber;\n\n const MAX_REASONABLE_GAS_LIMIT = ethers.BigNumber.from(\"500000\");\n const okxGasBN = gas ? ethers.BigNumber.from(gas) : null;\n const okxEstimateGasFeeBN = okxEstimateGasFee \n ? ethers.BigNumber.from(okxEstimateGasFee) \n : null;\n\n if (rpcEstimateError) {\n const isUnpredictableGasLimit =\n rpcEstimateError.code === \"UNPREDICTABLE_GAS_LIMIT\" ||\n (rpcEstimateError.message &&\n rpcEstimateError.message.includes(\"UNPREDICTABLE_GAS_LIMIT\")) ||\n (rpcEstimateError.reason &&\n 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 const errorMsg = rpcEstimateError?.message || rpcEstimateError?.reason || \"\";\n return createExecuteError(\n errorMsg || \"OKX swap failed: Transaction would revert (slippage or price impact too high)\"\n );\n }\n\n if (okxEstimateGasFeeBN && okxEstimateGasFeeBN.gt(0)) {\n finalGasLimit = okxEstimateGasFeeBN.gt(MAX_REASONABLE_GAS_LIMIT)\n ? MAX_REASONABLE_GAS_LIMIT\n : okxEstimateGasFeeBN;\n logger.warn(\"RPC gas estimation failed, using OKX estimateGasFee (capped)\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n okxEstimateGasFee: okxEstimateGasFeeBN.toString(),\n finalGasLimit: finalGasLimit.toString(),\n rpcError: rpcEstimateError,\n });\n } else if (okxGasBN && okxGasBN.gt(0)) {\n finalGasLimit = okxGasBN.gt(MAX_REASONABLE_GAS_LIMIT)\n ? MAX_REASONABLE_GAS_LIMIT\n : okxGasBN;\n logger.warn(\"RPC gas estimation failed, using OKX gas from swap (capped)\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n okxGas: okxGasBN.toString(),\n finalGasLimit: finalGasLimit.toString(),\n rpcError: rpcEstimateError,\n });\n } else {\n return createExecuteError(\"OKX swap failed: Unable to determine gas limit\");\n }\n } else if (hasReliableRpcEstimate && rpcEstimatedGasLimit.gt(0)) {\n finalGasLimit = rpcEstimatedGasLimit;\n \n if (okxGasBN && okxGasBN.gt(rpcEstimatedGasLimit.mul(2))) {\n logger.warn(\"OKX gas estimate is much higher than RPC estimate, using RPC estimate\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n rpcEstimate: rpcEstimatedGasLimit.toString(),\n okxGas: okxGasBN.toString(),\n finalGasLimit: finalGasLimit.toString(),\n });\n } else {\n logger.info(\"Using RPC gas estimate for swap transaction\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n rpcEstimate: rpcEstimatedGasLimit.toString(),\n okxGas: okxGasBN?.toString() || \"not provided\",\n finalGasLimit: finalGasLimit.toString(),\n });\n }\n } else {\n if (okxEstimateGasFeeBN && okxEstimateGasFeeBN.gt(0)) {\n finalGasLimit = okxEstimateGasFeeBN.gt(MAX_REASONABLE_GAS_LIMIT)\n ? MAX_REASONABLE_GAS_LIMIT\n : okxEstimateGasFeeBN;\n } else if (okxGasBN && okxGasBN.gt(0)) {\n finalGasLimit = okxGasBN.gt(MAX_REASONABLE_GAS_LIMIT)\n ? MAX_REASONABLE_GAS_LIMIT\n : okxGasBN;\n } else if (rpcEstimatedGasLimit.gt(0)) {\n finalGasLimit = rpcEstimatedGasLimit;\n } else {\n return createExecuteError(\"OKX swap failed: Unable to determine gas limit\");\n }\n \n logger.warn(\"Gas estimation unreliable, using fallback (capped)\", {\n chainId: this.chainId,\n tokenIn: quote.tokenIn.symbol,\n tokenOut: quote.tokenOut.symbol,\n finalGasLimit: finalGasLimit.toString(),\n okxGas: okxGasBN?.toString() || \"not provided\",\n okxEstimateGasFee: okxEstimateGasFeeBN?.toString() || \"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(\n this.chainId,\n this.evmChainAdapter\n );\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(\"OKX swap failed: Unable to get valid gas price\");\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(\"OKX swap failed: Unable to get valid gas price\");\n }\n feeData.gasPrice = cachedGasPrice;\n }\n }\n\n // Final validation before building transaction\n if (!to || !ethers.utils.isAddress(to)) {\n return createExecuteError(\"OKX swap failed: Invalid recipient address\");\n }\n\n if (!transactionData || transactionData.length < 10) {\n return createExecuteError(\"OKX swap failed: Invalid transaction data\");\n }\n\n // Validate gas limit\n if (!finalGasLimit || finalGasLimit.lte(0)) {\n return createExecuteError(\"OKX swap failed: Invalid gas limit\");\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(\"OKX swap failed: Invalid gas fee data (EIP-1559)\");\n }\n } else {\n if (!feeData.gasPrice || feeData.gasPrice.lte(0)) {\n return createExecuteError(\"OKX swap failed: Invalid gas price\");\n }\n }\n\n const txParams: Parameters<EvmChainAdapter[\"sendTransaction\"]>[0] = {\n to,\n data: transactionData,\n value: value || \"0\",\n gasLimit: finalGasLimit.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 logger.info(\"OKX sending transaction to wallet\", {\n to,\n hasData: !!transactionData,\n dataLength: transactionData?.length,\n value,\n gasLimit: finalGasLimit.toString(),\n supportsEip1559,\n feeData: supportsEip1559\n ? {\n maxFeePerGas: feeData.maxFeePerGas?.toString(),\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas?.toString(),\n }\n : { gasPrice: feeData.gasPrice?.toString() },\n });\n\n const result = await this.evmChainAdapter.sendTransaction(txParams);\n\n logger.info(\"OKX transaction result\", {\n status: result.status,\n txHash: result.txHash,\n message: result.message,\n });\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 logger.error(\"OKX transaction failed\", {\n status: result.status,\n txHash: result.txHash,\n message: result.message,\n });\n return createExecuteError(\n normalizeError(result.message) || ErrorMessages.EXECUTE_FAILED\n );\n }\n } catch (error: any) {\n logger.error(\"OKX execute swap error:\", error);\n return createExecuteError(\n normalizeError(error?.message) || ErrorMessages.EXECUTE_FAILED\n );\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, formatErrorMessage as sdkFormatErrorMessage } 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 /** Optional function to format error messages (for consistency with frontend error handling) */\n formatErrorMessage?: (params: {\n error?: any;\n fallbackMessage?: string;\n originAsset?: string;\n friendly?: boolean;\n }) => string;\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/OKX 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 // 判断是否是 EVM 链:优先使用 evmChainId,其次检查 chain 字段\n const isEvmChain =\n evmChainId !== undefined ||\n sourceToken.chain === \"evm\" ||\n sourceChain === \"evm\";\n\n // 判断是否支持 Intents\n // 对于 EVM 链:优先使用 platform 字段(仅 EVM token list 有 platform 字段)\n // 对于 NEAR 链:使用原有的判断逻辑\n const isTokenIntentsSupported =\n (isEvmChain && sourceToken.platform === \"nearIntents\") ||\n (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 /**\n * Quote with retry for rate limit errors\n * Uses exponential backoff strategy for 429 errors\n */\n async function quoteWithRetry(\n router: DexRouter,\n quoteParams: QuoteParams,\n _routerType: string,\n _routerName: string,\n maxRetries: number = 2,\n initialDelay: number = 1000\n ): Promise<QuoteResult | null> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const quote = await router.quote(quoteParams);\n \n if (quote.success) {\n return quote;\n }\n \n const isRateLimit =\n quote.error?.includes(\"429\") ||\n quote.error?.toLowerCase().includes(\"rate limit\") ||\n quote.error?.toLowerCase().includes(\"too many requests\");\n\n if (!isRateLimit || attempt === maxRetries) {\n return quote;\n }\n\n const baseDelay = isRateLimit ? 2000 : initialDelay;\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n } catch (error: any) {\n const errorMessage = error?.message || String(error);\n const isRateLimit =\n errorMessage?.includes(\"429\") ||\n errorMessage?.toLowerCase().includes(\"rate limit\") ||\n errorMessage?.toLowerCase().includes(\"too many requests\");\n\n if (!isRateLimit || attempt === maxRetries) {\n throw error;\n }\n\n const baseDelay = isRateLimit ? 2000 : initialDelay;\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n \n return null;\n }\n\n const preSwapQuotePromises = routers.map(async (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 const routerName = router.getSupportedChain() === \"evm\" \n ? (`EVM-${(router as any).getChainId?.() || \"unknown\"}`)\n : \"NEAR\";\n \n const routerType = (router as any).okxAdapter ? \"OKX\" : \n (router as any).bitgetAdapter ? \"Bitget\" : \n routerName;\n\n try {\n const preSwapQuote = await quoteWithRetry(\n router,\n quoteParams,\n routerType,\n routerName,\n 2,\n 1000\n );\n \n if (!preSwapQuote || !preSwapQuote.success) {\n return null;\n }\n\n return {\n type: routeType,\n router,\n preSwapQuote,\n };\n } catch (error: any) {\n return null;\n }\n });\n\n const preSwapQuoteResults = await Promise.allSettled(preSwapQuotePromises);\n \n const validPreSwapQuotes: Array<{\n type: \"v1\" | \"v2\" | \"evm\";\n router: DexRouter;\n preSwapQuote: QuoteResult;\n }> = [];\n\n preSwapQuoteResults.forEach((result) => {\n if (result.status === \"fulfilled\" && result.value !== null) {\n validPreSwapQuotes.push(result.value);\n }\n });\n\n let bestPreSwapQuote: {\n type: \"v1\" | \"v2\" | \"evm\";\n router: DexRouter;\n preSwapQuote: QuoteResult;\n } | null = null;\n\n if (validPreSwapQuotes.length > 0) {\n bestPreSwapQuote = validPreSwapQuotes.reduce((best, current) => {\n const bestAmount = new Big(best.preSwapQuote.amountOut);\n const currentAmount = new Big(current.preSwapQuote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\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 if (bestPreSwapQuote) {\n const { router, preSwapQuote, type: routeType } = bestPreSwapQuote;\n\n let normalizedSourceAsset: string;\n // Priority 1: Use assetId from bluechipToken if provided (backend returns Intents assetId for bluechip tokens)\n if (\n bluechipToken.assetId &&\n (bluechipToken.assetId.startsWith(\"nep245:\") ||\n bluechipToken.assetId.startsWith(\"nep141:\") ||\n bluechipToken.assetId.startsWith(\"1cs_v1:\"))\n ) {\n normalizedSourceAsset = bluechipToken.assetId;\n }\n // Priority 2: Fallback to config (only if backend didn't provide assetId)\n else 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: string;\n // Priority 1: Use assetId from targetToken if provided (backend returns Intents assetId)\n if (\n targetToken.assetId &&\n (targetToken.assetId.startsWith(\"nep245:\") ||\n targetToken.assetId.startsWith(\"nep141:\") ||\n targetToken.assetId.startsWith(\"1cs_v1:\"))\n ) {\n normalizedTargetAsset = targetToken.assetId;\n }\n // Priority 2: Fallback to existing normalization logic (only if backend didn't provide assetId)\n else {\n 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\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const formattedAmountOut = preSwapQuote.amountOut;\n \n quotePaths.push({\n type: routeType,\n router,\n promise: (async () => {\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 const formatError = config.formatErrorMessage || sdkFormatErrorMessage;\n const errorMessage = formatError({\n error: intentsQuote.messageOriginal || intentsQuote.message,\n originAsset: normalizedSourceAsset,\n fallbackMessage: ErrorMessages.QUOTE_FAILED,\n });\n throw new Error(errorMessage);\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 // Priority 1: Use assetId from token if platform === \"nearIntents\" (EVM token only)\n if (\n isEvmChain &&\n sourceToken.platform === \"nearIntents\" &&\n sourceToken.assetId\n ) {\n normalizedSourceAsset = sourceToken.assetId;\n }\n // Priority 2: Use assetId if it's Intents format\n else if (\n sourceToken.assetId &&\n (sourceToken.assetId.startsWith(\"nep245:\") ||\n sourceToken.assetId.startsWith(\"nep141:\") ||\n sourceToken.assetId.startsWith(\"1cs_v1:\"))\n ) {\n normalizedSourceAsset = sourceToken.assetId;\n }\n // Priority 2: Fallback to config (only if backend didn't provide assetId)\n else if (isEvmChain) {\n const sourceKey = sourceToken.symbol?.toUpperCase();\n const sourceTokenConfig = sourceKey ? bluechipTokens[sourceKey] : undefined;\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 // Last resort fallback (should not happen if backend provides assetId)\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: string;\n // Priority 1: Use assetId from token if platform === \"nearIntents\" (EVM token only)\n if (\n isEvmChain &&\n targetToken.platform === \"nearIntents\" &&\n targetToken.assetId\n ) {\n normalizedTargetAsset = targetToken.assetId;\n }\n // Priority 2: Use assetId if it's Intents format\n else if (\n targetToken.assetId &&\n (targetToken.assetId.startsWith(\"nep245:\") ||\n targetToken.assetId.startsWith(\"nep141:\") ||\n targetToken.assetId.startsWith(\"1cs_v1:\"))\n ) {\n normalizedTargetAsset = targetToken.assetId;\n }\n // Priority 2: Fallback to existing normalization logic (only if backend didn't provide assetId)\n else {\n 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\n const slippageBps = convertSlippageToBasisPoints(slippage);\n\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 // Use formatErrorMessage if provided, otherwise use SDK's formatErrorMessage\n const formatError = config.formatErrorMessage || sdkFormatErrorMessage;\n const errorMessage = formatError({\n error: intentsQuote.messageOriginal || intentsQuote.message,\n originAsset: normalizedSourceAsset,\n fallbackMessage: ErrorMessages.QUOTE_FAILED,\n });\n throw new Error(errorMessage);\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 // Collect error messages from failed paths\n const errorMessages: string[] = [];\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 } else if (result.status === \"rejected\") {\n // Collect error messages from rejected promises\n const error = result.reason;\n if (error instanceof Error) {\n errorMessages.push(error.message);\n } else if (typeof error === \"string\") {\n errorMessages.push(error);\n } else {\n errorMessages.push(String(error));\n }\n }\n });\n\n if (validPaths.length === 0) {\n // Use the most detailed error message available, or fallback to generic error\n // Prefer intents error messages (usually more detailed)\n const intentsError = errorMessages.find(msg => \n msg && msg !== ErrorMessages.QUOTE_FAILED && \n (msg.toLowerCase().includes(\"bridge\") || \n msg.toLowerCase().includes(\"amount\") ||\n msg.toLowerCase().includes(\"low\") ||\n msg.toLowerCase().includes(\"minimum\"))\n );\n const bestError = intentsError || errorMessages[0] || ErrorMessages.QUOTE_FAILED;\n \n // Apply formatErrorMessage (use provided or SDK's default)\n const formatError = config.formatErrorMessage || sdkFormatErrorMessage;\n const formattedError = formatError({\n error: bestError,\n fallbackMessage: ErrorMessages.QUOTE_FAILED,\n });\n \n throw new Error(formattedError);\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 const fulfilledResults = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> => r.status === \"fulfilled\"\n )\n .map((r, index) => ({\n result: r.value,\n router: dexRouters[index],\n index,\n }));\n\n const validQuotes = fulfilledResults\n .filter((r) => r.result.success)\n .map((r) => ({\n quote: r.result,\n router: r.router,\n }));\n\n if (validQuotes.length > 0) {\n return selectBestQuote(validQuotes);\n }\n\n const errors = fulfilledResults\n .filter((r) => !r.result.success)\n .map((r) => {\n const error = r.result.error || \"\";\n const is429 =\n error.includes(\"429\") ||\n error.toLowerCase().includes(\"rate limit\") ||\n error.toLowerCase().includes(\"too many requests\");\n return is429 ? null : `Router ${r.index}: ${error}`;\n })\n .filter(Boolean) as string[];\n\n if (errors.length === 0) {\n throw new Error(\"All liquidity providers are busy. Please try again later.\");\n }\n\n const errorMessage =\n errors.length > 0\n ? `${ErrorMessages.QUOTE_FAILED}: ${errors.join(\"; \")}`\n : ErrorMessages.QUOTE_FAILED;\n throw new Error(errorMessage);\n}\n\n"]}
|