@paraswap/dex-lib 2.35.7-worker-pool.2 → 2.36.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/.idea/aws.xml +17 -0
- package/.idea/codeStyles/Project.xml +19 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/paraswap-dex-lib.iml +9 -0
- package/.idea/vcs.xml +6 -0
- package/build/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/build/abi/algebra/AlgebraPool.abi.json +727 -0
- package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
- package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
- package/build/abi/sushiswap-v3/QuoterV2.json +267 -0
- package/build/abi/sushiswap-v3/RouterProcessor3.json +289 -0
- package/build/abi/wBETH.json +1527 -0
- package/build/config.js +2 -2
- package/build/dex/algebra/algebra-pool.d.ts +46 -0
- package/build/dex/algebra/algebra-pool.js +336 -0
- package/build/dex/algebra/algebra-pool.js.map +1 -0
- package/build/dex/algebra/algebra.d.ts +2 -4
- package/build/dex/algebra/algebra.js +3 -4
- package/build/dex/algebra/algebra.js.map +1 -1
- package/build/dex/balancer-v2/config.js +9 -1
- package/build/dex/balancer-v2/config.js.map +1 -1
- package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
- package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
- package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
- package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
- package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
- package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/maverick-v1/config.js +9 -0
- package/build/dex/maverick-v1/config.js.map +1 -1
- package/build/dex/maverick-v1/maverick-v1.js +11 -2
- package/build/dex/maverick-v1/maverick-v1.js.map +1 -1
- package/build/dex/pancakeswap-v3/config.js +17 -0
- package/build/dex/pancakeswap-v3/config.js.map +1 -1
- package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +2 -3
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js +3 -3
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
- package/build/dex/pancakeswap-v3/types.d.ts +14 -0
- package/build/dex/{test-dex → pancakeswap-v3}/types.js.map +1 -1
- package/build/dex/{test-dex → ramses-v2}/config.d.ts +1 -1
- package/build/dex/ramses-v2/config.js +28 -0
- package/build/dex/ramses-v2/config.js.map +1 -0
- package/build/dex/ramses-v2/constants.d.ts +28 -0
- package/build/dex/ramses-v2/constants.js +35 -0
- package/build/dex/ramses-v2/constants.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
- package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
- package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/utils.js +16 -0
- package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
- package/build/dex/ramses-v2/ramses-v2.js +690 -0
- package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
- package/build/dex/ramses-v2/types.d.ts +154 -0
- package/build/dex/ramses-v2/types.js +9 -0
- package/build/dex/ramses-v2/types.js.map +1 -0
- package/build/dex/ramses-v2/utils.d.ts +6 -0
- package/build/dex/ramses-v2/utils.js +71 -0
- package/build/dex/ramses-v2/utils.js.map +1 -0
- package/build/dex/solidly/config.js +22 -1
- package/build/dex/solidly/config.js.map +1 -1
- package/build/dex/solidly/forks-override/aerodrome.d.ts +14 -0
- package/build/dex/solidly/forks-override/aerodrome.js +48 -0
- package/build/dex/solidly/forks-override/aerodrome.js.map +1 -0
- package/build/dex/solidly/solidly.js +1 -0
- package/build/dex/solidly/solidly.js.map +1 -1
- package/build/dex/sushiswap-v3/config.d.ts +4 -0
- package/build/dex/sushiswap-v3/config.js +132 -0
- package/build/dex/sushiswap-v3/config.js.map +1 -0
- package/build/dex/sushiswap-v3/constants.d.ts +4 -0
- package/build/dex/sushiswap-v3/constants.js +32 -0
- package/build/dex/sushiswap-v3/constants.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.d.ts +56 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.js +598 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.d.ts +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.js +6 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.d.ts +21 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.js +58 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.js.map +1 -0
- package/build/dex/sushiswap-v3/token.d.ts +6 -0
- package/build/dex/sushiswap-v3/token.js +23 -0
- package/build/dex/sushiswap-v3/token.js.map +1 -0
- package/build/dex/sushiswap-v3/types.d.ts +15 -0
- package/build/dex/sushiswap-v3/types.js +18 -0
- package/build/dex/sushiswap-v3/types.js.map +1 -0
- package/build/dex/uniswap-v3/config.js +12 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3.d.ts +2 -3
- package/build/dex/uniswap-v3/uniswap-v3.js +3 -3
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/build/dex/woo-fi-v2/config.js +13 -0
- package/build/dex/woo-fi-v2/config.js.map +1 -1
- package/build/dex-helper/dummy-dex-helper.d.ts +0 -1
- package/build/dex-helper/dummy-dex-helper.js +0 -3
- package/build/dex-helper/dummy-dex-helper.js.map +1 -1
- package/build/dex-helper/idex-helper.d.ts +0 -1
- package/package.json +1 -1
- package/src/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/src/config.ts +2 -2
- package/src/dex/algebra/algebra.ts +15 -15
- package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +122 -1
- package/src/dex/balancer-v2/config.ts +10 -1
- package/src/dex/index.ts +2 -0
- package/src/dex/maverick-v1/config.ts +10 -0
- package/src/dex/maverick-v1/maverick-v1-e2e.test.ts +121 -1
- package/src/dex/maverick-v1/maverick-v1.ts +12 -2
- package/src/dex/pancakeswap-v3/config.ts +19 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3-e2e.test.ts +120 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +16 -14
- package/src/dex/solidly/config.ts +24 -1
- package/src/dex/solidly/forks-override/aerodrome.ts +57 -0
- package/src/dex/solidly/solidly-e2e.test.ts +88 -0
- package/src/dex/solidly/solidly-integration.test.ts +66 -0
- package/src/dex/solidly/solidly.ts +1 -0
- package/src/dex/uniswap-v3/config.ts +13 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +25 -4
- package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +142 -0
- package/src/dex/uniswap-v3/uniswap-v3.ts +15 -14
- package/src/dex/woo-fi-v2/config.ts +13 -0
- package/src/dex/woo-fi-v2/woo-fi-v2-e2e.test.ts +64 -0
- package/src/dex-helper/dummy-dex-helper.ts +0 -15
- package/src/dex-helper/idex-helper.ts +0 -7
- package/tests/constants-e2e.ts +30 -0
- package/tests/utils-e2e.ts +1 -0
- package/build/abi/quickPerps/fast-price-events.json +0 -70
- package/build/abi/quickPerps/fast-price-feed.json +0 -748
- package/build/abi/quickPerps/reader.json +0 -313
- package/build/abi/quickPerps/vault-price-feed.json +0 -477
- package/build/abi/quickPerps/vault.json +0 -1953
- package/build/dex/test-dex/config.js +0 -15
- package/build/dex/test-dex/config.js.map +0 -1
- package/build/dex/test-dex/test-dex-pool.d.ts +0 -39
- package/build/dex/test-dex/test-dex-pool.js +0 -63
- package/build/dex/test-dex/test-dex-pool.js.map +0 -1
- package/build/dex/test-dex/test-dex.d.ts +0 -37
- package/build/dex/test-dex/test-dex.js +0 -126
- package/build/dex/test-dex/test-dex.js.map +0 -1
- package/build/dex/test-dex/types.d.ts +0 -6
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +0 -16
- package/build/dex/woo-fi-v2/woo-fi-math.js +0 -137
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +0 -1
- package/build/workers.d.ts +0 -0
- package/build/workers.js +0 -2
- package/build/workers.js.map +0 -1
- /package/build/dex/{test-dex → pancakeswap-v3}/types.js +0 -0
|
@@ -1404,4 +1404,92 @@ describe('Solidly E2E', () => {
|
|
|
1404
1404
|
);
|
|
1405
1405
|
});
|
|
1406
1406
|
});
|
|
1407
|
+
|
|
1408
|
+
describe('Base', () => {
|
|
1409
|
+
const network = Network.BASE;
|
|
1410
|
+
|
|
1411
|
+
describe('Aerodrome', () => {
|
|
1412
|
+
const dexKey = 'Aerodrome';
|
|
1413
|
+
const tokenASymbol: string = 'USDbC';
|
|
1414
|
+
const tokenBSymbol: string = 'DAI';
|
|
1415
|
+
|
|
1416
|
+
const tokenAAmount: string = '1111100000';
|
|
1417
|
+
const tokenBAmount: string = '100000000000000000';
|
|
1418
|
+
const nativeTokenAmount = '100000000000000000';
|
|
1419
|
+
|
|
1420
|
+
testForNetwork(
|
|
1421
|
+
network,
|
|
1422
|
+
dexKey,
|
|
1423
|
+
tokenASymbol,
|
|
1424
|
+
tokenBSymbol,
|
|
1425
|
+
tokenAAmount,
|
|
1426
|
+
tokenBAmount,
|
|
1427
|
+
nativeTokenAmount,
|
|
1428
|
+
);
|
|
1429
|
+
});
|
|
1430
|
+
|
|
1431
|
+
describe('Equalizer', () => {
|
|
1432
|
+
const dexKey = 'Equalizer';
|
|
1433
|
+
const network = Network.BASE;
|
|
1434
|
+
|
|
1435
|
+
const tokenASymbol: string = 'USDbC';
|
|
1436
|
+
const tokenAAmount: string = '1111100000';
|
|
1437
|
+
const nativeTokenAmount = '110000000000000000';
|
|
1438
|
+
|
|
1439
|
+
const provider = new StaticJsonRpcProvider(
|
|
1440
|
+
generateConfig(network).privateHttpProvider,
|
|
1441
|
+
network,
|
|
1442
|
+
);
|
|
1443
|
+
const tokens = Tokens[network];
|
|
1444
|
+
const holders = Holders[network];
|
|
1445
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
1446
|
+
|
|
1447
|
+
// TODO: Add any direct swap contractMethod name if it exists
|
|
1448
|
+
const sideToContractMethods = new Map([
|
|
1449
|
+
[
|
|
1450
|
+
SwapSide.SELL,
|
|
1451
|
+
[
|
|
1452
|
+
ContractMethod.simpleSwap,
|
|
1453
|
+
ContractMethod.multiSwap,
|
|
1454
|
+
ContractMethod.megaSwap,
|
|
1455
|
+
],
|
|
1456
|
+
],
|
|
1457
|
+
]);
|
|
1458
|
+
|
|
1459
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
1460
|
+
describe(`${side}`, () => {
|
|
1461
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
1462
|
+
describe(`${contractMethod}`, () => {
|
|
1463
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
1464
|
+
await testE2E(
|
|
1465
|
+
tokens[nativeTokenSymbol],
|
|
1466
|
+
tokens[tokenASymbol],
|
|
1467
|
+
holders[nativeTokenSymbol],
|
|
1468
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
1469
|
+
side,
|
|
1470
|
+
dexKey,
|
|
1471
|
+
contractMethod,
|
|
1472
|
+
network,
|
|
1473
|
+
provider,
|
|
1474
|
+
);
|
|
1475
|
+
});
|
|
1476
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
1477
|
+
await testE2E(
|
|
1478
|
+
tokens[tokenASymbol],
|
|
1479
|
+
tokens[nativeTokenSymbol],
|
|
1480
|
+
holders[tokenASymbol],
|
|
1481
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
1482
|
+
side,
|
|
1483
|
+
dexKey,
|
|
1484
|
+
contractMethod,
|
|
1485
|
+
network,
|
|
1486
|
+
provider,
|
|
1487
|
+
);
|
|
1488
|
+
});
|
|
1489
|
+
});
|
|
1490
|
+
});
|
|
1491
|
+
}),
|
|
1492
|
+
);
|
|
1493
|
+
});
|
|
1494
|
+
});
|
|
1407
1495
|
});
|
|
@@ -1202,4 +1202,70 @@ describe('Solidly integration tests', () => {
|
|
|
1202
1202
|
});
|
|
1203
1203
|
});
|
|
1204
1204
|
});
|
|
1205
|
+
|
|
1206
|
+
describe('Base', () => {
|
|
1207
|
+
const network = Network.BASE;
|
|
1208
|
+
const dexHelper = new DummyDexHelper(network);
|
|
1209
|
+
const checkOnChainPricing = constructCheckOnChainPricing(dexHelper);
|
|
1210
|
+
|
|
1211
|
+
describe('Equalizer', () => {
|
|
1212
|
+
const dexKey = 'Equalizer';
|
|
1213
|
+
const equalizer = new Equalizer(network, dexKey, dexHelper);
|
|
1214
|
+
|
|
1215
|
+
describe('UniswapV2 like pool', function () {
|
|
1216
|
+
const TokenASymbol = 'USDbC';
|
|
1217
|
+
const tokenA = Tokens[network][TokenASymbol];
|
|
1218
|
+
const TokenBSymbol = 'ETH';
|
|
1219
|
+
const tokenB = Tokens[network][TokenBSymbol];
|
|
1220
|
+
|
|
1221
|
+
const amounts = amounts18;
|
|
1222
|
+
|
|
1223
|
+
it('getPoolIdentifiers and getPricesVolume', async function () {
|
|
1224
|
+
const blocknumber = await dexHelper.web3Provider.eth.getBlockNumber();
|
|
1225
|
+
const pools = await equalizer.getPoolIdentifiers(
|
|
1226
|
+
tokenA,
|
|
1227
|
+
tokenB,
|
|
1228
|
+
SwapSide.SELL,
|
|
1229
|
+
blocknumber,
|
|
1230
|
+
);
|
|
1231
|
+
console.log(
|
|
1232
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1233
|
+
pools,
|
|
1234
|
+
);
|
|
1235
|
+
|
|
1236
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1237
|
+
|
|
1238
|
+
const poolPrices = await equalizer.getPricesVolume(
|
|
1239
|
+
tokenA,
|
|
1240
|
+
tokenB,
|
|
1241
|
+
amounts,
|
|
1242
|
+
SwapSide.SELL,
|
|
1243
|
+
blocknumber,
|
|
1244
|
+
pools,
|
|
1245
|
+
);
|
|
1246
|
+
console.log(
|
|
1247
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1248
|
+
poolPrices,
|
|
1249
|
+
);
|
|
1250
|
+
|
|
1251
|
+
expect(poolPrices).not.toBeNull();
|
|
1252
|
+
checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
|
|
1253
|
+
|
|
1254
|
+
// Check if onchain pricing equals to calculated ones
|
|
1255
|
+
|
|
1256
|
+
for (const poolPrice of poolPrices || []) {
|
|
1257
|
+
await checkOnChainPricing(
|
|
1258
|
+
equalizer,
|
|
1259
|
+
'getAmountOut',
|
|
1260
|
+
blocknumber,
|
|
1261
|
+
poolPrice.prices,
|
|
1262
|
+
poolPrice.poolAddresses![0],
|
|
1263
|
+
tokenA.address,
|
|
1264
|
+
amounts,
|
|
1265
|
+
);
|
|
1266
|
+
}
|
|
1267
|
+
});
|
|
1268
|
+
});
|
|
1269
|
+
});
|
|
1270
|
+
});
|
|
1205
1271
|
});
|
|
@@ -210,6 +210,19 @@ export const UniswapV3Config: DexConfigMap<DexParams> = {
|
|
|
210
210
|
subgraphURL:
|
|
211
211
|
'https://api.thegraph.com/subgraphs/name/sushi-v3/v3-optimism',
|
|
212
212
|
},
|
|
213
|
+
[Network.BASE]: {
|
|
214
|
+
factory: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',
|
|
215
|
+
quoter: '0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
|
|
216
|
+
router: '0xCc0e85901f33D375FcdD9a888B05Df9616F68277',
|
|
217
|
+
supportedFees: SUPPORTED_FEES,
|
|
218
|
+
stateMulticall: '0x7160f736c52e1e78e92FD4eE4D73e21A7Cf4F950',
|
|
219
|
+
uniswapMulticall: '0x091e99cb1C49331a94dD62755D168E941AbD0693',
|
|
220
|
+
chunksCount: 10,
|
|
221
|
+
initRetryFrequency: 10,
|
|
222
|
+
initHash: `0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54`,
|
|
223
|
+
subgraphURL:
|
|
224
|
+
'https://api.studio.thegraph.com/query/32073/v3-base/v0.0.1',
|
|
225
|
+
},
|
|
213
226
|
},
|
|
214
227
|
ChronosV3: {
|
|
215
228
|
[Network.ARBITRUM]: {
|
|
@@ -424,16 +424,16 @@ describe('UniswapV3 E2E', () => {
|
|
|
424
424
|
[
|
|
425
425
|
SwapSide.SELL,
|
|
426
426
|
[
|
|
427
|
-
|
|
427
|
+
ContractMethod.simpleSwap,
|
|
428
428
|
ContractMethod.multiSwap,
|
|
429
|
-
|
|
429
|
+
ContractMethod.megaSwap,
|
|
430
430
|
],
|
|
431
431
|
],
|
|
432
432
|
[
|
|
433
433
|
SwapSide.BUY,
|
|
434
434
|
[
|
|
435
|
-
|
|
436
|
-
|
|
435
|
+
ContractMethod.simpleBuy,
|
|
436
|
+
ContractMethod.buy
|
|
437
437
|
],
|
|
438
438
|
],
|
|
439
439
|
]);
|
|
@@ -1094,5 +1094,26 @@ describe('UniswapV3 E2E', () => {
|
|
|
1094
1094
|
nativeTokenAmount,
|
|
1095
1095
|
);
|
|
1096
1096
|
});
|
|
1097
|
+
|
|
1098
|
+
describe('BASE', () => {
|
|
1099
|
+
const network = Network.BASE;
|
|
1100
|
+
|
|
1101
|
+
const tokenASymbol: string = 'USDbC';
|
|
1102
|
+
const tokenBSymbol: string = 'DAI';
|
|
1103
|
+
|
|
1104
|
+
const tokenAAmount: string = '111110000';
|
|
1105
|
+
const tokenBAmount: string = '110000000000000000';
|
|
1106
|
+
const nativeTokenAmount = '1100000000000000000';
|
|
1107
|
+
|
|
1108
|
+
testForNetwork(
|
|
1109
|
+
network,
|
|
1110
|
+
dexKey,
|
|
1111
|
+
tokenASymbol,
|
|
1112
|
+
tokenBSymbol,
|
|
1113
|
+
tokenAAmount,
|
|
1114
|
+
tokenBAmount,
|
|
1115
|
+
nativeTokenAmount,
|
|
1116
|
+
);
|
|
1117
|
+
});
|
|
1097
1118
|
});
|
|
1098
1119
|
});
|
|
@@ -959,4 +959,146 @@ describe('SushiSwapV3', () => {
|
|
|
959
959
|
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
960
960
|
});
|
|
961
961
|
});
|
|
962
|
+
|
|
963
|
+
describe('Base', () => {
|
|
964
|
+
let blockNumber: number;
|
|
965
|
+
let sushiSwapV3: UniswapV3;
|
|
966
|
+
let sushiSwapV3Mainnet: UniswapV3;
|
|
967
|
+
|
|
968
|
+
const network = Network.BASE;
|
|
969
|
+
const dexHelper = new DummyDexHelper(network);
|
|
970
|
+
const TokenASymbol = 'USDbC';
|
|
971
|
+
const TokenA = Tokens[network][TokenASymbol];
|
|
972
|
+
|
|
973
|
+
const TokenBSymbol = 'DAI';
|
|
974
|
+
const TokenB = Tokens[network][TokenBSymbol];
|
|
975
|
+
|
|
976
|
+
beforeEach(async () => {
|
|
977
|
+
blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
|
|
978
|
+
sushiSwapV3 = new UniswapV3(network, dexKey, dexHelper);
|
|
979
|
+
sushiSwapV3Mainnet = new UniswapV3(Network.MAINNET, dexKey, dexHelper);
|
|
980
|
+
});
|
|
981
|
+
|
|
982
|
+
it('getPoolIdentifiers and getPricesVolume SELL', async function () {
|
|
983
|
+
const amounts = [0n, BI_POWS[6], 2000000n];
|
|
984
|
+
|
|
985
|
+
const pools = await sushiSwapV3.getPoolIdentifiers(
|
|
986
|
+
TokenA,
|
|
987
|
+
TokenB,
|
|
988
|
+
SwapSide.SELL,
|
|
989
|
+
blockNumber,
|
|
990
|
+
);
|
|
991
|
+
console.log(
|
|
992
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
993
|
+
pools,
|
|
994
|
+
);
|
|
995
|
+
|
|
996
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
997
|
+
|
|
998
|
+
const poolPrices = await sushiSwapV3.getPricesVolume(
|
|
999
|
+
TokenA,
|
|
1000
|
+
TokenB,
|
|
1001
|
+
amounts,
|
|
1002
|
+
SwapSide.SELL,
|
|
1003
|
+
blockNumber,
|
|
1004
|
+
pools,
|
|
1005
|
+
);
|
|
1006
|
+
console.log(
|
|
1007
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1008
|
+
poolPrices,
|
|
1009
|
+
);
|
|
1010
|
+
|
|
1011
|
+
expect(poolPrices).not.toBeNull();
|
|
1012
|
+
checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
|
|
1013
|
+
|
|
1014
|
+
let falseChecksCounter = 0;
|
|
1015
|
+
await Promise.all(
|
|
1016
|
+
poolPrices!.map(async price => {
|
|
1017
|
+
const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1018
|
+
const res = await checkOnChainPricing(
|
|
1019
|
+
dexHelper,
|
|
1020
|
+
sushiSwapV3,
|
|
1021
|
+
'quoteExactInputSingle',
|
|
1022
|
+
blockNumber,
|
|
1023
|
+
'0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
|
|
1024
|
+
price.prices,
|
|
1025
|
+
TokenA.address,
|
|
1026
|
+
TokenB.address,
|
|
1027
|
+
fee,
|
|
1028
|
+
amounts,
|
|
1029
|
+
);
|
|
1030
|
+
if (res === false) falseChecksCounter++;
|
|
1031
|
+
}),
|
|
1032
|
+
);
|
|
1033
|
+
|
|
1034
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1035
|
+
});
|
|
1036
|
+
|
|
1037
|
+
it('getPoolIdentifiers and getPricesVolume BUY', async function () {
|
|
1038
|
+
const amounts = [0n, BI_POWS[6], 2000000n];
|
|
1039
|
+
|
|
1040
|
+
const pools = await sushiSwapV3.getPoolIdentifiers(
|
|
1041
|
+
TokenA,
|
|
1042
|
+
TokenB,
|
|
1043
|
+
SwapSide.BUY,
|
|
1044
|
+
blockNumber,
|
|
1045
|
+
);
|
|
1046
|
+
console.log(
|
|
1047
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
|
|
1048
|
+
pools,
|
|
1049
|
+
);
|
|
1050
|
+
|
|
1051
|
+
expect(pools.length).toBeGreaterThan(0);
|
|
1052
|
+
|
|
1053
|
+
const poolPrices = await sushiSwapV3.getPricesVolume(
|
|
1054
|
+
TokenA,
|
|
1055
|
+
TokenB,
|
|
1056
|
+
amounts,
|
|
1057
|
+
SwapSide.BUY,
|
|
1058
|
+
blockNumber,
|
|
1059
|
+
pools,
|
|
1060
|
+
);
|
|
1061
|
+
console.log(
|
|
1062
|
+
`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
|
|
1063
|
+
poolPrices,
|
|
1064
|
+
);
|
|
1065
|
+
|
|
1066
|
+
expect(poolPrices).not.toBeNull();
|
|
1067
|
+
checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
|
|
1068
|
+
|
|
1069
|
+
let falseChecksCounter = 0;
|
|
1070
|
+
await Promise.all(
|
|
1071
|
+
poolPrices!.map(async price => {
|
|
1072
|
+
const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
|
|
1073
|
+
const res = await checkOnChainPricing(
|
|
1074
|
+
dexHelper,
|
|
1075
|
+
sushiSwapV3,
|
|
1076
|
+
'quoteExactOutputSingle',
|
|
1077
|
+
blockNumber,
|
|
1078
|
+
'0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
|
|
1079
|
+
price.prices,
|
|
1080
|
+
TokenA.address,
|
|
1081
|
+
TokenB.address,
|
|
1082
|
+
fee,
|
|
1083
|
+
amounts,
|
|
1084
|
+
);
|
|
1085
|
+
if (res === false) falseChecksCounter++;
|
|
1086
|
+
}),
|
|
1087
|
+
);
|
|
1088
|
+
|
|
1089
|
+
expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
|
|
1090
|
+
});
|
|
1091
|
+
|
|
1092
|
+
it('getTopPoolsForToken', async function () {
|
|
1093
|
+
const poolLiquidity = await sushiSwapV3.getTopPoolsForToken(
|
|
1094
|
+
TokenB.address,
|
|
1095
|
+
10,
|
|
1096
|
+
);
|
|
1097
|
+
console.log(`${TokenASymbol} Top Pools:`, poolLiquidity);
|
|
1098
|
+
|
|
1099
|
+
checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
|
|
1100
|
+
});
|
|
1101
|
+
});
|
|
1102
|
+
|
|
962
1103
|
});
|
|
1104
|
+
|
|
@@ -641,19 +641,20 @@ export class UniswapV3
|
|
|
641
641
|
const balanceDestToken =
|
|
642
642
|
_destAddress === pool.token0 ? state.balance0 : state.balance1;
|
|
643
643
|
|
|
644
|
-
const unitResult =
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
const pricesResult =
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
644
|
+
const unitResult = this._getOutputs(
|
|
645
|
+
state,
|
|
646
|
+
[unitAmount],
|
|
647
|
+
zeroForOne,
|
|
648
|
+
side,
|
|
649
|
+
balanceDestToken,
|
|
650
|
+
);
|
|
651
|
+
const pricesResult = this._getOutputs(
|
|
652
|
+
state,
|
|
653
|
+
_amounts,
|
|
654
|
+
zeroForOne,
|
|
655
|
+
side,
|
|
656
|
+
balanceDestToken,
|
|
657
|
+
);
|
|
657
658
|
|
|
658
659
|
if (!unitResult || !pricesResult) {
|
|
659
660
|
this.logger.debug('Prices or unit is not calculated');
|
|
@@ -1070,7 +1071,7 @@ export class UniswapV3
|
|
|
1070
1071
|
return newConfig;
|
|
1071
1072
|
}
|
|
1072
1073
|
|
|
1073
|
-
|
|
1074
|
+
private _getOutputs(
|
|
1074
1075
|
state: DeepReadonly<PoolState>,
|
|
1075
1076
|
amounts: bigint[],
|
|
1076
1077
|
zeroForOne: boolean,
|
|
@@ -64,6 +64,16 @@ export const WooFiV2Config: DexConfigMap<DexParams> = {
|
|
|
64
64
|
decimals: 6,
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
|
+
[Network.BASE]: {
|
|
68
|
+
wooPPV2Address: '0xb130a49065178465931d4f887056328CeA5D723f',
|
|
69
|
+
wooOracleV2Address: '0x2Fe5E5D341cFFa606a5d9DA1B6B646a381B0f7ec',
|
|
70
|
+
integrationHelperAddress: '0xC4E9B633685461E7B7A807D12a246C81f96F31B8',
|
|
71
|
+
// USDbC
|
|
72
|
+
quoteToken: {
|
|
73
|
+
address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',
|
|
74
|
+
decimals: 6,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
67
77
|
},
|
|
68
78
|
};
|
|
69
79
|
|
|
@@ -84,4 +94,7 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
84
94
|
[Network.AVALANCHE]: {
|
|
85
95
|
[SwapSide.SELL]: [{ name: 'AvalancheAdapter01', index: 12 }],
|
|
86
96
|
},
|
|
97
|
+
[Network.BASE]: {
|
|
98
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 5 }],
|
|
99
|
+
},
|
|
87
100
|
};
|
|
@@ -213,4 +213,68 @@ describe('WooFiV2 E2E', () => {
|
|
|
213
213
|
tokenQuoteAmount,
|
|
214
214
|
);
|
|
215
215
|
});
|
|
216
|
+
|
|
217
|
+
describe('Base', () => {
|
|
218
|
+
const network = Network.BASE;
|
|
219
|
+
|
|
220
|
+
const baseATokenSymbol = 'USDbC';
|
|
221
|
+
const baseBTokenSymbol = 'ETH';
|
|
222
|
+
|
|
223
|
+
const tokenBaseAAmount = '100000000';
|
|
224
|
+
const tokenBaseBAmount = '1000000000000000000';
|
|
225
|
+
|
|
226
|
+
const tokens = Tokens[network];
|
|
227
|
+
const holders = Holders[network];
|
|
228
|
+
|
|
229
|
+
const provider = new StaticJsonRpcProvider(
|
|
230
|
+
generateConfig(network).privateHttpProvider,
|
|
231
|
+
network,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const sideToContractMethods = new Map([
|
|
235
|
+
[
|
|
236
|
+
SwapSide.SELL,
|
|
237
|
+
[
|
|
238
|
+
ContractMethod.simpleSwap,
|
|
239
|
+
ContractMethod.multiSwap,
|
|
240
|
+
ContractMethod.megaSwap,
|
|
241
|
+
],
|
|
242
|
+
],
|
|
243
|
+
]);
|
|
244
|
+
|
|
245
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
246
|
+
describe(`${side}`, () => {
|
|
247
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
248
|
+
describe(`${contractMethod}`, () => {
|
|
249
|
+
it(`${baseATokenSymbol} -> ${baseBTokenSymbol}`, async () => {
|
|
250
|
+
await testE2E(
|
|
251
|
+
tokens[baseATokenSymbol],
|
|
252
|
+
tokens[baseBTokenSymbol],
|
|
253
|
+
holders[baseATokenSymbol],
|
|
254
|
+
tokenBaseAAmount,
|
|
255
|
+
side,
|
|
256
|
+
dexKey,
|
|
257
|
+
contractMethod,
|
|
258
|
+
network,
|
|
259
|
+
provider,
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
it(`${baseBTokenSymbol} -> ${baseATokenSymbol}`, async () => {
|
|
263
|
+
await testE2E(
|
|
264
|
+
tokens[baseBTokenSymbol],
|
|
265
|
+
tokens[baseATokenSymbol],
|
|
266
|
+
holders[baseBTokenSymbol],
|
|
267
|
+
tokenBaseBAmount,
|
|
268
|
+
side,
|
|
269
|
+
dexKey,
|
|
270
|
+
contractMethod,
|
|
271
|
+
network,
|
|
272
|
+
provider,
|
|
273
|
+
);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}),
|
|
278
|
+
);
|
|
279
|
+
});
|
|
216
280
|
});
|
|
@@ -246,12 +246,6 @@ export class DummyDexHelper implements IDexHelper {
|
|
|
246
246
|
getLogger: LoggerConstructor;
|
|
247
247
|
web3Provider: Web3;
|
|
248
248
|
getTokenUSDPrice: (token: Token, amount: bigint) => Promise<number>;
|
|
249
|
-
executeOnWorkerPool: (
|
|
250
|
-
network: number,
|
|
251
|
-
dexKeys: string,
|
|
252
|
-
methodSelector: string,
|
|
253
|
-
payload: any[],
|
|
254
|
-
) => Promise<any>;
|
|
255
249
|
|
|
256
250
|
constructor(network: number, rpcUrl?: string) {
|
|
257
251
|
this.config = new ConfigHelper(false, generateConfig(network), 'is');
|
|
@@ -287,15 +281,6 @@ export class DummyDexHelper implements IDexHelper {
|
|
|
287
281
|
5,
|
|
288
282
|
this.getLogger(`PromiseScheduler-${network}`),
|
|
289
283
|
);
|
|
290
|
-
|
|
291
|
-
this.executeOnWorkerPool = async (
|
|
292
|
-
network: number,
|
|
293
|
-
dexKey: string,
|
|
294
|
-
methodSelector: string,
|
|
295
|
-
payload: any[],
|
|
296
|
-
) => {
|
|
297
|
-
return null;
|
|
298
|
-
};
|
|
299
284
|
}
|
|
300
285
|
|
|
301
286
|
replaceProviderWithRPC(rpcUrl: string) {
|
|
@@ -21,12 +21,5 @@ export interface IDexHelper {
|
|
|
21
21
|
web3Provider: Web3;
|
|
22
22
|
blockManager: IBlockManager;
|
|
23
23
|
getLogger: LoggerConstructor;
|
|
24
|
-
executeOnWorkerPool: (
|
|
25
|
-
network: number,
|
|
26
|
-
dexKey: string,
|
|
27
|
-
methodSelector: string,
|
|
28
|
-
// For POC it is ok to have any
|
|
29
|
-
payload: any[],
|
|
30
|
-
) => Promise<any>;
|
|
31
24
|
getTokenUSDPrice: (token: Token, amount: bigint) => Promise<number>;
|
|
32
25
|
}
|
package/tests/constants-e2e.ts
CHANGED
|
@@ -892,6 +892,30 @@ export const Tokens: {
|
|
|
892
892
|
address: '0x4200000000000000000000000000000000000006',
|
|
893
893
|
decimals: 18,
|
|
894
894
|
},
|
|
895
|
+
MAV: {
|
|
896
|
+
address: '0x64b88c73A5DfA78D1713fE1b4c69a22d7E0faAa7',
|
|
897
|
+
decimals: 18,
|
|
898
|
+
},
|
|
899
|
+
USDC: {
|
|
900
|
+
address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
901
|
+
decimals: 6,
|
|
902
|
+
},
|
|
903
|
+
USDbC: {
|
|
904
|
+
address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',
|
|
905
|
+
decimals: 6,
|
|
906
|
+
},
|
|
907
|
+
DAI: {
|
|
908
|
+
address: '0x50c5725949a6f0c72e6c4a641f24049a917db0cb',
|
|
909
|
+
decimals: 18,
|
|
910
|
+
},
|
|
911
|
+
BAL: {
|
|
912
|
+
address: '0x4158734d47fc9692176b5085e0f52ee0da5d47f1',
|
|
913
|
+
decimals: 18,
|
|
914
|
+
},
|
|
915
|
+
GOLD: {
|
|
916
|
+
address: '0xbeFD5C25A59ef2C1316c5A4944931171F30Cd3E4',
|
|
917
|
+
decimals: 18,
|
|
918
|
+
},
|
|
895
919
|
ETH: { address: ETHER_ADDRESS, decimals: 18 },
|
|
896
920
|
},
|
|
897
921
|
};
|
|
@@ -1117,6 +1141,12 @@ export const Holders: {
|
|
|
1117
1141
|
WETH: '0x4bb6b2efe7036020ba6f02a05602546c9f25bf28',
|
|
1118
1142
|
PRIME: '0x956bcc6b56c99db382d9d97a30ba5f1402144b3e',
|
|
1119
1143
|
ETH: '0xdd9176ea3e7559d6b68b537ef555d3e89403f742',
|
|
1144
|
+
MAV: '0x7499785aa5d1bdf0a0ac862c1ef3698d3cba6568',
|
|
1145
|
+
USDC: '0xaac391f166f33cdaefaa4afa6616a3bea66b694d',
|
|
1146
|
+
USDbC: '0xc9d05a1c3c8e01dcb701d6185cdc21a5bb94becb',
|
|
1147
|
+
DAI: '0x20f03e26968b179025f65c1f4afadfd3959c8d03',
|
|
1148
|
+
BAL: '0x854b004700885a61107b458f11ecc169a019b764',
|
|
1149
|
+
GOLD: '0x1374c25b3710758c326ee0c70ec48b595d5ccf8c',
|
|
1120
1150
|
},
|
|
1121
1151
|
};
|
|
1122
1152
|
|
package/tests/utils-e2e.ts
CHANGED
|
@@ -86,6 +86,7 @@ const MULTISIG: { [nid: number]: string } = {
|
|
|
86
86
|
[Network.AVALANCHE]: '0x1e2ECA5e812D08D2A7F8664D69035163ff5BfEC2',
|
|
87
87
|
[Network.OPTIMISM]: '0xf01121e808F782d7F34E857c27dA31AD1f151b39',
|
|
88
88
|
[Network.ARBITRUM]: '0x90DfD8a6454CFE19be39EaB42ac93CD850c7f339',
|
|
89
|
+
[Network.BASE]: '0x6C674c8Df1aC663b822c4B6A56B4E5e889379AE0',
|
|
89
90
|
};
|
|
90
91
|
|
|
91
92
|
class APIParaswapSDK implements IParaSwapSDK {
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"anonymous": false,
|
|
4
|
-
"inputs": [
|
|
5
|
-
{
|
|
6
|
-
"indexed": false,
|
|
7
|
-
"internalType": "address",
|
|
8
|
-
"name": "token",
|
|
9
|
-
"type": "address"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"indexed": false,
|
|
13
|
-
"internalType": "uint256",
|
|
14
|
-
"name": "price",
|
|
15
|
-
"type": "uint256"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"indexed": false,
|
|
19
|
-
"internalType": "address",
|
|
20
|
-
"name": "priceFeed",
|
|
21
|
-
"type": "address"
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"name": "PriceUpdate",
|
|
25
|
-
"type": "event"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"inputs": [
|
|
29
|
-
{ "internalType": "address", "name": "_token", "type": "address" },
|
|
30
|
-
{ "internalType": "uint256", "name": "_price", "type": "uint256" }
|
|
31
|
-
],
|
|
32
|
-
"name": "emitPriceEvent",
|
|
33
|
-
"outputs": [],
|
|
34
|
-
"stateMutability": "nonpayable",
|
|
35
|
-
"type": "function"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"inputs": [],
|
|
39
|
-
"name": "gov",
|
|
40
|
-
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
|
|
41
|
-
"stateMutability": "view",
|
|
42
|
-
"type": "function"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"inputs": [{ "internalType": "address", "name": "", "type": "address" }],
|
|
46
|
-
"name": "isPriceFeed",
|
|
47
|
-
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
|
|
48
|
-
"stateMutability": "view",
|
|
49
|
-
"type": "function"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"inputs": [
|
|
53
|
-
{ "internalType": "address", "name": "_gov", "type": "address" }
|
|
54
|
-
],
|
|
55
|
-
"name": "setGov",
|
|
56
|
-
"outputs": [],
|
|
57
|
-
"stateMutability": "nonpayable",
|
|
58
|
-
"type": "function"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"inputs": [
|
|
62
|
-
{ "internalType": "address", "name": "_priceFeed", "type": "address" },
|
|
63
|
-
{ "internalType": "bool", "name": "_isPriceFeed", "type": "bool" }
|
|
64
|
-
],
|
|
65
|
-
"name": "setIsPriceFeed",
|
|
66
|
-
"outputs": [],
|
|
67
|
-
"stateMutability": "nonpayable",
|
|
68
|
-
"type": "function"
|
|
69
|
-
}
|
|
70
|
-
]
|