@dhedge/v2-sdk 2.0.2 → 2.1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhedge/v2-sdk",
3
- "version": "2.0.2",
3
+ "version": "2.1.0",
4
4
  "license": "MIT",
5
5
  "description": "🛠 An SDK for building applications on top of dHEDGE V2",
6
6
  "main": "dist/index.js",
@@ -24,7 +24,8 @@
24
24
  "fork:optimism": "hardhat node --port 8544 --fork $(grep OPTIMISM_URL .env | cut -d '=' -f2)",
25
25
  "fork:arbitrum": "hardhat node --port 8540 --fork $(grep ARBITRUM_URL .env | cut -d '=' -f2)",
26
26
  "fork:base": "hardhat node --port 8546 --fork $(grep BASE_URL .env | cut -d '=' -f2)",
27
- "fork:ethereum": "hardhat node --port 8547 --fork $(grep ETHEREUM_URL .env | cut -d '=' -f2)"
27
+ "fork:ethereum": "hardhat node --port 8547 --fork $(grep ETHEREUM_URL .env | cut -d '=' -f2)",
28
+ "fork:plasma": "hardhat node --port 8548 --fork $(grep PLASMA_URL .env | cut -d '=' -f2)"
28
29
  },
29
30
  "husky": {
30
31
  "hooks": {
@@ -325,11 +325,26 @@
325
325
  "internalType": "string",
326
326
  "name": "_fundSymbol",
327
327
  "type": "string"
328
+ },
329
+ {
330
+ "internalType": "uint256",
331
+ "name": "_performanceFeeNumerator",
332
+ "type": "uint256"
328
333
  },
329
334
  {
330
335
  "internalType": "uint256",
331
336
  "name": "_managerFeeNumerator",
332
337
  "type": "uint256"
338
+ },
339
+ {
340
+ "internalType": "uint256",
341
+ "name": "_entryFeeNumerator",
342
+ "type": "uint256"
343
+ },
344
+ {
345
+ "internalType": "uint256",
346
+ "name": "_exitFeeNum",
347
+ "type": "uint256"
333
348
  },
334
349
  {
335
350
  "components": [
package/src/config.ts CHANGED
@@ -18,7 +18,8 @@ export const factoryAddress: AddressNetworkMap = {
18
18
  [Network.OPTIMISM]: "0x5e61a079A178f0E5784107a4963baAe0c5a680c6",
19
19
  [Network.ARBITRUM]: "0xfffb5fb14606eb3a548c113026355020ddf27535",
20
20
  [Network.BASE]: "0x49Afe3abCf66CF09Fab86cb1139D8811C8afe56F",
21
- [Network.ETHEREUM]: "0x96D33bCF84DdE326014248E2896F79bbb9c13D6d"
21
+ [Network.ETHEREUM]: "0x96D33bCF84DdE326014248E2896F79bbb9c13D6d",
22
+ [Network.PLASMA]: "0xAec4975Fc8ad911464D2948D771488b30F6eEE87"
22
23
  };
23
24
 
24
25
  export const routerAddress: AddressDappNetworkMap = {
@@ -32,7 +33,8 @@ export const routerAddress: AddressDappNetworkMap = {
32
33
  [Dapp.UNISWAPV3]: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",
33
34
  [Dapp.ARRAKIS]: "0xc73fb100a995b33f9fa181d420f4c8d74506df66",
34
35
  [Dapp.TOROS]: "0x45b90480D6F643dE2f128db091A357C3c90399f2",
35
- [Dapp.ODOS]: "0x4e3288c9ca110bcc82bf38f09a7b425c095d92bf"
36
+ [Dapp.ODOS]: "0x4e3288c9ca110bcc82bf38f09a7b425c095d92bf",
37
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
36
38
  },
37
39
  [Network.OPTIMISM]: {
38
40
  [Dapp.UNISWAPV3]: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",
@@ -45,7 +47,8 @@ export const routerAddress: AddressDappNetworkMap = {
45
47
  [Dapp.LYRA]: "0xCCE7819d65f348c64B7Beb205BA367b3fE33763B",
46
48
  [Dapp.ARRAKIS]: "0x9ce88a56d120300061593eF7AD074A1B710094d5",
47
49
  [Dapp.ODOS]: "0xca423977156bb05b13a2ba3b76bc5419e2fe9680",
48
- [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946"
50
+ [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946",
51
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
49
52
  },
50
53
  [Network.ARBITRUM]: {
51
54
  [Dapp.ONEINCH]: "0x111111125421ca6dc452d289314280a0f8842a65",
@@ -55,7 +58,8 @@ export const routerAddress: AddressDappNetworkMap = {
55
58
  [Dapp.RAMSES]: "0xaaa87963efeb6f7e0a2711f397663105acb1805e",
56
59
  [Dapp.TOROS]: "0xA5679C4272A056Bb83f039961fae7D99C48529F5",
57
60
  [Dapp.ODOS]: "0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13",
58
- [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946"
61
+ [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946",
62
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
59
63
  },
60
64
  [Network.BASE]: {
61
65
  [Dapp.ONEINCH]: "0x111111125421ca6dc452d289314280a0f8842a65",
@@ -63,13 +67,20 @@ export const routerAddress: AddressDappNetworkMap = {
63
67
  [Dapp.AAVEV3]: "0xA238Dd80C259a72e81d7e4664a9801593F98d1c5",
64
68
  [Dapp.TOROS]: "0xf067575Eb60c7587C11e867907AA7284833704d1",
65
69
  [Dapp.ODOS]: "0x19cEeAd7105607Cd444F5ad10dd51356436095a1",
66
- [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946"
70
+ [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946",
71
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
67
72
  },
68
73
  [Network.ETHEREUM]: {
69
74
  [Dapp.AAVEV3]: "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2",
70
75
  [Dapp.ODOS]: "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559",
71
76
  [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946",
72
- [Dapp.ONEINCH]: "0x111111125421ca6dc452d289314280a0f8842a65"
77
+ [Dapp.ONEINCH]: "0x111111125421ca6dc452d289314280a0f8842a65",
78
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
79
+ },
80
+ [Network.PLASMA]: {
81
+ [Dapp.AAVEV3]: "0x925a2A7214Ed92428B5b1B090F80b25700095e12",
82
+ [Dapp.PENDLE]: "0x888888888889758F76e7103c6CbF23ABbF58F946",
83
+ [Dapp.KYBERSWAP]: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
73
84
  }
74
85
  };
75
86
 
@@ -81,7 +92,8 @@ export const dappFactoryAddress: AddressDappNetworkMap = {
81
92
  [Network.OPTIMISM]: {},
82
93
  [Network.ARBITRUM]: {},
83
94
  [Network.BASE]: {},
84
- [Network.ETHEREUM]: {}
95
+ [Network.ETHEREUM]: {},
96
+ [Network.PLASMA]: {}
85
97
  };
86
98
 
87
99
  export const stakingAddress: AddressDappNetworkMap = {
@@ -102,7 +114,8 @@ export const stakingAddress: AddressDappNetworkMap = {
102
114
  [Network.BASE]: {
103
115
  [Dapp.PANCAKECL]: "0xC6A2Db661D5a5690172d8eB0a7DEA2d3008665A3"
104
116
  },
105
- [Network.ETHEREUM]: {}
117
+ [Network.ETHEREUM]: {},
118
+ [Network.PLASMA]: {}
106
119
  };
107
120
 
108
121
  export const aaveAddressProvider: AddressDappNetworkMap = {
@@ -122,6 +135,9 @@ export const aaveAddressProvider: AddressDappNetworkMap = {
122
135
  },
123
136
  [Network.ETHEREUM]: {
124
137
  [Dapp.AAVEV3]: "0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e"
138
+ },
139
+ [Network.PLASMA]: {
140
+ [Dapp.AAVEV3]: "0x061D8e131F26512348ee5FA42e2DF1bA9d6505E9"
125
141
  }
126
142
  };
127
143
  export const nonfungiblePositionManagerAddress: AddressDappNetworkMap = {
@@ -142,7 +158,8 @@ export const nonfungiblePositionManagerAddress: AddressDappNetworkMap = {
142
158
  [Dapp.AERODROMECL]: "0x827922686190790b37229fd06084350e74485b72",
143
159
  [Dapp.PANCAKECL]: "0x46A15B0b27311cedF172AB29E4f4766fbE7F4364"
144
160
  },
145
- [Network.ETHEREUM]: {}
161
+ [Network.ETHEREUM]: {},
162
+ [Network.PLASMA]: {}
146
163
  };
147
164
 
148
165
  export const networkChainIdMap: NetworkChainIdMap = {
@@ -150,7 +167,8 @@ export const networkChainIdMap: NetworkChainIdMap = {
150
167
  [Network.OPTIMISM]: 10,
151
168
  [Network.ARBITRUM]: 42161,
152
169
  [Network.BASE]: 8453,
153
- [Network.ETHEREUM]: 1
170
+ [Network.ETHEREUM]: 1,
171
+ [Network.PLASMA]: 9745
154
172
  };
155
173
 
156
174
  export const balancerSubgraph: AddressNetworkMap = {
@@ -159,7 +177,8 @@ export const balancerSubgraph: AddressNetworkMap = {
159
177
  [Network.OPTIMISM]: "",
160
178
  [Network.ARBITRUM]: "",
161
179
  [Network.BASE]: "",
162
- [Network.ETHEREUM]: ""
180
+ [Network.ETHEREUM]: "",
181
+ [Network.PLASMA]: ""
163
182
  };
164
183
 
165
184
  export const multiCallAddress: AddressNetworkMap = {
@@ -167,7 +186,8 @@ export const multiCallAddress: AddressNetworkMap = {
167
186
  [Network.OPTIMISM]: "",
168
187
  [Network.ARBITRUM]: "",
169
188
  [Network.BASE]: "",
170
- [Network.ETHEREUM]: ""
189
+ [Network.ETHEREUM]: "",
190
+ [Network.PLASMA]: ""
171
191
  };
172
192
 
173
193
  export const lyraNetworkMap: LyraNetworkMap = {
@@ -33,7 +33,10 @@ export class Dhedge {
33
33
  * @param {string} poolName Pool name
34
34
  * @param {string} symbol Token symbol
35
35
  * @param {tuple[]} supportedAssets Enabled assets to trade
36
- * @param {number|BigNumber} managerFeeNumerator Manger fee in percent
36
+ * @param {number|BigNumber} performanceFeeNumerator Performance fee in percent
37
+ * @param {number|BigNumber} managerFeeNumerator Manager fee in percent
38
+ * @param {number|BigNumber} entryFeeNumerator Entry fee in percent
39
+ * @param {number|BigNumber} exitFeeNumerator Exit fee in percent
37
40
  * @param {any} options Transaction options
38
41
  * @returns {Pool} Created Pool
39
42
  */
@@ -42,7 +45,10 @@ export class Dhedge {
42
45
  poolName: string,
43
46
  symbol: string,
44
47
  supportedAssets: SupportedAsset[],
45
- managerFeeNumerator = 20,
48
+ performanceFeeNumerator = 0,
49
+ managerFeeNumerator = 0,
50
+ entryFeeNumerator = 0,
51
+ exitFeeNumerator = 0,
46
52
  options: any = null
47
53
  ): Promise<Pool> {
48
54
  const pool = await this.factory.createFund(
@@ -51,7 +57,10 @@ export class Dhedge {
51
57
  managerName,
52
58
  poolName,
53
59
  symbol,
60
+ performanceFeeNumerator * 100,
54
61
  managerFeeNumerator * 100,
62
+ entryFeeNumerator * 100,
63
+ exitFeeNumerator * 100,
55
64
  supportedAssets,
56
65
  options
57
66
  );
@@ -86,6 +86,7 @@ import {
86
86
  import { getOdosSwapTxData } from "../services/odos";
87
87
  import { getPendleSwapTxData } from "../services/pendle";
88
88
  import { getCompleteWithdrawalTxData } from "../services/toros/completeWithdrawal";
89
+ import { getKyberSwapTxData } from "../services/kyberSwap";
89
90
 
90
91
  export class Pool {
91
92
  public readonly poolLogic: Contract;
@@ -444,6 +445,15 @@ export class Pool {
444
445
  slippage
445
446
  ));
446
447
  break;
448
+ case Dapp.KYBERSWAP:
449
+ ({ swapTxData, minAmountOut } = await getKyberSwapTxData(
450
+ this,
451
+ assetFrom,
452
+ assetTo,
453
+ amountIn,
454
+ slippage
455
+ ));
456
+ break;
447
457
  default:
448
458
  const iUniswapV2Router = new ethers.utils.Interface(
449
459
  IUniswapV2Router.abi
@@ -0,0 +1,47 @@
1
+ import axios from "axios";
2
+ import { ApiError, ethers } from "../..";
3
+ import { Pool } from "../../entities";
4
+
5
+ export const kyberBaseUrl = "https://aggregator-api.kyberswap.com";
6
+
7
+ export async function getKyberSwapTxData(
8
+ pool: Pool,
9
+ tokenIn: string,
10
+ tokenOut: string,
11
+ amountIn: ethers.BigNumber | string,
12
+ slippage: number
13
+ ): Promise<{ swapTxData: string; minAmountOut: string }> {
14
+ const params = {
15
+ tokenIn,
16
+ tokenOut,
17
+ amountIn: amountIn.toString()
18
+ };
19
+ try {
20
+ const quoteResult = await axios.get(
21
+ `${kyberBaseUrl}/${pool.network}/api/v1/routes`,
22
+ {
23
+ params
24
+ }
25
+ );
26
+
27
+ const buildParams = {
28
+ routeSummary: quoteResult.data.data.routeSummary,
29
+ sender: pool.address,
30
+ recipient: pool.address,
31
+ slippageTolerance: slippage * 100 // in basis points
32
+ };
33
+
34
+ const buildResult = await axios.post(
35
+ `${kyberBaseUrl}/${pool.network}/api/v1/route/build`,
36
+ buildParams
37
+ );
38
+
39
+ return {
40
+ swapTxData: buildResult.data.data.data,
41
+ minAmountOut: buildResult.data.data.amountOut
42
+ };
43
+ } catch (e) {
44
+ console.error("Error in KyberSwap API request:", e);
45
+ throw new ApiError("Swap api request of KyberSwap failed");
46
+ }
47
+ }
@@ -43,13 +43,15 @@ export const TEST_POOL = {
43
43
  [Network.OPTIMISM]: "0x12573bfdf764ab9d52aca20e2827497a66829716",
44
44
  [Network.ARBITRUM]: "0x0b5f6591c8eb23e5a68102d3d39ebbb464ee5c14",
45
45
  [Network.BASE]: "0x4842b42F68524383F609aa46eAfc18c1459cE3cD",
46
- [Network.ETHEREUM]: "0xe8e74f664d2d6a919a18b911990db0979789b6f7"
46
+ [Network.ETHEREUM]: "0xe8e74f664d2d6a919a18b911990db0979789b6f7",
47
+ [Network.PLASMA]: "0xdad21646ebb0997eb59de1f6a68a67059daf4c31"
47
48
  };
48
49
 
49
50
  export const CONTRACT_ADDRESS = {
50
51
  [Network.POLYGON]: {
51
52
  USDC: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
52
53
  USDT: "",
54
+ USDE: "",
53
55
  SUSD: "",
54
56
  SWETH: "",
55
57
  WETH: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
@@ -71,6 +73,7 @@ export const CONTRACT_ADDRESS = {
71
73
  [Network.OPTIMISM]: {
72
74
  USDC: "0x0b2c639c533813f4aa9d7837caf62653d097ff85",
73
75
  USDT: "",
76
+ USDE: "",
74
77
  SWETH: "",
75
78
  SUSD: "0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9",
76
79
  WETH: "0x4200000000000000000000000000000000000006",
@@ -95,6 +98,7 @@ export const CONTRACT_ADDRESS = {
95
98
  USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
96
99
  USDT: "",
97
100
  SUSD: "",
101
+ USDE: "",
98
102
  SWETH: "0xbc011A12Da28e8F0f528d9eE5E7039E22F91cf18",
99
103
  WETH: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
100
104
  WBTC: "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
@@ -122,6 +126,7 @@ export const CONTRACT_ADDRESS = {
122
126
  USDC: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
123
127
  USDT: "0xfde4c96c8593536e31f229ea8f37b2ada2699bb2",
124
128
  SUSD: "",
129
+ USDE: "",
125
130
  WETH: "0x4200000000000000000000000000000000000006",
126
131
  WBTC: "",
127
132
  SWETH: "",
@@ -143,6 +148,7 @@ export const CONTRACT_ADDRESS = {
143
148
  USDC: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
144
149
  USDT: "",
145
150
  SUSD: "",
151
+ USDE: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
146
152
  WETH: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
147
153
  WBTC: "",
148
154
  SWETH: "",
@@ -159,6 +165,12 @@ export const CONTRACT_ADDRESS = {
159
165
  FLUID_WETH: "",
160
166
  TOROS: "",
161
167
  UNIT: ""
168
+ },
169
+ [Network.PLASMA]: {
170
+ USDC: "",
171
+ WETH: "0x9895d81bb462a195b4922ed7de0e3acd007c32cb",
172
+ USDT: "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb",
173
+ USDE: "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34"
162
174
  }
163
175
  };
164
176
 
@@ -169,7 +181,8 @@ export const USDC_BALANCEOF_SLOT = {
169
181
  [Network.ARBITRUM]: 9,
170
182
  [Network.POLYGON]: 0,
171
183
  [Network.BASE]: 9,
172
- [Network.ETHEREUM]: 9
184
+ [Network.ETHEREUM]: 9,
185
+ [Network.PLASMA]: 9 //Currently no USDC on Plasma
173
186
  };
174
187
 
175
188
  export const WETH_BALANCEOF_SLOT = {
@@ -177,5 +190,6 @@ export const WETH_BALANCEOF_SLOT = {
177
190
  [Network.ARBITRUM]: 51,
178
191
  [Network.POLYGON]: 0,
179
192
  [Network.BASE]: 0,
180
- [Network.ETHEREUM]: 3
193
+ [Network.ETHEREUM]: 3,
194
+ [Network.PLASMA]: 1
181
195
  };
@@ -1,49 +1,32 @@
1
1
  import { Dhedge } from "..";
2
- import { factoryAddress } from "../config";
3
2
  import { Network } from "../types";
4
3
 
5
- import { wallet } from "./wallet";
4
+ import { testingHelper, TestingRunParams } from "./utils/testingHelper";
6
5
 
7
- const myPool = "0x279ac4c05154fd72a636fce1bc25c50966141fd0";
8
- // const usdc = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
9
- // const weth = "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619";
6
+ const testDhedge = ({ wallet, network }: TestingRunParams) => {
7
+ let dhedge: Dhedge;
10
8
 
11
- // const options = {
12
- // gasPrice: ethers.utils.parseUnits("40", "gwei")
13
- // };
9
+ jest.setTimeout(200000);
14
10
 
15
- jest.setTimeout(900000);
11
+ describe(`dHEDGE on ${network}`, () => {
12
+ beforeAll(async () => {
13
+ dhedge = new Dhedge(wallet, network);
14
+ });
16
15
 
17
- let dhedge: Dhedge;
18
-
19
- describe("dhedge", () => {
20
- beforeAll(() => {
21
- dhedge = new Dhedge(wallet, Network.POLYGON);
22
- });
23
-
24
- it("loads factory", () => {
25
- const factory = dhedge.factory;
26
- expect(factory.address).toBe(factoryAddress[dhedge.network]);
27
- });
28
-
29
- it("loads a pool by address", async () => {
30
- const pool = await dhedge.loadPool(myPool);
31
- expect(pool.poolLogic.address).toBe(myPool);
16
+ it("create a pool", async () => {
17
+ const pool = await dhedge.createPool("Test", "Test", "TEST", [
18
+ ["0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", true],
19
+ ["0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb", false],
20
+ ["0x925a2A7214Ed92428B5b1B090F80b25700095e12", false]
21
+ ]);
22
+ console.log(pool.address);
23
+ expect(pool.poolLogic.address).toBe(pool.address);
24
+ });
32
25
  });
26
+ };
33
27
 
34
- // it("create a pool", async () => {
35
- // const pool = await dhedge.createPool(
36
- // "Batman",
37
- // "Gotham Pool",
38
- // "DHHH",
39
- // [
40
- // [usdc, true],
41
- // [weth, true]
42
- // ],
43
- // 25,
44
- // options
45
- // );
46
- // console.log(pool.address);
47
- // expect(pool.poolLogic.address).toBe(pool.address);
48
- // });
28
+ testingHelper({
29
+ network: Network.PLASMA,
30
+ onFork: false,
31
+ testingRun: testDhedge
49
32
  });
@@ -118,6 +118,14 @@ const testFlatMoney = ({
118
118
  await expect(collateralAllowanceDelta.gt(0));
119
119
 
120
120
  const depositAmountStr = new BigNumber(1).times(1e18).toString();
121
+ const estimateData = await pool.mintUnitViaFlatMoney(
122
+ depositAmountStr,
123
+ 0.5,
124
+ 10, // set higher to tolerate high gasPrice returned by forked local chain
125
+ null,
126
+ true
127
+ );
128
+ expect(estimateData.gasEstimationError).toBe(null);
121
129
  const tx = await pool.mintUnitViaFlatMoney(
122
130
  depositAmountStr,
123
131
  0.5,
@@ -132,6 +140,12 @@ const testFlatMoney = ({
132
140
  expect(existingOrder.orderType).toBe(1);
133
141
  });
134
142
 
143
+ it("cancel order(estimate)", async () => {
144
+ await provider.send("evm_increaseTime", [60 * 2]); // more than 1 min
145
+ const res = await pool.cancelOrderViaFlatMoney({}, true);
146
+ expect(res.gasEstimationError).toBe(null);
147
+ });
148
+
135
149
  it("cancel order", async () => {
136
150
  await provider.send("evm_increaseTime", [60 * 2]); // more than 1 min
137
151
  await pool.cancelOrderViaFlatMoney();
@@ -148,6 +162,14 @@ const testFlatMoney = ({
148
162
  } else {
149
163
  withdrawAmountStr = new BigNumber(2).times(1e18).toString();
150
164
  }
165
+ const estimateData = await pool.redeemUnitViaFlatMoney(
166
+ withdrawAmountStr,
167
+ 0.5,
168
+ 10, // set higher to tolerate high gasPrice returned by forked local chain
169
+ null,
170
+ true
171
+ );
172
+ expect(estimateData.gasEstimationError).toBe(null);
151
173
 
152
174
  const tx = await pool.redeemUnitViaFlatMoney(
153
175
  withdrawAmountStr,
@@ -0,0 +1,100 @@
1
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
+
3
+ import { Dhedge, Pool } from "..";
4
+
5
+ import { Dapp, Network } from "../types";
6
+ import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
7
+ import { TestingRunParams, testingHelper, wait } from "./utils/testingHelper";
8
+
9
+ import { allowanceDelta, balanceDelta } from "./utils/token";
10
+ import { routerAddress } from "../config";
11
+
12
+ const testKyberSwap = ({ wallet, network }: TestingRunParams) => {
13
+ const USDT = CONTRACT_ADDRESS[network].USDT;
14
+ const USDE = CONTRACT_ADDRESS[network].USDE;
15
+
16
+ let dhedge: Dhedge;
17
+ let pool: Pool;
18
+ jest.setTimeout(100000);
19
+
20
+ describe(`kyberswap on ${network}`, () => {
21
+ beforeAll(async () => {
22
+ dhedge = new Dhedge(wallet, network);
23
+ pool = await dhedge.loadPool(TEST_POOL[network]);
24
+ // top up gas
25
+ // await provider.send("hardhat_setBalance", [
26
+ // wallet.address,
27
+ // "0x10000000000000000"
28
+ // ]);
29
+ // await provider.send("evm_mine", []);
30
+ // // top up USDC
31
+ // await setUSDCAmount({
32
+ // amount: new BigNumber(2).times(1e6).toFixed(0),
33
+ // userAddress: pool.address,
34
+ // network,
35
+ // provider
36
+ // });
37
+ });
38
+
39
+ it("approves unlimited USDT on KyberSwap", async () => {
40
+ await pool.approve(Dapp.KYBERSWAP, USDT, MAX_AMOUNT);
41
+ const usdtAllowanceDelta = await allowanceDelta(
42
+ pool.address,
43
+ USDT,
44
+ routerAddress[network]["kyberswap"]!,
45
+ pool.signer
46
+ );
47
+ await expect(usdtAllowanceDelta.gt(0));
48
+ });
49
+
50
+ it("gets only amount and txData for 2 USDT into WETH on KyberSwap", async () => {
51
+ const usdtBalance = await pool.utils.getBalance(USDT, pool.address);
52
+ const result = await pool.trade(
53
+ Dapp.KYBERSWAP,
54
+ USDT,
55
+ USDE,
56
+ usdtBalance,
57
+ 1,
58
+ null,
59
+ { estimateGas: false, onlyGetTxData: true }
60
+ );
61
+ expect(result.txData).not.toBeNull();
62
+ expect(result.minAmountOut).not.toBeNull();
63
+ });
64
+
65
+ it("trades USDT balance into USDE on KyberSwap", async () => {
66
+ await wait(1);
67
+ const usdtBalance = await pool.utils.getBalance(USDT, pool.address);
68
+ await pool.trade(Dapp.KYBERSWAP, USDT, USDE, usdtBalance, 1);
69
+ const usdeBalanceDelta = await balanceDelta(
70
+ pool.address,
71
+ USDE,
72
+ pool.signer
73
+ );
74
+ expect(usdeBalanceDelta.gt(0));
75
+ });
76
+ });
77
+ };
78
+
79
+ testingHelper({
80
+ network: Network.PLASMA,
81
+ onFork: false,
82
+ testingRun: testKyberSwap
83
+ });
84
+
85
+ // testingHelper({
86
+ // network: Network.ARBITRUM,
87
+ // testingRun: testOdos
88
+ // });
89
+
90
+ // testingHelper({
91
+ // network: Network.POLYGON,
92
+ // onFork: false,
93
+ // testingRun: testOdos
94
+ // });
95
+
96
+ // testingHelper({
97
+ // network: Network.BASE,
98
+ // onFork: false,
99
+ // testingRun: testOdos
100
+ // });