@ring-protocol/smart-order-router 0.5.29 → 0.5.31

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.
Files changed (24) hide show
  1. package/build/main/routers/alpha-router/alpha-router.js +7 -2
  2. package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
  3. package/build/main/routers/alpha-router/functions/best-swap-route.js +73 -49
  4. package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
  5. package/build/main/routers/alpha-router/functions/compute-all-routes.js +128 -23
  6. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
  7. package/build/main/routers/alpha-router/quoters/mixed-quoter.js +10 -8
  8. package/build/main/tsconfig.tsbuildinfo +1 -1
  9. package/build/main/util/amounts.d.ts +1 -1
  10. package/build/main/util/methodParameters.js +53 -12
  11. package/build/main/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
  12. package/build/main/util/mixedRouteFilterOutV4Pools.js +28 -3
  13. package/build/module/routers/alpha-router/alpha-router.js +7 -2
  14. package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
  15. package/build/module/routers/alpha-router/functions/best-swap-route.js +74 -50
  16. package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
  17. package/build/module/routers/alpha-router/functions/compute-all-routes.js +125 -22
  18. package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
  19. package/build/module/routers/alpha-router/quoters/mixed-quoter.js +10 -8
  20. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  21. package/build/module/util/methodParameters.js +58 -16
  22. package/build/module/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
  23. package/build/module/util/mixedRouteFilterOutV4Pools.js +26 -2
  24. package/package.json +3 -3
