@paraswap/dex-lib 5.1.15 → 5.1.16
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/abi/maverick-v2/MaverickV2Quoter.json +278 -0
- package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js +1 -8
- package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-pool-math.d.ts +3 -4
- package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js +20 -12
- package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js +8 -8
- package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-v2-pool.d.ts +4 -4
- package/build/dex/maverick-v2/maverick-v2-pool.js +129 -72
- package/build/dex/maverick-v2/maverick-v2-pool.js.map +1 -1
- package/build/dex/maverick-v2/maverick-v2.js +8 -3
- package/build/dex/maverick-v2/maverick-v2.js.map +1 -1
- package/build/dex/maverick-v2/scripts/compare-onchain-quotes.d.ts +1 -0
- package/build/dex/maverick-v2/scripts/compare-onchain-quotes.js +285 -0
- package/build/dex/maverick-v2/scripts/compare-onchain-quotes.js.map +1 -0
- package/build/dex/maverick-v2/types.d.ts +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
/* eslint-disable no-console */
|
|
40
|
+
/*
|
|
41
|
+
|
|
42
|
+
Compares MaverickV2 local pricing with on-chain results at one block, for
|
|
43
|
+
every pool the dex initializes on the given network:
|
|
44
|
+
- tick sqrt price / liquidity vs PoolLens.getTickSqrtPriceAndL
|
|
45
|
+
- estimateSwap (amountIn, amountOut) vs Quoter.calculateSwap, both
|
|
46
|
+
directions, exact-in and exact-out, using the same tickLimit as pricing
|
|
47
|
+
|
|
48
|
+
Usage: npx ts-node src/dex/maverick-v2/scripts/compare-onchain-quotes.ts [network=1]
|
|
49
|
+
|
|
50
|
+
*/
|
|
51
|
+
const dotenv = __importStar(require("dotenv"));
|
|
52
|
+
dotenv.config();
|
|
53
|
+
const abi_1 = require("@ethersproject/abi");
|
|
54
|
+
const dex_helper_1 = require("../../../dex-helper");
|
|
55
|
+
const maverick_v2_1 = require("../maverick-v2");
|
|
56
|
+
const config_1 = require("../config");
|
|
57
|
+
const maverick_tick_math_1 = require("../maverick-math/maverick-tick-math");
|
|
58
|
+
const decoders_1 = require("../../../lib/decoders");
|
|
59
|
+
const MaverickV2Quoter_json_1 = __importDefault(require("../../../abi/maverick-v2/MaverickV2Quoter.json"));
|
|
60
|
+
const MaverickV2PoolLens_json_1 = __importDefault(require("../../../abi/maverick-v2/MaverickV2PoolLens.json"));
|
|
61
|
+
const MaverickV2Pool_json_1 = __importDefault(require("../../../abi/maverick-v2/MaverickV2Pool.json"));
|
|
62
|
+
const network = Number(process.argv[2] || 1);
|
|
63
|
+
const dexKey = 'MaverickV2';
|
|
64
|
+
const quoterIface = new abi_1.Interface(MaverickV2Quoter_json_1.default);
|
|
65
|
+
const lensIface = new abi_1.Interface(MaverickV2PoolLens_json_1.default);
|
|
66
|
+
const poolIface = new abi_1.Interface(MaverickV2Pool_json_1.default);
|
|
67
|
+
const MAX_UINT128 = (1n << 128n) - 1n;
|
|
68
|
+
const AMOUNT_MULTIPLIERS = [
|
|
69
|
+
[1n, 1000000n],
|
|
70
|
+
[1n, 1000n],
|
|
71
|
+
[1n, 7n],
|
|
72
|
+
[1n, 1n],
|
|
73
|
+
[3n, 1n],
|
|
74
|
+
[17n, 1n],
|
|
75
|
+
[123n, 1n],
|
|
76
|
+
[1000n, 1n],
|
|
77
|
+
[12345n, 1n],
|
|
78
|
+
[100000n, 1n],
|
|
79
|
+
];
|
|
80
|
+
const RESERVE_FRACTIONS = [
|
|
81
|
+
[1n, 10n],
|
|
82
|
+
[1n, 2n],
|
|
83
|
+
[9n, 10n],
|
|
84
|
+
[999n, 1000n],
|
|
85
|
+
];
|
|
86
|
+
const decodePair = (iface, fn, keys) => (result) => {
|
|
87
|
+
const [success, data] = (0, decoders_1.extractSuccessAndValue)(result);
|
|
88
|
+
if (!success || data === '0x')
|
|
89
|
+
return null;
|
|
90
|
+
const decoded = iface.decodeFunctionResult(fn, data);
|
|
91
|
+
return [
|
|
92
|
+
BigInt(decoded[keys[0]].toString()),
|
|
93
|
+
BigInt(decoded[keys[1]].toString()),
|
|
94
|
+
];
|
|
95
|
+
};
|
|
96
|
+
const decodeQuote = decodePair(quoterIface, 'calculateSwap', [
|
|
97
|
+
'amountIn',
|
|
98
|
+
'amountOut',
|
|
99
|
+
]);
|
|
100
|
+
const decodeTick = decodePair(lensIface, 'getTickSqrtPriceAndL', [
|
|
101
|
+
'sqrtPrice',
|
|
102
|
+
'liquidity',
|
|
103
|
+
]);
|
|
104
|
+
(async () => {
|
|
105
|
+
const dexHelper = new dex_helper_1.DummyDexHelper(network);
|
|
106
|
+
const dex = new maverick_v2_1.MaverickV2(network, dexKey, dexHelper);
|
|
107
|
+
const blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
|
|
108
|
+
await dex.initializePricing(blockNumber);
|
|
109
|
+
const { quoterAddress, poolLensAddress } = config_1.MaverickV2Config[dexKey][network];
|
|
110
|
+
const pools = Object.values(dex.pools).filter(p => p.getState(blockNumber));
|
|
111
|
+
console.log(`network=${network} block=${blockNumber} pools=${pools.length}`);
|
|
112
|
+
// ticks
|
|
113
|
+
const tickCalls = [];
|
|
114
|
+
const tickExpected = [];
|
|
115
|
+
for (const pool of pools) {
|
|
116
|
+
const state = pool.getState(blockNumber);
|
|
117
|
+
for (const [tickKey, tick] of Object.entries(state.ticks)) {
|
|
118
|
+
const [lower, upper] = maverick_tick_math_1.MaverickTickMath.tickSqrtPrices(pool.tickSpacing, BigInt(tickKey));
|
|
119
|
+
tickExpected.push({
|
|
120
|
+
pool: pool.address,
|
|
121
|
+
tick: BigInt(tickKey),
|
|
122
|
+
local: maverick_tick_math_1.MaverickTickMath.getTickSqrtPriceAndL(tick.reserveA, tick.reserveB, lower, upper),
|
|
123
|
+
});
|
|
124
|
+
tickCalls.push({
|
|
125
|
+
target: poolLensAddress,
|
|
126
|
+
callData: lensIface.encodeFunctionData('getTickSqrtPriceAndL', [
|
|
127
|
+
pool.address,
|
|
128
|
+
tickKey,
|
|
129
|
+
]),
|
|
130
|
+
decodeFunction: decodeTick,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const tickResults = await dexHelper.multiWrapper.tryAggregate(false, tickCalls, blockNumber, 200, false);
|
|
135
|
+
let tickMismatches = 0;
|
|
136
|
+
tickResults.forEach(({ returnData: onchain }, i) => {
|
|
137
|
+
const { pool, tick, local } = tickExpected[i];
|
|
138
|
+
if (!onchain || !local)
|
|
139
|
+
return;
|
|
140
|
+
if (onchain[0] !== local[0] || onchain[1] !== local[1]) {
|
|
141
|
+
tickMismatches++;
|
|
142
|
+
console.log(`TICK MISMATCH pool=${pool} tick=${tick} local=[${local}] onchain=[${onchain}]`);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const cases = [];
|
|
146
|
+
const quoteCalls = [];
|
|
147
|
+
for (const pool of pools) {
|
|
148
|
+
const state = pool.getState(blockNumber);
|
|
149
|
+
for (const tokenAIn of [true, false]) {
|
|
150
|
+
for (const exactOutput of [false, true]) {
|
|
151
|
+
const inToken = tokenAIn ? pool.tokenA : pool.tokenB;
|
|
152
|
+
const outToken = tokenAIn ? pool.tokenB : pool.tokenA;
|
|
153
|
+
const unit = 10n ** BigInt((exactOutput ? outToken : inToken).decimals);
|
|
154
|
+
const outReserve = tokenAIn ? state.reserveB : state.reserveA;
|
|
155
|
+
const amounts = new Set();
|
|
156
|
+
AMOUNT_MULTIPLIERS.forEach(([n, d]) => amounts.add((unit * n) / d));
|
|
157
|
+
RESERVE_FRACTIONS.forEach(([n, d]) => amounts.add((outReserve * n) / d));
|
|
158
|
+
const tickLimit = tokenAIn
|
|
159
|
+
? state.activeTick + 100n
|
|
160
|
+
: state.activeTick - 100n;
|
|
161
|
+
for (const amount of amounts) {
|
|
162
|
+
if (amount === 0n || amount > MAX_UINT128)
|
|
163
|
+
continue;
|
|
164
|
+
let local;
|
|
165
|
+
try {
|
|
166
|
+
local = pool.poolMath.estimateSwap({ ...state, ticks: { ...state.ticks } }, amount, tokenAIn, exactOutput, tickLimit);
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
local = `throws: ${e?.message || e}`;
|
|
170
|
+
}
|
|
171
|
+
cases.push({
|
|
172
|
+
pool: pool.address,
|
|
173
|
+
label: `${pool.tokenA.symbol}/${pool.tokenB.symbol}`,
|
|
174
|
+
tokenAIn,
|
|
175
|
+
exactOutput,
|
|
176
|
+
amount,
|
|
177
|
+
local,
|
|
178
|
+
});
|
|
179
|
+
quoteCalls.push({
|
|
180
|
+
target: quoterAddress,
|
|
181
|
+
callData: quoterIface.encodeFunctionData('calculateSwap', [
|
|
182
|
+
pool.address,
|
|
183
|
+
amount,
|
|
184
|
+
tokenAIn,
|
|
185
|
+
exactOutput,
|
|
186
|
+
tickLimit,
|
|
187
|
+
]),
|
|
188
|
+
decodeFunction: decodeQuote,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Quoter calls simulate a full swap, so keep multicall batches small and
|
|
195
|
+
// don't fire all of them at once
|
|
196
|
+
const QUOTES_PER_BATCH = 15;
|
|
197
|
+
const BATCHES_IN_FLIGHT = 20;
|
|
198
|
+
const quoteResults = [];
|
|
199
|
+
for (let start = 0; start < quoteCalls.length; start += QUOTES_PER_BATCH * BATCHES_IN_FLIGHT) {
|
|
200
|
+
quoteResults.push(...(await dexHelper.multiWrapper.tryAggregate(false, quoteCalls.slice(start, start + QUOTES_PER_BATCH * BATCHES_IN_FLIGHT), blockNumber, QUOTES_PER_BATCH, false)));
|
|
201
|
+
}
|
|
202
|
+
let matches = 0;
|
|
203
|
+
let mismatches = 0;
|
|
204
|
+
let onlyLocalThrows = 0;
|
|
205
|
+
let onlyOnchainFails = 0;
|
|
206
|
+
let unfillableBuys = 0;
|
|
207
|
+
const onchainFailures = new Map();
|
|
208
|
+
quoteResults.forEach(({ returnData: onchain }, i) => {
|
|
209
|
+
const c = cases[i];
|
|
210
|
+
const describe = `${c.label} pool=${c.pool} tokenAIn=${c.tokenAIn} exactOutput=${c.exactOutput} amount=${c.amount}`;
|
|
211
|
+
if (typeof c.local === 'string') {
|
|
212
|
+
if (!onchain)
|
|
213
|
+
return;
|
|
214
|
+
// estimateSwap rejects a BUY the pool can't fill, the Quoter returns
|
|
215
|
+
// the partial fill; swap() prices both as 0
|
|
216
|
+
if (c.exactOutput && onchain[1] < c.amount) {
|
|
217
|
+
unfillableBuys++;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
onlyLocalThrows++;
|
|
221
|
+
console.log(`LOCAL THROWS ${describe} local=${c.local} onchain=[${onchain}]`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (!onchain) {
|
|
225
|
+
onlyOnchainFails++;
|
|
226
|
+
const failures = onchainFailures.get(c.pool) || {
|
|
227
|
+
count: 0,
|
|
228
|
+
callData: quoteCalls[i].callData,
|
|
229
|
+
};
|
|
230
|
+
failures.count++;
|
|
231
|
+
onchainFailures.set(c.pool, failures);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (c.local[0] !== onchain[0] || c.local[1] !== onchain[1]) {
|
|
235
|
+
mismatches++;
|
|
236
|
+
console.log(`QUOTE MISMATCH ${describe} local=[${c.local}] onchain=[${onchain}] dIn=${c.local[0] - onchain[0]} dOut=${c.local[1] - onchain[1]}`);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
matches++;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
// The multicall drops revert data, so re-run one failing call per pool
|
|
243
|
+
// directly to get the reason
|
|
244
|
+
for (const [pool, { count, callData }] of onchainFailures) {
|
|
245
|
+
let reason = 'succeeds when called directly';
|
|
246
|
+
let revertData;
|
|
247
|
+
try {
|
|
248
|
+
// some nodes return the revert payload as the call result
|
|
249
|
+
const returned = await dexHelper.provider.call({ to: quoterAddress, data: callData }, blockNumber);
|
|
250
|
+
try {
|
|
251
|
+
quoterIface.decodeFunctionResult('calculateSwap', returned);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
revertData = returned;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
revertData = [e, e?.error, e?.error?.error]
|
|
259
|
+
.map(err => err?.data)
|
|
260
|
+
.find(d => typeof d === 'string' && d.startsWith('0x'));
|
|
261
|
+
if (!revertData)
|
|
262
|
+
reason = e?.message || String(e);
|
|
263
|
+
}
|
|
264
|
+
if (revertData) {
|
|
265
|
+
reason = `revert data ${revertData.slice(0, 10)}`;
|
|
266
|
+
for (const iface of [poolIface, quoterIface]) {
|
|
267
|
+
try {
|
|
268
|
+
const parsed = iface.parseError(revertData);
|
|
269
|
+
reason = `${parsed.name}(${parsed.args.map(String).join(', ')})`;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// not an error of this interface
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
console.log(`ONCHAIN FAILS pool=${pool} calls=${count} reason=${reason}`);
|
|
278
|
+
}
|
|
279
|
+
console.log(`RESULT network=${network} block=${blockNumber} ticks=${tickExpected.length} tickMismatches=${tickMismatches} quotes=${cases.length} matches=${matches} mismatches=${mismatches} unfillableBuys=${unfillableBuys} onlyLocalThrows=${onlyLocalThrows} onlyOnchainFails=${onlyOnchainFails}`);
|
|
280
|
+
process.exit(mismatches || tickMismatches ? 1 : 0);
|
|
281
|
+
})().catch(e => {
|
|
282
|
+
console.error(e);
|
|
283
|
+
process.exit(1);
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=compare-onchain-quotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-onchain-quotes.js","sourceRoot":"","sources":["../../../../src/dex/maverick-v2/scripts/compare-onchain-quotes.ts"],"names":[],"mappings":"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"}
|