@paraswap/dex-lib 4.1.7-pub-sub → 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 (69) 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/lib/pub-sub.js +5 -5
  9. package/build/lib/pub-sub.js.map +1 -1
  10. package/build/pricing-helper.d.ts +1 -1
  11. package/build/pricing-helper.js +13 -9
  12. package/build/pricing-helper.js.map +1 -1
  13. package/build/types.d.ts +1 -0
  14. package/package.json +1 -1
  15. package/src/dex/aave-gsm/aave-gsm-gas-estimation.test.ts +32 -0
  16. package/src/dex/aave-v2/aave-v2-gas-estimation.test.ts +28 -0
  17. package/src/dex/aave-v3/aave-v3-gas-estimation.test.ts +66 -0
  18. package/src/dex/aave-v3-stata/aave-v3-stata-gas-estimation.test.ts +41 -0
  19. package/src/dex/aave-v3-stata-v2/aave-v3-stata-v2-gas-estimation.test.ts +41 -0
  20. package/src/dex/angle-staked-stable/angle-staked-stable-gas-estimation.test.ts +29 -0
  21. package/src/dex/angle-staked-stable/angle-staked-stable.ts +2 -1
  22. package/src/dex/angle-transmuter/angle-transmuter-gas-estimation.test.ts +41 -0
  23. package/src/dex/angle-transmuter/angle-transmuter.ts +0 -1
  24. package/src/dex/balancer-v1/balancer-v1-gas-estimation.test.ts +29 -0
  25. package/src/dex/balancer-v1/config.ts +2 -1
  26. package/src/dex/balancer-v2/balancer-v2-gas-estimation.test.ts +98 -0
  27. package/src/dex/balancer-v3/balancer-v3-gas-estimation.test.ts +30 -0
  28. package/src/dex/bancor/bancor-gas-estimation.test.ts +30 -0
  29. package/src/dex/bebop/bebop-gas-estimation.test.ts +30 -0
  30. package/src/dex/concentrator-arusd/concentrator-arusd-gas-estimation.test.ts +29 -0
  31. package/src/dex/curve-v1/curve-v1-gas-estimation.test.ts +29 -0
  32. package/src/dex/curve-v2/curve-v2-gas-estimation.test.ts +29 -0
  33. package/src/dex/fluid-dex/fluid-dex-gas-estimation.test.ts +29 -0
  34. package/src/dex/fx-protocol-rusd/fx-protocol-rusd-gas-estimation.test.ts +29 -0
  35. package/src/dex/hashflow/hashflow-gas-estimation.test.ts +30 -0
  36. package/src/dex/idle-dao/idle-dao--gas-estimation.test.ts +30 -0
  37. package/src/dex/lido/lido-gas-estimation.test.ts +29 -0
  38. package/src/dex/lite-psm/lite-psm-gas-estimation.test.ts +34 -0
  39. package/src/dex/maker-psm/maker-psm-gas-estimation.test.ts +34 -0
  40. package/src/dex/maverick-v1/maverick-v1-gas-estimation.test.ts +29 -0
  41. package/src/dex/maverick-v2/maverick-v2-gas-estimation.test.ts +29 -0
  42. package/src/dex/pancakeswap-v3/pancakeswap-v3-gas-estimation.test.ts +29 -0
  43. package/src/dex/polygon-migrator/polygon-migrator-gas-estimation.test.ts +41 -0
  44. package/src/dex/sky-converter/sky-converter-gas-estimation.test.ts +78 -0
  45. package/src/dex/solidly/solidly-gas-estimation.test.ts +29 -0
  46. package/src/dex/solidly-v3/solidly-v3-gas-estimation.test.ts +29 -0
  47. package/src/dex/spark/spark-gas-estimation.test.ts +29 -0
  48. package/src/dex/stader/stader-gas-estimation.test.ts +29 -0
  49. package/src/dex/stkgho/stkgho-gas-estimation.test.ts +29 -0
  50. package/src/dex/swaap-v2/swaap-v2-estimation.test.ts +29 -0
  51. package/src/dex/swell/swell-estimation.test.ts +29 -0
  52. package/src/dex/trader-joe-v2.1/trader-joe-v2.1-gas-estimation.test.ts +29 -0
  53. package/src/dex/uniswap-v2/uniswap-v2-gas-estimation.test.ts +98 -0
  54. package/src/dex/uniswap-v3/uniswap-v3-gas-estimation.test.ts +98 -0
  55. package/src/dex/usual/usual-gas-estimation.test.ts +54 -0
  56. package/src/dex/usual-pp/usual-pp-gas-estimation.test.ts +29 -0
  57. package/src/dex/weth/weth-gas-estimation.test.ts +42 -0
  58. package/src/dex/weth/weth.ts +3 -1
  59. package/src/dex/wombat/wombat-gas-estimation.test.ts +29 -0
  60. package/src/dex/wsteth/wsteth-gas-estimation.test.ts +41 -0
  61. package/src/dex/wusdm/wusdm-gas-estimation.test.ts +41 -0
  62. package/src/lib/pub-sub.ts +9 -5
  63. package/src/pricing-helper.ts +19 -11
  64. package/src/types.ts +1 -0
  65. package/tests/constants-e2e.ts +8 -0
  66. package/tests/tenderly-simulation-new.test.ts +151 -0
  67. package/tests/tenderly-simulation-new.ts +698 -0
  68. package/tests/token-storage-slots.json +532 -0
  69. package/tests/utils-e2e.ts +137 -1
