@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.
Files changed (93) hide show
  1. package/README.md +400 -53
  2. package/dist/config.d.ts +14 -2
  3. package/dist/entities/pool.d.ts +25 -86
  4. package/dist/entities/utils.d.ts +15 -0
  5. package/dist/services/cowSwap/index.d.ts +10 -0
  6. package/dist/services/hyperliquid/index.d.ts +22 -0
  7. package/dist/services/kyberSwap/index.d.ts +1 -1
  8. package/dist/services/oneInch/index.d.ts +1 -1
  9. package/dist/services/toros/easySwapper.d.ts +14 -0
  10. package/dist/services/toros/swapData.d.ts +5 -5
  11. package/dist/services/uniswap/V3Liquidity.d.ts +2 -2
  12. package/dist/services/velodrome/liquidity.d.ts +3 -0
  13. package/dist/test/constants.d.ts +48 -3
  14. package/dist/test/utils/testingHelper.d.ts +4 -0
  15. package/dist/types.d.ts +21 -5
  16. package/dist/utils/contract.d.ts +20 -0
  17. package/dist/v2-sdk.cjs.development.js +5193 -6711
  18. package/dist/v2-sdk.cjs.development.js.map +1 -1
  19. package/dist/v2-sdk.cjs.production.min.js +1 -1
  20. package/dist/v2-sdk.cjs.production.min.js.map +1 -1
  21. package/dist/v2-sdk.esm.js +5198 -6711
  22. package/dist/v2-sdk.esm.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/abi/PoolFactory.json +414 -204
  25. package/src/abi/PoolLogic.json +160 -134
  26. package/src/config.ts +19 -9
  27. package/src/entities/pool.ts +103 -254
  28. package/src/entities/utils.ts +15 -0
  29. package/src/services/cowSwap/index.ts +281 -0
  30. package/src/services/hyperliquid/index.ts +22 -0
  31. package/src/services/kyberSwap/index.ts +5 -3
  32. package/src/services/oneInch/index.ts +5 -4
  33. package/src/services/toros/completeWithdrawal.ts +57 -40
  34. package/src/services/toros/easySwapper.ts +15 -1
  35. package/src/services/toros/initWithdrawal.ts +39 -31
  36. package/src/services/toros/swapData.ts +45 -131
  37. package/src/services/uniswap/V3Liquidity.ts +3 -24
  38. package/src/services/velodrome/liquidity.ts +3 -0
  39. package/src/test/aave.test.ts +99 -70
  40. package/src/test/aerodrome.test.ts +53 -24
  41. package/src/test/aerodromeCL.test.ts +64 -30
  42. package/src/test/arrakis.test.ts +23 -35
  43. package/src/test/balancer.test.ts +114 -106
  44. package/src/test/compoundV3.test.ts +45 -29
  45. package/src/test/constants.ts +57 -12
  46. package/src/test/cowswap.test.ts +79 -0
  47. package/src/test/dhedge.test.ts +45 -12
  48. package/src/test/flatmoney.test.ts +25 -39
  49. package/src/test/fluid.test.ts +33 -24
  50. package/src/test/hyperliquid.onchain.test.ts +131 -0
  51. package/src/test/kyberSwap.test.ts +37 -16
  52. package/src/test/lyra.test.ts +159 -150
  53. package/src/test/odos.test.ts +2 -2
  54. package/src/test/oneInch.test.ts +36 -22
  55. package/src/test/pancakeCL.test.ts +72 -31
  56. package/src/test/pendle.test.ts +94 -54
  57. package/src/test/{pendleMint.test.ts → pendleMint.onchain.test.ts} +22 -8
  58. package/src/test/pool.test.ts +152 -95
  59. package/src/test/toros.onchain.test.ts +92 -0
  60. package/src/test/toros.test.ts +74 -20
  61. package/src/test/torosLimitOrder.test.ts +87 -42
  62. package/src/test/uniswap.test.ts +77 -128
  63. package/src/test/utils/testingHelper.ts +120 -0
  64. package/src/test/velodrome.test.ts +126 -92
  65. package/src/test/velodromeCL.test.ts +43 -31
  66. package/src/test/velodromeV2.test.ts +153 -95
  67. package/src/types.ts +22 -6
  68. package/src/utils/contract.ts +20 -0
  69. package/dist/services/futures/constants.d.ts +0 -1
  70. package/dist/services/futures/index.d.ts +0 -2
  71. package/dist/services/futures/margin.d.ts +0 -2
  72. package/dist/services/futures/trade.d.ts +0 -3
  73. package/dist/services/ramses/vesting.d.ts +0 -4
  74. package/dist/services/uniswap/V3Trade.d.ts +0 -3
  75. package/dist/test/utils/futures.d.ts +0 -2
  76. package/src/abi/IRamsesNonfungiblePositionManager.json +0 -486
  77. package/src/abi/ISynthetiXFuturesMarketV2.json +0 -531
  78. package/src/abi/ISynthetix.json +0 -139
  79. package/src/abi/IUniswapV3Quoter.json +0 -195
  80. package/src/abi/IUniswapV3Router.json +0 -221
  81. package/src/abi/IXRam.json +0 -99
  82. package/src/services/futures/constants.ts +0 -1
  83. package/src/services/futures/index.ts +0 -2
  84. package/src/services/futures/margin.ts +0 -10
  85. package/src/services/futures/trade.ts +0 -32
  86. package/src/services/ramses/vesting.ts +0 -24
  87. package/src/services/uniswap/V3Trade.ts +0 -46
  88. package/src/test/futures.test.ts +0 -51
  89. package/src/test/hyperliquid.test.ts +0 -107
  90. package/src/test/ramses.test.ts +0 -190
  91. package/src/test/ramsesCL.test.ts +0 -155
  92. package/src/test/synthetix.test.ts +0 -36
  93. 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
