@dhedge/v2-sdk 1.5.3 → 1.7.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 (44) hide show
  1. package/dist/config.d.ts +2 -1
  2. package/dist/entities/pool.d.ts +44 -2
  3. package/dist/entities/utils.d.ts +7 -2
  4. package/dist/services/lyra/markets.d.ts +6 -0
  5. package/dist/services/lyra/positions.d.ts +2 -0
  6. package/dist/services/lyra/quote.d.ts +4 -0
  7. package/dist/services/lyra/trade.d.ts +4 -0
  8. package/dist/services/lyra/tradeOptionType.d.ts +3 -0
  9. package/dist/services/velodrome/liquidity.d.ts +4 -0
  10. package/dist/services/velodrome/staking.d.ts +4 -0
  11. package/dist/test/constants.d.ts +3 -0
  12. package/dist/types.d.ts +21 -1
  13. package/dist/v2-sdk.cjs.development.js +6701 -291
  14. package/dist/v2-sdk.cjs.development.js.map +1 -1
  15. package/dist/v2-sdk.cjs.production.min.js +1 -1
  16. package/dist/v2-sdk.cjs.production.min.js.map +1 -1
  17. package/dist/v2-sdk.esm.js +6699 -290
  18. package/dist/v2-sdk.esm.js.map +1 -1
  19. package/package.json +6 -2
  20. package/src/abi/IOptionMArketWrapper.json +1038 -0
  21. package/src/abi/IOptionMarket.json +1473 -0
  22. package/src/abi/IOptionToken.json +1671 -0
  23. package/src/abi/IVeldodromeRouter.json +438 -0
  24. package/src/abi/IVelodromeGauge.json +559 -0
  25. package/src/config.ts +11 -5
  26. package/src/entities/pool.ts +167 -20
  27. package/src/entities/utils.ts +45 -2
  28. package/src/services/lyra/markets.ts +52 -0
  29. package/src/services/lyra/positions.ts +19 -0
  30. package/src/services/lyra/quote.ts +12 -0
  31. package/src/services/lyra/trade.ts +101 -0
  32. package/src/services/lyra/tradeOptionType.ts +19 -0
  33. package/src/services/velodrome/liquidity.ts +48 -0
  34. package/src/services/velodrome/staking.ts +31 -0
  35. package/src/test/constants.ts +3 -0
  36. package/src/test/lyra.test.ts +163 -0
  37. package/src/test/pool.test.ts +1 -1
  38. package/src/test/toros.test.ts +1 -1
  39. package/src/test/txOptions.ts +1 -1
  40. package/src/test/uniswap.test.ts +1 -1
  41. package/src/test/velodrome.test.ts +141 -0
  42. package/src/test/wallet.ts +8 -0
  43. package/src/types.ts +21 -1
  44. package/src/test/sushi.test.ts +0 -173
