@paraswap/dex-lib 2.42.16 → 2.42.17-wombat.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.
Files changed (64) hide show
  1. package/.vscode/launch.json +39 -0
  2. package/.vscode/settings.json +2 -0
  3. package/.vscode/tasks.json +15 -0
  4. package/build/abi/algebra/SwapRouter.json +281 -0
  5. package/build/abi/wombat/asset.json +769 -0
  6. package/build/abi/wombat/bmw.json +1247 -0
  7. package/build/abi/wombat/pool.json +1364 -0
  8. package/build/config.js +7 -6
  9. package/build/config.js.map +1 -1
  10. package/build/dex/index.js +2 -0
  11. package/build/dex/index.js.map +1 -1
  12. package/build/dex/swaap-v2/stable-coins.d.ts +5 -0
  13. package/build/dex/swaap-v2/stable-coins.js +26 -0
  14. package/build/dex/swaap-v2/stable-coins.js.map +1 -0
  15. package/build/dex/wombat/config.d.ts +4 -0
  16. package/build/dex/wombat/config.js +77 -0
  17. package/build/dex/wombat/config.js.map +1 -0
  18. package/build/dex/wombat/types.d.ts +33 -0
  19. package/build/dex/wombat/types.js +3 -0
  20. package/build/dex/wombat/types.js.map +1 -0
  21. package/build/dex/wombat/utils.d.ts +9 -0
  22. package/build/dex/wombat/utils.js +66 -0
  23. package/build/dex/wombat/utils.js.map +1 -0
  24. package/build/dex/wombat/wombat-bmw.d.ts +40 -0
  25. package/build/dex/wombat/wombat-bmw.js +147 -0
  26. package/build/dex/wombat/wombat-bmw.js.map +1 -0
  27. package/build/dex/wombat/wombat-pool.d.ts +22 -0
  28. package/build/dex/wombat/wombat-pool.js +161 -0
  29. package/build/dex/wombat/wombat-pool.js.map +1 -0
  30. package/build/dex/wombat/wombat-quoter.d.ts +16 -0
  31. package/build/dex/wombat/wombat-quoter.js +176 -0
  32. package/build/dex/wombat/wombat-quoter.js.map +1 -0
  33. package/build/dex/wombat/wombat.d.ts +55 -0
  34. package/build/dex/wombat/wombat.js +290 -0
  35. package/build/dex/wombat/wombat.js.map +1 -0
  36. package/build/rebase-tokens.json +17 -0
  37. package/package.json +1 -1
  38. package/src/abi/wombat/asset.json +769 -0
  39. package/src/abi/wombat/bmw.json +1247 -0
  40. package/src/abi/wombat/pool.json +1364 -0
  41. package/src/config.ts +7 -7
  42. package/src/dex/index.ts +2 -0
  43. package/src/dex/wombat/config.ts +77 -0
  44. package/src/dex/wombat/types.ts +55 -0
  45. package/src/dex/wombat/utils.ts +62 -0
  46. package/src/dex/wombat/wombat-bmw.ts +209 -0
  47. package/src/dex/wombat/wombat-e2e.test.ts +264 -0
  48. package/src/dex/wombat/wombat-integration.test.ts +258 -0
  49. package/src/dex/wombat/wombat-pool.ts +231 -0
  50. package/src/dex/wombat/wombat-quoter.ts +269 -0
  51. package/src/dex/wombat/wombat.ts +426 -0
  52. package/tests/constants-e2e.ts +20 -4
  53. package/tests/utils-e2e.ts +2 -1
  54. package/build/abi/algebra/AlgebraPool.abi.json +0 -727
  55. package/build/abi/uniswap-v3/UniswapV3Quoter.abi.json +0 -193
  56. package/build/dex/algebra/algebra-pool.d.ts +0 -46
  57. package/build/dex/algebra/algebra-pool.js +0 -336
  58. package/build/dex/algebra/algebra-pool.js.map +0 -1
  59. package/build/dex/quickswap/camelot-v3.d.ts +0 -6
  60. package/build/dex/quickswap/camelot-v3.js +0 -19
  61. package/build/dex/quickswap/camelot-v3.js.map +0 -1
  62. package/build/dex/quickswap/zyberswap-v3.d.ts +0 -6
  63. package/build/dex/quickswap/zyberswap-v3.js +0 -19
  64. package/build/dex/quickswap/zyberswap-v3.js.map +0 -1
