@paraswap/dex-lib 4.1.7-pub-sub.2 → 4.1.7-pub-sub.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.
Files changed (66) hide show
  1. package/build/dex/angle-staked-stable/angle-staked-stable.js +2 -1
  2. package/build/dex/angle-staked-stable/angle-staked-stable.js.map +1 -1
  3. package/build/dex/angle-transmuter/angle-transmuter.js.map +1 -1
  4. package/build/dex/balancer-v1/config.js +2 -1
  5. package/build/dex/balancer-v1/config.js.map +1 -1
  6. package/build/dex/weth/weth.js +2 -1
  7. package/build/dex/weth/weth.js.map +1 -1
  8. package/build/pricing-helper.d.ts +1 -1
  9. package/build/pricing-helper.js +13 -9
  10. package/build/pricing-helper.js.map +1 -1
  11. package/build/types.d.ts +1 -0
  12. package/package.json +1 -1
  13. package/src/dex/aave-gsm/aave-gsm-gas-estimation.test.ts +32 -0
  14. package/src/dex/aave-v2/aave-v2-gas-estimation.test.ts +28 -0
  15. package/src/dex/aave-v3/aave-v3-gas-estimation.test.ts +66 -0
  16. package/src/dex/aave-v3-stata/aave-v3-stata-gas-estimation.test.ts +41 -0
  17. package/src/dex/aave-v3-stata-v2/aave-v3-stata-v2-gas-estimation.test.ts +41 -0
  18. package/src/dex/angle-staked-stable/angle-staked-stable-gas-estimation.test.ts +29 -0
  19. package/src/dex/angle-staked-stable/angle-staked-stable.ts +2 -1
  20. package/src/dex/angle-transmuter/angle-transmuter-gas-estimation.test.ts +41 -0
  21. package/src/dex/angle-transmuter/angle-transmuter.ts +0 -1
  22. package/src/dex/balancer-v1/balancer-v1-gas-estimation.test.ts +29 -0
  23. package/src/dex/balancer-v1/config.ts +2 -1
  24. package/src/dex/balancer-v2/balancer-v2-gas-estimation.test.ts +98 -0
  25. package/src/dex/balancer-v3/balancer-v3-gas-estimation.test.ts +30 -0
  26. package/src/dex/bancor/bancor-gas-estimation.test.ts +30 -0
  27. package/src/dex/bebop/bebop-gas-estimation.test.ts +30 -0
  28. package/src/dex/concentrator-arusd/concentrator-arusd-gas-estimation.test.ts +29 -0
  29. package/src/dex/curve-v1/curve-v1-gas-estimation.test.ts +29 -0
  30. package/src/dex/curve-v2/curve-v2-gas-estimation.test.ts +29 -0
  31. package/src/dex/fluid-dex/fluid-dex-gas-estimation.test.ts +29 -0
  32. package/src/dex/fx-protocol-rusd/fx-protocol-rusd-gas-estimation.test.ts +29 -0
  33. package/src/dex/hashflow/hashflow-gas-estimation.test.ts +30 -0
  34. package/src/dex/idle-dao/idle-dao--gas-estimation.test.ts +30 -0
  35. package/src/dex/lido/lido-gas-estimation.test.ts +29 -0
  36. package/src/dex/lite-psm/lite-psm-gas-estimation.test.ts +34 -0
  37. package/src/dex/maker-psm/maker-psm-gas-estimation.test.ts +34 -0
  38. package/src/dex/maverick-v1/maverick-v1-gas-estimation.test.ts +29 -0
  39. package/src/dex/maverick-v2/maverick-v2-gas-estimation.test.ts +29 -0
  40. package/src/dex/pancakeswap-v3/pancakeswap-v3-gas-estimation.test.ts +29 -0
  41. package/src/dex/polygon-migrator/polygon-migrator-gas-estimation.test.ts +41 -0
  42. package/src/dex/sky-converter/sky-converter-gas-estimation.test.ts +78 -0
  43. package/src/dex/solidly/solidly-gas-estimation.test.ts +29 -0
  44. package/src/dex/solidly-v3/solidly-v3-gas-estimation.test.ts +29 -0
  45. package/src/dex/spark/spark-gas-estimation.test.ts +29 -0
  46. package/src/dex/stader/stader-gas-estimation.test.ts +29 -0
  47. package/src/dex/stkgho/stkgho-gas-estimation.test.ts +29 -0
  48. package/src/dex/swaap-v2/swaap-v2-estimation.test.ts +29 -0
  49. package/src/dex/swell/swell-estimation.test.ts +29 -0
  50. package/src/dex/trader-joe-v2.1/trader-joe-v2.1-gas-estimation.test.ts +29 -0
  51. package/src/dex/uniswap-v2/uniswap-v2-gas-estimation.test.ts +98 -0
  52. package/src/dex/uniswap-v3/uniswap-v3-gas-estimation.test.ts +98 -0
  53. package/src/dex/usual/usual-gas-estimation.test.ts +54 -0
  54. package/src/dex/usual-pp/usual-pp-gas-estimation.test.ts +29 -0
  55. package/src/dex/weth/weth-gas-estimation.test.ts +42 -0
  56. package/src/dex/weth/weth.ts +3 -1
  57. package/src/dex/wombat/wombat-gas-estimation.test.ts +29 -0
  58. package/src/dex/wsteth/wsteth-gas-estimation.test.ts +41 -0
  59. package/src/dex/wusdm/wusdm-gas-estimation.test.ts +41 -0
  60. package/src/pricing-helper.ts +19 -11
  61. package/src/types.ts +1 -0
  62. package/tests/constants-e2e.ts +8 -0
  63. package/tests/tenderly-simulation-new.test.ts +151 -0
  64. package/tests/tenderly-simulation-new.ts +698 -0
  65. package/tests/token-storage-slots.json +532 -0
  66. package/tests/utils-e2e.ts +137 -1
