@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.
- 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/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/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,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/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
|
+
});
|