@rhea-finance/cross-chain-aggregation-dex 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -842,6 +842,47 @@ var AggregateDexRouter = class {
|
|
|
842
842
|
expandDeposit: finalQuote.amountIn
|
|
843
843
|
});
|
|
844
844
|
}
|
|
845
|
+
const isWrappedNear = finalQuote.tokenIn.address === this.wrapNearContractId || finalQuote.tokenIn.symbol === "WNEAR" && finalQuote.tokenIn.address === this.wrapNearContractId;
|
|
846
|
+
if (isWrappedNear && !isNativeNear) {
|
|
847
|
+
let wNearBalance = "0";
|
|
848
|
+
try {
|
|
849
|
+
const wNearBalanceResult = await this.nearChainAdapter.view({
|
|
850
|
+
contractId: this.wrapNearContractId,
|
|
851
|
+
methodName: "ft_balance_of",
|
|
852
|
+
args: { account_id: sender }
|
|
853
|
+
});
|
|
854
|
+
wNearBalance = wNearBalanceResult || "0";
|
|
855
|
+
} catch (e) {
|
|
856
|
+
}
|
|
857
|
+
const requiredAmount = new Big3__default.default(finalQuote.amountIn);
|
|
858
|
+
const currentBalance = new Big3__default.default(wNearBalance);
|
|
859
|
+
if (currentBalance.lt(requiredAmount)) {
|
|
860
|
+
const amountToConvert = requiredAmount.minus(currentBalance);
|
|
861
|
+
const wrapNearStorageBalance = await getStorageBalance(
|
|
862
|
+
this.wrapNearContractId,
|
|
863
|
+
sender
|
|
864
|
+
).catch(() => null);
|
|
865
|
+
if (!wrapNearStorageBalance) {
|
|
866
|
+
transactions.push({
|
|
867
|
+
contractId: this.wrapNearContractId,
|
|
868
|
+
methodName: "storage_deposit",
|
|
869
|
+
args: {
|
|
870
|
+
account_id: sender,
|
|
871
|
+
registration_only: true
|
|
872
|
+
},
|
|
873
|
+
gas: "50000000000000",
|
|
874
|
+
expandDeposit: this.NEW_ACCOUNT_STORAGE_COST
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
transactions.push({
|
|
878
|
+
contractId: this.wrapNearContractId,
|
|
879
|
+
methodName: "near_deposit",
|
|
880
|
+
args: {},
|
|
881
|
+
gas: "50000000000000",
|
|
882
|
+
expandDeposit: amountToConvert.toFixed(0)
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
}
|
|
845
886
|
const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];
|
|
846
887
|
const tokenStorageBalances = await Promise.all(
|
|
847
888
|
tokensToCheck.map(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cross-chain DEX aggregation SDK core type definitions\n */\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n chain: string;\n}\n\nexport interface Route {\n pools: PoolInfo[];\n amountIn: string;\n amountOut: string;\n}\n\nexport interface PoolInfo {\n pool_id: number;\n token_in: string;\n token_out: string;\n amount_in?: string;\n amount_out?: string;\n fee?: number;\n}\n\n/**\n * Base quote parameters (common to all routers)\n */\nexport interface BaseQuoteParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n /** Slippage tolerance in bps (e.g. 50 = 0.5%). */\n slippage: number;\n swapType?: \"EXACT_INPUT\" | \"EXACT_OUTPUT\";\n recipient?: string;\n}\n\n/**\n * Simple quote parameters (V1 NEAR, etc., no recipient required)\n */\nexport interface SimpleQuoteParams extends BaseQuoteParams {\n}\n\n/**\n * Recipient quote parameters (V2 NEAR, EVM, etc., recipient required)\n */\nexport interface RecipientQuoteParams extends BaseQuoteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (equals sender during quote, equals depositAddress during execution) */\n recipient: string;\n}\n\n/**\n * Unified quote parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type QuoteParams = SimpleQuoteParams | RecipientQuoteParams;\n\n/**\n * Type guard: check if recipient parameters are required\n */\nexport function requiresRecipient(\n params: QuoteParams\n): params is RecipientQuoteParams {\n return \"sender\" in params && \"recipient\" in params;\n}\n\nexport interface QuoteResult {\n success: boolean;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n amountOut: string;\n minAmountOut: string;\n routes: Route[];\n /**\n * Optional: Raw route data returned by chain router/aggregator\n * - Used for scenarios where aggregator-specific fields need to be passed through in executeSwap\n * - Kept optional to avoid tightly coupling implementation details into core logic\n */\n rawRoutes?: any[];\n priceImpact?: number;\n avgFee?: number;\n estimatedGas?: string;\n error?: string;\n \n // V2 Router specific fields (NEAR, EVM, etc.)\n routerMsg?: string;\n signature?: string;\n tokens?: string[];\n dexs?: string[];\n recipient?: string;\n slippage?: number;\n \n // EVM-specific fields (future extension)\n transactionData?: string;\n gasEstimate?: string;\n}\n\n/**\n * Base execute parameters (common to all routers)\n */\nexport interface BaseExecuteParams {\n quote: QuoteResult;\n recipient: string;\n depositAddress?: string;\n deadline?: number;\n /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\n}\n\n/**\n * Recipient execute parameters (V2 NEAR, EVM, etc.)\n */\nexport interface RecipientExecuteParams extends BaseExecuteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (usually depositAddress) */\n receiveUser: string;\n}\n\n/**\n * Unified execute parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type ExecuteParams = BaseExecuteParams | RecipientExecuteParams;\n\n/**\n * Type guard: check if execute parameters require recipient\n */\nexport function requiresRecipientInExecute(\n params: ExecuteParams\n): params is RecipientExecuteParams {\n return \"sender\" in params && \"receiveUser\" in params;\n}\n\nexport interface ExecuteResult {\n success: boolean;\n txHash?: string;\n txHashArray?: string[];\n error?: string;\n}\n\nexport type SupportedChain = \"near\" | \"evm\" | \"solana\";\n\n/**\n * Router capabilities\n * Used to declare router features and requirements\n */\nexport interface RouterCapabilities {\n /** Whether recipient parameters (sender/recipient) are required */\n requiresRecipient: boolean;\n /** Whether two API calls are needed (quote + finalize) */\n requiresFinalizeQuote: boolean;\n /** Whether complex token registration is required */\n requiresComplexRegistration: boolean;\n /** Supported chain */\n supportedChain: SupportedChain | string;\n}\n\n/**\n * DEX aggregator router abstract interface\n * Each chain/aggregator implements its own quote/executeSwap\n * \n * Extended to support common architecture:\n * - Capabilities (RouterCapabilities)\n * - Optional finalize quote method (finalizeQuote)\n * - Unified parameter interface (supports both simple and recipient modes)\n */\nexport interface DexRouter {\n getCapabilities(): RouterCapabilities;\n \n getSupportedChain(): SupportedChain | string;\n \n /**\n * Quote method\n * - Simple router: only needs BaseQuoteParams\n * - Recipient router: needs RecipientQuoteParams\n */\n quote(params: QuoteParams): Promise<QuoteResult>;\n \n /**\n * Execute swap\n * - Simple router: only needs BaseExecuteParams\n * - Recipient router: needs RecipientExecuteParams\n */\n executeSwap(params: ExecuteParams): Promise<ExecuteResult>;\n \n /**\n * Finalize quote (if two API calls are needed)\n * - Only implemented when requiresFinalizeQuote = true\n * - Used to call API again after getting depositAddress\n */\n finalizeQuote?(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult>;\n}\n\n/**\n * Bluechip token configuration\n */\nexport interface BluechipTokenConfig {\n address: string;\n symbol: string;\n decimals: number;\n assetId?: string; // AssetId for NearIntents (may include nep141: prefix)\n}\n\n/**\n * Bluechip tokens list configuration\n */\nexport interface BluechipTokensConfig {\n USDT?: BluechipTokenConfig;\n USDC?: BluechipTokenConfig;\n NEAR?: BluechipTokenConfig;\n [key: string]: BluechipTokenConfig | undefined;\n}\n","/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\n/**\n * Format gas value from yoctoNEAR to Tgas string, avoiding scientific notation.\n * @param gasInYoctoNEAR Gas value in yoctoNEAR (string or number)\n * @returns Formatted gas string in Tgas units (e.g., \"795\" for 795 Tgas)\n */\nexport function formatGasToTgas(gasInYoctoNEAR: string | number): string {\n if (!gasInYoctoNEAR) return \"0\";\n \n // Convert to string first to handle both string and number inputs\n const gasStr = String(gasInYoctoNEAR);\n \n // Check if it's already in scientific notation\n if (/[eE]/.test(gasStr)) {\n // Parse scientific notation manually to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n return (newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos)).replace(/\\.?0+$/, \"\");\n }\n }\n }\n }\n \n // Convert yoctoNEAR to Tgas (1 Tgas = 10^12 yoctoNEAR)\n // Use BigInt for precise integer division\n try {\n const gasBigInt = BigInt(gasStr.split(\".\")[0]); // Take integer part only\n const tgasBigInt = gasBigInt / BigInt(\"1000000000000\");\n return tgasBigInt.toString();\n } catch (error) {\n return \"0\";\n }\n}\n\n/**\n * Ensure gas value is a string without scientific notation.\n * This is used to format gas values before passing to wallet selector.\n * @param gas Gas value (string, number, or BigInt)\n * @returns Formatted gas string in yoctoNEAR\n */\nexport function formatGasString(gas: string | number | bigint): string {\n if (typeof gas === \"bigint\") {\n return gas.toString();\n }\n \n const gasStr = String(gas);\n \n // If already a clean string without scientific notation, return as is\n if (!/[eE]/.test(gasStr) && !gasStr.includes(\".\")) {\n return gasStr;\n }\n \n // Handle scientific notation\n if (/[eE]/.test(gasStr)) {\n // Use manual parsing to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n const result = newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos);\n return result.replace(/\\.?0+$/, \"\").replace(/\\.$/, \"\");\n }\n } else if (exponent < 0) {\n // Negative exponent: move decimal point left\n const absExp = Math.abs(exponent);\n const zerosToAdd = absExp - intPart.length;\n if (zerosToAdd > 0) {\n return \"0.\" + \"0\".repeat(zerosToAdd - 1) + intPart.replace(/^-/, \"\") + fracPart;\n } else {\n const pointPos = intPart.length - absExp;\n return intPart.slice(0, pointPos) + \".\" + intPart.slice(pointPos) + fracPart;\n }\n }\n }\n }\n \n // Handle decimal numbers - convert to integer string\n if (gasStr.includes(\".\")) {\n const [intPart, fracPart = \"\"] = gasStr.split(\".\");\n return intPart + fracPart;\n }\n \n return gasStr;\n}\n\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n RouterCapabilities,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n supportLedger: false,\n });\n\n if (\n response?.result_code !== 0 ||\n !response?.result_data?.routes?.length\n ) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: response?.result_msg || response?.result_message || \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = response.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: false,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"near\",\n };\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** V2 Router implementation (Aggregate DEX Router). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n SwapMultiDexPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface AggregateDexRouterConfig {\n swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\n/**\n * V2 Router implementation for NEAR\n * Uses Aggregate DEX contract for routing\n */\nexport class AggregateDexRouter implements DexRouter {\n private swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private aggregateDexContractId: string;\n private wrapNearContractId: string;\n private readonly NEW_ACCOUNT_STORAGE_COST = \"1250000000000000000000\"; // 0.00125 NEAR in yoctoNEAR\n private readonly ONE_YOCTO_NEAR = \"1\";\n\n constructor(config: AggregateDexRouterConfig) {\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || \"\";\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n\n if (!this.aggregateDexContractId) {\n // AGGREGATE_DEX_CONTRACT_ID not configured\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: true,\n supportedChain: \"near\",\n };\n }\n\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n\n /**\n * Get a swap quote from V2 Router API\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n if (!requiresRecipient(params)) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.swapMultiDexPathAdapter.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n user: sender,\n receiveUser: recipient,\n });\n\n if (response.result_code !== 0 || !response.result_data) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n\n const {\n amount_in,\n amount_out,\n min_amount_out,\n msg,\n signature,\n tokens,\n dexs,\n } = response.result_data;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: amount_in || amountIn,\n amountOut: amount_out || \"0\",\n minAmountOut: min_amount_out || \"0\",\n routes: [],\n routerMsg: msg,\n signature: signature,\n tokens: tokens || [],\n dexs: dexs || [],\n recipient: recipient,\n slippage: slippage,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n }\n\n /**\n * @deprecated No longer needed. Kept for interface compatibility only.\n */\n async finalizeQuote(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult> {\n if (!requiresRecipient(params)) {\n throw new Error(\"V2 Router requires recipient parameters\");\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(\"Failed to get quote\");\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"Missing sender or receiveUser\",\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: \"Missing receiveUser\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: \"Invalid receiveUser address\",\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n \n const finalQuoteParams: QuoteParams = {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuote: QuoteResult;\n try {\n finalQuote = await this.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const routerMsg = finalQuote.routerMsg;\n const signature = finalQuote.signature;\n\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const tokens = finalQuote.tokens || [];\n const dexs = finalQuote.dexs || [];\n\n const transactions: Array<{\n contractId: string;\n methodName: string;\n args: any;\n gas?: string;\n expandDeposit?: string;\n }> = [];\n\n const getStorageBalance = async (\n tokenId: string,\n accountId: string\n ): Promise<any> => {\n try {\n return await this.nearChainAdapter.view({\n contractId: tokenId,\n methodName: \"storage_balance_of\",\n args: { account_id: accountId },\n });\n } catch (error) {\n return null;\n }\n };\n\n // 1. Convert NEAR to wNEAR if tokenIn is native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\n\n if (isNativeNear) {\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: finalQuote.amountIn,\n });\n }\n\n // 2. Check if user is registered in each token\n const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];\n const tokenStorageBalances = await Promise.all(\n tokensToCheck.map((tokenId) =>\n getStorageBalance(tokenId, sender).catch(() => null)\n )\n );\n\n tokensToCheck.forEach((tokenId, index) => {\n if (!tokenStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 3. Check if receiveUser is registered in tokenOut\n if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\n transactions.push({\n contractId: finalQuote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: receiveUser,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n }\n\n // 4. Check if AGGREGATE_DEX_CONTRACT_ID is registered in each token\n const aggregateDexStorageBalances = await Promise.all(\n tokens.map((tokenId) =>\n getStorageBalance(tokenId, this.aggregateDexContractId).catch(\n () => null\n )\n )\n );\n\n tokens.forEach((tokenId, index) => {\n if (!aggregateDexStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: this.aggregateDexContractId,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 5. Check if tokens are registered in aggregate dex (only for sender, not receiveUser)\n if (tokens.length > 0) {\n const registeredStatus = await this.queryUserTokensRegistered({\n user: sender,\n tokens,\n });\n\n const unregisteredTokens = tokens.filter(\n (_, index) => !registeredStatus[index]\n );\n\n if (unregisteredTokens.length > 0) {\n const depositPerToken = new Big(\"0.005\").mul(\n new Big(\"1000000000000000000000000\")\n );\n const totalDeposit = depositPerToken.mul(unregisteredTokens.length);\n\n transactions.push({\n contractId: this.aggregateDexContractId,\n methodName: \"tokens_storage_deposit\",\n args: {\n user: sender,\n tokens: unregisteredTokens,\n },\n gas: \"30000000000000\",\n expandDeposit: totalDeposit.toFixed(0),\n });\n }\n }\n\n // 6. Main swap transaction\n // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.signature,\n });\n\n transactions.push({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.aggregateDexContractId,\n amount: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n }\n\n\n private async queryUserTokensRegistered({\n user,\n tokens,\n }: {\n user: string;\n tokens: string[];\n }): Promise<boolean[]> {\n try {\n return await this.nearChainAdapter.view({\n contractId: this.aggregateDexContractId,\n methodName: \"query_user_tokens_registered\",\n args: {\n user,\n tokens,\n },\n });\n } catch (error) {\n return tokens.map(() => false);\n }\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport {\n TokenInfo,\n QuoteResult,\n DexRouter,\n BluechipTokensConfig,\n QuoteParams,\n} from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n}\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\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"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 };\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\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain: _sourceChain, // Reserved for future use\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n customRecipientMsg,\n appFees,\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 if (routers.length === 0) {\n throw new Error(\"At least one DEX router is required\");\n }\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for V2 Router\");\n }\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n // Check if token supports Intents:\n // 1. Custom checker (e.g., from nearTokenInList)\n // 2. Bluechip token checker (fallback)\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n // Prepare all quote paths for parallel execution\n // If token supports Intents, we have 3 paths: V1+Intents, V2+Intents, Direct Intents\n // If token doesn't support Intents, we have 2 paths: V1+Intents, V2+Intents\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n // Path 1 & 2: V1/V2 Router + Intents (always available)\n routers.forEach((router, index) => {\n const routeType: \"v1\" | \"v2\" = index === 0 ? \"v1\" : \"v2\";\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 // Step 1: Get pre-swap quote\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Step 2: Get Intents quote with pre-swap output\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n const normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\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: preSwapQuote.amountOut,\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(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n });\n\n // Path 3: Direct Intents (only if token supports Intents)\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n // Normalize source asset\n let normalizedSourceAsset: string;\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\n } else if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n // Execute all paths in parallel\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n // Process results\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Select path with maximum finalAmountOut\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\n const depositAddress =\n bestPath.intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\n .map((r, index) => {\n if (r.status === \"rejected\") {\n return `Router ${index}: ${r.reason}`;\n }\n if (r.status === \"fulfilled\" && !r.value.success) {\n return `Router ${index}: ${r.value.error}`;\n }\n return null;\n })\n .filter(Boolean);\n throw new Error(`All router quotes failed: ${errors.join(\"; \")}`);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cross-chain DEX aggregation SDK core type definitions\n */\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n chain: string;\n}\n\nexport interface Route {\n pools: PoolInfo[];\n amountIn: string;\n amountOut: string;\n}\n\nexport interface PoolInfo {\n pool_id: number;\n token_in: string;\n token_out: string;\n amount_in?: string;\n amount_out?: string;\n fee?: number;\n}\n\n/**\n * Base quote parameters (common to all routers)\n */\nexport interface BaseQuoteParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n /** Slippage tolerance in bps (e.g. 50 = 0.5%). */\n slippage: number;\n swapType?: \"EXACT_INPUT\" | \"EXACT_OUTPUT\";\n recipient?: string;\n}\n\n/**\n * Simple quote parameters (V1 NEAR, etc., no recipient required)\n */\nexport interface SimpleQuoteParams extends BaseQuoteParams {\n}\n\n/**\n * Recipient quote parameters (V2 NEAR, EVM, etc., recipient required)\n */\nexport interface RecipientQuoteParams extends BaseQuoteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (equals sender during quote, equals depositAddress during execution) */\n recipient: string;\n}\n\n/**\n * Unified quote parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type QuoteParams = SimpleQuoteParams | RecipientQuoteParams;\n\n/**\n * Type guard: check if recipient parameters are required\n */\nexport function requiresRecipient(\n params: QuoteParams\n): params is RecipientQuoteParams {\n return \"sender\" in params && \"recipient\" in params;\n}\n\nexport interface QuoteResult {\n success: boolean;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n amountOut: string;\n minAmountOut: string;\n routes: Route[];\n /**\n * Optional: Raw route data returned by chain router/aggregator\n * - Used for scenarios where aggregator-specific fields need to be passed through in executeSwap\n * - Kept optional to avoid tightly coupling implementation details into core logic\n */\n rawRoutes?: any[];\n priceImpact?: number;\n avgFee?: number;\n estimatedGas?: string;\n error?: string;\n \n // V2 Router specific fields (NEAR, EVM, etc.)\n routerMsg?: string;\n signature?: string;\n tokens?: string[];\n dexs?: string[];\n recipient?: string;\n slippage?: number;\n \n // EVM-specific fields (future extension)\n transactionData?: string;\n gasEstimate?: string;\n}\n\n/**\n * Base execute parameters (common to all routers)\n */\nexport interface BaseExecuteParams {\n quote: QuoteResult;\n recipient: string;\n depositAddress?: string;\n deadline?: number;\n /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\n}\n\n/**\n * Recipient execute parameters (V2 NEAR, EVM, etc.)\n */\nexport interface RecipientExecuteParams extends BaseExecuteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (usually depositAddress) */\n receiveUser: string;\n}\n\n/**\n * Unified execute parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type ExecuteParams = BaseExecuteParams | RecipientExecuteParams;\n\n/**\n * Type guard: check if execute parameters require recipient\n */\nexport function requiresRecipientInExecute(\n params: ExecuteParams\n): params is RecipientExecuteParams {\n return \"sender\" in params && \"receiveUser\" in params;\n}\n\nexport interface ExecuteResult {\n success: boolean;\n txHash?: string;\n txHashArray?: string[];\n error?: string;\n}\n\nexport type SupportedChain = \"near\" | \"evm\" | \"solana\";\n\n/**\n * Router capabilities\n * Used to declare router features and requirements\n */\nexport interface RouterCapabilities {\n /** Whether recipient parameters (sender/recipient) are required */\n requiresRecipient: boolean;\n /** Whether two API calls are needed (quote + finalize) */\n requiresFinalizeQuote: boolean;\n /** Whether complex token registration is required */\n requiresComplexRegistration: boolean;\n /** Supported chain */\n supportedChain: SupportedChain | string;\n}\n\n/**\n * DEX aggregator router abstract interface\n * Each chain/aggregator implements its own quote/executeSwap\n * \n * Extended to support common architecture:\n * - Capabilities (RouterCapabilities)\n * - Optional finalize quote method (finalizeQuote)\n * - Unified parameter interface (supports both simple and recipient modes)\n */\nexport interface DexRouter {\n getCapabilities(): RouterCapabilities;\n \n getSupportedChain(): SupportedChain | string;\n \n /**\n * Quote method\n * - Simple router: only needs BaseQuoteParams\n * - Recipient router: needs RecipientQuoteParams\n */\n quote(params: QuoteParams): Promise<QuoteResult>;\n \n /**\n * Execute swap\n * - Simple router: only needs BaseExecuteParams\n * - Recipient router: needs RecipientExecuteParams\n */\n executeSwap(params: ExecuteParams): Promise<ExecuteResult>;\n \n /**\n * Finalize quote (if two API calls are needed)\n * - Only implemented when requiresFinalizeQuote = true\n * - Used to call API again after getting depositAddress\n */\n finalizeQuote?(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult>;\n}\n\n/**\n * Bluechip token configuration\n */\nexport interface BluechipTokenConfig {\n address: string;\n symbol: string;\n decimals: number;\n assetId?: string; // AssetId for NearIntents (may include nep141: prefix)\n}\n\n/**\n * Bluechip tokens list configuration\n */\nexport interface BluechipTokensConfig {\n USDT?: BluechipTokenConfig;\n USDC?: BluechipTokenConfig;\n NEAR?: BluechipTokenConfig;\n [key: string]: BluechipTokenConfig | undefined;\n}\n","/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\n/**\n * Format gas value from yoctoNEAR to Tgas string, avoiding scientific notation.\n * @param gasInYoctoNEAR Gas value in yoctoNEAR (string or number)\n * @returns Formatted gas string in Tgas units (e.g., \"795\" for 795 Tgas)\n */\nexport function formatGasToTgas(gasInYoctoNEAR: string | number): string {\n if (!gasInYoctoNEAR) return \"0\";\n \n // Convert to string first to handle both string and number inputs\n const gasStr = String(gasInYoctoNEAR);\n \n // Check if it's already in scientific notation\n if (/[eE]/.test(gasStr)) {\n // Parse scientific notation manually to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n return (newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos)).replace(/\\.?0+$/, \"\");\n }\n }\n }\n }\n \n // Convert yoctoNEAR to Tgas (1 Tgas = 10^12 yoctoNEAR)\n // Use BigInt for precise integer division\n try {\n const gasBigInt = BigInt(gasStr.split(\".\")[0]); // Take integer part only\n const tgasBigInt = gasBigInt / BigInt(\"1000000000000\");\n return tgasBigInt.toString();\n } catch (error) {\n return \"0\";\n }\n}\n\n/**\n * Ensure gas value is a string without scientific notation.\n * This is used to format gas values before passing to wallet selector.\n * @param gas Gas value (string, number, or BigInt)\n * @returns Formatted gas string in yoctoNEAR\n */\nexport function formatGasString(gas: string | number | bigint): string {\n if (typeof gas === \"bigint\") {\n return gas.toString();\n }\n \n const gasStr = String(gas);\n \n // If already a clean string without scientific notation, return as is\n if (!/[eE]/.test(gasStr) && !gasStr.includes(\".\")) {\n return gasStr;\n }\n \n // Handle scientific notation\n if (/[eE]/.test(gasStr)) {\n // Use manual parsing to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n const result = newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos);\n return result.replace(/\\.?0+$/, \"\").replace(/\\.$/, \"\");\n }\n } else if (exponent < 0) {\n // Negative exponent: move decimal point left\n const absExp = Math.abs(exponent);\n const zerosToAdd = absExp - intPart.length;\n if (zerosToAdd > 0) {\n return \"0.\" + \"0\".repeat(zerosToAdd - 1) + intPart.replace(/^-/, \"\") + fracPart;\n } else {\n const pointPos = intPart.length - absExp;\n return intPart.slice(0, pointPos) + \".\" + intPart.slice(pointPos) + fracPart;\n }\n }\n }\n }\n \n // Handle decimal numbers - convert to integer string\n if (gasStr.includes(\".\")) {\n const [intPart, fracPart = \"\"] = gasStr.split(\".\");\n return intPart + fracPart;\n }\n \n return gasStr;\n}\n\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n RouterCapabilities,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n supportLedger: false,\n });\n\n if (\n response?.result_code !== 0 ||\n !response?.result_data?.routes?.length\n ) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: response?.result_msg || response?.result_message || \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = response.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: false,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"near\",\n };\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** V2 Router implementation (Aggregate DEX Router). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n SwapMultiDexPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface AggregateDexRouterConfig {\n swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\n/**\n * V2 Router implementation for NEAR\n * Uses Aggregate DEX contract for routing\n */\nexport class AggregateDexRouter implements DexRouter {\n private swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private aggregateDexContractId: string;\n private wrapNearContractId: string;\n private readonly NEW_ACCOUNT_STORAGE_COST = \"1250000000000000000000\"; // 0.00125 NEAR in yoctoNEAR\n private readonly ONE_YOCTO_NEAR = \"1\";\n\n constructor(config: AggregateDexRouterConfig) {\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || \"\";\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n\n if (!this.aggregateDexContractId) {\n // AGGREGATE_DEX_CONTRACT_ID not configured\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: true,\n supportedChain: \"near\",\n };\n }\n\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n\n /**\n * Get a swap quote from V2 Router API\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n if (!requiresRecipient(params)) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.swapMultiDexPathAdapter.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n user: sender,\n receiveUser: recipient,\n });\n\n if (response.result_code !== 0 || !response.result_data) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n\n const {\n amount_in,\n amount_out,\n min_amount_out,\n msg,\n signature,\n tokens,\n dexs,\n } = response.result_data;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: amount_in || amountIn,\n amountOut: amount_out || \"0\",\n minAmountOut: min_amount_out || \"0\",\n routes: [],\n routerMsg: msg,\n signature: signature,\n tokens: tokens || [],\n dexs: dexs || [],\n recipient: recipient,\n slippage: slippage,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n }\n\n /**\n * @deprecated No longer needed. Kept for interface compatibility only.\n */\n async finalizeQuote(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult> {\n if (!requiresRecipient(params)) {\n throw new Error(\"V2 Router requires recipient parameters\");\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(\"Failed to get quote\");\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"Missing sender or receiveUser\",\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: \"Missing receiveUser\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: \"Invalid receiveUser address\",\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n \n const finalQuoteParams: QuoteParams = {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuote: QuoteResult;\n try {\n finalQuote = await this.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const routerMsg = finalQuote.routerMsg;\n const signature = finalQuote.signature;\n\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const tokens = finalQuote.tokens || [];\n const dexs = finalQuote.dexs || [];\n\n const transactions: Array<{\n contractId: string;\n methodName: string;\n args: any;\n gas?: string;\n expandDeposit?: string;\n }> = [];\n\n const getStorageBalance = async (\n tokenId: string,\n accountId: string\n ): Promise<any> => {\n try {\n return await this.nearChainAdapter.view({\n contractId: tokenId,\n methodName: \"storage_balance_of\",\n args: { account_id: accountId },\n });\n } catch (error) {\n return null;\n }\n };\n\n // 1. Convert NEAR to wNEAR if tokenIn is native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\n\n if (isNativeNear) {\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: finalQuote.amountIn,\n });\n }\n\n // 1.5. Handle case where tokenIn is wNEAR but user doesn't have wNEAR balance\n // If tokenIn is wNEAR, check balance and convert NEAR to wNEAR if needed\n const isWrappedNear =\n finalQuote.tokenIn.address === this.wrapNearContractId ||\n (finalQuote.tokenIn.symbol === \"WNEAR\" &&\n finalQuote.tokenIn.address === this.wrapNearContractId);\n\n if (isWrappedNear && !isNativeNear) {\n // Check wNEAR balance\n let wNearBalance = \"0\";\n try {\n const wNearBalanceResult = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n wNearBalance = wNearBalanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors, assume no balance\n }\n\n const requiredAmount = new Big(finalQuote.amountIn);\n const currentBalance = new Big(wNearBalance);\n\n // If user doesn't have enough wNEAR, convert NEAR to wNEAR\n if (currentBalance.lt(requiredAmount)) {\n // Calculate how much NEAR we need to convert\n const amountToConvert = requiredAmount.minus(currentBalance);\n\n // Check wrap.near storage balance\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n // Convert NEAR to wNEAR\n // Note: Gas fees will be deducted from NEAR balance automatically\n // If user doesn't have enough NEAR, this will fail at execution time\n // which is expected behavior\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: amountToConvert.toFixed(0),\n });\n }\n }\n\n // 2. Check if user is registered in each token\n const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];\n const tokenStorageBalances = await Promise.all(\n tokensToCheck.map((tokenId) =>\n getStorageBalance(tokenId, sender).catch(() => null)\n )\n );\n\n tokensToCheck.forEach((tokenId, index) => {\n if (!tokenStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 3. Check if receiveUser is registered in tokenOut\n if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\n transactions.push({\n contractId: finalQuote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: receiveUser,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n }\n\n // 4. Check if AGGREGATE_DEX_CONTRACT_ID is registered in each token\n const aggregateDexStorageBalances = await Promise.all(\n tokens.map((tokenId) =>\n getStorageBalance(tokenId, this.aggregateDexContractId).catch(\n () => null\n )\n )\n );\n\n tokens.forEach((tokenId, index) => {\n if (!aggregateDexStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: this.aggregateDexContractId,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 5. Check if tokens are registered in aggregate dex (only for sender, not receiveUser)\n if (tokens.length > 0) {\n const registeredStatus = await this.queryUserTokensRegistered({\n user: sender,\n tokens,\n });\n\n const unregisteredTokens = tokens.filter(\n (_, index) => !registeredStatus[index]\n );\n\n if (unregisteredTokens.length > 0) {\n const depositPerToken = new Big(\"0.005\").mul(\n new Big(\"1000000000000000000000000\")\n );\n const totalDeposit = depositPerToken.mul(unregisteredTokens.length);\n\n transactions.push({\n contractId: this.aggregateDexContractId,\n methodName: \"tokens_storage_deposit\",\n args: {\n user: sender,\n tokens: unregisteredTokens,\n },\n gas: \"30000000000000\",\n expandDeposit: totalDeposit.toFixed(0),\n });\n }\n }\n\n // 6. Main swap transaction\n // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.signature,\n });\n\n transactions.push({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.aggregateDexContractId,\n amount: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n }\n\n\n private async queryUserTokensRegistered({\n user,\n tokens,\n }: {\n user: string;\n tokens: string[];\n }): Promise<boolean[]> {\n try {\n return await this.nearChainAdapter.view({\n contractId: this.aggregateDexContractId,\n methodName: \"query_user_tokens_registered\",\n args: {\n user,\n tokens,\n },\n });\n } catch (error) {\n return tokens.map(() => false);\n }\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport {\n TokenInfo,\n QuoteResult,\n DexRouter,\n BluechipTokensConfig,\n QuoteParams,\n} from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n}\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\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"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 };\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\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain: _sourceChain, // Reserved for future use\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n customRecipientMsg,\n appFees,\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 if (routers.length === 0) {\n throw new Error(\"At least one DEX router is required\");\n }\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for V2 Router\");\n }\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n // Check if token supports Intents:\n // 1. Custom checker (e.g., from nearTokenInList)\n // 2. Bluechip token checker (fallback)\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n // Prepare all quote paths for parallel execution\n // If token supports Intents, we have 3 paths: V1+Intents, V2+Intents, Direct Intents\n // If token doesn't support Intents, we have 2 paths: V1+Intents, V2+Intents\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n // Path 1 & 2: V1/V2 Router + Intents (always available)\n routers.forEach((router, index) => {\n const routeType: \"v1\" | \"v2\" = index === 0 ? \"v1\" : \"v2\";\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 // Step 1: Get pre-swap quote\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Step 2: Get Intents quote with pre-swap output\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n const normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\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: preSwapQuote.amountOut,\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(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n });\n\n // Path 3: Direct Intents (only if token supports Intents)\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n // Normalize source asset\n let normalizedSourceAsset: string;\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\n } else if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n // Execute all paths in parallel\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n // Process results\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Select path with maximum finalAmountOut\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\n const depositAddress =\n bestPath.intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\n .map((r, index) => {\n if (r.status === \"rejected\") {\n return `Router ${index}: ${r.reason}`;\n }\n if (r.status === \"fulfilled\" && !r.value.success) {\n return `Router ${index}: ${r.value.error}`;\n }\n return null;\n })\n .filter(Boolean);\n throw new Error(`All router quotes failed: ${errors.join(\"; \")}`);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -836,6 +836,47 @@ var AggregateDexRouter = class {
|
|
|
836
836
|
expandDeposit: finalQuote.amountIn
|
|
837
837
|
});
|
|
838
838
|
}
|
|
839
|
+
const isWrappedNear = finalQuote.tokenIn.address === this.wrapNearContractId || finalQuote.tokenIn.symbol === "WNEAR" && finalQuote.tokenIn.address === this.wrapNearContractId;
|
|
840
|
+
if (isWrappedNear && !isNativeNear) {
|
|
841
|
+
let wNearBalance = "0";
|
|
842
|
+
try {
|
|
843
|
+
const wNearBalanceResult = await this.nearChainAdapter.view({
|
|
844
|
+
contractId: this.wrapNearContractId,
|
|
845
|
+
methodName: "ft_balance_of",
|
|
846
|
+
args: { account_id: sender }
|
|
847
|
+
});
|
|
848
|
+
wNearBalance = wNearBalanceResult || "0";
|
|
849
|
+
} catch (e) {
|
|
850
|
+
}
|
|
851
|
+
const requiredAmount = new Big3(finalQuote.amountIn);
|
|
852
|
+
const currentBalance = new Big3(wNearBalance);
|
|
853
|
+
if (currentBalance.lt(requiredAmount)) {
|
|
854
|
+
const amountToConvert = requiredAmount.minus(currentBalance);
|
|
855
|
+
const wrapNearStorageBalance = await getStorageBalance(
|
|
856
|
+
this.wrapNearContractId,
|
|
857
|
+
sender
|
|
858
|
+
).catch(() => null);
|
|
859
|
+
if (!wrapNearStorageBalance) {
|
|
860
|
+
transactions.push({
|
|
861
|
+
contractId: this.wrapNearContractId,
|
|
862
|
+
methodName: "storage_deposit",
|
|
863
|
+
args: {
|
|
864
|
+
account_id: sender,
|
|
865
|
+
registration_only: true
|
|
866
|
+
},
|
|
867
|
+
gas: "50000000000000",
|
|
868
|
+
expandDeposit: this.NEW_ACCOUNT_STORAGE_COST
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
transactions.push({
|
|
872
|
+
contractId: this.wrapNearContractId,
|
|
873
|
+
methodName: "near_deposit",
|
|
874
|
+
args: {},
|
|
875
|
+
gas: "50000000000000",
|
|
876
|
+
expandDeposit: amountToConvert.toFixed(0)
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
}
|
|
839
880
|
const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];
|
|
840
881
|
const tokenStorageBalances = await Promise.all(
|
|
841
882
|
tokensToCheck.map(
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Cross-chain DEX aggregation SDK core type definitions\n */\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n chain: string;\n}\n\nexport interface Route {\n pools: PoolInfo[];\n amountIn: string;\n amountOut: string;\n}\n\nexport interface PoolInfo {\n pool_id: number;\n token_in: string;\n token_out: string;\n amount_in?: string;\n amount_out?: string;\n fee?: number;\n}\n\n/**\n * Base quote parameters (common to all routers)\n */\nexport interface BaseQuoteParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n /** Slippage tolerance in bps (e.g. 50 = 0.5%). */\n slippage: number;\n swapType?: \"EXACT_INPUT\" | \"EXACT_OUTPUT\";\n recipient?: string;\n}\n\n/**\n * Simple quote parameters (V1 NEAR, etc., no recipient required)\n */\nexport interface SimpleQuoteParams extends BaseQuoteParams {\n}\n\n/**\n * Recipient quote parameters (V2 NEAR, EVM, etc., recipient required)\n */\nexport interface RecipientQuoteParams extends BaseQuoteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (equals sender during quote, equals depositAddress during execution) */\n recipient: string;\n}\n\n/**\n * Unified quote parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type QuoteParams = SimpleQuoteParams | RecipientQuoteParams;\n\n/**\n * Type guard: check if recipient parameters are required\n */\nexport function requiresRecipient(\n params: QuoteParams\n): params is RecipientQuoteParams {\n return \"sender\" in params && \"recipient\" in params;\n}\n\nexport interface QuoteResult {\n success: boolean;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n amountOut: string;\n minAmountOut: string;\n routes: Route[];\n /**\n * Optional: Raw route data returned by chain router/aggregator\n * - Used for scenarios where aggregator-specific fields need to be passed through in executeSwap\n * - Kept optional to avoid tightly coupling implementation details into core logic\n */\n rawRoutes?: any[];\n priceImpact?: number;\n avgFee?: number;\n estimatedGas?: string;\n error?: string;\n \n // V2 Router specific fields (NEAR, EVM, etc.)\n routerMsg?: string;\n signature?: string;\n tokens?: string[];\n dexs?: string[];\n recipient?: string;\n slippage?: number;\n \n // EVM-specific fields (future extension)\n transactionData?: string;\n gasEstimate?: string;\n}\n\n/**\n * Base execute parameters (common to all routers)\n */\nexport interface BaseExecuteParams {\n quote: QuoteResult;\n recipient: string;\n depositAddress?: string;\n deadline?: number;\n /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\n}\n\n/**\n * Recipient execute parameters (V2 NEAR, EVM, etc.)\n */\nexport interface RecipientExecuteParams extends BaseExecuteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (usually depositAddress) */\n receiveUser: string;\n}\n\n/**\n * Unified execute parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type ExecuteParams = BaseExecuteParams | RecipientExecuteParams;\n\n/**\n * Type guard: check if execute parameters require recipient\n */\nexport function requiresRecipientInExecute(\n params: ExecuteParams\n): params is RecipientExecuteParams {\n return \"sender\" in params && \"receiveUser\" in params;\n}\n\nexport interface ExecuteResult {\n success: boolean;\n txHash?: string;\n txHashArray?: string[];\n error?: string;\n}\n\nexport type SupportedChain = \"near\" | \"evm\" | \"solana\";\n\n/**\n * Router capabilities\n * Used to declare router features and requirements\n */\nexport interface RouterCapabilities {\n /** Whether recipient parameters (sender/recipient) are required */\n requiresRecipient: boolean;\n /** Whether two API calls are needed (quote + finalize) */\n requiresFinalizeQuote: boolean;\n /** Whether complex token registration is required */\n requiresComplexRegistration: boolean;\n /** Supported chain */\n supportedChain: SupportedChain | string;\n}\n\n/**\n * DEX aggregator router abstract interface\n * Each chain/aggregator implements its own quote/executeSwap\n * \n * Extended to support common architecture:\n * - Capabilities (RouterCapabilities)\n * - Optional finalize quote method (finalizeQuote)\n * - Unified parameter interface (supports both simple and recipient modes)\n */\nexport interface DexRouter {\n getCapabilities(): RouterCapabilities;\n \n getSupportedChain(): SupportedChain | string;\n \n /**\n * Quote method\n * - Simple router: only needs BaseQuoteParams\n * - Recipient router: needs RecipientQuoteParams\n */\n quote(params: QuoteParams): Promise<QuoteResult>;\n \n /**\n * Execute swap\n * - Simple router: only needs BaseExecuteParams\n * - Recipient router: needs RecipientExecuteParams\n */\n executeSwap(params: ExecuteParams): Promise<ExecuteResult>;\n \n /**\n * Finalize quote (if two API calls are needed)\n * - Only implemented when requiresFinalizeQuote = true\n * - Used to call API again after getting depositAddress\n */\n finalizeQuote?(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult>;\n}\n\n/**\n * Bluechip token configuration\n */\nexport interface BluechipTokenConfig {\n address: string;\n symbol: string;\n decimals: number;\n assetId?: string; // AssetId for NearIntents (may include nep141: prefix)\n}\n\n/**\n * Bluechip tokens list configuration\n */\nexport interface BluechipTokensConfig {\n USDT?: BluechipTokenConfig;\n USDC?: BluechipTokenConfig;\n NEAR?: BluechipTokenConfig;\n [key: string]: BluechipTokenConfig | undefined;\n}\n","/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\n/**\n * Format gas value from yoctoNEAR to Tgas string, avoiding scientific notation.\n * @param gasInYoctoNEAR Gas value in yoctoNEAR (string or number)\n * @returns Formatted gas string in Tgas units (e.g., \"795\" for 795 Tgas)\n */\nexport function formatGasToTgas(gasInYoctoNEAR: string | number): string {\n if (!gasInYoctoNEAR) return \"0\";\n \n // Convert to string first to handle both string and number inputs\n const gasStr = String(gasInYoctoNEAR);\n \n // Check if it's already in scientific notation\n if (/[eE]/.test(gasStr)) {\n // Parse scientific notation manually to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n return (newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos)).replace(/\\.?0+$/, \"\");\n }\n }\n }\n }\n \n // Convert yoctoNEAR to Tgas (1 Tgas = 10^12 yoctoNEAR)\n // Use BigInt for precise integer division\n try {\n const gasBigInt = BigInt(gasStr.split(\".\")[0]); // Take integer part only\n const tgasBigInt = gasBigInt / BigInt(\"1000000000000\");\n return tgasBigInt.toString();\n } catch (error) {\n return \"0\";\n }\n}\n\n/**\n * Ensure gas value is a string without scientific notation.\n * This is used to format gas values before passing to wallet selector.\n * @param gas Gas value (string, number, or BigInt)\n * @returns Formatted gas string in yoctoNEAR\n */\nexport function formatGasString(gas: string | number | bigint): string {\n if (typeof gas === \"bigint\") {\n return gas.toString();\n }\n \n const gasStr = String(gas);\n \n // If already a clean string without scientific notation, return as is\n if (!/[eE]/.test(gasStr) && !gasStr.includes(\".\")) {\n return gasStr;\n }\n \n // Handle scientific notation\n if (/[eE]/.test(gasStr)) {\n // Use manual parsing to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n const result = newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos);\n return result.replace(/\\.?0+$/, \"\").replace(/\\.$/, \"\");\n }\n } else if (exponent < 0) {\n // Negative exponent: move decimal point left\n const absExp = Math.abs(exponent);\n const zerosToAdd = absExp - intPart.length;\n if (zerosToAdd > 0) {\n return \"0.\" + \"0\".repeat(zerosToAdd - 1) + intPart.replace(/^-/, \"\") + fracPart;\n } else {\n const pointPos = intPart.length - absExp;\n return intPart.slice(0, pointPos) + \".\" + intPart.slice(pointPos) + fracPart;\n }\n }\n }\n }\n \n // Handle decimal numbers - convert to integer string\n if (gasStr.includes(\".\")) {\n const [intPart, fracPart = \"\"] = gasStr.split(\".\");\n return intPart + fracPart;\n }\n \n return gasStr;\n}\n\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n RouterCapabilities,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n supportLedger: false,\n });\n\n if (\n response?.result_code !== 0 ||\n !response?.result_data?.routes?.length\n ) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: response?.result_msg || response?.result_message || \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = response.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: false,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"near\",\n };\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** V2 Router implementation (Aggregate DEX Router). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n SwapMultiDexPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface AggregateDexRouterConfig {\n swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\n/**\n * V2 Router implementation for NEAR\n * Uses Aggregate DEX contract for routing\n */\nexport class AggregateDexRouter implements DexRouter {\n private swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private aggregateDexContractId: string;\n private wrapNearContractId: string;\n private readonly NEW_ACCOUNT_STORAGE_COST = \"1250000000000000000000\"; // 0.00125 NEAR in yoctoNEAR\n private readonly ONE_YOCTO_NEAR = \"1\";\n\n constructor(config: AggregateDexRouterConfig) {\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || \"\";\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n\n if (!this.aggregateDexContractId) {\n // AGGREGATE_DEX_CONTRACT_ID not configured\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: true,\n supportedChain: \"near\",\n };\n }\n\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n\n /**\n * Get a swap quote from V2 Router API\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n if (!requiresRecipient(params)) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.swapMultiDexPathAdapter.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n user: sender,\n receiveUser: recipient,\n });\n\n if (response.result_code !== 0 || !response.result_data) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n\n const {\n amount_in,\n amount_out,\n min_amount_out,\n msg,\n signature,\n tokens,\n dexs,\n } = response.result_data;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: amount_in || amountIn,\n amountOut: amount_out || \"0\",\n minAmountOut: min_amount_out || \"0\",\n routes: [],\n routerMsg: msg,\n signature: signature,\n tokens: tokens || [],\n dexs: dexs || [],\n recipient: recipient,\n slippage: slippage,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n }\n\n /**\n * @deprecated No longer needed. Kept for interface compatibility only.\n */\n async finalizeQuote(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult> {\n if (!requiresRecipient(params)) {\n throw new Error(\"V2 Router requires recipient parameters\");\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(\"Failed to get quote\");\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"Missing sender or receiveUser\",\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: \"Missing receiveUser\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: \"Invalid receiveUser address\",\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n \n const finalQuoteParams: QuoteParams = {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuote: QuoteResult;\n try {\n finalQuote = await this.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const routerMsg = finalQuote.routerMsg;\n const signature = finalQuote.signature;\n\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const tokens = finalQuote.tokens || [];\n const dexs = finalQuote.dexs || [];\n\n const transactions: Array<{\n contractId: string;\n methodName: string;\n args: any;\n gas?: string;\n expandDeposit?: string;\n }> = [];\n\n const getStorageBalance = async (\n tokenId: string,\n accountId: string\n ): Promise<any> => {\n try {\n return await this.nearChainAdapter.view({\n contractId: tokenId,\n methodName: \"storage_balance_of\",\n args: { account_id: accountId },\n });\n } catch (error) {\n return null;\n }\n };\n\n // 1. Convert NEAR to wNEAR if tokenIn is native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\n\n if (isNativeNear) {\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: finalQuote.amountIn,\n });\n }\n\n // 2. Check if user is registered in each token\n const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];\n const tokenStorageBalances = await Promise.all(\n tokensToCheck.map((tokenId) =>\n getStorageBalance(tokenId, sender).catch(() => null)\n )\n );\n\n tokensToCheck.forEach((tokenId, index) => {\n if (!tokenStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 3. Check if receiveUser is registered in tokenOut\n if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\n transactions.push({\n contractId: finalQuote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: receiveUser,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n }\n\n // 4. Check if AGGREGATE_DEX_CONTRACT_ID is registered in each token\n const aggregateDexStorageBalances = await Promise.all(\n tokens.map((tokenId) =>\n getStorageBalance(tokenId, this.aggregateDexContractId).catch(\n () => null\n )\n )\n );\n\n tokens.forEach((tokenId, index) => {\n if (!aggregateDexStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: this.aggregateDexContractId,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 5. Check if tokens are registered in aggregate dex (only for sender, not receiveUser)\n if (tokens.length > 0) {\n const registeredStatus = await this.queryUserTokensRegistered({\n user: sender,\n tokens,\n });\n\n const unregisteredTokens = tokens.filter(\n (_, index) => !registeredStatus[index]\n );\n\n if (unregisteredTokens.length > 0) {\n const depositPerToken = new Big(\"0.005\").mul(\n new Big(\"1000000000000000000000000\")\n );\n const totalDeposit = depositPerToken.mul(unregisteredTokens.length);\n\n transactions.push({\n contractId: this.aggregateDexContractId,\n methodName: \"tokens_storage_deposit\",\n args: {\n user: sender,\n tokens: unregisteredTokens,\n },\n gas: \"30000000000000\",\n expandDeposit: totalDeposit.toFixed(0),\n });\n }\n }\n\n // 6. Main swap transaction\n // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.signature,\n });\n\n transactions.push({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.aggregateDexContractId,\n amount: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n }\n\n\n private async queryUserTokensRegistered({\n user,\n tokens,\n }: {\n user: string;\n tokens: string[];\n }): Promise<boolean[]> {\n try {\n return await this.nearChainAdapter.view({\n contractId: this.aggregateDexContractId,\n methodName: \"query_user_tokens_registered\",\n args: {\n user,\n tokens,\n },\n });\n } catch (error) {\n return tokens.map(() => false);\n }\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport {\n TokenInfo,\n QuoteResult,\n DexRouter,\n BluechipTokensConfig,\n QuoteParams,\n} from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n}\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\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"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 };\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\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain: _sourceChain, // Reserved for future use\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n customRecipientMsg,\n appFees,\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 if (routers.length === 0) {\n throw new Error(\"At least one DEX router is required\");\n }\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for V2 Router\");\n }\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n // Check if token supports Intents:\n // 1. Custom checker (e.g., from nearTokenInList)\n // 2. Bluechip token checker (fallback)\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n // Prepare all quote paths for parallel execution\n // If token supports Intents, we have 3 paths: V1+Intents, V2+Intents, Direct Intents\n // If token doesn't support Intents, we have 2 paths: V1+Intents, V2+Intents\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n // Path 1 & 2: V1/V2 Router + Intents (always available)\n routers.forEach((router, index) => {\n const routeType: \"v1\" | \"v2\" = index === 0 ? \"v1\" : \"v2\";\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 // Step 1: Get pre-swap quote\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Step 2: Get Intents quote with pre-swap output\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n const normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\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: preSwapQuote.amountOut,\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(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n });\n\n // Path 3: Direct Intents (only if token supports Intents)\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n // Normalize source asset\n let normalizedSourceAsset: string;\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\n } else if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n // Execute all paths in parallel\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n // Process results\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Select path with maximum finalAmountOut\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\n const depositAddress =\n bestPath.intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\n .map((r, index) => {\n if (r.status === \"rejected\") {\n return `Router ${index}: ${r.reason}`;\n }\n if (r.status === \"fulfilled\" && !r.value.success) {\n return `Router ${index}: ${r.value.error}`;\n }\n return null;\n })\n .filter(Boolean);\n throw new Error(`All router quotes failed: ${errors.join(\"; \")}`);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/chains/near/AggregateDexRouter.ts","../src/integration/completeQuote.ts","../src/integration/quoteSameChainSwap.ts"],"names":["Big"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Cross-chain DEX aggregation SDK core type definitions\n */\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n chain: string;\n}\n\nexport interface Route {\n pools: PoolInfo[];\n amountIn: string;\n amountOut: string;\n}\n\nexport interface PoolInfo {\n pool_id: number;\n token_in: string;\n token_out: string;\n amount_in?: string;\n amount_out?: string;\n fee?: number;\n}\n\n/**\n * Base quote parameters (common to all routers)\n */\nexport interface BaseQuoteParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n /** Slippage tolerance in bps (e.g. 50 = 0.5%). */\n slippage: number;\n swapType?: \"EXACT_INPUT\" | \"EXACT_OUTPUT\";\n recipient?: string;\n}\n\n/**\n * Simple quote parameters (V1 NEAR, etc., no recipient required)\n */\nexport interface SimpleQuoteParams extends BaseQuoteParams {\n}\n\n/**\n * Recipient quote parameters (V2 NEAR, EVM, etc., recipient required)\n */\nexport interface RecipientQuoteParams extends BaseQuoteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (equals sender during quote, equals depositAddress during execution) */\n recipient: string;\n}\n\n/**\n * Unified quote parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type QuoteParams = SimpleQuoteParams | RecipientQuoteParams;\n\n/**\n * Type guard: check if recipient parameters are required\n */\nexport function requiresRecipient(\n params: QuoteParams\n): params is RecipientQuoteParams {\n return \"sender\" in params && \"recipient\" in params;\n}\n\nexport interface QuoteResult {\n success: boolean;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n amountOut: string;\n minAmountOut: string;\n routes: Route[];\n /**\n * Optional: Raw route data returned by chain router/aggregator\n * - Used for scenarios where aggregator-specific fields need to be passed through in executeSwap\n * - Kept optional to avoid tightly coupling implementation details into core logic\n */\n rawRoutes?: any[];\n priceImpact?: number;\n avgFee?: number;\n estimatedGas?: string;\n error?: string;\n \n // V2 Router specific fields (NEAR, EVM, etc.)\n routerMsg?: string;\n signature?: string;\n tokens?: string[];\n dexs?: string[];\n recipient?: string;\n slippage?: number;\n \n // EVM-specific fields (future extension)\n transactionData?: string;\n gasEstimate?: string;\n}\n\n/**\n * Base execute parameters (common to all routers)\n */\nexport interface BaseExecuteParams {\n quote: QuoteResult;\n recipient: string;\n depositAddress?: string;\n deadline?: number;\n /** Optional sender address (for native NEAR wrap operations) */\n sender?: string;\n}\n\n/**\n * Recipient execute parameters (V2 NEAR, EVM, etc.)\n */\nexport interface RecipientExecuteParams extends BaseExecuteParams {\n /** Sender address (current user) */\n sender: string;\n /** Recipient address (usually depositAddress) */\n receiveUser: string;\n}\n\n/**\n * Unified execute parameters (union type)\n * Supports both simple and recipient modes\n */\nexport type ExecuteParams = BaseExecuteParams | RecipientExecuteParams;\n\n/**\n * Type guard: check if execute parameters require recipient\n */\nexport function requiresRecipientInExecute(\n params: ExecuteParams\n): params is RecipientExecuteParams {\n return \"sender\" in params && \"receiveUser\" in params;\n}\n\nexport interface ExecuteResult {\n success: boolean;\n txHash?: string;\n txHashArray?: string[];\n error?: string;\n}\n\nexport type SupportedChain = \"near\" | \"evm\" | \"solana\";\n\n/**\n * Router capabilities\n * Used to declare router features and requirements\n */\nexport interface RouterCapabilities {\n /** Whether recipient parameters (sender/recipient) are required */\n requiresRecipient: boolean;\n /** Whether two API calls are needed (quote + finalize) */\n requiresFinalizeQuote: boolean;\n /** Whether complex token registration is required */\n requiresComplexRegistration: boolean;\n /** Supported chain */\n supportedChain: SupportedChain | string;\n}\n\n/**\n * DEX aggregator router abstract interface\n * Each chain/aggregator implements its own quote/executeSwap\n * \n * Extended to support common architecture:\n * - Capabilities (RouterCapabilities)\n * - Optional finalize quote method (finalizeQuote)\n * - Unified parameter interface (supports both simple and recipient modes)\n */\nexport interface DexRouter {\n getCapabilities(): RouterCapabilities;\n \n getSupportedChain(): SupportedChain | string;\n \n /**\n * Quote method\n * - Simple router: only needs BaseQuoteParams\n * - Recipient router: needs RecipientQuoteParams\n */\n quote(params: QuoteParams): Promise<QuoteResult>;\n \n /**\n * Execute swap\n * - Simple router: only needs BaseExecuteParams\n * - Recipient router: needs RecipientExecuteParams\n */\n executeSwap(params: ExecuteParams): Promise<ExecuteResult>;\n \n /**\n * Finalize quote (if two API calls are needed)\n * - Only implemented when requiresFinalizeQuote = true\n * - Used to call API again after getting depositAddress\n */\n finalizeQuote?(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult>;\n}\n\n/**\n * Bluechip token configuration\n */\nexport interface BluechipTokenConfig {\n address: string;\n symbol: string;\n decimals: number;\n assetId?: string; // AssetId for NearIntents (may include nep141: prefix)\n}\n\n/**\n * Bluechip tokens list configuration\n */\nexport interface BluechipTokensConfig {\n USDT?: BluechipTokenConfig;\n USDC?: BluechipTokenConfig;\n NEAR?: BluechipTokenConfig;\n [key: string]: BluechipTokenConfig | undefined;\n}\n","/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n // Extract nep141:xxx from 1cs_v1:near:nep141:xxx format\n if (assetId.startsWith(\"1cs_v1:\")) {\n const parts = assetId.split(\":\");\n const nep141Index = parts.findIndex((p) => p === \"nep141\");\n if (nep141Index >= 0 && nep141Index < parts.length - 1) {\n return `nep141:${parts.slice(nep141Index + 1).join(\":\")}`;\n }\n }\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\n/**\n * Format gas value from yoctoNEAR to Tgas string, avoiding scientific notation.\n * @param gasInYoctoNEAR Gas value in yoctoNEAR (string or number)\n * @returns Formatted gas string in Tgas units (e.g., \"795\" for 795 Tgas)\n */\nexport function formatGasToTgas(gasInYoctoNEAR: string | number): string {\n if (!gasInYoctoNEAR) return \"0\";\n \n // Convert to string first to handle both string and number inputs\n const gasStr = String(gasInYoctoNEAR);\n \n // Check if it's already in scientific notation\n if (/[eE]/.test(gasStr)) {\n // Parse scientific notation manually to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n return (newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos)).replace(/\\.?0+$/, \"\");\n }\n }\n }\n }\n \n // Convert yoctoNEAR to Tgas (1 Tgas = 10^12 yoctoNEAR)\n // Use BigInt for precise integer division\n try {\n const gasBigInt = BigInt(gasStr.split(\".\")[0]); // Take integer part only\n const tgasBigInt = gasBigInt / BigInt(\"1000000000000\");\n return tgasBigInt.toString();\n } catch (error) {\n return \"0\";\n }\n}\n\n/**\n * Ensure gas value is a string without scientific notation.\n * This is used to format gas values before passing to wallet selector.\n * @param gas Gas value (string, number, or BigInt)\n * @returns Formatted gas string in yoctoNEAR\n */\nexport function formatGasString(gas: string | number | bigint): string {\n if (typeof gas === \"bigint\") {\n return gas.toString();\n }\n \n const gasStr = String(gas);\n \n // If already a clean string without scientific notation, return as is\n if (!/[eE]/.test(gasStr) && !gasStr.includes(\".\")) {\n return gasStr;\n }\n \n // Handle scientific notation\n if (/[eE]/.test(gasStr)) {\n // Use manual parsing to avoid precision loss\n const match = gasStr.match(/^([+-]?\\d*\\.?\\d+)[eE]([+-]?\\d+)$/);\n if (match) {\n const base = match[1];\n const exponent = parseInt(match[2], 10);\n const [intPart, fracPart = \"\"] = base.split(\".\");\n \n if (exponent > 0) {\n // Positive exponent: move decimal point right\n const newIntPart = intPart + fracPart;\n const zerosToAdd = exponent - fracPart.length;\n if (zerosToAdd > 0) {\n return (newIntPart + \"0\".repeat(zerosToAdd)).replace(/^0+/, \"\") || \"0\";\n } else {\n const pointPos = intPart.length + exponent;\n const result = newIntPart.slice(0, pointPos) + \".\" + newIntPart.slice(pointPos);\n return result.replace(/\\.?0+$/, \"\").replace(/\\.$/, \"\");\n }\n } else if (exponent < 0) {\n // Negative exponent: move decimal point left\n const absExp = Math.abs(exponent);\n const zerosToAdd = absExp - intPart.length;\n if (zerosToAdd > 0) {\n return \"0.\" + \"0\".repeat(zerosToAdd - 1) + intPart.replace(/^-/, \"\") + fracPart;\n } else {\n const pointPos = intPart.length - absExp;\n return intPart.slice(0, pointPos) + \".\" + intPart.slice(pointPos) + fracPart;\n }\n }\n }\n }\n \n // Handle decimal numbers - convert to integer string\n if (gasStr.includes(\".\")) {\n const [intPart, fracPart = \"\"] = gasStr.split(\".\");\n return intPart + fracPart;\n }\n \n return gasStr;\n}\n\nimport Big from \"big.js\";\n\n/**\n * Select the best quote from multiple quotes based on maximum amountOut\n */\nexport function selectBestQuote<T extends { amountOut: string }, R = any>(\n quotes: Array<{ quote: T; router: R }>\n): { quote: T; router: R } {\n return quotes.reduce((best, current) => {\n const bestAmount = new Big(best.quote.amountOut);\n const currentAmount = new Big(current.quote.amountOut);\n return currentAmount.gt(bestAmount) ? current : best;\n });\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n RouterCapabilities,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n supportLedger: false,\n });\n\n if (\n response?.result_code !== 0 ||\n !response?.result_data?.routes?.length\n ) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: response?.result_msg || response?.result_message || \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = response.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n const sender = params.sender || finalRecipient;\n\n const transactions: any[] = [];\n\n const isNativeNear =\n quote.tokenIn.address === \"near\" ||\n (quote.tokenIn.address === this.wrapNearContractId &&\n quote.tokenIn.symbol === \"NEAR\") ||\n (!quote.tokenIn.address && quote.tokenIn.symbol === \"NEAR\");\n\n if (isNativeNear) {\n let wrapNearStorageBalance = null;\n try {\n wrapNearStorageBalance = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"storage_balance_of\",\n args: {\n account_id: sender,\n },\n });\n } catch (err) {\n wrapNearStorageBalance = null;\n }\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: \"1250000000000000000000\", // 0.00125 NEAR\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: quote.amountIn,\n });\n }\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n const tokenInAddress = isNativeNear\n ? this.wrapNearContractId\n : quote.tokenIn.address;\n\n transactions.push({\n contractId: tokenInAddress,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: false,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: false,\n supportedChain: \"near\",\n };\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** V2 Router implementation (Aggregate DEX Router). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n DexRouter,\n RouterCapabilities,\n requiresRecipient,\n requiresRecipientInExecute,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport {\n SwapMultiDexPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n} from \"../../adapters/types\";\n\nexport interface AggregateDexRouterConfig {\n swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\n/**\n * V2 Router implementation for NEAR\n * Uses Aggregate DEX contract for routing\n */\nexport class AggregateDexRouter implements DexRouter {\n private swapMultiDexPathAdapter: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private aggregateDexContractId: string;\n private wrapNearContractId: string;\n private readonly NEW_ACCOUNT_STORAGE_COST = \"1250000000000000000000\"; // 0.00125 NEAR in yoctoNEAR\n private readonly ONE_YOCTO_NEAR = \"1\";\n\n constructor(config: AggregateDexRouterConfig) {\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || \"\";\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n\n if (!this.aggregateDexContractId) {\n // AGGREGATE_DEX_CONTRACT_ID not configured\n }\n }\n\n /**\n * Get Router capabilities\n */\n getCapabilities(): RouterCapabilities {\n return {\n requiresRecipient: true,\n requiresFinalizeQuote: false,\n requiresComplexRegistration: true,\n supportedChain: \"near\",\n };\n }\n\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n\n /**\n * Get a swap quote from V2 Router API\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n if (!requiresRecipient(params)) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n const { tokenIn, tokenOut, amountIn, slippage, sender, recipient } = params;\n\n if (!sender || !recipient) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing sender or recipient\",\n };\n }\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Invalid token address\",\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n const response = await this.swapMultiDexPathAdapter.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n user: sender,\n receiveUser: recipient,\n });\n\n if (response.result_code !== 0 || !response.result_data) {\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n\n const {\n amount_in,\n amount_out,\n min_amount_out,\n msg,\n signature,\n tokens,\n dexs,\n } = response.result_data;\n\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn: amount_in || amountIn,\n amountOut: amount_out || \"0\",\n minAmountOut: min_amount_out || \"0\",\n routes: [],\n routerMsg: msg,\n signature: signature,\n tokens: tokens || [],\n dexs: dexs || [],\n recipient: recipient,\n slippage: slippage,\n };\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Failed to get quote\",\n };\n }\n }\n\n /**\n * @deprecated No longer needed. Kept for interface compatibility only.\n */\n async finalizeQuote(\n params: QuoteParams,\n depositAddress: string\n ): Promise<QuoteResult> {\n if (!requiresRecipient(params)) {\n throw new Error(\"V2 Router requires recipient parameters\");\n }\n\n return await this.quote({\n ...params,\n recipient: depositAddress,\n });\n }\n\n private async reFetchQuoteWithBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n _context: string\n ): Promise<QuoteResult> {\n const balanceBig = new Big(actualBalance);\n const adjustedParams: QuoteParams = {\n ...quoteParams,\n amountIn: balanceBig.toFixed(0),\n };\n\n\n const adjustedQuote = await this.quote(adjustedParams);\n if (adjustedQuote.success && adjustedQuote.routerMsg && adjustedQuote.signature) {\n return adjustedQuote;\n } else {\n throw new Error(\"Failed to get quote\");\n }\n }\n\n private async ensureQuoteAmountWithinBalance(\n quoteParams: QuoteParams,\n actualBalance: string,\n context: string\n ): Promise<QuoteResult> {\n const requestedAmountBig = new Big(quoteParams.amountIn);\n const balanceBig = new Big(actualBalance);\n\n // Check if tokenIn is native NEAR\n // We need to reserve gas for native NEAR transactions because they include multiple storage_deposits\n // and the transfer itself requires gas.\n const isNativeNear =\n (quoteParams.tokenIn.symbol === \"NEAR\" ||\n quoteParams.tokenIn.address === \"near\" ||\n (!quoteParams.tokenIn.address && quoteParams.tokenIn.symbol === \"NEAR\")) &&\n quoteParams.tokenIn.address !== this.wrapNearContractId;\n\n let effectiveBalanceBig = balanceBig;\n let effectiveBalanceStr = actualBalance;\n\n // Reserve 0.05 NEAR for gas and storage costs for native NEAR\n if (isNativeNear) {\n const reserveAmount = new Big(\"50000000000000000000000\"); \n if (balanceBig.gt(reserveAmount)) {\n effectiveBalanceBig = balanceBig.minus(reserveAmount);\n effectiveBalanceStr = effectiveBalanceBig.toFixed(0);\n } else {\n effectiveBalanceBig = new Big(0);\n effectiveBalanceStr = \"0\";\n }\n }\n\n if (requestedAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n\n if (balanceBig.gt(0) && requestedAmountBig.lt(balanceBig)) {\n const diff = balanceBig.minus(requestedAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n const quote = await this.quote(quoteParams);\n if (!quote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n if (quote.amountIn !== quoteParams.amountIn) {\n const apiAmountBig = new Big(quote.amountIn);\n if (apiAmountBig.gt(effectiveBalanceBig) && balanceBig.gt(0)) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n \n if (apiAmountBig.lt(balanceBig) && balanceBig.gt(0)) {\n const diff = balanceBig.minus(apiAmountBig);\n const diffPercent = diff.div(balanceBig).times(100);\n const isMaxSwap = diffPercent.lt(0.1) || diff.lt(1000);\n \n if (isMaxSwap) {\n return await this.reFetchQuoteWithBalance(quoteParams, effectiveBalanceStr, context);\n }\n }\n }\n\n return quote;\n }\n\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n if (!requiresRecipientInExecute(params)) {\n return {\n success: false,\n error: \"Missing sender or receiveUser\",\n };\n }\n\n const { quote, sender, receiveUser } = params;\n\n if (!quote.success) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n if (!receiveUser || receiveUser.trim() === \"\") {\n return {\n success: false,\n error: \"Missing receiveUser\",\n };\n }\n\n if (receiveUser.startsWith(\"0x\") && receiveUser.length === 42) {\n return {\n success: false,\n error: \"Invalid receiveUser address\",\n };\n }\n\n const slippage = quote.slippage || 0.005;\n \n let tokenBalanceAtExecution = \"0\";\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: quote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n \n const finalQuoteParams: QuoteParams = {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuote: QuoteResult;\n try {\n finalQuote = await this.ensureQuoteAmountWithinBalance(\n finalQuoteParams,\n tokenBalanceAtExecution,\n \"Re-fetching quote with receiveUser\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const routerMsg = finalQuote.routerMsg;\n const signature = finalQuote.signature;\n\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const tokens = finalQuote.tokens || [];\n const dexs = finalQuote.dexs || [];\n\n const transactions: Array<{\n contractId: string;\n methodName: string;\n args: any;\n gas?: string;\n expandDeposit?: string;\n }> = [];\n\n const getStorageBalance = async (\n tokenId: string,\n accountId: string\n ): Promise<any> => {\n try {\n return await this.nearChainAdapter.view({\n contractId: tokenId,\n methodName: \"storage_balance_of\",\n args: { account_id: accountId },\n });\n } catch (error) {\n return null;\n }\n };\n\n // 1. Convert NEAR to wNEAR if tokenIn is native NEAR\n const isNativeNear =\n (finalQuote.tokenIn.symbol === \"NEAR\" ||\n finalQuote.tokenIn.address === \"near\" ||\n (!finalQuote.tokenIn.address && finalQuote.tokenIn.symbol === \"NEAR\")) &&\n finalQuote.tokenIn.address !== this.wrapNearContractId;\n\n if (isNativeNear) {\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: finalQuote.amountIn,\n });\n }\n\n // 1.5. Handle case where tokenIn is wNEAR but user doesn't have wNEAR balance\n // If tokenIn is wNEAR, check balance and convert NEAR to wNEAR if needed\n const isWrappedNear =\n finalQuote.tokenIn.address === this.wrapNearContractId ||\n (finalQuote.tokenIn.symbol === \"WNEAR\" &&\n finalQuote.tokenIn.address === this.wrapNearContractId);\n\n if (isWrappedNear && !isNativeNear) {\n // Check wNEAR balance\n let wNearBalance = \"0\";\n try {\n const wNearBalanceResult = await this.nearChainAdapter.view({\n contractId: this.wrapNearContractId,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n wNearBalance = wNearBalanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors, assume no balance\n }\n\n const requiredAmount = new Big(finalQuote.amountIn);\n const currentBalance = new Big(wNearBalance);\n\n // If user doesn't have enough wNEAR, convert NEAR to wNEAR\n if (currentBalance.lt(requiredAmount)) {\n // Calculate how much NEAR we need to convert\n const amountToConvert = requiredAmount.minus(currentBalance);\n\n // Check wrap.near storage balance\n const wrapNearStorageBalance = await getStorageBalance(\n this.wrapNearContractId,\n sender\n ).catch(() => null);\n\n if (!wrapNearStorageBalance) {\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n\n // Convert NEAR to wNEAR\n // Note: Gas fees will be deducted from NEAR balance automatically\n // If user doesn't have enough NEAR, this will fail at execution time\n // which is expected behavior\n transactions.push({\n contractId: this.wrapNearContractId,\n methodName: \"near_deposit\",\n args: {},\n gas: \"50000000000000\",\n expandDeposit: amountToConvert.toFixed(0),\n });\n }\n }\n\n // 2. Check if user is registered in each token\n const tokensToCheck = dexs.length > 1 ? tokens : [finalQuote.tokenOut.address];\n const tokenStorageBalances = await Promise.all(\n tokensToCheck.map((tokenId) =>\n getStorageBalance(tokenId, sender).catch(() => null)\n )\n );\n\n tokensToCheck.forEach((tokenId, index) => {\n if (!tokenStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: sender,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 3. Check if receiveUser is registered in tokenOut\n if (receiveUser && receiveUser !== sender) {\n const receiveUserStorageBalance = await getStorageBalance(\n finalQuote.tokenOut.address,\n receiveUser\n ).catch(() => null);\n\n if (!receiveUserStorageBalance) {\n transactions.push({\n contractId: finalQuote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: receiveUser,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n }\n\n // 4. Check if AGGREGATE_DEX_CONTRACT_ID is registered in each token\n const aggregateDexStorageBalances = await Promise.all(\n tokens.map((tokenId) =>\n getStorageBalance(tokenId, this.aggregateDexContractId).catch(\n () => null\n )\n )\n );\n\n tokens.forEach((tokenId, index) => {\n if (!aggregateDexStorageBalances[index]) {\n transactions.push({\n contractId: tokenId,\n methodName: \"storage_deposit\",\n args: {\n account_id: this.aggregateDexContractId,\n registration_only: true,\n },\n gas: \"50000000000000\",\n expandDeposit: this.NEW_ACCOUNT_STORAGE_COST,\n });\n }\n });\n\n // 5. Check if tokens are registered in aggregate dex (only for sender, not receiveUser)\n if (tokens.length > 0) {\n const registeredStatus = await this.queryUserTokensRegistered({\n user: sender,\n tokens,\n });\n\n const unregisteredTokens = tokens.filter(\n (_, index) => !registeredStatus[index]\n );\n\n if (unregisteredTokens.length > 0) {\n const depositPerToken = new Big(\"0.005\").mul(\n new Big(\"1000000000000000000000000\")\n );\n const totalDeposit = depositPerToken.mul(unregisteredTokens.length);\n\n transactions.push({\n contractId: this.aggregateDexContractId,\n methodName: \"tokens_storage_deposit\",\n args: {\n user: sender,\n tokens: unregisteredTokens,\n },\n gas: \"30000000000000\",\n expandDeposit: totalDeposit.toFixed(0),\n });\n }\n }\n\n // 6. Main swap transaction\n // Re-fetch balance right before execution (may have changed due to registration fees)\n try {\n const balanceResult = await this.nearChainAdapter.view({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_balance_of\",\n args: { account_id: sender },\n });\n tokenBalanceAtExecution = balanceResult || \"0\";\n } catch (e) {\n // Ignore balance fetch errors\n }\n const finalBalanceQuoteParams: QuoteParams = {\n tokenIn: finalQuote.tokenIn,\n tokenOut: finalQuote.tokenOut,\n amountIn: finalQuote.amountIn,\n slippage: slippage,\n sender: sender,\n recipient: receiveUser,\n };\n\n let finalQuoteForExecution: QuoteResult;\n try {\n finalQuoteForExecution = await this.ensureQuoteAmountWithinBalance(\n finalBalanceQuoteParams,\n tokenBalanceAtExecution,\n \"Final balance check before execution\"\n );\n } catch (error: any) {\n return {\n success: false,\n error: \"Failed to get quote\",\n };\n }\n\n const finalAmountToTransfer = finalQuoteForExecution.amountIn;\n const finalMsgString = JSON.stringify({\n msg: finalQuoteForExecution.routerMsg,\n signature: finalQuoteForExecution.signature,\n });\n\n transactions.push({\n contractId: finalQuote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.aggregateDexContractId,\n amount: finalAmountToTransfer,\n msg: finalMsgString,\n },\n gas: \"300000000000000\",\n expandDeposit: this.ONE_YOCTO_NEAR,\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: \"Execute swap failed\",\n };\n }\n }\n\n\n private async queryUserTokensRegistered({\n user,\n tokens,\n }: {\n user: string;\n tokens: string[];\n }): Promise<boolean[]> {\n try {\n return await this.nearChainAdapter.view({\n contractId: this.aggregateDexContractId,\n methodName: \"query_user_tokens_registered\",\n args: {\n user,\n tokens,\n },\n });\n } catch (error) {\n return tokens.map(() => false);\n }\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport {\n TokenInfo,\n QuoteResult,\n DexRouter,\n BluechipTokensConfig,\n QuoteParams,\n} from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n customRecipientMsg?: string;\n appFees?: Array<{ recipient: string; fee: number }>;\n}\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\";\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n routeType?: \"v1\" | \"v2\" | \"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 };\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\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain: _sourceChain, // Reserved for future use\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n customRecipientMsg,\n appFees,\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 if (routers.length === 0) {\n throw new Error(\"At least one DEX router is required\");\n }\n\n const userAddress = currentUserAddress || recipient;\n if (!userAddress) {\n throw new Error(\"currentUserAddress or recipient is required for V2 Router\");\n }\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n // Check if token supports Intents:\n // 1. Custom checker (e.g., from nearTokenInList)\n // 2. Bluechip token checker (fallback)\n const isTokenIntentsSupported = customIsIntentsSupportedToken\n ? customIsIntentsSupportedToken(sourceToken)\n : isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n // Prepare all quote paths for parallel execution\n // If token supports Intents, we have 3 paths: V1+Intents, V2+Intents, Direct Intents\n // If token doesn't support Intents, we have 2 paths: V1+Intents, V2+Intents\n const quotePaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n promise: Promise<{\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }>;\n router?: DexRouter;\n }> = [];\n\n // Path 1 & 2: V1/V2 Router + Intents (always available)\n routers.forEach((router, index) => {\n const routeType: \"v1\" | \"v2\" = index === 0 ? \"v1\" : \"v2\";\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 // Step 1: Get pre-swap quote\n const preSwapQuote = await router.quote(quoteParams);\n if (!preSwapQuote.success) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Step 2: Get Intents quote with pre-swap output\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n const normalizedSourceAsset = bluechipTokenConfig?.assetId\n ? bluechipTokenConfig.assetId\n : `nep141:${bluechipToken.address}`;\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\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: preSwapQuote.amountOut,\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(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n preSwapQuote,\n router,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n });\n\n // Path 3: Direct Intents (only if token supports Intents)\n if (isTokenIntentsSupported) {\n quotePaths.push({\n type: \"intents\",\n promise: (async () => {\n // Normalize source asset\n let normalizedSourceAsset: string;\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n // Keep 1cs_v1: format as is\n } else if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n if (!normalizedTargetAsset?.startsWith(\"1cs_v1:\")) {\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: amountIn,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: \"EXACT_INPUT\",\n ...(customRecipientMsg ? { customRecipientMsg } : {}),\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n throw new Error(\"Failed to get quote\");\n }\n\n return {\n intentsQuote,\n finalAmountOut:\n intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n })(),\n });\n }\n\n // Execute all paths in parallel\n const pathResults = await Promise.allSettled(\n quotePaths.map((p) => p.promise)\n );\n\n // Process results\n const validPaths: Array<{\n type: \"v1\" | \"v2\" | \"intents\";\n intentsQuote: any;\n preSwapQuote?: QuoteResult;\n router?: DexRouter;\n finalAmountOut: string;\n }> = [];\n\n pathResults.forEach((result, index) => {\n const pathType = quotePaths[index].type;\n if (result.status === \"fulfilled\") {\n validPaths.push({\n type: pathType,\n ...result.value,\n });\n }\n });\n\n if (validPaths.length === 0) {\n throw new Error(\"Failed to get quote\");\n }\n\n // Select path with maximum finalAmountOut\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\n const depositAddress =\n bestPath.intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: bestPath.intentsQuote,\n depositAddress,\n },\n preSwap:\n bestPath.preSwapQuote && bestPath.router\n ? {\n quote: bestPath.preSwapQuote,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: bestPath.router,\n routeType: bestPath.type as \"v1\" | \"v2\",\n }\n : undefined,\n finalAmountOut: bestPath.finalAmountOut,\n routeType: bestPath.type,\n };\n}\n","/**\n * Same-chain swap quote (NEAR -> NEAR)\n * Queries V1 and V2 routers in parallel and selects the best route based on maximum amountOut\n */\n\nimport { TokenInfo, QuoteParams, QuoteResult, DexRouter } from \"../types\";\nimport { selectBestQuote } from \"../utils\";\n\nexport interface QuoteSameChainSwapParams {\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n amountIn: string;\n slippage: number;\n recipient: string;\n currentUserAddress: string;\n}\n\nexport interface QuoteSameChainSwapResult {\n quote: QuoteResult;\n router: DexRouter;\n}\n\n/**\n * Quote same-chain swap (NEAR -> NEAR) by querying V1 and V2 routers in parallel\n * and selecting the best route based on maximum amountOut\n */\nexport async function quoteSameChainSwap(\n params: QuoteSameChainSwapParams,\n dexRouters: DexRouter[]\n): Promise<QuoteSameChainSwapResult> {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n recipient,\n currentUserAddress,\n } = params;\n\n // Query all routers in parallel\n const quoteResults = await Promise.allSettled(\n dexRouters.map((router) => {\n const capabilities = router.getCapabilities();\n const quoteParams: QuoteParams = capabilities.requiresRecipient\n ? {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n sender: currentUserAddress,\n recipient,\n }\n : {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient,\n };\n return router.quote(quoteParams);\n })\n );\n\n // Filter valid quotes\n const validQuotes = quoteResults\n .filter(\n (r): r is PromiseFulfilledResult<QuoteResult> =>\n r.status === \"fulfilled\" && r.value.success\n )\n .map((r, index) => ({\n quote: r.value,\n router: dexRouters[index],\n }));\n\n if (validQuotes.length === 0) {\n const errors = quoteResults\n .map((r, index) => {\n if (r.status === \"rejected\") {\n return `Router ${index}: ${r.reason}`;\n }\n if (r.status === \"fulfilled\" && !r.value.success) {\n return `Router ${index}: ${r.value.error}`;\n }\n return null;\n })\n .filter(Boolean);\n throw new Error(`All router quotes failed: ${errors.join(\"; \")}`);\n }\n\n // Select best quote (maximum amountOut)\n return selectBestQuote(validQuotes);\n}\n\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rhea-finance/cross-chain-aggregation-dex",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "TypeScript SDK for cross-chain DEX aggregation and routing on NEAR. Supports multi-DEX routing, automatic token registration, pre-swap handling, and NearIntents bridge integration for seamless cross-chain token swaps.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|