@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
|
@@ -4,111 +4,145 @@ 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
|
+
fixOracleAggregatorStaleness,
|
|
10
|
+
runWithImpersonateAccount,
|
|
11
|
+
setChainlinkTimeout,
|
|
12
|
+
testingHelper
|
|
13
|
+
} from "./utils/testingHelper";
|
|
7
14
|
import { allowanceDelta, balanceDelta } from "./utils/token";
|
|
8
15
|
|
|
9
|
-
import { wallet } from "./wallet";
|
|
10
|
-
|
|
11
16
|
const USDC_SUSD_Lp = "0xd16232ad60188b68076a235c65d692090caba155";
|
|
12
17
|
const USDC_SUSD_Gauge = "0xb03f52d2db3e758dd49982defd6aeefea9454e80";
|
|
13
|
-
const network = Network.OPTIMISM;
|
|
14
|
-
const SUSD = CONTRACT_ADDRESS[network].SUSD;
|
|
15
|
-
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
const testVelodrome = ({ wallet, network, provider }: TestingRunParams) => {
|
|
20
|
+
const SUSD = CONTRACT_ADDRESS[network].SUSD;
|
|
21
|
+
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
25
|
-
});
|
|
23
|
+
let dhedge: Dhedge;
|
|
24
|
+
let pool: Pool;
|
|
25
|
+
jest.setTimeout(100000);
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
pool.
|
|
35
|
-
);
|
|
36
|
-
await expect(UsdcAllowanceDelta.gt(0));
|
|
37
|
-
});
|
|
27
|
+
describe(`pool on ${network}`, () => {
|
|
28
|
+
beforeAll(async () => {
|
|
29
|
+
await provider.send("hardhat_setBalance", [
|
|
30
|
+
wallet.address,
|
|
31
|
+
"0x10000000000000000"
|
|
32
|
+
]);
|
|
33
|
+
dhedge = new Dhedge(wallet, network);
|
|
34
|
+
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
USDC,
|
|
42
|
-
SUSD,
|
|
43
|
-
(5 * 1e6).toString(),
|
|
44
|
-
(5 * 1e18).toString(),
|
|
45
|
-
true
|
|
46
|
-
);
|
|
36
|
+
await setChainlinkTimeout({ pool, provider }, 86400 * 365);
|
|
37
|
+
await fixOracleAggregatorStaleness({ pool, provider });
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
39
|
+
await runWithImpersonateAccount(
|
|
40
|
+
{ provider, account: await pool.managerLogic.manager() },
|
|
41
|
+
async ({ signer }) => {
|
|
42
|
+
await pool.managerLogic.connect(signer).setTrader(wallet.address);
|
|
43
|
+
await pool.managerLogic.connect(signer).changeAssets(
|
|
44
|
+
[
|
|
45
|
+
[USDC, true],
|
|
46
|
+
[SUSD, true],
|
|
47
|
+
[USDC_SUSD_Lp, false]
|
|
48
|
+
],
|
|
49
|
+
[]
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
});
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
it("approves unlimited sUSD and USDC on for Velodrome", async () => {
|
|
56
|
+
await pool.approve(Dapp.VELODROME, SUSD, MAX_AMOUNT);
|
|
57
|
+
await pool.approve(Dapp.VELODROME, USDC, MAX_AMOUNT);
|
|
58
|
+
const UsdcAllowanceDelta = await allowanceDelta(
|
|
59
|
+
pool.address,
|
|
60
|
+
USDC,
|
|
61
|
+
routerAddress[network].velodrome!,
|
|
62
|
+
pool.signer
|
|
63
|
+
);
|
|
64
|
+
expect(UsdcAllowanceDelta.gt(0)).toBe(true);
|
|
65
|
+
});
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
it("adds USDC and SUSD to a Velodrome stable pool", async () => {
|
|
68
|
+
await pool.addLiquidityVelodrome(
|
|
69
|
+
USDC,
|
|
70
|
+
SUSD,
|
|
71
|
+
(5 * 1e6).toString(),
|
|
72
|
+
(5 * 1e18).toString(),
|
|
73
|
+
true
|
|
74
|
+
);
|
|
72
75
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
pool.address,
|
|
81
|
-
USDC_SUSD_Lp,
|
|
82
|
-
pool.signer
|
|
83
|
-
);
|
|
84
|
-
expect(lpTokenDelta.gt(0));
|
|
85
|
-
});
|
|
76
|
+
const lpTokenDelta = await balanceDelta(
|
|
77
|
+
pool.address,
|
|
78
|
+
USDC_SUSD_Lp,
|
|
79
|
+
pool.signer
|
|
80
|
+
);
|
|
81
|
+
expect(lpTokenDelta.gt(0)).toBe(true);
|
|
82
|
+
});
|
|
86
83
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
pool.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
84
|
+
it("should stake USDC-sUSD LP in a gauge", async () => {
|
|
85
|
+
const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
|
|
86
|
+
await pool.approveSpender(USDC_SUSD_Gauge, USDC_SUSD_Lp, MAX_AMOUNT);
|
|
87
|
+
await pool.stakeInGauge(Dapp.VELODROME, USDC_SUSD_Gauge, balance);
|
|
88
|
+
const gaugeBalance = await balanceDelta(
|
|
89
|
+
pool.address,
|
|
90
|
+
USDC_SUSD_Lp,
|
|
91
|
+
pool.signer
|
|
92
|
+
);
|
|
93
|
+
expect(gaugeBalance.gt(0)).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("should claim rewards from Gauge", async () => {
|
|
97
|
+
const tx = await pool.claimFees(Dapp.VELODROME, USDC_SUSD_Gauge);
|
|
98
|
+
expect(tx).not.toBe(null);
|
|
99
|
+
});
|
|
97
100
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
|
|
101
|
+
it("should unStake USDC-sUSD LP from a gauge", async () => {
|
|
102
|
+
const gaugeBalance = await dhedge.utils.getBalance(
|
|
103
|
+
USDC_SUSD_Gauge,
|
|
104
|
+
pool.address
|
|
105
|
+
);
|
|
106
|
+
await pool.unstakeFromGauge(USDC_SUSD_Gauge, gaugeBalance);
|
|
107
|
+
const lpTokenDelta = await balanceDelta(
|
|
108
|
+
pool.address,
|
|
109
|
+
USDC_SUSD_Lp,
|
|
110
|
+
pool.signer
|
|
111
|
+
);
|
|
112
|
+
expect(lpTokenDelta.gt(0)).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("approves unlimited USDC-sUSD LP for Velodrome", async () => {
|
|
116
|
+
await pool.approve(Dapp.VELODROME, USDC_SUSD_Lp, MAX_AMOUNT);
|
|
117
|
+
const lpAllowanceDelta = await allowanceDelta(
|
|
118
|
+
pool.address,
|
|
119
|
+
USDC_SUSD_Lp,
|
|
120
|
+
routerAddress[network].velodrome!,
|
|
121
|
+
pool.signer
|
|
122
|
+
);
|
|
123
|
+
expect(lpAllowanceDelta.gt(0)).toBe(true);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("should remove all liquidity from an existing pool ", async () => {
|
|
127
|
+
const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
|
|
128
|
+
await pool.removeLiquidityVelodrome(USDC, SUSD, balance, true);
|
|
129
|
+
const usdcBalanceDelta = await balanceDelta(
|
|
130
|
+
pool.address,
|
|
131
|
+
USDC,
|
|
132
|
+
pool.signer
|
|
133
|
+
);
|
|
134
|
+
const susdBalanceDelta = await balanceDelta(
|
|
135
|
+
pool.address,
|
|
136
|
+
SUSD,
|
|
137
|
+
pool.signer
|
|
138
|
+
);
|
|
139
|
+
expect(usdcBalanceDelta.gt(0)).toBe(true);
|
|
140
|
+
expect(susdBalanceDelta.gt(0)).toBe(true);
|
|
141
|
+
});
|
|
113
142
|
});
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
testingHelper({
|
|
146
|
+
network: Network.OPTIMISM,
|
|
147
|
+
testingRun: testVelodrome
|
|
114
148
|
});
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
1
2
|
import BigNumber from "bignumber.js";
|
|
2
3
|
import { Dhedge, Pool, ethers } from "..";
|
|
3
4
|
|
|
4
5
|
import { nonfungiblePositionManagerAddress } from "../config";
|
|
5
|
-
import {
|
|
6
|
+
import { Dapp, Network } from "../types";
|
|
6
7
|
import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
|
|
7
8
|
import {
|
|
8
9
|
TestingRunParams,
|
|
9
10
|
beforeAfterReset,
|
|
11
|
+
fixOracleAggregatorStaleness,
|
|
12
|
+
runWithImpersonateAccount,
|
|
10
13
|
setChainlinkTimeout,
|
|
11
14
|
setUSDCAmount,
|
|
12
15
|
setWETHAmount,
|
|
13
16
|
testingHelper
|
|
14
17
|
} from "./utils/testingHelper";
|
|
15
|
-
import {
|
|
18
|
+
import { balanceDelta } from "./utils/token";
|
|
16
19
|
import INonfungiblePositionManager from "../abi/INonfungiblePositionManager.json";
|
|
17
20
|
|
|
18
21
|
const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
20
22
|
const VELODROME_POSITION_MANGER = nonfungiblePositionManagerAddress[network][
|
|
21
23
|
Dapp.VELODROMECL
|
|
22
24
|
]!;
|
|
@@ -33,18 +35,33 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
33
35
|
let tokenId: string;
|
|
34
36
|
jest.setTimeout(100000);
|
|
35
37
|
|
|
36
|
-
describe(`[${network}]
|
|
38
|
+
describe(`[${network}] velodrome CL tests`, () => {
|
|
37
39
|
beforeAll(async () => {
|
|
38
|
-
// top up ETH (gas)
|
|
39
40
|
await provider.send("hardhat_setBalance", [
|
|
40
41
|
wallet.address,
|
|
41
|
-
"
|
|
42
|
+
"0x10000000000000000"
|
|
42
43
|
]);
|
|
43
44
|
dhedge = new Dhedge(wallet, network);
|
|
44
45
|
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
45
46
|
|
|
46
|
-
// setChainlinkTimeout
|
|
47
47
|
await setChainlinkTimeout({ pool, provider }, 86400 * 365);
|
|
48
|
+
await fixOracleAggregatorStaleness({ pool, provider });
|
|
49
|
+
|
|
50
|
+
await runWithImpersonateAccount(
|
|
51
|
+
{ provider, account: await pool.managerLogic.manager() },
|
|
52
|
+
async ({ signer }) => {
|
|
53
|
+
await pool.managerLogic.connect(signer).setTrader(wallet.address);
|
|
54
|
+
await pool.managerLogic.connect(signer).changeAssets(
|
|
55
|
+
[
|
|
56
|
+
[USDC, true],
|
|
57
|
+
[WETH, true],
|
|
58
|
+
[VELODROME_POSITION_MANGER, false],
|
|
59
|
+
[VELO, false]
|
|
60
|
+
],
|
|
61
|
+
[]
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
);
|
|
48
65
|
|
|
49
66
|
await setUSDCAmount({
|
|
50
67
|
amount: new BigNumber(10000).times(1e6).toFixed(0),
|
|
@@ -59,20 +76,6 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
59
76
|
provider
|
|
60
77
|
});
|
|
61
78
|
|
|
62
|
-
const newAssets: AssetEnabled[] = [
|
|
63
|
-
{ asset: USDC, isDeposit: true },
|
|
64
|
-
{ asset: WETH, isDeposit: true },
|
|
65
|
-
{
|
|
66
|
-
asset: VELODROME_POSITION_MANGER,
|
|
67
|
-
isDeposit: false
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
asset: VELO,
|
|
71
|
-
isDeposit: false
|
|
72
|
-
}
|
|
73
|
-
];
|
|
74
|
-
await pool.changeAssets(newAssets);
|
|
75
|
-
|
|
76
79
|
velodromePositionManager = new ethers.Contract(
|
|
77
80
|
VELODROME_POSITION_MANGER,
|
|
78
81
|
INonfungiblePositionManager.abi,
|
|
@@ -86,13 +89,16 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
86
89
|
it("approves unlimited USDC and WETH on for Velodrome CL", async () => {
|
|
87
90
|
await pool.approveSpender(VELODROME_POSITION_MANGER, USDC, MAX_AMOUNT);
|
|
88
91
|
await pool.approveSpender(VELODROME_POSITION_MANGER, WETH, MAX_AMOUNT);
|
|
89
|
-
const
|
|
90
|
-
pool.address,
|
|
92
|
+
const iERC20 = new ethers.Contract(
|
|
91
93
|
USDC,
|
|
92
|
-
|
|
94
|
+
["function allowance(address,address) view returns (uint256)"],
|
|
93
95
|
pool.signer
|
|
94
96
|
);
|
|
95
|
-
await
|
|
97
|
+
const usdcAllowance = await iERC20.allowance(
|
|
98
|
+
pool.address,
|
|
99
|
+
VELODROME_POSITION_MANGER
|
|
100
|
+
);
|
|
101
|
+
expect(usdcAllowance.gt(0)).toBe(true);
|
|
96
102
|
});
|
|
97
103
|
|
|
98
104
|
it("adds USDC and WETH to a Velodrome CL (mint position)", async () => {
|
|
@@ -114,7 +120,7 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
114
120
|
tokenId = (
|
|
115
121
|
await velodromePositionManager.tokenOfOwnerByIndex(pool.address, 0)
|
|
116
122
|
).toString();
|
|
117
|
-
expect(tokenId).
|
|
123
|
+
expect(tokenId).toBeDefined();
|
|
118
124
|
});
|
|
119
125
|
|
|
120
126
|
it("increases liquidity in a CL position", async () => {
|
|
@@ -130,7 +136,7 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
130
136
|
wethBalance.div(2)
|
|
131
137
|
);
|
|
132
138
|
const positionAfter = await velodromePositionManager.positions(tokenId);
|
|
133
|
-
expect(positionAfter.liquidity.gt(positionBefore.liquidity));
|
|
139
|
+
expect(positionAfter.liquidity.gt(positionBefore.liquidity)).toBe(true);
|
|
134
140
|
});
|
|
135
141
|
|
|
136
142
|
it("decreases liquidity from a CL position", async () => {
|
|
@@ -139,14 +145,17 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
139
145
|
);
|
|
140
146
|
await pool.decreaseLiquidity(Dapp.VELODROMECL, tokenId, 50);
|
|
141
147
|
const positionAfter = await velodromePositionManager.positions(tokenId);
|
|
142
|
-
expect(positionAfter.liquidity.lt(positionBefore.liquidity));
|
|
148
|
+
expect(positionAfter.liquidity.lt(positionBefore.liquidity)).toBe(true);
|
|
143
149
|
});
|
|
144
150
|
|
|
145
151
|
it("collects fess of a CL position", async () => {
|
|
146
|
-
await provider.send("evm_increaseTime", [24 * 3600 * 3]); //
|
|
152
|
+
await provider.send("evm_increaseTime", [24 * 3600 * 3]); // 3 days
|
|
147
153
|
await provider.send("evm_mine", []);
|
|
148
154
|
await pool.claimFees(Dapp.VELODROMECL, tokenId);
|
|
149
|
-
|
|
155
|
+
// Fork has no trading activity during evm_increaseTime so no fees accrue — assert gte(0) to verify the call succeeds
|
|
156
|
+
expect(
|
|
157
|
+
(await balanceDelta(pool.address, USDC, pool.signer)).gte(0)
|
|
158
|
+
).toBe(true);
|
|
150
159
|
});
|
|
151
160
|
});
|
|
152
161
|
describe("Liquidity staking", () => {
|
|
@@ -186,7 +195,10 @@ const testVelodromeCL = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
186
195
|
await provider.send("evm_increaseTime", [24 * 3600]); // 1 day
|
|
187
196
|
await provider.send("evm_mine", []);
|
|
188
197
|
await pool.claimFees(Dapp.VELODROMECL, tokenId);
|
|
189
|
-
|
|
198
|
+
// Fork has no gauge emissions during evm_increaseTime so no VELO rewards — assert gte(0) to verify the call succeeds
|
|
199
|
+
expect(
|
|
200
|
+
(await balanceDelta(pool.address, VELO, pool.signer)).gte(0)
|
|
201
|
+
).toBe(true);
|
|
190
202
|
});
|
|
191
203
|
|
|
192
204
|
it("unstakes a CL position from a gauge", async () => {
|
|
@@ -1,114 +1,172 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import BigNumber from "bignumber.js";
|
|
4
|
+
import { ethers } from "ethers";
|
|
3
5
|
import { Dhedge, Pool } from "..";
|
|
4
6
|
import { routerAddress } from "../config";
|
|
5
7
|
import { Dapp, Network } from "../types";
|
|
6
8
|
import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
|
|
7
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
TestingRunParams,
|
|
11
|
+
fixOracleAggregatorStaleness,
|
|
12
|
+
runWithImpersonateAccount,
|
|
13
|
+
setChainlinkTimeout,
|
|
14
|
+
setUSDCAmount,
|
|
15
|
+
setWETHAmount,
|
|
16
|
+
testingHelper
|
|
17
|
+
} from "./utils/testingHelper";
|
|
18
|
+
import { balanceDelta } from "./utils/token";
|
|
8
19
|
|
|
9
|
-
|
|
20
|
+
// Velodrome V2 VARIABLE USDC/WETH pool (native USDC)
|
|
21
|
+
const USDC_WETH_Lp = "0xF4F2657AE744354bAcA871E56775e5083F7276Ab";
|
|
22
|
+
const USDC_WETH_Gauge = "0xBde5E1592AEb3D8396b90c4B4ba274E5Ae31e552";
|
|
10
23
|
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const SUSD = CONTRACT_ADDRESS[network].SUSD;
|
|
15
|
-
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
24
|
+
const testVelodromeV2 = ({ wallet, network, provider }: TestingRunParams) => {
|
|
25
|
+
const USDC = CONTRACT_ADDRESS[network].USDC;
|
|
26
|
+
const WETH = CONTRACT_ADDRESS[network].WETH;
|
|
16
27
|
|
|
17
|
-
let dhedge: Dhedge;
|
|
18
|
-
let pool: Pool;
|
|
19
|
-
jest.setTimeout(100000);
|
|
28
|
+
let dhedge: Dhedge;
|
|
29
|
+
let pool: Pool;
|
|
30
|
+
jest.setTimeout(100000);
|
|
20
31
|
|
|
21
|
-
describe(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
describe(`pool on ${network}`, () => {
|
|
33
|
+
beforeAll(async () => {
|
|
34
|
+
await provider.send("hardhat_setBalance", [
|
|
35
|
+
wallet.address,
|
|
36
|
+
"0x10000000000000000"
|
|
37
|
+
]);
|
|
38
|
+
dhedge = new Dhedge(wallet, network);
|
|
39
|
+
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
26
40
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
await pool.approve(Dapp.VELODROMEV2, USDC, MAX_AMOUNT);
|
|
30
|
-
const UsdcAllowanceDelta = await allowanceDelta(
|
|
31
|
-
pool.address,
|
|
32
|
-
USDC,
|
|
33
|
-
routerAddress[network].velodromeV2!,
|
|
34
|
-
pool.signer
|
|
35
|
-
);
|
|
36
|
-
await expect(UsdcAllowanceDelta.gt(0));
|
|
37
|
-
});
|
|
41
|
+
await setChainlinkTimeout({ pool, provider }, 86400 * 365);
|
|
42
|
+
await fixOracleAggregatorStaleness({ pool, provider });
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
expect(lpTokenDelta.gt(0));
|
|
54
|
-
});
|
|
44
|
+
await runWithImpersonateAccount(
|
|
45
|
+
{ provider, account: await pool.managerLogic.manager() },
|
|
46
|
+
async ({ signer }) => {
|
|
47
|
+
await pool.managerLogic.connect(signer).setTrader(wallet.address);
|
|
48
|
+
await pool.managerLogic.connect(signer).changeAssets(
|
|
49
|
+
[
|
|
50
|
+
[USDC, true],
|
|
51
|
+
[WETH, true],
|
|
52
|
+
[USDC_WETH_Lp, false]
|
|
53
|
+
],
|
|
54
|
+
[]
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
);
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
await setUSDCAmount({
|
|
60
|
+
amount: new BigNumber(10000).times(1e6).toFixed(0),
|
|
61
|
+
userAddress: pool.address,
|
|
62
|
+
network,
|
|
63
|
+
provider
|
|
64
|
+
});
|
|
65
|
+
await setWETHAmount({
|
|
66
|
+
amount: new BigNumber(3).times(1e18).toFixed(0),
|
|
67
|
+
userAddress: pool.address,
|
|
68
|
+
network,
|
|
69
|
+
provider
|
|
70
|
+
});
|
|
71
|
+
});
|
|
67
72
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
it("approves unlimited WETH and USDC on for Velodrome", async () => {
|
|
74
|
+
await pool.approve(Dapp.VELODROMEV2, WETH, MAX_AMOUNT);
|
|
75
|
+
await pool.approve(Dapp.VELODROMEV2, USDC, MAX_AMOUNT);
|
|
76
|
+
const iERC20 = new ethers.Contract(
|
|
77
|
+
USDC,
|
|
78
|
+
["function allowance(address,address) view returns (uint256)"],
|
|
79
|
+
pool.signer
|
|
80
|
+
);
|
|
81
|
+
const usdcAllowance = await iERC20.allowance(
|
|
82
|
+
pool.address,
|
|
83
|
+
routerAddress[network].velodromeV2!
|
|
84
|
+
);
|
|
85
|
+
expect(usdcAllowance.gt(0)).toBe(true);
|
|
86
|
+
});
|
|
72
87
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
USDC_SUSD_Lp,
|
|
82
|
-
pool.signer
|
|
83
|
-
);
|
|
84
|
-
expect(lpTokenDelta.gt(0));
|
|
85
|
-
});
|
|
88
|
+
it("adds USDC and WETH to a Velodrome volatile pool", async () => {
|
|
89
|
+
await pool.addLiquidityVelodromeV2(
|
|
90
|
+
USDC,
|
|
91
|
+
WETH,
|
|
92
|
+
new BigNumber(100).times(1e6).toFixed(0),
|
|
93
|
+
new BigNumber(0.05).times(1e18).toFixed(0),
|
|
94
|
+
false
|
|
95
|
+
);
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
const lpTokenDelta = await balanceDelta(
|
|
98
|
+
pool.address,
|
|
99
|
+
USDC_WETH_Lp,
|
|
100
|
+
pool.signer
|
|
101
|
+
);
|
|
102
|
+
expect(lpTokenDelta.gt(0)).toBe(true);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should stake USDC-WETH LP in a gauge", async () => {
|
|
106
|
+
const balance = await dhedge.utils.getBalance(USDC_WETH_Lp, pool.address);
|
|
107
|
+
await pool.approveSpender(USDC_WETH_Gauge, USDC_WETH_Lp, MAX_AMOUNT);
|
|
108
|
+
await pool.stakeInGauge(Dapp.VELODROMEV2, USDC_WETH_Gauge, balance);
|
|
109
|
+
const gaugeBalance = await balanceDelta(
|
|
110
|
+
pool.address,
|
|
111
|
+
USDC_WETH_Lp,
|
|
112
|
+
pool.signer
|
|
113
|
+
);
|
|
114
|
+
expect(gaugeBalance.lt(0)).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("should claim rewards from Gauge", async () => {
|
|
118
|
+
const tx = await pool.claimFees(Dapp.VELODROMEV2, USDC_WETH_Gauge);
|
|
119
|
+
expect(tx).not.toBe(null);
|
|
120
|
+
});
|
|
97
121
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
it("should unStake USDC-WETH LP from a gauge", async () => {
|
|
123
|
+
const gaugeBalance = await dhedge.utils.getBalance(
|
|
124
|
+
USDC_WETH_Gauge,
|
|
125
|
+
pool.address
|
|
126
|
+
);
|
|
127
|
+
await pool.unstakeFromGauge(USDC_WETH_Gauge, gaugeBalance);
|
|
128
|
+
const lpTokenDelta = await balanceDelta(
|
|
129
|
+
pool.address,
|
|
130
|
+
USDC_WETH_Lp,
|
|
131
|
+
pool.signer
|
|
132
|
+
);
|
|
133
|
+
expect(lpTokenDelta.gt(0)).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("approves unlimited USDC-WETH LP for Velodrome", async () => {
|
|
137
|
+
await pool.approve(Dapp.VELODROMEV2, USDC_WETH_Lp, MAX_AMOUNT);
|
|
138
|
+
const iERC20 = new ethers.Contract(
|
|
139
|
+
USDC_WETH_Lp,
|
|
140
|
+
["function allowance(address,address) view returns (uint256)"],
|
|
141
|
+
pool.signer
|
|
142
|
+
);
|
|
143
|
+
const lpAllowance = await iERC20.allowance(
|
|
144
|
+
pool.address,
|
|
145
|
+
routerAddress[network].velodromeV2!
|
|
146
|
+
);
|
|
147
|
+
expect(lpAllowance.gt(0)).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("should remove all liquidity from an existing pool ", async () => {
|
|
151
|
+
const balance = await dhedge.utils.getBalance(USDC_WETH_Lp, pool.address);
|
|
152
|
+
await pool.removeLiquidityVelodromeV2(USDC, WETH, balance, false);
|
|
153
|
+
const usdcBalanceDelta = await balanceDelta(
|
|
154
|
+
pool.address,
|
|
155
|
+
USDC,
|
|
156
|
+
pool.signer
|
|
157
|
+
);
|
|
158
|
+
const wethBalanceDelta = await balanceDelta(
|
|
159
|
+
pool.address,
|
|
160
|
+
WETH,
|
|
161
|
+
pool.signer
|
|
162
|
+
);
|
|
163
|
+
expect(usdcBalanceDelta.gt(0)).toBe(true);
|
|
164
|
+
expect(wethBalanceDelta.gt(0)).toBe(true);
|
|
165
|
+
});
|
|
113
166
|
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
testingHelper({
|
|
170
|
+
network: Network.OPTIMISM,
|
|
171
|
+
testingRun: testVelodromeV2
|
|
114
172
|
});
|