@@ -0,0 +1,264 @@
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
+ type Pairs = { name: string; sellAmount: string; buyAmount: string }[][];
15
+
16
+ function testForNetwork(
17
+ network: Network,
18
+ dexKey: string,
19
+ pairs: Pairs,
20
+ slippage?: number | undefined,
21
+ ) {
22
+ const provider = new StaticJsonRpcProvider(
23
+ generateConfig(network).privateHttpProvider,
24
+ network,
25
+ );
26
+ const tokens = Tokens[network];
27
+ const holders = Holders[network];
28
+
29
+ const sideToContractMethods = new Map([
30
+ [
31
+ SwapSide.SELL,
32
+ [
33
+ ContractMethod.simpleSwap,
34
+ ContractMethod.multiSwap,
35
+ ContractMethod.megaSwap,
36
+ ],
37
+ ],
38
+ [SwapSide.BUY, [ContractMethod.simpleBuy /* ContractMethod.buy */]],
39
+ ]);
40
+
41
+ sideToContractMethods.forEach((contractMethods, side) =>
42
+ describe(`${side}`, () => {
43
+ contractMethods.forEach((contractMethod: ContractMethod) => {
44
+ pairs.forEach(pair => {
45
+ describe(`${contractMethod}`, () => {
46
+ it(`${pair[0].name} -> ${pair[1].name}`, async () => {
47
+ await testE2E(
48
+ tokens[pair[0].name],
49
+ tokens[pair[1].name],
50
+ holders[pair[0].name],
51
+ side === SwapSide.SELL ? pair[0].sellAmount : pair[0].buyAmount,
52
+ side,
53
+ dexKey,
54
+ contractMethod,
55
+ network,
56
+ provider,
57
+ undefined,
58
+ undefined,
59
+ undefined,
60
+ slippage,
61
+ );
62
+ });
63
+
64
+ it(`${pair[1].name} -> ${pair[0].name}`, async () => {
65
+ await testE2E(
66
+ tokens[pair[1].name],
67
+ tokens[pair[0].name],
68
+ holders[pair[1].name],
69
+ side === SwapSide.SELL ? pair[1].sellAmount : pair[1].buyAmount,
70
+ side,
71
+ dexKey,
72
+ contractMethod,
73
+ network,
74
+ provider,
75
+ undefined,
76
+ undefined,
77
+ undefined,
78
+ slippage,
79
+ );
80
+ });
81
+ });
82
+ });
83
+ });
84
+ }),
85
+ );
86
+ }
87
+
88
+ describe('Wombat E2E', () => {
89
+ const dexKey = 'Wombat';
90
+
91
+ describe('BSC', () => {
92
+ const network = Network.BSC;
93
+
94
+ const pairs: Pairs = [
95
+ [
96
+ {
97
+ name: 'USDC',
98
+ sellAmount: '1000000000',
99
+ buyAmount: '1000000000',
100
+ },
101
+ {
102
+ name: 'USDT',
103
+ sellAmount: '1000000000',
104
+ buyAmount: '1000000000',
105
+ },
106
+ ],
107
+ [
108
+ {
109
+ name: 'BNB',
110
+ sellAmount: '1000000000000000000',
111
+ buyAmount: '1000000000000000000',
112
+ },
113
+ {
114
+ name: 'BNBx',
115
+ sellAmount: '1000000000000000000',
116
+ buyAmount: '1000000000000000000',
117
+ },
118
+ ],
119
+ ];
120
+
121
+ testForNetwork(network, dexKey, pairs);
122
+ });
123
+
124
+ describe('Arbitrum', () => {
125
+ const network = Network.ARBITRUM;
126
+
127
+ const pairs: Pairs = [
128
+ [
129
+ {
130
+ name: 'USDC',
131
+ sellAmount: '100000000',
132
+ buyAmount: '100000000',
133
+ },
134
+ {
135
+ name: 'USDT',
136
+ sellAmount: '100000000',
137
+ buyAmount: '100000000',
138
+ },
139
+ ],
140
+ [
141
+ {
142
+ name: 'ETH',
143
+ sellAmount: '10000000000000000',
144
+ buyAmount: '10000000000000000',
145
+ },
146
+ {
147
+ name: 'wstETH',
148
+ sellAmount: '10000000000000000',
149
+ buyAmount: '10000000000000000',
150
+ },
151
+ ],
152
+ ];
153
+
154
+ testForNetwork(network, dexKey, pairs);
155
+ });
156
+
157
+ describe('Ethereum', () => {
158
+ const network = Network.MAINNET;
159
+
160
+ const pairs: Pairs = [
161
+ [
162
+ {
163
+ name: 'USDC',
164
+ sellAmount: '100000000',
165
+ buyAmount: '100000000',
166
+ },
167
+ {
168
+ name: 'USDT',
169
+ sellAmount: '100000000',
170
+ buyAmount: '100000000',
171
+ },
172
+ ],
173
+ [
174
+ {
175
+ name: 'ETH',
176
+ sellAmount: '1000000000000000000',
177
+ buyAmount: '1000000000000000000',
178
+ },
179
+ {
180
+ name: 'wstETH',
181
+ sellAmount: '1000000000000000000',
182
+ buyAmount: '1000000000000000000',
183
+ },
184
+ ],
185
+ ];
186
+
187
+ testForNetwork(network, dexKey, pairs);
188
+ });
189
+
190
+ describe('Avalanche', () => {
191
+ const network = Network.AVALANCHE;
192
+
193
+ const pairs: Pairs = [
194
+ [
195
+ {
196
+ name: 'USDC',
197
+ sellAmount: '10000000',
198
+ buyAmount: '10000000',
199
+ },
200
+ {
201
+ name: 'USDT',
202
+ sellAmount: '10000000',
203
+ buyAmount: '10000000',
204
+ },
205
+ ],
206
+ [
207
+ {
208
+ name: 'AVAX',
209
+ sellAmount: '100000000000000000000',
210
+ buyAmount: '100000000000000000000',
211
+ },
212
+ {
213
+ name: 'sAVAX',
214
+ sellAmount: '100000000000000000000',
215
+ buyAmount: '100000000000000000000',
216
+ },
217
+ ],
218
+ ];
219
+
220
+ testForNetwork(network, dexKey, pairs);
221
+ });
222
+
223
+ describe('Base', () => {
224
+ const network = Network.BASE;
225
+
226
+ const pairs: Pairs = [
227
+ [
228
+ {
229
+ name: 'USDC',
230
+ sellAmount: '100000000',
231
+ buyAmount: '100000000',
232
+ },
233
+ {
234
+ name: 'USDbC',
235
+ sellAmount: '100000000',
236
+ buyAmount: '100000000',
237
+ },
238
+ ],
239
+ ];
240
+
241
+ testForNetwork(network, dexKey, pairs);
242
+ });
243
+
244
+ describe('Optimism', () => {
245
+ const network = Network.OPTIMISM;
246
+
247
+ const pairs: Pairs = [
248
+ [
249
+ {
250
+ name: 'USDC',
251
+ sellAmount: '100000000',
252
+ buyAmount: '100000000',
253
+ },
254
+ {
255
+ name: 'USDT',
256
+ sellAmount: '100000000',
257
+ buyAmount: '100000000',
258
+ },
259
+ ],
260
+ ];
261
+
262
+ testForNetwork(network, dexKey, pairs);
263
+ });
264
+ });
@@ -0,0 +1,258 @@
1
+ import dotenv from 'dotenv';
2
+
3
+ dotenv.config();
4
+
5
+ import { Interface, Result } from '@ethersproject/abi';
6
+ import { DummyDexHelper } from '../../dex-helper/index';
7
+ import { Network, SwapSide } from '../../constants';
8
+ import { BI_POWS } from '../../bigint-constants';
9
+ import { Wombat } from './wombat';
10
+ import {
11
+ checkPoolPrices,
12
+ checkPoolsLiquidity,
13
+ checkConstantPoolPrices,
14
+ } from '../../../tests/utils';
15
+ import { Tokens } from '../../../tests/constants-e2e';
16
+ import { Token } from '../../types';
17
+ import { Address } from '@paraswap/core';
18
+ import { WombatConfig } from './config';
19
+
20
+ function getReaderCalldata(
21
+ exchangeAddress: string,
22
+ readerIface: Interface,
23
+ side: SwapSide,
24
+ fromToken: Token,
25
+ toToken: Token,
26
+ amounts: bigint[],
27
+ funcName: string,
28
+ ) {
29
+ return amounts.map(amount => ({
30
+ target: exchangeAddress,
31
+ callData: readerIface.encodeFunctionData(
32
+ funcName,
33
+ side == SwapSide.SELL
34
+ ? [fromToken.address, toToken.address, amount]
35
+ : [toToken.address, fromToken.address, -amount],
36
+ ),
37
+ }));
38
+ }
39
+
40
+ function decodeReaderResult(
41
+ results: Result,
42
+ readerIface: Interface,
43
+ funcName: string,
44
+ ) {
45
+ return results.map(result => {
46
+ const parsed = readerIface.decodeFunctionResult(funcName, result);
47
+ return BigInt(parsed[0]._hex);
48
+ });
49
+ }
50
+
51
+ async function checkOnChainPricing(
52
+ wombat: Wombat,
53
+ pool: Address,
54
+ fromToken: Token,
55
+ toToken: Token,
56
+ side: SwapSide,
57
+ funcName: string,
58
+ blockNumber: number,
59
+ prices: bigint[],
60
+ amounts: bigint[],
61
+ ) {
62
+ const exchangeAddress = pool; // TODO: Put here the real exchange address
63
+
64
+ const readerIface = Wombat.poolInterface;
65
+
66
+ const readerCallData = getReaderCalldata(
67
+ exchangeAddress,
68
+ readerIface,
69
+ side,
70
+ fromToken,
71
+ toToken,
72
+ amounts.slice(1),
73
+ funcName,
74
+ );
75
+ const readerResult = (
76
+ await wombat.dexHelper.multiContract.methods
77
+ .aggregate(readerCallData)
78
+ .call({}, blockNumber)
79
+ ).returnData;
80
+
81
+ const expectedPrices = [0n].concat(
82
+ decodeReaderResult(readerResult, readerIface, funcName),
83
+ );
84
+
85
+ expect(prices).toEqual(expectedPrices);
86
+ }
87
+
88
+ async function testPricingOnNetwork(
89
+ wombat: Wombat,
90
+ network: Network,
91
+ dexKey: string,
92
+ blockNumber: number,
93
+ srcTokenSymbol: string,
94
+ destTokenSymbol: string,
95
+ side: SwapSide,
96
+ amounts: bigint[],
97
+ funcNameToCheck: string,
98
+ ) {
99
+ const networkTokens = Tokens[network];
100
+
101
+ const pools = await wombat.getPoolIdentifiers(
102
+ networkTokens[srcTokenSymbol],
103
+ networkTokens[destTokenSymbol],
104
+ side,
105
+ blockNumber,
106
+ );
107
+ console.log(
108
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Identifiers: `,
109
+ pools,
110
+ );
111
+
112
+ expect(pools.length).toBeGreaterThan(0);
113
+
114
+ const poolPrices = await wombat.getPricesVolume(
115
+ networkTokens[srcTokenSymbol],
116
+ networkTokens[destTokenSymbol],
117
+ amounts,
118
+ side,
119
+ blockNumber,
120
+ pools,
121
+ );
122
+ console.log(
123
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Prices: `,
124
+ poolPrices,
125
+ );
126
+
127
+ expect(poolPrices).not.toBeNull();
128
+ if (wombat.hasConstantPriceLargeAmounts) {
129
+ checkConstantPoolPrices(poolPrices!, amounts, dexKey);
130
+ } else {
131
+ checkPoolPrices(poolPrices!, amounts, side, dexKey);
132
+ }
133
+
134
+ // Check if onchain pricing equals to calculated ones
135
+ await checkOnChainPricing(
136
+ wombat,
137
+ poolPrices![0].data.exchange,
138
+ networkTokens[srcTokenSymbol],
139
+ networkTokens[destTokenSymbol],
140
+ side,
141
+ funcNameToCheck,
142
+ blockNumber,
143
+ poolPrices![0].prices,
144
+ amounts,
145
+ );
146
+ }
147
+
148
+ describe('Wombat', function () {
149
+ const dexKey = 'Wombat';
150
+ let blockNumber: number;
151
+ let wombat: Wombat;
152
+
153
+ Object.keys(WombatConfig[dexKey]).forEach(key => {
154
+ describe(`network ${key}`, () => {
155
+ const network = Number(key) as Network;
156
+ const dexHelper = new DummyDexHelper(network);
157
+
158
+ const tokens = Tokens[network];
159
+
160
+ const srcTokenSymbol = 'USDC';
161
+ const destTokenSymbol = network == Network.BASE ? 'USDbC' : 'USDT';
162
+
163
+ let amountsForSell = [
164
+ 0n,
165
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
166
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
167
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
168
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
169
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
170
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
171
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
172
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
173
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
174
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
175
+ ];
176
+
177
+ let amountsForBuy = [
178
+ 0n,
179
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
180
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
181
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
182
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
183
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
184
+ 6n * BI_POWS[tokens[destTokenSymbol].decimals],
185
+ 7n * BI_POWS[tokens[destTokenSymbol].decimals],
186
+ 8n * BI_POWS[tokens[destTokenSymbol].decimals],
187
+ 9n * BI_POWS[tokens[destTokenSymbol].decimals],
188
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
189
+ ];
190
+
191
+ // OPTIMISM has very low liquidity currently, so we have to use very small amounts
192
+ // if (network === Network.OPTIMISM) {
193
+ // amountsForSell = amountsForSell.map(a => a / 100n);
194
+ // amountsForBuy = amountsForBuy.map(a => a / 100n);
195
+ // }
196
+
197
+ beforeAll(async () => {
198
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
199
+ wombat = new Wombat(network, dexKey, dexHelper);
200
+ });
201
+
202
+ it('getTopPoolsForToken', async function () {
203
+ // We have to check without calling initializePricing, because
204
+ // pool-tracker is not calling that function
205
+ if (wombat.updatePoolState) {
206
+ await wombat.updatePoolState();
207
+ }
208
+ const poolLiquidity = await wombat.getTopPoolsForToken(
209
+ tokens[srcTokenSymbol].address,
210
+ 10,
211
+ );
212
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
213
+
214
+ if (!wombat.hasConstantPriceLargeAmounts) {
215
+ checkPoolsLiquidity(
216
+ poolLiquidity,
217
+ Tokens[network][srcTokenSymbol].address,
218
+ dexKey,
219
+ );
220
+ }
221
+ });
222
+
223
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
224
+ if (wombat.initializePricing) {
225
+ await wombat.initializePricing(blockNumber);
226
+ }
227
+ await testPricingOnNetwork(
228
+ wombat,
229
+ network,
230
+ dexKey,
231
+ blockNumber,
232
+ srcTokenSymbol,
233
+ destTokenSymbol,
234
+ SwapSide.SELL,
235
+ amountsForSell,
236
+ 'quotePotentialSwap',
237
+ );
238
+ });
239
+
240
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
241
+ if (wombat.initializePricing) {
242
+ await wombat.initializePricing(blockNumber);
243
+ }
244
+ await testPricingOnNetwork(
245
+ wombat,
246
+ network,
247
+ dexKey,
248
+ blockNumber,
249
+ srcTokenSymbol,
250
+ destTokenSymbol,
251
+ SwapSide.BUY,
252
+ amountsForBuy,
253
+ 'quotePotentialSwap',
254
+ );
255
+ });
256
+ });
257
+ });
258
+ });