@paraswap/dex-lib 4.1.7-pub-sub.2 → 4.1.7-pub-sub.4

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 (96) 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/dexalot/dexalot.d.ts +2 -9
  7. package/build/dex/dexalot/dexalot.js +18 -62
  8. package/build/dex/dexalot/dexalot.js.map +1 -1
  9. package/build/dex/dexalot/rate-fetcher.d.ts +19 -4
  10. package/build/dex/dexalot/rate-fetcher.js +112 -8
  11. package/build/dex/dexalot/rate-fetcher.js.map +1 -1
  12. package/build/dex/dexalot/types.d.ts +0 -1
  13. package/build/dex/generic-rfq/rate-fetcher.js +0 -12
  14. package/build/dex/generic-rfq/rate-fetcher.js.map +1 -1
  15. package/build/dex/hashflow/constants.d.ts +2 -2
  16. package/build/dex/hashflow/constants.js +2 -2
  17. package/build/dex/hashflow/hashflow.d.ts +1 -6
  18. package/build/dex/hashflow/hashflow.js +9 -34
  19. package/build/dex/hashflow/hashflow.js.map +1 -1
  20. package/build/dex/hashflow/rate-fetcher.d.ts +12 -2
  21. package/build/dex/hashflow/rate-fetcher.js +54 -6
  22. package/build/dex/hashflow/rate-fetcher.js.map +1 -1
  23. package/build/dex/hashflow/types.d.ts +0 -1
  24. package/build/dex/weth/weth.js +2 -1
  25. package/build/dex/weth/weth.js.map +1 -1
  26. package/build/lib/pub-sub.d.ts +0 -2
  27. package/build/lib/pub-sub.js +0 -12
  28. package/build/lib/pub-sub.js.map +1 -1
  29. package/build/pricing-helper.d.ts +1 -1
  30. package/build/pricing-helper.js +13 -9
  31. package/build/pricing-helper.js.map +1 -1
  32. package/build/types.d.ts +1 -0
  33. package/package.json +1 -1
  34. package/src/dex/aave-gsm/aave-gsm-gas-estimation.test.ts +32 -0
  35. package/src/dex/aave-v2/aave-v2-gas-estimation.test.ts +28 -0
  36. package/src/dex/aave-v3/aave-v3-gas-estimation.test.ts +66 -0
  37. package/src/dex/aave-v3-stata/aave-v3-stata-gas-estimation.test.ts +41 -0
  38. package/src/dex/aave-v3-stata-v2/aave-v3-stata-v2-gas-estimation.test.ts +41 -0
  39. package/src/dex/angle-staked-stable/angle-staked-stable-gas-estimation.test.ts +29 -0
  40. package/src/dex/angle-staked-stable/angle-staked-stable.ts +2 -1
  41. package/src/dex/angle-transmuter/angle-transmuter-gas-estimation.test.ts +41 -0
  42. package/src/dex/angle-transmuter/angle-transmuter.ts +0 -1
  43. package/src/dex/balancer-v1/balancer-v1-gas-estimation.test.ts +29 -0
  44. package/src/dex/balancer-v1/config.ts +2 -1
  45. package/src/dex/balancer-v2/balancer-v2-gas-estimation.test.ts +98 -0
  46. package/src/dex/balancer-v3/balancer-v3-gas-estimation.test.ts +30 -0
  47. package/src/dex/bancor/bancor-gas-estimation.test.ts +30 -0
  48. package/src/dex/bebop/bebop-gas-estimation.test.ts +30 -0
  49. package/src/dex/concentrator-arusd/concentrator-arusd-gas-estimation.test.ts +29 -0
  50. package/src/dex/curve-v1/curve-v1-gas-estimation.test.ts +29 -0
  51. package/src/dex/curve-v2/curve-v2-gas-estimation.test.ts +29 -0
  52. package/src/dex/dexalot/dexalot.ts +27 -127
  53. package/src/dex/dexalot/rate-fetcher.ts +219 -9
  54. package/src/dex/dexalot/types.ts +0 -1
  55. package/src/dex/fluid-dex/fluid-dex-gas-estimation.test.ts +29 -0
  56. package/src/dex/fx-protocol-rusd/fx-protocol-rusd-gas-estimation.test.ts +29 -0
  57. package/src/dex/generic-rfq/rate-fetcher.ts +0 -30
  58. package/src/dex/hashflow/constants.ts +2 -2
  59. package/src/dex/hashflow/hashflow-gas-estimation.test.ts +30 -0
  60. package/src/dex/hashflow/hashflow.ts +11 -67
  61. package/src/dex/hashflow/rate-fetcher.ts +106 -8
  62. package/src/dex/hashflow/types.ts +0 -1
  63. package/src/dex/idle-dao/idle-dao--gas-estimation.test.ts +30 -0
  64. package/src/dex/lido/lido-gas-estimation.test.ts +29 -0
  65. package/src/dex/lite-psm/lite-psm-gas-estimation.test.ts +34 -0
  66. package/src/dex/maker-psm/maker-psm-gas-estimation.test.ts +34 -0
  67. package/src/dex/maverick-v1/maverick-v1-gas-estimation.test.ts +29 -0
  68. package/src/dex/maverick-v2/maverick-v2-gas-estimation.test.ts +29 -0
  69. package/src/dex/pancakeswap-v3/pancakeswap-v3-gas-estimation.test.ts +29 -0
  70. package/src/dex/polygon-migrator/polygon-migrator-gas-estimation.test.ts +41 -0
  71. package/src/dex/sky-converter/sky-converter-gas-estimation.test.ts +78 -0
  72. package/src/dex/solidly/solidly-gas-estimation.test.ts +29 -0
  73. package/src/dex/solidly-v3/solidly-v3-gas-estimation.test.ts +29 -0
  74. package/src/dex/spark/spark-gas-estimation.test.ts +29 -0
  75. package/src/dex/stader/stader-gas-estimation.test.ts +29 -0
  76. package/src/dex/stkgho/stkgho-gas-estimation.test.ts +29 -0
  77. package/src/dex/swaap-v2/swaap-v2-estimation.test.ts +29 -0
  78. package/src/dex/swell/swell-estimation.test.ts +29 -0
  79. package/src/dex/trader-joe-v2.1/trader-joe-v2.1-gas-estimation.test.ts +29 -0
  80. package/src/dex/uniswap-v2/uniswap-v2-gas-estimation.test.ts +98 -0
  81. package/src/dex/uniswap-v3/uniswap-v3-gas-estimation.test.ts +98 -0
  82. package/src/dex/usual/usual-gas-estimation.test.ts +54 -0
  83. package/src/dex/usual-pp/usual-pp-gas-estimation.test.ts +29 -0
  84. package/src/dex/weth/weth-gas-estimation.test.ts +42 -0
  85. package/src/dex/weth/weth.ts +3 -1
  86. package/src/dex/wombat/wombat-gas-estimation.test.ts +29 -0
  87. package/src/dex/wsteth/wsteth-gas-estimation.test.ts +41 -0
  88. package/src/dex/wusdm/wusdm-gas-estimation.test.ts +41 -0
  89. package/src/lib/pub-sub.ts +0 -27
  90. package/src/pricing-helper.ts +19 -11
  91. package/src/types.ts +1 -0
  92. package/tests/constants-e2e.ts +8 -0
  93. package/tests/tenderly-simulation-new.test.ts +151 -0
  94. package/tests/tenderly-simulation-new.ts +698 -0
  95. package/tests/token-storage-slots.json +532 -0
  96. package/tests/utils-e2e.ts +137 -1
