@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.
- package/build/dex/angle-staked-stable/angle-staked-stable.js +2 -1
- package/build/dex/angle-staked-stable/angle-staked-stable.js.map +1 -1
- package/build/dex/angle-transmuter/angle-transmuter.js.map +1 -1
- package/build/dex/balancer-v1/config.js +2 -1
- package/build/dex/balancer-v1/config.js.map +1 -1
- package/build/dex/weth/weth.js +2 -1
- package/build/dex/weth/weth.js.map +1 -1
- package/build/lib/pub-sub.js +5 -5
- package/build/lib/pub-sub.js.map +1 -1
- package/build/pricing-helper.d.ts +1 -1
- package/build/pricing-helper.js +13 -9
- package/build/pricing-helper.js.map +1 -1
- package/build/types.d.ts +1 -0
- package/package.json +1 -1
- package/src/dex/aave-gsm/aave-gsm-gas-estimation.test.ts +32 -0
- package/src/dex/aave-v2/aave-v2-gas-estimation.test.ts +28 -0
- package/src/dex/aave-v3/aave-v3-gas-estimation.test.ts +66 -0
- package/src/dex/aave-v3-stata/aave-v3-stata-gas-estimation.test.ts +41 -0
- package/src/dex/aave-v3-stata-v2/aave-v3-stata-v2-gas-estimation.test.ts +41 -0
- package/src/dex/angle-staked-stable/angle-staked-stable-gas-estimation.test.ts +29 -0
- package/src/dex/angle-staked-stable/angle-staked-stable.ts +2 -1
- package/src/dex/angle-transmuter/angle-transmuter-gas-estimation.test.ts +41 -0
- package/src/dex/angle-transmuter/angle-transmuter.ts +0 -1
- package/src/dex/balancer-v1/balancer-v1-gas-estimation.test.ts +29 -0
- package/src/dex/balancer-v1/config.ts +2 -1
- package/src/dex/balancer-v2/balancer-v2-gas-estimation.test.ts +98 -0
- package/src/dex/balancer-v3/balancer-v3-gas-estimation.test.ts +30 -0
- package/src/dex/bancor/bancor-gas-estimation.test.ts +30 -0
- package/src/dex/bebop/bebop-gas-estimation.test.ts +30 -0
- package/src/dex/concentrator-arusd/concentrator-arusd-gas-estimation.test.ts +29 -0
- package/src/dex/curve-v1/curve-v1-gas-estimation.test.ts +29 -0
- package/src/dex/curve-v2/curve-v2-gas-estimation.test.ts +29 -0
- package/src/dex/fluid-dex/fluid-dex-gas-estimation.test.ts +29 -0
- package/src/dex/fx-protocol-rusd/fx-protocol-rusd-gas-estimation.test.ts +29 -0
- package/src/dex/hashflow/hashflow-gas-estimation.test.ts +30 -0
- package/src/dex/idle-dao/idle-dao--gas-estimation.test.ts +30 -0
- package/src/dex/lido/lido-gas-estimation.test.ts +29 -0
- package/src/dex/lite-psm/lite-psm-gas-estimation.test.ts +34 -0
- package/src/dex/maker-psm/maker-psm-gas-estimation.test.ts +34 -0
- package/src/dex/maverick-v1/maverick-v1-gas-estimation.test.ts +29 -0
- package/src/dex/maverick-v2/maverick-v2-gas-estimation.test.ts +29 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3-gas-estimation.test.ts +29 -0
- package/src/dex/polygon-migrator/polygon-migrator-gas-estimation.test.ts +41 -0
- package/src/dex/sky-converter/sky-converter-gas-estimation.test.ts +78 -0
- package/src/dex/solidly/solidly-gas-estimation.test.ts +29 -0
- package/src/dex/solidly-v3/solidly-v3-gas-estimation.test.ts +29 -0
- package/src/dex/spark/spark-gas-estimation.test.ts +29 -0
- package/src/dex/stader/stader-gas-estimation.test.ts +29 -0
- package/src/dex/stkgho/stkgho-gas-estimation.test.ts +29 -0
- package/src/dex/swaap-v2/swaap-v2-estimation.test.ts +29 -0
- package/src/dex/swell/swell-estimation.test.ts +29 -0
- package/src/dex/trader-joe-v2.1/trader-joe-v2.1-gas-estimation.test.ts +29 -0
- package/src/dex/uniswap-v2/uniswap-v2-gas-estimation.test.ts +98 -0
- package/src/dex/uniswap-v3/uniswap-v3-gas-estimation.test.ts +98 -0
- package/src/dex/usual/usual-gas-estimation.test.ts +54 -0
- package/src/dex/usual-pp/usual-pp-gas-estimation.test.ts +29 -0
- package/src/dex/weth/weth-gas-estimation.test.ts +42 -0
- package/src/dex/weth/weth.ts +3 -1
- package/src/dex/wombat/wombat-gas-estimation.test.ts +29 -0
- package/src/dex/wsteth/wsteth-gas-estimation.test.ts +41 -0
- package/src/dex/wusdm/wusdm-gas-estimation.test.ts +41 -0
- package/src/lib/pub-sub.ts +9 -5
- package/src/pricing-helper.ts +19 -11
- package/src/types.ts +1 -0
- package/tests/constants-e2e.ts +8 -0
- package/tests/tenderly-simulation-new.test.ts +151 -0
- package/tests/tenderly-simulation-new.ts +698 -0
- package/tests/token-storage-slots.json +532 -0
- 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
|
+
});
|
package/src/dex/weth/weth.ts
CHANGED
|
@@ -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
|
|
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
|
+
});
|
package/src/lib/pub-sub.ts
CHANGED
|
@@ -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(
|
|
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: ${
|
|
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
|
}
|
package/src/pricing-helper.ts
CHANGED
|
@@ -191,7 +191,7 @@ export class PricingHelper {
|
|
|
191
191
|
srcDexFee: 0,
|
|
192
192
|
destDexFee: 0,
|
|
193
193
|
},
|
|
194
|
-
|
|
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 || !
|
|
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
|
|
238
|
+
const calldataGasCost =
|
|
239
|
+
dexInstance.getCalldataGasCost(pp);
|
|
239
240
|
if (
|
|
240
241
|
typeof pp.gasCost === 'number' &&
|
|
241
|
-
|
|
242
|
+
pp.gasCost !== 0 &&
|
|
243
|
+
typeof calldataGasCost === 'number'
|
|
242
244
|
) {
|
|
243
245
|
pp.gasCost += Math.ceil(
|
|
244
|
-
|
|
246
|
+
rollupL1CalldataCostToL2GasCost(calldataGasCost),
|
|
245
247
|
);
|
|
246
248
|
} else if (
|
|
247
249
|
typeof pp.gasCost !== 'number' &&
|
|
248
|
-
typeof
|
|
250
|
+
typeof calldataGasCost !== 'number'
|
|
249
251
|
) {
|
|
250
|
-
if (pp.gasCost.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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
package/tests/constants-e2e.ts
CHANGED
|
@@ -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
|
+
});
|