@@ -0,0 +1,41 @@
1
+ /* eslint-disable no-console */
2
+ import 'dotenv/config';
3
+ import { testGasEstimation } from '../../../tests/utils-e2e';
4
+ import { Tokens } from '../../../tests/constants-e2e';
5
+ import { Network, SwapSide } from '../../constants';
6
+ import { ContractMethodV6 } from '@paraswap/core';
7
+
8
+ describe('wstETH Gas Estimation', () => {
9
+ const dexKey = 'wstETH';
10
+ const network = Network.MAINNET;
11
+
12
+ describe('swapExactAmountIn', () => {
13
+ const STETH = Tokens[network]['STETH'];
14
+ const wstETH = Tokens[network]['wstETH'];
15
+ const amount = 1000000000000000000n;
16
+
17
+ it('wrap', async () => {
18
+ await testGasEstimation(
19
+ network,
20
+ STETH,
21
+ wstETH,
22
+ amount,
23
+ SwapSide.SELL,
24
+ dexKey,
25
+ ContractMethodV6.swapExactAmountIn,
26
+ );
27
+ });
28
+
29
+ it('unwrap', async () => {
30
+ await testGasEstimation(
31
+ network,
32
+ wstETH,
33
+ STETH,
34
+ amount,
35
+ SwapSide.SELL,
36
+ dexKey,
37
+ ContractMethodV6.swapExactAmountIn,
38
+ );
39
+ });
40
+ });
41
+ });
@@ -0,0 +1,41 @@
1
+ /* eslint-disable no-console */
2
+ import 'dotenv/config';
3
+ import { testGasEstimation } from '../../../tests/utils-e2e';
4
+ import { Tokens } from '../../../tests/constants-e2e';
5
+ import { Network, SwapSide } from '../../constants';
6
+ import { ContractMethodV6 } from '@paraswap/core';
7
+
8
+ describe('wUSDM Gas Estimation', () => {
9
+ const dexKey = 'wUSDM';
10
+ const network = Network.MAINNET;
11
+
12
+ describe('swapExactAmountIn', () => {
13
+ const wUSDM = Tokens[network]['wUSDM'];
14
+ const USDM = Tokens[network]['USDM'];
15
+ const amount = 500n;
16
+
17
+ it('deposit', async () => {
18
+ await testGasEstimation(
19
+ network,
20
+ USDM,
21
+ wUSDM,
22
+ amount,
23
+ SwapSide.SELL,
24
+ dexKey,
25
+ ContractMethodV6.swapExactAmountIn,
26
+ );
27
+ });
28
+
29
+ it('redeem', async () => {
30
+ await testGasEstimation(
31
+ network,
32
+ wUSDM,
33
+ USDM,
34
+ amount,
35
+ SwapSide.SELL,
36
+ dexKey,
37
+ ContractMethodV6.swapExactAmountIn,
38
+ );
39
+ });
40
+ });
41
+ });
@@ -191,7 +191,7 @@ export class PricingHelper {
191
191
  srcDexFee: 0,
192
192
  destDexFee: 0,
193
193
  },
