@dhedge/v2-sdk 2.0.3 → 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/dist/entities/dhedge.d.ts +5 -2
- package/dist/services/kyberSwap/index.d.ts +7 -0
- package/dist/test/constants.d.ts +14 -0
- package/dist/test/wallet.d.ts +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/v2-sdk.cjs.development.js +141 -41
- 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 +141 -41
- package/dist/v2-sdk.esm.js.map +1 -1
- package/package.json +3 -2
- package/src/abi/PoolFactory.json +15 -0
- package/src/config.ts +32 -12
- package/src/entities/dhedge.ts +11 -2
- package/src/entities/pool.ts +10 -0
- package/src/services/kyberSwap/index.ts +47 -0
- package/src/test/constants.ts +17 -3
- package/src/test/dhedge.test.ts +22 -39
- package/src/test/kyberSwap.test.ts +100 -0
- package/src/test/pool.test.ts +56 -49
- package/src/test/wallet.ts +2 -1
- package/src/types.ts +4 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dhedge/v2-sdk",
|
|
3
|
-
"version": "2.0
|
|
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": {
|
package/src/abi/PoolFactory.json
CHANGED
|
@@ -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 = {
|
package/src/entities/dhedge.ts
CHANGED
|
@@ -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}
|
|
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
|
-
|
|
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
|
);
|
package/src/entities/pool.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/test/constants.ts
CHANGED
|
@@ -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
|
};
|
package/src/test/dhedge.test.ts
CHANGED
|
@@ -1,49 +1,32 @@
|
|
|
1
1
|
import { Dhedge } from "..";
|
|
2
|
-
import { factoryAddress } from "../config";
|
|
3
2
|
import { Network } from "../types";
|
|
4
3
|
|
|
5
|
-
import {
|
|
4
|
+
import { testingHelper, TestingRunParams } from "./utils/testingHelper";
|
|
6
5
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
// const weth = "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619";
|
|
6
|
+
const testDhedge = ({ wallet, network }: TestingRunParams) => {
|
|
7
|
+
let dhedge: Dhedge;
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
// gasPrice: ethers.utils.parseUnits("40", "gwei")
|
|
13
|
-
// };
|
|
9
|
+
jest.setTimeout(200000);
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
describe(`dHEDGE on ${network}`, () => {
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
dhedge = new Dhedge(wallet, network);
|
|
14
|
+
});
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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,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
|
+
// });
|
package/src/test/pool.test.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { Dhedge, Pool } from "..";
|
|
2
2
|
import { Network } from "../types";
|
|
3
|
-
import { TEST_POOL } from "./constants";
|
|
3
|
+
import { CONTRACT_ADDRESS, TEST_POOL } from "./constants";
|
|
4
4
|
|
|
5
5
|
import { testingHelper, TestingRunParams } from "./utils/testingHelper";
|
|
6
|
+
import { balanceDelta } from "./utils/token";
|
|
6
7
|
|
|
7
|
-
const testPool = ({ wallet, network
|
|
8
|
+
const testPool = ({ wallet, network }: TestingRunParams) => {
|
|
8
9
|
let dhedge: Dhedge;
|
|
9
10
|
let pool: Pool;
|
|
10
11
|
|
|
12
|
+
const USDT = CONTRACT_ADDRESS[network].USDT;
|
|
13
|
+
|
|
11
14
|
jest.setTimeout(200000);
|
|
12
15
|
|
|
13
16
|
describe(`pool on ${network}`, () => {
|
|
@@ -15,62 +18,65 @@ const testPool = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
15
18
|
dhedge = new Dhedge(wallet, network);
|
|
16
19
|
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
17
20
|
|
|
18
|
-
await provider.send("hardhat_setBalance", [
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
]);
|
|
21
|
+
// await provider.send("hardhat_setBalance", [
|
|
22
|
+
// wallet.address,
|
|
23
|
+
// "0x10000000000000000"
|
|
24
|
+
// ]);
|
|
22
25
|
});
|
|
23
26
|
|
|
24
27
|
it("checks fund composition", async () => {
|
|
25
28
|
const result = await pool.getComposition();
|
|
29
|
+
console.log(result);
|
|
26
30
|
expect(result.length).toBeGreaterThan(0);
|
|
27
31
|
});
|
|
28
32
|
|
|
29
|
-
it("sets pool private", async () => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
33
|
+
// it("sets pool private", async () => {
|
|
34
|
+
// const result = await pool.setPrivate(true);
|
|
35
|
+
// expect(result).not.toBeNull();
|
|
36
|
+
// });
|
|
33
37
|
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// CONTRACT_ADDRESS[network].USDC,
|
|
37
|
-
// ethers.constants.MaxUint256
|
|
38
|
-
// );
|
|
39
|
-
// const UsdcAllowanceDelta = await allowanceDelta(
|
|
40
|
-
// pool.signer.address,
|
|
41
|
-
// CONTRACT_ADDRESS[network].USDC,
|
|
42
|
-
// pool.address,
|
|
43
|
-
// pool.signer
|
|
44
|
-
// );
|
|
45
|
-
// expect(UsdcAllowanceDelta.gt(0));
|
|
46
|
-
// });
|
|
38
|
+
// it("adds WBTC to enabled assets", async () => {
|
|
39
|
+
// const assetsBefore = await pool.getComposition();
|
|
47
40
|
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
// );
|
|
55
|
-
// expect(poolTokenDelta.gt(0));
|
|
56
|
-
// });
|
|
57
|
-
|
|
58
|
-
// it("adds WBTC to enabled assets", async () => {
|
|
59
|
-
// const assetsBefore = await pool.getComposition();
|
|
60
|
-
|
|
61
|
-
// const newAssets: AssetEnabled[] = [
|
|
62
|
-
// { asset: CONTRACT_ADDRESS[network].USDC, isDeposit: true },
|
|
63
|
-
// { asset: CONTRACT_ADDRESS[network].WETH, isDeposit: false },
|
|
64
|
-
// { asset: CONTRACT_ADDRESS[network].WBTC, isDeposit: false }
|
|
65
|
-
// ];
|
|
66
|
-
// await pool.changeAssets(newAssets);
|
|
67
|
-
// const assetsAfter = await pool.getComposition();
|
|
68
|
-
// if (assetsBefore.length < newAssets.length) {
|
|
69
|
-
// expect(assetsAfter.length).toBeGreaterThan(assetsBefore.length);
|
|
70
|
-
// } else {
|
|
71
|
-
// expect(assetsAfter.length).toBeLessThanOrEqual(assetsBefore.length);
|
|
41
|
+
// const newAssets: AssetEnabled[] = [
|
|
42
|
+
// { asset: CONTRACT_ADDRESS[network].USDT, isDeposit: true },
|
|
43
|
+
// { asset: CONTRACT_ADDRESS[network].USDE, isDeposit: true },
|
|
44
|
+
// {
|
|
45
|
+
// asset: "0x925a2A7214Ed92428B5b1B090F80b25700095e12",
|
|
46
|
+
// isDeposit: false
|
|
72
47
|
// }
|
|
73
|
-
//
|
|
48
|
+
// ];
|
|
49
|
+
// await pool.changeAssets(newAssets);
|
|
50
|
+
// const assetsAfter = await pool.getComposition();
|
|
51
|
+
// expect(assetsAfter.length).toBeLessThanOrEqual(assetsBefore.length);
|
|
52
|
+
// });
|
|
53
|
+
|
|
54
|
+
// it("approves USDT balance of User for Deposit", async () => {
|
|
55
|
+
// await pool.approveDeposit(
|
|
56
|
+
// CONTRACT_ADDRESS[network].USDT,
|
|
57
|
+
// ethers.constants.MaxUint256
|
|
58
|
+
// );
|
|
59
|
+
// const usdtAllowanceDelta = await allowanceDelta(
|
|
60
|
+
// pool.signer.address,
|
|
61
|
+
// CONTRACT_ADDRESS[network].USDC,
|
|
62
|
+
// pool.address,
|
|
63
|
+
// pool.signer
|
|
64
|
+
// );
|
|
65
|
+
// expect(usdtAllowanceDelta.gt(0));
|
|
66
|
+
// });
|
|
67
|
+
|
|
68
|
+
it("deposits 200 USDT into Pool", async () => {
|
|
69
|
+
await pool.deposit(
|
|
70
|
+
CONTRACT_ADDRESS[network].USDT,
|
|
71
|
+
(200000000).toString()
|
|
72
|
+
);
|
|
73
|
+
const poolTokenDelta = await balanceDelta(
|
|
74
|
+
pool.address,
|
|
75
|
+
USDT,
|
|
76
|
+
pool.signer
|
|
77
|
+
);
|
|
78
|
+
expect(poolTokenDelta.gt(0));
|
|
79
|
+
});
|
|
74
80
|
|
|
75
81
|
// it("get available Manager Fee", async () => {
|
|
76
82
|
// const result = await pool.getAvailableManagerFee();
|
|
@@ -102,6 +108,7 @@ const testPool = ({ wallet, network, provider }: TestingRunParams) => {
|
|
|
102
108
|
// });
|
|
103
109
|
|
|
104
110
|
testingHelper({
|
|
105
|
-
network: Network.
|
|
111
|
+
network: Network.PLASMA,
|
|
112
|
+
onFork: false,
|
|
106
113
|
testingRun: testPool
|
|
107
114
|
});
|