@dhedge/v2-sdk 2.0.3 → 2.1.1

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.3",
3
+ "version": "2.1.1",
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,55 @@
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
+ headers: {
25
+ "x-client-id": "dHEDGE"
26
+ }
27
+ }
28
+ );
29
+
30
+ const buildParams = {
31
+ routeSummary: quoteResult.data.data.routeSummary,
32
+ sender: pool.address,
33
+ recipient: pool.address,
34
+ slippageTolerance: slippage * 100 // in basis points
35
+ };
36
+
37
+ const buildResult = await axios.post(
38
+ `${kyberBaseUrl}/${pool.network}/api/v1/route/build`,
39
+ buildParams,
40
+ {
41
+ headers: {
42
+ "x-client-id": "dHEDGE"
43
+ }
44
+ }
45
+ );
46
+
47
+ return {
48
+ swapTxData: buildResult.data.data.data,
49
+ minAmountOut: buildResult.data.data.amountOut
50
+ };
51
+ } catch (e) {
52
+ console.error("Error in KyberSwap API request:", e);
53
+ throw new ApiError("Swap api request of KyberSwap failed");
54
+ }
55
+ }
@@ -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
  });
@@ -0,0 +1,106 @@
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 {
8
+ TestingRunParams,
9
+ setUSDCAmount,
10
+ testingHelper,
11
+ wait
12
+ } from "./utils/testingHelper";
13
+
14
+ import { allowanceDelta, balanceDelta } from "./utils/token";
15
+ import { routerAddress } from "../config";
16
+ import BigNumber from "bignumber.js";
17
+
18
+ const testKyberSwap = ({ wallet, network, provider }: TestingRunParams) => {
19
+ const USDC = CONTRACT_ADDRESS[network].USDC;
20
+ const WETH = CONTRACT_ADDRESS[network].WETH;
21
+
22
+ let dhedge: Dhedge;
23
+ let pool: Pool;
24
+ jest.setTimeout(100000);
25
+
26
+ describe(`kyberswap on ${network}`, () => {
27
+ beforeAll(async () => {
28
+ dhedge = new Dhedge(wallet, network);
29
+ pool = await dhedge.loadPool(TEST_POOL[network]);
30
+ // top up gas
31
+ await provider.send("hardhat_setBalance", [
32
+ wallet.address,
33
+ "0x10000000000000000"
34
+ ]);
35
+ await provider.send("evm_mine", []);
36
+ // top up USDC
37
+ await setUSDCAmount({
38
+ amount: new BigNumber(2).times(1e6).toFixed(0),
39
+ userAddress: pool.address,
40
+ network,
41
+ provider
42
+ });
43
+ });
44
+
45
+ it("approves unlimited USDC on KyberSwap", async () => {
46
+ await pool.approve(Dapp.KYBERSWAP, USDC, MAX_AMOUNT);
47
+ const usdcAllowanceDelta = await allowanceDelta(
48
+ pool.address,
49
+ USDC,
50
+ routerAddress[network]["kyberswap"]!,
51
+ pool.signer
52
+ );
53
+ await expect(usdcAllowanceDelta.gt(0));
54
+ });
55
+
56
+ it("gets only amount and txData for 2 USDC into WETH on KyberSwap", async () => {
57
+ const usdcBalance = await pool.utils.getBalance(USDC, pool.address);
58
+ const result = await pool.trade(
59
+ Dapp.KYBERSWAP,
60
+ USDC,
61
+ WETH,
62
+ usdcBalance,
63
+ 1,
64
+ null,
65
+ { estimateGas: false, onlyGetTxData: true }
66
+ );
67
+ expect(result.txData).not.toBeNull();
68
+ expect(result.minAmountOut).not.toBeNull();
69
+ });
70
+
71
+ it("trades USDC balance into WETH on KyberSwap", async () => {
72
+ await wait(1);
73
+ const usdcBalance = await pool.utils.getBalance(USDC, pool.address);
74
+ await pool.trade(Dapp.KYBERSWAP, USDC, WETH, usdcBalance, 1);
75
+ const wethBalanceDelta = await balanceDelta(
76
+ pool.address,
77
+ WETH,
78
+ pool.signer
79
+ );
80
+ expect(wethBalanceDelta.gt(0));
81
+ });
82
+ });
83
+ };
84
+
85
+ // testingHelper({
86
+ // network: Network.PLASMA,
87
+ // onFork: false,
88
+ // testingRun: testKyberSwap
89
+ // });
90
+
91
+ testingHelper({
92
+ network: Network.ARBITRUM,
93
+ testingRun: testKyberSwap
94
+ });
95
+
96
+ // testingHelper({
97
+ // network: Network.POLYGON,
98
+ // onFork: false,
99
+ // testingRun: testOdos
100
+ // });
101
+
102
+ // testingHelper({
103
+ // network: Network.BASE,
104
+ // onFork: false,
105
+ // testingRun: testOdos
106
+ // });