194
- rollupL1ToL2GasRatio?: number,
194
+ rollupL1CalldataCostToL2GasCost?: (calldataCost: number) => number,
195
195
  ): Promise<PoolPrices<any>[]> {
196
196
  const dexPoolPrices = await Promise.all(
197
197
  dexKeys.map(async key => {
@@ -229,39 +229,47 @@ export class PricingHelper {
229
229
  )
230
230
  .then(poolPrices => {
231
231
  try {
232
- if (!poolPrices || !rollupL1ToL2GasRatio) {
232
+ if (!poolPrices || !rollupL1CalldataCostToL2GasCost) {
233
233
  return resolve(poolPrices);
234
234
  }
235
235
  return resolve(
236
236
  poolPrices.map(pp => {
237
237
  pp.gasCostL2 = pp.gasCost;
238
- const gasCostL1 = dexInstance.getCalldataGasCost(pp);
238
+ const calldataGasCost =
239
+ dexInstance.getCalldataGasCost(pp);
239
240
  if (
240
241
  typeof pp.gasCost === 'number' &&
241
- typeof gasCostL1 === 'number'
242
+ pp.gasCost !== 0 &&
243
+ typeof calldataGasCost === 'number'
242
244
  ) {
243
245
  pp.gasCost += Math.ceil(
244
- rollupL1ToL2GasRatio * gasCostL1,
246
+ rollupL1CalldataCostToL2GasCost(calldataGasCost),
245
247
  );
246
248
  } else if (
247
249
  typeof pp.gasCost !== 'number' &&
248
- typeof gasCostL1 !== 'number'
250
+ typeof calldataGasCost !== 'number'
249
251
  ) {
250
- if (pp.gasCost.length !== gasCostL1.length) {
252
+ if (pp.gasCost.length !== calldataGasCost.length) {
251
253
  throw new Error(
252
254
  `getCalldataGasCost returned wrong array length in dex ${key}`,
253
255
  );
254
256
  }
255
- pp.gasCost = pp.gasCost.map(
256
- (g, i) =>
257
- g +
258
- Math.ceil(rollupL1ToL2GasRatio * gasCostL1[i]),
257
+ pp.gasCost = pp.gasCost.map((g, i) =>
258
+ g === 0
259
+ ? 0
260
+ : g +
261
+ Math.ceil(
262
+ rollupL1CalldataCostToL2GasCost(
263
+ calldataGasCost[i],
264
+ ),
265
+ ),
259
266
  );
260
267
  } else {
261
268
  throw new Error(
262
269
  `getCalldataGasCost returned wrong type in dex ${key}`,
263
270
  );
264
271
  }
272
+ pp.calldataGasCost = calldataGasCost;
265
273
  return pp;
266
274
  }),
267
275
  );
package/src/types.ts CHANGED
@@ -227,6 +227,7 @@ export type PoolPrices<T> = {
227
227
  exchange: string;
228
228
  gasCost: number | number[];
229
229
  gasCostL2?: number | number[];
230
+ calldataGasCost?: number | number[];
230
231
  poolAddresses?: Array<Address>;
231
232
  };
232
233
 
@@ -591,6 +591,14 @@ export const Tokens: {
591
591
  decimals: 6,
592
592
  symbol: 'USUALM',
593
593
  },
594
+ stataEthWETH: {
595
+ address: '0x252231882FB38481497f3C767469106297c8d93b',
596
+ decimals: 18,
597
+ },
598
+ waEthWETH: {
599
+ address: '0x0bfc9d54Fc184518A81162F8fB99c2eACa081202',
600
+ decimals: 18,
601
+ },
594
602
  },
595
603
  [Network.POLYGON]: {
596
604
  jGBP: {
@@ -0,0 +1,151 @@
1
+ import { ethers } from 'ethers';
2
+ import { TenderlySimulatorNew } from './tenderly-simulation-new';
3
+
4
+ describe('Tenderly', () => {
5
+ const tenderly = TenderlySimulatorNew.getInstance();
6
+ const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
7
+ const USDT = '0xdac17f958d2ee523a2206206994597c13d831ec7';
8
+ const account = '0x89f53c184ed91cd333fdec0eceeddcaea0cc28cf';
9
+ const spender = '0x6a000f20005980200259b80c5102003040001068';
10
+
11
+ describe('calculateAddressBalanceSlot', () => {
12
+ it('should calculate account balance storage slot', () => {
13
+ const balanceOfSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [9]); // usdc's `balanceOf` mapping slot
14
+ // https://dashboard.tenderly.co/paraswap/paraswap/simulator/d7964910-d8ce-446b-a347-c4f1da1acead/debugger?trace=0.2.0.0
15
+ const expected =
16
+ '0x8cef03c2b7574a38d9a9e8dd69980240d41d70485643f407de33055936c48f97';
17
+ const calculated = tenderly.calculateAddressBalanceSlot(
18
+ balanceOfSlot,
19
+ account,
20
+ );
21
+ // assert
22
+ expect(calculated).toEqual(expected);
23
+ });
24
+ });
25
+
26
+ describe('calculateAddressAllowanceSlots', () => {
27
+ it('should calculate account balance storage slot', () => {
28
+ const allowanceSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [10]); // usdc's `allowance` mapping slot
29
+ // https://dashboard.tenderly.co/paraswap/paraswap/simulator/e2a6cad1-4a82-4ba7-8c3e-ef097315542c/debugger?trace=0.2.0
30
+ const expected =
31
+ '0x371a34ab690ce2826b137a25bfdaf43d0b93c819878de2df8877f1fb50ffb206';
32
+ const calculated = tenderly.calculateAddressAllowanceSlot(
33
+ allowanceSlot,
34
+ account,
35
+ spender,
36
+ );
37
+ // assert
38
+ expect(calculated).toEqual(expected);
39
+ });
40
+ });
41
+
42
+ describe('buildBalanceOfSimulationRequest', () => {
43
+ it('should build `balanceOf` simulation request', () => {
44
+ const request = tenderly.buildBalanceOfSimulationRequest(
45
+ 1,
46
+ USDC,
47
+ account,
48
+ );
49
+
50
+ const expectedCallData = ethers.utils.hexConcat([
51
+ '0x70a08231', // selector
52
+ ethers.utils.defaultAbiCoder.encode(['address'], [account]),
53
+ ]);
54
+
55
+ expect(request.data).toEqual(expectedCallData);
56
+ });
57
+ });
58
+
59
+ describe('buildAllowanceSimulationRequest', () => {
60
+ it('should build `allowance` simulation request', () => {
61
+ const request = tenderly.buildAllowanceSimulationRequest(
62
+ 1,
63
+ USDC,
64
+ account,
65
+ spender,
66
+ );
67
+
68
+ const expectedCallData = ethers.utils.hexConcat([
69
+ '0xdd62ed3e', // selector
70
+ ethers.utils.defaultAbiCoder.encode(
71
+ ['address', 'address'],
72
+ [account, spender],
73
+ ),
74
+ ]);
75
+ // assert
76
+ expect(request.data).toEqual(expectedCallData);
77
+ });
78
+ });
79
+
80
+ describe('findTokenBalanceOfSlot', () => {
81
+ it('should find Mainnet USDC `balanceOf` storage slot', async () => {
82
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [9]);
83
+ const foundSlot = await tenderly.findTokenBalanceOfSlot(1, USDC);
84
+ // assert
85
+ expect(foundSlot.slot).toEqual(expectedSlot);
86
+ });
87
+
88
+ it('should find Mainnet USDT `balanceOf` storage slot', async () => {
89
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [2]);
90
+ const foundSlot = await tenderly.findTokenBalanceOfSlot(1, USDT);
91
+ // assert
92
+ expect(foundSlot.slot).toEqual(expectedSlot);
93
+ });
94
+
95
+ it('should find Mainnet stETH `balanceOf` storage slot', async () => {
96
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [0]);
97
+ const foundSlot = await tenderly.findTokenBalanceOfSlot(
98
+ 1,
99
+ '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // Lido's `stETH`
100
+ );
101
+ // assert
102
+ expect(foundSlot.slot).toEqual(expectedSlot);
103
+ });
104
+
105
+ it('should find Mainnet aEthDai `balanceOf` storage slot', async () => {
106
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [52]);
107
+ const foundSlot = await tenderly.findTokenBalanceOfSlot(
108
+ 1,
109
+ '0x018008bfb33d285247A21d44E50697654f754e63', // Aave's `aEthDai`
110
+ );
111
+ // assert
112
+ expect(foundSlot.slot).toEqual(expectedSlot);
113
+ });
114
+ });
115
+
116
+ describe('findTokenAllowanceSlot', () => {
117
+ it('should find Mainnet USDC `allowance` storage slot', async () => {
118
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [10]);
119
+ const foundSlot = await tenderly.findTokenAllowanceSlot(1, USDC);
120
+ // assert
121
+ expect(foundSlot.slot).toEqual(expectedSlot);
122
+ });
123
+
124
+ it('should find Mainnet USDT `allowance` storage slot', async () => {
125
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [5]);
126
+ const foundSlot = await tenderly.findTokenAllowanceSlot(1, USDT);
127
+ // assert
128
+ expect(foundSlot.slot).toEqual(expectedSlot);
129
+ });
130
+
131
+ it('should find Mainnet stETH `allowance` storage slot', async () => {
132
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [1]);
133
+ const foundSlot = await tenderly.findTokenAllowanceSlot(
134
+ 1,
135
+ '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // Lido's `stETH`
136
+ );
137
+ // assert
138
+ expect(foundSlot.slot).toEqual(expectedSlot);
139
+ });
140
+
141
+ it('should find Mainnet aEthDai `allowance` storage slot', async () => {
142
+ const expectedSlot = ethers.utils.defaultAbiCoder.encode(['uint'], [53]);
143
+ const foundSlot = await tenderly.findTokenAllowanceSlot(
144
+ 1,
145
+ '0x018008bfb33d285247A21d44E50697654f754e63', // Aave's `aEthDai`
146
+ );
147
+ // assert
148
+ expect(foundSlot.slot).toEqual(expectedSlot);
149
+ });
150
+ });
151
+ });