- let dhedge: Dhedge;
18
- let pool: Pool;
19
- jest.setTimeout(100000);
19
+ const testVelodrome = ({ wallet, network, provider }: TestingRunParams) => {
20
+ const SUSD = CONTRACT_ADDRESS[network].SUSD;
21
+ const USDC = CONTRACT_ADDRESS[network].USDC;
20
22
 
21
- describe("pool", () => {
22
- beforeAll(async () => {
23
- dhedge = new Dhedge(wallet, network);
24
- pool = await dhedge.loadPool(TEST_POOL[network]);
25
- });
23
+ let dhedge: Dhedge;
24
+ let pool: Pool;
25
+ jest.setTimeout(100000);
26
26
 
27
- it("approves unlimited sUSD and USDC on for Velodrome", async () => {
28
- await pool.approve(Dapp.VELODROME, SUSD, MAX_AMOUNT);
29
- await pool.approve(Dapp.VELODROME, USDC, MAX_AMOUNT);
30
- const UsdcAllowanceDelta = await allowanceDelta(
31
- pool.address,
32
- USDC,
33
- routerAddress[network].velodrome!,
34
- pool.signer
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
- it("adds USDC and SUSD to a Velodrome stable pool", async () => {
40
- await pool.addLiquidityVelodrome(
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
- const lpTokenDelta = await balanceDelta(
49
- pool.address,
50
- USDC_SUSD_Lp,
51
- pool.signer
52
- );
53
- expect(lpTokenDelta.gt(0));
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
- it("should stake USDC-sUSD LP in a gauge", async () => {
57
- const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
58
- await pool.approveSpender(USDC_SUSD_Gauge, USDC_SUSD_Lp, MAX_AMOUNT);
59
- await pool.stakeInGauge(Dapp.VELODROME, USDC_SUSD_Gauge, balance);
60
- const gaugeBalance = await balanceDelta(
61
- pool.address,
62
- USDC_SUSD_Lp,
63
- pool.signer
64
- );
65
- expect(gaugeBalance.gt(0));
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
- it("should claim rewards from Gauge", async () => {
69
- const tx = await pool.claimFees(Dapp.VELODROME, USDC_SUSD_Gauge);
70
- expect(tx).not.toBe(null);
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
- it("should unStake USDC-sUSD LP from a gauge", async () => {
74
- const gaugeBalance = await dhedge.utils.getBalance(
75
- USDC_SUSD_Gauge,
76
- pool.address
77
- );
78
- await pool.unstakeFromGauge(USDC_SUSD_Gauge, gaugeBalance);
79
- const lpTokenDelta = await balanceDelta(
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
- it("approves unlimited wETH/stwETH LP for Velodrome", async () => {
88
- await pool.approve(Dapp.VELODROME, USDC_SUSD_Lp, MAX_AMOUNT);
89
- const lpAllowanceDelta = await allowanceDelta(
90
- pool.address,
91
- USDC_SUSD_Lp,
92
- routerAddress[network].velodrome!,
93
- pool.signer
94
- );
95
- expect(lpAllowanceDelta.gt(0));
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
- it("should remove all liquidity from an existing pool ", async () => {
99
- const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
100
- await pool.removeLiquidityVelodrome(USDC, SUSD, balance, true);
101
- const usdcBalanceDelta = await balanceDelta(
102
- pool.address,
103
- USDC,
104
- pool.signer
105
- );
106
- const susdBalanceDelta = await balanceDelta(
107
- pool.address,
108
- SUSD,
109
- pool.signer
110
- );
111
- expect(usdcBalanceDelta.gt(0));
112
- expect(susdBalanceDelta.gt(0));
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 { AssetEnabled, Dapp, Network } from "../types";
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 { allowanceDelta, balanceDelta } from "./utils/token";
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}] veldorome CL tests`, () => {
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
- "0x100000000000000"
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 UsdcAllowanceDelta = await allowanceDelta(
90
- pool.address,
92
+ const iERC20 = new ethers.Contract(
91
93
  USDC,
92
- VELODROME_POSITION_MANGER,
94
+ ["function allowance(address,address) view returns (uint256)"],
93
95
  pool.signer
94
96
  );
95
- await expect(UsdcAllowanceDelta.gt(0));
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).not.toBe(null);
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]); // 1 day
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
- expect((await balanceDelta(pool.address, USDC, pool.signer)).gt(0));
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
- expect((await balanceDelta(pool.address, VELO, pool.signer)).gt(0));
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 { allowanceDelta, balanceDelta } from "./utils/token";
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
- import { wallet } from "./wallet";
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 USDC_SUSD_Lp = "0x6d5BA400640226e24b50214d2bBb3D4Db8e6e15a";
12
- const USDC_SUSD_Gauge = "0x55a272304456355242f6690863b5c8d5c512ff71";
13
- const network = Network.OPTIMISM;
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("pool", () => {
22
- beforeAll(async () => {
23
- dhedge = new Dhedge(wallet, network);
24
- pool = await dhedge.loadPool(TEST_POOL[network]);
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
- it("approves unlimited sUSD and USDC on for Velodrome", async () => {
28
- await pool.approve(Dapp.VELODROMEV2, SUSD, MAX_AMOUNT);
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
- it("adds USDC and SUSD to a Velodrome stable pool", async () => {
40
- await pool.addLiquidityVelodromeV2(
41
- USDC,
42
- SUSD,
43
- (5 * 1e6).toString(),
44
- (5 * 1e18).toString(),
45
- true
46
- );
47
-
48
- const lpTokenDelta = await balanceDelta(
49
- pool.address,
50
- USDC_SUSD_Lp,
51
- pool.signer
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
- it("should stake USDC-sUSD LP in a gauge", async () => {
57
- const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
58
- await pool.approveSpender(USDC_SUSD_Gauge, USDC_SUSD_Lp, MAX_AMOUNT);
59
- await pool.stakeInGauge(Dapp.VELODROMEV2, USDC_SUSD_Gauge, balance);
60
- const gaugeBalance = await balanceDelta(
61
- pool.address,
62
- USDC_SUSD_Lp,
63
- pool.signer
64
- );
65
- expect(gaugeBalance.gt(0));
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
- it("should claim rewards from Gauge", async () => {
69
- const tx = await pool.claimFees(Dapp.VELODROMEV2, USDC_SUSD_Gauge);
70
- expect(tx).not.toBe(null);
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
- it("should unStake USDC-sUSD LP from a gauge", async () => {
74
- const gaugeBalance = await dhedge.utils.getBalance(
75
- USDC_SUSD_Gauge,
76
- pool.address
77
- );
78
- await pool.unstakeFromGauge(USDC_SUSD_Gauge, gaugeBalance);
79
- const lpTokenDelta = await balanceDelta(
80
- pool.address,
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
- it("approves unlimited wETH/stwETH LP for Velodrome", async () => {
88
- await pool.approve(Dapp.VELODROMEV2, USDC_SUSD_Lp, MAX_AMOUNT);
89
- const lpAllowanceDelta = await allowanceDelta(
90
- pool.address,
91
- USDC_SUSD_Lp,
92
- routerAddress[network].velodrome!,
93
- pool.signer
94
- );
95
- expect(lpAllowanceDelta.gt(0));
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
- it("should remove all liquidity from an existing pool ", async () => {
99
- const balance = await dhedge.utils.getBalance(USDC_SUSD_Lp, pool.address);
100
- await pool.removeLiquidityVelodromeV2(USDC, SUSD, balance, true);
101
- const usdcBalanceDelta = await balanceDelta(
102
- pool.address,
103
- USDC,
104
- pool.signer
105
- );
106
- const susdBalanceDelta = await balanceDelta(
107
- pool.address,
108
- SUSD,
109
- pool.signer
110
- );
111
- expect(usdcBalanceDelta.gt(0));
112
- expect(susdBalanceDelta.gt(0));
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
  });