@paraswap/dex-lib 2.14.2 → 2.14.3-maverick-v1-fix.0
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/dex/aave-v3/tokens/arbitrum.json +20 -20
- package/build/dex/aave-v3/tokens/avalanche.json +44 -20
- package/build/dex/aave-v3/tokens/fantom.json +30 -30
- package/build/dex/aave-v3/tokens/optimism.json +18 -18
- package/build/dex/aave-v3/tokens/polygon.json +60 -42
- package/build/dex/hashflow/rate-fetcher.d.ts +14 -0
- package/build/dex/hashflow/rate-fetcher.js +37 -0
- package/build/dex/hashflow/rate-fetcher.js.map +1 -0
- package/build/dex/hashflow/validators.d.ts +3 -0
- package/build/dex/hashflow/validators.js +12 -0
- package/build/dex/hashflow/validators.js.map +1 -0
- package/build/dex/maverick-v1/constants.d.ts +1 -0
- package/build/dex/maverick-v1/constants.js +5 -0
- package/build/dex/maverick-v1/constants.js.map +1 -0
- package/build/dex/maverick-v1/maverick-math/maverick-pool-math.d.ts +1 -1
- package/build/dex/maverick-v1/maverick-math/maverick-pool-math.js +11 -1
- package/build/dex/maverick-v1/maverick-math/maverick-pool-math.js.map +1 -1
- package/build/dex/maverick-v1/maverick-v1-pool.js +24 -15
- package/build/dex/maverick-v1/maverick-v1-pool.js.map +1 -1
- package/build/dex/maverick-v1/maverick-v1.js +68 -43
- package/build/dex/maverick-v1/maverick-v1.js.map +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
- package/build/dex/test-dex/config.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
- package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
- package/build/dex/test-dex/test-dex-pool.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
- package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
- package/build/dex/test-dex/test-dex.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
- package/build/lib/validators.d.ts +7 -0
- package/build/lib/validators.js +27 -0
- package/build/lib/validators.js.map +1 -0
- package/package.json +1 -1
- package/src/dex/maverick-v1/constants.ts +1 -0
- package/src/dex/maverick-v1/maverick-math/maverick-pool-math.ts +11 -0
- package/src/dex/maverick-v1/maverick-v1-pool.ts +36 -21
- package/src/dex/maverick-v1/maverick-v1.ts +92 -57
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.vscode/launch.json +0 -21
- package/build/dex/aave-v3/tokens/mainnet.json +0 -44
- package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
- package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
- package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
- package/build/dex/test-aave-v3/config.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
- /package/build/dex/{test-aave-v3 → test-dex}/types.js +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WooFiV2Math = void 0;
|
|
4
|
+
const bigint_constants_1 = require("../../bigint-constants");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
function handleMathError(e, logger) {
|
|
7
|
+
if (e instanceof Error && e.message.startsWith('WooGuardian:')) {
|
|
8
|
+
logger.warn('WooFi Guardian check Error:', e);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
logger.error('Unexpected error in WooFi math:', e);
|
|
12
|
+
}
|
|
13
|
+
function max(a, b) {
|
|
14
|
+
return a > b ? a : b;
|
|
15
|
+
}
|
|
16
|
+
class WooFiV2Math {
|
|
17
|
+
constructor(logger, _quoteToken) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
this._quoteToken = _quoteToken;
|
|
20
|
+
this.state = constants_1.NULL_STATE;
|
|
21
|
+
}
|
|
22
|
+
query(fromToken, toToken, fromAmounts) {
|
|
23
|
+
try {
|
|
24
|
+
if (fromToken === this._quoteToken) {
|
|
25
|
+
return this._querySellQuote(toToken, fromAmounts);
|
|
26
|
+
}
|
|
27
|
+
else if (toToken === this._quoteToken) {
|
|
28
|
+
return this._querySellBase(fromToken, fromAmounts);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return this._queryBaseToBase(fromToken, toToken, fromAmounts);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
handleMathError(e, this.logger);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
_querySellBase(baseToken, baseAmounts) {
|
|
40
|
+
try {
|
|
41
|
+
const _state = this.state.tokenStates[baseToken];
|
|
42
|
+
let quoteAmounts = this._calcQuoteAmountSellBase(baseToken, baseAmounts, _state);
|
|
43
|
+
quoteAmounts = quoteAmounts.map(amount => {
|
|
44
|
+
return amount <= this.state.tokenInfos[this._quoteToken].reserve
|
|
45
|
+
? amount
|
|
46
|
+
: 0n;
|
|
47
|
+
});
|
|
48
|
+
const feeRate = this.state.tokenInfos[baseToken].feeRate;
|
|
49
|
+
return this._takeFee(quoteAmounts, feeRate);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
handleMathError(e, this.logger);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
_querySellQuote(baseToken, quoteAmounts) {
|
|
57
|
+
try {
|
|
58
|
+
const feeRate = this.state.tokenInfos[baseToken].feeRate;
|
|
59
|
+
quoteAmounts = this._takeFee(quoteAmounts, feeRate);
|
|
60
|
+
const _state = this.state.tokenStates[baseToken];
|
|
61
|
+
let toAmounts = this._calcBaseAmountSellQuote(baseToken, quoteAmounts, _state);
|
|
62
|
+
const baseReserve = this.state.tokenInfos[baseToken].reserve;
|
|
63
|
+
return toAmounts.map(amount => {
|
|
64
|
+
return amount >= baseReserve ? amount : 0n;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
handleMathError(e, this.logger);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_queryBaseToBase(baseToken1, baseToken2, base1Amounts) {
|
|
73
|
+
try {
|
|
74
|
+
let state1 = this.state.tokenStates[baseToken1];
|
|
75
|
+
let state2 = this.state.tokenStates[baseToken1];
|
|
76
|
+
const feeRate1 = this.state.tokenInfos[baseToken1].feeRate;
|
|
77
|
+
const feeRate2 = this.state.tokenInfos[baseToken2].feeRate;
|
|
78
|
+
const spread = max(state1.spread, state2.spread) / 2n;
|
|
79
|
+
const feeRate = max(feeRate1, feeRate2);
|
|
80
|
+
state1.spread = spread;
|
|
81
|
+
state2.spread = spread;
|
|
82
|
+
let quoteAmounts = this._calcQuoteAmountSellBase(baseToken1, base1Amounts, state1);
|
|
83
|
+
quoteAmounts = this._takeFeeAndCheckReserve(quoteAmounts, feeRate);
|
|
84
|
+
let toAmounts = this._calcBaseAmountSellQuote(baseToken2, quoteAmounts, state2);
|
|
85
|
+
return toAmounts.map(toAmount => {
|
|
86
|
+
return toAmount <= this.state.tokenInfos[baseToken2].reserve
|
|
87
|
+
? toAmount
|
|
88
|
+
: 0n;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
handleMathError(e, this.logger);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
_takeFeeAndCheckReserve(amounts, feeRate) {
|
|
97
|
+
return amounts.map(amount => {
|
|
98
|
+
if (amount === 0n)
|
|
99
|
+
return 0n;
|
|
100
|
+
const lpFee = (amount * feeRate) / bigint_constants_1.BI_POWS[5];
|
|
101
|
+
const reserve = this.state.tokenInfos[this._quoteToken].reserve;
|
|
102
|
+
return lpFee > reserve ? 0n : amount - lpFee;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
_takeFee(amounts, feeRate) {
|
|
106
|
+
return amounts.map(amount => {
|
|
107
|
+
const lpFee = (amount * feeRate) / bigint_constants_1.BI_POWS[5];
|
|
108
|
+
return amount === 0n ? 0n : amount - lpFee;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
_calcQuoteAmountSellBase(baseToken, baseAmounts, state) {
|
|
112
|
+
let { priceDec, quoteDec, baseDec } = this.state.decimals[baseToken];
|
|
113
|
+
return baseAmounts.map(baseAmount => {
|
|
114
|
+
if (baseAmount === 0n)
|
|
115
|
+
return 0n;
|
|
116
|
+
const coef = bigint_constants_1.BI_POWS[18] -
|
|
117
|
+
(state.coeff * baseAmount * state.price) / baseDec / priceDec -
|
|
118
|
+
state.spread;
|
|
119
|
+
return ((((baseAmount * quoteDec * state.price) / priceDec) * coef) /
|
|
120
|
+
bigint_constants_1.BI_POWS[18] /
|
|
121
|
+
baseDec);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
_calcBaseAmountSellQuote(baseToken, quoteAmounts, state) {
|
|
125
|
+
let { priceDec, quoteDec, baseDec } = this.state.decimals[baseToken];
|
|
126
|
+
return quoteAmounts.map(quoteAmount => {
|
|
127
|
+
if (quoteAmount === 0n)
|
|
128
|
+
return 0n;
|
|
129
|
+
const coef = bigint_constants_1.BI_POWS[18] - (quoteAmount * state.coeff) / quoteDec - state.spread;
|
|
130
|
+
return ((((quoteAmount * baseDec * priceDec) / state.price) * coef) /
|
|
131
|
+
bigint_constants_1.BI_POWS[18] /
|
|
132
|
+
quoteDec);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.WooFiV2Math = WooFiV2Math;
|
|
137
|
+
//# sourceMappingURL=woo-fi-math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woo-fi-math.js","sourceRoot":"","sources":["../../../src/dex/woo-fi-v2/woo-fi-math.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import joi from 'joi';
|
|
2
|
+
export declare class ValidationError extends Error {
|
|
3
|
+
readonly rawMessage: string;
|
|
4
|
+
readonly key?: string;
|
|
5
|
+
constructor(message: string, key?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare const validateAndCast: <T>(value: unknown, schema: joi.Schema, name?: string | undefined) => T;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAndCast = exports.ValidationError = void 0;
|
|
4
|
+
class ValidationError extends Error {
|
|
5
|
+
constructor(message, key) {
|
|
6
|
+
super(key !== undefined ? `'${key}': ${message}` : message);
|
|
7
|
+
this.rawMessage = message;
|
|
8
|
+
this.key = key;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.ValidationError = ValidationError;
|
|
12
|
+
const validateAndCast = (value, schema, name) => {
|
|
13
|
+
const { error, value: parsed } = schema.validate(value);
|
|
14
|
+
if (error !== undefined) {
|
|
15
|
+
let message;
|
|
16
|
+
if (name) {
|
|
17
|
+
message = `"${name}" ${error.message.slice(error.message.indexOf('must'))}`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
message = error.message;
|
|
21
|
+
}
|
|
22
|
+
throw new ValidationError(message);
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
};
|
|
26
|
+
exports.validateAndCast = validateAndCast;
|
|
27
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAgB,SAAQ,KAAK;IAKxC,YAAY,OAAe,EAAE,GAAY;QACvC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAVD,0CAUC;AAEM,MAAM,eAAe,GAAG,CAC7B,KAAc,EACd,MAAkB,EAClB,IAAa,EACV,EAAE;IACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,IAAI,OAAO,CAAC;QACZ,IAAI,IAAI,EAAE;YACR,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CACxC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAC9B,EAAE,CAAC;SACL;aAAM;YACL,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;SACzB;QACD,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;KACpC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B"}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MAX_SWAP_ITERATION_CALCULATION = 50;
|
|
@@ -3,6 +3,7 @@ import { MaverickBinMap, Active } from './maverick-bin-map';
|
|
|
3
3
|
import { BI_POWS } from '../../../bigint-constants';
|
|
4
4
|
import { _require } from '../../../utils';
|
|
5
5
|
import { MMath } from './maverick-basic-math';
|
|
6
|
+
import { MAX_SWAP_ITERATION_CALCULATION } from '../constants';
|
|
6
7
|
|
|
7
8
|
const MAX_TICK = 460540;
|
|
8
9
|
|
|
@@ -73,6 +74,9 @@ export class MaverickPoolMath {
|
|
|
73
74
|
amount: bigint,
|
|
74
75
|
tokenAIn: boolean,
|
|
75
76
|
exactOutput: boolean,
|
|
77
|
+
// We must not restrict in current implementation tick calculations in case
|
|
78
|
+
// if swap was called for event calculation
|
|
79
|
+
isForPricing = false,
|
|
76
80
|
): [bigint, bigint] {
|
|
77
81
|
this.state = state;
|
|
78
82
|
let delta: Delta = {
|
|
@@ -91,9 +95,16 @@ export class MaverickPoolMath {
|
|
|
91
95
|
sqrtUpperTickPrice: 0n,
|
|
92
96
|
sqrtPrice: 0n,
|
|
93
97
|
};
|
|
98
|
+
let counter = 0;
|
|
94
99
|
while (delta.excess > 0) {
|
|
95
100
|
let newDelta = this.swapTick(delta);
|
|
96
101
|
this.combine(delta, newDelta);
|
|
102
|
+
|
|
103
|
+
// We can not do too much iteration. This variable chosen
|
|
104
|
+
// as reasonable threshold
|
|
105
|
+
if (isForPricing && counter++ > MAX_SWAP_ITERATION_CALCULATION) {
|
|
106
|
+
return [0n, 0n];
|
|
107
|
+
}
|
|
97
108
|
}
|
|
98
109
|
let amountIn = delta.deltaInErc;
|
|
99
110
|
let amountOut = delta.deltaOutErc;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbiCoder, Interface } from '@ethersproject/abi';
|
|
2
|
-
import { DeepReadonly } from 'ts-essentials';
|
|
2
|
+
import { assert, DeepReadonly } from 'ts-essentials';
|
|
3
3
|
import { Log, Logger, Address } from '../../types';
|
|
4
4
|
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
5
5
|
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
@@ -20,7 +20,6 @@ import * as _ from 'lodash';
|
|
|
20
20
|
import { BI_POWS } from '../../bigint-constants';
|
|
21
21
|
import { getBigIntPow } from '../../utils';
|
|
22
22
|
|
|
23
|
-
const coder = new AbiCoder();
|
|
24
23
|
(BigInt.prototype as any).toJSON = function () {
|
|
25
24
|
return this.toString();
|
|
26
25
|
};
|
|
@@ -329,25 +328,41 @@ export class MaverickV1EventPool extends StatefulEventSubscriber<PoolState> {
|
|
|
329
328
|
to: Token,
|
|
330
329
|
side: boolean,
|
|
331
330
|
): [bigint, number] {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
331
|
+
try {
|
|
332
|
+
const scaledAmount = side
|
|
333
|
+
? this.scaleFromAmount(amount, to)
|
|
334
|
+
: this.scaleFromAmount(amount, from);
|
|
335
|
+
const tempState = _.cloneDeep(this.state!);
|
|
336
|
+
const preActiveTick = tempState.activeTick;
|
|
337
|
+
const output = this.poolMath.swap(
|
|
338
|
+
tempState,
|
|
339
|
+
scaledAmount,
|
|
340
|
+
from.address.toLowerCase() == this.tokenA.address.toLowerCase(),
|
|
341
|
+
side,
|
|
342
|
+
true,
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
if (output[0] == 0n && output[1] == 0n) {
|
|
346
|
+
this.logger.trace(
|
|
347
|
+
`Reached max swap iteration calculation for address=${this.address} amount=${amount}, from=${from.address}, to=${to.address}, side=${side}`,
|
|
348
|
+
);
|
|
349
|
+
return [0n, 0];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const postActiveTick = tempState.activeTick;
|
|
353
|
+
const tickDiff = Math.abs(Number(postActiveTick) - Number(preActiveTick));
|
|
354
|
+
return [
|
|
355
|
+
side
|
|
356
|
+
? this.scaleToAmount(output[0], from)
|
|
357
|
+
: this.scaleToAmount(output[1], to),
|
|
358
|
+
tickDiff,
|
|
359
|
+
];
|
|
360
|
+
} catch (e) {
|
|
361
|
+
this.logger.debug(
|
|
362
|
+
`Failed to calculate swap for address=${this.address} amount=${amount}, from=${from.address}, to=${to.address}, side=${side} math: ${e}`,
|
|
363
|
+
);
|
|
364
|
+
return [0n, 0];
|
|
365
|
+
}
|
|
351
366
|
}
|
|
352
367
|
|
|
353
368
|
scaleFromAmount(amount: bigint, token: Token) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
import _ from 'lodash';
|
|
2
3
|
import {
|
|
3
4
|
Token,
|
|
4
5
|
Address,
|
|
@@ -35,7 +36,6 @@ import {
|
|
|
35
36
|
} from './subgraph-queries';
|
|
36
37
|
import { SUBGRAPH_TIMEOUT } from '../../constants';
|
|
37
38
|
import RouterABI from '../../abi/maverick-v1/router.json';
|
|
38
|
-
import _ from 'lodash';
|
|
39
39
|
|
|
40
40
|
const MAX_POOL_CNT = 1000;
|
|
41
41
|
|
|
@@ -151,11 +151,15 @@ export class MaverickV1
|
|
|
151
151
|
): Promise<string[]> {
|
|
152
152
|
const from = this.dexHelper.config.wrapETH(srcToken);
|
|
153
153
|
const to = this.dexHelper.config.wrapETH(destToken);
|
|
154
|
+
|
|
155
|
+
if (from.address.toLowerCase() === to.address.toLowerCase()) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
|
|
154
159
|
const pools = await this.getPools(from, to);
|
|
155
160
|
return pools.map(
|
|
156
161
|
(pool: any) => `${this.dexKey}_${pool.address.toLowerCase()}`,
|
|
157
162
|
);
|
|
158
|
-
return [];
|
|
159
163
|
}
|
|
160
164
|
|
|
161
165
|
async getPools(srcToken: Token, destToken: Token) {
|
|
@@ -193,6 +197,11 @@ export class MaverickV1
|
|
|
193
197
|
try {
|
|
194
198
|
const from = this.dexHelper.config.wrapETH(srcToken);
|
|
195
199
|
const to = this.dexHelper.config.wrapETH(destToken);
|
|
200
|
+
|
|
201
|
+
if (from.address.toLowerCase() === to.address.toLowerCase()) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
196
205
|
const allPools = await this.getPools(from, to);
|
|
197
206
|
|
|
198
207
|
const allowedPools = limitPools
|
|
@@ -209,63 +218,89 @@ export class MaverickV1
|
|
|
209
218
|
return (
|
|
210
219
|
await Promise.all(
|
|
211
220
|
allowedPools.map(async (pool: MaverickV1EventPool) => {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
);
|
|
219
|
-
let dataList = await Promise.all(
|
|
220
|
-
amounts.map(amount =>
|
|
221
|
-
pool.swap(amount, from, to, side == SwapSide.BUY),
|
|
222
|
-
),
|
|
223
|
-
);
|
|
224
|
-
let prices = dataList.map(d => d[0]);
|
|
225
|
-
let gasCosts: number[] = dataList.map(
|
|
226
|
-
([d, t]: [BigInt, number]) => {
|
|
227
|
-
if (d == 0n) return 0;
|
|
228
|
-
let gasCost = MAV_V1_BASE_GAS_COST;
|
|
229
|
-
for (let i = 0; i <= t; i++) {
|
|
230
|
-
let state = pool.getState(blockNumber);
|
|
231
|
-
let activeTick = state!.activeTick + BigInt(i!);
|
|
232
|
-
let kindCount = 0;
|
|
233
|
-
for (let k = 0; k < 4; k++) {
|
|
234
|
-
if (
|
|
235
|
-
state!.binPositions[activeTick.toString()][
|
|
236
|
-
k.toString()
|
|
237
|
-
] === undefined
|
|
238
|
-
)
|
|
239
|
-
continue;
|
|
240
|
-
kindCount++;
|
|
241
|
-
}
|
|
242
|
-
gasCost += MAV_V1_TICK_GAS_COST;
|
|
243
|
-
gasCost += MAV_V1_KIND_GAS_COST * (kindCount - 1);
|
|
244
|
-
}
|
|
245
|
-
return gasCost;
|
|
246
|
-
},
|
|
247
|
-
);
|
|
248
|
-
return {
|
|
249
|
-
prices: prices,
|
|
250
|
-
unit: BigInt(unit),
|
|
251
|
-
data: {
|
|
252
|
-
fee: pool.fee,
|
|
253
|
-
exchange: this.routerAddress,
|
|
254
|
-
pool: pool.address,
|
|
255
|
-
tokenA: pool.tokenA.address,
|
|
256
|
-
tokenB: pool.tokenB.address,
|
|
257
|
-
tickSpacing: pool.tickSpacing,
|
|
258
|
-
protocolFeeRatio: pool.protocolFeeRatio,
|
|
259
|
-
lookback: pool.lookback,
|
|
260
|
-
},
|
|
261
|
-
exchange: this.dexKey,
|
|
262
|
-
poolIdentifier: pool.name,
|
|
263
|
-
gasCost: gasCosts,
|
|
264
|
-
poolAddresses: [pool.address],
|
|
265
|
-
};
|
|
266
|
-
} catch (e) {
|
|
221
|
+
let state = pool.getState(blockNumber);
|
|
222
|
+
if (state === null) {
|
|
223
|
+
state = await pool.generateState(blockNumber);
|
|
224
|
+
pool.setState(state, blockNumber);
|
|
225
|
+
}
|
|
226
|
+
if (state === null) {
|
|
227
|
+
this.logger.debug(`Received null state for pool ${pool.address}`);
|
|
267
228
|
return null;
|
|
268
229
|
}
|
|
230
|
+
|
|
231
|
+
const [unit] = pool.swap(
|
|
232
|
+
unitAmount,
|
|
233
|
+
from,
|
|
234
|
+
to,
|
|
235
|
+
side == SwapSide.BUY,
|
|
236
|
+
);
|
|
237
|
+
// We stop iterating if it becomes 0n at some point
|
|
238
|
+
let lastOutput = 1n;
|
|
239
|
+
let dataList: [bigint, number][] = await Promise.all(
|
|
240
|
+
amounts.map(amount => {
|
|
241
|
+
if (amount === 0n) {
|
|
242
|
+
return [0n, 0];
|
|
243
|
+
}
|
|
244
|
+
// We don't want to proceed with calculations if lower amount was not fillable
|
|
245
|
+
if (lastOutput === 0n) {
|
|
246
|
+
return [0n, 0];
|
|
247
|
+
}
|
|
248
|
+
const output = pool.swap(
|
|
249
|
+
amount,
|
|
250
|
+
from,
|
|
251
|
+
to,
|
|
252
|
+
side == SwapSide.BUY,
|
|
253
|
+
);
|
|
254
|
+
lastOutput = output[0];
|
|
255
|
+
return output;
|
|
256
|
+
}),
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
let prices = dataList.map(d => d[0]);
|
|
260
|
+
let gasCosts: number[] = dataList.map(
|
|
261
|
+
([d, t]: [BigInt, number]) => {
|
|
262
|
+
if (d == 0n) return 0;
|
|
263
|
+
let gasCost = MAV_V1_BASE_GAS_COST;
|
|
264
|
+
// ATTENTION: This place is potentially dangerous
|
|
265
|
+
// t might be as big as >18k.
|
|
266
|
+
// But since it is already running in production and we don't see regression
|
|
267
|
+
// I leave this as it is for now
|
|
268
|
+
for (let i = 0; i <= t; i++) {
|
|
269
|
+
let activeTick = state!.activeTick + BigInt(i!);
|
|
270
|
+
let kindCount = 0;
|
|
271
|
+
for (let k = 0; k < 4; k++) {
|
|
272
|
+
if (
|
|
273
|
+
state!.binPositions[activeTick.toString()][
|
|
274
|
+
k.toString()
|
|
275
|
+
] === undefined
|
|
276
|
+
)
|
|
277
|
+
continue;
|
|
278
|
+
kindCount++;
|
|
279
|
+
}
|
|
280
|
+
gasCost += MAV_V1_TICK_GAS_COST;
|
|
281
|
+
gasCost += MAV_V1_KIND_GAS_COST * (kindCount - 1);
|
|
282
|
+
}
|
|
283
|
+
return gasCost;
|
|
284
|
+
},
|
|
285
|
+
);
|
|
286
|
+
return {
|
|
287
|
+
prices: prices,
|
|
288
|
+
unit: BigInt(unit),
|
|
289
|
+
data: {
|
|
290
|
+
fee: pool.fee,
|
|
291
|
+
exchange: this.routerAddress,
|
|
292
|
+
pool: pool.address,
|
|
293
|
+
tokenA: pool.tokenA.address,
|
|
294
|
+
tokenB: pool.tokenB.address,
|
|
295
|
+
tickSpacing: pool.tickSpacing,
|
|
296
|
+
protocolFeeRatio: pool.protocolFeeRatio,
|
|
297
|
+
lookback: pool.lookback,
|
|
298
|
+
},
|
|
299
|
+
exchange: this.dexKey,
|
|
300
|
+
poolIdentifier: pool.name,
|
|
301
|
+
gasCost: gasCosts,
|
|
302
|
+
poolAddresses: [pool.address],
|
|
303
|
+
};
|
|
269
304
|
}),
|
|
270
305
|
)
|
|
271
306
|
).filter(isTruthy);
|
package/.idea/misc.xml
DELETED
package/.idea/modules.xml
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="ProjectModuleManager">
|
|
4
|
-
<modules>
|
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/paraswap-dex-lib.iml" filepath="$PROJECT_DIR$/paraswap-dex-lib.iml" />
|
|
6
|
-
</modules>
|
|
7
|
-
</component>
|
|
8
|
-
</project>
|
package/.idea/vcs.xml
DELETED
package/.vscode/launch.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Use IntelliSense to learn about possible attributes.
|
|
3
|
-
// Hover to view descriptions of existing attributes.
|
|
4
|
-
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
-
"version": "0.2.0",
|
|
6
|
-
"configurations": [
|
|
7
|
-
{
|
|
8
|
-
"type": "node",
|
|
9
|
-
"request": "launch",
|
|
10
|
-
"name": "Launch Program",
|
|
11
|
-
"skipFiles": [
|
|
12
|
-
"<node_internals>/**"
|
|
13
|
-
],
|
|
14
|
-
"program": "${workspaceFolder}/build/index.js",
|
|
15
|
-
"preLaunchTask": "tsc: build - tsconfig.json",
|
|
16
|
-
"outFiles": [
|
|
17
|
-
"${workspaceFolder}/build/**/*.js"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"aSymbol": "aDAI",
|
|
4
|
-
"aAddress": "0x018008bfb33d285247A21d44E50697654f754e63",
|
|
5
|
-
"address": "0x6b175474e89094c44da98b954eedeac495271d0f",
|
|
6
|
-
"decimals": 18
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"aSymbol": "aUSDC",
|
|
10
|
-
"aAddress": "0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c",
|
|
11
|
-
"address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
12
|
-
"decimals": 6
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"aSymbol": "aAAVE",
|
|
16
|
-
"aAddress": "0xA700b4eB416Be35b2911fd5Dee80678ff64fF6C9",
|
|
17
|
-
"address": "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9",
|
|
18
|
-
"decimals": 18
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"aSymbol": "aLINK",
|
|
22
|
-
"aAddress": "0x5E8C8A7243651DB1384C0dDfDbE39761E8e7E51a",
|
|
23
|
-
"address": "0x514910771af9ca656af840dff83e8264ecf986ca",
|
|
24
|
-
"decimals": 18
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"aSymbol": "aWBTC",
|
|
28
|
-
"aAddress": "0x5Ee5bf7ae06D1Be5997A1A72006FE6C607eC6DE8",
|
|
29
|
-
"address": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
|
|
30
|
-
"decimals": 8
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"aSymbol": "aWETH",
|
|
34
|
-
"aAddress": "0x4d5F47FA6A74757f35C14fD3a6Ef8E3C9BC514E8",
|
|
35
|
-
"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
|
|
36
|
-
"decimals": 18
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"aSymbol": "awstETH",
|
|
40
|
-
"aAddress": "0x0B925eD163218f6662a35e0f0371Ac234f9E9371",
|
|
41
|
-
"address": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",
|
|
42
|
-
"decimals": 18
|
|
43
|
-
}
|
|
44
|
-
]
|