@dhedge/v2-sdk 1.4.1 → 1.5.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 +1 -1
- package/dist/services/chainLink/price.d.ts +2 -0
- package/dist/services/oneInch/protocols.d.ts +1 -0
- package/dist/services/toros/easySwapper.d.ts +7 -0
- package/dist/services/toros/pool.d.ts +3 -0
- package/dist/test/constants.d.ts +9 -7
- package/dist/test/txOptions.d.ts +2 -1
- package/dist/types.d.ts +2 -1
- package/dist/v2-sdk.cjs.development.js +1688 -88
- 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 +1686 -86
- package/dist/v2-sdk.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/IAaveV3PoolAddressProvider.json +468 -0
- package/src/abi/IDhedgeEasySwapper.json +443 -0
- package/src/abi/IPriceOracle.json +244 -0
- package/src/config.ts +4 -2
- package/src/entities/dhedge.ts +2 -4
- package/src/entities/pool.ts +72 -51
- package/src/services/chainLink/price.ts +25 -0
- package/src/services/oneInch/protocols.ts +18 -0
- package/src/services/toros/easySwapper.ts +110 -0
- package/src/services/toros/pool.ts +14 -0
- package/src/test/1inch.test.ts +54 -0
- package/src/test/arrakis.test.ts +2 -2
- package/src/test/constants.ts +16 -10
- package/src/test/toros.test.ts +117 -0
- package/src/test/txOptions.ts +16 -10
- package/src/types.ts +2 -1
package/src/entities/dhedge.ts
CHANGED
|
@@ -88,7 +88,6 @@ export class Dhedge {
|
|
|
88
88
|
* @returns {Pool} Loaded Pool
|
|
89
89
|
*/
|
|
90
90
|
public async loadPool(address: string): Promise<Pool> {
|
|
91
|
-
this.validatePool(address);
|
|
92
91
|
const poolLogic = new Contract(address, PoolLogic.abi, this.signer);
|
|
93
92
|
const managerLogicAddress = await poolLogic.poolManagerLogic();
|
|
94
93
|
const managerLogic = new Contract(
|
|
@@ -112,8 +111,7 @@ export class Dhedge {
|
|
|
112
111
|
* @param {string} address Pool address
|
|
113
112
|
* @returns {boolean} Is valid pool address
|
|
114
113
|
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (!isPool) throw new Error("Given address not a pool");
|
|
114
|
+
validatePool(address: string): Promise<boolean> {
|
|
115
|
+
return this.factory.isPool(address);
|
|
118
116
|
}
|
|
119
117
|
}
|
package/src/entities/pool.ts
CHANGED
|
@@ -40,6 +40,8 @@ import {
|
|
|
40
40
|
} from "../services/uniswap/V3Liquidity";
|
|
41
41
|
import { FeeAmount } from "@uniswap/v3-sdk";
|
|
42
42
|
import { getUniswapV3SwapTxData } from "../services/uniswap/V3Trade";
|
|
43
|
+
import { getEasySwapperTxData } from "../services/toros/easySwapper";
|
|
44
|
+
import { getOneInchProtocols } from "../services/oneInch/protocols";
|
|
43
45
|
|
|
44
46
|
export class Pool {
|
|
45
47
|
public readonly poolLogic: Contract;
|
|
@@ -265,52 +267,68 @@ export class Pool {
|
|
|
265
267
|
options: any = null
|
|
266
268
|
): Promise<any> {
|
|
267
269
|
let swapTxData: string;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
270
|
+
switch (dapp) {
|
|
271
|
+
case Dapp.ONEINCH:
|
|
272
|
+
const chainId = networkChainIdMap[this.network];
|
|
273
|
+
const protocols = await getOneInchProtocols(chainId);
|
|
274
|
+
const apiUrl = `https://api.1inch.exchange/v4.0/${chainId}/swap?fromTokenAddress=${assetFrom}&toTokenAddress=${assetTo}&amount=${amountIn.toString()}&fromAddress=${
|
|
275
|
+
this.address
|
|
276
|
+
}&destReceiver=${
|
|
277
|
+
this.address
|
|
278
|
+
}&slippage=${slippage.toString()}&disableEstimate=true${protocols}`;
|
|
279
|
+
const response = await axios.get(apiUrl);
|
|
280
|
+
swapTxData = response.data.tx.data;
|
|
281
|
+
break;
|
|
282
|
+
case Dapp.BALANCER:
|
|
283
|
+
swapTxData = await this.utils.getBalancerSwapTx(
|
|
284
|
+
this,
|
|
285
|
+
assetFrom,
|
|
286
|
+
assetTo,
|
|
287
|
+
amountIn,
|
|
288
|
+
slippage
|
|
289
|
+
);
|
|
290
|
+
break;
|
|
291
|
+
case Dapp.SYNTHETIX:
|
|
292
|
+
const iSynthetix = new ethers.utils.Interface(ISynthetix.abi);
|
|
293
|
+
const assets = [assetFrom, assetTo].map(asset =>
|
|
294
|
+
ethers.utils.formatBytes32String(asset)
|
|
295
|
+
);
|
|
296
|
+
const daoAddress = await this.factory.owner();
|
|
297
|
+
swapTxData = iSynthetix.encodeFunctionData(Transaction.SWAP_SYNTHS, [
|
|
298
|
+
assets[0],
|
|
299
|
+
amountIn,
|
|
300
|
+
assets[1],
|
|
301
|
+
daoAddress,
|
|
302
|
+
SYNTHETIX_TRACKING_CODE
|
|
303
|
+
]);
|
|
304
|
+
break;
|
|
305
|
+
case Dapp.TOROS:
|
|
306
|
+
swapTxData = await getEasySwapperTxData(
|
|
307
|
+
this,
|
|
308
|
+
assetFrom,
|
|
309
|
+
assetTo,
|
|
310
|
+
ethers.BigNumber.from(amountIn),
|
|
311
|
+
slippage
|
|
312
|
+
);
|
|
313
|
+
break;
|
|
314
|
+
default:
|
|
315
|
+
const iUniswapV2Router = new ethers.utils.Interface(
|
|
316
|
+
IUniswapV2Router.abi
|
|
317
|
+
);
|
|
318
|
+
const minAmountOut = await this.utils.getMinAmountOut(
|
|
319
|
+
dapp,
|
|
320
|
+
assetFrom,
|
|
321
|
+
assetTo,
|
|
322
|
+
amountIn,
|
|
323
|
+
slippage
|
|
324
|
+
);
|
|
325
|
+
swapTxData = iUniswapV2Router.encodeFunctionData(Transaction.SWAP, [
|
|
326
|
+
amountIn,
|
|
327
|
+
minAmountOut,
|
|
328
|
+
[assetFrom, assetTo],
|
|
329
|
+
this.address,
|
|
330
|
+
deadline
|
|
331
|
+
]);
|
|
314
332
|
}
|
|
315
333
|
const tx = await this.poolLogic.execTransaction(
|
|
316
334
|
routerAddress[this.network][dapp],
|
|
@@ -821,7 +839,10 @@ export class Pool {
|
|
|
821
839
|
feeAmount: FeeAmount,
|
|
822
840
|
options: any = null
|
|
823
841
|
): Promise<any> {
|
|
824
|
-
if (
|
|
842
|
+
if (
|
|
843
|
+
(minPrice === null || maxPrice === null) &&
|
|
844
|
+
(minTick === null || maxTick === null)
|
|
845
|
+
)
|
|
825
846
|
throw new Error("Need to provide price or tick range");
|
|
826
847
|
|
|
827
848
|
const iNonfungiblePositionManager = new ethers.utils.Interface(
|
|
@@ -872,8 +893,8 @@ export class Pool {
|
|
|
872
893
|
dappAddress = nonfungiblePositionManagerAddress[this.network];
|
|
873
894
|
const abi = new ethers.utils.Interface(INonfungiblePositionManager.abi);
|
|
874
895
|
const liquidity = (await getUniswapV3Liquidity(tokenId, this))
|
|
875
|
-
.mul(amount)
|
|
876
|
-
.div(
|
|
896
|
+
.mul(Math.round(amount * 1e4))
|
|
897
|
+
.div(1e6);
|
|
877
898
|
const decreaseLiquidityTxData = abi.encodeFunctionData(
|
|
878
899
|
Transaction.DECREASE_LIQUIDITY,
|
|
879
900
|
[[tokenId, liquidity, 0, 0, deadline]]
|
|
@@ -895,8 +916,8 @@ export class Pool {
|
|
|
895
916
|
dappAddress = routerAddress[this.network][dapp];
|
|
896
917
|
const abi = new ethers.utils.Interface(IArrakisV1RouterStaking.abi);
|
|
897
918
|
const liquidity = (await this.utils.getBalance(tokenId, this.address))
|
|
898
|
-
.mul(amount)
|
|
899
|
-
.div(
|
|
919
|
+
.mul(Math.round(amount * 1e4))
|
|
920
|
+
.div(1e6);
|
|
900
921
|
txData = abi.encodeFunctionData(Transaction.REMOVE_LIQUIDITY_UNSTAKE, [
|
|
901
922
|
tokenId,
|
|
902
923
|
liquidity,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ethers, Pool } from "../..";
|
|
2
|
+
|
|
3
|
+
import IAaveV3PoolAddressProvider from "../../abi/IAaveV3PoolAddressProvider.json";
|
|
4
|
+
import IPriceOracle from "../../abi/IPriceOracle.json";
|
|
5
|
+
|
|
6
|
+
export async function getChainlinkPriceInUsd(
|
|
7
|
+
pool: Pool,
|
|
8
|
+
asset: string
|
|
9
|
+
): Promise<ethers.BigNumber> {
|
|
10
|
+
//Workaround as Chainlink doesn't have feed registry on Polygon/Optimism
|
|
11
|
+
//Use oracle from Aave which uses Chainlink
|
|
12
|
+
const lendingPoolAddressProvider = new ethers.Contract(
|
|
13
|
+
"0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb",
|
|
14
|
+
IAaveV3PoolAddressProvider.abi,
|
|
15
|
+
pool.signer
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const priceOracleAddress = await lendingPoolAddressProvider.getPriceOracle();
|
|
19
|
+
const priceOracle = new ethers.Contract(
|
|
20
|
+
priceOracleAddress,
|
|
21
|
+
IPriceOracle.abi,
|
|
22
|
+
pool.signer
|
|
23
|
+
);
|
|
24
|
+
return await priceOracle.getAssetPrice(asset);
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
|
|
3
|
+
const excludedProtocols = ["OPTIMISM_PMM6"]; //Clipper
|
|
4
|
+
|
|
5
|
+
export async function getOneInchProtocols(chainId: number): Promise<string> {
|
|
6
|
+
try {
|
|
7
|
+
const response = await axios.get(
|
|
8
|
+
`https://api.1inch.io/v4.0/${chainId}/liquidity-sources`
|
|
9
|
+
);
|
|
10
|
+
const protocols = response.data.protocols.map((e: { id: string }) => e.id);
|
|
11
|
+
const filteredProtocols = protocols.filter(
|
|
12
|
+
(e: string) => !excludedProtocols.includes(e)
|
|
13
|
+
);
|
|
14
|
+
return `&protocols=${filteredProtocols.join(",")}`;
|
|
15
|
+
} catch {
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ethers } from "ethers";
|
|
2
|
+
import { Dapp, Pool } from "../..";
|
|
3
|
+
|
|
4
|
+
import IDhedgeEasySwapper from "../../abi/IDhedgeEasySwapper.json";
|
|
5
|
+
import { routerAddress } from "../../config";
|
|
6
|
+
import { getChainlinkPriceInUsd } from "../chainLink/price";
|
|
7
|
+
import { isPool, loadPool } from "./pool";
|
|
8
|
+
|
|
9
|
+
export async function getPoolDepositAsset(
|
|
10
|
+
pool: Pool,
|
|
11
|
+
poolAddress: string
|
|
12
|
+
): Promise<string | undefined> {
|
|
13
|
+
const torosPool = await loadPool(pool, poolAddress);
|
|
14
|
+
const composition = await torosPool.getComposition();
|
|
15
|
+
return composition.find(e => e.isDeposit)?.asset;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function getTorosPoolTokenPrice(
|
|
19
|
+
pool: Pool,
|
|
20
|
+
poolAddress: string
|
|
21
|
+
): Promise<ethers.BigNumber> {
|
|
22
|
+
const torosPool = await loadPool(pool, poolAddress);
|
|
23
|
+
return await torosPool.poolLogic.tokenPrice();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function getEasySwapperDepositQuote(
|
|
27
|
+
pool: Pool,
|
|
28
|
+
torosAsset: string,
|
|
29
|
+
investAsset: string,
|
|
30
|
+
depositAsset: string,
|
|
31
|
+
amountIn: ethers.BigNumber
|
|
32
|
+
): Promise<ethers.BigNumber> {
|
|
33
|
+
const easySwapper = new ethers.Contract(
|
|
34
|
+
routerAddress[pool.network][Dapp.TOROS] as string,
|
|
35
|
+
IDhedgeEasySwapper.abi,
|
|
36
|
+
pool.signer
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return await easySwapper.depositQuote(
|
|
40
|
+
torosAsset,
|
|
41
|
+
investAsset,
|
|
42
|
+
amountIn,
|
|
43
|
+
depositAsset
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function getEasySwapperWithdrawalQuote(
|
|
48
|
+
pool: Pool,
|
|
49
|
+
torosAsset: string,
|
|
50
|
+
investAsset: string,
|
|
51
|
+
amountIn: ethers.BigNumber
|
|
52
|
+
): Promise<ethers.BigNumber> {
|
|
53
|
+
const [torosTokenPrice, assetPrice, assetDecimals] = await Promise.all([
|
|
54
|
+
getTorosPoolTokenPrice(pool, torosAsset),
|
|
55
|
+
getChainlinkPriceInUsd(pool, investAsset),
|
|
56
|
+
pool.utils.getDecimals(investAsset)
|
|
57
|
+
]);
|
|
58
|
+
|
|
59
|
+
return amountIn
|
|
60
|
+
.mul(torosTokenPrice)
|
|
61
|
+
.div(assetPrice)
|
|
62
|
+
.div(1e10)
|
|
63
|
+
.div(10 ** (18 - assetDecimals));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function getEasySwapperTxData(
|
|
67
|
+
pool: Pool,
|
|
68
|
+
assetFrom: string,
|
|
69
|
+
assetTo: string,
|
|
70
|
+
amountIn: ethers.BigNumber,
|
|
71
|
+
slippage: number
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
): Promise<any> {
|
|
74
|
+
const isWithdrawal = await isPool(pool, assetFrom);
|
|
75
|
+
const [torosAsset, investAsset] = isWithdrawal
|
|
76
|
+
? [assetFrom, assetTo]
|
|
77
|
+
: [assetTo, assetFrom];
|
|
78
|
+
const iDhedgeEasySwapper = new ethers.utils.Interface(IDhedgeEasySwapper.abi);
|
|
79
|
+
if (isWithdrawal) {
|
|
80
|
+
const minAmountOut = await getEasySwapperWithdrawalQuote(
|
|
81
|
+
pool,
|
|
82
|
+
torosAsset,
|
|
83
|
+
investAsset,
|
|
84
|
+
amountIn
|
|
85
|
+
);
|
|
86
|
+
return iDhedgeEasySwapper.encodeFunctionData("withdraw", [
|
|
87
|
+
torosAsset,
|
|
88
|
+
amountIn,
|
|
89
|
+
investAsset,
|
|
90
|
+
minAmountOut.mul(10000 - slippage * 100).div(10000)
|
|
91
|
+
]);
|
|
92
|
+
} else {
|
|
93
|
+
const depositAsset = await getPoolDepositAsset(pool, torosAsset);
|
|
94
|
+
if (!depositAsset) throw new Error("no deposit assets");
|
|
95
|
+
const minAmountOut = await getEasySwapperDepositQuote(
|
|
96
|
+
pool,
|
|
97
|
+
torosAsset,
|
|
98
|
+
investAsset,
|
|
99
|
+
depositAsset,
|
|
100
|
+
amountIn
|
|
101
|
+
);
|
|
102
|
+
return iDhedgeEasySwapper.encodeFunctionData("deposit", [
|
|
103
|
+
torosAsset,
|
|
104
|
+
investAsset,
|
|
105
|
+
amountIn,
|
|
106
|
+
depositAsset,
|
|
107
|
+
minAmountOut.mul(10000 - slippage * 100).div(10000)
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Dhedge, Pool } from "../..";
|
|
2
|
+
|
|
3
|
+
export async function loadPool(pool: Pool, poolAddress: string): Promise<Pool> {
|
|
4
|
+
const dhedge = new Dhedge(pool.signer, pool.network);
|
|
5
|
+
return await dhedge.loadPool(poolAddress);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export async function isPool(
|
|
9
|
+
pool: Pool,
|
|
10
|
+
poolAddress: string
|
|
11
|
+
): Promise<boolean> {
|
|
12
|
+
const dhedge = new Dhedge(pool.signer, pool.network);
|
|
13
|
+
return await dhedge.validatePool(poolAddress);
|
|
14
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Dhedge } from "..";
|
|
2
|
+
import { Dapp, Network } from "../types";
|
|
3
|
+
import { TEST_POOL, USDC, WBTC } from "./constants";
|
|
4
|
+
import { getTxOptions } from "./txOptions";
|
|
5
|
+
|
|
6
|
+
import { wallet } from "./wallet";
|
|
7
|
+
|
|
8
|
+
let dhedge: Dhedge;
|
|
9
|
+
let options: any;
|
|
10
|
+
|
|
11
|
+
jest.setTimeout(100000);
|
|
12
|
+
|
|
13
|
+
describe("pool", () => {
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
dhedge = new Dhedge(wallet, Network.OPTIMISM);
|
|
16
|
+
options = await getTxOptions(Network.OPTIMISM);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// it("approves unlimited USDC on 1Inch", async () => {
|
|
20
|
+
// let result;
|
|
21
|
+
// const pool = await dhedge.loadPool(TEST_POOL);
|
|
22
|
+
// try {
|
|
23
|
+
// result = await pool.approve(
|
|
24
|
+
// Dapp.ONEINCH,
|
|
25
|
+
// USDC,
|
|
26
|
+
// ethers.constants.MaxInt256,
|
|
27
|
+
// options
|
|
28
|
+
// );
|
|
29
|
+
// console.log(result);
|
|
30
|
+
// } catch (e) {
|
|
31
|
+
// console.log(e);
|
|
32
|
+
// }
|
|
33
|
+
// expect(result).not.toBe(null);
|
|
34
|
+
// });
|
|
35
|
+
|
|
36
|
+
it("trades 1 USDC into WBTC on 1Inch", async () => {
|
|
37
|
+
let result;
|
|
38
|
+
const pool = await dhedge.loadPool(TEST_POOL);
|
|
39
|
+
try {
|
|
40
|
+
result = await pool.trade(
|
|
41
|
+
Dapp.ONEINCH,
|
|
42
|
+
USDC,
|
|
43
|
+
WBTC,
|
|
44
|
+
"1000000",
|
|
45
|
+
0.5,
|
|
46
|
+
options
|
|
47
|
+
);
|
|
48
|
+
console.log(result);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
console.log(e);
|
|
51
|
+
}
|
|
52
|
+
expect(result).not.toBe(null);
|
|
53
|
+
});
|
|
54
|
+
});
|
package/src/test/arrakis.test.ts
CHANGED
|
@@ -14,7 +14,7 @@ jest.setTimeout(100000);
|
|
|
14
14
|
describe("pool", () => {
|
|
15
15
|
beforeAll(async () => {
|
|
16
16
|
dhedge = new Dhedge(wallet, Network.POLYGON);
|
|
17
|
-
options = await getTxOptions();
|
|
17
|
+
options = await getTxOptions(Network.POLYGON);
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
// it("approves unlimited WETH on Arrakis", async () => {
|
|
@@ -69,7 +69,7 @@ describe("pool", () => {
|
|
|
69
69
|
const result = await pool.decreaseLiquidity(
|
|
70
70
|
Dapp.ARRAKIS,
|
|
71
71
|
ARRAKIS_USDC_WETH_GAUGE,
|
|
72
|
-
|
|
72
|
+
50.6576575755,
|
|
73
73
|
options
|
|
74
74
|
);
|
|
75
75
|
console.log("result", result);
|
package/src/test/constants.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
//Polygon
|
|
2
|
-
export const USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
|
|
3
|
-
export const WETH = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
|
|
4
|
-
export const USDT = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
|
|
5
|
-
export const DAI = "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063";
|
|
6
|
-
export const TUSD = "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756";
|
|
7
|
-
export const WBTC = "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6";
|
|
2
|
+
// export const USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
|
|
3
|
+
// //export const WETH = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
|
|
4
|
+
// export const USDT = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
|
|
5
|
+
// export const DAI = "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063";
|
|
6
|
+
// export const TUSD = "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756";
|
|
7
|
+
// export const WBTC = "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6";
|
|
8
8
|
export const SUSHI = "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a";
|
|
9
9
|
export const WMATIC = "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270";
|
|
10
10
|
export const BAL = "0x9a71012B13CA4d3D0Cdc72A177DF3ef03b0E76A3";
|
|
@@ -14,10 +14,16 @@ export const ARRAKIS_USDC_WETH_GAUGE =
|
|
|
14
14
|
"0x33d1ad9Cd88A509397CD924C2d7613C285602C20";
|
|
15
15
|
export const STMATIC = "0x3A58a54C066FdC0f2D55FC9C89F0415C92eBf3C4";
|
|
16
16
|
export const WMATIC_STMATIC_LP = "0xaF5E0B5425dE1F5a630A8cB5AA9D97B8141C908D";
|
|
17
|
+
export const AARAKIS_WNATIC_STMATIC_GAUGE =
|
|
18
|
+
"0x9928340f9E1aaAd7dF1D95E27bd9A5c715202a56";
|
|
19
|
+
export const ETHBULL3X = "0x460b60565cb73845d56564384ab84bf84c13e47d";
|
|
20
|
+
export const BTCBEAR2X = "0x3dbce2c8303609c17aa23b69ebe83c2f5c510ada";
|
|
17
21
|
|
|
18
22
|
//Optimism
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
export const WETH = "0x4200000000000000000000000000000000000006";
|
|
24
|
+
export const USDC = "0x7F5c764cBc14f9669B88837ca1490cCa17c31607";
|
|
25
|
+
export const DAI = "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1";
|
|
26
|
+
export const USDy = "0x1ec50880101022c11530a069690f5446d1464592";
|
|
27
|
+
export const WBTC = "0x68f180fcCe6836688e9084f035309E29Bf0A2095";
|
|
22
28
|
|
|
23
|
-
export const TEST_POOL = "
|
|
29
|
+
export const TEST_POOL = "TEST_POOL";
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Dhedge, ethers } from "..";
|
|
2
|
+
import {
|
|
3
|
+
getEasySwapperDepositQuote,
|
|
4
|
+
getEasySwapperWithdrawalQuote,
|
|
5
|
+
getPoolDepositAsset
|
|
6
|
+
} from "../services/toros/easySwapper";
|
|
7
|
+
import { Dapp, Network } from "../types";
|
|
8
|
+
import { BTCBEAR2X, ETHBULL3X, TEST_POOL, USDC, WBTC } from "./constants";
|
|
9
|
+
import { getTxOptions } from "./txOptions";
|
|
10
|
+
|
|
11
|
+
import { wallet } from "./wallet";
|
|
12
|
+
|
|
13
|
+
let dhedge: Dhedge;
|
|
14
|
+
let options: any;
|
|
15
|
+
|
|
16
|
+
jest.setTimeout(100000);
|
|
17
|
+
|
|
18
|
+
describe("pool", () => {
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
dhedge = new Dhedge(wallet, Network.POLYGON);
|
|
21
|
+
options = await getTxOptions(Network.POLYGON);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("gets Deposit Quote for ETHBULL3X invest with USDC", async () => {
|
|
25
|
+
let result;
|
|
26
|
+
const pool = await dhedge.loadPool(ETHBULL3X);
|
|
27
|
+
try {
|
|
28
|
+
const depositAsset = await getPoolDepositAsset(pool, ETHBULL3X);
|
|
29
|
+
if (!depositAsset) throw new Error("no deposit assets");
|
|
30
|
+
|
|
31
|
+
result = await getEasySwapperDepositQuote(
|
|
32
|
+
pool,
|
|
33
|
+
pool.address,
|
|
34
|
+
USDC,
|
|
35
|
+
depositAsset,
|
|
36
|
+
ethers.BigNumber.from("100000000")
|
|
37
|
+
);
|
|
38
|
+
console.log("deposit quote", result.toString());
|
|
39
|
+
} catch (e) {
|
|
40
|
+
console.log(e);
|
|
41
|
+
}
|
|
42
|
+
expect(result).not.toBe(null);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("gets withdrawal Quote for BTCBEAR2X sell for WBTC", async () => {
|
|
46
|
+
let result;
|
|
47
|
+
const pool = await dhedge.loadPool(BTCBEAR2X);
|
|
48
|
+
try {
|
|
49
|
+
result = await getEasySwapperWithdrawalQuote(
|
|
50
|
+
pool,
|
|
51
|
+
pool.address,
|
|
52
|
+
WBTC,
|
|
53
|
+
ethers.BigNumber.from("9751590099507644982205")
|
|
54
|
+
);
|
|
55
|
+
console.log("withdrawal quote", result.toString());
|
|
56
|
+
} catch (e) {
|
|
57
|
+
console.log(e);
|
|
58
|
+
}
|
|
59
|
+
expect(result).not.toBe(null);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("approves unlimited ETHBULL3X on Easyswapper", async () => {
|
|
63
|
+
let result;
|
|
64
|
+
const pool = await dhedge.loadPool(TEST_POOL);
|
|
65
|
+
try {
|
|
66
|
+
result = await pool.approve(
|
|
67
|
+
Dapp.TOROS,
|
|
68
|
+
ETHBULL3X,
|
|
69
|
+
ethers.constants.MaxInt256,
|
|
70
|
+
options
|
|
71
|
+
);
|
|
72
|
+
console.log(result);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
console.log(e);
|
|
75
|
+
}
|
|
76
|
+
expect(result).not.toBe(null);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// it("buys ETHBULL3X for 1 USDC", async () => {
|
|
80
|
+
// let result;
|
|
81
|
+
// const pool = await dhedge.loadPool(TEST_POOL);
|
|
82
|
+
// try {
|
|
83
|
+
// result = await pool.trade(
|
|
84
|
+
// Dapp.TOROS,
|
|
85
|
+
// USDC,
|
|
86
|
+
// ETHBULL3X,
|
|
87
|
+
// "1000000",
|
|
88
|
+
// 0.5,
|
|
89
|
+
// options
|
|
90
|
+
// );
|
|
91
|
+
// console.log(result);
|
|
92
|
+
// } catch (e) {
|
|
93
|
+
// console.log(e);
|
|
94
|
+
// }
|
|
95
|
+
// expect(result).not.toBe(null);
|
|
96
|
+
// });
|
|
97
|
+
|
|
98
|
+
it("sells ETHBULL3X balance for USDC", async () => {
|
|
99
|
+
let result;
|
|
100
|
+
const pool = await dhedge.loadPool(TEST_POOL);
|
|
101
|
+
const balance = await pool.utils.getBalance(ETHBULL3X, pool.address);
|
|
102
|
+
try {
|
|
103
|
+
result = await pool.trade(
|
|
104
|
+
Dapp.TOROS,
|
|
105
|
+
ETHBULL3X,
|
|
106
|
+
USDC,
|
|
107
|
+
balance,
|
|
108
|
+
3,
|
|
109
|
+
options
|
|
110
|
+
);
|
|
111
|
+
console.log(result);
|
|
112
|
+
} catch (e) {
|
|
113
|
+
console.log(e);
|
|
114
|
+
}
|
|
115
|
+
expect(result).not.toBe(null);
|
|
116
|
+
});
|
|
117
|
+
});
|
package/src/test/txOptions.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
2
|
import BigNumber from "bignumber.js";
|
|
3
|
+
import { Network } from "../types";
|
|
3
4
|
|
|
4
5
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
-
export const getTxOptions = async (): Promise<any> => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
export const getTxOptions = async (network: Network): Promise<any> => {
|
|
7
|
+
if (network === Network.POLYGON) {
|
|
8
|
+
const result = await axios("https://gasstation-mainnet.matic.network/v2");
|
|
9
|
+
return {
|
|
10
|
+
gasLimit: "3000000",
|
|
11
|
+
maxPriorityFeePerGas: new BigNumber(result.data.fast.maxPriorityFee)
|
|
12
|
+
.shiftedBy(9)
|
|
13
|
+
.toFixed(0),
|
|
14
|
+
maxFeePerGas: new BigNumber(result.data.fast.maxFee)
|
|
15
|
+
.shiftedBy(9)
|
|
16
|
+
.toFixed(0),
|
|
17
|
+
};
|
|
18
|
+
} else {
|
|
19
|
+
return { gasLimit: "3000000" };
|
|
20
|
+
}
|
|
15
21
|
};
|