@paraswap/dex-lib 2.42.13 → 2.42.14-algebra-bugfix-missed-created-pools.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/abi/algebra/AlgebraPool.abi.json +727 -0
- package/build/abi/uniswap-v3/UniswapV3Quoter.abi.json +193 -0
- package/build/dex/{baseswap-v3/baseswap-v3-pool.d.ts → algebra/algebra-pool.d.ts} +16 -16
- package/build/dex/{baseswap-v3/baseswap-v3-pool.js → algebra/algebra-pool.js} +161 -137
- package/build/dex/algebra/algebra-pool.js.map +1 -0
- package/build/dex/algebra/algebra.d.ts +1 -0
- package/build/dex/algebra/algebra.js +45 -17
- package/build/dex/algebra/algebra.js.map +1 -1
- package/build/dex/quickswap/camelot-v3.d.ts +6 -0
- package/build/dex/quickswap/camelot-v3.js +19 -0
- package/build/dex/quickswap/camelot-v3.js.map +1 -0
- package/build/dex/quickswap/zyberswap-v3.d.ts +6 -0
- package/build/dex/quickswap/zyberswap-v3.js +19 -0
- package/build/dex/quickswap/zyberswap-v3.js.map +1 -0
- package/package.json +1 -1
- package/src/dex/algebra/algebra.ts +58 -33
- package/build/abi/kyberswap-elastic/IAntiSnipAttackPositionManager.json +0 -1276
- package/build/abi/kyberswap-elastic/IFactory.json +0 -550
- package/build/abi/kyberswap-elastic/IPool.json +0 -1042
- package/build/abi/kyberswap-elastic/IQuoterV2.json +0 -226
- package/build/abi/kyberswap-elastic/IRouter.json +0 -239
- package/build/abi/kyberswap-elastic/TicksFeesReader.json +0 -142
- package/build/abi/wombat/asset.json +0 -769
- package/build/abi/wombat/bmw.json +0 -1247
- package/build/abi/wombat/pool.json +0 -1364
- package/build/dex/baseswap-v3/baseswap-v3-factory.d.ts +0 -26
- package/build/dex/baseswap-v3/baseswap-v3-factory.js +0 -44
- package/build/dex/baseswap-v3/baseswap-v3-factory.js.map +0 -1
- package/build/dex/baseswap-v3/baseswap-v3-pool.js.map +0 -1
- package/build/dex/baseswap-v3/baseswap-v3.d.ts +0 -71
- package/build/dex/baseswap-v3/baseswap-v3.js +0 -752
- package/build/dex/baseswap-v3/baseswap-v3.js.map +0 -1
- package/build/dex/baseswap-v3/config.d.ts +0 -9
- package/build/dex/baseswap-v3/config.js +0 -48
- package/build/dex/baseswap-v3/config.js.map +0 -1
- package/build/dex/baseswap-v3/constants.d.ts +0 -28
- package/build/dex/baseswap-v3/constants.js +0 -35
- package/build/dex/baseswap-v3/constants.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/BitMath.d.ts +0 -4
- package/build/dex/baseswap-v3/contract-math/BitMath.js +0 -93
- package/build/dex/baseswap-v3/contract-math/BitMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.d.ts +0 -3
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.js +0 -8
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.d.ts +0 -4
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.js +0 -9
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/FullMath.d.ts +0 -4
- package/build/dex/baseswap-v3/contract-math/FullMath.js +0 -19
- package/build/dex/baseswap-v3/contract-math/FullMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.d.ts +0 -3
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.js +0 -22
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/Oracle.d.ts +0 -10
- package/build/dex/baseswap-v3/contract-math/Oracle.js +0 -133
- package/build/dex/baseswap-v3/contract-math/Oracle.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.d.ts +0 -10
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.js +0 -91
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/SwapMath.d.ts +0 -8
- package/build/dex/baseswap-v3/contract-math/SwapMath.js +0 -70
- package/build/dex/baseswap-v3/contract-math/SwapMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/Tick.d.ts +0 -7
- package/build/dex/baseswap-v3/contract-math/Tick.js +0 -45
- package/build/dex/baseswap-v3/contract-math/Tick.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/TickBitMap.d.ts +0 -7
- package/build/dex/baseswap-v3/contract-math/TickBitMap.js +0 -84
- package/build/dex/baseswap-v3/contract-math/TickBitMap.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/TickMath.d.ts +0 -8
- package/build/dex/baseswap-v3/contract-math/TickMath.js +0 -162
- package/build/dex/baseswap-v3/contract-math/TickMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.d.ts +0 -3
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.js +0 -10
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.d.ts +0 -37
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.js +0 -393
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.js.map +0 -1
- package/build/dex/baseswap-v3/contract-math/utils.d.ts +0 -7
- package/build/dex/baseswap-v3/contract-math/utils.js +0 -42
- package/build/dex/baseswap-v3/contract-math/utils.js.map +0 -1
- package/build/dex/baseswap-v3/types.d.ts +0 -164
- package/build/dex/baseswap-v3/types.js +0 -9
- package/build/dex/baseswap-v3/types.js.map +0 -1
- package/build/dex/baseswap-v3/utils.d.ts +0 -6
- package/build/dex/baseswap-v3/utils.js +0 -65
- package/build/dex/baseswap-v3/utils.js.map +0 -1
- package/build/dex/hello/config.d.ts +0 -4
- package/build/dex/hello/config.js +0 -15
- package/build/dex/hello/config.js.map +0 -1
- package/build/dex/hello/hello-pool.d.ts +0 -39
- package/build/dex/hello/hello-pool.js +0 -64
- package/build/dex/hello/hello-pool.js.map +0 -1
- package/build/dex/hello/hello.d.ts +0 -37
- package/build/dex/hello/hello.js +0 -126
- package/build/dex/hello/hello.js.map +0 -1
- package/build/dex/hello/types.d.ts +0 -6
- package/build/dex/hello/types.js +0 -3
- package/build/dex/hello/types.js.map +0 -1
- package/build/dex/kyberswap-elastic/config.d.ts +0 -4
- package/build/dex/kyberswap-elastic/config.js +0 -80
- package/build/dex/kyberswap-elastic/config.js.map +0 -1
- package/build/dex/kyberswap-elastic/constants.d.ts +0 -17
- package/build/dex/kyberswap-elastic/constants.js +0 -42
- package/build/dex/kyberswap-elastic/constants.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/FixedPoint96.d.ts +0 -4
- package/build/dex/kyberswap-elastic/contract-math/FixedPoint96.js +0 -9
- package/build/dex/kyberswap-elastic/contract-math/FixedPoint96.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/FullMath.d.ts +0 -5
- package/build/dex/kyberswap-elastic/contract-math/FullMath.js +0 -22
- package/build/dex/kyberswap-elastic/contract-math/FullMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/LiqDeltaMath.d.ts +0 -3
- package/build/dex/kyberswap-elastic/contract-math/LiqDeltaMath.js +0 -12
- package/build/dex/kyberswap-elastic/contract-math/LiqDeltaMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/LiquidityMath.d.ts +0 -3
- package/build/dex/kyberswap-elastic/contract-math/LiquidityMath.js +0 -22
- package/build/dex/kyberswap-elastic/contract-math/LiquidityMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/QtyDeltaMath.d.ts +0 -5
- package/build/dex/kyberswap-elastic/contract-math/QtyDeltaMath.js +0 -25
- package/build/dex/kyberswap-elastic/contract-math/QtyDeltaMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/QuadMath.d.ts +0 -4
- package/build/dex/kyberswap-elastic/contract-math/QuadMath.js +0 -27
- package/build/dex/kyberswap-elastic/contract-math/QuadMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/ReinvestmentMath.d.ts +0 -3
- package/build/dex/kyberswap-elastic/contract-math/ReinvestmentMath.js +0 -14
- package/build/dex/kyberswap-elastic/contract-math/ReinvestmentMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/SafeCast.d.ts +0 -8
- package/build/dex/kyberswap-elastic/contract-math/SafeCast.js +0 -30
- package/build/dex/kyberswap-elastic/contract-math/SafeCast.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/SqrtPriceMath.d.ts +0 -10
- package/build/dex/kyberswap-elastic/contract-math/SqrtPriceMath.js +0 -91
- package/build/dex/kyberswap-elastic/contract-math/SqrtPriceMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/SwapMath.d.ts +0 -13
- package/build/dex/kyberswap-elastic/contract-math/SwapMath.js +0 -188
- package/build/dex/kyberswap-elastic/contract-math/SwapMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/TickLinkedList.d.ts +0 -6
- package/build/dex/kyberswap-elastic/contract-math/TickLinkedList.js +0 -41
- package/build/dex/kyberswap-elastic/contract-math/TickLinkedList.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/TickMath.d.ts +0 -9
- package/build/dex/kyberswap-elastic/contract-math/TickMath.js +0 -165
- package/build/dex/kyberswap-elastic/contract-math/TickMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/UnsafeMath.d.ts +0 -3
- package/build/dex/kyberswap-elastic/contract-math/UnsafeMath.js +0 -10
- package/build/dex/kyberswap-elastic/contract-math/UnsafeMath.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/kyberswap-elastic-math.d.ts +0 -28
- package/build/dex/kyberswap-elastic/contract-math/kyberswap-elastic-math.js +0 -502
- package/build/dex/kyberswap-elastic/contract-math/kyberswap-elastic-math.js.map +0 -1
- package/build/dex/kyberswap-elastic/contract-math/utils.d.ts +0 -3
- package/build/dex/kyberswap-elastic/contract-math/utils.js +0 -16
- package/build/dex/kyberswap-elastic/contract-math/utils.js.map +0 -1
- package/build/dex/kyberswap-elastic/errors.d.ts +0 -2
- package/build/dex/kyberswap-elastic/errors.js +0 -6
- package/build/dex/kyberswap-elastic/errors.js.map +0 -1
- package/build/dex/kyberswap-elastic/kyberswap-elastic-pool.d.ts +0 -80
- package/build/dex/kyberswap-elastic/kyberswap-elastic-pool.js +0 -458
- package/build/dex/kyberswap-elastic/kyberswap-elastic-pool.js.map +0 -1
- package/build/dex/kyberswap-elastic/kyberswap-elastic.d.ts +0 -53
- package/build/dex/kyberswap-elastic/kyberswap-elastic.js +0 -610
- package/build/dex/kyberswap-elastic/kyberswap-elastic.js.map +0 -1
- package/build/dex/kyberswap-elastic/types.d.ts +0 -134
- package/build/dex/kyberswap-elastic/types.js +0 -9
- package/build/dex/kyberswap-elastic/types.js.map +0 -1
- package/build/dex/kyberswap-elastic/utils/decoders.d.ts +0 -9
- package/build/dex/kyberswap-elastic/utils/decoders.js +0 -78
- package/build/dex/kyberswap-elastic/utils/decoders.js.map +0 -1
- package/build/dex/morphex/config.d.ts +0 -11
- package/build/dex/morphex/config.js +0 -43
- package/build/dex/morphex/config.js.map +0 -1
- package/build/dex/morphex/morphex.d.ts +0 -25
- package/build/dex/morphex/morphex.js +0 -19
- package/build/dex/morphex/morphex.js.map +0 -1
- package/build/dex/my-test-dex/config.d.ts +0 -4
- package/build/dex/my-test-dex/config.js +0 -15
- package/build/dex/my-test-dex/config.js.map +0 -1
- package/build/dex/my-test-dex/my-test-dex-pool.d.ts +0 -39
- package/build/dex/my-test-dex/my-test-dex-pool.js +0 -64
- package/build/dex/my-test-dex/my-test-dex-pool.js.map +0 -1
- package/build/dex/my-test-dex/my-test-dex.d.ts +0 -37
- package/build/dex/my-test-dex/my-test-dex.js +0 -126
- package/build/dex/my-test-dex/my-test-dex.js.map +0 -1
- package/build/dex/my-test-dex/types.d.ts +0 -6
- package/build/dex/my-test-dex/types.js +0 -3
- package/build/dex/my-test-dex/types.js.map +0 -1
- package/build/dex/solidly/forks-override/fvm.d.ts +0 -20
- package/build/dex/solidly/forks-override/fvm.js +0 -42
- package/build/dex/solidly/forks-override/fvm.js.map +0 -1
- package/build/dex/wombat/config.d.ts +0 -5
- package/build/dex/wombat/config.js +0 -50
- package/build/dex/wombat/config.js.map +0 -1
- package/build/dex/wombat/types.d.ts +0 -33
- package/build/dex/wombat/types.js +0 -3
- package/build/dex/wombat/types.js.map +0 -1
- package/build/dex/wombat/utils.d.ts +0 -9
- package/build/dex/wombat/utils.js +0 -66
- package/build/dex/wombat/utils.js.map +0 -1
- package/build/dex/wombat/wombat-bmw.d.ts +0 -40
- package/build/dex/wombat/wombat-bmw.js +0 -145
- package/build/dex/wombat/wombat-bmw.js.map +0 -1
- package/build/dex/wombat/wombat-pool.d.ts +0 -22
- package/build/dex/wombat/wombat-pool.js +0 -161
- package/build/dex/wombat/wombat-pool.js.map +0 -1
- package/build/dex/wombat/wombat-quoter.d.ts +0 -16
- package/build/dex/wombat/wombat-quoter.js +0 -176
- package/build/dex/wombat/wombat-quoter.js.map +0 -1
- package/build/dex/wombat/wombat.d.ts +0 -55
- package/build/dex/wombat/wombat.js +0 -292
- package/build/dex/wombat/wombat.js.map +0 -1
|
@@ -3,55 +3,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.AlgebraEventPool = void 0;
|
|
7
7
|
const lodash_1 = __importDefault(require("lodash"));
|
|
8
8
|
const abi_1 = require("@ethersproject/abi");
|
|
9
|
-
const ethers_1 = require("ethers");
|
|
10
9
|
const ts_essentials_1 = require("ts-essentials");
|
|
11
|
-
const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
|
|
12
|
-
const UniswapV3Pool_abi_json_1 = __importDefault(require("../../abi/uniswap-v3/UniswapV3Pool.abi.json"));
|
|
13
10
|
const utils_1 = require("../../utils");
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
11
|
+
const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
|
|
12
|
+
const ethers_1 = require("ethers");
|
|
13
|
+
const AlgebraPool_abi_json_1 = __importDefault(require("../../abi/algebra/AlgebraPool.abi.json"));
|
|
14
|
+
const constants_1 = require("../uniswap-v3/constants");
|
|
17
15
|
const decoders_1 = require("../../lib/decoders");
|
|
18
16
|
const utils_2 = require("./utils");
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
const AlgebraMath_1 = require("./lib/AlgebraMath");
|
|
18
|
+
const TickBitMap_1 = require("../uniswap-v3/contract-math/TickBitMap");
|
|
19
|
+
const utils_3 = require("../uniswap-v3/contract-math/utils");
|
|
20
|
+
const Constants_1 = require("./lib/Constants");
|
|
21
|
+
const constants_2 = require("../../constants");
|
|
22
|
+
class AlgebraEventPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
|
|
23
|
+
constructor(dexHelper, parentName, stateMultiContract, erc20Interface, factoryAddress, token0, token1, logger, mapKey = '', poolInitCodeHash, poolDeployer) {
|
|
24
|
+
super(parentName, `${token0}_${token1}`, dexHelper, logger, true, mapKey);
|
|
23
25
|
this.dexHelper = dexHelper;
|
|
24
26
|
this.stateMultiContract = stateMultiContract;
|
|
25
|
-
this.decodeStateMultiCallResultWithRelativeBitmaps = decodeStateMultiCallResultWithRelativeBitmaps;
|
|
26
27
|
this.erc20Interface = erc20Interface;
|
|
27
28
|
this.factoryAddress = factoryAddress;
|
|
28
|
-
this.feeCode = feeCode;
|
|
29
29
|
this.poolInitCodeHash = poolInitCodeHash;
|
|
30
|
+
this.poolDeployer = poolDeployer;
|
|
30
31
|
this.handlers = {};
|
|
31
|
-
this.poolIface = new abi_1.Interface(
|
|
32
|
+
this.poolIface = new abi_1.Interface(AlgebraPool_abi_json_1.default);
|
|
32
33
|
this.initFailed = false;
|
|
33
34
|
this.initRetryAttemptCount = 0;
|
|
34
|
-
this.feeCodeAsString = feeCode.toString();
|
|
35
35
|
this.token0 = token0.toLowerCase();
|
|
36
36
|
this.token1 = token1.toLowerCase();
|
|
37
37
|
this.logDecoder = (log) => this.poolIface.parseLog(log);
|
|
38
38
|
this.addressesSubscribed = new Array(1);
|
|
39
|
-
|
|
39
|
+
this.handlers['Fee'] = this.handleNewFee.bind(this);
|
|
40
40
|
this.handlers['Swap'] = this.handleSwapEvent.bind(this);
|
|
41
|
-
this.handlers['Burn'] = this.handleBurnEvent.bind(this);
|
|
42
41
|
this.handlers['Mint'] = this.handleMintEvent.bind(this);
|
|
43
|
-
this.handlers['
|
|
44
|
-
this.handlers['IncreaseObservationCardinalityNext'] =
|
|
45
|
-
this.handleIncreaseObservationCardinalityNextEvent.bind(this);
|
|
46
|
-
// Wen need them to keep balance of the pool up to date
|
|
47
|
-
this.handlers['Collect'] = this.handleCollectEvent.bind(this);
|
|
48
|
-
// Almost the same as Collect, but for pool owners
|
|
49
|
-
this.handlers['CollectProtocol'] = this.handleCollectEvent.bind(this);
|
|
42
|
+
this.handlers['Burn'] = this.handleBurnEvent.bind(this);
|
|
50
43
|
this.handlers['Flash'] = this.handleFlashEvent.bind(this);
|
|
44
|
+
this.handlers['Collect'] = this.handleCollectEvent.bind(this);
|
|
45
|
+
this.handlers['CommunityFee'] = this.handleCommunityFee.bind(this);
|
|
51
46
|
}
|
|
52
47
|
get poolAddress() {
|
|
53
48
|
if (this._poolAddress === undefined) {
|
|
54
|
-
this._poolAddress = this._computePoolAddress(this.token0, this.token1
|
|
49
|
+
this._poolAddress = this._computePoolAddress(this.token0, this.token1);
|
|
55
50
|
}
|
|
56
51
|
return this._poolAddress;
|
|
57
52
|
}
|
|
@@ -71,19 +66,14 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
71
66
|
processLog(state, log, blockHeader) {
|
|
72
67
|
try {
|
|
73
68
|
const event = this.logDecoder(log);
|
|
74
|
-
const uniswapV3EventLoggingSampleRate = this.dexHelper.config.data.uniswapV3EventLoggingSampleRate;
|
|
75
|
-
if (!this.dexHelper.config.isSlave &&
|
|
76
|
-
uniswapV3EventLoggingSampleRate &&
|
|
77
|
-
(0, utils_1.isSampled)(uniswapV3EventLoggingSampleRate)) {
|
|
78
|
-
this.logger.info(`event=${event.name} - block=${blockHeader.number}. Log sampled at rate ${uniswapV3EventLoggingSampleRate * 100}%`);
|
|
79
|
-
}
|
|
80
69
|
if (event.name in this.handlers) {
|
|
81
70
|
// Because we have observations in array which is mutable by nature, there is a
|
|
82
71
|
// ts compile error: https://stackoverflow.com/questions/53412934/disable-allowing-assigning-readonly-types-to-non-readonly-types
|
|
83
72
|
// And there is no good workaround, so turn off the type checker for this line
|
|
84
73
|
const _state = lodash_1.default.cloneDeep(state);
|
|
85
74
|
try {
|
|
86
|
-
|
|
75
|
+
const newState = this.handlers[event.name](event, _state, log, blockHeader);
|
|
76
|
+
return newState;
|
|
87
77
|
}
|
|
88
78
|
catch (e) {
|
|
89
79
|
if (e instanceof Error &&
|
|
@@ -94,7 +84,7 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
94
84
|
this.logger.error(`${this.parentName}: Pool ${this.poolAddress}, ` +
|
|
95
85
|
`network=${this.dexHelper.config.data.network}: Unexpected ` +
|
|
96
86
|
`error while handling event on blockNumber=${blockHeader.number}, ` +
|
|
97
|
-
`blockHash=${blockHeader.hash} and parentHash=${blockHeader.parentHash} for
|
|
87
|
+
`blockHash=${blockHeader.hash} and parentHash=${blockHeader.parentHash} for QuickSwapV3, ${JSON.stringify(event)}`, e);
|
|
98
88
|
}
|
|
99
89
|
_state.isValid = false;
|
|
100
90
|
return _state;
|
|
@@ -106,99 +96,135 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
106
96
|
}
|
|
107
97
|
return null; // ignore unrecognized event
|
|
108
98
|
}
|
|
109
|
-
_getStateRequestCallData() {
|
|
110
|
-
if (!this._stateRequestCallData) {
|
|
111
|
-
const callData = [
|
|
112
|
-
{
|
|
113
|
-
target: this.token0,
|
|
114
|
-
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
115
|
-
this.poolAddress,
|
|
116
|
-
]),
|
|
117
|
-
decodeFunction: decoders_1.uint256ToBigInt,
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
target: this.token1,
|
|
121
|
-
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
122
|
-
this.poolAddress,
|
|
123
|
-
]),
|
|
124
|
-
decodeFunction: decoders_1.uint256ToBigInt,
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
target: this.stateMultiContract.options.address,
|
|
128
|
-
callData: this.stateMultiContract.methods
|
|
129
|
-
.getFullStateWithRelativeBitmaps(this.factoryAddress, this.token0, this.token1, this.feeCode, this.getBitmapRangeToRequest(), this.getBitmapRangeToRequest())
|
|
130
|
-
.encodeABI(),
|
|
131
|
-
decodeFunction: this.decodeStateMultiCallResultWithRelativeBitmaps !== undefined
|
|
132
|
-
? this.decodeStateMultiCallResultWithRelativeBitmaps
|
|
133
|
-
: utils_2.decodeStateMultiCallResultWithRelativeBitmaps,
|
|
134
|
-
},
|
|
135
|
-
];
|
|
136
|
-
this._stateRequestCallData = callData;
|
|
137
|
-
}
|
|
138
|
-
return this._stateRequestCallData;
|
|
139
|
-
}
|
|
140
99
|
getBitmapRangeToRequest() {
|
|
141
100
|
return constants_1.TICK_BITMAP_TO_USE + constants_1.TICK_BITMAP_BUFFER;
|
|
142
101
|
}
|
|
143
|
-
async
|
|
144
|
-
const callData =
|
|
102
|
+
async _fetchPoolStateSingleStep(blockNumber) {
|
|
103
|
+
const callData = [
|
|
104
|
+
{
|
|
105
|
+
target: this.token0,
|
|
106
|
+
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
107
|
+
this.poolAddress,
|
|
108
|
+
]),
|
|
109
|
+
decodeFunction: decoders_1.uint256ToBigInt,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
target: this.token1,
|
|
113
|
+
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
114
|
+
this.poolAddress,
|
|
115
|
+
]),
|
|
116
|
+
decodeFunction: decoders_1.uint256ToBigInt,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
target: this.stateMultiContract.options.address,
|
|
120
|
+
callData: this.stateMultiContract.methods
|
|
121
|
+
.getFullStateWithRelativeBitmaps(this.factoryAddress, this.token0, this.token1, this.getBitmapRangeToRequest(), this.getBitmapRangeToRequest())
|
|
122
|
+
.encodeABI(),
|
|
123
|
+
decodeFunction: utils_2.decodeStateMultiCallResultWithRelativeBitmaps,
|
|
124
|
+
},
|
|
125
|
+
];
|
|
145
126
|
const [resBalance0, resBalance1, resState] = await this.dexHelper.multiWrapper.tryAggregate(false, callData, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
|
|
146
|
-
// Quite ugly solution, but this is the one that fits to current flow.
|
|
147
|
-
// I think UniswapV3 callbacks subscriptions are complexified for no reason.
|
|
148
|
-
// Need to be revisited later
|
|
149
127
|
(0, ts_essentials_1.assert)(resState.success, 'Pool does not exist');
|
|
150
128
|
const [balance0, balance1, _state] = [
|
|
151
129
|
resBalance0.returnData,
|
|
152
130
|
resBalance1.returnData,
|
|
153
131
|
resState.returnData,
|
|
154
132
|
];
|
|
133
|
+
return [balance0, balance1, _state];
|
|
134
|
+
}
|
|
135
|
+
async _fetchPoolStateMultiStep(blockNumber) {
|
|
136
|
+
const balancesAndGlobalStateCalldata = [
|
|
137
|
+
{
|
|
138
|
+
target: this.token0,
|
|
139
|
+
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
140
|
+
this.poolAddress,
|
|
141
|
+
]),
|
|
142
|
+
decodeFunction: decoders_1.uint256ToBigInt,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
target: this.token1,
|
|
146
|
+
callData: this.erc20Interface.encodeFunctionData('balanceOf', [
|
|
147
|
+
this.poolAddress,
|
|
148
|
+
]),
|
|
149
|
+
decodeFunction: decoders_1.uint256ToBigInt,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
target: this.stateMultiContract.options.address,
|
|
153
|
+
callData: this.stateMultiContract.methods
|
|
154
|
+
.getFullStateWithoutTicks(this.factoryAddress, this.token0, this.token1, 0, 0)
|
|
155
|
+
.encodeABI(),
|
|
156
|
+
decodeFunction: utils_2.decodeStateMultiCallResultWithRelativeBitmaps,
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
const [resBalance0, resBalance1, stateWithoutTicksAndTickBitmap] = await this.dexHelper.multiWrapper.tryAggregate(false, balancesAndGlobalStateCalldata, blockNumber, this.dexHelper.multiWrapper.defaultBatchSize, false);
|
|
160
|
+
(0, ts_essentials_1.assert)(stateWithoutTicksAndTickBitmap.success, 'Pool does not exist');
|
|
161
|
+
const [balance0, balance1, _stateWithoutTicksAndTickBitmap] = [
|
|
162
|
+
resBalance0.returnData,
|
|
163
|
+
resBalance1.returnData,
|
|
164
|
+
stateWithoutTicksAndTickBitmap.returnData,
|
|
165
|
+
];
|
|
166
|
+
const { globalState: { tick }, } = _stateWithoutTicksAndTickBitmap;
|
|
167
|
+
const currentBitmapIndex = (0, utils_1.int16)((BigInt(tick) / Constants_1.Constants.TICK_SPACING) >> 8n);
|
|
168
|
+
const buffer = this.getBitmapRangeToRequest();
|
|
169
|
+
const startBitMapIndex = currentBitmapIndex - buffer;
|
|
170
|
+
const endBitMapIndex = currentBitmapIndex + buffer;
|
|
171
|
+
const allBitMapIndices = Array.from({ length: 2 * Number(buffer) + 1 }, () => startBitMapIndex + endBitMapIndex);
|
|
172
|
+
const ticksAndBitMaps = await Promise.all(allBitMapIndices.map(relativeTick => {
|
|
173
|
+
return this.stateMultiContract.methods
|
|
174
|
+
.getAdditionalBitmapWithTicks(this.factoryAddress, this.token0, this.token1, relativeTick, relativeTick)
|
|
175
|
+
.call();
|
|
176
|
+
}));
|
|
177
|
+
const _state = {
|
|
178
|
+
..._stateWithoutTicksAndTickBitmap,
|
|
179
|
+
tickBitmap: ticksAndBitMaps.flatMap(v => v[0]),
|
|
180
|
+
ticks: ticksAndBitMaps.flatMap(v => v[1]),
|
|
181
|
+
};
|
|
182
|
+
return [balance0, balance1, _state];
|
|
183
|
+
}
|
|
184
|
+
async _fetchInitStateMultiStrategies(blockNumber) {
|
|
185
|
+
try {
|
|
186
|
+
return await this._fetchPoolStateSingleStep(blockNumber);
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
if (e instanceof Error && e.message.includes('Pool does not exist'))
|
|
190
|
+
throw e;
|
|
191
|
+
if (this.dexHelper.config.data.network != constants_2.Network.ZKEVM)
|
|
192
|
+
throw e;
|
|
193
|
+
return this._fetchPoolStateMultiStep(blockNumber);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async generateState(blockNumber) {
|
|
197
|
+
const [balance0, balance1, _state] = await this._fetchInitStateMultiStrategies(blockNumber);
|
|
155
198
|
const tickBitmap = {};
|
|
156
199
|
const ticks = {};
|
|
157
200
|
(0, utils_3._reduceTickBitmap)(tickBitmap, _state.tickBitmap);
|
|
158
201
|
(0, utils_3._reduceTicks)(ticks, _state.ticks);
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
},
|
|
202
|
+
const globalState = {
|
|
203
|
+
communityFeeToken0: (0, utils_1.bigIntify)(_state.globalState.communityFeeToken0),
|
|
204
|
+
communityFeeToken1: (0, utils_1.bigIntify)(_state.globalState.communityFeeToken1),
|
|
205
|
+
fee: (0, utils_1.bigIntify)(_state.globalState.fee),
|
|
206
|
+
price: (0, utils_1.bigIntify)(_state.globalState.price),
|
|
207
|
+
tick: (0, utils_1.bigIntify)(_state.globalState.tick),
|
|
166
208
|
};
|
|
167
|
-
const currentTick =
|
|
168
|
-
const
|
|
169
|
-
const startTickBitmap = TickBitMap_1.TickBitMap.position(currentTick / tickSpacing)[0];
|
|
170
|
-
const requestedRange = this.getBitmapRangeToRequest();
|
|
209
|
+
const currentTick = globalState.tick;
|
|
210
|
+
const startTickBitmap = TickBitMap_1.TickBitMap.position(BigInt(currentTick) / Constants_1.Constants.TICK_SPACING)[0];
|
|
171
211
|
return {
|
|
172
212
|
pool: _state.pool,
|
|
173
213
|
blockTimestamp: (0, utils_1.bigIntify)(_state.blockTimestamp),
|
|
174
|
-
|
|
175
|
-
sqrtPriceX96: (0, utils_1.bigIntify)(_state.slot0.sqrtPriceX96),
|
|
176
|
-
tick: currentTick,
|
|
177
|
-
observationIndex: +_state.slot0.observationIndex,
|
|
178
|
-
observationCardinality: +_state.slot0.observationCardinality,
|
|
179
|
-
observationCardinalityNext: +_state.slot0.observationCardinalityNext,
|
|
180
|
-
feeProtocol: (0, utils_1.bigIntify)(_state.slot0.feeProtocol),
|
|
181
|
-
},
|
|
214
|
+
globalState,
|
|
182
215
|
liquidity: (0, utils_1.bigIntify)(_state.liquidity),
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
maxLiquidityPerTick: (0, utils_1.bigIntify)(_state.maxLiquidityPerTick),
|
|
216
|
+
tickSpacing: Constants_1.Constants.TICK_SPACING,
|
|
217
|
+
maxLiquidityPerTick: Constants_1.Constants.MAX_LIQUIDITY_PER_TICK,
|
|
186
218
|
tickBitmap,
|
|
187
219
|
ticks,
|
|
188
|
-
observations,
|
|
189
|
-
isValid: true,
|
|
190
220
|
startTickBitmap,
|
|
191
|
-
|
|
192
|
-
tickSpacing,
|
|
193
|
-
highestKnownTick: ((BigInt.asIntN(24, startTickBitmap + requestedRange) << 8n) +
|
|
194
|
-
BigInt.asIntN(24, 255n)) *
|
|
195
|
-
tickSpacing,
|
|
221
|
+
isValid: true,
|
|
196
222
|
balance0,
|
|
197
223
|
balance1,
|
|
198
224
|
};
|
|
199
225
|
}
|
|
200
226
|
handleSwapEvent(event, pool, log, blockHeader) {
|
|
201
|
-
const newSqrtPriceX96 = (0, utils_1.bigIntify)(event.args.
|
|
227
|
+
const newSqrtPriceX96 = (0, utils_1.bigIntify)(event.args.price);
|
|
202
228
|
const amount0 = (0, utils_1.bigIntify)(event.args.amount0);
|
|
203
229
|
const amount1 = (0, utils_1.bigIntify)(event.args.amount1);
|
|
204
230
|
const newTick = (0, utils_1.bigIntify)(event.args.tick);
|
|
@@ -212,7 +238,7 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
212
238
|
}
|
|
213
239
|
else {
|
|
214
240
|
const zeroForOne = amount0 > 0n;
|
|
215
|
-
|
|
241
|
+
const [, , , , , communityFee] = AlgebraMath_1.AlgebraMath._calculateSwapAndLock(pool, zeroForOne, newSqrtPriceX96, newTick, newLiquidity);
|
|
216
242
|
if (zeroForOne) {
|
|
217
243
|
if (amount1 < 0n) {
|
|
218
244
|
pool.balance1 -= BigInt.asUintN(256, -amount1);
|
|
@@ -235,47 +261,42 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
235
261
|
}
|
|
236
262
|
pool.balance1 += BigInt.asUintN(256, amount1);
|
|
237
263
|
}
|
|
264
|
+
if (communityFee > 0n) {
|
|
265
|
+
// _payCommunityFee
|
|
266
|
+
if (zeroForOne) {
|
|
267
|
+
pool.balance0 -= communityFee;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
pool.balance1 -= communityFee;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
238
273
|
return pool;
|
|
239
274
|
}
|
|
240
275
|
}
|
|
241
|
-
handleBurnEvent(event, pool, log, blockHeader) {
|
|
242
|
-
const amount = (0, utils_1.bigIntify)(event.args.amount);
|
|
243
|
-
const tickLower = (0, utils_1.bigIntify)(event.args.tickLower);
|
|
244
|
-
const tickUpper = (0, utils_1.bigIntify)(event.args.tickUpper);
|
|
245
|
-
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
246
|
-
uniswap_v3_math_1.uniswapV3Math._modifyPosition(pool, {
|
|
247
|
-
tickLower,
|
|
248
|
-
tickUpper,
|
|
249
|
-
liquidityDelta: -BigInt.asIntN(128, BigInt.asIntN(256, amount)),
|
|
250
|
-
});
|
|
251
|
-
// From this transaction I conclude that there is no balance change from
|
|
252
|
-
// Burn event: https://dashboard.tenderly.co/tx/mainnet/0xfccf5341147ac3ad0e66452273d12dfc3219e81f8fb369a6cdecfb24b9b9d078/logs
|
|
253
|
-
// And it aligns with UniswapV3 doc:
|
|
254
|
-
// https://github.com/Uniswap/v3-core/blob/05c10bf6d547d6121622ac51c457f93775e1df09/contracts/interfaces/pool/IUniswapV3PoolActions.sol#L59
|
|
255
|
-
// It just updates positions and tokensOwed which may be requested calling collect
|
|
256
|
-
// So, we don't need to update pool.balances0 and pool.balances1 here
|
|
257
|
-
return pool;
|
|
258
|
-
}
|
|
259
276
|
handleMintEvent(event, pool, log, blockHeader) {
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
const
|
|
277
|
+
const bottomTick = (0, utils_1.bigIntify)(event.args.bottomTick);
|
|
278
|
+
const topTick = (0, utils_1.bigIntify)(event.args.topTick);
|
|
279
|
+
const liquidityActual = (0, utils_1.bigIntify)(event.args.liquidityAmount);
|
|
263
280
|
const amount0 = (0, utils_1.bigIntify)(event.args.amount0);
|
|
264
281
|
const amount1 = (0, utils_1.bigIntify)(event.args.amount1);
|
|
265
282
|
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
266
|
-
|
|
267
|
-
tickLower,
|
|
268
|
-
tickUpper,
|
|
269
|
-
liquidityDelta: amount,
|
|
270
|
-
});
|
|
283
|
+
AlgebraMath_1.AlgebraMath._updatePositionTicksAndFees(pool, bottomTick, topTick, liquidityActual);
|
|
271
284
|
pool.balance0 += amount0;
|
|
272
285
|
pool.balance1 += amount1;
|
|
273
286
|
return pool;
|
|
274
287
|
}
|
|
275
|
-
|
|
276
|
-
const
|
|
277
|
-
const
|
|
278
|
-
|
|
288
|
+
handleBurnEvent(event, pool, log, blockHeader) {
|
|
289
|
+
const bottomTick = (0, utils_1.bigIntify)(event.args.bottomTick);
|
|
290
|
+
const topTick = (0, utils_1.bigIntify)(event.args.topTick);
|
|
291
|
+
const amount = (0, utils_1.bigIntify)(event.args.liquidityAmount);
|
|
292
|
+
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
293
|
+
AlgebraMath_1.AlgebraMath._updatePositionTicksAndFees(pool, bottomTick, topTick, -BigInt.asIntN(128, BigInt.asIntN(256, amount)));
|
|
294
|
+
// no balance change
|
|
295
|
+
return pool;
|
|
296
|
+
}
|
|
297
|
+
handleNewFee(event, pool, log, blockHeader) {
|
|
298
|
+
const fee = (0, utils_1.bigIntify)(event.args.fee);
|
|
299
|
+
pool.globalState.fee = fee;
|
|
279
300
|
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
280
301
|
return pool;
|
|
281
302
|
}
|
|
@@ -295,18 +316,21 @@ class BaseswapV3EventPool extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
295
316
|
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
296
317
|
return pool;
|
|
297
318
|
}
|
|
298
|
-
|
|
299
|
-
|
|
319
|
+
handleCommunityFee(event, pool, log, blockHeader) {
|
|
320
|
+
const communityFeeToken0 = (0, utils_1.bigIntify)(event.ags.communityFee0New);
|
|
321
|
+
const communityFeeToken1 = (0, utils_1.bigIntify)(event.ags.communityFee1New);
|
|
322
|
+
pool.globalState.communityFeeToken0 = communityFeeToken0;
|
|
323
|
+
pool.globalState.communityFeeToken1 = communityFeeToken1;
|
|
300
324
|
pool.blockTimestamp = (0, utils_1.bigIntify)(blockHeader.timestamp);
|
|
301
325
|
return pool;
|
|
302
326
|
}
|
|
303
|
-
_computePoolAddress(token0, token1
|
|
327
|
+
_computePoolAddress(token0, token1) {
|
|
304
328
|
// https://github.com/Uniswap/v3-periphery/blob/main/contracts/libraries/PoolAddress.sol
|
|
305
329
|
if (token0 > token1)
|
|
306
330
|
[token0, token1] = [token1, token0];
|
|
307
|
-
const encodedKey = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.defaultAbiCoder.encode(['address', 'address'
|
|
308
|
-
return ethers_1.ethers.utils.getCreate2Address(this.
|
|
331
|
+
const encodedKey = ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.defaultAbiCoder.encode(['address', 'address'], [token0, token1]));
|
|
332
|
+
return ethers_1.ethers.utils.getCreate2Address(this.poolDeployer, encodedKey, this.poolInitCodeHash);
|
|
309
333
|
}
|
|
310
334
|
}
|
|
311
|
-
exports.
|
|
312
|
-
//# sourceMappingURL=
|
|
335
|
+
exports.AlgebraEventPool = AlgebraEventPool;
|
|
336
|
+
//# sourceMappingURL=algebra-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algebra-pool.js","sourceRoot":"","sources":["../../../src/dex/algebra/algebra-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ export declare class Algebra extends SimpleExchange implements IDex<AlgebraData>
|
|
|
20
20
|
private readonly factory;
|
|
21
21
|
readonly isFeeOnTransferSupported: boolean;
|
|
22
22
|
protected eventPools: Record<string, IAlgebraEventPool | null>;
|
|
23
|
+
private newlyCreatedPoolKeys;
|
|
23
24
|
readonly hasConstantPriceLargeAmounts = false;
|
|
24
25
|
readonly needWrapNative = true;
|
|
25
26
|
intervalTask?: NodeJS.Timeout;
|
|
@@ -45,8 +45,8 @@ const AlgebraMath_1 = require("./lib/AlgebraMath");
|
|
|
45
45
|
const algebra_pool_v1_1_1 = require("./algebra-pool-v1_1");
|
|
46
46
|
const algebra_pool_v1_9_1 = require("./algebra-pool-v1_9");
|
|
47
47
|
const algebra_factory_1 = require("./algebra-factory");
|
|
48
|
-
const ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
|
|
49
|
-
const ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS = 24 * 60 * 60 * 1000; // Once in a day
|
|
48
|
+
// const ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
|
|
49
|
+
// const ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS = 24 * 60 * 60 * 1000; // Once in a day
|
|
50
50
|
const ALGEBRA_EFFICIENCY_FACTOR = 3;
|
|
51
51
|
const ALGEBRA_TICK_GAS_COST = 24000; // Ceiled
|
|
52
52
|
const ALGEBRA_TICK_BASE_OVERHEAD = 75000;
|
|
@@ -67,6 +67,7 @@ class Algebra extends simple_exchange_1.SimpleExchange {
|
|
|
67
67
|
this.config = config;
|
|
68
68
|
this.isFeeOnTransferSupported = false;
|
|
69
69
|
this.eventPools = {};
|
|
70
|
+
this.newlyCreatedPoolKeys = new Set();
|
|
70
71
|
this.hasConstantPriceLargeAmounts = false;
|
|
71
72
|
this.needWrapNative = true;
|
|
72
73
|
/*
|
|
@@ -76,7 +77,8 @@ class Algebra extends simple_exchange_1.SimpleExchange {
|
|
|
76
77
|
this.onPoolCreatedDeleteFromNonExistingSet = async ({ token0, token1, }) => {
|
|
77
78
|
const logPrefix = '[onPoolCreatedDeleteFromNonExistingSet]';
|
|
78
79
|
const [_token0, _token1] = this._sortTokens(token0, token1);
|
|
79
|
-
const poolKey = `${_token0}_${_token1}
|
|
80
|
+
const poolKey = `${_token0}_${_token1}`.toLowerCase();
|
|
81
|
+
this.newlyCreatedPoolKeys.add(poolKey);
|
|
80
82
|
// consider doing it only from master pool for less calls to distant cache
|
|
81
83
|
// delete entry locally to let local instance discover the pool
|
|
82
84
|
delete this.eventPools[this.getPoolIdentifier(_token0, _token1)];
|
|
@@ -113,13 +115,22 @@ class Algebra extends simple_exchange_1.SimpleExchange {
|
|
|
113
115
|
async initializePricing(blockNumber) {
|
|
114
116
|
// Init listening to new pools creation
|
|
115
117
|
await this.factory.initialize(blockNumber);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
118
|
+
//// COMMENTING DEPRECATED LOGIC: as we now invalidate pools on creation this is not needed anymore
|
|
119
|
+
// if (!this.dexHelper.config.isSlave) {
|
|
120
|
+
// const cleanExpiredNotExistingPoolsKeys = async () => {
|
|
121
|
+
// const maxTimestamp =
|
|
122
|
+
// Date.now() - ALGEBRA_CLEAN_NOT_EXISTING_POOL_TTL_MS;
|
|
123
|
+
// await this.dexHelper.cache.zremrangebyscore(
|
|
124
|
+
// this.notExistingPoolSetKey,
|
|
125
|
+
// 0,
|
|
126
|
+
// maxTimestamp,
|
|
127
|
+
// );
|
|
128
|
+
// };
|
|
129
|
+
// this.intervalTask = setInterval(
|
|
130
|
+
// cleanExpiredNotExistingPoolsKeys.bind(this),
|
|
131
|
+
// ALGEBRA_CLEAN_NOT_EXISTING_POOL_INTERVAL_MS,
|
|
132
|
+
// );
|
|
133
|
+
// }
|
|
123
134
|
}
|
|
124
135
|
async getPool(srcAddress, destAddress, blockNumber) {
|
|
125
136
|
let pool = this.eventPools[this.getPoolIdentifier(srcAddress, destAddress)];
|
|
@@ -178,20 +189,37 @@ class Algebra extends simple_exchange_1.SimpleExchange {
|
|
|
178
189
|
pool.initRetryAttemptCount = 0;
|
|
179
190
|
},
|
|
180
191
|
});
|
|
192
|
+
if (this.newlyCreatedPoolKeys.has(key)) {
|
|
193
|
+
this.newlyCreatedPoolKeys.delete(key);
|
|
194
|
+
}
|
|
181
195
|
}
|
|
182
196
|
catch (e) {
|
|
183
197
|
if (e instanceof Error && e.message.endsWith('Pool does not exist')) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
this.
|
|
198
|
+
/*
|
|
199
|
+
protection against 2 race conditions
|
|
200
|
+
1/ if pool.initialize() promise rejects after the Pool creation event got treated
|
|
201
|
+
2/ if the rpc node we hit on the http request is lagging behind the one we got event from (websocket)
|
|
202
|
+
*/
|
|
203
|
+
if (this.newlyCreatedPoolKeys.has(key)) {
|
|
204
|
+
this.logger.warn(`[block=${blockNumber}][Pool=${key}] newly created pool failed to initialise`);
|
|
205
|
+
this.newlyCreatedPoolKeys.delete(key);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.logger.info(`[block=${blockNumber}][Pool=${key}] pool failed to initialize so it's marked as non existing`, e);
|
|
209
|
+
// allowing only master/leader node to alter distant cache to reduce risk of race conditions
|
|
210
|
+
if (!this.dexHelper.config.isSlave) {
|
|
211
|
+
// no need to await we want the set to have the pool key but it's not blocking
|
|
212
|
+
this.dexHelper.cache.zadd(this.notExistingPoolSetKey, [Date.now(), key], 'NX');
|
|
213
|
+
}
|
|
214
|
+
// Pool does not exist for this pair, so we can set it to null
|
|
215
|
+
// to prevent more requests for this pool
|
|
216
|
+
pool = null;
|
|
217
|
+
}
|
|
190
218
|
}
|
|
191
219
|
else {
|
|
192
220
|
// on unknown error mark as failed and increase retryCount for retry init strategy
|
|
193
221
|
// note: state would be null by default which allows to fallback
|
|
194
|
-
this.logger.warn(
|
|
222
|
+
this.logger.warn(`[block=${blockNumber}][Pool=${key}] Can not generate pool state for srcAddress=${srcAddress}, destAddress=${destAddress} pool fallback to rpc and retry every ${this.config.initRetryFrequency} times, initRetryAttemptCount=${pool.initRetryAttemptCount}`, e);
|
|
195
223
|
pool.initFailed = true;
|
|
196
224
|
}
|
|
197
225
|
}
|