@@ -13,10 +13,38 @@ const fixed_reverse_heap_1 = __importDefault(require("mnemonist/fixed-reverse-he
13
13
  const queue_1 = __importDefault(require("mnemonist/queue"));
14
14
  const util_1 = require("../../../util");
15
15
  const amounts_1 = require("../../../util/amounts");
16
+ const fewAddress_1 = require("../../../util/fewAddress");
16
17
  const log_1 = require("../../../util/log");
17
18
  const metric_1 = require("../../../util/metric");
18
19
  const routes_1 = require("../../../util/routes");
19
20
  const gas_models_1 = require("../gas-models");
21
+ /**
22
+ * Given a CurrencyAmount whose currency might be a FewToken (e.g. fwUSDC),
23
+ * re-wrap it with the supplied canonical (non-few) currency so that downstream
24
+ * .add() / .subtract() invariant checks don't throw.
25
+ *
26
+ * FewToken.decimals === OriginalToken.decimals always (see few-v2-sdk fewToken.ts),
27
+ * so the raw quotient is directly reusable — no scaling required.
28
+ */
29
+ function normalizeCurrencyAmount(amount, canonicalCurrency) {
30
+ if (amount.currency.equals(canonicalCurrency)) {
31
+ return amount;
32
+ }
33
+ return amounts_1.CurrencyAmount.fromFractionalAmount(canonicalCurrency, amount.numerator, amount.denominator);
34
+ }
35
+ /**
36
+ * Pick the first non-FewToken currency from a set of RouteWithValidQuote[].
37
+ * Falls back to the first route's quoteToken if all routes are FewV2.
38
+ */
39
+ function resolveCanonicalQuoteToken(routes) {
40
+ for (const r of routes) {
41
+ if (r.quoteToken && !(0, fewAddress_1.isFewToken)(r.quoteToken)) {
42
+ return r.quoteToken;
43
+ }
44
+ }
45
+ // All routes are FewV2 — any currency works as canonical since they're identical
46
+ return routes[0].quoteToken;
47
+ }
20
48
  async function getBestSwapRoute(amount, percents, routesWithValidQuotes, routeType, chainId, routingConfig, portionProvider, v2GasModel, v3GasModel, v4GasModel, swapConfig, providerConfig) {
21
49
  const now = Date.now();
22
50
  const { forceMixedRoutes } = routingConfig;
@@ -60,9 +88,12 @@ async function getBestSwapRoute(amount, percents, routesWithValidQuotes, routeTy
60
88
  // add the missing amount to a random route. The missing amount size should be neglible so the quote should still be highly accurate.
61
89
  const { routes: routeAmounts } = swapRoute;
62
90
  const totalAmount = lodash_1.default.reduce(routeAmounts, (total, routeAmount) => addFn(total, routeAmount.amount), amounts_1.CurrencyAmount.fromRawAmount(routeAmounts[0].amount.currency, 0));
63
- const fewAmount = amounts_1.CurrencyAmount.fromRawAmount(totalAmount.currency, amount.quotient);
64
- const missingAmount = fewAmount.subtract(totalAmount);
65
- // const fewMissingAmount = CurrencyAmount.fromRawAmount(totalAmount.currency, 0);
91
+ // Wrap the original `amount` in totalAmount's currency so the subtraction
92
+ // doesn't fail when totalAmount is in FewToken currency (e.g. fwETH)
93
+ // while amount is in the original currency (e.g. ETH).
94
+ // FewToken decimals === OriginalToken decimals, so quotient is reusable as-is.
95
+ const amountInMatchingCurrency = amounts_1.CurrencyAmount.fromRawAmount(totalAmount.currency, amount.quotient);
96
+ const missingAmount = amountInMatchingCurrency.subtract(totalAmount);
66
97
  if (missingAmount.greaterThan(0)) {
67
98
  log_1.log.info({
68
99
  missingAmount: missingAmount.quotient.toString(),
@@ -107,7 +138,7 @@ function addFn(first, second) {
107
138
  }
108
139
  exports.addFn = addFn;
109
140
  async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId, by, routingConfig, portionProvider, v2GasModel, v3GasModel, v4GasModel, swapConfig, providerConfig) {
110
- var _a, _b, _c, _d, _e, _f, _g;
141
+ var _a, _b;
111
142
  // Build a map of percentage to sorted list of quotes, with the biggest quote being first in the list.
112
143
  const percentToSortedQuotes = lodash_1.default.mapValues(percentToQuotes, (routeQuotes) => {
113
144
  return routeQuotes.sort((routeQuoteA, routeQuoteB) => {
@@ -129,34 +160,21 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
129
160
  }
130
161
  return sum;
131
162
  };
132
- //compatible with few
133
- //ts-ignore
134
- const _sumFnFew = (currencyAmounts) => {
163
+ // Cross-protocol sum that handles FewToken + OriginalToken currency mismatch.
164
+ // Uses addFn (bypasses currency invariant) for accumulation, then normalizes
165
+ // the output to a canonical (non-few) currency so downstream .add()/.subtract()
166
+ // calls with invariant checks won't crash.
167
+ const _sumFnFew = (currencyAmounts, canonicalCurrency) => {
135
168
  let sum = currencyAmounts[0];
136
- // const theFirstIsFewToken = isFewCurrency(sum.currency);
137
169
  for (let i = 1; i < currencyAmounts.length; i++) {
138
- const currencyAmount = currencyAmounts[i];
139
- // const currencyAsToken = currencyAmounts[i]!.currency as Token;
140
- // if (isFewCurrency(currencyAsToken) === theFirstIsFewToken) {
141
- sum = addFn(sum, currencyAmount);
142
- // continue;
143
- // }
144
- // if (theFirstIsFewToken) {
145
- // console.log("[sumFnFew] -- 添加fw", currencyAsToken.symbol);
146
- // //convert to few token
147
- // let temp_currencyAmount = CurrencyAmount.fromFractionalAmount(getFewTokenFromOriginalToken(currencyAsToken, chainId), currencyAmount.numerator, currencyAmount.denominator);
148
- // sum = sum.add(temp_currencyAmount);
149
- // console.log("[sumFnFew] --success 添加fw");
150
- // }
151
- // else {
152
- // console.log("[sumFnFew] -- 去掉fw", currencyAsToken.symbol);
153
- // //convert to none few token
154
- // const unwrap_token = new Token(chainId, currencyAsToken.address, currencyAsToken.decimals, currencyAsToken.symbol?.replace(/^fw/i, ''), undefined);
155
- // const temp_currencyAmount = CurrencyAmount.fromFractionalAmount(unwrap_token, currencyAmount.numerator, currencyAmount.denominator);
156
- // console.log("[sumFnFew] -- temp_currencyAmount=", temp_currencyAmount);
157
- // sum = sum.add(temp_currencyAmount);
158
- // console.log("[sumFnFew] --success 去掉fw");
159
- // }
170
+ sum = addFn(sum, currencyAmounts[i]);
171
+ }
172
+ // Normalize output currency: if a canonical currency is provided, use it;
173
+ // otherwise, if the sum ended up in a FewToken currency, it's because the
174
+ // first element was from a FewV2 route — we still return it as-is since
175
+ // the caller should provide canonicalCurrency when mixing protocols.
176
+ if (canonicalCurrency && !sum.currency.equals(canonicalCurrency)) {
177
+ return amounts_1.CurrencyAmount.fromFractionalAmount(canonicalCurrency, sum.numerator, sum.denominator);
160
178
  }
161
179
  return sum;
162
180
  };
@@ -320,9 +338,12 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
320
338
  const curRoutesNew = [...curRoutes, routeWithQuoteA];
321
339
  // If we've found a route combination that uses all 100%, and it has at least minSplits, update our best route.
322
340
  if (remainingPercentNew == 0 && splits >= minSplits) {
341
+ // Resolve a canonical (non-few) quote currency for this route set
342
+ // so that all arithmetic is in a consistent currency identity.
343
+ const canonicalQuoteCurrency = resolveCanonicalQuoteToken(curRoutesNew);
323
344
  const quotesNew = lodash_1.default.map(curRoutesNew, (r) => by(r));
324
- const quoteNew = _sumFnFew(quotesNew);
325
- let gasCostL1QuoteToken = amounts_1.CurrencyAmount.fromRawAmount(quoteNew.currency, 0);
345
+ const quoteNew = _sumFnFew(quotesNew, canonicalQuoteCurrency);
346
+ let gasCostL1QuoteToken = amounts_1.CurrencyAmount.fromRawAmount(canonicalQuoteCurrency, 0);
326
347
  if (util_1.HAS_L1_FEE.includes(chainId)) {
327
348
  if (v2GasModel == undefined &&
328
349
  v3GasModel == undefined &&
@@ -392,13 +413,18 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
392
413
  return undefined;
393
414
  }
394
415
  const postSplitNow = Date.now();
416
+ // Resolve canonical (non-few) currency for consistent downstream arithmetic.
417
+ // When bestSwap mixes FewV2 + V3/V4 routes, their quote currencies differ
418
+ // (e.g. fwUSDC vs USDC) even though decimals and raw values are identical.
419
+ // All sums and adjustments below must use this canonical currency.
420
+ const canonicalQuoteCurrency = resolveCanonicalQuoteToken(bestSwap);
395
421
  // Filter out any null/undefined quoteAdjustedForGas values before summing
396
422
  const quotesAdjustedForGas = lodash_1.default.compact(lodash_1.default.map(bestSwap, (routeWithValidQuote) => routeWithValidQuote.quoteAdjustedForGas));
397
423
  // If no quotes, throw an error (this should not happen in practice)
398
424
  if (quotesAdjustedForGas.length === 0) {
399
425
  throw new Error('No valid quoteAdjustedForGas found in bestSwap');
400
426
  }
401
- let quoteGasAdjusted = _sumFnFew(quotesAdjustedForGas);
427
+ let quoteGasAdjusted = _sumFnFew(quotesAdjustedForGas, canonicalQuoteCurrency);
402
428
  // this calculates the base gas used
403
429
  // if on L1, its the estimated gas used based on hops and ticks across all the routes
404
430
  // if on L2, its the gas used on the L2 based on hops and ticks across all the routes
@@ -573,14 +599,14 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
573
599
  }, 'USD gas estimates of best route');
574
600
  // Filter out any null/undefined gasCostInToken values before summing
575
601
  const gasCostInTokens = lodash_1.default.compact(lodash_1.default.map(bestSwap, (routeWithValidQuote) => routeWithValidQuote.gasCostInToken));
576
- // Get fallback currency for gasCostL1QuoteToken
577
- const fallbackCurrencyForGas = (_f = (_d = (_c = bestSwap[0]) === null || _c === void 0 ? void 0 : _c.quoteToken) !== null && _d !== void 0 ? _d : (_e = bestSwap[0]) === null || _e === void 0 ? void 0 : _e.amount.currency) !== null && _f !== void 0 ? _f : (_g = bestSwap[0]) === null || _g === void 0 ? void 0 : _g.quote.currency;
578
- const gasCostL1QuoteTokenFallback = gasCostL1QuoteToken !== null && gasCostL1QuoteToken !== void 0 ? gasCostL1QuoteToken : (fallbackCurrencyForGas ? amounts_1.CurrencyAmount.fromRawAmount(fallbackCurrencyForGas, 0) : undefined);
579
- if (!gasCostL1QuoteTokenFallback) {
580
- throw new Error('Could not determine fallback currency for gasCostL1QuoteToken');
581
- }
602
+ // Normalize gasCostL1QuoteToken to canonical currency to avoid invariant crash
603
+ // when mixing FewV2 + V3/V4 routes (fwUSDC vs USDC).
604
+ const gasCostL1QuoteTokenNormalized = gasCostL1QuoteToken
605
+ ? normalizeCurrencyAmount(gasCostL1QuoteToken, canonicalQuoteCurrency)
606
+ : null;
607
+ const gasCostL1QuoteTokenFallback = gasCostL1QuoteTokenNormalized !== null && gasCostL1QuoteTokenNormalized !== void 0 ? gasCostL1QuoteTokenNormalized : amounts_1.CurrencyAmount.fromRawAmount(canonicalQuoteCurrency, 0);
582
608
  const estimatedGasUsedQuoteToken = gasCostInTokens.length > 0
583
- ? _sumFnFew(gasCostInTokens).add(gasCostL1QuoteTokenFallback)
609
+ ? _sumFnFew(gasCostInTokens, canonicalQuoteCurrency).add(gasCostL1QuoteTokenFallback)
584
610
  : gasCostL1QuoteTokenFallback;
585
611
  let estimatedGasUsedGasToken;
586
612
  if (routingConfig.gasToken) {
@@ -603,17 +629,15 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
603
629
  if (quotes.length === 0) {
604
630
  throw new Error('No valid quotes found in bestSwap');
605
631
  }
606
- const quote = _sumFnFew(quotes);
607
- // Adjust the quoteGasAdjusted for the l1 fee
608
- // Add null check for gasCostL1QuoteToken to prevent errors when it's null
609
- if (gasCostL1QuoteToken) {
632
+ const quote = _sumFnFew(quotes, canonicalQuoteCurrency);
633
+ // Adjust the quoteGasAdjusted for the L1 fee.
634
+ // Use the normalized L1 cost (same canonical currency) to avoid invariant crash.
635
+ if (gasCostL1QuoteTokenNormalized) {
610
636
  if (routeType == sdk_core_1.TradeType.EXACT_INPUT) {
611
- const quoteGasAdjustedForL1 = quoteGasAdjusted.subtract(gasCostL1QuoteToken);
612
- quoteGasAdjusted = quoteGasAdjustedForL1;
637
+ quoteGasAdjusted = quoteGasAdjusted.subtract(gasCostL1QuoteTokenNormalized);
613
638
  }
614
639
  else {
615
- const quoteGasAdjustedForL1 = quoteGasAdjusted.add(gasCostL1QuoteToken);
616
- quoteGasAdjusted = quoteGasAdjustedForL1;
640
+ quoteGasAdjusted = quoteGasAdjusted.add(gasCostL1QuoteTokenNormalized);
617
641
  }
618
642
  }
619
643
  const routeWithQuotes = bestSwap.sort((routeAmountA, routeAmountB) => routeAmountB.amount.greaterThan(routeAmountA.amount) ? 1 : -1);
@@ -629,4 +653,4 @@ async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId,
629
653
  };
630
654
  }
631
655
  exports.getBestSwapRouteBy = getBestSwapRouteBy;
632
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVzdC1zd2FwLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9iZXN0LXN3YXAtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQXFEO0FBQ3JELDBEQUFxRDtBQUNyRCxzREFBa0Y7QUFDbEYsZ0RBQXdCO0FBQ3hCLG9EQUFvQztBQUNwQyxzRkFBNEQ7QUFDNUQsNERBQW9DO0FBSXBDLHdDQU11QjtBQUN2QixtREFBdUQ7QUFDdkQsMkNBQXdDO0FBQ3hDLGlEQUFnRTtBQUNoRSxpREFBK0U7QUFHL0UsOENBQStFO0FBc0J4RSxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLE1BQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLHFCQUE0QyxFQUM1QyxTQUFvQixFQUNwQixPQUFnQixFQUNoQixhQUFnQyxFQUNoQyxlQUFpQyxFQUNqQyxVQUE2QyxFQUM3QyxVQUE2QyxFQUM3QyxVQUE2QyxFQUM3QyxVQUF3QixFQUN4QixjQUErQjtJQUUvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFdkIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDO0lBRTNDLDZGQUE2RjtJQUM3RixJQUFJLGdCQUFnQixFQUFFO1FBQ3BCLFNBQUcsQ0FBQyxJQUFJLENBQ047WUFDRSxnQkFBZ0IsRUFBRSxnQkFBZ0I7U0FDbkMsRUFDRCx5REFBeUQsQ0FDMUQsQ0FBQztRQUNGLHFCQUFxQixHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakUsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLHFCQUFRLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFD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
656
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVzdC1zd2FwLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9iZXN0LXN3YXAtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQXFEO0FBQ3JELDBEQUFxRDtBQUNyRCxzREFBd0Y7QUFDeEYsZ0RBQXdCO0FBQ3hCLG9EQUFvQztBQUNwQyxzRkFBNEQ7QUFDNUQsNERBQW9DO0FBSXBDLHdDQU11QjtBQUN2QixtREFBdUQ7QUFDdkQseURBQXNEO0FBQ3RELDJDQUF3QztBQUN4QyxpREFBZ0U7QUFDaEUsaURBQStFO0FBRy9FLDhDQUErRTtBQVMvRTs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsTUFBc0IsRUFDdEIsaUJBQTJCO0lBRTNCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUM3QyxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsT0FBTyx3QkFBYyxDQUFDLG9CQUFvQixDQUN4QyxpQkFBaUIsRUFDakIsTUFBTSxDQUFDLFNBQVMsRUFDaEIsTUFBTSxDQUFDLFdBQVcsQ0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLDBCQUEwQixDQUNqQyxNQUE2QjtJQUU3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRTtRQUN0QixJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFBLHVCQUFVLEVBQUMsQ0FBQyxDQUFDLFVBQW1CLENBQUMsRUFBRTtZQUN0RCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDckI7S0FDRjtJQUNELGlGQUFpRjtJQUNqRixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxVQUFVLENBQUM7QUFDL0IsQ0FBQztBQVlNLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsTUFBc0IsRUFD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
@@ -12,5 +12,13 @@ export declare function computeAllV3Routes(tokenIn: Token, tokenOut: Token, pool
12
12
  export declare function computeAllUniswapFewV3Routes(tokenIn: Token, tokenOut: Token, pools: V3Pool[], maxHops: number): V3Route[];
13
13
  export declare function computeAllV2Routes(tokenIn: Token, tokenOut: Token, pools: Pair[], maxHops: number): V2Route[];
14
14
  export declare function computeAllRingFewV2Routes(tokenIn: Token, tokenOut: Token, pools: RingFewV2Pair[], maxHops: number): RingFewV2Route[];
15
+ /**
16
+ * 判断一个池是否为「桥接池」(用于 wrap/unwrap token 空间转换)。
17
+ * 桥接池借用 V4Pool 结构,以 tickSpacing === 0 作为识别标志。
18
+ * 它不代表真实流动性,仅用于 BFS 路径发现和路径编码。
19
+ */
20
+ export declare function isTokenWrapBridge(pool: TPool): boolean;
21
+ /** @deprecated 使用 isTokenWrapBridge 代替 */
22
+ export declare function isFakeV4BridgePool(pool: TPool): boolean;
15
23
  export declare function computeAllMixedRoutes(currencyIn: Currency, currencyOut: Currency, parts: TPool[], maxHops: number, shouldEnableMixedRouteEthWeth?: boolean, hooksOptions?: HooksOptions): MixedRoute[];
16
24
  export declare function computeAllRoutes<TypePool extends TPool, TRoute extends SupportedRoutes, TCurrency extends Currency>(tokenIn: TCurrency, tokenOut: TCurrency, buildRoute: (route: TypePool[], tokenIn: TCurrency, tokenOut: TCurrency) => TRoute, involvesToken: (pool: TypePool, token: TCurrency) => boolean, pools: TypePool[], maxHops: number): TRoute[];
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.computeAllRoutes = exports.computeAllMixedRoutes = exports.computeAllRingFewV2Routes = exports.computeAllV2Routes = exports.computeAllUniswapFewV3Routes = exports.computeAllV3Routes = exports.computeAllUniswapFewV4Routes = exports.computeAllV4Routes = void 0;
3
+ exports.computeAllRoutes = exports.computeAllMixedRoutes = exports.isFakeV4BridgePool = exports.isTokenWrapBridge = exports.computeAllRingFewV2Routes = exports.computeAllV2Routes = exports.computeAllUniswapFewV3Routes = exports.computeAllV3Routes = exports.computeAllUniswapFewV4Routes = exports.computeAllV4Routes = void 0;
4
4
  const router_sdk_1 = require("@ring-protocol/router-sdk");
5
5
  const v2_sdk_1 = require("@ring-protocol/v2-sdk");
6
6
  const v3_sdk_1 = require("@ring-protocol/v3-sdk");
7
7
  const v4_sdk_1 = require("@ring-protocol/v4-sdk");
8
+ const few_v2_sdk_1 = require("@ring-protocol/few-v2-sdk");
9
+ const chains_1 = require("../../../util/chains");
8
10
  const util_1 = require("../../../util");
9
11
  const hooksOptions_1 = require("../../../util/hooksOptions");
10
12
  // import { log } from '../../../util/log';
@@ -59,6 +61,107 @@ function computeAllRingFewV2Routes(tokenIn, tokenOut, pools, maxHops) {
59
61
  }, (pool, token) => pool.involvesToken(token), pools, maxHops);
60
62
  }
61
63
  exports.computeAllRingFewV2Routes = computeAllRingFewV2Routes;
64
+ /**
65
+ * ============================================================================
66
+ * Token-Space Bridge Pools (Wrap/Unwrap Bridges)
67
+ * ============================================================================
68
+ *
69
+ * 问题:V3 池用原始代币(USDC),FewV2 池用包装代币(fwUSDC)。
70
+ * BFS 搜索路径时,USDC 和 fwUSDC 是不同的 token,无法直接跨协议串联。
71
+ *
72
+ * 解决:创建「桥接池」连接两个 token 空间(原始 ↔ 包装)。
73
+ * 桥接池是一个 V4Pool(fee=0, tickSpacing=0, liquidity=0),
74
+ * 不代表真实流动性,仅作为 BFS 路径发现和路径编码的占位符。
75
+ *
76
+ * 为什么用 V4Pool?因为 MixedRouteQuoterV2 合约已有 "protocol version 0" 机制:
77
+ * - tickSpacing=0 在 encodeMixedRouteToPath 中编码为 version 0
78
+ * - quoter 合约遇到 version 0 时,直接把 amountIn 透传为 amountOut(1:1)
79
+ * - 这个机制原本是给 ETH↔WETH 用的,我们复用于 original↔fewToken
80
+ *
81
+ * 整条路径示例:
82
+ * WETH →[V3]→ USDC →[桥接池]→ fwUSDC →[FewV2]→ fwDAI →[桥接池]→ DAI
83
+ *
84
+ * 识别方法:pool instanceof V4Pool && pool.tickSpacing === 0
85
+ * 见 isTokenWrapBridge() 函数。
86
+ * ============================================================================
87
+ */
88
+ /**
89
+ * 扫描所有 FewV2 池中的 fewToken,为每个 fewToken 创建一个
90
+ * originalToken ↔ fewToken 的桥接池,让 BFS 能发现跨协议路径。
91
+ */
92
+ function createFewTokenWrapBridges(pools, chainId) {
93
+ if (!chains_1.RING_FEW_V2_SUPPORTED.includes(chainId))
94
+ return [];
95
+ // Collect all unique fewTokens from FewV2 pools
96
+ const fewTokens = new Set();
97
+ const fewTokenMap = new Map(); // address -> Token
98
+ for (const pool of pools) {
99
+ if (pool instanceof few_v2_sdk_1.Pair) {
100
+ for (const token of [pool.token0, pool.token1]) {
101
+ if ((0, few_v2_sdk_1.isFewToken)(token) && !fewTokens.has(token.address.toLowerCase())) {
102
+ fewTokens.add(token.address.toLowerCase());
103
+ fewTokenMap.set(token.address.toLowerCase(), token);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ const bridgePools = [];
109
+ for (const [, fewToken] of fewTokenMap) {
110
+ // Derive the original token from the fewToken
111
+ let originalToken;
112
+ // Search V3/V2 pools for a token that maps to this fewToken
113
+ for (const pool of pools) {
114
+ if (pool instanceof few_v2_sdk_1.Pair)
115
+ continue;
116
+ for (const token of [pool.token0, pool.token1]) {
117
+ try {
118
+ const derived = (0, few_v2_sdk_1.getFewTokenFromOriginalToken)(token, chainId);
119
+ if (derived.address.toLowerCase() === fewToken.address.toLowerCase()) {
120
+ originalToken = token;
121
+ break;
122
+ }
123
+ }
124
+ catch (_a) {
125
+ // Not all tokens can be wrapped
126
+ }
127
+ }
128
+ if (originalToken)
129
+ break;
130
+ }
131
+ if (!originalToken)
132
+ continue;
133
+ // 创建桥接池:tickSpacing=0 → 路径编码为 version 0 → quoter 合约 1:1 透传
134
+ try {
135
+ const SQRT_PRICE_1_TO_1 = 79228162514264337593543950336; // sqrt(1) * 2^96,表示 1:1 价格
136
+ const bridgePool = new v4_sdk_1.Pool(originalToken, fewToken, 0, // fee = 0(桥接不收费)
137
+ 0, // tickSpacing = 0(桥接池标志,触发 version 0 编码)
138
+ router_sdk_1.ADDRESS_ZERO, // hooks = none
139
+ SQRT_PRICE_1_TO_1, // 1:1 价格(wrap/unwrap 不改变金额)
140
+ 0, // liquidity = 0(桥接池没有真实流动性)
141
+ 0 // tickCurrent = 0
142
+ );
143
+ bridgePools.push(bridgePool);
144
+ }
145
+ catch (_b) {
146
+ // Skip if pool creation fails
147
+ }
148
+ }
149
+ return bridgePools;
150
+ }
151
+ /**
152
+ * 判断一个池是否为「桥接池」(用于 wrap/unwrap token 空间转换)。
153
+ * 桥接池借用 V4Pool 结构,以 tickSpacing === 0 作为识别标志。
154
+ * 它不代表真实流动性,仅用于 BFS 路径发现和路径编码。
155
+ */
156
+ function isTokenWrapBridge(pool) {
157
+ return pool instanceof v4_sdk_1.Pool && pool.tickSpacing === 0;
158
+ }
159
+ exports.isTokenWrapBridge = isTokenWrapBridge;
160
+ /** @deprecated 使用 isTokenWrapBridge 代替 */
161
+ function isFakeV4BridgePool(pool) {
162
+ return isTokenWrapBridge(pool);
163
+ }
164
+ exports.isFakeV4BridgePool = isFakeV4BridgePool;
62
165
  function computeAllMixedRoutes(currencyIn, currencyOut, parts, maxHops, shouldEnableMixedRouteEthWeth, hooksOptions) {
63
166
  // first we need to filter non v4-pools
64
167
  const filteredPools = !hooksOptions || hooksOptions === hooksOptions_1.HooksOptions.HOOKS_INCLUSIVE
@@ -76,24 +179,34 @@ function computeAllMixedRoutes(currencyIn, currencyOut, parts, maxHops, shouldEn
76
179
  const v4HookfulPools = parts.filter((pool) => pool instanceof v4_sdk_1.Pool && pool.hooks === router_sdk_1.ADDRESS_ZERO);
77
180
  parts = filteredPools.concat(v4HookfulPools);
78
181
  }
79
- // only add fake v4 pool, if we see there's a native v4 pool in the candidate pool
182
+ // ---- 添加桥接池,连接不同的 token 空间 ----
183
+ // 1) ETH↔WETH 桥接:让 V3 的 WETH 池和 V4 的 ETH 池能串联
184
+ // 2) original↔fewToken 桥接:让 V3 的 USDC 池和 FewV2 的 fwUSDC 池能串联
80
185
  const containsV4NativePools = parts.filter((pool) => pool instanceof v4_sdk_1.Pool &&
81
186
  pool.v4InvolvesToken((0, util_1.nativeOnChain)(currencyIn.chainId))).length > 0;
82
- const amendedPools = containsV4NativePools && shouldEnableMixedRouteEthWeth
187
+ let amendedPools = containsV4NativePools && shouldEnableMixedRouteEthWeth
83
188
  ? parts.concat(util_1.V4_ETH_WETH_FAKE_POOL[currencyIn.chainId])
84
- : parts;
85
- // NOTE: we added a fake v4 pool, in order for mixed route to connect the v3 weth pool with v4 eth pool
189
+ : [...parts];
190
+ // 添加 fewToken 桥接池(original↔fewToken,与 ETH↔WETH 桥接池使用相同的 tickSpacing=0 机制)
191
+ const fewTokenBridges = createFewTokenWrapBridges(parts, currencyIn.chainId);
192
+ if (fewTokenBridges.length > 0) {
193
+ amendedPools = amendedPools.concat(fewTokenBridges);
194
+ }
195
+ // 如果有桥接池存在,构建 MixedRoute 时需要保留它们(retainFakePools=true),
196
+ // 否则 MixedRouteSDK 构造函数会把 tickSpacing=0 的池过滤掉,导致 token 路径断裂
197
+ const hasWrapBridges = containsV4NativePools || fewTokenBridges.length > 0;
86
198
  const routesRaw = computeAllRoutes(currencyIn, currencyOut, (route, currencyIn, currencyOut) => {
87
- // we only retake the fake v4 pool if the route contains a native v4 pool
88
- return new router_1.MixedRoute(route, currencyIn, currencyOut, containsV4NativePools);
199
+ // hasWrapBridges=true 保留桥接池在路由中,供报价阶段编码和执行阶段生成 wrap/unwrap 命令
200
+ return new router_1.MixedRoute(route, currencyIn, currencyOut, hasWrapBridges);
89
201
  }, (pool, currency) => currency.isNative
90
202
  ? pool.involvesToken(currency)
91
203
  : pool.involvesToken(currency), amendedPools, maxHops);
92
- /// filter out pure v4 and v3 and v2 routes
204
+ /// filter out pure v4, v3, v2, and fewv2 routes (mixed routes must contain pools from 2+ protocols)
93
205
  return routesRaw.filter((route) => {
94
206
  return (!route.pools.every((pool) => pool instanceof v4_sdk_1.Pool) &&
95
207
  !route.pools.every((pool) => pool instanceof v3_sdk_1.Pool) &&
96
- !route.pools.every((pool) => pool instanceof v2_sdk_1.Pair));
208
+ !route.pools.every((pool) => pool instanceof v2_sdk_1.Pair) &&
209
+ !route.pools.every((pool) => pool instanceof few_v2_sdk_1.Pair));
97
210
  });
98
211
  }
99
212
  exports.computeAllMixedRoutes = computeAllMixedRoutes;
@@ -101,19 +214,11 @@ function computeAllRoutes(tokenIn, tokenOut, buildRoute, involvesToken, pools, m
101
214
  const poolsUsed = Array(pools.length).fill(false);
102
215
  const routes = [];
103
216
  const computeRoutes = (tokenIn, tokenOut, currentRoute, poolsUsed, tokensVisited, _previousTokenOut) => {
104
- const currentRouteContainsFakeV4Pool = currentRoute.filter((pool) => pool instanceof v4_sdk_1.Pool &&
105
- pool.tickSpacing ===
106
- util_1.V4_ETH_WETH_FAKE_POOL[tokenIn.chainId].tickSpacing).length > 0;
107
- const amendedMaxHops = currentRouteContainsFakeV4Pool
108
- ? maxHops + 1
109
- : maxHops;
110
- // amendedMaxHops is the maxHops + 1 if the current route contains a fake v4 pool
111
- // b/c we want to allow the route to go through the fake v4 pool
112
- // also gas wise, if a route goes through the fake v4 pool, mixed quoter will add the wrap/unwrap gas cost:
113
- // https://github.com/Uniswap/mixed-quoter/pull/41/files#diff-a4d1289f264d1da22aac20cc55a9d01c8ba9cccd76ce1af8f952ec9034e7e1aaR189
114
- // and SOR will use the gas cost from the mixed quoter:
115
- // https://github.com/Uniswap/smart-order-router/blob/17da523f1af050e6430afb866d96681346c8fb8b/src/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.ts#L222
116
- if (currentRoute.length > amendedMaxHops) {
217
+ // 桥接池(tickSpacing=0)不消耗真实流动性,只做 token 空间转换。
218
+ // 每个桥接池在路径中占一跳,但不应计入 maxHops 限制,否则会截断合法路径。
219
+ const wrapBridgeCount = currentRoute.filter(isTokenWrapBridge).length;
220
+ const effectiveMaxHops = maxHops + wrapBridgeCount;
221
+ if (currentRoute.length > effectiveMaxHops) {
117
222
  return;
118
223
  }
119
224
  if (currentRoute.length > 0 &&
@@ -149,4 +254,4 @@ function computeAllRoutes(tokenIn, tokenOut, buildRoute, involvesToken, pools, m
149
254
  return routes;
150
255
  }
151
256
  exports.computeAllRoutes = computeAllRoutes;
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1hbGwtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9jb21wdXRlLWFsbC1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWdFO0FBRWhFLGtEQUE2QztBQUM3QyxrREFBdUQ7QUFDdkQsa0RBQXVEO0FBR3ZELHdDQUl1QjtBQUN2Qiw2REFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLHlDQU9zQjtBQUV0QixTQUFnQixrQkFBa0IsQ0FDaEMsVUFBb0IsRUFDcEIsV0FBcUIsRUFDckIsS0FBZSxFQUNmLE9BQWUsRUFDZixZQUEyQjtJQUUzQixJQUFJLGFBQWEsR0FBYSxLQUFLLENBQUM7SUFFcEMsSUFBSSxZQUFZLEtBQUssMkJBQVksQ0FBQyxVQUFVLEVBQUU7UUFDNUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUsseUJBQVksQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsSUFBSSxZQUFZLEtBQUssMkJBQVksQ0FBQyxRQUFRLEVBQUU7UUFDMUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUsseUJBQVksQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsT0FBTyxnQkFBZ0IsQ0FDckIsVUFBVSxFQUNWLFdBQVcsRUFDWCxDQUFDLEtBQWUsRUFBRSxVQUFvQixFQUFFLFdBQXFCLEVBQUUsRUFBRTtRQUMvRCxPQUFPLElBQUksZ0JBQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsRUFDRCxDQUFDLElBQVksRUFBRSxRQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxF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
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1hbGwtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9jb21wdXRlLWFsbC1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWdFO0FBRWhFLGtEQUE2QztBQUM3QyxrREFBdUQ7QUFDdkQsa0RBQXVEO0FBQ3ZELDBEQUltQztBQUNuQyxpREFBNkQ7QUFFN0Qsd0NBSXVCO0FBQ3ZCLDZEQUEwRDtBQUMxRCwyQ0FBMkM7QUFDM0MseUNBT3NCO0FBRXRCLFNBQWdCLGtCQUFrQixDQUNoQyxVQUFvQixFQUNwQixXQUFxQixFQUNyQixLQUFlLEVBQ2YsT0FBZSxFQUNmLFlBQTJCO0lBRTNCLElBQUksYUFBYSxHQUFhLEtBQUssQ0FBQztJQUVwQyxJQUFJLFlBQVksS0FBSywyQkFBWSxDQUFDLFVBQVUsRUFBRTtRQUM1QyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyx5QkFBWSxDQUFDLENBQUM7S0FDckU7SUFFRCxJQUFJLFlBQVksS0FBSywyQkFBWSxDQUFDLFFBQVEsRUFBRTtRQUMxQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyx5QkFBWSxDQUFDLENBQUM7S0FDckU7SUFFRCxPQUFPLGdCQUFnQixDQUNyQixVQUFVLEVBQ1YsV0FBVyxFQUNYLENBQUMsS0FBZSxFQUFFLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxFQUFFO1FBQy9ELE9BQU8sSUFBSSxnQkFBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQyxFQUNELENBQUMsSUFBWSxFQUFFLFFBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUks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