@dhedge/v2-sdk 2.1.8 → 2.2.1
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/README.md +404 -54
- package/dist/config.d.ts +13 -2
- package/dist/entities/pool.d.ts +25 -86
- package/dist/entities/utils.d.ts +15 -0
- package/dist/services/hyperliquid/index.d.ts +22 -0
- package/dist/services/kyberSwap/index.d.ts +1 -1
- package/dist/services/ondo/index.d.ts +5 -0
- package/dist/services/oneInch/index.d.ts +1 -1
- package/dist/services/toros/easySwapper.d.ts +14 -0
- package/dist/services/toros/swapData.d.ts +5 -5
- package/dist/services/uniswap/V3Liquidity.d.ts +2 -2
- package/dist/services/velodrome/liquidity.d.ts +3 -0
- package/dist/test/constants.d.ts +48 -3
- package/dist/test/utils/testingHelper.d.ts +4 -0
- package/dist/types.d.ts +21 -5
- package/dist/utils/contract.d.ts +20 -0
- package/dist/v2-sdk.cjs.development.js +5133 -6641
- package/dist/v2-sdk.cjs.development.js.map +1 -1
- package/dist/v2-sdk.cjs.production.min.js +1 -1
- package/dist/v2-sdk.cjs.production.min.js.map +1 -1
- package/dist/v2-sdk.esm.js +5138 -6641
- package/dist/v2-sdk.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/PoolFactory.json +414 -204
- package/src/abi/PoolLogic.json +160 -134
- package/src/abi/ondo/IOndoGMSwap.json +30 -0
- package/src/config.ts +15 -9
- package/src/entities/pool.ts +56 -253
- package/src/entities/utils.ts +15 -0
- package/src/services/hyperliquid/index.ts +22 -0
- package/src/services/kyberSwap/index.ts +5 -3
- package/src/services/ondo/index.ts +142 -0
- package/src/services/oneInch/index.ts +5 -4
- package/src/services/toros/completeWithdrawal.ts +57 -40
- package/src/services/toros/easySwapper.ts +15 -1
- package/src/services/toros/initWithdrawal.ts +39 -31
- package/src/services/toros/swapData.ts +45 -131
- package/src/services/uniswap/V3Liquidity.ts +3 -24
- package/src/services/velodrome/liquidity.ts +3 -0
- package/src/test/aave.test.ts +99 -70
- package/src/test/aerodrome.test.ts +53 -24
- package/src/test/aerodromeCL.test.ts +64 -30
- package/src/test/arrakis.test.ts +23 -35
- package/src/test/balancer.test.ts +114 -106
- package/src/test/compoundV3.test.ts +45 -29
- package/src/test/constants.ts +56 -11
- package/src/test/cowswap.test.ts +33 -35
- package/src/test/dhedge.test.ts +45 -12
- package/src/test/flatmoney.test.ts +25 -39
- package/src/test/fluid.test.ts +33 -24
- package/src/test/hyperliquid.onchain.test.ts +131 -0
- package/src/test/kyberSwap.test.ts +37 -16
- package/src/test/lyra.test.ts +159 -150
- package/src/test/odos.test.ts +2 -2
- package/src/test/ondo.onchain.test.ts +132 -0
- package/src/test/oneInch.test.ts +36 -22
- package/src/test/pancakeCL.test.ts +72 -31
- package/src/test/pendle.test.ts +94 -54
- package/src/test/{pendleMint.test.ts → pendleMint.onchain.test.ts} +22 -8
- package/src/test/pool.test.ts +152 -95
- package/src/test/toros.onchain.test.ts +92 -0
- package/src/test/toros.test.ts +74 -20
- package/src/test/torosLimitOrder.test.ts +87 -42
- package/src/test/uniswap.test.ts +77 -128
- package/src/test/utils/testingHelper.ts +120 -0
- package/src/test/velodrome.test.ts +126 -92
- package/src/test/velodromeCL.test.ts +43 -31
- package/src/test/velodromeV2.test.ts +153 -95
- package/src/types.ts +22 -6
- package/src/utils/contract.ts +20 -0
- package/dist/services/futures/constants.d.ts +0 -1
- package/dist/services/futures/index.d.ts +0 -2
- package/dist/services/futures/margin.d.ts +0 -2
- package/dist/services/futures/trade.d.ts +0 -3
- package/dist/services/ramses/vesting.d.ts +0 -4
- package/dist/services/uniswap/V3Trade.d.ts +0 -3
- package/dist/test/utils/futures.d.ts +0 -2
- package/src/abi/IRamsesNonfungiblePositionManager.json +0 -486
- package/src/abi/ISynthetiXFuturesMarketV2.json +0 -531
- package/src/abi/ISynthetix.json +0 -139
- package/src/abi/IUniswapV3Quoter.json +0 -195
- package/src/abi/IUniswapV3Router.json +0 -221
- package/src/abi/IXRam.json +0 -99
- package/src/services/futures/constants.ts +0 -1
- package/src/services/futures/index.ts +0 -2
- package/src/services/futures/margin.ts +0 -10
- package/src/services/futures/trade.ts +0 -32
- package/src/services/ramses/vesting.ts +0 -24
- package/src/services/uniswap/V3Trade.ts +0 -46
- package/src/test/futures.test.ts +0 -51
- package/src/test/hyperliquid.test.ts +0 -107
- package/src/test/ramses.test.ts +0 -190
- package/src/test/ramsesCL.test.ts +0 -155
- package/src/test/synthetix.test.ts +0 -36
- package/src/test/utils/futures.ts +0 -14
package/src/test/arrakis.test.ts
CHANGED
|
@@ -13,15 +13,17 @@ import {
|
|
|
13
13
|
} from "./utils/testingHelper";
|
|
14
14
|
import { allowanceDelta, balanceDelta } from "./utils/token";
|
|
15
15
|
|
|
16
|
-
//const network = Network.OPTIMISM;
|
|
17
|
-
const network = Network.POLYGON;
|
|
18
|
-
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
19
|
-
const WETH = CONTRACT_ADDRESS[network].WETH;
|
|
20
|
-
jest.setTimeout(100000);
|
|
21
|
-
|
|
22
16
|
const testArrakis = ({ wallet, network, provider }: TestingRunParams) => {
|
|
17
|
+
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
18
|
+
const WETH = CONTRACT_ADDRESS[network].WETH;
|
|
19
|
+
const ARRAKIS_USDC_WETH_GAUGE =
|
|
20
|
+
CONTRACT_ADDRESS[network].ARRAKIS_USDC_WETH_GAUGE;
|
|
21
|
+
const ARRAKIS_USDC_WETH_LP = CONTRACT_ADDRESS[network].ARRAKIS_USDC_WETH_LP;
|
|
22
|
+
const WMATIC = CONTRACT_ADDRESS[network].WMATIC;
|
|
23
|
+
|
|
23
24
|
let dhedge: Dhedge;
|
|
24
25
|
let pool: Pool;
|
|
26
|
+
jest.setTimeout(100000);
|
|
25
27
|
|
|
26
28
|
describe("pool", () => {
|
|
27
29
|
beforeAll(async () => {
|
|
@@ -42,16 +44,10 @@ const testArrakis = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
42
44
|
});
|
|
43
45
|
|
|
44
46
|
const newAssets: AssetEnabled[] = [
|
|
45
|
-
{ asset:
|
|
46
|
-
{ asset:
|
|
47
|
-
{
|
|
48
|
-
|
|
49
|
-
isDeposit: false
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
asset: CONTRACT_ADDRESS[network].WMATIC, // reward token
|
|
53
|
-
isDeposit: false
|
|
54
|
-
},
|
|
47
|
+
{ asset: USDC, isDeposit: true },
|
|
48
|
+
{ asset: WETH, isDeposit: true },
|
|
49
|
+
{ asset: ARRAKIS_USDC_WETH_GAUGE, isDeposit: false },
|
|
50
|
+
{ asset: WMATIC, isDeposit: false }, // reward token
|
|
55
51
|
{
|
|
56
52
|
asset: CONTRACT_ADDRESS[network].uniswapV3.nonfungiblePositionManager,
|
|
57
53
|
isDeposit: false
|
|
@@ -70,7 +66,7 @@ const testArrakis = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
70
66
|
routerAddress[network].arrakis!,
|
|
71
67
|
pool.signer
|
|
72
68
|
);
|
|
73
|
-
|
|
69
|
+
expect(usdcAllowanceDelta.gt(0)).toBe(true);
|
|
74
70
|
await wait(5);
|
|
75
71
|
});
|
|
76
72
|
|
|
@@ -82,7 +78,7 @@ const testArrakis = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
82
78
|
routerAddress[network].arrakis!,
|
|
83
79
|
pool.signer
|
|
84
80
|
);
|
|
85
|
-
|
|
81
|
+
expect(wethAllowanceDelta.gt(0)).toBe(true);
|
|
86
82
|
});
|
|
87
83
|
|
|
88
84
|
it("should add liquidity and stake in an WETH/USDC Arrakis pool", async () => {
|
|
@@ -90,45 +86,37 @@ const testArrakis = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
90
86
|
const wethBalance = await pool.utils.getBalance(WETH, pool.address);
|
|
91
87
|
await pool.increaseLiquidity(
|
|
92
88
|
Dapp.ARRAKIS,
|
|
93
|
-
|
|
89
|
+
ARRAKIS_USDC_WETH_GAUGE,
|
|
94
90
|
usdcBalance,
|
|
95
91
|
wethBalance
|
|
96
92
|
);
|
|
97
93
|
const lpBalanceDelta = await balanceDelta(
|
|
98
94
|
pool.address,
|
|
99
|
-
|
|
95
|
+
ARRAKIS_USDC_WETH_LP,
|
|
100
96
|
pool.signer
|
|
101
97
|
);
|
|
102
|
-
expect(lpBalanceDelta.gt(0));
|
|
98
|
+
expect(lpBalanceDelta.gt(0)).toBe(true);
|
|
103
99
|
});
|
|
104
100
|
|
|
105
101
|
it("approves unlimited LP staking Token before on Arrakis", async () => {
|
|
106
|
-
await pool.approve(
|
|
107
|
-
Dapp.ARRAKIS,
|
|
108
|
-
CONTRACT_ADDRESS[network].ARRAKIS_USDC_WETH_GAUGE,
|
|
109
|
-
MAX_AMOUNT
|
|
110
|
-
);
|
|
102
|
+
await pool.approve(Dapp.ARRAKIS, ARRAKIS_USDC_WETH_GAUGE, MAX_AMOUNT);
|
|
111
103
|
const gaugeAllowanceDelta = await allowanceDelta(
|
|
112
104
|
pool.address,
|
|
113
|
-
|
|
105
|
+
ARRAKIS_USDC_WETH_GAUGE,
|
|
114
106
|
routerAddress[network].arrakis!,
|
|
115
107
|
pool.signer
|
|
116
108
|
);
|
|
117
|
-
|
|
109
|
+
expect(gaugeAllowanceDelta.gt(0)).toBe(true);
|
|
118
110
|
});
|
|
119
111
|
|
|
120
112
|
it("should remove liquidity from an existing pool ", async () => {
|
|
121
|
-
await pool.decreaseLiquidity(
|
|
122
|
-
Dapp.ARRAKIS,
|
|
123
|
-
CONTRACT_ADDRESS[network].ARRAKIS_USDC_WETH_GAUGE,
|
|
124
|
-
100
|
|
125
|
-
);
|
|
113
|
+
await pool.decreaseLiquidity(Dapp.ARRAKIS, ARRAKIS_USDC_WETH_GAUGE, 100);
|
|
126
114
|
const wethBalanceDelta = await balanceDelta(
|
|
127
115
|
pool.address,
|
|
128
|
-
|
|
116
|
+
WETH,
|
|
129
117
|
pool.signer
|
|
130
118
|
);
|
|
131
|
-
expect(wethBalanceDelta.gt(0));
|
|
119
|
+
expect(wethBalanceDelta.gt(0)).toBe(true);
|
|
132
120
|
});
|
|
133
121
|
});
|
|
134
122
|
};
|
|
@@ -4,123 +4,131 @@ import { Dhedge, Pool } from "..";
|
|
|
4
4
|
import { routerAddress } from "../config";
|
|
5
5
|
import { Dapp, Network } from "../types";
|
|
6
6
|
import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
|
|
7
|
+
import {
|
|
8
|
+
TestingRunParams,
|
|
9
|
+
testingHelper
|
|
10
|
+
} from "./utils/testingHelper";
|
|
7
11
|
import { allowanceDelta, balanceDelta } from "./utils/token";
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
const testBalancer = ({ wallet, network }: TestingRunParams) => {
|
|
14
|
+
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
15
|
+
const WETH = CONTRACT_ADDRESS[network].WETH;
|
|
16
|
+
const WSTETH = CONTRACT_ADDRESS[network].WSTETH;
|
|
17
|
+
const BALANCER_POOL = CONTRACT_ADDRESS[network].BALANCER_WSTETH_WETH_POOL;
|
|
18
|
+
const BLANCER_GAUGE = CONTRACT_ADDRESS[network].BALANCER_WSTETH_WETH_GAUGE;
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const WSTETH = CONTRACT_ADDRESS[network].WSTETH;
|
|
15
|
-
const BALANCER_POOL = CONTRACT_ADDRESS[network].BALANCER_WSTETH_WETH_POOL;
|
|
16
|
-
const BLANCER_GAUGE = CONTRACT_ADDRESS[network].BALANCER_WSTETH_WETH_GAUGE;
|
|
20
|
+
let dhedge: Dhedge;
|
|
21
|
+
let pool: Pool;
|
|
22
|
+
jest.setTimeout(100000);
|
|
17
23
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
describe(`pool on ${network}`, () => {
|
|
25
|
+
beforeAll(async () => {
|
|
26
|
+
dhedge = new Dhedge(wallet, network);
|
|
27
|
+
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
28
|
+
await pool.approve(Dapp.ONEINCH, USDC, MAX_AMOUNT);
|
|
29
|
+
await pool.trade(Dapp.ONEINCH, USDC, WETH, "1000000", 0.5);
|
|
30
|
+
await pool.trade(Dapp.ONEINCH, USDC, WSTETH, "1000000", 0.5);
|
|
31
|
+
});
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
it("approves unlimited stWETH on Balancer", async () => {
|
|
34
|
+
await pool.approve(Dapp.BALANCER, WSTETH, MAX_AMOUNT);
|
|
35
|
+
const stWETHAllowanceDelta = await allowanceDelta(
|
|
36
|
+
pool.address,
|
|
37
|
+
WSTETH,
|
|
38
|
+
routerAddress[network].balancer!,
|
|
39
|
+
pool.signer
|
|
40
|
+
);
|
|
41
|
+
expect(stWETHAllowanceDelta.gt(0)).toBe(true);
|
|
42
|
+
});
|
|
30
43
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
it("approves unlimited WETH on Balancer", async () => {
|
|
45
|
+
await pool.approve(Dapp.BALANCER, WETH, MAX_AMOUNT);
|
|
46
|
+
const wethAllowanceDelta = await allowanceDelta(
|
|
47
|
+
pool.address,
|
|
48
|
+
WETH,
|
|
49
|
+
routerAddress[network].balancer!,
|
|
50
|
+
pool.signer
|
|
51
|
+
);
|
|
52
|
+
expect(wethAllowanceDelta.gt(0)).toBe(true);
|
|
53
|
+
});
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
pool.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
it("should add liquidity in a Balancer pool", async () => {
|
|
56
|
+
const wstETHBalance = await pool.utils.getBalance(WSTETH, pool.address);
|
|
57
|
+
const wethBalance = await pool.utils.getBalance(WETH, pool.address);
|
|
58
|
+
await pool.joinBalancerPool(
|
|
59
|
+
"0x36bf227d6bac96e2ab1ebb5492ecec69c691943f000200000000000000000316", //wstETH-WETH on Arbitrum
|
|
60
|
+
[WSTETH, WETH],
|
|
61
|
+
[wstETHBalance.toString(), wethBalance.toString()]
|
|
62
|
+
);
|
|
63
|
+
const lpBalanceDelta = await balanceDelta(
|
|
64
|
+
pool.address,
|
|
65
|
+
BALANCER_POOL,
|
|
66
|
+
pool.signer
|
|
67
|
+
);
|
|
68
|
+
expect(lpBalanceDelta.gt(0)).toBe(true);
|
|
69
|
+
});
|
|
52
70
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
BALANCER_POOL,
|
|
64
|
-
pool.signer
|
|
65
|
-
);
|
|
66
|
-
expect(lpBalanceDelta.gt(0));
|
|
67
|
-
});
|
|
71
|
+
it("approves unlimited LP Token on Balancer Vault", async () => {
|
|
72
|
+
await pool.approveSpender(BLANCER_GAUGE, BALANCER_POOL, MAX_AMOUNT);
|
|
73
|
+
const gaugeAllowanceDelta = await allowanceDelta(
|
|
74
|
+
pool.address,
|
|
75
|
+
BALANCER_POOL,
|
|
76
|
+
BLANCER_GAUGE,
|
|
77
|
+
pool.signer
|
|
78
|
+
);
|
|
79
|
+
expect(gaugeAllowanceDelta.gt(0)).toBe(true);
|
|
80
|
+
});
|
|
68
81
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
BLANCER_GAUGE,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
it("stakes LP tokens in Balancer vault", async () => {
|
|
83
|
+
const lpTokenBalance = await pool.utils.getBalance(
|
|
84
|
+
BALANCER_POOL,
|
|
85
|
+
pool.address
|
|
86
|
+
);
|
|
87
|
+
await pool.stakeInGauge(Dapp.BALANCER, BLANCER_GAUGE, lpTokenBalance);
|
|
88
|
+
const lpBalanceDelta = await balanceDelta(
|
|
89
|
+
pool.address,
|
|
90
|
+
BALANCER_POOL,
|
|
91
|
+
pool.signer
|
|
92
|
+
);
|
|
93
|
+
expect(lpBalanceDelta.lt(0)).toBe(true);
|
|
94
|
+
});
|
|
79
95
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
96
|
+
it("unstakes LP tokens from Balancer vault", async () => {
|
|
97
|
+
const vaultTokenBalance = await pool.utils.getBalance(
|
|
98
|
+
BLANCER_GAUGE,
|
|
99
|
+
pool.address
|
|
100
|
+
);
|
|
101
|
+
await pool.unstakeFromGauge(BLANCER_GAUGE, vaultTokenBalance);
|
|
102
|
+
const lpBalanceDelta = await balanceDelta(
|
|
103
|
+
pool.address,
|
|
104
|
+
BALANCER_POOL,
|
|
105
|
+
pool.signer
|
|
106
|
+
);
|
|
107
|
+
expect(lpBalanceDelta.gt(0)).toBe(true);
|
|
108
|
+
});
|
|
93
109
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
it("should remove liquidity from an Balancer pool ", async () => {
|
|
111
|
+
const lpTokenBalance = await pool.utils.getBalance(
|
|
112
|
+
BALANCER_POOL,
|
|
113
|
+
pool.address
|
|
114
|
+
);
|
|
115
|
+
await pool.approve(Dapp.BALANCER, BALANCER_POOL, MAX_AMOUNT);
|
|
116
|
+
await pool.exitBalancerPool(
|
|
117
|
+
"0x36bf227d6bac96e2ab1ebb5492ecec69c691943f000200000000000000000316",
|
|
118
|
+
[WSTETH, WETH],
|
|
119
|
+
lpTokenBalance
|
|
120
|
+
);
|
|
121
|
+
const wethBalanceDelta = await balanceDelta(
|
|
122
|
+
pool.address,
|
|
123
|
+
WETH,
|
|
124
|
+
pool.signer
|
|
125
|
+
);
|
|
126
|
+
expect(wethBalanceDelta.gt(0)).toBe(true);
|
|
127
|
+
});
|
|
106
128
|
});
|
|
129
|
+
};
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
pool.address
|
|
112
|
-
);
|
|
113
|
-
await pool.approve(Dapp.BALANCER, BALANCER_POOL, MAX_AMOUNT);
|
|
114
|
-
await pool.exitBalancerPool(
|
|
115
|
-
"0x36bf227d6bac96e2ab1ebb5492ecec69c691943f000200000000000000000316",
|
|
116
|
-
[WSTETH, WETH],
|
|
117
|
-
lpTokenBalance
|
|
118
|
-
);
|
|
119
|
-
const wethBalanceDelta = await balanceDelta(
|
|
120
|
-
pool.address,
|
|
121
|
-
CONTRACT_ADDRESS[network].WETH,
|
|
122
|
-
pool.signer
|
|
123
|
-
);
|
|
124
|
-
expect(wethBalanceDelta.gt(0));
|
|
125
|
-
});
|
|
131
|
+
testingHelper({
|
|
132
|
+
network: Network.ARBITRUM,
|
|
133
|
+
testingRun: testBalancer
|
|
126
134
|
});
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
import BigNumber from "bignumber.js";
|
|
4
|
+
import { ethers } from "ethers";
|
|
4
5
|
import { Dhedge, Pool } from "..";
|
|
5
|
-
import {
|
|
6
|
+
import { Network } from "../types";
|
|
6
7
|
import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
|
|
7
8
|
import {
|
|
8
9
|
TestingRunParams,
|
|
9
10
|
beforeAfterReset,
|
|
10
11
|
setWETHAmount,
|
|
12
|
+
setChainlinkTimeout,
|
|
13
|
+
fixOracleAggregatorStaleness,
|
|
14
|
+
runWithImpersonateAccount,
|
|
11
15
|
testingHelper
|
|
12
16
|
} from "./utils/testingHelper";
|
|
13
|
-
import {
|
|
14
|
-
import { getWalletData } from "./wallet";
|
|
17
|
+
import { balanceDelta } from "./utils/token";
|
|
15
18
|
|
|
16
|
-
const testCompoundV3 = ({ network, provider }: TestingRunParams) => {
|
|
19
|
+
const testCompoundV3 = ({ wallet, network, provider }: TestingRunParams) => {
|
|
17
20
|
const WETH = CONTRACT_ADDRESS[network].WETH;
|
|
18
21
|
const COMPOUNDV3_WETH = CONTRACT_ADDRESS[network].COMPOUNDV3_WETH;
|
|
19
22
|
|
|
@@ -23,14 +26,13 @@ const testCompoundV3 = ({ network, provider }: TestingRunParams) => {
|
|
|
23
26
|
|
|
24
27
|
describe(`[${network}] compound V3 tests`, () => {
|
|
25
28
|
beforeAll(async () => {
|
|
26
|
-
const { wallet } = getWalletData(network);
|
|
27
|
-
// top up ETH (gas)
|
|
28
29
|
await provider.send("hardhat_setBalance", [
|
|
29
30
|
wallet.address,
|
|
30
|
-
"
|
|
31
|
+
"0x10000000000000000"
|
|
31
32
|
]);
|
|
32
33
|
dhedge = new Dhedge(wallet, network);
|
|
33
34
|
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
35
|
+
|
|
34
36
|
await setWETHAmount({
|
|
35
37
|
amount: new BigNumber(1e18).toFixed(0),
|
|
36
38
|
userAddress: pool.address,
|
|
@@ -38,29 +40,41 @@ const testCompoundV3 = ({ network, provider }: TestingRunParams) => {
|
|
|
38
40
|
provider
|
|
39
41
|
});
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
// Extend oracle timeouts so price feeds work on fork
|
|
44
|
+
await setChainlinkTimeout({ pool, provider }, 86400 * 365);
|
|
45
|
+
await fixOracleAggregatorStaleness({ pool, provider });
|
|
46
|
+
|
|
47
|
+
// Impersonate pool manager to set trader and configure assets
|
|
48
|
+
await runWithImpersonateAccount(
|
|
49
|
+
{ provider, account: await pool.managerLogic.manager() },
|
|
50
|
+
async ({ signer }) => {
|
|
51
|
+
await pool.managerLogic.connect(signer).setTrader(wallet.address);
|
|
52
|
+
const newAssets = [
|
|
53
|
+
[WETH, true],
|
|
54
|
+
[COMPOUNDV3_WETH, false]
|
|
55
|
+
];
|
|
56
|
+
await pool.managerLogic.connect(signer).changeAssets(newAssets, []);
|
|
46
57
|
}
|
|
47
|
-
|
|
48
|
-
await pool.managerLogic.changeAssets(newAssets, []);
|
|
58
|
+
);
|
|
49
59
|
});
|
|
50
60
|
beforeAfterReset({ beforeAll, afterAll, provider });
|
|
51
61
|
|
|
52
62
|
it("approves unlimited WETH for cWETHv3 market", async () => {
|
|
53
|
-
await pool.approveSpender(COMPOUNDV3_WETH, WETH, MAX_AMOUNT);
|
|
54
|
-
|
|
55
|
-
|
|
63
|
+
const tx = await pool.approveSpender(COMPOUNDV3_WETH, WETH, MAX_AMOUNT);
|
|
64
|
+
await tx.wait(1);
|
|
65
|
+
const iERC20 = new ethers.Contract(
|
|
56
66
|
WETH,
|
|
57
|
-
|
|
67
|
+
["function allowance(address,address) view returns (uint256)"],
|
|
58
68
|
pool.signer
|
|
59
69
|
);
|
|
60
|
-
await
|
|
70
|
+
const wethAllowance = await iERC20.allowance(
|
|
71
|
+
pool.address,
|
|
72
|
+
COMPOUNDV3_WETH
|
|
73
|
+
);
|
|
74
|
+
expect(wethAllowance.gt(0)).toBe(true);
|
|
61
75
|
});
|
|
62
76
|
|
|
63
|
-
it("lends WETH to
|
|
77
|
+
it("lends WETH to CompoundV3 WETH market", async () => {
|
|
64
78
|
const wethBalance = await pool.utils.getBalance(WETH, pool.address);
|
|
65
79
|
await pool.lendCompoundV3(COMPOUNDV3_WETH, WETH, wethBalance);
|
|
66
80
|
|
|
@@ -69,20 +83,22 @@ const testCompoundV3 = ({ network, provider }: TestingRunParams) => {
|
|
|
69
83
|
COMPOUNDV3_WETH,
|
|
70
84
|
pool.signer
|
|
71
85
|
);
|
|
72
|
-
expect(cWETHTokenDelta.gt(0));
|
|
86
|
+
expect(cWETHTokenDelta.gt(0)).toBe(true);
|
|
73
87
|
});
|
|
74
88
|
|
|
75
|
-
it("
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
89
|
+
it("withdraws WETH from CompoundV3 WETH market", async () => {
|
|
90
|
+
// Withdraw half of the originally supplied amount
|
|
91
|
+
const halfWeth = new BigNumber(1e18).div(2).toFixed(0);
|
|
92
|
+
await pool.withdrawCompoundV3(COMPOUNDV3_WETH, WETH, halfWeth);
|
|
93
|
+
const wethBalanceDelta = await balanceDelta(
|
|
94
|
+
pool.address,
|
|
95
|
+
WETH,
|
|
96
|
+
pool.signer
|
|
79
97
|
);
|
|
80
|
-
|
|
81
|
-
const wethBalance = await balanceDelta(pool.address, WETH, pool.signer);
|
|
82
|
-
expect(wethBalance.gt(0));
|
|
98
|
+
expect(wethBalanceDelta.gt(0)).toBe(true);
|
|
83
99
|
});
|
|
84
100
|
|
|
85
|
-
it("harvests rewards from
|
|
101
|
+
it("harvests rewards from CompoundV3", async () => {
|
|
86
102
|
await pool.harvestCompoundV3Rewards(COMPOUNDV3_WETH);
|
|
87
103
|
});
|
|
88
104
|
});
|
package/src/test/constants.ts
CHANGED
|
@@ -35,8 +35,6 @@ export const SUSD = "0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9";
|
|
|
35
35
|
export const SETH = "0xE405de8F52ba7559f9df3C368500B6E6ae6Cee49";
|
|
36
36
|
export const ARRAKIS_USDC_WETH_GAUGE =
|
|
37
37
|
"0xb8888ea29e2f70ad62a3b69b1a1342720612a00d";
|
|
38
|
-
export const KWENTA_ETH_PERP = "0xf86048dff23cf130107dfb4e6386f574231a5c65";
|
|
39
|
-
export const KWENTA_ETH_PERP_V2 = "0x2b3bb4c683bfc5239b029131eef3b1d214478d93";
|
|
40
38
|
|
|
41
39
|
export const TEST_POOL = {
|
|
42
40
|
[Network.POLYGON]: "0x699fd4d6eadb216704c7e355cfa0a12f51813163",
|
|
@@ -68,7 +66,10 @@ export const CONTRACT_ADDRESS = {
|
|
|
68
66
|
COMPOUNDV3_WETH: "",
|
|
69
67
|
FLUID_WETH: "",
|
|
70
68
|
TOROS: "",
|
|
71
|
-
UNIT: ""
|
|
69
|
+
UNIT: "",
|
|
70
|
+
WSTETH: "",
|
|
71
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
72
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
72
73
|
},
|
|
73
74
|
|
|
74
75
|
[Network.OPTIMISM]: {
|
|
@@ -79,7 +80,6 @@ export const CONTRACT_ADDRESS = {
|
|
|
79
80
|
SUSD: "0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9",
|
|
80
81
|
WETH: "0x4200000000000000000000000000000000000006",
|
|
81
82
|
WBTC: "0x68f180fcCe6836688e9084f035309E29Bf0A2095",
|
|
82
|
-
KWENTA_ETH_PERP_V2: "0x2b3bb4c683bfc5239b029131eef3b1d214478d93",
|
|
83
83
|
uniswapV3: {
|
|
84
84
|
nonfungiblePositionManager: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88"
|
|
85
85
|
},
|
|
@@ -93,7 +93,10 @@ export const CONTRACT_ADDRESS = {
|
|
|
93
93
|
VELO: "0x9560e827aF36c94D2Ac33a39bCE1Fe78631088Db",
|
|
94
94
|
COMPOUNDV3_WETH: "",
|
|
95
95
|
FLUID_WETH: "",
|
|
96
|
-
TOROS: "0xcacb5a722a36cff6baeb359e21c098a4acbffdfa" //ETHBEAR1X
|
|
96
|
+
TOROS: "0xcacb5a722a36cff6baeb359e21c098a4acbffdfa", //ETHBEAR1X
|
|
97
|
+
WSTETH: "",
|
|
98
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
99
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
97
100
|
},
|
|
98
101
|
[Network.ARBITRUM]: {
|
|
99
102
|
USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
@@ -121,7 +124,7 @@ export const CONTRACT_ADDRESS = {
|
|
|
121
124
|
VELO: "",
|
|
122
125
|
COMPOUNDV3_WETH: "0x6f7D514bbD4aFf3BcD1140B7344b32f063dEe486",
|
|
123
126
|
FLUID_WETH: "0x45df0656f8adf017590009d2f1898eeca4f0a205",
|
|
124
|
-
TOROS: ""
|
|
127
|
+
TOROS: "0xA6711f8a184E352c5A0714a48912cD33ca4a16A0" //DYTMT
|
|
125
128
|
},
|
|
126
129
|
[Network.BASE]: {
|
|
127
130
|
USDC: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
@@ -143,7 +146,10 @@ export const CONTRACT_ADDRESS = {
|
|
|
143
146
|
VELO: "0x940181a94A35A4569E4529A3CDfB74e38FD98631",
|
|
144
147
|
COMPOUNDV3_WETH: "",
|
|
145
148
|
FLUID_WETH: "",
|
|
146
|
-
TOROS: ""
|
|
149
|
+
TOROS: "",
|
|
150
|
+
WSTETH: "",
|
|
151
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
152
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
147
153
|
},
|
|
148
154
|
[Network.ETHEREUM]: {
|
|
149
155
|
USDC: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
@@ -165,17 +171,56 @@ export const CONTRACT_ADDRESS = {
|
|
|
165
171
|
COMPOUNDV3_WETH: "",
|
|
166
172
|
FLUID_WETH: "",
|
|
167
173
|
TOROS: "",
|
|
168
|
-
UNIT: ""
|
|
174
|
+
UNIT: "",
|
|
175
|
+
WSTETH: "",
|
|
176
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
177
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
169
178
|
},
|
|
170
179
|
[Network.PLASMA]: {
|
|
171
180
|
USDC: "",
|
|
172
181
|
WETH: "0x9895d81bb462a195b4922ed7de0e3acd007c32cb",
|
|
182
|
+
WBTC: "",
|
|
173
183
|
USDT: "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb",
|
|
174
|
-
USDE: "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34"
|
|
184
|
+
USDE: "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34",
|
|
185
|
+
VELO: "",
|
|
186
|
+
uniswapV3: {
|
|
187
|
+
nonfungiblePositionManager: ""
|
|
188
|
+
},
|
|
189
|
+
COMPOUNDV3_WETH: "",
|
|
190
|
+
FLUID_WETH: "",
|
|
191
|
+
UNIT: "",
|
|
192
|
+
TOROS: "",
|
|
193
|
+
SUSD: "",
|
|
194
|
+
VELODROME_CL_USDC_WETH_GAUGE: "",
|
|
195
|
+
ARRAKIS_USDC_WETH_GAUGE: "",
|
|
196
|
+
ARRAKIS_USDC_WETH_LP: "",
|
|
197
|
+
WMATIC: "",
|
|
198
|
+
WSTETH: "",
|
|
199
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
200
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
175
201
|
},
|
|
176
202
|
[Network.HYPERLIQUID]: {
|
|
177
203
|
USDC: "0xb88339cb7199b77e23db6e890353e22632ba630f",
|
|
178
|
-
|
|
204
|
+
USDT: "",
|
|
205
|
+
USDE: "",
|
|
206
|
+
WETH: "",
|
|
207
|
+
WBTC: "",
|
|
208
|
+
VELO: "",
|
|
209
|
+
uniswapV3: {
|
|
210
|
+
nonfungiblePositionManager: ""
|
|
211
|
+
},
|
|
212
|
+
COMPOUNDV3_WETH: "",
|
|
213
|
+
FLUID_WETH: "",
|
|
214
|
+
UNIT: "",
|
|
215
|
+
TOROS: "",
|
|
216
|
+
SUSD: "",
|
|
217
|
+
VELODROME_CL_USDC_WETH_GAUGE: "",
|
|
218
|
+
ARRAKIS_USDC_WETH_GAUGE: "",
|
|
219
|
+
ARRAKIS_USDC_WETH_LP: "",
|
|
220
|
+
WMATIC: "",
|
|
221
|
+
WSTETH: "",
|
|
222
|
+
BALANCER_WSTETH_WETH_POOL: "",
|
|
223
|
+
BALANCER_WSTETH_WETH_GAUGE: ""
|
|
179
224
|
}
|
|
180
225
|
};
|
|
181
226
|
|
|
@@ -195,7 +240,7 @@ export const WETH_BALANCEOF_SLOT = {
|
|
|
195
240
|
[Network.OPTIMISM]: 3,
|
|
196
241
|
[Network.ARBITRUM]: 51,
|
|
197
242
|
[Network.POLYGON]: 0,
|
|
198
|
-
[Network.BASE]:
|
|
243
|
+
[Network.BASE]: 3,
|
|
199
244
|
[Network.ETHEREUM]: 3,
|
|
200
245
|
[Network.PLASMA]: 1,
|
|
201
246
|
[Network.HYPERLIQUID]: 1
|