@ring-protocol/smart-order-router 0.5.4 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/main/providers/caching/route/model/cached-route.js +9 -1
- package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +1 -1
- package/build/main/routers/alpha-router/functions/compute-all-routes.js +3 -3
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/util/routes.js +16 -29
- package/build/module/providers/caching/route/model/cached-route.js +9 -1
- package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +1 -1
- package/build/module/routers/alpha-router/functions/compute-all-routes.js +3 -3
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/routes.js +21 -34
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Pair as
|
|
1
|
+
import { Pair as FewV2Pair } from '@ring-protocol/few-v2-sdk';
|
|
2
2
|
import { Protocol } from '@ring-protocol/router-sdk';
|
|
3
3
|
import { Percent } from '@ring-protocol/sdk-core';
|
|
4
4
|
import { Pair } from '@ring-protocol/v2-sdk';
|
|
@@ -7,6 +7,7 @@ import { Pool as V4Pool } from '@ring-protocol/v4-sdk';
|
|
|
7
7
|
import _ from 'lodash';
|
|
8
8
|
import { addFn } from '../routers/alpha-router/functions/best-swap-route';
|
|
9
9
|
import { V3_CORE_FACTORY_ADDRESSES } from './addresses';
|
|
10
|
+
import { log } from './log';
|
|
10
11
|
import { CurrencyAmount, V4_ETH_WETH_FAKE_POOL } from '.';
|
|
11
12
|
export const routeToTokens = (route) => {
|
|
12
13
|
switch (route.protocol) {
|
|
@@ -46,11 +47,14 @@ export const poolToString = (pool) => {
|
|
|
46
47
|
else if (pool instanceof Pair) {
|
|
47
48
|
return ` -- [${Pair.getAddress(pool.token0, pool.token1)}]`;
|
|
48
49
|
}
|
|
49
|
-
else if (pool instanceof
|
|
50
|
-
return ` -- [${
|
|
50
|
+
else if (pool instanceof FewV2Pair) {
|
|
51
|
+
return ` -- [${FewV2Pair.getAddress(pool.token0, pool.token1)}]`;
|
|
51
52
|
}
|
|
52
53
|
else {
|
|
53
|
-
|
|
54
|
+
log.info('2025-12-16-15-30');
|
|
55
|
+
log.info(`Unsupported pool ${JSON.stringify(pool)}`);
|
|
56
|
+
return `-- [UnknownPool] ${JSON.stringify(pool)}`;
|
|
57
|
+
// throw new Error(`Unsupported pool ${JSON.stringify(pool)}`);
|
|
54
58
|
}
|
|
55
59
|
};
|
|
56
60
|
export const routeToString = (route) => {
|
|
@@ -63,8 +67,8 @@ export const routeToString = (route) => {
|
|
|
63
67
|
if (pool instanceof Pair) {
|
|
64
68
|
return ` -- [${Pair.getAddress(pool.token0, pool.token1)}]`;
|
|
65
69
|
}
|
|
66
|
-
else if (pool instanceof
|
|
67
|
-
return ` -- [${
|
|
70
|
+
else if (pool instanceof FewV2Pair) {
|
|
71
|
+
return ` -- [${FewV2Pair.getAddress(pool.token0, pool.token1)}]`;
|
|
68
72
|
}
|
|
69
73
|
else if (pool instanceof V3Pool) {
|
|
70
74
|
return ` -- ${pool.fee / 10000}% [${V3Pool.getAddress(pool.token0, pool.token1, pool.fee, undefined, V3_CORE_FACTORY_ADDRESSES[pool.chainId])}]`;
|
|
@@ -79,47 +83,27 @@ export const routeToString = (route) => {
|
|
|
79
83
|
return ` -- ${pool.fee / 10000}% [${V4Pool.getPoolId(pool.token0, pool.token1, pool.fee, pool.tickSpacing, pool.hooks)}]`;
|
|
80
84
|
}
|
|
81
85
|
else {
|
|
82
|
-
//
|
|
83
|
-
//
|
|
86
|
+
// Same fallback logic as poolToString: tolerate serialized / plain-object
|
|
87
|
+
// V2 pairs so that logging never causes a hard failure.
|
|
84
88
|
if (pool &&
|
|
85
89
|
typeof pool === 'object' &&
|
|
86
90
|
('liquidityToken' in pool || 'tokenAmounts' in pool)) {
|
|
87
|
-
|
|
88
|
-
// Try to extract token addresses from tokenAmounts
|
|
91
|
+
const poolObj = pool;
|
|
89
92
|
let token0Address;
|
|
90
93
|
let token1Address;
|
|
91
|
-
const poolObj = pool;
|
|
92
94
|
if (poolObj.tokenAmounts && Array.isArray(poolObj.tokenAmounts)) {
|
|
93
95
|
const token0 = (_a = poolObj.tokenAmounts[0]) === null || _a === void 0 ? void 0 : _a.currency;
|
|
94
96
|
const token1 = (_b = poolObj.tokenAmounts[1]) === null || _b === void 0 ? void 0 : _b.currency;
|
|
95
97
|
token0Address = (token0 === null || token0 === void 0 ? void 0 : token0.address) || (token0 === null || token0 === void 0 ? void 0 : token0.id);
|
|
96
98
|
token1Address = (token1 === null || token1 === void 0 ? void 0 : token1.address) || (token1 === null || token1 === void 0 ? void 0 : token1.id);
|
|
97
99
|
}
|
|
98
|
-
// If we can extract addresses, use them for the route string
|
|
99
|
-
// This allows the route to be logged even with serialized pairs
|
|
100
100
|
if (token0Address && token1Address) {
|
|
101
|
-
// For logging purposes, we'll use the addresses directly
|
|
102
|
-
// This is a fallback when Pair instances are not available
|
|
103
101
|
return ` -- [${token0Address}/${token1Address}]`;
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const hasLiquidityToken = pool && typeof pool === 'object' && 'liquidityToken' in pool;
|
|
110
|
-
const hasTokenAmounts = pool && typeof pool === 'object' && 'tokenAmounts' in pool;
|
|
111
|
-
let errorMsg = `Unsupported pool type. `;
|
|
112
|
-
errorMsg += `Pool type: ${poolType}, `;
|
|
113
|
-
errorMsg += `Pool keys: ${poolKeys.join(', ')}, `;
|
|
114
|
-
errorMsg += `Route protocol: ${route.protocol}, `;
|
|
115
|
-
if (hasLiquidityToken || hasTokenAmounts) {
|
|
116
|
-
errorMsg += `Pool appears to be a serialized/deserialized Pair object. `;
|
|
117
|
-
errorMsg += `This may indicate routes are being incorrectly serialized or pools are not being properly instantiated. `;
|
|
118
|
-
errorMsg += `This typically happens when routes are cached and retrieved from external storage (e.g., Redis). `;
|
|
119
|
-
errorMsg += `The API layer should ensure Pair objects are properly reconstructed when deserializing cached routes. `;
|
|
120
|
-
}
|
|
121
|
-
errorMsg += `Pool data: ${JSON.stringify(pool).substring(0, 500)}`;
|
|
122
|
-
throw new Error(errorMsg);
|
|
104
|
+
// Last-resort fallback: don't throw, just emit an opaque marker so
|
|
105
|
+
// routeToString always succeeds.
|
|
106
|
+
return ' -- [UnknownPool]';
|
|
123
107
|
}
|
|
124
108
|
});
|
|
125
109
|
for (let i = 0; i < tokenPath.length; i++) {
|
|
@@ -170,7 +154,7 @@ export function shouldWipeoutCachedRoutes(cachedRoutes, routingConfig) {
|
|
|
170
154
|
return containsExcludedProtocolPools !== undefined;
|
|
171
155
|
}
|
|
172
156
|
function poolIsInExcludedProtocols(pool, excludedProtocolsFromMixed) {
|
|
173
|
-
var _a, _b, _c;
|
|
157
|
+
var _a, _b, _c, _d;
|
|
174
158
|
if (pool instanceof V4Pool) {
|
|
175
159
|
return (_a = excludedProtocolsFromMixed === null || excludedProtocolsFromMixed === void 0 ? void 0 : excludedProtocolsFromMixed.includes(Protocol.V4)) !== null && _a !== void 0 ? _a : false;
|
|
176
160
|
}
|
|
@@ -180,8 +164,11 @@ function poolIsInExcludedProtocols(pool, excludedProtocolsFromMixed) {
|
|
|
180
164
|
else if (pool instanceof Pair) {
|
|
181
165
|
return (_c = excludedProtocolsFromMixed === null || excludedProtocolsFromMixed === void 0 ? void 0 : excludedProtocolsFromMixed.includes(Protocol.V2)) !== null && _c !== void 0 ? _c : false;
|
|
182
166
|
}
|
|
167
|
+
else if (pool instanceof FewV2Pair) {
|
|
168
|
+
return (_d = excludedProtocolsFromMixed === null || excludedProtocolsFromMixed === void 0 ? void 0 : excludedProtocolsFromMixed.includes(Protocol.FEWV2)) !== null && _d !== void 0 ? _d : false;
|
|
169
|
+
}
|
|
183
170
|
else {
|
|
184
171
|
return false;
|
|
185
172
|
}
|
|
186
173
|
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWwvcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLElBQUksU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJELE9BQU8sRUFBcUIsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFPdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRzFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFFMUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBc0IsRUFBYyxFQUFFO0lBQ2xFLFFBQVEsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUN0QixLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzVCLEtBQUssUUFBUSxDQUFDLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ2pCLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLFFBQVEsQ0FBQyxLQUFLO1lBQ2pC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
|