@dhedge/v2-sdk 1.9.7 → 1.9.9
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/README.md +38 -4
- package/dist/config.d.ts +7 -1
- package/dist/entities/pool.d.ts +26 -5
- package/dist/services/flatmoney/keeperFee.d.ts +6 -0
- package/dist/services/flatmoney/stableLp.d.ts +9 -0
- package/dist/services/flatmoney/stableModule.d.ts +4 -0
- package/dist/test/utils/testingHelper.d.ts +2 -1
- package/dist/test/wallet.d.ts +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/v2-sdk.cjs.development.js +2901 -6
- 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 +2901 -6
- package/dist/v2-sdk.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/flatmoney/DelayedOrder.json +547 -0
- package/src/abi/flatmoney/IFlatcoinVault.json +570 -0
- package/src/abi/flatmoney/KeeperFee.json +364 -0
- package/src/abi/flatmoney/StableModule.json +770 -0
- package/src/config.ts +22 -1
- package/src/entities/pool.ts +73 -4
- package/src/services/flatmoney/keeperFee.ts +84 -0
- package/src/services/flatmoney/stableLp.ts +135 -0
- package/src/services/flatmoney/stableModule.ts +43 -0
- package/src/test/aerodrome.test.ts +154 -0
- package/src/test/flatmoney.test.ts +164 -0
- package/src/test/utils/testingHelper.ts +4 -3
- package/src/test/wallet.ts +4 -1
- package/src/types.ts +2 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import BigNumber from "bignumber.js";
|
|
3
|
+
import { Dhedge, Pool } from "../entities";
|
|
4
|
+
import { AssetEnabled, Network } from "../types";
|
|
5
|
+
import {
|
|
6
|
+
TestingRunParams,
|
|
7
|
+
setTokenAmount,
|
|
8
|
+
testingHelper
|
|
9
|
+
} from "./utils/testingHelper";
|
|
10
|
+
import { Contract, ethers } from "ethers";
|
|
11
|
+
import { CONTRACT_ADDRESS, MAX_AMOUNT, TEST_POOL } from "./constants";
|
|
12
|
+
import { flatMoneyContractAddresses } from "../config";
|
|
13
|
+
import DelayedOrderAbi from "../abi/flatmoney/DelayedOrder.json";
|
|
14
|
+
import { allowanceDelta } from "./utils/token";
|
|
15
|
+
import { getKeeperFee } from "../services/flatmoney/keeperFee";
|
|
16
|
+
|
|
17
|
+
const RETH = "0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c";
|
|
18
|
+
const RETH_SLOT = 0;
|
|
19
|
+
const UNIT = "0xb95fB324b8A2fAF8ec4f76e3dF46C718402736e2";
|
|
20
|
+
// https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/contracts/token/ERC20/ERC20Upgradeable.sol#L31
|
|
21
|
+
// https://eips.ethereum.org/EIPS/eip-7201
|
|
22
|
+
const UNIT_SLOT =
|
|
23
|
+
"0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00";
|
|
24
|
+
|
|
25
|
+
const testFlatMoney = ({
|
|
26
|
+
wallet,
|
|
27
|
+
network,
|
|
28
|
+
provider,
|
|
29
|
+
rpcUrl
|
|
30
|
+
}: TestingRunParams) => {
|
|
31
|
+
let dhedge: Dhedge;
|
|
32
|
+
let pool: Pool;
|
|
33
|
+
let delayOrderContract: Contract;
|
|
34
|
+
jest.setTimeout(200000);
|
|
35
|
+
describe(`flatmoney on ${network}`, () => {
|
|
36
|
+
beforeAll(async () => {
|
|
37
|
+
dhedge = new Dhedge(wallet, network);
|
|
38
|
+
pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
39
|
+
|
|
40
|
+
const flatMoneyContracts = flatMoneyContractAddresses[pool.network];
|
|
41
|
+
if (!flatMoneyContracts) {
|
|
42
|
+
throw new Error("testFlatMoney: network not supported");
|
|
43
|
+
}
|
|
44
|
+
delayOrderContract = new Contract(
|
|
45
|
+
flatMoneyContracts.DelayedOrder,
|
|
46
|
+
DelayedOrderAbi,
|
|
47
|
+
pool.signer
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// top up gas
|
|
51
|
+
await provider.send("hardhat_setBalance", [
|
|
52
|
+
wallet.address,
|
|
53
|
+
"0x10000000000000000"
|
|
54
|
+
]);
|
|
55
|
+
await provider.send("evm_mine", []);
|
|
56
|
+
|
|
57
|
+
await setTokenAmount({
|
|
58
|
+
amount: new BigNumber(100).times(1e18).toString(),
|
|
59
|
+
provider,
|
|
60
|
+
tokenAddress: RETH,
|
|
61
|
+
slot: RETH_SLOT,
|
|
62
|
+
userAddress: pool.address
|
|
63
|
+
});
|
|
64
|
+
await setTokenAmount({
|
|
65
|
+
amount: new BigNumber(100).times(1e18).toString(),
|
|
66
|
+
provider,
|
|
67
|
+
tokenAddress: UNIT,
|
|
68
|
+
slot: UNIT_SLOT,
|
|
69
|
+
userAddress: pool.address
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const currentAssets: any[] = await pool.managerLogic.getSupportedAssets();
|
|
73
|
+
const exisitingAssets = currentAssets.map(item => {
|
|
74
|
+
return {
|
|
75
|
+
asset: item[0],
|
|
76
|
+
isDeposit: item[1]
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const newAssets: AssetEnabled[] = [
|
|
81
|
+
...exisitingAssets,
|
|
82
|
+
{ asset: CONTRACT_ADDRESS[network].USDC, isDeposit: true },
|
|
83
|
+
{ asset: CONTRACT_ADDRESS[network].WETH, isDeposit: true },
|
|
84
|
+
{
|
|
85
|
+
asset: UNIT,
|
|
86
|
+
isDeposit: false
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
asset: RETH,
|
|
90
|
+
isDeposit: false
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
await pool.changeAssets(newAssets);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("mint UNIT", async () => {
|
|
97
|
+
//approve
|
|
98
|
+
await pool.approveSpender(delayOrderContract.address, RETH, MAX_AMOUNT);
|
|
99
|
+
const collateralAllowanceDelta = await allowanceDelta(
|
|
100
|
+
pool.address,
|
|
101
|
+
RETH,
|
|
102
|
+
delayOrderContract.address,
|
|
103
|
+
pool.signer
|
|
104
|
+
);
|
|
105
|
+
await expect(collateralAllowanceDelta.gt(0));
|
|
106
|
+
|
|
107
|
+
const depositAmountStr = new BigNumber(1).times(1e18).toString();
|
|
108
|
+
const tx = await pool.mintUnitViaFlatMoney(
|
|
109
|
+
depositAmountStr,
|
|
110
|
+
0.5,
|
|
111
|
+
10, // set higher to tolerate high gasPrice returned by forked local chain
|
|
112
|
+
null,
|
|
113
|
+
false
|
|
114
|
+
);
|
|
115
|
+
expect(tx).not.toBe(null);
|
|
116
|
+
const existingOrder = await delayOrderContract.getAnnouncedOrder(
|
|
117
|
+
pool.address
|
|
118
|
+
);
|
|
119
|
+
expect(existingOrder.orderType).toBe(1);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("cancel order", async () => {
|
|
123
|
+
await provider.send("evm_increaseTime", [60 * 2]); // more than 1 min
|
|
124
|
+
await pool.cancelOrderViaFlatMoney();
|
|
125
|
+
const existingOrder = await delayOrderContract.getAnnouncedOrder(
|
|
126
|
+
pool.address
|
|
127
|
+
);
|
|
128
|
+
expect(existingOrder.orderType).toBe(0);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("redeem UNIT", async () => {
|
|
132
|
+
const withdrawAmountStr = new BigNumber(2).times(1e18).toString();
|
|
133
|
+
const tx = await pool.redeemUnitViaFlatMoney(
|
|
134
|
+
withdrawAmountStr,
|
|
135
|
+
0.5,
|
|
136
|
+
10, // set higher to tolerate high gasPrice returned by forked local chain
|
|
137
|
+
null,
|
|
138
|
+
false
|
|
139
|
+
);
|
|
140
|
+
expect(tx).not.toBe(null);
|
|
141
|
+
const existingOrder = await delayOrderContract.getAnnouncedOrder(
|
|
142
|
+
pool.address
|
|
143
|
+
);
|
|
144
|
+
expect(existingOrder.orderType).toBe(2);
|
|
145
|
+
|
|
146
|
+
await provider.send("evm_increaseTime", [60 * 2]); // more than 1 min
|
|
147
|
+
await pool.cancelOrderViaFlatMoney();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("keeperFee is small", async () => {
|
|
151
|
+
const provider = new ethers.providers.JsonRpcProvider(rpcUrl);
|
|
152
|
+
const walletOnChain = wallet.connect(provider);
|
|
153
|
+
const dhedge = new Dhedge(walletOnChain, network);
|
|
154
|
+
const pool = await dhedge.loadPool(TEST_POOL[network]);
|
|
155
|
+
const keeperFee = await getKeeperFee(pool, 3);
|
|
156
|
+
expect(keeperFee).toBeTruthy();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
testingHelper({
|
|
162
|
+
network: Network.BASE,
|
|
163
|
+
testingRun: testFlatMoney
|
|
164
|
+
});
|
|
@@ -7,6 +7,7 @@ export type TestingRunParams = {
|
|
|
7
7
|
network: Network;
|
|
8
8
|
wallet: ethers.Wallet;
|
|
9
9
|
provider: ethers.providers.JsonRpcProvider;
|
|
10
|
+
rpcUrl: string;
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
type TestHelperParams = {
|
|
@@ -17,8 +18,8 @@ export const testingHelper = ({
|
|
|
17
18
|
network,
|
|
18
19
|
testingRun
|
|
19
20
|
}: TestHelperParams): void => {
|
|
20
|
-
const { wallet, provider } = getWalletData(network);
|
|
21
|
-
testingRun({ network, wallet, provider });
|
|
21
|
+
const { wallet, provider, rpcUrl } = getWalletData(network);
|
|
22
|
+
testingRun({ network, wallet, provider, rpcUrl });
|
|
22
23
|
};
|
|
23
24
|
|
|
24
25
|
export const beforeAfterReset = ({
|
|
@@ -52,7 +53,7 @@ export const setTokenAmount = async ({
|
|
|
52
53
|
amount: string;
|
|
53
54
|
userAddress: string;
|
|
54
55
|
tokenAddress: string;
|
|
55
|
-
slot: number;
|
|
56
|
+
slot: number | string;
|
|
56
57
|
provider: ethers.providers.JsonRpcProvider;
|
|
57
58
|
}): Promise<void> => {
|
|
58
59
|
const toBytes32 = (bn: string) => {
|
package/src/test/wallet.ts
CHANGED
|
@@ -38,12 +38,15 @@ export const getWalletData = (
|
|
|
38
38
|
): {
|
|
39
39
|
wallet: ethers.Wallet;
|
|
40
40
|
provider: ethers.providers.JsonRpcProvider;
|
|
41
|
+
rpcUrl: string;
|
|
41
42
|
} => {
|
|
42
43
|
const provider = new ethers.providers.JsonRpcProvider(
|
|
43
44
|
`http://127.0.0.1:${networkPortMap[network]}/`
|
|
44
45
|
);
|
|
46
|
+
const rpcUrl = process.env[`${network.toUpperCase()}_URL`] || "";
|
|
45
47
|
return {
|
|
46
48
|
wallet: new ethers.Wallet(process.env.PRIVATE_KEY as string, provider),
|
|
47
|
-
provider
|
|
49
|
+
provider,
|
|
50
|
+
rpcUrl
|
|
48
51
|
};
|
|
49
52
|
};
|