@@ -0,0 +1,163 @@
1
+ import { Dhedge } from "..";
2
+ import { Network } from "../types";
3
+ import { utils } from "ethers";
4
+ import { SUSD, TEST_POOL } from "./constants";
5
+ import { getTxOptions } from "./txOptions";
6
+ import { wallet } from "./wallet";
7
+
8
+ jest.setTimeout(100000);
9
+
10
+ describe("pool", () => {
11
+ let dhedge: Dhedge;
12
+ const options = getTxOptions(Network.OPTIMISM);
13
+ beforeAll(async () => {
14
+ dhedge = new Dhedge(wallet, Network.OPTIMISM);
15
+ });
16
+
17
+ it("buys 0.1 1400 calls with expiry October 28th", async () => {
18
+ let result;
19
+ const pool = await dhedge.loadPool(TEST_POOL);
20
+ try {
21
+ result = await pool.tradeLyraOption(
22
+ "eth",
23
+ 1666944000,
24
+ 1400,
25
+ "call",
26
+ "buy",
27
+ utils.parseEther("0.1"),
28
+ SUSD
29
+ );
30
+ } catch (e) {
31
+ console.log(e);
32
+ }
33
+ result.wait(1);
34
+ const positions = await pool.getLyraPositions("eth");
35
+ expect(positions.length > 0);
36
+ });
37
+
38
+ it("adds 0.05 1400 calls with expiry October 28th", async () => {
39
+ let result;
40
+ const pool = await dhedge.loadPool(TEST_POOL);
41
+ try {
42
+ result = await pool.tradeLyraOption(
43
+ "eth",
44
+ 1666944000,
45
+ 1400,
46
+ "call",
47
+ "buy",
48
+ utils.parseEther("0.05"),
49
+ SUSD,
50
+ "0",
51
+ false,
52
+ options
53
+ );
54
+ } catch (e) {
55
+ console.log(e);
56
+ }
57
+ result.wait(1);
58
+ const positions = await pool.getLyraPositions("eth");
59
+ expect(utils.formatEther(positions[0].amount)).toBe("0.15");
60
+ });
61
+
62
+ it("sells 0.1 1300 Covered Call with expiry October 28th", async () => {
63
+ let result;
64
+ const pool = await dhedge.loadPool(TEST_POOL);
65
+ try {
66
+ result = await pool.tradeLyraOption(
67
+ "eth",
68
+ 1666944000,
69
+ 1300,
70
+ "call",
71
+ "sell",
72
+ utils.parseEther("0.1"),
73
+ SUSD,
74
+ utils.parseEther("0.1"),
75
+ true,
76
+ options
77
+ );
78
+ } catch (e) {
79
+ console.log(e);
80
+ }
81
+ result.wait(1);
82
+ const positions = await pool.getLyraPositions("eth");
83
+ const cCall = positions.find(e => e.optionType === 2);
84
+ expect(cCall).not.toBe(undefined);
85
+ });
86
+
87
+ it("adds 0.05 1300 Covered Call with expiry October 28th", async () => {
88
+ let result;
89
+ const pool = await dhedge.loadPool(TEST_POOL);
90
+ try {
91
+ result = await pool.tradeLyraOption(
92
+ "eth",
93
+ 1666944000,
94
+ 1300,
95
+ "call",
96
+ "sell",
97
+ utils.parseEther("0.05"),
98
+ SUSD,
99
+ utils.parseEther("0.05"),
100
+ true,
101
+ options
102
+ );
103
+ } catch (e) {
104
+ console.log(e);
105
+ }
106
+ result.wait(1);
107
+ const positions = await pool.getLyraPositions("eth");
108
+ const cCall = positions.find(e => e.optionType === 2);
109
+ expect(cCall);
110
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
111
+ expect(utils.formatEther(cCall!.amount)).toBe("0.15");
112
+ });
113
+
114
+ it("closes all 0.15 1300 Covered Call with expiry October 28th", async () => {
115
+ let result;
116
+ const pool = await dhedge.loadPool(TEST_POOL);
117
+ try {
118
+ result = await pool.tradeLyraOption(
119
+ "eth",
120
+ 1666944000,
121
+ 1300,
122
+ "call",
123
+ "buy",
124
+ utils.parseEther("0.15"),
125
+ SUSD,
126
+ utils.parseEther("0.15"),
127
+ true,
128
+ options
129
+ );
130
+ } catch (e) {
131
+ console.log(e);
132
+ }
133
+ result.wait(1);
134
+ const positions = await pool.getLyraPositions("eth");
135
+ const cCall = positions.find(e => e.optionType === 2 && e.state === 1);
136
+ expect(cCall).toBe(undefined);
137
+ });
138
+
139
+ it("closes all 0.15 1400 Calls with expiry October 28th", async () => {
140
+ let result;
141
+ const pool = await dhedge.loadPool(TEST_POOL);
142
+ try {
143
+ result = await pool.tradeLyraOption(
144
+ "eth",
145
+ 1666944000,
146
+ 1400,
147
+ "call",
148
+ "sell",
149
+ utils.parseEther("0.15"),
150
+ SUSD,
151
+ "0",
152
+ false,
153
+ options
154
+ );
155
+ } catch (e) {
156
+ console.log(e);
157
+ }
158
+ result.wait(1);
159
+ const positions = await pool.getLyraPositions("eth");
160
+ const call = positions.find(e => e.optionType === 0 && e.state === 1);
161
+ expect(call).toBe(undefined);
162
+ });
163
+ });
@@ -15,7 +15,7 @@ jest.setTimeout(100000);
15
15
 
