@paraswap/dex-lib 2.42.3 → 2.42.4-baseswap
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/balancer-v1/balancer-v1.js +21 -10
- package/build/dex/balancer-v1/balancer-v1.js.map +1 -1
- package/build/dex/balancer-v1/config.d.ts +2 -1
- package/build/dex/balancer-v1/config.js +3 -2
- package/build/dex/balancer-v1/config.js.map +1 -1
- package/build/dex/baseswap-v3/baseswap-v3-factory.d.ts +26 -0
- package/build/dex/baseswap-v3/baseswap-v3-factory.js +44 -0
- package/build/dex/baseswap-v3/baseswap-v3-factory.js.map +1 -0
- package/build/dex/baseswap-v3/baseswap-v3-pool.d.ts +46 -0
- package/build/dex/baseswap-v3/baseswap-v3-pool.js +312 -0
- package/build/dex/baseswap-v3/baseswap-v3-pool.js.map +1 -0
- package/build/dex/baseswap-v3/baseswap-v3.d.ts +71 -0
- package/build/dex/baseswap-v3/baseswap-v3.js +752 -0
- package/build/dex/baseswap-v3/baseswap-v3.js.map +1 -0
- package/build/dex/baseswap-v3/config.d.ts +9 -0
- package/build/dex/baseswap-v3/config.js +48 -0
- package/build/dex/baseswap-v3/config.js.map +1 -0
- package/build/dex/baseswap-v3/constants.d.ts +28 -0
- package/build/dex/baseswap-v3/constants.js +35 -0
- package/build/dex/baseswap-v3/constants.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/BitMath.d.ts +4 -0
- package/build/dex/baseswap-v3/contract-math/BitMath.js +93 -0
- package/build/dex/baseswap-v3/contract-math/BitMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.d.ts +3 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.js +8 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint128.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.d.ts +4 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.js +9 -0
- package/build/dex/baseswap-v3/contract-math/FixedPoint96.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/FullMath.d.ts +4 -0
- package/build/dex/baseswap-v3/contract-math/FullMath.js +19 -0
- package/build/dex/baseswap-v3/contract-math/FullMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.d.ts +3 -0
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.js +22 -0
- package/build/dex/baseswap-v3/contract-math/LiquidityMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/Oracle.d.ts +10 -0
- package/build/dex/baseswap-v3/contract-math/Oracle.js +133 -0
- package/build/dex/baseswap-v3/contract-math/Oracle.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.d.ts +10 -0
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.js +91 -0
- package/build/dex/baseswap-v3/contract-math/SqrtPriceMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/SwapMath.d.ts +8 -0
- package/build/dex/baseswap-v3/contract-math/SwapMath.js +70 -0
- package/build/dex/baseswap-v3/contract-math/SwapMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/Tick.d.ts +7 -0
- package/build/dex/baseswap-v3/contract-math/Tick.js +45 -0
- package/build/dex/baseswap-v3/contract-math/Tick.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/TickBitMap.d.ts +7 -0
- package/build/dex/baseswap-v3/contract-math/TickBitMap.js +84 -0
- package/build/dex/baseswap-v3/contract-math/TickBitMap.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/TickMath.d.ts +8 -0
- package/build/dex/baseswap-v3/contract-math/TickMath.js +162 -0
- package/build/dex/baseswap-v3/contract-math/TickMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.d.ts +3 -0
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.js +10 -0
- package/build/dex/baseswap-v3/contract-math/UnsafeMath.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.d.ts +37 -0
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.js +393 -0
- package/build/dex/baseswap-v3/contract-math/uniswap-v3-math.js.map +1 -0
- package/build/dex/baseswap-v3/contract-math/utils.d.ts +7 -0
- package/build/dex/baseswap-v3/contract-math/utils.js +42 -0
- package/build/dex/baseswap-v3/contract-math/utils.js.map +1 -0
- package/build/dex/baseswap-v3/types.d.ts +164 -0
- package/build/dex/baseswap-v3/types.js +9 -0
- package/build/dex/baseswap-v3/types.js.map +1 -0
- package/build/dex/baseswap-v3/utils.d.ts +6 -0
- package/build/dex/baseswap-v3/utils.js +65 -0
- package/build/dex/baseswap-v3/utils.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/package.json +1 -1
- package/src/dex/balancer-v1/balancer-v1.ts +32 -13
- package/src/dex/balancer-v1/config.ts +2 -1
- package/src/dex/baseswap-v3/baseswap-v3-e2e.test.ts +129 -0
- package/src/dex/baseswap-v3/baseswap-v3-events.test.ts +141 -0
- package/src/dex/baseswap-v3/baseswap-v3-factory.ts +73 -0
- package/src/dex/baseswap-v3/baseswap-v3-integration.test.ts +472 -0
- package/src/dex/baseswap-v3/baseswap-v3-pool.ts +519 -0
- package/src/dex/baseswap-v3/baseswap-v3.ts +1243 -0
- package/src/dex/baseswap-v3/config.ts +53 -0
- package/src/dex/baseswap-v3/constants.ts +41 -0
- package/src/dex/baseswap-v3/contract-math/BitMath.ts +90 -0
- package/src/dex/baseswap-v3/contract-math/FixedPoint128.ts +3 -0
- package/src/dex/baseswap-v3/contract-math/FixedPoint96.ts +4 -0
- package/src/dex/baseswap-v3/contract-math/FullMath.ts +30 -0
- package/src/dex/baseswap-v3/contract-math/LiquidityMath.ts +17 -0
- package/src/dex/baseswap-v3/contract-math/Oracle.ts +226 -0
- package/src/dex/baseswap-v3/contract-math/SqrtPriceMath.ts +226 -0
- package/src/dex/baseswap-v3/contract-math/SwapMath.ts +139 -0
- package/src/dex/baseswap-v3/contract-math/Tick.ts +82 -0
- package/src/dex/baseswap-v3/contract-math/TickBitMap.ts +123 -0
- package/src/dex/baseswap-v3/contract-math/TickMath.ts +211 -0
- package/src/dex/baseswap-v3/contract-math/UnsafeMath.ts +5 -0
- package/src/dex/baseswap-v3/contract-math/uniswap-v3-math.ts +666 -0
- package/src/dex/baseswap-v3/contract-math/utils.ts +55 -0
- package/src/dex/baseswap-v3/types.ts +191 -0
- package/src/dex/baseswap-v3/utils.ts +83 -0
- package/src/dex/index.ts +2 -0
- package/tests/constants-e2e.ts +1 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decodeStateMultiCallResultWithRelativeBitmaps = exports.getUniswapV3DexKey = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
const ts_essentials_1 = require("ts-essentials");
|
|
6
|
+
const decoders_1 = require("../../lib/decoders");
|
|
7
|
+
function getUniswapV3DexKey(UniswapV3Config) {
|
|
8
|
+
const UniswapV3Keys = Object.keys(UniswapV3Config);
|
|
9
|
+
if (UniswapV3Keys.length !== 1) {
|
|
10
|
+
throw new Error(`UniswapV3 key in UniswapV3Config is not unique. Update relevant places (optimizer) or fix config issue. Received: ${JSON.stringify(UniswapV3Config, (_0, value) => (typeof value === 'bigint' ? value.toString() : value))}`);
|
|
11
|
+
}
|
|
12
|
+
return UniswapV3Keys[0].toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
exports.getUniswapV3DexKey = getUniswapV3DexKey;
|
|
15
|
+
function decodeStateMultiCallResultWithRelativeBitmaps(result) {
|
|
16
|
+
const [isSuccess, toDecode] = (0, decoders_1.extractSuccessAndValue)(result);
|
|
17
|
+
(0, ts_essentials_1.assert)(isSuccess && toDecode !== '0x', `decodeStateMultiCallResultWithRelativeBitmaps failed to get decodable result: ${result}`);
|
|
18
|
+
const decoded = ethers_1.ethers.utils.defaultAbiCoder.decode([
|
|
19
|
+
// I don't want to pass here any interface, so I just use it in ethers format
|
|
20
|
+
`
|
|
21
|
+
tuple(
|
|
22
|
+
address pool,
|
|
23
|
+
uint256 blockTimestamp,
|
|
24
|
+
tuple(
|
|
25
|
+
uint160 sqrtPriceX96,
|
|
26
|
+
int24 tick,
|
|
27
|
+
uint16 observationIndex,
|
|
28
|
+
uint16 observationCardinality,
|
|
29
|
+
uint16 observationCardinalityNext,
|
|
30
|
+
uint8 feeProtocol,
|
|
31
|
+
bool unlocked,
|
|
32
|
+
) slot0,
|
|
33
|
+
uint128 liquidity,
|
|
34
|
+
int24 tickSpacing,
|
|
35
|
+
uint128 maxLiquidityPerTick,
|
|
36
|
+
tuple(
|
|
37
|
+
uint32 blockTimestamp,
|
|
38
|
+
int56 tickCumulative,
|
|
39
|
+
uint160 secondsPerLiquidityCumulativeX128,
|
|
40
|
+
bool initialized,
|
|
41
|
+
) observation,
|
|
42
|
+
tuple(
|
|
43
|
+
int16 index,
|
|
44
|
+
uint256 value,
|
|
45
|
+
)[] tickBitmap,
|
|
46
|
+
tuple(
|
|
47
|
+
int24 index,
|
|
48
|
+
tuple(
|
|
49
|
+
uint128 liquidityGross,
|
|
50
|
+
int128 liquidityNet,
|
|
51
|
+
int56 tickCumulativeOutside,
|
|
52
|
+
uint160 secondsPerLiquidityOutsideX128,
|
|
53
|
+
uint32 secondsOutside,
|
|
54
|
+
bool initialized,
|
|
55
|
+
) value,
|
|
56
|
+
)[] ticks
|
|
57
|
+
)
|
|
58
|
+
`,
|
|
59
|
+
], toDecode)[0];
|
|
60
|
+
// This conversion is not precise, because when we decode, we have more values
|
|
61
|
+
// But I typed only the ones that are used later
|
|
62
|
+
return decoded;
|
|
63
|
+
}
|
|
64
|
+
exports.decodeStateMultiCallResultWithRelativeBitmaps = decodeStateMultiCallResultWithRelativeBitmaps;
|
|
65
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/dex/baseswap-v3/utils.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAC3C,iDAAuC;AACvC,iDAA4D;AAQ5D,SAAgB,kBAAkB,CAAC,eAAwC;IACzE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CACb,qHAAqH,IAAI,CAAC,SAAS,CACjI,eAAe,EACf,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACtE,EAAE,CACJ,CAAC;KACH;IAED,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAZD,gDAYC;AAED,SAAgB,6CAA6C,CAC3D,MAA0C;IAE1C,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAA,iCAAsB,EAAC,MAAM,CAAC,CAAC;IAE7D,IAAA,sBAAM,EACJ,SAAS,IAAI,QAAQ,KAAK,IAAI,EAC9B,iFAAiF,MAAM,EAAE,CAC1F,CAAC;IAEF,MAAM,OAAO,GAAG,eAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CACjD;QACE,6EAA6E;QAC7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCD;KACA,EACD,QAAQ,CACT,CAAC,CAAC,CAAC,CAAC;IACL,8EAA8E;IAC9E,gDAAgD;IAChD,OAAO,OAAyD,CAAC;AACnE,CAAC;AA1DD,sGA0DC"}
|
package/build/dex/index.js
CHANGED
|
@@ -79,6 +79,7 @@ const algebra_1 = require("./algebra/algebra");
|
|
|
79
79
|
const quick_perps_1 = require("./quick-perps/quick-perps");
|
|
80
80
|
const nomiswap_v2_1 = require("./uniswap-v2/nomiswap-v2");
|
|
81
81
|
const dexalot_1 = require("./dexalot/dexalot");
|
|
82
|
+
const baseswap_v3_1 = require("./baseswap-v3/baseswap-v3");
|
|
82
83
|
const LegacyDexes = [
|
|
83
84
|
curve_v2_1.CurveV2,
|
|
84
85
|
stable_pool_1.StablePool,
|
|
@@ -154,6 +155,7 @@ const Dexes = [
|
|
|
154
155
|
swaap_v2_1.SwaapV2,
|
|
155
156
|
quick_perps_1.QuickPerps,
|
|
156
157
|
nomiswap_v2_1.NomiswapV2,
|
|
158
|
+
baseswap_v3_1.BaseswapV3,
|
|
157
159
|
];
|
|
158
160
|
class DexAdapterService {
|
|
159
161
|
constructor(dexHelper, network, sellAdapters = {}, buyAdapters = {}) {
|
package/build/dex/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dex/index.ts"],"names":[],"mappings":";;;AACA,yCAAqC;AAErC,qCAAkC;AAClC,qDAAiD;AACjD,+CAA2C;AAC3C,sCAAmC;AACnC,0EAAsE;AACtE,mCAAgC;AAChC,wDAAoD;AACpD,2DAAuD;AACvD,uDAA0D;AAC1D,wDAAoD;AACpD,sDAAwD;AACxD,sDAAsD;AACtD,gDAA6C;AAC7C,4CAAyC;AACzC,4CAAyC;AACzC,qCAAkC;AAClC,2CAAwC;AACxC,uCAAoC;AACpC,mCAAgC;AAChC,qCAAkC;AAClC,yCAAsC;AACtC,+CAA2C;AAC3C,+CAA2C;AAC3C,+CAA2C;AAC3C,2CAAwC;AACxC,uCAAmC;AACnC,uCAAmC;AACnC,uCAAoC;AACpC,yCAAsC;AAEtC,4CAAwC;AAExC,iCAA8B;AAC9B,sDAAmD;AACnD,qDAAiD;AACjD,kDAA+C;AAC/C,kDAA+C;AAC/C,mCAAgC;AAChC,qDAAgD;AAChD,yFAAoF;AACpF,iDAAkD;AAClD,+CAA4C;AAC5C,4DAAyD;AACzD,0DAAuD;AACvD,8DAA2D;AAC3D,kEAA+D;AAC/D,sEAAmE;AACnE,kEAA+D;AAC/D,wEAAqE;AACrE,qDAAkD;AAClD,wDAAqD;AACrD,gEAA6D;AAC7D,0DAAuD;AACvD,kEAA+D;AAC/D,sEAAmE;AACnE,2DAAuD;AACvD,uDAA0D;AAC1D,kDAA8C;AAC9C,0EAAqE;AACrE,2DAAwD;AACxD,0EAAqE;AACrE,2DAAuD;AACvD,kDAA8C;AAC9C,4CAAyC;AACzC,+CAA4C;AAC5C,kDAA+C;AAC/C,iEAA6D;AAC7D,2DAAuD;AACvD,2DAAuD;AACvD,2DAAuD;AACvD,mDAA8C;AAC9C,kDAA8C;AAC9C,6DAAyD;AACzD,uDAAiD;AACjD,oEAAgE;AAChE,+CAA4C;AAC5C,2DAAuD;AACvD,0DAAsD;AACtD,+CAA4C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dex/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -28,20 +28,35 @@ import {
|
|
|
28
28
|
} from './types';
|
|
29
29
|
import { SimpleExchange } from '../simple-exchange';
|
|
30
30
|
import {
|
|
31
|
+
MIN_USD_LIQUIDITY_TO_FETCH,
|
|
31
32
|
BalancerV1Config,
|
|
32
33
|
Adapters,
|
|
33
|
-
POOLS_FETCH_TIMEOUT,
|
|
34
34
|
MAX_POOLS_FOR_PRICING,
|
|
35
35
|
BALANCER_SWAP_GAS_COST,
|
|
36
|
+
MAX_POOL_CNT,
|
|
36
37
|
} from './config';
|
|
37
38
|
import { BalancerV1EventPool } from './balancer-v1-pool';
|
|
38
39
|
import { generatePoolStates } from './utils';
|
|
39
40
|
import BalancerV1ExchangeProxyABI from '../../abi/BalancerV1ExchangeProxy.json';
|
|
40
41
|
import BalancerCustomMulticallABI from '../../abi/BalancerCustomMulticall.json';
|
|
41
42
|
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const fetchAllPoolsQuery = `query {
|
|
44
|
+
pools(first: ${MAX_POOL_CNT.toString()}
|
|
45
|
+
orderBy: liquidity
|
|
46
|
+
orderDirection: desc
|
|
47
|
+
where: {liquidity_gt: ${MIN_USD_LIQUIDITY_TO_FETCH.toString()}}) {
|
|
48
|
+
id
|
|
49
|
+
swapFee
|
|
50
|
+
totalWeight
|
|
51
|
+
tokensList
|
|
52
|
+
tokens {
|
|
53
|
+
address
|
|
54
|
+
balance
|
|
55
|
+
decimals
|
|
56
|
+
denormWeight
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}`;
|
|
45
60
|
|
|
46
61
|
export class BalancerV1
|
|
47
62
|
extends SimpleExchange
|
|
@@ -86,18 +101,22 @@ export class BalancerV1
|
|
|
86
101
|
// for pricing requests. It is optional for a DEX to
|
|
87
102
|
// implement this function
|
|
88
103
|
async initializePricing(_blockNumber: number) {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
104
|
+
const { data } = await this.dexHelper.httpRequest.post<{
|
|
105
|
+
data: { pools: PoolInfo[] };
|
|
106
|
+
}>(
|
|
107
|
+
this.config.subgraphURL,
|
|
108
|
+
{ query: fetchAllPoolsQuery },
|
|
109
|
+
SUBGRAPH_TIMEOUT,
|
|
92
110
|
);
|
|
93
111
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
112
|
+
if (!(data && data.pools))
|
|
113
|
+
throw new Error(
|
|
114
|
+
`Error ${this.dexKey} Subgraph: couldn't fetch the pools from the subgraph`,
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
this.poolsInfo = data;
|
|
100
118
|
|
|
119
|
+
this.poolInfosByToken = {};
|
|
101
120
|
for (const poolInfo of this.poolsInfo.pools) {
|
|
102
121
|
for (const tokenAddress of poolInfo.tokensList) {
|
|
103
122
|
if (!this.poolInfosByToken[tokenAddress]) {
|
|
@@ -2,7 +2,8 @@ import { DexParams } from './types';
|
|
|
2
2
|
import { DexConfigMap, AdapterMappings } from '../../types';
|
|
3
3
|
import { Network, SwapSide } from '../../constants';
|
|
4
4
|
|
|
5
|
-
export const
|
|
5
|
+
export const MAX_POOL_CNT = 1000;
|
|
6
|
+
export const MIN_USD_LIQUIDITY_TO_FETCH = 100;
|
|
6
7
|
export const BALANCES_MULTICALL_POOLS_LIMIT = 200;
|
|
7
8
|
export const MAX_POOLS_FOR_PRICING = 5;
|
|
8
9
|
export const BALANCER_SWAP_GAS_COST = 120 * 1000;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
dotenv.config();
|
|
3
|
+
|
|
4
|
+
import { testE2E } from '../../../tests/utils-e2e';
|
|
5
|
+
import {
|
|
6
|
+
Tokens,
|
|
7
|
+
Holders,
|
|
8
|
+
NativeTokenSymbols,
|
|
9
|
+
} from '../../../tests/constants-e2e';
|
|
10
|
+
import { Network, ContractMethod, SwapSide } from '../../constants';
|
|
11
|
+
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
12
|
+
import { generateConfig } from '../../config';
|
|
13
|
+
|
|
14
|
+
function testForNetwork(
|
|
15
|
+
network: Network,
|
|
16
|
+
dexKey: string,
|
|
17
|
+
tokenASymbol: string,
|
|
18
|
+
tokenBSymbol: string,
|
|
19
|
+
tokenAAmount: string,
|
|
20
|
+
tokenBAmount: string,
|
|
21
|
+
nativeTokenAmount: string,
|
|
22
|
+
slippage?: number | undefined,
|
|
23
|
+
) {
|
|
24
|
+
const provider = new StaticJsonRpcProvider(
|
|
25
|
+
generateConfig(network).privateHttpProvider,
|
|
26
|
+
network,
|
|
27
|
+
);
|
|
28
|
+
const tokens = Tokens[network];
|
|
29
|
+
const holders = Holders[network];
|
|
30
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
31
|
+
|
|
32
|
+
const sideToContractMethods = new Map([
|
|
33
|
+
[
|
|
34
|
+
SwapSide.SELL,
|
|
35
|
+
[
|
|
36
|
+
ContractMethod.simpleSwap,
|
|
37
|
+
ContractMethod.multiSwap,
|
|
38
|
+
ContractMethod.megaSwap,
|
|
39
|
+
],
|
|
40
|
+
],
|
|
41
|
+
[SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
describe(`${network}`, () => {
|
|
45
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
46
|
+
describe(`${side}`, () => {
|
|
47
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
48
|
+
describe(`${contractMethod}`, () => {
|
|
49
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
50
|
+
await testE2E(
|
|
51
|
+
tokens[nativeTokenSymbol],
|
|
52
|
+
tokens[tokenASymbol],
|
|
53
|
+
holders[nativeTokenSymbol],
|
|
54
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
55
|
+
side,
|
|
56
|
+
dexKey,
|
|
57
|
+
contractMethod,
|
|
58
|
+
network,
|
|
59
|
+
provider,
|
|
60
|
+
undefined,
|
|
61
|
+
undefined,
|
|
62
|
+
undefined,
|
|
63
|
+
slippage,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
67
|
+
await testE2E(
|
|
68
|
+
tokens[tokenASymbol],
|
|
69
|
+
tokens[nativeTokenSymbol],
|
|
70
|
+
holders[tokenASymbol],
|
|
71
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
72
|
+
side,
|
|
73
|
+
dexKey,
|
|
74
|
+
contractMethod,
|
|
75
|
+
network,
|
|
76
|
+
provider,
|
|
77
|
+
undefined,
|
|
78
|
+
undefined,
|
|
79
|
+
undefined,
|
|
80
|
+
slippage,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
84
|
+
await testE2E(
|
|
85
|
+
tokens[tokenASymbol],
|
|
86
|
+
tokens[tokenBSymbol],
|
|
87
|
+
holders[tokenASymbol],
|
|
88
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
89
|
+
side,
|
|
90
|
+
dexKey,
|
|
91
|
+
contractMethod,
|
|
92
|
+
network,
|
|
93
|
+
provider,
|
|
94
|
+
undefined,
|
|
95
|
+
undefined,
|
|
96
|
+
undefined,
|
|
97
|
+
slippage,
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
describe('BaseswapV3 E2E', () => {
|
|
108
|
+
const dexKey = 'BaseswapV3';
|
|
109
|
+
describe('Base', () => {
|
|
110
|
+
const network = Network.BASE;
|
|
111
|
+
|
|
112
|
+
const tokenASymbol: string = 'USDC';
|
|
113
|
+
const tokenBSymbol: string = 'USDbC';
|
|
114
|
+
|
|
115
|
+
const tokenAAmount: string = '1000000';
|
|
116
|
+
const tokenBAmount: string = '1000000';
|
|
117
|
+
const nativeTokenAmount = '1000000000000000000';
|
|
118
|
+
|
|
119
|
+
testForNetwork(
|
|
120
|
+
network,
|
|
121
|
+
dexKey,
|
|
122
|
+
tokenASymbol,
|
|
123
|
+
tokenBSymbol,
|
|
124
|
+
tokenAAmount,
|
|
125
|
+
tokenBAmount,
|
|
126
|
+
nativeTokenAmount,
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import dotenv from 'dotenv';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import { BaseswapV3EventPool } from './baseswap-v3-pool';
|
|
7
|
+
import { BaseswapV3Config } from './config';
|
|
8
|
+
import { Network } from '../../constants';
|
|
9
|
+
import { DummyDexHelper } from '../../dex-helper/index';
|
|
10
|
+
import { testEventSubscriber } from '../../../tests/utils-events';
|
|
11
|
+
import { PoolState } from './types';
|
|
12
|
+
import { Interface } from '@ethersproject/abi';
|
|
13
|
+
import ERC20ABI from '../../abi/erc20.json';
|
|
14
|
+
import StateMulticallABI from '../../abi/uniswap-v3/UniswapV3StateMulticall.abi.json';
|
|
15
|
+
import { AbiItem } from 'web3-utils';
|
|
16
|
+
|
|
17
|
+
jest.setTimeout(300 * 1000);
|
|
18
|
+
const dexKey = 'BaseswapV3';
|
|
19
|
+
const network = Network.BASE;
|
|
20
|
+
const config = BaseswapV3Config[dexKey][network];
|
|
21
|
+
|
|
22
|
+
async function fetchPoolStateFromContract(
|
|
23
|
+
baseswapV3Pool: BaseswapV3EventPool,
|
|
24
|
+
blockNumber: number,
|
|
25
|
+
poolAddress: string,
|
|
26
|
+
): Promise<PoolState> {
|
|
27
|
+
const message = `BaseswapV3: ${poolAddress} blockNumber ${blockNumber}`;
|
|
28
|
+
console.log(`Fetching state ${message}`);
|
|
29
|
+
// Be careful to not request state prior to contract deployment
|
|
30
|
+
// Otherwise need to use manual state sourcing from multicall
|
|
31
|
+
// We had that mechanism, but removed it with this commit
|
|
32
|
+
// You can restore it, but better just to find block after state multicall
|
|
33
|
+
// deployment
|
|
34
|
+
const state = baseswapV3Pool.generateState(blockNumber);
|
|
35
|
+
console.log(`Done ${message}`);
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe('BaseswapV3 Event', function () {
|
|
40
|
+
const poolAddress = '0xEf3C164b0feE8Eb073513E88EcEa280A58cC9945';
|
|
41
|
+
const poolFeeCode = 450n;
|
|
42
|
+
const token0 = '0x4200000000000000000000000000000000000006';
|
|
43
|
+
const token1 = '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA'; // USDbC
|
|
44
|
+
|
|
45
|
+
const blockNumbers: { [eventName: string]: number[] } = {
|
|
46
|
+
['Swap']: [
|
|
47
|
+
5574195, 5574217, 5574296, 5574296, 5574369, 5574404, 5574489, 5574522,
|
|
48
|
+
5574566, 5574579, 5574587, 5574588, 5574611, 5574657, 5574712, 5574737,
|
|
49
|
+
5574761, 5574806, 5574851, 5574896, 5574918, 5574982, 5575086, 5575110,
|
|
50
|
+
5575308, 5575378, 5575490, 5575668,
|
|
51
|
+
],
|
|
52
|
+
['Burn']: [
|
|
53
|
+
5575845, 5609704, 5609704, 5612315, 5612770, 5616727, 5617522, 5617821,
|
|
54
|
+
5620232, 5622253,
|
|
55
|
+
],
|
|
56
|
+
// topic0 - 0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde
|
|
57
|
+
['Mint']: [
|
|
58
|
+
5594704, 5595166, 5606630, 5609854, 5612343, 5612386, 5612959, 5613707,
|
|
59
|
+
5619196, 5620167, 5622035, 5622391, 5644261, 5645562, 5647711, 5649108,
|
|
60
|
+
5649161, 5649377, 5651799, 5652903,
|
|
61
|
+
],
|
|
62
|
+
// topic0 - 0x973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b133
|
|
63
|
+
['SetFeeProtocol']: [],
|
|
64
|
+
// topic0 - 0xac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a
|
|
65
|
+
// There are some events on blockNumbers: 13125816, 12733621, 12591465
|
|
66
|
+
// But stateMulticall is not deployed at that time. So I just remove that check
|
|
67
|
+
// I think it is not important actually
|
|
68
|
+
['IncreaseObservationCardinalityNext']: [],
|
|
69
|
+
['Collect']: [
|
|
70
|
+
5575845, 5609704, 5612315, 5612770, 5616727, 5617522, 5617821, 5620232,
|
|
71
|
+
5622253, 5642348, 5643915, 5645799, 5646074, 5647176, 5650388, 5650466,
|
|
72
|
+
5653068, 5655334, 5655462, 5656401, 5657882, 5658500, 5659898, 5663603,
|
|
73
|
+
5663999, 5664004, 5670005, 5671343, 5673141,
|
|
74
|
+
],
|
|
75
|
+
['Flash']: [],
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
describe('BaseswapV3EventPool', () => {
|
|
79
|
+
Object.keys(blockNumbers).forEach((event: string) => {
|
|
80
|
+
blockNumbers[event].forEach((blockNumber: number) => {
|
|
81
|
+
it(`${event}:${blockNumber} - should return correct state`, async function () {
|
|
82
|
+
const dexHelper = new DummyDexHelper(network);
|
|
83
|
+
// await dexHelper.init();
|
|
84
|
+
|
|
85
|
+
const logger = dexHelper.getLogger(dexKey);
|
|
86
|
+
|
|
87
|
+
// readonly dexHelper: IDexHelper,
|
|
88
|
+
// parentName: string,
|
|
89
|
+
// readonly stateMultiContract: Contract,
|
|
90
|
+
// readonly decodeStateMultiCallResultWithRelativeBitmaps:
|
|
91
|
+
// | DecodeStateMultiCallFunc
|
|
92
|
+
// | undefined,
|
|
93
|
+
// readonly erc20Interface: Interface,
|
|
94
|
+
// protected readonly factoryAddress: Address,
|
|
95
|
+
// public feeCode: bigint,
|
|
96
|
+
// token0: Address,
|
|
97
|
+
// token1: Address,
|
|
98
|
+
// logger: Logger,
|
|
99
|
+
// mapKey: string = '',
|
|
100
|
+
// readonly poolInitCodeHash: string,
|
|
101
|
+
|
|
102
|
+
const baseswapV3Pool = new BaseswapV3EventPool(
|
|
103
|
+
dexHelper,
|
|
104
|
+
dexKey,
|
|
105
|
+
new dexHelper.web3Provider.eth.Contract(
|
|
106
|
+
StateMulticallABI as AbiItem[],
|
|
107
|
+
config.stateMulticall,
|
|
108
|
+
),
|
|
109
|
+
undefined,
|
|
110
|
+
new Interface(ERC20ABI),
|
|
111
|
+
config.factory,
|
|
112
|
+
poolFeeCode,
|
|
113
|
+
token0,
|
|
114
|
+
token1,
|
|
115
|
+
logger,
|
|
116
|
+
undefined,
|
|
117
|
+
config.initHash,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
// It is done in generateState. But here have to make it manually
|
|
121
|
+
baseswapV3Pool.poolAddress = poolAddress.toLowerCase();
|
|
122
|
+
baseswapV3Pool.addressesSubscribed[0] = poolAddress;
|
|
123
|
+
|
|
124
|
+
await testEventSubscriber(
|
|
125
|
+
baseswapV3Pool,
|
|
126
|
+
baseswapV3Pool.addressesSubscribed,
|
|
127
|
+
(_blockNumber: number) =>
|
|
128
|
+
fetchPoolStateFromContract(
|
|
129
|
+
baseswapV3Pool,
|
|
130
|
+
_blockNumber,
|
|
131
|
+
poolAddress,
|
|
132
|
+
),
|
|
133
|
+
blockNumber,
|
|
134
|
+
`${dexKey}_${poolAddress}`,
|
|
135
|
+
dexHelper.provider,
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
import { DeepReadonly } from 'ts-essentials';
|
|
3
|
+
import FactoryABI from '../../abi/uniswap-v3/UniswapV3Factory.abi.json';
|
|
4
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
5
|
+
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
6
|
+
import { Address, Log, Logger } from '../../types';
|
|
7
|
+
import { LogDescription } from 'ethers/lib/utils';
|
|
8
|
+
import { FactoryState } from './types';
|
|
9
|
+
|
|
10
|
+
export type OnPoolCreatedCallback = ({
|
|
11
|
+
token0,
|
|
12
|
+
token1,
|
|
13
|
+
fee,
|
|
14
|
+
}: {
|
|
15
|
+
token0: string;
|
|
16
|
+
token1: string;
|
|
17
|
+
fee: bigint;
|
|
18
|
+
}) => Promise<void>;
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* "Stateless" event subscriber in order to capture "PoolCreated" event on new pools created.
|
|
22
|
+
* State is present, but it's a placeholder to actually make the events reach handlers (if there's no previous state - `processBlockLogs` is not called)
|
|
23
|
+
*/
|
|
24
|
+
export class BaseswapV3Factory extends StatefulEventSubscriber<FactoryState> {
|
|
25
|
+
handlers: {
|
|
26
|
+
[event: string]: (event: any) => Promise<void>;
|
|
27
|
+
} = {};
|
|
28
|
+
|
|
29
|
+
logDecoder: (log: Log) => any;
|
|
30
|
+
|
|
31
|
+
public readonly factoryIface = new Interface(FactoryABI);
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
readonly dexHelper: IDexHelper,
|
|
35
|
+
parentName: string,
|
|
36
|
+
protected readonly factoryAddress: Address,
|
|
37
|
+
logger: Logger,
|
|
38
|
+
protected readonly onPoolCreated: OnPoolCreatedCallback,
|
|
39
|
+
mapKey: string = '',
|
|
40
|
+
) {
|
|
41
|
+
super(parentName, `${parentName} Factory`, dexHelper, logger, true, mapKey);
|
|
42
|
+
|
|
43
|
+
this.addressesSubscribed = [factoryAddress];
|
|
44
|
+
|
|
45
|
+
this.logDecoder = (log: Log) => this.factoryIface.parseLog(log);
|
|
46
|
+
|
|
47
|
+
this.handlers['PoolCreated'] = this.handleNewPool.bind(this);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
generateState(): FactoryState {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected async processLog(
|
|
55
|
+
_: DeepReadonly<FactoryState>,
|
|
56
|
+
log: Readonly<Log>,
|
|
57
|
+
): Promise<FactoryState> {
|
|
58
|
+
const event = this.logDecoder(log);
|
|
59
|
+
if (event.name in this.handlers) {
|
|
60
|
+
await this.handlers[event.name](event);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async handleNewPool(event: LogDescription) {
|
|
67
|
+
const token0 = event.args.token0.toLowerCase();
|
|
68
|
+
const token1 = event.args.token1.toLowerCase();
|
|
69
|
+
const fee = event.args.fee;
|
|
70
|
+
|
|
71
|
+
await this.onPoolCreated({ token0, token1, fee });
|
|
72
|
+
}
|
|
73
|
+
}
|