@@ -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
+ });
@@ -15,7 +15,6 @@ export class ExpKeyValuePubSub {
15
15
  channel: string;
16
16
  network: Network;
17
17
  localCache: NodeCache = new NodeCache();
18
- logPrefix = 'ExpKeyValuePubSub';
19
18
 
20
19
  logger: Logger;
21
20
 
@@ -37,21 +36,12 @@ export class ExpKeyValuePubSub {
37
36
 
38
37
  this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
39
38
  const decodedMsg = JSON.parse(msg) as KeyValuePubSubMsg;
40
- this.logger.info(
41
- `${this.logPrefix} Received msg: '${Object.keys(decodedMsg).length}'`,
42
- );
43
39
  this.handleSubscription(decodedMsg);
44
40
  });
45
41
  }
46
42
 
47
43
  publish(data: Record<string, unknown>, ttl: number) {
48
44
  const expiresAt = Math.round(Date.now() / 1000) + ttl;
49
- this.logger.info(
50
- `${this.logPrefix} Publishing msg: '${JSON.stringify({
51
- expiresAt,
52
- data: Object.keys(data).length,
53
- })}'`,
54
- );
55
45
  this.dexHelper.cache.publish(
56
46
  this.channel,
57
47
  JSON.stringify({ expiresAt, data }),
@@ -83,12 +73,6 @@ export class ExpKeyValuePubSub {
83
73
  async getAndCache<T>(key: string): Promise<T | null> {
84
74
  const localValue = this.localCache.get<T>(key);
85
75
 
86
- this.logger.info(
87
- `${this.logPrefix} Getting and caching key: ${key}, localValue length: ${
88
- localValue ? Object.keys(localValue).length : 0
89
- }`,
90
- );
91
-
92
76
  if (localValue) {
93
77
  return localValue;
94
78
  }
@@ -280,7 +264,6 @@ export class NonExpSetPubSub {
280
264
  channel: string;
281
265
  network: Network;
282
266
  set = new Set<string>();
283
- logPrefix = 'NonExpSetPubSub';
284
267
 
285
268
  logger: Logger;
286
269
 
@@ -296,10 +279,6 @@ export class NonExpSetPubSub {
296
279
  }
297
280
 
298
281
  async initializeAndSubscribe(initialSet: string[]) {
299
- this.logger.info(
300
- `${this.logPrefix} initializeAndSubscribe with ${initialSet}`,
301
- );
302
-
303
282
  for (const member of initialSet) {
304
283
  this.set.add(member);
305
284
  }
@@ -312,23 +291,17 @@ export class NonExpSetPubSub {
312
291
 
313
292
  this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
314
293
  const decodedMsg = JSON.parse(msg) as SetPubSubMsg;
315
- this.logger.info(
316
- `${this.logPrefix} Received subscription msg: '${decodedMsg.length}'`,
317
- );
318
294
  this.handleSubscription(decodedMsg);
319
295
  });
320
296
  }
321
297
 
322
298
  publish(msg: SetPubSubMsg) {
323
299
  if (msg.length > 0) {
324
- this.logger.info(`${this.logPrefix} Publishing msg: '${msg.length}'`);
325
300
  this.dexHelper.cache.publish(this.channel, JSON.stringify(msg));
326
301
  }
327
302
  }
328
303
 
329
304
  handleSubscription(set: SetPubSubMsg) {
330
- this.logger.info(`${this.logPrefix} Received subscription msg: '${set}'`);
331
-
332
305
  for (const key of set) {
333
306
  this.set.add(key);
334
307
  }
@@ -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
+ });