@ring-protocol/smart-order-router 0.5.30 → 0.5.32
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/build/main/providers/fewV2/ring-static-subgraph-provider.js +2 -2
- package/build/main/routers/alpha-router/alpha-router.js +7 -2
- package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
- package/build/main/routers/alpha-router/functions/best-swap-route.js +73 -49
- package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
- package/build/main/routers/alpha-router/functions/compute-all-routes.js +128 -23
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js +10 -8
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/util/amounts.d.ts +1 -1
- package/build/main/util/chains.js +4 -1
- package/build/main/util/fewAddress.d.ts +2 -0
- package/build/main/util/fewAddress.js +8 -4
- package/build/main/util/methodParameters.js +53 -12
- package/build/main/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
- package/build/main/util/mixedRouteFilterOutV4Pools.js +28 -3
- package/build/module/providers/fewV2/ring-static-subgraph-provider.js +2 -2
- package/build/module/routers/alpha-router/alpha-router.js +7 -2
- package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
- package/build/module/routers/alpha-router/functions/best-swap-route.js +74 -50
- package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
- package/build/module/routers/alpha-router/functions/compute-all-routes.js +125 -22
- package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
- package/build/module/routers/alpha-router/quoters/mixed-quoter.js +10 -8
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/chains.js +4 -1
- package/build/module/util/fewAddress.d.ts +2 -0
- package/build/module/util/fewAddress.js +7 -3
- package/build/module/util/methodParameters.js +58 -16
- package/build/module/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
- package/build/module/util/mixedRouteFilterOutV4Pools.js +26 -2
- package/package.json +12 -8
|
@@ -1,16 +1,44 @@
|
|
|
1
1
|
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
2
|
import { Protocol } from '@ring-protocol/router-sdk';
|
|
3
|
-
import { Fraction,
|
|
3
|
+
import { Fraction, TradeType } from '@ring-protocol/sdk-core';
|
|
4
4
|
import JSBI from 'jsbi';
|
|
5
5
|
import _ /*,{ sum }*/ from 'lodash';
|
|
6
6
|
import FixedReverseHeap from 'mnemonist/fixed-reverse-heap';
|
|
7
7
|
import Queue from 'mnemonist/queue';
|
|
8
8
|
import { FEW_V2_ONLY_CHAIN_IDS, HAS_L1_FEE, V2_SUPPORTED, V4_SUPPORTED, WRAPPED_NATIVE_CURRENCY, } from '../../../util';
|
|
9
9
|
import { CurrencyAmount } from '../../../util/amounts';
|
|
10
|
+
import { isFewToken } from '../../../util/fewAddress';
|
|
10
11
|
import { log } from '../../../util/log';
|
|
11
12
|
import { metric, MetricLoggerUnit } from '../../../util/metric';
|
|
12
13
|
import { /*routeAmountsToString,*/ routeToString } from '../../../util/routes';
|
|
13
14
|
import { usdGasTokensByChain } from '../gas-models';
|
|
15
|
+
/**
|
|
16
|
+
* Given a CurrencyAmount whose currency might be a FewToken (e.g. fwUSDC),
|
|
17
|
+
* re-wrap it with the supplied canonical (non-few) currency so that downstream
|
|
18
|
+
* .add() / .subtract() invariant checks don't throw.
|
|
19
|
+
*
|
|
20
|
+
* FewToken.decimals === OriginalToken.decimals always (see few-v2-sdk fewToken.ts),
|
|
21
|
+
* so the raw quotient is directly reusable — no scaling required.
|
|
22
|
+
*/
|
|
23
|
+
function normalizeCurrencyAmount(amount, canonicalCurrency) {
|
|
24
|
+
if (amount.currency.equals(canonicalCurrency)) {
|
|
25
|
+
return amount;
|
|
26
|
+
}
|
|
27
|
+
return CurrencyAmount.fromFractionalAmount(canonicalCurrency, amount.numerator, amount.denominator);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pick the first non-FewToken currency from a set of RouteWithValidQuote[].
|
|
31
|
+
* Falls back to the first route's quoteToken if all routes are FewV2.
|
|
32
|
+
*/
|
|
33
|
+
function resolveCanonicalQuoteToken(routes) {
|
|
34
|
+
for (const r of routes) {
|
|
35
|
+
if (r.quoteToken && !isFewToken(r.quoteToken)) {
|
|
36
|
+
return r.quoteToken;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// All routes are FewV2 — any currency works as canonical since they're identical
|
|
40
|
+
return routes[0].quoteToken;
|
|
41
|
+
}
|
|
14
42
|
export async function getBestSwapRoute(amount, percents, routesWithValidQuotes, routeType, chainId, routingConfig, portionProvider, v2GasModel, v3GasModel, v4GasModel, swapConfig, providerConfig) {
|
|
15
43
|
const now = Date.now();
|
|
16
44
|
const { forceMixedRoutes } = routingConfig;
|
|
@@ -54,9 +82,12 @@ export async function getBestSwapRoute(amount, percents, routesWithValidQuotes,
|
|
|
54
82
|
// add the missing amount to a random route. The missing amount size should be neglible so the quote should still be highly accurate.
|
|
55
83
|
const { routes: routeAmounts } = swapRoute;
|
|
56
84
|
const totalAmount = _.reduce(routeAmounts, (total, routeAmount) => addFn(total, routeAmount.amount), CurrencyAmount.fromRawAmount(routeAmounts[0].amount.currency, 0));
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
//
|
|
85
|
+
// Wrap the original `amount` in totalAmount's currency so the subtraction
|
|
86
|
+
// doesn't fail when totalAmount is in FewToken currency (e.g. fwETH)
|
|
87
|
+
// while amount is in the original currency (e.g. ETH).
|
|
88
|
+
// FewToken decimals === OriginalToken decimals, so quotient is reusable as-is.
|
|
89
|
+
const amountInMatchingCurrency = CurrencyAmount.fromRawAmount(totalAmount.currency, amount.quotient);
|
|
90
|
+
const missingAmount = amountInMatchingCurrency.subtract(totalAmount);
|
|
60
91
|
if (missingAmount.greaterThan(0)) {
|
|
61
92
|
log.info({
|
|
62
93
|
missingAmount: missingAmount.quotient.toString(),
|
|
@@ -99,7 +130,7 @@ export function addFn(first, second) {
|
|
|
99
130
|
return CurrencyAmount.fromFractionalAmount(first.currency, addedFraction.numerator, addedFraction.denominator);
|
|
100
131
|
}
|
|
101
132
|
export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, chainId, by, routingConfig, portionProvider, v2GasModel, v3GasModel, v4GasModel, swapConfig, providerConfig) {
|
|
102
|
-
var _a, _b
|
|
133
|
+
var _a, _b;
|
|
103
134
|
// Build a map of percentage to sorted list of quotes, with the biggest quote being first in the list.
|
|
104
135
|
const percentToSortedQuotes = _.mapValues(percentToQuotes, (routeQuotes) => {
|
|
105
136
|
return routeQuotes.sort((routeQuoteA, routeQuoteB) => {
|
|
@@ -121,34 +152,21 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
121
152
|
}
|
|
122
153
|
return sum;
|
|
123
154
|
};
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
|
|
155
|
+
// Cross-protocol sum that handles FewToken + OriginalToken currency mismatch.
|
|
156
|
+
// Uses addFn (bypasses currency invariant) for accumulation, then normalizes
|
|
157
|
+
// the output to a canonical (non-few) currency so downstream .add()/.subtract()
|
|
158
|
+
// calls with invariant checks won't crash.
|
|
159
|
+
const _sumFnFew = (currencyAmounts, canonicalCurrency) => {
|
|
127
160
|
let sum = currencyAmounts[0];
|
|
128
|
-
// const theFirstIsFewToken = isFewCurrency(sum.currency);
|
|
129
161
|
for (let i = 1; i < currencyAmounts.length; i++) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
// //convert to few token
|
|
139
|
-
// let temp_currencyAmount = CurrencyAmount.fromFractionalAmount(getFewTokenFromOriginalToken(currencyAsToken, chainId), currencyAmount.numerator, currencyAmount.denominator);
|
|
140
|
-
// sum = sum.add(temp_currencyAmount);
|
|
141
|
-
// console.log("[sumFnFew] --success 添加fw");
|
|
142
|
-
// }
|
|
143
|
-
// else {
|
|
144
|
-
// console.log("[sumFnFew] -- 去掉fw", currencyAsToken.symbol);
|
|
145
|
-
// //convert to none few token
|
|
146
|
-
// const unwrap_token = new Token(chainId, currencyAsToken.address, currencyAsToken.decimals, currencyAsToken.symbol?.replace(/^fw/i, ''), undefined);
|
|
147
|
-
// const temp_currencyAmount = CurrencyAmount.fromFractionalAmount(unwrap_token, currencyAmount.numerator, currencyAmount.denominator);
|
|
148
|
-
// console.log("[sumFnFew] -- temp_currencyAmount=", temp_currencyAmount);
|
|
149
|
-
// sum = sum.add(temp_currencyAmount);
|
|
150
|
-
// console.log("[sumFnFew] --success 去掉fw");
|
|
151
|
-
// }
|
|
162
|
+
sum = addFn(sum, currencyAmounts[i]);
|
|
163
|
+
}
|
|
164
|
+
// Normalize output currency: if a canonical currency is provided, use it;
|
|
165
|
+
// otherwise, if the sum ended up in a FewToken currency, it's because the
|
|
166
|
+
// first element was from a FewV2 route — we still return it as-is since
|
|
167
|
+
// the caller should provide canonicalCurrency when mixing protocols.
|
|
168
|
+
if (canonicalCurrency && !sum.currency.equals(canonicalCurrency)) {
|
|
169
|
+
return CurrencyAmount.fromFractionalAmount(canonicalCurrency, sum.numerator, sum.denominator);
|
|
152
170
|
}
|
|
153
171
|
return sum;
|
|
154
172
|
};
|
|
@@ -312,9 +330,12 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
312
330
|
const curRoutesNew = [...curRoutes, routeWithQuoteA];
|
|
313
331
|
// If we've found a route combination that uses all 100%, and it has at least minSplits, update our best route.
|
|
314
332
|
if (remainingPercentNew == 0 && splits >= minSplits) {
|
|
333
|
+
// Resolve a canonical (non-few) quote currency for this route set
|
|
334
|
+
// so that all arithmetic is in a consistent currency identity.
|
|
335
|
+
const canonicalQuoteCurrency = resolveCanonicalQuoteToken(curRoutesNew);
|
|
315
336
|
const quotesNew = _.map(curRoutesNew, (r) => by(r));
|
|
316
|
-
const quoteNew = _sumFnFew(quotesNew);
|
|
317
|
-
let gasCostL1QuoteToken = CurrencyAmount.fromRawAmount(
|
|
337
|
+
const quoteNew = _sumFnFew(quotesNew, canonicalQuoteCurrency);
|
|
338
|
+
let gasCostL1QuoteToken = CurrencyAmount.fromRawAmount(canonicalQuoteCurrency, 0);
|
|
318
339
|
if (HAS_L1_FEE.includes(chainId)) {
|
|
319
340
|
if (v2GasModel == undefined &&
|
|
320
341
|
v3GasModel == undefined &&
|
|
@@ -384,13 +405,18 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
384
405
|
return undefined;
|
|
385
406
|
}
|
|
386
407
|
const postSplitNow = Date.now();
|
|
408
|
+
// Resolve canonical (non-few) currency for consistent downstream arithmetic.
|
|
409
|
+
// When bestSwap mixes FewV2 + V3/V4 routes, their quote currencies differ
|
|
410
|
+
// (e.g. fwUSDC vs USDC) even though decimals and raw values are identical.
|
|
411
|
+
// All sums and adjustments below must use this canonical currency.
|
|
412
|
+
const canonicalQuoteCurrency = resolveCanonicalQuoteToken(bestSwap);
|
|
387
413
|
// Filter out any null/undefined quoteAdjustedForGas values before summing
|
|
388
414
|
const quotesAdjustedForGas = _.compact(_.map(bestSwap, (routeWithValidQuote) => routeWithValidQuote.quoteAdjustedForGas));
|
|
389
415
|
// If no quotes, throw an error (this should not happen in practice)
|
|
390
416
|
if (quotesAdjustedForGas.length === 0) {
|
|
391
417
|
throw new Error('No valid quoteAdjustedForGas found in bestSwap');
|
|
392
418
|
}
|
|
393
|
-
let quoteGasAdjusted = _sumFnFew(quotesAdjustedForGas);
|
|
419
|
+
let quoteGasAdjusted = _sumFnFew(quotesAdjustedForGas, canonicalQuoteCurrency);
|
|
394
420
|
// this calculates the base gas used
|
|
395
421
|
// if on L1, its the estimated gas used based on hops and ticks across all the routes
|
|
396
422
|
// if on L2, its the gas used on the L2 based on hops and ticks across all the routes
|
|
@@ -565,14 +591,14 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
565
591
|
}, 'USD gas estimates of best route');
|
|
566
592
|
// Filter out any null/undefined gasCostInToken values before summing
|
|
567
593
|
const gasCostInTokens = _.compact(_.map(bestSwap, (routeWithValidQuote) => routeWithValidQuote.gasCostInToken));
|
|
568
|
-
//
|
|
569
|
-
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
594
|
+
// Normalize gasCostL1QuoteToken to canonical currency to avoid invariant crash
|
|
595
|
+
// when mixing FewV2 + V3/V4 routes (fwUSDC vs USDC).
|
|
596
|
+
const gasCostL1QuoteTokenNormalized = gasCostL1QuoteToken
|
|
597
|
+
? normalizeCurrencyAmount(gasCostL1QuoteToken, canonicalQuoteCurrency)
|
|
598
|
+
: null;
|
|
599
|
+
const gasCostL1QuoteTokenFallback = gasCostL1QuoteTokenNormalized !== null && gasCostL1QuoteTokenNormalized !== void 0 ? gasCostL1QuoteTokenNormalized : CurrencyAmount.fromRawAmount(canonicalQuoteCurrency, 0);
|
|
574
600
|
const estimatedGasUsedQuoteToken = gasCostInTokens.length > 0
|
|
575
|
-
? _sumFnFew(gasCostInTokens).add(gasCostL1QuoteTokenFallback)
|
|
601
|
+
? _sumFnFew(gasCostInTokens, canonicalQuoteCurrency).add(gasCostL1QuoteTokenFallback)
|
|
576
602
|
: gasCostL1QuoteTokenFallback;
|
|
577
603
|
let estimatedGasUsedGasToken;
|
|
578
604
|
if (routingConfig.gasToken) {
|
|
@@ -595,17 +621,15 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
595
621
|
if (quotes.length === 0) {
|
|
596
622
|
throw new Error('No valid quotes found in bestSwap');
|
|
597
623
|
}
|
|
598
|
-
const quote = _sumFnFew(quotes);
|
|
599
|
-
// Adjust the quoteGasAdjusted for the
|
|
600
|
-
//
|
|
601
|
-
if (
|
|
624
|
+
const quote = _sumFnFew(quotes, canonicalQuoteCurrency);
|
|
625
|
+
// Adjust the quoteGasAdjusted for the L1 fee.
|
|
626
|
+
// Use the normalized L1 cost (same canonical currency) to avoid invariant crash.
|
|
627
|
+
if (gasCostL1QuoteTokenNormalized) {
|
|
602
628
|
if (routeType == TradeType.EXACT_INPUT) {
|
|
603
|
-
|
|
604
|
-
quoteGasAdjusted = quoteGasAdjustedForL1;
|
|
629
|
+
quoteGasAdjusted = quoteGasAdjusted.subtract(gasCostL1QuoteTokenNormalized);
|
|
605
630
|
}
|
|
606
631
|
else {
|
|
607
|
-
|
|
608
|
-
quoteGasAdjusted = quoteGasAdjustedForL1;
|
|
632
|
+
quoteGasAdjusted = quoteGasAdjusted.add(gasCostL1QuoteTokenNormalized);
|
|
609
633
|
}
|
|
610
634
|
}
|
|
611
635
|
const routeWithQuotes = bestSwap.sort((routeAmountA, routeAmountB) => routeAmountB.amount.greaterThan(routeAmountA.amount) ? 1 : -1);
|
|
@@ -620,4 +644,4 @@ export async function getBestSwapRouteBy(routeType, percentToQuotes, percents, c
|
|
|
620
644
|
routes: portionProvider.getRouteWithQuotePortionAdjusted(routeType, routeWithQuotes, swapConfig, providerConfig),
|
|
621
645
|
};
|
|
622
646
|
}
|
|
623
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVzdC1zd2FwLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9iZXN0LXN3YXAtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQVcsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxDQUFDLENBQUMsWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLGdCQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sS0FBSyxNQUFNLGlCQUFpQixDQUFDO0FBSXBDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcvRSxPQUFPLEVBQTZCLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBc0IvRSxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUFzQixFQUN0QixRQUFrQixFQUNsQixxQkFBNEMsRUFDNUMsU0FBb0IsRUFDcEIsT0FBZ0IsRUFDaEIsYUFBZ0MsRUFDaEMsZUFBaUMsRUFD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
|
|
647
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVzdC1zd2FwLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9iZXN0LXN3YXAtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQXFCLFFBQVEsRUFBUyxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxDQUFDLENBQUMsWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLGdCQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sS0FBSyxNQUFNLGlCQUFpQixDQUFDO0FBSXBDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUseUJBQXlCLENBQUMsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHL0UsT0FBTyxFQUE2QixtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMvRTs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsTUFBc0IsRUFDdEIsaUJBQTJCO0lBRTNCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FB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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[];
|
|
@@ -2,6 +2,8 @@ import { ADDRESS_ZERO } from '@ring-protocol/router-sdk';
|
|
|
2
2
|
import { Pair } from '@ring-protocol/v2-sdk';
|
|
3
3
|
import { Pool as V3Pool } from '@ring-protocol/v3-sdk';
|
|
4
4
|
import { Pool as V4Pool } from '@ring-protocol/v4-sdk';
|
|
5
|
+
import { Pair as RingFewV2Pair, isFewToken, getFewTokenFromOriginalToken, } from '@ring-protocol/few-v2-sdk';
|
|
6
|
+
import { RING_FEW_V2_SUPPORTED } from '../../../util/chains';
|
|
5
7
|
import { getAddressLowerCase, nativeOnChain, V4_ETH_WETH_FAKE_POOL, } from '../../../util';
|
|
6
8
|
import { HooksOptions } from '../../../util/hooksOptions';
|
|
7
9
|
// import { log } from '../../../util/log';
|
|
@@ -50,6 +52,105 @@ export function computeAllRingFewV2Routes(tokenIn, tokenOut, pools, maxHops) {
|
|
|
50
52
|
return new RingFewV2Route(route, tokenIn, tokenOut);
|
|
51
53
|
}, (pool, token) => pool.involvesToken(token), pools, maxHops);
|
|
52
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* ============================================================================
|
|
57
|
+
* Token-Space Bridge Pools (Wrap/Unwrap Bridges)
|
|
58
|
+
* ============================================================================
|
|
59
|
+
*
|
|
60
|
+
* 问题:V3 池用原始代币(USDC),FewV2 池用包装代币(fwUSDC)。
|
|
61
|
+
* BFS 搜索路径时,USDC 和 fwUSDC 是不同的 token,无法直接跨协议串联。
|
|
62
|
+
*
|
|
63
|
+
* 解决:创建「桥接池」连接两个 token 空间(原始 ↔ 包装)。
|
|
64
|
+
* 桥接池是一个 V4Pool(fee=0, tickSpacing=0, liquidity=0),
|
|
65
|
+
* 不代表真实流动性,仅作为 BFS 路径发现和路径编码的占位符。
|
|
66
|
+
*
|
|
67
|
+
* 为什么用 V4Pool?因为 MixedRouteQuoterV2 合约已有 "protocol version 0" 机制:
|
|
68
|
+
* - tickSpacing=0 在 encodeMixedRouteToPath 中编码为 version 0
|
|
69
|
+
* - quoter 合约遇到 version 0 时,直接把 amountIn 透传为 amountOut(1:1)
|
|
70
|
+
* - 这个机制原本是给 ETH↔WETH 用的,我们复用于 original↔fewToken
|
|
71
|
+
*
|
|
72
|
+
* 整条路径示例:
|
|
73
|
+
* WETH →[V3]→ USDC →[桥接池]→ fwUSDC →[FewV2]→ fwDAI →[桥接池]→ DAI
|
|
74
|
+
*
|
|
75
|
+
* 识别方法:pool instanceof V4Pool && pool.tickSpacing === 0
|
|
76
|
+
* 见 isTokenWrapBridge() 函数。
|
|
77
|
+
* ============================================================================
|
|
78
|
+
*/
|
|
79
|
+
/**
|
|
80
|
+
* 扫描所有 FewV2 池中的 fewToken,为每个 fewToken 创建一个
|
|
81
|
+
* originalToken ↔ fewToken 的桥接池,让 BFS 能发现跨协议路径。
|
|
82
|
+
*/
|
|
83
|
+
function createFewTokenWrapBridges(pools, chainId) {
|
|
84
|
+
if (!RING_FEW_V2_SUPPORTED.includes(chainId))
|
|
85
|
+
return [];
|
|
86
|
+
// Collect all unique fewTokens from FewV2 pools
|
|
87
|
+
const fewTokens = new Set();
|
|
88
|
+
const fewTokenMap = new Map(); // address -> Token
|
|
89
|
+
for (const pool of pools) {
|
|
90
|
+
if (pool instanceof RingFewV2Pair) {
|
|
91
|
+
for (const token of [pool.token0, pool.token1]) {
|
|
92
|
+
if (isFewToken(token) && !fewTokens.has(token.address.toLowerCase())) {
|
|
93
|
+
fewTokens.add(token.address.toLowerCase());
|
|
94
|
+
fewTokenMap.set(token.address.toLowerCase(), token);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const bridgePools = [];
|
|
100
|
+
for (const [, fewToken] of fewTokenMap) {
|
|
101
|
+
// Derive the original token from the fewToken
|
|
102
|
+
let originalToken;
|
|
103
|
+
// Search V3/V2 pools for a token that maps to this fewToken
|
|
104
|
+
for (const pool of pools) {
|
|
105
|
+
if (pool instanceof RingFewV2Pair)
|
|
106
|
+
continue;
|
|
107
|
+
for (const token of [pool.token0, pool.token1]) {
|
|
108
|
+
try {
|
|
109
|
+
const derived = getFewTokenFromOriginalToken(token, chainId);
|
|
110
|
+
if (derived.address.toLowerCase() === fewToken.address.toLowerCase()) {
|
|
111
|
+
originalToken = token;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (_a) {
|
|
116
|
+
// Not all tokens can be wrapped
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (originalToken)
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (!originalToken)
|
|
123
|
+
continue;
|
|
124
|
+
// 创建桥接池:tickSpacing=0 → 路径编码为 version 0 → quoter 合约 1:1 透传
|
|
125
|
+
try {
|
|
126
|
+
const SQRT_PRICE_1_TO_1 = 79228162514264337593543950336; // sqrt(1) * 2^96,表示 1:1 价格
|
|
127
|
+
const bridgePool = new V4Pool(originalToken, fewToken, 0, // fee = 0(桥接不收费)
|
|
128
|
+
0, // tickSpacing = 0(桥接池标志,触发 version 0 编码)
|
|
129
|
+
ADDRESS_ZERO, // hooks = none
|
|
130
|
+
SQRT_PRICE_1_TO_1, // 1:1 价格(wrap/unwrap 不改变金额)
|
|
131
|
+
0, // liquidity = 0(桥接池没有真实流动性)
|
|
132
|
+
0 // tickCurrent = 0
|
|
133
|
+
);
|
|
134
|
+
bridgePools.push(bridgePool);
|
|
135
|
+
}
|
|
136
|
+
catch (_b) {
|
|
137
|
+
// Skip if pool creation fails
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return bridgePools;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 判断一个池是否为「桥接池」(用于 wrap/unwrap token 空间转换)。
|
|
144
|
+
* 桥接池借用 V4Pool 结构,以 tickSpacing === 0 作为识别标志。
|
|
145
|
+
* 它不代表真实流动性,仅用于 BFS 路径发现和路径编码。
|
|
146
|
+
*/
|
|
147
|
+
export function isTokenWrapBridge(pool) {
|
|
148
|
+
return pool instanceof V4Pool && pool.tickSpacing === 0;
|
|
149
|
+
}
|
|
150
|
+
/** @deprecated 使用 isTokenWrapBridge 代替 */
|
|
151
|
+
export function isFakeV4BridgePool(pool) {
|
|
152
|
+
return isTokenWrapBridge(pool);
|
|
153
|
+
}
|
|
53
154
|
export function computeAllMixedRoutes(currencyIn, currencyOut, parts, maxHops, shouldEnableMixedRouteEthWeth, hooksOptions) {
|
|
54
155
|
// first we need to filter non v4-pools
|
|
55
156
|
const filteredPools = !hooksOptions || hooksOptions === HooksOptions.HOOKS_INCLUSIVE
|
|
@@ -67,43 +168,45 @@ export function computeAllMixedRoutes(currencyIn, currencyOut, parts, maxHops, s
|
|
|
67
168
|
const v4HookfulPools = parts.filter((pool) => pool instanceof V4Pool && pool.hooks === ADDRESS_ZERO);
|
|
68
169
|
parts = filteredPools.concat(v4HookfulPools);
|
|
69
170
|
}
|
|
70
|
-
//
|
|
171
|
+
// ---- 添加桥接池,连接不同的 token 空间 ----
|
|
172
|
+
// 1) ETH↔WETH 桥接:让 V3 的 WETH 池和 V4 的 ETH 池能串联
|
|
173
|
+
// 2) original↔fewToken 桥接:让 V3 的 USDC 池和 FewV2 的 fwUSDC 池能串联
|
|
71
174
|
const containsV4NativePools = parts.filter((pool) => pool instanceof V4Pool &&
|
|
72
175
|
pool.v4InvolvesToken(nativeOnChain(currencyIn.chainId))).length > 0;
|
|
73
|
-
|
|
176
|
+
let amendedPools = containsV4NativePools && shouldEnableMixedRouteEthWeth
|
|
74
177
|
? parts.concat(V4_ETH_WETH_FAKE_POOL[currencyIn.chainId])
|
|
75
|
-
: parts;
|
|
76
|
-
//
|
|
178
|
+
: [...parts];
|
|
179
|
+
// 添加 fewToken 桥接池(original↔fewToken,与 ETH↔WETH 桥接池使用相同的 tickSpacing=0 机制)
|
|
180
|
+
const fewTokenBridges = createFewTokenWrapBridges(parts, currencyIn.chainId);
|
|
181
|
+
if (fewTokenBridges.length > 0) {
|
|
182
|
+
amendedPools = amendedPools.concat(fewTokenBridges);
|
|
183
|
+
}
|
|
184
|
+
// 如果有桥接池存在,构建 MixedRoute 时需要保留它们(retainFakePools=true),
|
|
185
|
+
// 否则 MixedRouteSDK 构造函数会把 tickSpacing=0 的池过滤掉,导致 token 路径断裂
|
|
186
|
+
const hasWrapBridges = containsV4NativePools || fewTokenBridges.length > 0;
|
|
77
187
|
const routesRaw = computeAllRoutes(currencyIn, currencyOut, (route, currencyIn, currencyOut) => {
|
|
78
|
-
//
|
|
79
|
-
return new MixedRoute(route, currencyIn, currencyOut,
|
|
188
|
+
// hasWrapBridges=true → 保留桥接池在路由中,供报价阶段编码和执行阶段生成 wrap/unwrap 命令
|
|
189
|
+
return new MixedRoute(route, currencyIn, currencyOut, hasWrapBridges);
|
|
80
190
|
}, (pool, currency) => currency.isNative
|
|
81
191
|
? pool.involvesToken(currency)
|
|
82
192
|
: pool.involvesToken(currency), amendedPools, maxHops);
|
|
83
|
-
/// filter out pure v4
|
|
193
|
+
/// filter out pure v4, v3, v2, and fewv2 routes (mixed routes must contain pools from 2+ protocols)
|
|
84
194
|
return routesRaw.filter((route) => {
|
|
85
195
|
return (!route.pools.every((pool) => pool instanceof V4Pool) &&
|
|
86
196
|
!route.pools.every((pool) => pool instanceof V3Pool) &&
|
|
87
|
-
!route.pools.every((pool) => pool instanceof Pair)
|
|
197
|
+
!route.pools.every((pool) => pool instanceof Pair) &&
|
|
198
|
+
!route.pools.every((pool) => pool instanceof RingFewV2Pair));
|
|
88
199
|
});
|
|
89
200
|
}
|
|
90
201
|
export function computeAllRoutes(tokenIn, tokenOut, buildRoute, involvesToken, pools, maxHops) {
|
|
91
202
|
const poolsUsed = Array(pools.length).fill(false);
|
|
92
203
|
const routes = [];
|
|
93
204
|
const computeRoutes = (tokenIn, tokenOut, currentRoute, poolsUsed, tokensVisited, _previousTokenOut) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
: maxHops;
|
|
100
|
-
// amendedMaxHops is the maxHops + 1 if the current route contains a fake v4 pool
|
|
101
|
-
// b/c we want to allow the route to go through the fake v4 pool
|
|
102
|
-
// also gas wise, if a route goes through the fake v4 pool, mixed quoter will add the wrap/unwrap gas cost:
|
|
103
|
-
// https://github.com/Uniswap/mixed-quoter/pull/41/files#diff-a4d1289f264d1da22aac20cc55a9d01c8ba9cccd76ce1af8f952ec9034e7e1aaR189
|
|
104
|
-
// and SOR will use the gas cost from the mixed quoter:
|
|
105
|
-
// https://github.com/Uniswap/smart-order-router/blob/17da523f1af050e6430afb866d96681346c8fb8b/src/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.ts#L222
|
|
106
|
-
if (currentRoute.length > amendedMaxHops) {
|
|
205
|
+
// 桥接池(tickSpacing=0)不消耗真实流动性,只做 token 空间转换。
|
|
206
|
+
// 每个桥接池在路径中占一跳,但不应计入 maxHops 限制,否则会截断合法路径。
|
|
207
|
+
const wrapBridgeCount = currentRoute.filter(isTokenWrapBridge).length;
|
|
208
|
+
const effectiveMaxHops = maxHops + wrapBridgeCount;
|
|
209
|
+
if (currentRoute.length > effectiveMaxHops) {
|
|
107
210
|
return;
|
|
108
211
|
}
|
|
109
212
|
if (currentRoute.length > 0 &&
|
|
@@ -138,4 +241,4 @@ export function computeAllRoutes(tokenIn, tokenOut, buildRoute, involvesToken, p
|
|
|
138
241
|
computeRoutes(tokenIn, tokenOut, [], poolsUsed, new Set([getAddressLowerCase(tokenIn)]));
|
|
139
242
|
return routes;
|
|
140
243
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1hbGwtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9jb21wdXRlLWFsbC1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBUyxNQUFNLDJCQUEyQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUNMLFVBQVUsRUFDVixjQUFjLEVBRWQsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEdBQ1IsTUFBTSxjQUFjLENBQUM7QUFFdEIsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxVQUFvQixFQUNwQixXQUFxQixFQUNyQixLQUFlLEVBQ2YsT0FBZSxFQUNmLFlBQTJCO0lBRTNCLElBQUksYUFBYSxHQUFhLEtBQUssQ0FBQztJQUVwQyxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsVUFBVSxFQUFFO1FBQzVDLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsSUFBSSxZQUFZLEtBQUssWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUMxQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElB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
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1hbGwtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2Z1bmN0aW9ucy9jb21wdXRlLWFsbC1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBUyxNQUFNLDJCQUEyQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUNMLElBQUksSUFBSSxhQUFhLEVBQ3JCLFVBQVUsRUFDViw0QkFBNEIsR0FDN0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELDJDQUEyQztBQUMzQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFFZCxPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sR0FDUixNQUFNLGNBQWMsQ0FBQztBQUV0QixNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQW9CLEVBQ3BCLFdBQXFCLEVBQ3JCLEtBQWUsRUFDZixPQUFlLEVBQ2YsWUFBMkI7SUFFM0IsSUFBSSxhQUFhLEdBQWEsS0FBSyxDQUFDO0lBRXBDLElBQUksWUFBWSxLQUFLLFlBQVksQ0FBQyxVQUFVLEVBQUU7UUFDNUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElB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
|