16
16
  describe("pool", () => {
17
17
  beforeAll(() => {
18
- dhedge = new Dhedge(wallet, Network.POLYGON);
18
+ dhedge = new Dhedge(wallet, Network.OPTIMISM);
19
19
  });
20
20
 
21
21
  it("checks fund composition", async () => {
@@ -25,7 +25,7 @@ describe("pool", () => {
25
25
  let result;
26
26
  const pool = await dhedge.loadPool(ETHBULL3X);
27
27
  try {
28
- const depositAsset = await getPoolDepositAsset(pool, ETHBULL3X);
28
+ const depositAsset = await getPoolDepositAsset(pool, ETHBULL3X, USDC);
29
29
  if (!depositAsset) throw new Error("no deposit assets");
30
30
 
31
31
  result = await getEasySwapperDepositQuote(
@@ -13,7 +13,7 @@ export const getTxOptions = async (network: Network): Promise<any> => {
13
13
  .toFixed(0),
14
14
  maxFeePerGas: new BigNumber(result.data.fast.maxFee)
15
15
  .shiftedBy(9)
16
- .toFixed(0),
16
+ .toFixed(0)
17
17
  };
18
18
  } else {
19
19
  return { gasLimit: "3000000" };
@@ -13,7 +13,7 @@ jest.setTimeout(100000);
13
13
  describe("pool", () => {
14
14
  beforeAll(async () => {
15
15
  dhedge = new Dhedge(wallet, Network.POLYGON);
16
- options = await getTxOptions();
16
+ options = await getTxOptions(Network.POLYGON);
17
17
  //options = { gasLimit: "3000000" };
18
18
  });
19
19
 
@@ -0,0 +1,141 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Dhedge, ethers } from "..";
3
+ import { Dapp, Network } from "../types";
4
+ import { TEST_POOL, VEL, WETH, WSTETH } from "./constants";
5
+ import { getTxOptions } from "./txOptions";
6
+
7
+ import { wallet } from "./wallet";
8
+
9
+ const wETHwstETHLp = "0xBf205335De602ac38244F112d712ab04CB59A498";
10
+ const wETHwstETHGauge = "0x131Ae347E654248671Afc885F0767cB605C065d7";
11
+
12
+ let dhedge: Dhedge;
13
+ let options: any;
14
+ jest.setTimeout(100000);
15
+
16
+ describe("pool", () => {
17
+ beforeAll(async () => {
18
+ dhedge = new Dhedge(wallet, Network.OPTIMISM);
19
+ options = await getTxOptions(Network.OPTIMISM);
20
+ });
21
+
22
+ it("approves unlimited WETH on for Velodrome", async () => {
23
+ let result;
24
+ const pool = await dhedge.loadPool(TEST_POOL);
25
+ try {
26
+ result = await pool.approve(
27
+ Dapp.VELODROME,
28
+ WSTETH,
29
+ ethers.constants.MaxInt256,
30
+ options
31
+ );
32
+ console.log(result);
33
+ } catch (e) {
34
+ console.log(e);
35
+ }
36
+ expect(result).not.toBe(null);
37
+ });
38
+
39
+ it("adds WETH and wstETH to a Velodrome stable pool", async () => {
40
+ const pool = await dhedge.loadPool(TEST_POOL);
41
+ const wethBalance = await dhedge.utils.getBalance(WETH, pool.address);
42
+ const stwethBalance = await dhedge.utils.getBalance(WSTETH, pool.address);
43
+
44
+ const result = await pool.addLiquidityVelodrome(
45
+ WETH,
46
+ WSTETH,
47
+ wethBalance,
48
+ stwethBalance,
49
+ true,
50
+ options
51
+ );
52
+
53
+ result.wait(1);
54
+ const lpBalance = await dhedge.utils.getBalance(wETHwstETHLp, pool.address);
55
+ expect(lpBalance.gt(0));
56
+ });
57
+
58
+ it("should stake wETH/wStETH LP in a gauge", async () => {
59
+ const pool = await dhedge.loadPool(TEST_POOL);
60
+ const balance = await dhedge.utils.getBalance(wETHwstETHLp, pool.address);
61
+ const result = await pool.stakeInGauge(
62
+ Dapp.VELODROME,
63
+ wETHwstETHGauge,
64
+ balance,
65
+ options
66
+ );
67
+ result.wait(1);
68
+ const gaugeBalance = await dhedge.utils.getBalance(
69
+ wETHwstETHGauge,
70
+ pool.address
71
+ );
72
+ expect(gaugeBalance.gt(0));
73
+ });
74
+
75
+ it("should claim rewards from Gauge", async () => {
76
+ const pool = await dhedge.loadPool(TEST_POOL);
77
+ const result = await pool.claimFees(
78
+ Dapp.VELODROME,
79
+ wETHwstETHGauge,
80
+ options
81
+ );
82
+ result.wait(1);
83
+ const velBalance = await dhedge.utils.getBalance(VEL, pool.address);
84
+ expect(velBalance.gt(0));
85
+ });
86
+
87
+ it("should unStake wETH/wStETH LP from a gauge", async () => {
88
+ const pool = await dhedge.loadPool(TEST_POOL);
89
+ const gaugeBalance = await dhedge.utils.getBalance(
90
+ wETHwstETHGauge,
91
+ pool.address
92
+ );
93
+ const result = await pool.unstakeFromGauge(
94
+ wETHwstETHGauge,
95
+ gaugeBalance,
96
+ options
97
+ );
98
+ result.wait(1);
99
+ const lpBalance = await dhedge.utils.getBalance(wETHwstETHLp, pool.address);
100
+ expect(lpBalance.gt(0));
101
+ const gaugeBalanceAfter = await dhedge.utils.getBalance(
102
+ wETHwstETHGauge,
103
+ pool.address
104
+ );
105
+ expect(gaugeBalanceAfter.eq(0));
106
+ });
107
+
108
+ it("approves unlimited wETH/stwETH LP for Velodrome", async () => {
109
+ let result;
110
+ const pool = await dhedge.loadPool(TEST_POOL);
111
+ try {
112
+ result = await pool.approve(
113
+ Dapp.VELODROME,
114
+ wETHwstETHLp,
115
+ ethers.constants.MaxInt256,
116
+ options
117
+ );
118
+ console.log(result);
119
+ } catch (e) {
120
+ console.log(e);
121
+ }
122
+ expect(result).not.toBe(null);
123
+ });
124
+
125
+ it("should remove all liquidity from an existing pool ", async () => {
126
+ const pool = await dhedge.loadPool(TEST_POOL);
127
+ const balance = await dhedge.utils.getBalance(wETHwstETHLp, pool.address);
128
+ const result = await pool.removeLiquidityVelodrome(
129
+ WETH,
130
+ WSTETH,
131
+ balance,
132
+ options
133
+ );
134
+ result.wait(1);
135
+ const balanceAfter = await dhedge.utils.getBalance(
136
+ wETHwstETHLp,
137
+ pool.address
138
+ );
139
+ expect(balanceAfter.eq(0));
140
+ });
141
+ });
@@ -7,6 +7,14 @@ const provider = new ethers.providers.JsonRpcProvider(
7
7
  `https://opt-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_PROJECT_ID}`
8
8
  );
9
9
 
10
+ // const provider = new ethers.providers.JsonRpcProvider(
11
+ // `https://opt-kovan.g.alchemy.com/v2/${process.env.ALCHEMY_PROJECT_ID}`
12
+ // );
13
+
14
+ // const provider = new ethers.providers.JsonRpcProvider(
15
+ // `https://polygon-mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
16
+ // );
17
+
10
18
  // const provider = new ethers.providers.JsonRpcProvider(
11
19
  // `https://polygon-mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
12
20
  // );
package/src/types.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Deployment } from "@lyrafinance/lyra-js";
1
2
  import { BigNumber } from "ethers";
2
3
 
3
4
  export enum Network {
@@ -15,7 +16,9 @@ export enum Dapp {
15
16
  SYNTHETIX = "synthetix",
16
17
  AAVEV3 = "aavev3",
17
18
  ARRAKIS = "arrakis",
18
- TOROS = "toros"
19
+ TOROS = "toros",
20
+ VELODROME = "velodrome",
21
+ LYRA = "lyra"
19
22
  }
20
23
 
21
24
  export enum Transaction {
@@ -68,3 +71,20 @@ export type Reserves = {
68
71
  };
69
72
 
70
73
  export type NetworkChainIdMap = Readonly<Record<Network, number>>;
74
+
75
+ export type LyraOptionMarket = "eth";
76
+ export type AddressMarketMap = {
77
+ [key in LyraOptionMarket]: string;
78
+ };
79
+
80
+ export type LyraTradeType = "buy" | "sell";
81
+ export type LyraOptionType = "call" | "put";
82
+ export type LyraNetworkMap = { [key in Network]?: Deployment };
83
+ export type LyraPosition = {
84
+ positionId: BigNumber;
85
+ strikeId: BigNumber;
86
+ optionType: number;
87
+ amount: BigNumber;
88
+ collateral: BigNumber;
89
+ state: number;
90
+ };
@@ -1,173 +0,0 @@
1
- import { Dhedge } from "..";
2
- import { Dapp, Network } from "../types";
3
-
4
- import { wallet } from "./wallet";
5
-
6
- import { BAL, TEST_POOL, USDT } from "./constants";
7
-
8
- const myPool = "0x3e5f7e9e7dc3bc3086ccebd5eb59a0a4a29d881b";
9
- // const weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
10
- // //const usdt = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
11
- // //const dai = "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063";
12
- // const usdc = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
13
- // const wbtc = "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6";
14
- //const sushi = "0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a";
15
- // const wmatic = "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270";
16
- // const lpUsdcWeth = "0x34965ba0ac2451A34a0471F04CCa3F990b8dea27";
17
- //const lpUsdcDai = "0xCD578F016888B57F1b1e3f887f392F0159E26747";
18
- //const amusdc = "0x1a13F4Ca1d028320A707D99520AbFefca3998b7F";
19
- //const lpUsdcUsdt = "0x4b1f1e2435a9c96f7330faea190ef6a7c8d70001";
20
- // const tradeAmountUsdc = "1000000";
21
- // const liquidityAmountUsdt = "1000000";
22
- // const lpUsdcWETHAmount = "10951027354";
23
- // const depositAmountUsdc = "100000";
24
-
25
- let dhedge: Dhedge;
26
-
27
- jest.setTimeout(100000);
28
-
29
- // const options = {
30
- // gasLimit: 5000000,
31
- // gasPrice: ethers.utils.parseUnits("35", "gwei")
32
- // };
33
-
34
- describe("pool", () => {
35
- beforeAll(() => {
36
- dhedge = new Dhedge(wallet, Network.POLYGON);
37
- });
38
-
39
- it("adds Liquidity into a WETH/USDT pool on sushi", async () => {
40
- let result;
41
- const pool = await dhedge.loadPool(myPool);
42
- const liquidityAmountWETH = await dhedge.utils.getLpAmount(
43
- Dapp.SUSHISWAP,
44
- USDT,
45
- WETH,
46
- liquidityAmountUsdt
47
- );
48
- try {
49
- result = await pool.addLiquidity(
50
- Dapp.SUSHISWAP,
51
- usdt,
52
- weth,
53
- liquidityAmountUsdt,
54
- liquidityAmountWETH
55
- );
56
- } catch (e) {
57
- console.log(e);
58
- }
59
- expect(result).not.toBe(null);
60
- });
61
-
62
- // it("approves unlimited LP USDC/WETH on sushiswap for staking", async () => {
63
- // let result;
64
- // const pool = await dhedge.loadPool(myPool);
65
- // try {
66
- // result = await pool.approveStaking(
67
- // Dapp.SUSHISWAP,
68
- // lpUsdcDai,
69
- // ethers.constants.MaxUint256
70
- // );
71
- // } catch (e) {
72
- // console.log(e);
73
- // }
74
- // expect(result).not.toBe(null);
75
- // });
76
-
77
- // it("deposit 0.1 USDC into Pool", async () => {
78
- // let result;
79
- // const pool = await dhedge.loadPool(myPool);
80
- // try {
81
- // result = await pool.deposit(usdc, depositAmountUsdc);
82
- // } catch (e) {
83
- // console.log(e);
84
- // }
85
- // expect(result).not.toBe(null);
86
- // });
87
-
88
- // it("adds LpUSDCWETH to enabled assets", async () => {
89
- // let result;
90
- // const pool = await dhedge.loadPool(myPool);
91
- // const newAssets: AssetEnabled[] = [
92
- // { asset: usdc, isDeposit: true },
93
- // { asset: weth, isDeposit: true },
94
- // { asset: usdt, isDeposit: true },
95
- // { asset: lpUsdcWeth, isDeposit: false }
96
- // ];
97
- // try {
98
- // result = await pool.changeAssets(newAssets);
99
- // console.log(result);
100
- // } catch (e) {
101
- // console.log(e);
102
- // }
103
- // expect(result).not.toBe(null);
104
- // });
105
-
106
- // it("unStakes USDC/DAI LP on sushi", async () => {
107
- // let result;
108
- // const pool = await dhedge.loadPool(myPool);
109
- // const balance = "11013356749811";
110
- // try {
111
- // result = await pool.unStake(Dapp.SUSHISWAP, lpUsdcDai, balance);
112
- // console.log(result);
113
- // } catch (e) {
114
- // console.log(e);
115
- // }
116
- // expect(result).not.toBe(null);
117
- // });
118
-
119
- // it("trades entire sushi balance into usdc", async () => {
120
- // let result: FundComposition[] = [];
121
- // let tx;
122
- // const pool = await dhedge.loadPool(myPool);
123
- // try {
124
- // result = await pool.getComposition();
125
- // const sushiBalance = result.find(e => e.asset === sushi)?.balance;
126
- // if (sushiBalance) {
127
- // tx = await pool.trade(Dapp.SUSHISWAP, sushi, usdc, sushiBalance);
128
- // console.log(tx);
129
- // }
130
- // } catch (e) {
131
- // console.log(e);
132
- // }
133
- // expect(result.length).toBeGreaterThan(0);
134
- // });
135
-
136
- // it("harvests USDC/DAI LP Farm on sushi", async () => {
137
- // let result;
138
- // const pool = await dhedge.loadPool(myPool);
139
- // try {
140
- // result = await pool.harvestRewards(Dapp.SUSHISWAP, lpUsdcdai);
141
- // } catch (e) {
142
- // console.log(e);
143
- // }
144
- // expect(result).not.toBe(null);
145
- // });
146
-
147
- // it("sets a trader account", async () => {
148
- // let result;
149
- // const newTrader = "0xC52D9a9D9b05a01887871216fF02bA4235e8503d";
150
- // const pool = await dhedge.loadPool(myPool);
151
- // try {
152
- // result = await pool.setTrader(newTrader);
153
- // console.log(result);
154
- // } catch (e) {
155
- // console.log(e);
156
- // }
157
- // expect(result).not.toBe(null);
158
- // });
159
-
160
- // it("removes liquidity from USDC/DAI LP on sushi", async () => {
161
- // let result;
162
- // const pool = await dhedge.loadPool(myPool);
163
- // const balance = "11013356749811";
164
- // try {
165
- // result = await pool.removeLiquidity(Dapp.SUSHISWAP, usdc, dai, balance);
166
- // console.log(result);
167
- // } catch (e) {
168
- // console.log(e);
169
- // }
170
- // expect(result).not.toBe(null);
171
- // });
172
-
173
- });