@paraswap/dex-lib 2.42.4-baseswap → 2.42.4-baseswap.3
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/index.js +0 -2
- package/build/dex/index.js.map +1 -1
- package/build/dex/uniswap-v3/config.js +14 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3.js +1 -0
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/package.json +1 -1
- package/src/dex/index.ts +0 -2
- package/src/dex/uniswap-v3/config.ts +14 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +24 -0
- package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +375 -0
- package/src/dex/uniswap-v3/uniswap-v3.ts +1 -0
- package/src/dex/baseswap-v3/baseswap-v3-e2e.test.ts +0 -129
- package/src/dex/baseswap-v3/baseswap-v3-events.test.ts +0 -141
- package/src/dex/baseswap-v3/baseswap-v3-factory.ts +0 -73
- package/src/dex/baseswap-v3/baseswap-v3-integration.test.ts +0 -472
- package/src/dex/baseswap-v3/baseswap-v3-pool.ts +0 -519
- package/src/dex/baseswap-v3/baseswap-v3.ts +0 -1243
- package/src/dex/baseswap-v3/config.ts +0 -53
- package/src/dex/baseswap-v3/constants.ts +0 -41
- package/src/dex/baseswap-v3/contract-math/BitMath.ts +0 -90
- package/src/dex/baseswap-v3/contract-math/FixedPoint128.ts +0 -3
- package/src/dex/baseswap-v3/contract-math/FixedPoint96.ts +0 -4
- package/src/dex/baseswap-v3/contract-math/FullMath.ts +0 -30
- package/src/dex/baseswap-v3/contract-math/LiquidityMath.ts +0 -17
- package/src/dex/baseswap-v3/contract-math/Oracle.ts +0 -226
- package/src/dex/baseswap-v3/contract-math/SqrtPriceMath.ts +0 -226
- package/src/dex/baseswap-v3/contract-math/SwapMath.ts +0 -139
- package/src/dex/baseswap-v3/contract-math/Tick.ts +0 -82
- package/src/dex/baseswap-v3/contract-math/TickBitMap.ts +0 -123
- package/src/dex/baseswap-v3/contract-math/TickMath.ts +0 -211
- package/src/dex/baseswap-v3/contract-math/UnsafeMath.ts +0 -5
- package/src/dex/baseswap-v3/contract-math/uniswap-v3-math.ts +0 -666
- package/src/dex/baseswap-v3/contract-math/utils.ts +0 -55
- package/src/dex/baseswap-v3/types.ts +0 -191
- package/src/dex/baseswap-v3/utils.ts +0 -83
|
@@ -11,6 +11,7 @@ import { checkPoolPrices, checkPoolsLiquidity } from '../../../tests/utils';
|
|
|
11
11
|
import { Tokens } from '../../../tests/constants-e2e';
|
|
12
12
|
import UniswapV3QuoterV2ABI from '../../abi/uniswap-v3/UniswapV3QuoterV2.abi.json';
|
|
13
13
|
import { Address } from '@paraswap/core';
|
|
14
|
+
import { BaseswapV3 } from '../baseswap-v3/baseswap-v3';
|
|
14
15
|
|
|
15
16
|
const network = Network.POLYGON;
|
|
16
17
|
const TokenASymbol = 'USDC';
|
|
@@ -1239,3 +1240,377 @@ describe('Retro', () => {
|
|
|
1239
1240
|
});
|
|
1240
1241
|
});
|
|
1241
1242
|
});
|
|
1243
|
+
|
|
1244
|
+
describe('BaseswapV3', function () {
|
|
1245
|
+
const dexKey = 'BaseswapV3';
|
|
1246
|
+
|
|
1247
|
+
describe('Base', function () {
|
|
1248
|
+
const network = Network.BASE;
|
|
1249
|
+
const dexHelper = new DummyDexHelper(network);
|
|
1250
|
+
|
|
1251
|
+
let blockNumber: number;
|
|
1252
|
+
let retro: UniswapV3;
|
|
1253
|
+
|
|
1254
|
+
const TokenASymbol = 'USDC';
|
|
1255
|
+
const TokenA = Tokens[network][TokenASymbol];
|
|
1256
|
+
|
|
1257
|
+
const TokenBSymbol = 'WETH';
|
|
1258
|
+
const TokenB = Tokens[network][TokenBSymbol];
|
|
1259
|
+
|
|
1260
|
+
const QuoterV2 = '0x4fDBD73aD4B1DDde594BF05497C15f76308eFfb9';
|
|
1261
|
+
|
|
1262
|
+
beforeEach(async () => {
|
|
1263
|
+
blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
|
|
1264
|
+
retro = new UniswapV3(network, dexKey, dexHelper);
|
|
1265
|
+
});
|
|
1266
|
+
|
|
1267
|
+
it('getPoolIdentifiers and getPricesVolume SELL', async function () {
|
|
1268
|
+
const pools = await retro.getPoolIdentifiers(
|
|
1269
|
+
TokenA,
|
|
1270
|
+
TokenB,
|
|
1271
|
+
SwapSide.SELL,
|
|
1272
|
+
blockNumber,
|
|
1273
|
+
);
|
|
1274
|
+
console.log(
|
|
1275
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1276
|
+
pools,
|
|
1277
|
+
);
|
|
1278
|
+
|
|
1279
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1280
|
+
|
|
1281
|
+
const poolPrices = await retro.getPricesVolume(
|
|
1282
|
+
TokenA,
|
|
1283
|
+
TokenB,
|
|
1284
|
+
amounts,
|
|
1285
|
+
SwapSide.SELL,
|
|
1286
|
+
blockNumber,
|
|
1287
|
+
pools,
|
|
1288
|
+
);
|
|
1289
|
+
console.log(
|
|
1290
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1291
|
+
poolPrices,
|
|
1292
|
+
);
|
|
1293
|
+
|
|
1294
|
+
expect(poolPrices).not.toBeNull();
|
|
1295
|
+
checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
|
|
1296
|
+
|
|
1297
|
+
let falseChecksCounter = 0;
|
|
1298
|
+
await Promise.all(
|
|
1299
|
+
poolPrices!.map(async price => {
|
|
1300
|
+
const fee = retro.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1301
|
+
const res = await checkOnChainPricing(
|
|
1302
|
+
dexHelper,
|
|
1303
|
+
retro,
|
|
1304
|
+
'quoteExactInputSingle',
|
|
1305
|
+
blockNumber,
|
|
1306
|
+
QuoterV2,
|
|
1307
|
+
price.prices,
|
|
1308
|
+
TokenA.address,
|
|
1309
|
+
TokenB.address,
|
|
1310
|
+
fee,
|
|
1311
|
+
amounts,
|
|
1312
|
+
);
|
|
1313
|
+
if (res === false) falseChecksCounter++;
|
|
1314
|
+
}),
|
|
1315
|
+
);
|
|
1316
|
+
|
|
1317
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1318
|
+
});
|
|
1319
|
+
|
|
1320
|
+
it('getPoolIdentifiers and getPricesVolume BUY', async function () {
|
|
1321
|
+
const pools = await retro.getPoolIdentifiers(
|
|
1322
|
+
TokenA,
|
|
1323
|
+
TokenB,
|
|
1324
|
+
SwapSide.BUY,
|
|
1325
|
+
blockNumber,
|
|
1326
|
+
);
|
|
1327
|
+
console.log(
|
|
1328
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1329
|
+
pools,
|
|
1330
|
+
);
|
|
1331
|
+
|
|
1332
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1333
|
+
|
|
1334
|
+
const poolPrices = await retro.getPricesVolume(
|
|
1335
|
+
TokenA,
|
|
1336
|
+
TokenB,
|
|
1337
|
+
amountsBuy,
|
|
1338
|
+
SwapSide.BUY,
|
|
1339
|
+
blockNumber,
|
|
1340
|
+
pools,
|
|
1341
|
+
);
|
|
1342
|
+
console.log(
|
|
1343
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1344
|
+
poolPrices,
|
|
1345
|
+
);
|
|
1346
|
+
|
|
1347
|
+
expect(poolPrices).not.toBeNull();
|
|
1348
|
+
checkPoolPrices(poolPrices!, amountsBuy, SwapSide.BUY, dexKey);
|
|
1349
|
+
|
|
1350
|
+
// Check if onchain pricing equals to calculated ones
|
|
1351
|
+
let falseChecksCounter = 0;
|
|
1352
|
+
await Promise.all(
|
|
1353
|
+
poolPrices!.map(async price => {
|
|
1354
|
+
const fee = retro.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1355
|
+
const res = await checkOnChainPricing(
|
|
1356
|
+
dexHelper,
|
|
1357
|
+
retro,
|
|
1358
|
+
'quoteExactOutputSingle',
|
|
1359
|
+
blockNumber,
|
|
1360
|
+
QuoterV2,
|
|
1361
|
+
price.prices,
|
|
1362
|
+
TokenA.address,
|
|
1363
|
+
TokenB.address,
|
|
1364
|
+
fee,
|
|
1365
|
+
amountsBuy,
|
|
1366
|
+
);
|
|
1367
|
+
if (res === false) falseChecksCounter++;
|
|
1368
|
+
}),
|
|
1369
|
+
);
|
|
1370
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1371
|
+
});
|
|
1372
|
+
|
|
1373
|
+
it('getPoolIdentifiers and getPricesVolume SELL stable pairs', async function () {
|
|
1374
|
+
const TokenASymbol = 'USDbC';
|
|
1375
|
+
const TokenA = Tokens[network][TokenASymbol];
|
|
1376
|
+
|
|
1377
|
+
const TokenBSymbol = 'USDC';
|
|
1378
|
+
const TokenB = Tokens[network][TokenBSymbol];
|
|
1379
|
+
|
|
1380
|
+
const amounts = [
|
|
1381
|
+
0n,
|
|
1382
|
+
6000000n,
|
|
1383
|
+
12000000n,
|
|
1384
|
+
18000000n,
|
|
1385
|
+
24000000n,
|
|
1386
|
+
30000000n,
|
|
1387
|
+
36000000n,
|
|
1388
|
+
42000000n,
|
|
1389
|
+
48000000n,
|
|
1390
|
+
54000000n,
|
|
1391
|
+
60000000n,
|
|
1392
|
+
66000000n,
|
|
1393
|
+
72000000n,
|
|
1394
|
+
78000000n,
|
|
1395
|
+
84000000n,
|
|
1396
|
+
90000000n,
|
|
1397
|
+
96000000n,
|
|
1398
|
+
102000000n,
|
|
1399
|
+
108000000n,
|
|
1400
|
+
114000000n,
|
|
1401
|
+
120000000n,
|
|
1402
|
+
126000000n,
|
|
1403
|
+
132000000n,
|
|
1404
|
+
138000000n,
|
|
1405
|
+
144000000n,
|
|
1406
|
+
150000000n,
|
|
1407
|
+
156000000n,
|
|
1408
|
+
162000000n,
|
|
1409
|
+
168000000n,
|
|
1410
|
+
174000000n,
|
|
1411
|
+
180000000n,
|
|
1412
|
+
186000000n,
|
|
1413
|
+
192000000n,
|
|
1414
|
+
198000000n,
|
|
1415
|
+
204000000n,
|
|
1416
|
+
210000000n,
|
|
1417
|
+
216000000n,
|
|
1418
|
+
222000000n,
|
|
1419
|
+
228000000n,
|
|
1420
|
+
234000000n,
|
|
1421
|
+
240000000n,
|
|
1422
|
+
246000000n,
|
|
1423
|
+
252000000n,
|
|
1424
|
+
258000000n,
|
|
1425
|
+
264000000n,
|
|
1426
|
+
270000000n,
|
|
1427
|
+
276000000n,
|
|
1428
|
+
282000000n,
|
|
1429
|
+
288000000n,
|
|
1430
|
+
294000000n,
|
|
1431
|
+
300000000n,
|
|
1432
|
+
];
|
|
1433
|
+
|
|
1434
|
+
const pools = await retro.getPoolIdentifiers(
|
|
1435
|
+
TokenA,
|
|
1436
|
+
TokenB,
|
|
1437
|
+
SwapSide.SELL,
|
|
1438
|
+
blockNumber,
|
|
1439
|
+
);
|
|
1440
|
+
console.log(
|
|
1441
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1442
|
+
pools,
|
|
1443
|
+
);
|
|
1444
|
+
|
|
1445
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1446
|
+
|
|
1447
|
+
const poolPrices = await retro.getPricesVolume(
|
|
1448
|
+
TokenA,
|
|
1449
|
+
TokenB,
|
|
1450
|
+
amounts,
|
|
1451
|
+
SwapSide.SELL,
|
|
1452
|
+
blockNumber,
|
|
1453
|
+
pools,
|
|
1454
|
+
);
|
|
1455
|
+
console.log(
|
|
1456
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1457
|
+
poolPrices,
|
|
1458
|
+
);
|
|
1459
|
+
|
|
1460
|
+
expect(poolPrices).not.toBeNull();
|
|
1461
|
+
checkPoolPrices(
|
|
1462
|
+
poolPrices!.filter(pp => pp.unit !== 0n),
|
|
1463
|
+
amounts,
|
|
1464
|
+
SwapSide.SELL,
|
|
1465
|
+
dexKey,
|
|
1466
|
+
);
|
|
1467
|
+
|
|
1468
|
+
// Check if onchain pricing equals to calculated ones
|
|
1469
|
+
let falseChecksCounter = 0;
|
|
1470
|
+
await Promise.all(
|
|
1471
|
+
poolPrices!.map(async price => {
|
|
1472
|
+
const fee = retro.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1473
|
+
const res = await checkOnChainPricing(
|
|
1474
|
+
dexHelper,
|
|
1475
|
+
retro,
|
|
1476
|
+
'quoteExactInputSingle',
|
|
1477
|
+
blockNumber,
|
|
1478
|
+
QuoterV2,
|
|
1479
|
+
price.prices,
|
|
1480
|
+
TokenA.address,
|
|
1481
|
+
TokenB.address,
|
|
1482
|
+
fee,
|
|
1483
|
+
amounts,
|
|
1484
|
+
);
|
|
1485
|
+
if (res === false) falseChecksCounter++;
|
|
1486
|
+
}),
|
|
1487
|
+
);
|
|
1488
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1489
|
+
});
|
|
1490
|
+
|
|
1491
|
+
it('getPoolIdentifiers and getPricesVolume BUY stable pairs', async function () {
|
|
1492
|
+
const TokenASymbol = 'DAI';
|
|
1493
|
+
const TokenA = Tokens[network][TokenASymbol];
|
|
1494
|
+
|
|
1495
|
+
const TokenBSymbol = 'USDC';
|
|
1496
|
+
const TokenB = Tokens[network][TokenBSymbol];
|
|
1497
|
+
|
|
1498
|
+
const amountsBuy = [
|
|
1499
|
+
0n,
|
|
1500
|
+
6000000n,
|
|
1501
|
+
12000000n,
|
|
1502
|
+
18000000n,
|
|
1503
|
+
24000000n,
|
|
1504
|
+
30000000n,
|
|
1505
|
+
36000000n,
|
|
1506
|
+
42000000n,
|
|
1507
|
+
48000000n,
|
|
1508
|
+
54000000n,
|
|
1509
|
+
60000000n,
|
|
1510
|
+
66000000n,
|
|
1511
|
+
72000000n,
|
|
1512
|
+
78000000n,
|
|
1513
|
+
84000000n,
|
|
1514
|
+
90000000n,
|
|
1515
|
+
96000000n,
|
|
1516
|
+
102000000n,
|
|
1517
|
+
108000000n,
|
|
1518
|
+
114000000n,
|
|
1519
|
+
120000000n,
|
|
1520
|
+
126000000n,
|
|
1521
|
+
132000000n,
|
|
1522
|
+
138000000n,
|
|
1523
|
+
144000000n,
|
|
1524
|
+
150000000n,
|
|
1525
|
+
156000000n,
|
|
1526
|
+
162000000n,
|
|
1527
|
+
168000000n,
|
|
1528
|
+
174000000n,
|
|
1529
|
+
180000000n,
|
|
1530
|
+
186000000n,
|
|
1531
|
+
192000000n,
|
|
1532
|
+
198000000n,
|
|
1533
|
+
204000000n,
|
|
1534
|
+
210000000n,
|
|
1535
|
+
216000000n,
|
|
1536
|
+
222000000n,
|
|
1537
|
+
228000000n,
|
|
1538
|
+
234000000n,
|
|
1539
|
+
240000000n,
|
|
1540
|
+
246000000n,
|
|
1541
|
+
252000000n,
|
|
1542
|
+
258000000n,
|
|
1543
|
+
264000000n,
|
|
1544
|
+
270000000n,
|
|
1545
|
+
276000000n,
|
|
1546
|
+
282000000n,
|
|
1547
|
+
288000000n,
|
|
1548
|
+
294000000n,
|
|
1549
|
+
300000000n,
|
|
1550
|
+
];
|
|
1551
|
+
|
|
1552
|
+
const pools = await retro.getPoolIdentifiers(
|
|
1553
|
+
TokenA,
|
|
1554
|
+
TokenB,
|
|
1555
|
+
SwapSide.BUY,
|
|
1556
|
+
blockNumber,
|
|
1557
|
+
);
|
|
1558
|
+
console.log(
|
|
1559
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1560
|
+
pools,
|
|
1561
|
+
);
|
|
1562
|
+
|
|
1563
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1564
|
+
|
|
1565
|
+
const poolPrices = await retro.getPricesVolume(
|
|
1566
|
+
TokenA,
|
|
1567
|
+
TokenB,
|
|
1568
|
+
amountsBuy,
|
|
1569
|
+
SwapSide.BUY,
|
|
1570
|
+
blockNumber,
|
|
1571
|
+
pools,
|
|
1572
|
+
);
|
|
1573
|
+
console.log(
|
|
1574
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1575
|
+
poolPrices,
|
|
1576
|
+
);
|
|
1577
|
+
|
|
1578
|
+
expect(poolPrices).not.toBeNull();
|
|
1579
|
+
checkPoolPrices(
|
|
1580
|
+
poolPrices!.filter(pp => pp.unit !== 0n),
|
|
1581
|
+
amountsBuy,
|
|
1582
|
+
SwapSide.BUY,
|
|
1583
|
+
dexKey,
|
|
1584
|
+
);
|
|
1585
|
+
|
|
1586
|
+
// Check if onchain pricing equals to calculated ones
|
|
1587
|
+
let falseChecksCounter = 0;
|
|
1588
|
+
await Promise.all(
|
|
1589
|
+
poolPrices!.map(async price => {
|
|
1590
|
+
const fee = retro.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1591
|
+
const res = await checkOnChainPricing(
|
|
1592
|
+
dexHelper,
|
|
1593
|
+
retro,
|
|
1594
|
+
'quoteExactOutputSingle',
|
|
1595
|
+
blockNumber,
|
|
1596
|
+
QuoterV2,
|
|
1597
|
+
price.prices,
|
|
1598
|
+
TokenA.address,
|
|
1599
|
+
TokenB.address,
|
|
1600
|
+
fee,
|
|
1601
|
+
amountsBuy,
|
|
1602
|
+
);
|
|
1603
|
+
if (res === false) falseChecksCounter++;
|
|
1604
|
+
}),
|
|
1605
|
+
);
|
|
1606
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1607
|
+
});
|
|
1608
|
+
|
|
1609
|
+
it('getTopPoolsForToken', async function () {
|
|
1610
|
+
const poolLiquidity = await retro.getTopPoolsForToken(TokenB.address, 10);
|
|
1611
|
+
console.log(`${TokenASymbol} Top Pools:`, poolLiquidity);
|
|
1612
|
+
|
|
1613
|
+
checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
|
|
1614
|
+
});
|
|
1615
|
+
});
|
|
1616
|
+
});
|
|
@@ -1,129 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,141 +0,0 @@
|
|
|
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
|
-
});
|