@@ -0,0 +1,42 @@
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
+ import { ethers } from 'ethers';
8
+
9
+ describe('Weth Gas Estimation', () => {
10
+ const dexKey = 'Weth';
11
+ const network = Network.MAINNET;
12
+
13
+ describe('swapExactAmountIn', () => {
14
+ const ETH = Tokens[network]['ETH'];
15
+ const WETH = Tokens[network]['WETH'];
16
+ const amount = ethers.utils.parseEther('1').toBigInt();
17
+
18
+ it('wrap', async () => {
19
+ await testGasEstimation(
20
+ network,
21
+ ETH,
22
+ WETH,
23
+ amount,
24
+ SwapSide.SELL,
25
+ dexKey,
26
+ ContractMethodV6.swapExactAmountIn,
27
+ );
28
+ });
29
+
30
+ it('unwrap', async () => {
31
+ await testGasEstimation(
32
+ network,
33
+ WETH,
34
+ ETH,
35
+ amount,
36
+ SwapSide.SELL,
37
+ dexKey,
38
+ ContractMethodV6.swapExactAmountIn,
39
+ );
40
+ });
41
+ });
42
+ });
@@ -94,11 +94,13 @@ export class Weth
94
94
 
95
95
  if (!isWETHSwap) return null;
96
96
 
97
+ const gasCost = isETHAddress(srcToken.address) ? 6_500 : 9000;
98
+
97
99
  return [
98
100
  {
99
101
  prices: amounts,
100
102
  unit: this.unitPrice,
101
- gasCost: this.poolGasCost,
103
+ gasCost,
102
104
  exchange: this.dexKey,
103
105
  poolAddresses: [this.address],
104
106
  data: null,
@@ -0,0 +1,29 @@
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('Wombat Gas Estimation', () => {
9
+ const dexKey = 'Wombat';
10
+ const network = Network.MAINNET;
11
+
12
+ describe('swapExactAmountIn', () => {
13
+ const USDT = Tokens[network]['USDT'];
14
+ const USDC = Tokens[network]['USDC'];
15
+ const amount = 100000000n;
16
+
17
+ it('swapExactTokensForTokens', async () => {
18
+ await testGasEstimation(
19
+ network,
20
+ USDT,
21
+ USDC,
22
+ amount,
23
+ SwapSide.SELL,
24
+ dexKey,
25
+ ContractMethodV6.swapExactAmountIn,
26
+ );
27
+ });
28
+ });
29
+ });
@@ -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
+ });
@@ -37,7 +37,9 @@ export class ExpKeyValuePubSub {
37
37
 
38
38
  this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
39
39
  const decodedMsg = JSON.parse(msg) as KeyValuePubSubMsg;
40
- this.logger.info(`${this.logPrefix} Received msg: '${msg}'`);
40
+ this.logger.info(
41
+ `${this.logPrefix} Received msg: '${Object.keys(decodedMsg).length}'`,
42
+ );
41
43
  this.handleSubscription(decodedMsg);
42
44
  });
43
45
  }
@@ -47,7 +49,7 @@ export class ExpKeyValuePubSub {
47
49
  this.logger.info(
48
50
  `${this.logPrefix} Publishing msg: '${JSON.stringify({
49
51
  expiresAt,
50
- data,
52
+ data: Object.keys(data).length,
51
53
  })}'`,
52
54
  );
53
55
  this.dexHelper.cache.publish(
@@ -82,7 +84,9 @@ export class ExpKeyValuePubSub {
82
84
  const localValue = this.localCache.get<T>(key);
83
85
 
84
86
  this.logger.info(
85
- `${this.logPrefix} Getting and caching key: ${key}, localValue: ${localValue}`,
87
+ `${this.logPrefix} Getting and caching key: ${key}, localValue length: ${
88
+ localValue ? Object.keys(localValue).length : 0
89
+ }`,
86
90
  );
87
91
 
88
92
  if (localValue) {
@@ -309,7 +313,7 @@ export class NonExpSetPubSub {
309
313
  this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
310
314
  const decodedMsg = JSON.parse(msg) as SetPubSubMsg;
311
315
  this.logger.info(
312
- `${this.logPrefix} Received subscription msg: '${decodedMsg}'`,
316
+ `${this.logPrefix} Received subscription msg: '${decodedMsg.length}'`,
313
317
  );
314
318
  this.handleSubscription(decodedMsg);
315
319
  });
@@ -317,7 +321,7 @@ export class NonExpSetPubSub {
317
321
 
318
322
  publish(msg: SetPubSubMsg) {
319
323
  if (msg.length > 0) {
320
- this.logger.info(`${this.logPrefix} Publishing msg: '${msg}'`);
324
+ this.logger.info(`${this.logPrefix} Publishing msg: '${msg.length}'`);
321
325
  this.dexHelper.cache.publish(this.channel, JSON.stringify(msg));
322
326
  }
323
327
  }
@@ -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
+ });