@dhedge/v2-sdk 2.1.7 → 2.2.0
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 +400 -53
- package/dist/config.d.ts +14 -2
- package/dist/entities/pool.d.ts +25 -86
- package/dist/entities/utils.d.ts +15 -0
- package/dist/services/cowSwap/index.d.ts +10 -0
- package/dist/services/hyperliquid/index.d.ts +22 -0
- package/dist/services/kyberSwap/index.d.ts +1 -1
- 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 +5193 -6711
- 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 +5198 -6711
- 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/config.ts +19 -9
- package/src/entities/pool.ts +103 -254
- package/src/entities/utils.ts +15 -0
- package/src/services/cowSwap/index.ts +281 -0
- package/src/services/hyperliquid/index.ts +22 -0
- package/src/services/kyberSwap/index.ts +5 -3
- 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 +57 -12
- package/src/test/cowswap.test.ts +79 -0
- 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/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
|
@@ -1,19 +1,28 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
|
+
import BigNumber from "bignumber.js";
|
|
1
3
|
import { Dhedge, Pool, ethers } from "..";
|
|
2
4
|
|
|
3
5
|
import { nonfungiblePositionManagerAddress } from "../config";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
+
import { Dapp, Network } from "../types";
|
|
7
|
+
import {
|
|
8
|
+
CONTRACT_ADDRESS,
|
|
9
|
+
MAX_AMOUNT,
|
|
10
|
+
TEST_POOL,
|
|
11
|
+
USDC_BALANCEOF_SLOT
|
|
12
|
+
} from "./constants";
|
|
6
13
|
import {
|
|
7
14
|
TestingRunParams,
|
|
8
15
|
beforeAfterReset,
|
|
16
|
+
fixOracleAggregatorStaleness,
|
|
17
|
+
runWithImpersonateAccount,
|
|
9
18
|
setChainlinkTimeout,
|
|
19
|
+
setTokenAmount,
|
|
10
20
|
testingHelper
|
|
11
21
|
} from "./utils/testingHelper";
|
|
12
|
-
import {
|
|
22
|
+
import { balanceDelta } from "./utils/token";
|
|
13
23
|
import INonfungiblePositionManager from "../abi/INonfungiblePositionManager.json";
|
|
14
24
|
|
|
15
25
|
const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
17
26
|
const AERODROME_POSITION_MANGER = nonfungiblePositionManagerAddress[network][
|
|
18
27
|
Dapp.AERODROMECL
|
|
19
28
|
]!;
|
|
@@ -31,30 +40,46 @@ const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
31
40
|
|
|
32
41
|
describe(`[${network}] Aerodrome CL tests`, () => {
|
|
33
42
|
beforeAll(async () => {
|
|
34
|
-
// top up ETH (gas)
|
|
35
43
|
await provider.send("hardhat_setBalance", [
|
|
36
44
|
wallet.address,
|
|
37
|
-
"
|
|
45
|
+
"0x10000000000000000"
|
|
38
46
|
]);
|
|
39
47
|
dhedge = new Dhedge(wallet, network);
|
|
40
48
|
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
41
49
|
|
|
42
|
-
// setChainlinkTimeout
|
|
43
50
|
await setChainlinkTimeout({ pool, provider }, 86400 * 365);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
{
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
await fixOracleAggregatorStaleness({ pool, provider });
|
|
52
|
+
|
|
53
|
+
await runWithImpersonateAccount(
|
|
54
|
+
{ provider, account: await pool.managerLogic.manager() },
|
|
55
|
+
async ({ signer }) => {
|
|
56
|
+
await pool.managerLogic.connect(signer).setTrader(wallet.address);
|
|
57
|
+
await pool.managerLogic.connect(signer).changeAssets(
|
|
58
|
+
[
|
|
59
|
+
[USDC, true],
|
|
60
|
+
[USDT, true],
|
|
61
|
+
[AERODROME_POSITION_MANGER, false],
|
|
62
|
+
[AERO, false]
|
|
63
|
+
],
|
|
64
|
+
[]
|
|
65
|
+
);
|
|
55
66
|
}
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
await setTokenAmount({
|
|
70
|
+
amount: new BigNumber(1000).times(1e6).toFixed(0),
|
|
71
|
+
userAddress: pool.address,
|
|
72
|
+
tokenAddress: USDC,
|
|
73
|
+
slot: USDC_BALANCEOF_SLOT[network],
|
|
74
|
+
provider
|
|
75
|
+
});
|
|
76
|
+
await setTokenAmount({
|
|
77
|
+
amount: new BigNumber(1000).times(1e6).toFixed(0),
|
|
78
|
+
userAddress: pool.address,
|
|
79
|
+
tokenAddress: USDT,
|
|
80
|
+
slot: 0,
|
|
81
|
+
provider
|
|
82
|
+
});
|
|
58
83
|
|
|
59
84
|
velodromePositionManager = new ethers.Contract(
|
|
60
85
|
AERODROME_POSITION_MANGER,
|
|
@@ -69,16 +94,19 @@ const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
69
94
|
it("approves unlimited USDC and USDT on for Aerodrome CL", async () => {
|
|
70
95
|
await pool.approveSpender(AERODROME_POSITION_MANGER, USDC, MAX_AMOUNT);
|
|
71
96
|
await pool.approveSpender(AERODROME_POSITION_MANGER, USDT, MAX_AMOUNT);
|
|
72
|
-
const
|
|
73
|
-
pool.address,
|
|
97
|
+
const iERC20 = new ethers.Contract(
|
|
74
98
|
USDC,
|
|
75
|
-
|
|
99
|
+
["function allowance(address,address) view returns (uint256)"],
|
|
76
100
|
pool.signer
|
|
77
101
|
);
|
|
78
|
-
await
|
|
102
|
+
const usdcAllowance = await iERC20.allowance(
|
|
103
|
+
pool.address,
|
|
104
|
+
AERODROME_POSITION_MANGER
|
|
105
|
+
);
|
|
106
|
+
expect(usdcAllowance.gt(0)).toBe(true);
|
|
79
107
|
});
|
|
80
108
|
|
|
81
|
-
it("adds USDC and
|
|
109
|
+
it("adds USDC and USDT to a CL (mint position)", async () => {
|
|
82
110
|
const usdcBalance = await pool.utils.getBalance(USDC, pool.address);
|
|
83
111
|
const usdtBalance = await pool.utils.getBalance(USDT, pool.address);
|
|
84
112
|
await pool.addLiquidityUniswapV3(
|
|
@@ -113,7 +141,7 @@ const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
113
141
|
usdtBalance.div(2)
|
|
114
142
|
);
|
|
115
143
|
const positionAfter = await velodromePositionManager.positions(tokenId);
|
|
116
|
-
expect(positionAfter.liquidity.gt(positionBefore.liquidity));
|
|
144
|
+
expect(positionAfter.liquidity.gt(positionBefore.liquidity)).toBe(true);
|
|
117
145
|
});
|
|
118
146
|
|
|
119
147
|
it("decreases liquidity from a CL position", async () => {
|
|
@@ -122,14 +150,17 @@ const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
122
150
|
);
|
|
123
151
|
await pool.decreaseLiquidity(Dapp.AERODROMECL, tokenId, 50);
|
|
124
152
|
const positionAfter = await velodromePositionManager.positions(tokenId);
|
|
125
|
-
expect(positionAfter.liquidity.lt(positionBefore.liquidity));
|
|
153
|
+
expect(positionAfter.liquidity.lt(positionBefore.liquidity)).toBe(true);
|
|
126
154
|
});
|
|
127
155
|
|
|
128
156
|
it("collects fess of a CL position", async () => {
|
|
129
|
-
await provider.send("evm_increaseTime", [24 * 3600 * 3]); //
|
|
157
|
+
await provider.send("evm_increaseTime", [24 * 3600 * 3]); // 3 days
|
|
130
158
|
await provider.send("evm_mine", []);
|
|
131
159
|
await pool.claimFees(Dapp.AERODROMECL, tokenId);
|
|
132
|
-
|
|
160
|
+
// Fork has no trading activity during evm_increaseTime so no fees accrue — assert gte(0) to verify the call succeeds
|
|
161
|
+
expect(
|
|
162
|
+
(await balanceDelta(pool.address, USDC, pool.signer)).gte(0)
|
|
163
|
+
).toBe(true);
|
|
133
164
|
});
|
|
134
165
|
});
|
|
135
166
|
describe("Liquidity staking", () => {
|
|
@@ -169,7 +200,10 @@ const testAerodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
169
200
|
await provider.send("evm_increaseTime", [24 * 3600]); // 1 day
|
|
170
201
|
await provider.send("evm_mine", []);
|
|
171
202
|
await pool.claimFees(Dapp.AERODROMECL, tokenId);
|
|
172
|
-
|
|
203
|
+
// Fork has no gauge emissions during evm_increaseTime so no AERO rewards — assert gte(0) to verify the call succeeds
|
|
204
|
+
expect(
|
|
205
|
+
(await balanceDelta(pool.address, AERO, pool.signer)).gte(0)
|
|
206
|
+
).toBe(true);
|
|
173
207
|
});
|
|
174
208
|
|
|
175
209
|
it("unstakes a CL position from a gauge", async () => {
|
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
|
});
|