@rhea-finance/cross-chain-aggregation-dex 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -28,8 +28,8 @@ interface QuoteParams {
|
|
|
28
28
|
slippage: number;
|
|
29
29
|
swapType?: "EXACT_INPUT" | "EXACT_OUTPUT";
|
|
30
30
|
recipient?: string;
|
|
31
|
-
/**
|
|
32
|
-
|
|
31
|
+
/** Fallback account for SmartX user/receiveUser when recipient is absent. */
|
|
32
|
+
refundTo?: string;
|
|
33
33
|
}
|
|
34
34
|
interface QuoteResult {
|
|
35
35
|
success: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -28,8 +28,8 @@ interface QuoteParams {
|
|
|
28
28
|
slippage: number;
|
|
29
29
|
swapType?: "EXACT_INPUT" | "EXACT_OUTPUT";
|
|
30
30
|
recipient?: string;
|
|
31
|
-
/**
|
|
32
|
-
|
|
31
|
+
/** Fallback account for SmartX user/receiveUser when recipient is absent. */
|
|
32
|
+
refundTo?: string;
|
|
33
33
|
}
|
|
34
34
|
interface QuoteResult {
|
|
35
35
|
success: boolean;
|
package/dist/index.js
CHANGED
|
@@ -187,8 +187,7 @@ var NearSmartRouter = class {
|
|
|
187
187
|
slippage,
|
|
188
188
|
swapType: _swapType = "EXACT_INPUT",
|
|
189
189
|
// Currently not used, reserved for future use
|
|
190
|
-
recipient
|
|
191
|
-
accountId
|
|
190
|
+
recipient
|
|
192
191
|
} = params;
|
|
193
192
|
if (!tokenIn?.address || !tokenOut?.address) {
|
|
194
193
|
return {
|
|
@@ -234,7 +233,7 @@ var NearSmartRouter = class {
|
|
|
234
233
|
}
|
|
235
234
|
const slippageBps = convertSlippageToBasisPoints(slippage);
|
|
236
235
|
const slippageDecimalForApi = slippageBps / 1e4;
|
|
237
|
-
const smartxUser = recipient ||
|
|
236
|
+
const smartxUser = recipient || params.refundTo || "";
|
|
238
237
|
const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;
|
|
239
238
|
logger.debug("SmartRouter quote - Calling quote backends:", {
|
|
240
239
|
tokenIn: normalizedTokenIn,
|
|
@@ -547,7 +546,7 @@ var NearSmartRouter = class {
|
|
|
547
546
|
if (!isRegistered) {
|
|
548
547
|
logger.debug("SmartRouter - Registering recipient account:", {
|
|
549
548
|
contractId: quote.tokenOut.address,
|
|
550
|
-
|
|
549
|
+
account_id: finalRecipient
|
|
551
550
|
});
|
|
552
551
|
transactions.push({
|
|
553
552
|
contractId: quote.tokenOut.address,
|
|
@@ -683,7 +682,9 @@ async function completeQuote(params, config) {
|
|
|
683
682
|
tokenOut: bluechipToken,
|
|
684
683
|
amountIn,
|
|
685
684
|
slippage,
|
|
686
|
-
swapType: "EXACT_INPUT"
|
|
685
|
+
swapType: "EXACT_INPUT",
|
|
686
|
+
recipient: recipient || refundTo,
|
|
687
|
+
refundTo
|
|
687
688
|
});
|
|
688
689
|
if (!preSwapQuote.success) {
|
|
689
690
|
logger.error("DEX Aggregator - Pre-swap quote failed:", {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["smartxData","Big","transactions","finalRecipient","swapMsg","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n SwapMultiDexPathAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n /** Optional: SmartX quote adapter. When provided, quote() will compare results and return the best. */\n swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n private aggregateDexContractId?: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || undefined;\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n recipient,\n accountId,\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n // SmartX user/receiveUser fallback: recipient first, then accountId; if both missing, skip SmartX.\n const smartxUser = recipient || accountId || \"\";\n const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;\n\n logger.debug(\"SmartRouter quote - Calling quote backends:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n hasSmartX: canCallSmartX,\n smartxUser: smartxUser || \"none\",\n });\n\n const [findPathResp, smartxResp] = await Promise.all([\n this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n // v1 requires pathDeep=3 (handled by adapter implementation)\n supportLedger: false,\n }),\n canCallSmartX\n ? this.swapMultiDexPathAdapter!.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n chainId: 0,\n routerCount: 1,\n skipUnwrapNativeToken: false,\n user: smartxUser,\n receiveUser: smartxUser,\n })\n : Promise.resolve(null),\n ]);\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: findPathResp?.result_code,\n result_msg: findPathResp?.result_msg || findPathResp?.result_message,\n hasRoutes: !!findPathResp?.result_data?.routes?.length,\n });\n if (smartxResp) {\n logger.debug(\"SmartRouter quote - SmartX response:\", {\n result_code: smartxResp?.result_code,\n result_msg: smartxResp?.result_message,\n hasData: !!smartxResp?.result_data,\n });\n }\n\n if (\n findPathResp?.result_code !== 0 ||\n !findPathResp?.result_data?.routes?.length\n ) {\n // If v1 fails but SmartX succeeds, still return SmartX quote (quote-only; executeSwap is not supported yet).\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmt = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmt.lte(0) || smartxMin.lt(0)) {\n // treat as failure\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = findPathResp.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n const findPathQuote: QuoteResult = {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n quoteSource: \"findPath\",\n };\n\n // Compare with SmartX (if available) and return best amountOut. If SmartX wins, return quote-only result.\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmountOut = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n }\n\n return findPathQuote;\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (quote.quoteSource === \"smartx\") {\n const smartx = quote.smartxResult;\n const aggDexId = this.aggregateDexContractId;\n if (!smartx || !aggDexId) {\n return {\n success: false,\n error:\n \"SmartX quote missing execution context (smartxResult or aggregateDexContractId).\",\n };\n }\n\n if (!quote.tokenIn?.address) {\n return { success: false, error: \"tokenIn address is required\" };\n }\n\n const transactions: any[] = [];\n const finalRecipient = depositAddress || recipient;\n\n if (!finalRecipient) {\n return { success: false, error: \"recipient is required for SmartX execution\" };\n }\n\n // Collect tokens to check storage: SmartX tokens + tokenIn + tokenOut (if present)\n // SmartX tokens may include intermediate tokens used in the swap path\n const tokensToCheck = Array.from(\n new Set(\n [\n ...(smartx.tokens || []),\n quote.tokenIn.address || \"\",\n quote.tokenOut?.address || \"\",\n ].filter(Boolean)\n )\n );\n\n if (tokensToCheck.length === 0) {\n return {\n success: false,\n error: \"SmartX tokens list is empty, cannot proceed with execution\",\n };\n }\n\n const targets = [finalRecipient, aggDexId];\n\n // storage_deposit for each (token, target) if not registered\n // Check all tokens for both recipient and aggregate contract\n for (const token of tokensToCheck) {\n for (const target of targets) {\n if (!token || !target) continue;\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: token,\n methodName: \"storage_balance_of\",\n args: {\n account_id: target,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n // View call failure typically means not registered\n logger.debug(\n `Storage check failed for ${token} -> ${target}, assuming not registered:`,\n err\n );\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: token,\n methodName: \"storage_deposit\",\n args: {\n account_id: target,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n }\n\n const routerMsg = smartx.msg;\n const signature = smartx.signature;\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"SmartX smartxResult missing msg or signature.\",\n };\n }\n\n // Build ft_transfer_call to aggregate dex contract\n const swapMsg = {\n msg: routerMsg,\n signature: signature,\n };\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: aggDexId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"300000000000000\", // ~300 Tgas reference\n expandDeposit: \"1\", // 1 yoctoNEAR\n });\n\n const result = await this.nearChainAdapter.call({ transactions });\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n }\n return { success: false, error: result.message || \"Execute swap failed\" };\n }\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n accountId: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["smartxData","Big","transactions","finalRecipient","swapMsg","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n SwapMultiDexPathAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n /** Optional: SmartX quote adapter. When provided, quote() will compare results and return the best. */\n swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n private aggregateDexContractId?: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || undefined;\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n recipient,\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n // SmartX user/receiveUser fallback: recipient -> refundTo; if both missing, skip SmartX.\n const smartxUser = recipient || params.refundTo || \"\";\n const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;\n\n logger.debug(\"SmartRouter quote - Calling quote backends:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n hasSmartX: canCallSmartX,\n smartxUser: smartxUser || \"none\",\n });\n\n const [findPathResp, smartxResp] = await Promise.all([\n this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n // v1 requires pathDeep=3 (handled by adapter implementation)\n supportLedger: false,\n }),\n canCallSmartX\n ? this.swapMultiDexPathAdapter!.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n chainId: 0,\n routerCount: 1,\n skipUnwrapNativeToken: false,\n user: smartxUser,\n receiveUser: smartxUser,\n })\n : Promise.resolve(null),\n ]);\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: findPathResp?.result_code,\n result_msg: findPathResp?.result_msg || findPathResp?.result_message,\n hasRoutes: !!findPathResp?.result_data?.routes?.length,\n });\n if (smartxResp) {\n logger.debug(\"SmartRouter quote - SmartX response:\", {\n result_code: smartxResp?.result_code,\n result_msg: smartxResp?.result_message,\n hasData: !!smartxResp?.result_data,\n });\n }\n\n if (\n findPathResp?.result_code !== 0 ||\n !findPathResp?.result_data?.routes?.length\n ) {\n // If v1 fails but SmartX succeeds, still return SmartX quote (quote-only; executeSwap is not supported yet).\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmt = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmt.lte(0) || smartxMin.lt(0)) {\n // treat as failure\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = findPathResp.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n const findPathQuote: QuoteResult = {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n quoteSource: \"findPath\",\n };\n\n // Compare with SmartX (if available) and return best amountOut. If SmartX wins, return quote-only result.\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmountOut = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n }\n\n return findPathQuote;\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (quote.quoteSource === \"smartx\") {\n const smartx = quote.smartxResult;\n const aggDexId = this.aggregateDexContractId;\n if (!smartx || !aggDexId) {\n return {\n success: false,\n error:\n \"SmartX quote missing execution context (smartxResult or aggregateDexContractId).\",\n };\n }\n\n if (!quote.tokenIn?.address) {\n return { success: false, error: \"tokenIn address is required\" };\n }\n\n const transactions: any[] = [];\n const finalRecipient = depositAddress || recipient;\n\n if (!finalRecipient) {\n return { success: false, error: \"recipient is required for SmartX execution\" };\n }\n\n // Collect tokens to check storage: SmartX tokens + tokenIn + tokenOut (if present)\n // SmartX tokens may include intermediate tokens used in the swap path\n const tokensToCheck = Array.from(\n new Set(\n [\n ...(smartx.tokens || []),\n quote.tokenIn.address || \"\",\n quote.tokenOut?.address || \"\",\n ].filter(Boolean)\n )\n );\n\n if (tokensToCheck.length === 0) {\n return {\n success: false,\n error: \"SmartX tokens list is empty, cannot proceed with execution\",\n };\n }\n\n const targets = [finalRecipient, aggDexId];\n\n // storage_deposit for each (token, target) if not registered\n // Check all tokens for both recipient and aggregate contract\n for (const token of tokensToCheck) {\n for (const target of targets) {\n if (!token || !target) continue;\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: token,\n methodName: \"storage_balance_of\",\n args: {\n account_id: target,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n // View call failure typically means not registered\n logger.debug(\n `Storage check failed for ${token} -> ${target}, assuming not registered:`,\n err\n );\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: token,\n methodName: \"storage_deposit\",\n args: {\n account_id: target,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n }\n\n const routerMsg = smartx.msg;\n const signature = smartx.signature;\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"SmartX smartxResult missing msg or signature.\",\n };\n }\n\n // Build ft_transfer_call to aggregate dex contract\n const swapMsg = {\n msg: routerMsg,\n signature: signature,\n };\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: aggDexId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"300000000000000\", // ~300 Tgas reference\n expandDeposit: \"1\", // 1 yoctoNEAR\n });\n\n const result = await this.nearChainAdapter.call({ transactions });\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n }\n return { success: false, error: result.message || \"Execute swap failed\" };\n }\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n account_id: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient: recipient || refundTo,\n refundTo,\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -181,8 +181,7 @@ var NearSmartRouter = class {
|
|
|
181
181
|
slippage,
|
|
182
182
|
swapType: _swapType = "EXACT_INPUT",
|
|
183
183
|
// Currently not used, reserved for future use
|
|
184
|
-
recipient
|
|
185
|
-
accountId
|
|
184
|
+
recipient
|
|
186
185
|
} = params;
|
|
187
186
|
if (!tokenIn?.address || !tokenOut?.address) {
|
|
188
187
|
return {
|
|
@@ -228,7 +227,7 @@ var NearSmartRouter = class {
|
|
|
228
227
|
}
|
|
229
228
|
const slippageBps = convertSlippageToBasisPoints(slippage);
|
|
230
229
|
const slippageDecimalForApi = slippageBps / 1e4;
|
|
231
|
-
const smartxUser = recipient ||
|
|
230
|
+
const smartxUser = recipient || params.refundTo || "";
|
|
232
231
|
const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;
|
|
233
232
|
logger.debug("SmartRouter quote - Calling quote backends:", {
|
|
234
233
|
tokenIn: normalizedTokenIn,
|
|
@@ -541,7 +540,7 @@ var NearSmartRouter = class {
|
|
|
541
540
|
if (!isRegistered) {
|
|
542
541
|
logger.debug("SmartRouter - Registering recipient account:", {
|
|
543
542
|
contractId: quote.tokenOut.address,
|
|
544
|
-
|
|
543
|
+
account_id: finalRecipient
|
|
545
544
|
});
|
|
546
545
|
transactions.push({
|
|
547
546
|
contractId: quote.tokenOut.address,
|
|
@@ -677,7 +676,9 @@ async function completeQuote(params, config) {
|
|
|
677
676
|
tokenOut: bluechipToken,
|
|
678
677
|
amountIn,
|
|
679
678
|
slippage,
|
|
680
|
-
swapType: "EXACT_INPUT"
|
|
679
|
+
swapType: "EXACT_INPUT",
|
|
680
|
+
recipient: recipient || refundTo,
|
|
681
|
+
refundTo
|
|
681
682
|
});
|
|
682
683
|
if (!preSwapQuote.success) {
|
|
683
684
|
logger.error("DEX Aggregator - Pre-swap quote failed:", {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["smartxData","transactions","finalRecipient","swapMsg","result","Big"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n SwapMultiDexPathAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n /** Optional: SmartX quote adapter. When provided, quote() will compare results and return the best. */\n swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n private aggregateDexContractId?: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || undefined;\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n recipient,\n accountId,\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n // SmartX user/receiveUser fallback: recipient first, then accountId; if both missing, skip SmartX.\n const smartxUser = recipient || accountId || \"\";\n const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;\n\n logger.debug(\"SmartRouter quote - Calling quote backends:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n hasSmartX: canCallSmartX,\n smartxUser: smartxUser || \"none\",\n });\n\n const [findPathResp, smartxResp] = await Promise.all([\n this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n // v1 requires pathDeep=3 (handled by adapter implementation)\n supportLedger: false,\n }),\n canCallSmartX\n ? this.swapMultiDexPathAdapter!.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n chainId: 0,\n routerCount: 1,\n skipUnwrapNativeToken: false,\n user: smartxUser,\n receiveUser: smartxUser,\n })\n : Promise.resolve(null),\n ]);\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: findPathResp?.result_code,\n result_msg: findPathResp?.result_msg || findPathResp?.result_message,\n hasRoutes: !!findPathResp?.result_data?.routes?.length,\n });\n if (smartxResp) {\n logger.debug(\"SmartRouter quote - SmartX response:\", {\n result_code: smartxResp?.result_code,\n result_msg: smartxResp?.result_message,\n hasData: !!smartxResp?.result_data,\n });\n }\n\n if (\n findPathResp?.result_code !== 0 ||\n !findPathResp?.result_data?.routes?.length\n ) {\n // If v1 fails but SmartX succeeds, still return SmartX quote (quote-only; executeSwap is not supported yet).\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmt = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmt.lte(0) || smartxMin.lt(0)) {\n // treat as failure\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = findPathResp.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n const findPathQuote: QuoteResult = {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n quoteSource: \"findPath\",\n };\n\n // Compare with SmartX (if available) and return best amountOut. If SmartX wins, return quote-only result.\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmountOut = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n }\n\n return findPathQuote;\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (quote.quoteSource === \"smartx\") {\n const smartx = quote.smartxResult;\n const aggDexId = this.aggregateDexContractId;\n if (!smartx || !aggDexId) {\n return {\n success: false,\n error:\n \"SmartX quote missing execution context (smartxResult or aggregateDexContractId).\",\n };\n }\n\n if (!quote.tokenIn?.address) {\n return { success: false, error: \"tokenIn address is required\" };\n }\n\n const transactions: any[] = [];\n const finalRecipient = depositAddress || recipient;\n\n if (!finalRecipient) {\n return { success: false, error: \"recipient is required for SmartX execution\" };\n }\n\n // Collect tokens to check storage: SmartX tokens + tokenIn + tokenOut (if present)\n // SmartX tokens may include intermediate tokens used in the swap path\n const tokensToCheck = Array.from(\n new Set(\n [\n ...(smartx.tokens || []),\n quote.tokenIn.address || \"\",\n quote.tokenOut?.address || \"\",\n ].filter(Boolean)\n )\n );\n\n if (tokensToCheck.length === 0) {\n return {\n success: false,\n error: \"SmartX tokens list is empty, cannot proceed with execution\",\n };\n }\n\n const targets = [finalRecipient, aggDexId];\n\n // storage_deposit for each (token, target) if not registered\n // Check all tokens for both recipient and aggregate contract\n for (const token of tokensToCheck) {\n for (const target of targets) {\n if (!token || !target) continue;\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: token,\n methodName: \"storage_balance_of\",\n args: {\n account_id: target,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n // View call failure typically means not registered\n logger.debug(\n `Storage check failed for ${token} -> ${target}, assuming not registered:`,\n err\n );\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: token,\n methodName: \"storage_deposit\",\n args: {\n account_id: target,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n }\n\n const routerMsg = smartx.msg;\n const signature = smartx.signature;\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"SmartX smartxResult missing msg or signature.\",\n };\n }\n\n // Build ft_transfer_call to aggregate dex contract\n const swapMsg = {\n msg: routerMsg,\n signature: signature,\n };\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: aggDexId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"300000000000000\", // ~300 Tgas reference\n expandDeposit: \"1\", // 1 yoctoNEAR\n });\n\n const result = await this.nearChainAdapter.call({ transactions });\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n }\n return { success: false, error: result.message || \"Execute swap failed\" };\n }\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n accountId: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/index.ts","../src/chains/near/NearSmartRouter.ts","../src/integration/completeQuote.ts"],"names":["smartxData","transactions","finalRecipient","swapMsg","result","Big"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Simple logger utility with log level control\n * Can be controlled via environment variable LOG_LEVEL\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nfunction getLogLevel(): LogLevel {\n if (typeof process !== \"undefined\" && process.env?.LOG_LEVEL) {\n const level = process.env.LOG_LEVEL.toLowerCase() as LogLevel;\n if (LOG_LEVELS[level] !== undefined) {\n return level;\n }\n }\n // Default to 'warn' in production, 'debug' in development\n return typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n ? \"warn\"\n : \"debug\";\n}\n\nconst currentLogLevel = getLogLevel();\nconst currentLevelValue = LOG_LEVELS[currentLogLevel];\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] <= currentLevelValue;\n}\n\nexport const logger = {\n debug: (...args: any[]) => {\n if (shouldLog(\"debug\")) {\n console.debug(...args);\n }\n },\n info: (...args: any[]) => {\n if (shouldLog(\"info\")) {\n console.info(...args);\n }\n },\n warn: (...args: any[]) => {\n if (shouldLog(\"warn\")) {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (shouldLog(\"error\")) {\n console.error(...args);\n }\n },\n};\n","import { TokenInfo, BluechipTokensConfig } from \"../types\";\nimport { logger } from \"./logger\";\n\nlet bluechipTokensConfig: BluechipTokensConfig | null = null;\n\n/** Set the SDK-wide bluechip token config used for NearIntents compatibility and intermediate routing. */\nexport function setBluechipTokensConfig(config: BluechipTokensConfig): void {\n bluechipTokensConfig = config;\n}\n\n/** Get the bluechip token config; returns an empty object (and warns) if unset. */\nexport function getBluechipTokensConfig(): BluechipTokensConfig {\n if (!bluechipTokensConfig) {\n logger.warn(\n \"getBluechipTokensConfig - Bluechip tokens config not set, returning empty config\"\n );\n return {};\n }\n return bluechipTokensConfig;\n}\n\n/**\n * Normalize a NEAR asset id:\n * - strip `nep141:` prefix (if present)\n * - map `near` -> `wrap.near` (overridable via `wrapNearContractId`)\n */\nexport function normalizeTokenId(\n tokenId: string | undefined | null,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!tokenId) {\n logger.error(\"normalizeTokenId - Empty tokenId:\", tokenId);\n return \"\";\n }\n\n let normalized = tokenId.replace(/^nep141:/, \"\");\n\n // Note: `nep141:` has already been stripped above.\n if (normalized === \"near\") {\n normalized = wrapNearContractId;\n }\n\n if (!normalized) {\n logger.error(\"normalizeTokenId - Result is empty:\", {\n tokenId,\n normalized,\n });\n }\n\n return normalized;\n}\n\n/** True if the token matches a NearIntents-supported bluechip token (by symbol + address/assetId). */\nexport function isNearIntentsSupportedToken(\n token: TokenInfo,\n bluechipTokens?: BluechipTokensConfig\n): boolean {\n if (!token?.symbol || !token?.address) {\n return false;\n }\n\n const config = bluechipTokens || getBluechipTokensConfig();\n\n const normalizedSymbol = token.symbol.toUpperCase();\n\n const symbolKey =\n normalizedSymbol === \"NEAR\" || normalizedSymbol === \"WNEAR\"\n ? \"NEAR\"\n : normalizedSymbol;\n\n const tokenConfig = config[symbolKey as keyof typeof config];\n\n if (!tokenConfig) {\n return false;\n }\n\n const normalizeAddress = (addr: string) =>\n addr.replace(/^nep141:/, \"\").toLowerCase();\n const tokenAddress = normalizeAddress(token.address);\n const configAddress = normalizeAddress(tokenConfig.address || \"\");\n const configAssetId = tokenConfig.assetId\n ? normalizeAddress(tokenConfig.assetId)\n : \"\";\n\n return tokenAddress === configAddress || tokenAddress === configAssetId;\n}\n\n/** Pick an intermediate bluechip token (priority: USDT > USDC > wNEAR; fallback to `wrapNearContractId`). */\nexport function findBestBluechipToken(\n bluechipTokens: BluechipTokensConfig,\n wrapNearContractId: string = \"wrap.near\"\n): TokenInfo {\n const preferredTokens: TokenInfo[] = [];\n\n if (bluechipTokens.USDT?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDT.address,\n symbol: \"USDT\",\n decimals: bluechipTokens.USDT.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.USDC?.address) {\n preferredTokens.push({\n address: bluechipTokens.USDC.address,\n symbol: \"USDC\",\n decimals: bluechipTokens.USDC.decimals || 6,\n chain: \"near\",\n });\n }\n\n if (bluechipTokens.NEAR?.address) {\n preferredTokens.push({\n address: bluechipTokens.NEAR.address,\n symbol: \"wNEAR\",\n decimals: bluechipTokens.NEAR.decimals || 24,\n chain: \"near\",\n });\n }\n\n if (preferredTokens.length === 0) {\n logger.warn(\n \"findBestBluechipToken - No preferred tokens found, using wrap.near\"\n );\n return {\n address: wrapNearContractId,\n symbol: \"wNEAR\",\n decimals: 24,\n chain: \"near\",\n };\n }\n\n logger.debug(\"findBestBluechipToken - Selected token:\", preferredTokens[0]);\n return preferredTokens[0];\n}\n\n/**\n * Convert slippage input into bps (1 bps = 0.01%).\n * - `>= 1`: bps (e.g. 50 = 0.5%)\n * - `[0.01, 1)`: percent (e.g. 0.5 = 0.5%)\n * - `(0, 0.01)`: decimal (e.g. 0.005 = 0.5%)\n */\nexport function convertSlippageToBasisPoints(slippage: number): number {\n if (slippage >= 1) {\n return Math.round(slippage);\n }\n\n if (slippage > 0 && slippage < 0.01) {\n // 0.005 -> 0.5% -> 50 bps\n return Math.round(slippage * 10000);\n }\n if (slippage >= 0.01 && slippage < 1) {\n // 0.5 -> 0.5% -> 50 bps\n return Math.round(slippage * 100);\n }\n return Math.round(slippage);\n}\n\n/** Normalize NearIntents `destinationAsset` (prefix + `near` -> `wrap.near`). */\nexport function normalizeDestinationAsset(\n assetId: string,\n wrapNearContractId: string = \"wrap.near\"\n): string {\n if (!assetId) return assetId;\n\n if (assetId.startsWith(\"nep141:\") || assetId.startsWith(\"nep245:\")) {\n return assetId;\n }\n\n if (assetId === \"near\" || assetId === \"nep141:near\") {\n return `nep141:${wrapNearContractId}`;\n }\n\n if (assetId.includes(\".\")) {\n return `nep141:${normalizeTokenId(assetId, wrapNearContractId)}`;\n }\n\n return assetId;\n}\n\nexport { logger } from \"./logger\";\n","/** NEAR DEX router implementation (FindPath for routing + REF for execution). */\n\nimport Big from \"big.js\";\nimport {\n QuoteParams,\n QuoteResult,\n ExecuteParams,\n ExecuteResult,\n Route,\n DexRouter,\n} from \"../../types\";\nimport {\n normalizeTokenId,\n convertSlippageToBasisPoints,\n} from \"../../utils\";\nimport { logger } from \"../../utils/logger\";\nimport {\n FindPathAdapter,\n NearChainAdapter,\n ConfigAdapter,\n SwapMultiDexPathAdapter,\n} from \"../../adapters/types\";\n\nexport interface NearSmartRouterConfig {\n findPathAdapter: FindPathAdapter;\n /** Optional: SmartX quote adapter. When provided, quote() will compare results and return the best. */\n swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n nearChainAdapter: NearChainAdapter;\n configAdapter: ConfigAdapter;\n}\n\nexport class NearSmartRouter implements DexRouter {\n private findPathAdapter: FindPathAdapter;\n private swapMultiDexPathAdapter?: SwapMultiDexPathAdapter;\n private nearChainAdapter: NearChainAdapter;\n private configAdapter: ConfigAdapter;\n private wrapNearContractId: string;\n private refExchangeId: string;\n private tokenStorageDepositRead: string;\n private aggregateDexContractId?: string;\n\n constructor(config: NearSmartRouterConfig) {\n this.findPathAdapter = config.findPathAdapter;\n this.swapMultiDexPathAdapter = config.swapMultiDexPathAdapter;\n this.nearChainAdapter = config.nearChainAdapter;\n this.configAdapter = config.configAdapter;\n this.wrapNearContractId = this.configAdapter.getWrapNearContractId();\n this.refExchangeId = this.configAdapter.getRefExchangeId();\n this.tokenStorageDepositRead =\n this.configAdapter.getTokenStorageDepositRead?.() || \"1250000000000000000000\";\n this.aggregateDexContractId =\n this.configAdapter.getAggregateDexContractId?.() || undefined;\n }\n\n /**\n * Get a swap quote (normalizes token ids and queries FindPath for routes).\n */\n async quote(params: QuoteParams): Promise<QuoteResult> {\n try {\n const {\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n swapType: _swapType = \"EXACT_INPUT\", // Currently not used, reserved for future use\n recipient,\n } = params;\n\n if (!tokenIn?.address || !tokenOut?.address) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: \"Missing token address\",\n };\n }\n\n const normalizedTokenIn = normalizeTokenId(\n tokenIn.address,\n this.wrapNearContractId\n );\n const normalizedTokenOut = normalizeTokenId(\n tokenOut.address,\n this.wrapNearContractId\n );\n\n if (!normalizedTokenIn || !normalizedTokenOut) {\n logger.error(\"SmartRouter quote - Invalid token addresses:\", {\n tokenIn: {\n original: tokenIn.address,\n normalized: normalizedTokenIn,\n },\n tokenOut: {\n original: tokenOut.address,\n normalized: normalizedTokenOut,\n },\n });\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: `Invalid token address: tokenIn=${\n normalizedTokenIn || \"empty\"\n }, tokenOut=${normalizedTokenOut || \"empty\"}`,\n };\n }\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const slippageDecimalForApi = slippageBps / 10000;\n\n // SmartX user/receiveUser fallback: recipient -> refundTo; if both missing, skip SmartX.\n const smartxUser = recipient || params.refundTo || \"\";\n const canCallSmartX = this.swapMultiDexPathAdapter && !!smartxUser;\n\n logger.debug(\"SmartRouter quote - Calling quote backends:\", {\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn,\n slippage: slippageDecimalForApi,\n slippageBps,\n hasSmartX: canCallSmartX,\n smartxUser: smartxUser || \"none\",\n });\n\n const [findPathResp, smartxResp] = await Promise.all([\n this.findPathAdapter.findPath({\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n amountIn: String(amountIn),\n slippage: slippageDecimalForApi,\n // v1 requires pathDeep=3 (handled by adapter implementation)\n supportLedger: false,\n }),\n canCallSmartX\n ? this.swapMultiDexPathAdapter!.swapMultiDexPath({\n amountIn: String(amountIn),\n tokenIn: normalizedTokenIn,\n tokenOut: normalizedTokenOut,\n slippage: slippageDecimalForApi,\n pathDeep: 2,\n chainId: 0,\n routerCount: 1,\n skipUnwrapNativeToken: false,\n user: smartxUser,\n receiveUser: smartxUser,\n })\n : Promise.resolve(null),\n ]);\n\n logger.debug(\"SmartRouter quote - findPath response:\", {\n result_code: findPathResp?.result_code,\n result_msg: findPathResp?.result_msg || findPathResp?.result_message,\n hasRoutes: !!findPathResp?.result_data?.routes?.length,\n });\n if (smartxResp) {\n logger.debug(\"SmartRouter quote - SmartX response:\", {\n result_code: smartxResp?.result_code,\n result_msg: smartxResp?.result_message,\n hasData: !!smartxResp?.result_data,\n });\n }\n\n if (\n findPathResp?.result_code !== 0 ||\n !findPathResp?.result_data?.routes?.length\n ) {\n // If v1 fails but SmartX succeeds, still return SmartX quote (quote-only; executeSwap is not supported yet).\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmt = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmt.lte(0) || smartxMin.lt(0)) {\n // treat as failure\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n\n return {\n success: false,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error:\n findPathResp?.result_msg ||\n findPathResp?.result_message ||\n \"No route found\",\n };\n }\n\n const { routes: serverRoutes, amount_out } = findPathResp.result_data;\n const slippageDecimal = new Big(slippageBps).div(10000);\n\n const routes: Route[] = serverRoutes.map((route: any) => ({\n pools: route.pools.map((pool: any) => ({\n pool_id: Number(pool.pool_id),\n token_in: pool.token_in || normalizedTokenIn,\n token_out: pool.token_out || normalizedTokenOut,\n amount_in: pool.amount_in,\n amount_out: pool.amount_out,\n fee: pool.fee,\n })),\n amountIn: amountIn,\n amountOut: route.amount_out || amount_out || \"0\",\n }));\n\n const amountOut = new Big(amount_out || 0);\n const minAmountOut = amountOut\n .mul(new Big(1).minus(slippageDecimal))\n .toFixed(0, Big.roundDown);\n\n const findPathQuote: QuoteResult = {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountOut.toFixed(0),\n minAmountOut,\n routes,\n // Save raw serverRoutes data for executeSwap\n rawRoutes: serverRoutes,\n quoteSource: \"findPath\",\n };\n\n // Compare with SmartX (if available) and return best amountOut. If SmartX wins, return quote-only result.\n const smartxData =\n smartxResp?.result_code === 0 ? smartxResp?.result_data : null;\n if (smartxData?.amount_out) {\n const smartxAmountOut = new Big(smartxData.amount_out || 0);\n const smartxMin = new Big(smartxData.min_amount_out || 0);\n if (smartxAmountOut.gt(0) && smartxMin.gte(0) && smartxAmountOut.gt(amountOut)) {\n return {\n success: true,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n routes: [],\n quoteSource: \"smartx\",\n smartxResult: {\n amountIn: String(smartxData.amount_in || amountIn),\n amountOut: String(smartxData.amount_out),\n minAmountOut: String(smartxData.min_amount_out || \"0\"),\n dexs: smartxData.dexs,\n msg: smartxData.msg,\n signature: smartxData.signature,\n tokens: smartxData.tokens,\n },\n };\n }\n }\n\n return findPathQuote;\n } catch (error: any) {\n return {\n success: false,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n amountOut: \"0\",\n minAmountOut: \"0\",\n routes: [],\n error: error?.message || \"Quote failed\",\n };\n }\n }\n\n /**\n * Execute a swap: optionally adds `storage_deposit` for the recipient, then calls REF via `ft_transfer_call`.\n */\n async executeSwap(params: ExecuteParams): Promise<ExecuteResult> {\n try {\n const { quote, recipient, depositAddress } = params;\n\n if (quote.quoteSource === \"smartx\") {\n const smartx = quote.smartxResult;\n const aggDexId = this.aggregateDexContractId;\n if (!smartx || !aggDexId) {\n return {\n success: false,\n error:\n \"SmartX quote missing execution context (smartxResult or aggregateDexContractId).\",\n };\n }\n\n if (!quote.tokenIn?.address) {\n return { success: false, error: \"tokenIn address is required\" };\n }\n\n const transactions: any[] = [];\n const finalRecipient = depositAddress || recipient;\n\n if (!finalRecipient) {\n return { success: false, error: \"recipient is required for SmartX execution\" };\n }\n\n // Collect tokens to check storage: SmartX tokens + tokenIn + tokenOut (if present)\n // SmartX tokens may include intermediate tokens used in the swap path\n const tokensToCheck = Array.from(\n new Set(\n [\n ...(smartx.tokens || []),\n quote.tokenIn.address || \"\",\n quote.tokenOut?.address || \"\",\n ].filter(Boolean)\n )\n );\n\n if (tokensToCheck.length === 0) {\n return {\n success: false,\n error: \"SmartX tokens list is empty, cannot proceed with execution\",\n };\n }\n\n const targets = [finalRecipient, aggDexId];\n\n // storage_deposit for each (token, target) if not registered\n // Check all tokens for both recipient and aggregate contract\n for (const token of tokensToCheck) {\n for (const target of targets) {\n if (!token || !target) continue;\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: token,\n methodName: \"storage_balance_of\",\n args: {\n account_id: target,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n // View call failure typically means not registered\n logger.debug(\n `Storage check failed for ${token} -> ${target}, assuming not registered:`,\n err\n );\n isRegistered = false;\n }\n\n if (!isRegistered) {\n transactions.push({\n contractId: token,\n methodName: \"storage_deposit\",\n args: {\n account_id: target,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n }\n\n const routerMsg = smartx.msg;\n const signature = smartx.signature;\n if (!routerMsg || !signature) {\n return {\n success: false,\n error: \"SmartX smartxResult missing msg or signature.\",\n };\n }\n\n // Build ft_transfer_call to aggregate dex contract\n const swapMsg = {\n msg: routerMsg,\n signature: signature,\n };\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: aggDexId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"300000000000000\", // ~300 Tgas reference\n expandDeposit: \"1\", // 1 yoctoNEAR\n });\n\n const result = await this.nearChainAdapter.call({ transactions });\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray: result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n }\n return { success: false, error: result.message || \"Execute swap failed\" };\n }\n\n if (!quote.success || !quote.routes.length) {\n return {\n success: false,\n error: \"Invalid quote\",\n };\n }\n\n const swapActions: any[] = [];\n\n const routesToUse = quote.rawRoutes || quote.routes;\n\n routesToUse.forEach((route: any) => {\n const pools = route.pools || [];\n pools.forEach((pool: any) => {\n const poolCopy = { ...pool };\n\n if (+(poolCopy?.amount_in || 0) == 0) {\n delete poolCopy.amount_in;\n }\n\n poolCopy.pool_id = Number(poolCopy.pool_id);\n\n swapActions.push(poolCopy);\n });\n });\n\n if (!swapActions.length) {\n return {\n success: false,\n error: \"No swap actions\",\n };\n }\n\n const finalRecipient = depositAddress || recipient;\n\n const transactions: any[] = [];\n\n if (finalRecipient && quote.tokenOut?.address) {\n let isRegistered = false;\n try {\n const storageBalance = await this.nearChainAdapter.view({\n contractId: quote.tokenOut.address,\n methodName: \"storage_balance_of\",\n args: {\n account_id: finalRecipient,\n },\n });\n isRegistered = !!storageBalance;\n } catch (err) {\n isRegistered = false;\n }\n\n if (!isRegistered) {\n logger.debug(\"SmartRouter - Registering recipient account:\", {\n contractId: quote.tokenOut.address,\n account_id: finalRecipient,\n });\n\n transactions.push({\n contractId: quote.tokenOut.address,\n methodName: \"storage_deposit\",\n args: {\n account_id: finalRecipient,\n registration_only: true,\n },\n gas: \"50\",\n expandDeposit: this.tokenStorageDepositRead,\n });\n }\n }\n\n const swapMsg: any = {\n force: 0,\n actions: swapActions,\n skip_unwrap_near: false,\n };\n\n if (finalRecipient) {\n swapMsg.swap_out_recipient = finalRecipient;\n }\n\n logger.debug(\"SmartRouter - Executing swap:\", {\n contractId: quote.tokenIn.address,\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n swapMsg,\n swapActionsCount: swapActions.length,\n recipient: finalRecipient,\n tokenOut: quote.tokenOut?.address,\n });\n\n transactions.push({\n contractId: quote.tokenIn.address,\n methodName: \"ft_transfer_call\",\n args: {\n receiver_id: this.refExchangeId,\n amount: quote.amountIn,\n msg: JSON.stringify(swapMsg),\n },\n gas: \"250\",\n // NEP-141 requires attaching 1 yoctoNEAR for certain calls.\n expandDeposit: \"1\",\n });\n\n const result = await this.nearChainAdapter.call({\n transactions,\n });\n\n if (result.status === \"success\") {\n return {\n success: true,\n txHash: result.txHash,\n txHashArray:\n result.txHashArr || (result.txHash ? [result.txHash] : []),\n };\n } else {\n return {\n success: false,\n error: result.message || \"Execute swap failed\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error?.message || \"Execute swap failed\",\n };\n }\n }\n\n /**\n * Get supported chain\n */\n getSupportedChain(): \"near\" {\n return \"near\";\n }\n}\n","/** Composite quote: optional NEAR DEX pre-swap + NearIntents quote. */\n\nimport Big from \"big.js\";\nimport { TokenInfo, QuoteResult, DexRouter, BluechipTokensConfig } from \"../types\";\nimport {\n isNearIntentsSupportedToken,\n findBestBluechipToken,\n normalizeTokenId,\n convertSlippageToBasisPoints,\n normalizeDestinationAsset,\n} from \"../utils\";\nimport { logger } from \"../utils/logger\";\nimport { IntentsQuotationAdapter } from \"../adapters/types\";\n\nexport interface CompleteQuoteParams {\n sourceToken: TokenInfo;\n targetToken: TokenInfo;\n sourceChain: string;\n targetChain: string;\n amountIn: string;\n slippage: number;\n recipient: string;\n refundTo?: string;\n}\n\nexport interface CompleteQuoteResult {\n intents: {\n /** Raw NearIntents response (passed through). */\n quote: any; // IntentsQuoteResult\n depositAddress: string;\n };\n preSwap?: {\n quote: QuoteResult;\n tokenIn: TokenInfo;\n tokenOut: TokenInfo;\n executor: DexRouter;\n };\n finalAmountOut: string;\n totalPriceImpact?: number;\n totalFee?: number;\n}\n\nexport interface CompleteQuoteConfig {\n intentsQuotationAdapter: IntentsQuotationAdapter;\n dexRouter: DexRouter;\n bluechipTokens: BluechipTokensConfig;\n configAdapter: {\n getWrapNearContractId(): string;\n };\n}\n\n/**\n * Build a \"complete quote\":\n * - If `sourceToken` is not NearIntents-supported, pre-swap to a bluechip token on NEAR DEX.\n * - Quote NearIntents using (pre-swap output) or `amountIn`.\n *\n * Notes:\n * - Prefer `slippage` in bps (e.g. 50 = 0.5%); we also accept percent/decimal inputs.\n * - `targetChain` is currently reserved for future use.\n */\nexport async function completeQuote(\n params: CompleteQuoteParams,\n config: CompleteQuoteConfig\n): Promise<CompleteQuoteResult> {\n const {\n sourceToken,\n targetToken,\n sourceChain,\n targetChain: _targetChain, // Reserved for future use\n amountIn,\n slippage,\n recipient,\n refundTo,\n } = params;\n\n const { intentsQuotationAdapter, dexRouter, bluechipTokens, configAdapter } =\n config;\n const wrapNearContractId = configAdapter.getWrapNearContractId();\n\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n if (!targetToken?.address) {\n throw new Error(\"Target token address is required\");\n }\n\n const needsPreSwap =\n sourceChain === \"near\" &&\n !isNearIntentsSupportedToken(sourceToken, bluechipTokens);\n\n const bluechipToken = findBestBluechipToken(\n bluechipTokens,\n wrapNearContractId\n );\n\n if (!bluechipToken?.address) {\n logger.error(\"DEX Aggregator - Failed to find bluechip token:\", {\n bluechipToken,\n bluechipTokens,\n });\n throw new Error(\"Failed to find bluechip token address\");\n }\n\n logger.debug(\"DEX Aggregator - Using bluechip token:\", {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n\n let preSwapQuote: QuoteResult | null = null;\n\n if (needsPreSwap) {\n if (!sourceToken?.address) {\n throw new Error(\"Source token address is required\");\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote params:\", {\n tokenIn: {\n address: sourceToken.address,\n symbol: sourceToken.symbol,\n },\n tokenOut: {\n address: bluechipToken.address,\n symbol: bluechipToken.symbol,\n },\n amountIn,\n slippage,\n });\n\n if (!dexRouter) {\n throw new Error(\n `No DEX router registered for sourceChain=${sourceChain}`\n );\n }\n preSwapQuote = await dexRouter.quote({\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n amountIn,\n slippage,\n swapType: \"EXACT_INPUT\",\n recipient: recipient || refundTo,\n refundTo,\n });\n\n if (!preSwapQuote.success) {\n logger.error(\"DEX Aggregator - Pre-swap quote failed:\", {\n error: preSwapQuote.error,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(`Pre-swap quote failed: ${preSwapQuote.error}`);\n }\n\n const preSwapAmountOut = preSwapQuote.amountOut;\n if (!preSwapAmountOut || new Big(preSwapAmountOut).lte(0)) {\n logger.error(\"DEX Aggregator - Pre-swap amountOut is invalid:\", {\n amountOut: preSwapAmountOut,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n });\n throw new Error(\n \"Pre-swap returned invalid amount: amount is too small or zero\"\n );\n }\n\n logger.debug(\"DEX Aggregator - Pre-swap quote success:\", {\n amountOut: preSwapAmountOut,\n tokenOut: bluechipToken.symbol,\n decimals: bluechipToken.decimals,\n });\n }\n\n let normalizedSourceAsset: string;\n if (needsPreSwap) {\n const bluechipKey =\n bluechipToken.symbol?.toUpperCase() === \"WNEAR\"\n ? \"NEAR\"\n : bluechipToken.symbol?.toUpperCase();\n const bluechipTokenConfig =\n (bluechipKey && bluechipTokens[bluechipKey]) || undefined;\n if (bluechipTokenConfig?.assetId) {\n normalizedSourceAsset = bluechipTokenConfig.assetId;\n logger.debug(\"Using bluechip token assetId for NearIntents:\", {\n symbol: bluechipToken.symbol,\n assetId: normalizedSourceAsset,\n contractAddress: bluechipToken.address,\n });\n } else {\n normalizedSourceAsset = `nep141:${bluechipToken.address}`;\n logger.warn(\n \"Bluechip token assetId not found, using contractAddress with prefix:\",\n {\n symbol: bluechipToken.symbol,\n normalizedSourceAsset,\n }\n );\n }\n } else {\n if (sourceToken.symbol) {\n const sourceKey = sourceToken.symbol.toUpperCase();\n const sourceTokenConfig = bluechipTokens[sourceKey];\n if (sourceTokenConfig?.assetId) {\n normalizedSourceAsset = sourceTokenConfig.assetId;\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n } else {\n normalizedSourceAsset = normalizeTokenId(\n sourceToken.address,\n wrapNearContractId\n );\n if (!normalizedSourceAsset.startsWith(\"nep141:\")) {\n normalizedSourceAsset = `nep141:${normalizedSourceAsset}`;\n }\n }\n }\n\n let normalizedTargetAsset = targetToken.address;\n if (\n normalizedTargetAsset &&\n !normalizedTargetAsset.startsWith(\"nep141:\") &&\n !normalizedTargetAsset.startsWith(\"nep245:\") &&\n normalizedTargetAsset.includes(\".\")\n ) {\n normalizedTargetAsset = `nep141:${normalizeTokenId(\n normalizedTargetAsset,\n wrapNearContractId\n )}`;\n }\n\n normalizedTargetAsset =\n normalizeDestinationAsset(normalizedTargetAsset, wrapNearContractId) ||\n normalizedTargetAsset;\n\n const slippageBps = convertSlippageToBasisPoints(slippage);\n const intentsAmount = needsPreSwap ? preSwapQuote!.amountOut : amountIn;\n\n logger.debug(\"DEX Aggregator - Calling NearIntents quotation:\", {\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n\n const swapTypeForIntents = needsPreSwap ? \"FLEX_INPUT\" : undefined;\n\n logger.debug(\"DEX Aggregator - swapType for NearIntents:\", {\n needsPreSwap,\n swapType: swapTypeForIntents || \"EXACT_INPUT (default)\",\n });\n\n const intentsQuote = await intentsQuotationAdapter.quote({\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n refundTo: refundTo || recipient,\n recipient,\n slippageTolerance: slippageBps,\n swapType: swapTypeForIntents,\n });\n\n logger.debug(\"DEX Aggregator - NearIntents quotation result:\", {\n quoteStatus: intentsQuote.quoteStatus,\n message: intentsQuote.message,\n hasDepositAddress: !!intentsQuote.quoteSuccessResult?.quote?.depositAddress,\n });\n\n if (intentsQuote.quoteStatus !== \"success\") {\n const errorMessage = intentsQuote.message || \"Unknown error\";\n logger.error(\"DEX Aggregator - NearIntents quote failed:\", {\n error: errorMessage,\n originAsset: normalizedSourceAsset,\n destinationAsset: normalizedTargetAsset,\n amount: intentsAmount,\n needsPreSwap,\n preSwapAmountOut: needsPreSwap ? preSwapQuote!.amountOut : undefined,\n });\n throw new Error(`Intents quote failed: ${errorMessage}`);\n }\n\n const depositAddress =\n intentsQuote.quoteSuccessResult?.quote?.depositAddress || \"\";\n\n if (!depositAddress) {\n throw new Error(\"Deposit address not found in intents quote\");\n }\n\n return {\n intents: {\n quote: intentsQuote,\n depositAddress,\n },\n preSwap: needsPreSwap\n ? {\n quote: preSwapQuote!,\n tokenIn: sourceToken,\n tokenOut: bluechipToken,\n executor: dexRouter,\n }\n : undefined,\n finalAmountOut: intentsQuote.quoteSuccessResult?.quote?.amountOut || \"0\",\n };\n}\n"]}
|
package/package.json
CHANGED