@ring-protocol/smart-order-router 0.5.4 → 0.5.5
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.
|
@@ -45,6 +45,7 @@ const routeToPools = (route) => {
|
|
|
45
45
|
};
|
|
46
46
|
exports.routeToPools = routeToPools;
|
|
47
47
|
const poolToString = (pool) => {
|
|
48
|
+
var _a, _b;
|
|
48
49
|
if (pool instanceof v4_sdk_1.Pool) {
|
|
49
50
|
return ` -- ${pool.fee / 10000}% [${v4_sdk_1.Pool.getPoolId(pool.token0, pool.token1, pool.fee, pool.tickSpacing, pool.hooks)}]`;
|
|
50
51
|
}
|
|
@@ -58,7 +59,31 @@ const poolToString = (pool) => {
|
|
|
58
59
|
return ` -- [${few_v2_sdk_1.Pair.getAddress(pool.token0, pool.token1)}]`;
|
|
59
60
|
}
|
|
60
61
|
else {
|
|
61
|
-
|
|
62
|
+
// Fallback handling for cases where the pool is a "plain object" V2 pair
|
|
63
|
+
// This happens in some environments (e.g. Lambda / different bundlers)
|
|
64
|
+
// where Pair comes from a different copy of the SDK or has been
|
|
65
|
+
// serialized / deserialized.
|
|
66
|
+
if (pool &&
|
|
67
|
+
typeof pool === 'object' &&
|
|
68
|
+
('liquidityToken' in pool || 'tokenAmounts' in pool)) {
|
|
69
|
+
const poolObj = pool;
|
|
70
|
+
let token0Address;
|
|
71
|
+
let token1Address;
|
|
72
|
+
if (poolObj.tokenAmounts && Array.isArray(poolObj.tokenAmounts)) {
|
|
73
|
+
const token0 = (_a = poolObj.tokenAmounts[0]) === null || _a === void 0 ? void 0 : _a.currency;
|
|
74
|
+
const token1 = (_b = poolObj.tokenAmounts[1]) === null || _b === void 0 ? void 0 : _b.currency;
|
|
75
|
+
token0Address = (token0 === null || token0 === void 0 ? void 0 : token0.address) || (token0 === null || token0 === void 0 ? void 0 : token0.id);
|
|
76
|
+
token1Address = (token1 === null || token1 === void 0 ? void 0 : token1.address) || (token1 === null || token1 === void 0 ? void 0 : token1.id);
|
|
77
|
+
}
|
|
78
|
+
if (token0Address && token1Address) {
|
|
79
|
+
// For logging purposes we just show the two addresses. This avoids
|
|
80
|
+
// throwing while still giving useful debug information.
|
|
81
|
+
return ` -- [${token0Address}/${token1Address}]`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// As a last resort, avoid throwing – just show an opaque placeholder so
|
|
85
|
+
// route logging never breaks the main quote flow.
|
|
86
|
+
return ' -- [UnknownPool]';
|
|
62
87
|
}
|
|
63
88
|
};
|
|
64
89
|
exports.poolToString = poolToString;
|
|
@@ -88,47 +113,27 @@ const routeToString = (route) => {
|
|
|
88
113
|
return ` -- ${pool.fee / 10000}% [${v4_sdk_1.Pool.getPoolId(pool.token0, pool.token1, pool.fee, pool.tickSpacing, pool.hooks)}]`;
|
|
89
114
|
}
|
|
90
115
|
else {
|
|
91
|
-
//
|
|
92
|
-
//
|
|
116
|
+
// Same fallback logic as poolToString: tolerate serialized / plain-object
|
|
117
|
+
// V2 pairs so that logging never causes a hard failure.
|
|
93
118
|
if (pool &&
|
|
94
119
|
typeof pool === 'object' &&
|
|
95
120
|
('liquidityToken' in pool || 'tokenAmounts' in pool)) {
|
|
96
|
-
|
|
97
|
-
// Try to extract token addresses from tokenAmounts
|
|
121
|
+
const poolObj = pool;
|
|
98
122
|
let token0Address;
|
|
99
123
|
let token1Address;
|
|
100
|
-
const poolObj = pool;
|
|
101
124
|
if (poolObj.tokenAmounts && Array.isArray(poolObj.tokenAmounts)) {
|
|
102
125
|
const token0 = (_a = poolObj.tokenAmounts[0]) === null || _a === void 0 ? void 0 : _a.currency;
|
|
103
126
|
const token1 = (_b = poolObj.tokenAmounts[1]) === null || _b === void 0 ? void 0 : _b.currency;
|
|
104
127
|
token0Address = (token0 === null || token0 === void 0 ? void 0 : token0.address) || (token0 === null || token0 === void 0 ? void 0 : token0.id);
|
|
105
128
|
token1Address = (token1 === null || token1 === void 0 ? void 0 : token1.address) || (token1 === null || token1 === void 0 ? void 0 : token1.id);
|
|
106
129
|
}
|
|
107
|
-
// If we can extract addresses, use them for the route string
|
|
108
|
-
// This allows the route to be logged even with serialized pairs
|
|
109
130
|
if (token0Address && token1Address) {
|
|
110
|
-
// For logging purposes, we'll use the addresses directly
|
|
111
|
-
// This is a fallback when Pair instances are not available
|
|
112
131
|
return ` -- [${token0Address}/${token1Address}]`;
|
|
113
132
|
}
|
|
114
133
|
}
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const hasLiquidityToken = pool && typeof pool === 'object' && 'liquidityToken' in pool;
|
|
119
|
-
const hasTokenAmounts = pool && typeof pool === 'object' && 'tokenAmounts' in pool;
|
|
120
|
-
let errorMsg = `Unsupported pool type. `;
|
|
121
|
-
errorMsg += `Pool type: ${poolType}, `;
|
|
122
|
-
errorMsg += `Pool keys: ${poolKeys.join(', ')}, `;
|
|
123
|
-
errorMsg += `Route protocol: ${route.protocol}, `;
|
|
124
|
-
if (hasLiquidityToken || hasTokenAmounts) {
|
|
125
|
-
errorMsg += `Pool appears to be a serialized/deserialized Pair object. `;
|
|
126
|
-
errorMsg += `This may indicate routes are being incorrectly serialized or pools are not being properly instantiated. `;
|
|
127
|
-
errorMsg += `This typically happens when routes are cached and retrieved from external storage (e.g., Redis). `;
|
|
128
|
-
errorMsg += `The API layer should ensure Pair objects are properly reconstructed when deserializing cached routes. `;
|
|
129
|
-
}
|
|
130
|
-
errorMsg += `Pool data: ${JSON.stringify(pool).substring(0, 500)}`;
|
|
131
|
-
throw new Error(errorMsg);
|
|
134
|
+
// Last-resort fallback: don't throw, just emit an opaque marker so
|
|
135
|
+
// routeToString always succeeds.
|
|
136
|
+
return ' -- [UnknownPool]';
|
|
132
137
|
}
|
|
133
138
|
});
|
|
134
139
|
for (let i = 0; i < tokenPath.length; i++) {
|
|
@@ -196,4 +201,4 @@ function poolIsInExcludedProtocols(pool, excludedProtocolsFromMixed) {
|
|
|
196
201
|
return false;
|
|
197
202
|
}
|
|
198
203
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWwvcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUErRDtBQUMvRCwwREFBcUQ7QUFFckQsc0RBQXFFO0FBQ3JFLGtEQUE2QztBQUM3QyxrREFBdUQ7QUFDdkQsa0RBQXVEO0FBQ3ZELG9EQUF1QjtBQU92Qix1RkFBMEU7QUFHMUUsMkNBQXdEO0FBRXhELHdCQUEwRDtBQUVuRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQXNCLEVBQWMsRUFBRTtJQUNsRSxRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFDdEIsS0FBSyxxQkFBUSxDQUFDLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDNUIsS0FBSyxxQkFBUSxDQUFDLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxxQkFBUSxDQUFDLEVBQUUsQ0FBQztRQUNqQixLQUFLLHFCQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3BCLEtBQUsscUJBQVEsQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQztRQUNwQjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2pFO0FBQ0gsQ0FBQyxDQUFDO0FBYlcsUUFBQSxhQUFhLGlCQWF4QjtBQUVLLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBc0IsRUFBVyxFQUFFO0lBQzlELFFBQVEsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUN0QixLQUFLLHFCQUFRLENBQUMsRUFBRSxDQUFDO1FBQ2pCLEtBQUsscUJBQVEsQ0FBQyxFQUFFLENBQUM7UUFDakIsS0FBSyxxQkFBUSxDQUFDLEtBQUs7WUFDakIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3JCLEtBQUsscUJBQVEsQ0FBQyxF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
|