@dripfi/drip-sdk 1.2.3 → 1.2.5-dev.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/dist/DripApi.d.ts +12 -1
- package/dist/DripApi.js +91 -6
- package/dist/DripSdk.d.ts +15 -2
- package/dist/DripSdk.js +138 -6
- package/dist/index.d.ts +3 -1
- package/dist/test.js +42 -12
- package/dist/types/DeployedMetaVault.d.ts +6 -0
- package/dist/types/DeployedMetaVault.js +2 -0
- package/dist/types/MetaVault.d.ts +17 -0
- package/dist/types/MetaVault.js +2 -0
- package/dist/types/UserMetaVaultBalance.d.ts +6 -0
- package/dist/types/UserMetaVaultBalance.js +2 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +47 -0
- package/package.json +1 -1
package/dist/DripApi.d.ts
CHANGED
@@ -8,18 +8,23 @@ import { UserBalance } from './types/UserBalance';
|
|
8
8
|
import { VaultClaimData } from './types/VaultClaimData';
|
9
9
|
import MyPerqData from './types/MyPerqData';
|
10
10
|
import { BeansBalance } from './types/BeansBalance';
|
11
|
+
import { MetaVault } from './types/MetaVault';
|
12
|
+
import { MetaVaultClaimableFlushes } from '@spool.fi/spool-v2-sdk';
|
13
|
+
import { UserMetaVaultBalance } from './types/UserMetaVaultBalance';
|
11
14
|
import { PerqToBeansSwapInfo } from './types/PerqToBeansSwapInfo';
|
12
15
|
export declare const IMPERSONATOR_HEADER = "impersonatorAddress";
|
13
16
|
export default class DripApi {
|
14
17
|
route: string;
|
15
18
|
constructor(route: string);
|
16
19
|
fetchAllVaults(): Promise<Vault[]>;
|
20
|
+
fetchAllMetaVaults(): Promise<MetaVault[]>;
|
17
21
|
fetchTokenPrice(tokenName: string): Promise<number>;
|
18
22
|
getExpectedSwapResult(fromTokenAddress: string, toTokenAddress: string, amount: string, decimals: number, token: string): Promise<string>;
|
19
23
|
getUserBalance(walletAddress: string, token: string, headers?: Headers): Promise<UserBalance>;
|
20
24
|
getUserBoostedNfts(walletAddress: string, vaultAddress: string, token: string, headers?: Headers): Promise<string[]>;
|
21
25
|
fetchVaultStats(): Promise<VaultStats>;
|
22
26
|
fetchVaultDetails(vaultAddress: string): Promise<Vault>;
|
27
|
+
fetchMetaVaultDetails(metaVaultAddress: string): Promise<MetaVault>;
|
23
28
|
fetchRewardsPerHour(vaultAddress: string, token: string): Promise<number>;
|
24
29
|
getSwapInfo(fromTokenAddress: string, toTokenAddress: string, amount: BigNumber, fromAddress: string): Promise<SwapInfo[]>;
|
25
30
|
fetchUserSVTBalance(vaultAddress: string, walletAddress: string, token: string): Promise<BigNumber>;
|
@@ -33,7 +38,7 @@ export default class DripApi {
|
|
33
38
|
fetchFastWithdrawNFTs(vaultAddress: string, walletAddress: string, token: string, headers?: Headers): Promise<QLFastRedeem[]>;
|
34
39
|
fetchUserRewards(walletAddress: string, token: string, headers?: Headers): Promise<UserRewards>;
|
35
40
|
fetchVaultsClaimableData(walletAddress: string, token: string, headers?: Headers): Promise<VaultClaimData>;
|
36
|
-
fetchAllLoyaltyCards(
|
41
|
+
fetchAllLoyaltyCards(): Promise<any>;
|
37
42
|
fetchOwnedLoyaltyCards(token: string, headers?: Headers): Promise<{
|
38
43
|
id: any;
|
39
44
|
tier: any;
|
@@ -56,7 +61,13 @@ export default class DripApi {
|
|
56
61
|
cost: number;
|
57
62
|
boost: any;
|
58
63
|
}>;
|
64
|
+
fetchUserMetaVaultBalance(userAddress: string, metaVaultAddress: string, token: string, headers?: Headers): Promise<any>;
|
59
65
|
fetchMyPerqData(userAddress: string, token: string, headers?: Headers): Promise<MyPerqData>;
|
60
66
|
getLoyaltyCardBoost(rewardId: string, token: string, headers?: Headers): Promise<number>;
|
67
|
+
fetchMyPerqMetaVaultsData(userAddress: string, token: string, headers?: Headers): Promise<MyPerqData>;
|
68
|
+
fetchAllUserMetaVaultBalance(userAddress: string, token: string, headers?: Headers): Promise<{
|
69
|
+
[metaVaultAddress: string]: UserMetaVaultBalance;
|
70
|
+
}>;
|
71
|
+
fetchClaimableFlushes(userAddress: string, metaVaultAddress: string, token: string, headers?: Headers): Promise<MetaVaultClaimableFlushes>;
|
61
72
|
getSwapPerqForBeansInfo(): Promise<PerqToBeansSwapInfo>;
|
62
73
|
}
|
package/dist/DripApi.js
CHANGED
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.IMPERSONATOR_HEADER = void 0;
|
13
13
|
const ethers_1 = require("ethers");
|
14
14
|
const DripConfig_1 = require("./DripConfig");
|
15
|
+
const utils_1 = require("./utils");
|
15
16
|
const WETH_TOKEN_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2';
|
16
17
|
exports.IMPERSONATOR_HEADER = 'impersonatorAddress';
|
17
18
|
const AUTHORIZATION_HEADER = 'Authorization';
|
@@ -31,6 +32,21 @@ class DripApi {
|
|
31
32
|
}
|
32
33
|
});
|
33
34
|
}
|
35
|
+
fetchAllMetaVaults() {
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
37
|
+
const res = yield fetch(`${this.route}/api-be/api/metavault`);
|
38
|
+
if (res.ok) {
|
39
|
+
const data = yield res.json();
|
40
|
+
const metaVaults = data.map((metaVault) => {
|
41
|
+
return Object.assign(Object.assign({}, metaVault), { liveUntilFormatted: (0, utils_1.getMonthDayUTCTimeString)(metaVault.liveUntil), hasPoolEnded: (0, utils_1.hasPoolEnded)(metaVault.liveUntil) });
|
42
|
+
});
|
43
|
+
return metaVaults;
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
throw Error(`${yield res.text()}`);
|
47
|
+
}
|
48
|
+
});
|
49
|
+
}
|
34
50
|
fetchTokenPrice(tokenName) {
|
35
51
|
return __awaiter(this, void 0, void 0, function* () {
|
36
52
|
const res = yield fetch(`${this.route}/api-be/api/tokenPrice?tokenName=${tokenName}`);
|
@@ -127,6 +143,18 @@ class DripApi {
|
|
127
143
|
}
|
128
144
|
});
|
129
145
|
}
|
146
|
+
fetchMetaVaultDetails(metaVaultAddress) {
|
147
|
+
return __awaiter(this, void 0, void 0, function* () {
|
148
|
+
const res = yield fetch(`${this.route}/api-be/api/metavault/${metaVaultAddress}`);
|
149
|
+
if (res.ok) {
|
150
|
+
const data = (yield res.json());
|
151
|
+
return data;
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
throw Error(`${yield res.text()}`);
|
155
|
+
}
|
156
|
+
});
|
157
|
+
}
|
130
158
|
fetchRewardsPerHour(vaultAddress, token) {
|
131
159
|
return __awaiter(this, void 0, void 0, function* () {
|
132
160
|
const headers = new Headers();
|
@@ -356,13 +384,9 @@ class DripApi {
|
|
356
384
|
}
|
357
385
|
});
|
358
386
|
}
|
359
|
-
fetchAllLoyaltyCards(
|
387
|
+
fetchAllLoyaltyCards() {
|
360
388
|
return __awaiter(this, void 0, void 0, function* () {
|
361
|
-
const
|
362
|
-
reqHeaders.append(AUTHORIZATION_HEADER, token);
|
363
|
-
const res = yield fetch(`${this.route}/api-be/api/loyaltyCards`, {
|
364
|
-
headers: reqHeaders,
|
365
|
-
});
|
389
|
+
const res = yield fetch(`${this.route}/api-be/api/loyaltyCards`);
|
366
390
|
const data = yield res.json();
|
367
391
|
const mappedData = data.map((element) => {
|
368
392
|
return {
|
@@ -450,6 +474,20 @@ class DripApi {
|
|
450
474
|
};
|
451
475
|
});
|
452
476
|
}
|
477
|
+
fetchUserMetaVaultBalance(userAddress, metaVaultAddress, token, headers) {
|
478
|
+
return __awaiter(this, void 0, void 0, function* () {
|
479
|
+
const reqHeaders = headers ? headers : new Headers();
|
480
|
+
reqHeaders.append(AUTHORIZATION_HEADER, token);
|
481
|
+
if (reqHeaders.has(exports.IMPERSONATOR_HEADER)) {
|
482
|
+
userAddress = reqHeaders.get(exports.IMPERSONATOR_HEADER);
|
483
|
+
}
|
484
|
+
const res = yield fetch(`${this.route}/api-be/api/user/metavault/balance/${userAddress}/${metaVaultAddress}`, {
|
485
|
+
headers: reqHeaders,
|
486
|
+
});
|
487
|
+
const data = yield res.json();
|
488
|
+
return data;
|
489
|
+
});
|
490
|
+
}
|
453
491
|
fetchMyPerqData(userAddress, token, headers) {
|
454
492
|
return __awaiter(this, void 0, void 0, function* () {
|
455
493
|
const reqHeaders = headers ? headers : new Headers();
|
@@ -485,6 +523,53 @@ class DripApi {
|
|
485
523
|
}
|
486
524
|
});
|
487
525
|
}
|
526
|
+
fetchMyPerqMetaVaultsData(userAddress, token, headers) {
|
527
|
+
return __awaiter(this, void 0, void 0, function* () {
|
528
|
+
const reqHeaders = headers ? headers : new Headers();
|
529
|
+
reqHeaders.append(AUTHORIZATION_HEADER, token);
|
530
|
+
if (reqHeaders.has(exports.IMPERSONATOR_HEADER)) {
|
531
|
+
userAddress = reqHeaders.get(exports.IMPERSONATOR_HEADER);
|
532
|
+
}
|
533
|
+
const res = yield fetch(`${this.route}/api-be/api/myperq/metavaults/${userAddress}`, {
|
534
|
+
headers: reqHeaders,
|
535
|
+
});
|
536
|
+
if (res.ok) {
|
537
|
+
const data = yield res.json();
|
538
|
+
return data;
|
539
|
+
}
|
540
|
+
else {
|
541
|
+
throw Error(`${yield res.text()}`);
|
542
|
+
}
|
543
|
+
});
|
544
|
+
}
|
545
|
+
fetchAllUserMetaVaultBalance(userAddress, token, headers) {
|
546
|
+
return __awaiter(this, void 0, void 0, function* () {
|
547
|
+
const reqHeaders = headers ? headers : new Headers();
|
548
|
+
reqHeaders.append(AUTHORIZATION_HEADER, token);
|
549
|
+
if (reqHeaders.has(exports.IMPERSONATOR_HEADER)) {
|
550
|
+
userAddress = reqHeaders.get(exports.IMPERSONATOR_HEADER);
|
551
|
+
}
|
552
|
+
const res = yield fetch(`${this.route}/api-be/api/user/metavault/balance/${userAddress}`, {
|
553
|
+
headers: reqHeaders,
|
554
|
+
});
|
555
|
+
const data = yield res.json();
|
556
|
+
return data;
|
557
|
+
});
|
558
|
+
}
|
559
|
+
fetchClaimableFlushes(userAddress, metaVaultAddress, token, headers) {
|
560
|
+
return __awaiter(this, void 0, void 0, function* () {
|
561
|
+
const reqHeaders = headers ? headers : new Headers();
|
562
|
+
reqHeaders.append(AUTHORIZATION_HEADER, token);
|
563
|
+
if (reqHeaders.has(exports.IMPERSONATOR_HEADER)) {
|
564
|
+
userAddress = reqHeaders.get(exports.IMPERSONATOR_HEADER);
|
565
|
+
}
|
566
|
+
const res = yield fetch(`${this.route}/api-be/api/metavault/claimableFlushes/${metaVaultAddress}/${userAddress}`, {
|
567
|
+
headers: reqHeaders,
|
568
|
+
});
|
569
|
+
const data = yield res.json();
|
570
|
+
return data;
|
571
|
+
});
|
572
|
+
}
|
488
573
|
getSwapPerqForBeansInfo() {
|
489
574
|
return __awaiter(this, void 0, void 0, function* () {
|
490
575
|
const res = yield fetch(`${this.route}/api-be/api/swap/price`, {});
|
package/dist/DripSdk.d.ts
CHANGED
@@ -11,6 +11,8 @@ import MyPerqData from './types/MyPerqData';
|
|
11
11
|
import { Chain } from './DripConfig';
|
12
12
|
import { BeansBalance } from './types/BeansBalance';
|
13
13
|
import { PerqToBeansSwapInfo } from './types/PerqToBeansSwapInfo';
|
14
|
+
import { MetaVault } from './types/MetaVault';
|
15
|
+
import { UserMetaVaultBalance } from './types/UserMetaVaultBalance';
|
14
16
|
export default class DripSdk {
|
15
17
|
private dripApi;
|
16
18
|
private dripTokenContract;
|
@@ -20,6 +22,7 @@ export default class DripSdk {
|
|
20
22
|
private dripConfig;
|
21
23
|
constructor(chain: Chain, signer?: Signer, dripRoute?: string);
|
22
24
|
getAllVaults(): Promise<Vault[]>;
|
25
|
+
getAllMetaVaults(): Promise<MetaVault[]>;
|
23
26
|
getVaultDetails(vaultAddress: string): Promise<Vault>;
|
24
27
|
getVaultStats(): Promise<VaultStats>;
|
25
28
|
getTokenPrice(tokenName: string): Promise<number>;
|
@@ -28,6 +31,7 @@ export default class DripSdk {
|
|
28
31
|
authenticate(): Promise<boolean>;
|
29
32
|
newDeposit(tokenAddress: string, vaultAddress: string, amount: string): Promise<string>;
|
30
33
|
deposit(tokenAddress: string, vaultAddress: string, amount: string): Promise<string>;
|
34
|
+
depositMetaVault(metaVaultAddress: string, amount: string): Promise<string>;
|
31
35
|
private doDeposit;
|
32
36
|
getTokenAllowanceForCurrency(tokenAddress: string): Promise<string>;
|
33
37
|
getTokenAllowanceForRecycler(tokenAddress: string): Promise<BigNumber>;
|
@@ -37,12 +41,20 @@ export default class DripSdk {
|
|
37
41
|
getRewardsPerHour(vaultAddress: string): Promise<number>;
|
38
42
|
getRewards(headers?: Headers): Promise<UserRewards>;
|
39
43
|
getMyPerqBalance(headers?: Headers): Promise<MyPerqData>;
|
44
|
+
getMyPerqMetaVaultsBalance(headers?: Headers): Promise<MyPerqData>;
|
40
45
|
getUserVaultBalance(vaultAddress: string, headers?: Headers): Promise<UserVaultBalance>;
|
46
|
+
getUserMetaVaultBalance(metaVaultAddress: string, headers?: Headers): Promise<UserMetaVaultBalance>;
|
47
|
+
getAllUserMetaVaultBalance(headers?: Headers): Promise<{
|
48
|
+
[metaVaultAddress: string]: UserMetaVaultBalance;
|
49
|
+
}>;
|
41
50
|
fastWithdraw(vaultAddress: string, amountToWithdraw?: string): Promise<string>;
|
42
51
|
swapAndDeposit(fromTokenAddress: string, toTokenAddress: string, fromTokenAmount: string, vaultAddress: string, ethAmount?: string): Promise<string>;
|
43
52
|
newSwapAndDeposit(fromTokenAddress: string, toTokenAddress: string, fromTokenAmount: string, vaultAddress: string, ethAmount?: string): Promise<string>;
|
53
|
+
swapAndDepositMetaVault(metaVaultAddress: string, fromTokenAddress: string, toTokenAddress: string, fromTokenAmount: string): Promise<void>;
|
44
54
|
private doSwapAndDeposit;
|
45
55
|
withdraw(vaultAddress: string, amountToWithdraw?: string): Promise<string>;
|
56
|
+
withdrawMetavault(metaVaultAddress: string, amount?: string): Promise<string>;
|
57
|
+
claimWithdrawsMetaVault(metaVaultAddress: string): Promise<string>;
|
46
58
|
claimWithdraws(vaultAddress: string): Promise<string>;
|
47
59
|
getVaultsClaimableData(headers?: Headers): Promise<VaultClaimData>;
|
48
60
|
getBeansBalance(headers?: Headers): Promise<BeansBalance>;
|
@@ -50,13 +62,14 @@ export default class DripSdk {
|
|
50
62
|
upgradeLoyaltyCard(): Promise<LoyaltyCard>;
|
51
63
|
getNextLoyaltyCard(headers?: Headers): Promise<LoyaltyCard>;
|
52
64
|
getOwnedLoyaltyCards(headers?: Headers): Promise<LoyaltyCard>;
|
53
|
-
getAllLoyaltyCards(
|
65
|
+
getAllLoyaltyCards(): Promise<LoyaltyCard[]>;
|
54
66
|
getLoyaltyCardBoost(rewardId: string, headers?: Headers): Promise<number>;
|
55
67
|
approveTokenForRecycler(tokenAddress: string, amount: string): Promise<string>;
|
56
68
|
approveTokenForSwapAndDeposit(tokenAddress: string, amount: string): Promise<string>;
|
57
69
|
approveTokenForDeposit(tokenAddress: string, amount: string): Promise<string>;
|
58
70
|
getDripTokenContractAddress(): string;
|
59
71
|
getSwapPerqForBeansInfo(): Promise<PerqToBeansSwapInfo>;
|
72
|
+
approveTokenForMetaVaultDeposit(tokenAddress: string, metaVaultAddress: string, amount: string): Promise<string>;
|
60
73
|
private generateRedeemBagStruct;
|
61
74
|
private getERC20Precission;
|
62
75
|
private calculatePendingDeposits;
|
@@ -67,5 +80,5 @@ export default class DripSdk {
|
|
67
80
|
private getTokenAllowanceForDeposit;
|
68
81
|
private getTokenAllowanceForSwapAndDeposit;
|
69
82
|
private getERC20TokenAllowance;
|
70
|
-
|
83
|
+
approveToken(tokenAddress: string, amount: string, spender: string): Promise<string>;
|
71
84
|
}
|
package/dist/DripSdk.js
CHANGED
@@ -36,6 +36,11 @@ class DripSdk {
|
|
36
36
|
return this.dripApi.fetchAllVaults();
|
37
37
|
});
|
38
38
|
}
|
39
|
+
getAllMetaVaults() {
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
41
|
+
return this.dripApi.fetchAllMetaVaults();
|
42
|
+
});
|
43
|
+
}
|
39
44
|
getVaultDetails(vaultAddress) {
|
40
45
|
return __awaiter(this, void 0, void 0, function* () {
|
41
46
|
return this.dripApi.fetchVaultDetails(vaultAddress);
|
@@ -116,6 +121,23 @@ class DripSdk {
|
|
116
121
|
return this.doDeposit(tokenAddress, vaultAddress, amount, true);
|
117
122
|
});
|
118
123
|
}
|
124
|
+
depositMetaVault(metaVaultAddress, amount) {
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
126
|
+
if (!this.signer) {
|
127
|
+
throw Error('No signer provided');
|
128
|
+
}
|
129
|
+
const metavault = yield this.dripApi.fetchMetaVaultDetails(metaVaultAddress);
|
130
|
+
if (!metavault) {
|
131
|
+
throw Error('Metavault not found');
|
132
|
+
}
|
133
|
+
const decimals = yield this.getERC20Precission(metavault.depositToken.tokenAddress);
|
134
|
+
const amountWithDecimals = parseFloat(parseFloat(amount).toFixed(decimals));
|
135
|
+
const amountToDeposit = ethers_1.ethers.utils.parseUnits(amountWithDecimals.toString(), decimals);
|
136
|
+
const depositTx = yield this.spoolSdk.metaVaultDeposit(metaVaultAddress.toLowerCase(), amountToDeposit);
|
137
|
+
const txReceipt = yield depositTx.wait();
|
138
|
+
return txReceipt.transactionHash;
|
139
|
+
});
|
140
|
+
}
|
119
141
|
doDeposit(tokenAddress, vaultAddress, amount, checkAllowance) {
|
120
142
|
return __awaiter(this, void 0, void 0, function* () {
|
121
143
|
if (!this.signer) {
|
@@ -212,6 +234,14 @@ class DripSdk {
|
|
212
234
|
return myPerqBalance;
|
213
235
|
});
|
214
236
|
}
|
237
|
+
getMyPerqMetaVaultsBalance(headers) {
|
238
|
+
return __awaiter(this, void 0, void 0, function* () {
|
239
|
+
const userAddress = yield this.signer.getAddress();
|
240
|
+
const authData = yield this.isUserAuthenticated();
|
241
|
+
const myPerqMetaVaultsBalance = this.dripApi.fetchMyPerqMetaVaultsData(userAddress, authData.token, headers);
|
242
|
+
return myPerqMetaVaultsBalance;
|
243
|
+
});
|
244
|
+
}
|
215
245
|
getUserVaultBalance(vaultAddress, headers) {
|
216
246
|
return __awaiter(this, void 0, void 0, function* () {
|
217
247
|
const userAddress = yield this.signer.getAddress();
|
@@ -235,6 +265,38 @@ class DripSdk {
|
|
235
265
|
};
|
236
266
|
});
|
237
267
|
}
|
268
|
+
getUserMetaVaultBalance(metaVaultAddress, headers) {
|
269
|
+
return __awaiter(this, void 0, void 0, function* () {
|
270
|
+
const authData = yield this.isUserAuthenticated();
|
271
|
+
const balance = yield this.dripApi.fetchUserMetaVaultBalance(authData.address, metaVaultAddress, authData.token, headers);
|
272
|
+
return {
|
273
|
+
userBalance: balance.userBalance,
|
274
|
+
pendingUserBalance: balance.pendingUserBalance,
|
275
|
+
pendingWithdrawalBalance: balance.pendingWithdrawalBalance,
|
276
|
+
claimable: balance.claimable
|
277
|
+
};
|
278
|
+
});
|
279
|
+
}
|
280
|
+
getAllUserMetaVaultBalance(headers) {
|
281
|
+
return __awaiter(this, void 0, void 0, function* () {
|
282
|
+
const authData = yield this.isUserAuthenticated();
|
283
|
+
const balances = yield this.dripApi.fetchAllUserMetaVaultBalance(authData.address, authData.token, headers);
|
284
|
+
const addressArray = Object.keys(balances);
|
285
|
+
const result = {};
|
286
|
+
for (const address of addressArray) {
|
287
|
+
if (result[address]) {
|
288
|
+
continue;
|
289
|
+
}
|
290
|
+
result[address] = {
|
291
|
+
userBalance: balances[address].userBalance,
|
292
|
+
pendingUserBalance: balances[address].pendingUserBalance,
|
293
|
+
pendingWithdrawalBalance: balances[address].pendingWithdrawalBalance,
|
294
|
+
claimable: balances[address].claimable
|
295
|
+
};
|
296
|
+
}
|
297
|
+
return result;
|
298
|
+
});
|
299
|
+
}
|
238
300
|
fastWithdraw(vaultAddress, amountToWithdraw) {
|
239
301
|
return __awaiter(this, void 0, void 0, function* () {
|
240
302
|
var _a, _b;
|
@@ -268,6 +330,31 @@ class DripSdk {
|
|
268
330
|
return this.doSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, false, ethAmount);
|
269
331
|
});
|
270
332
|
}
|
333
|
+
swapAndDepositMetaVault(metaVaultAddress, fromTokenAddress, toTokenAddress, fromTokenAmount) {
|
334
|
+
return __awaiter(this, void 0, void 0, function* () {
|
335
|
+
var _a;
|
336
|
+
if (parseFloat(fromTokenAmount) <= 0) {
|
337
|
+
throw Error('fromTokenAmount must be bigger than 0');
|
338
|
+
}
|
339
|
+
// parse from token amount according to decimals
|
340
|
+
const decimals = yield this.getERC20Precission(fromTokenAddress);
|
341
|
+
const parsedAmount = ethers_1.ethers.utils.parseUnits(fromTokenAmount, decimals);
|
342
|
+
const tokenAllowance = yield this.getTokenAllowanceForSwapAndDeposit(fromTokenAddress);
|
343
|
+
if (tokenAllowance.lt(parsedAmount)) {
|
344
|
+
throw Error(`current allowance: ${tokenAllowance} is less than required: ${parsedAmount}`);
|
345
|
+
}
|
346
|
+
const userAddress = yield this.signer.getAddress();
|
347
|
+
const swapInfo = yield this.dripApi.getSwapInfo(fromTokenAddress, toTokenAddress, parsedAmount, userAddress);
|
348
|
+
const swapAndDepositBag = {
|
349
|
+
metaVault: metaVaultAddress,
|
350
|
+
inTokens: [fromTokenAddress],
|
351
|
+
inAmounts: [parsedAmount],
|
352
|
+
swapInfo
|
353
|
+
};
|
354
|
+
console.log(`swapAndDepositBag: ${JSON.stringify(swapAndDepositBag, null, 2)}`);
|
355
|
+
yield ((_a = this.spoolSdk) === null || _a === void 0 ? void 0 : _a.metaVaultSwapAndDeposit(swapAndDepositBag));
|
356
|
+
});
|
357
|
+
}
|
271
358
|
doSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, checkAllowance, ethAmount) {
|
272
359
|
return __awaiter(this, void 0, void 0, function* () {
|
273
360
|
const userAddress = yield this.signer.getAddress();
|
@@ -320,6 +407,47 @@ class DripSdk {
|
|
320
407
|
return redeemTxReceipt.transactionHash;
|
321
408
|
});
|
322
409
|
}
|
410
|
+
withdrawMetavault(metaVaultAddress, amount) {
|
411
|
+
return __awaiter(this, void 0, void 0, function* () {
|
412
|
+
if (!this.signer) {
|
413
|
+
throw Error('No signer provided');
|
414
|
+
}
|
415
|
+
const authData = yield this.isUserAuthenticated();
|
416
|
+
const balance = yield this.dripApi.fetchUserMetaVaultBalance(authData.address, metaVaultAddress, authData.token);
|
417
|
+
if (0 == balance.userBalance || (amount !== undefined && parseFloat(amount) > balance.userBalance)) {
|
418
|
+
throw Error('Not enough funds to withdraw');
|
419
|
+
}
|
420
|
+
if (amount !== undefined && parseFloat(amount) === 0) {
|
421
|
+
throw Error('Amount to withdraw must be bigger than 0');
|
422
|
+
}
|
423
|
+
//If amount is undefined means user wants to withdraw all funds
|
424
|
+
const sharesToWithdraw = amount !== undefined ? ((parseFloat(amount) * balance.userBalanceShares) / balance.userBalance).toFixed(0) : balance.userBalanceShares;
|
425
|
+
const depositTx = yield this.spoolSdk.metaVaultRedeem(metaVaultAddress, sharesToWithdraw, balance.userClaimableFlushIndexes);
|
426
|
+
const txReceipt = yield depositTx.wait();
|
427
|
+
return txReceipt.transactionHash;
|
428
|
+
});
|
429
|
+
}
|
430
|
+
claimWithdrawsMetaVault(metaVaultAddress) {
|
431
|
+
return __awaiter(this, void 0, void 0, function* () {
|
432
|
+
if (!this.signer) {
|
433
|
+
throw Error('No signer provided');
|
434
|
+
}
|
435
|
+
const authData = yield this.isUserAuthenticated();
|
436
|
+
const metaVaultClaimableFlushes = yield this.dripApi.fetchClaimableFlushes(authData.address.toLowerCase(), metaVaultAddress.toLowerCase(), authData.token);
|
437
|
+
const flushIndexes = metaVaultClaimableFlushes.unclaimedWithdraws.reduce((acc, item) => {
|
438
|
+
if (item.isFlushed) {
|
439
|
+
acc.push(item.flushIndex.toString());
|
440
|
+
}
|
441
|
+
return acc;
|
442
|
+
}, []);
|
443
|
+
if (flushIndexes.length === 0) {
|
444
|
+
throw Error('No funds to claim');
|
445
|
+
}
|
446
|
+
const metaVaultWithdrawTx = yield this.spoolSdk.metaVaultWithdraw(metaVaultAddress, flushIndexes);
|
447
|
+
const txReceipt = yield metaVaultWithdrawTx.wait();
|
448
|
+
return txReceipt.transactionHash;
|
449
|
+
});
|
450
|
+
}
|
323
451
|
claimWithdraws(vaultAddress) {
|
324
452
|
return __awaiter(this, void 0, void 0, function* () {
|
325
453
|
const userAddress = yield this.signer.getAddress();
|
@@ -405,13 +533,9 @@ class DripSdk {
|
|
405
533
|
return this.dripApi.fetchOwnedLoyaltyCards(authData.token, headers);
|
406
534
|
});
|
407
535
|
}
|
408
|
-
getAllLoyaltyCards(
|
536
|
+
getAllLoyaltyCards() {
|
409
537
|
return __awaiter(this, void 0, void 0, function* () {
|
410
|
-
|
411
|
-
if (!authData.isAuthenticated) {
|
412
|
-
throw Error(`User not authenticated: ${authData.message}`);
|
413
|
-
}
|
414
|
-
return this.dripApi.fetchAllLoyaltyCards(authData.token, headers);
|
538
|
+
return this.dripApi.fetchAllLoyaltyCards();
|
415
539
|
});
|
416
540
|
}
|
417
541
|
getLoyaltyCardBoost(rewardId, headers) {
|
@@ -460,6 +584,14 @@ class DripSdk {
|
|
460
584
|
return this.dripApi.getSwapPerqForBeansInfo();
|
461
585
|
});
|
462
586
|
}
|
587
|
+
approveTokenForMetaVaultDeposit(tokenAddress, metaVaultAddress, amount) {
|
588
|
+
return __awaiter(this, void 0, void 0, function* () {
|
589
|
+
if (!this.signer) {
|
590
|
+
throw Error('No signer provided');
|
591
|
+
}
|
592
|
+
return yield this.approveToken(tokenAddress, amount, metaVaultAddress);
|
593
|
+
});
|
594
|
+
}
|
463
595
|
generateRedeemBagStruct(vault, signerAddress, amountToWithdraw) {
|
464
596
|
return __awaiter(this, void 0, void 0, function* () {
|
465
597
|
if (!this.spoolSdk) {
|
package/dist/index.d.ts
CHANGED
@@ -9,9 +9,11 @@ import { SwapInfo } from './types/SwapInfo';
|
|
9
9
|
import { VaultDepositToken } from './types/VaultDepositToken';
|
10
10
|
import { VaultType } from './types/VaultType';
|
11
11
|
import { UserVaultBalance } from './types/UserVaultBalance';
|
12
|
+
import { UserMetaVaultBalance } from './types/UserMetaVaultBalance';
|
12
13
|
import { UserBalance } from './types/UserBalance';
|
13
14
|
import { VaultStats } from './types/VaultStats';
|
14
15
|
import { Chain } from './DripConfig';
|
15
16
|
import MyPerqData from './types/MyPerqData';
|
16
17
|
import ELoyaltyCardTier from './types/ELoyaltyCardTier';
|
17
|
-
|
18
|
+
import { MetaVault } from './types/MetaVault';
|
19
|
+
export { Vault, VaultReward, DripSdk, UserVaultBalance, UserBalance, VaultStats, AuthenticationStatus, NFTBoost, Strategy, StretchGoal, SwapInfo, VaultDepositToken, VaultType, MetaVault, MyPerqData, Chain, UserMetaVaultBalance, ELoyaltyCardTier };
|
package/dist/test.js
CHANGED
@@ -16,10 +16,11 @@ exports.signer = void 0;
|
|
16
16
|
const ethers_1 = require("ethers");
|
17
17
|
const DripConfig_1 = require("./DripConfig");
|
18
18
|
const DripSdk_1 = __importDefault(require("./DripSdk"));
|
19
|
+
const spool_v2_sdk_1 = require("@spool.fi/spool-v2-sdk");
|
19
20
|
// This is script to test locally the drip sdk methods
|
20
21
|
const account2 = '0x9E9B6899Ea314dD553A99f4F49440d2CeD2b2848'; // privKey 92eb90257aa76cc56ead18dd52dd3433689712ebe7356a70308b760bfcbdd787
|
21
|
-
|
22
|
-
const privKey = '92eb90257aa76cc56ead18dd52dd3433689712ebe7356a70308b760bfcbdd787';
|
22
|
+
const privKey = '6ffc226f7b7769e27124317372c9dbb579a324e67e97bf07131bf2f59ec0f4fe'; // Deployer
|
23
|
+
// const privKey: string = '92eb90257aa76cc56ead18dd52dd3433689712ebe7356a70308b760bfcbdd787';
|
23
24
|
const testConfigParams = {
|
24
25
|
subgraphUrl: 'https://subgraph.satsuma-prod.com/49eb322da234/solidant/spool-v2-sepolia/api',
|
25
26
|
priceFeedApiUrl: 'https://pricefeed.dev.spool.fi/',
|
@@ -34,6 +35,7 @@ const testConfigParams = {
|
|
34
35
|
IRewardManager: '0xcE7F66BD505a80129Ef25b06207Ac49620A55522',
|
35
36
|
IStrategyRegistry: '0xf978853Db777d00b1130Ea21d8d98E8710b0Bc56',
|
36
37
|
ISpoolLens: '0x33Df6cf08Fbb10047e318989fE687294CD45A7B4',
|
38
|
+
IMetaVaultFactory: '0x28a3a4f4D469Fb33601639Db40a800ca6776A3d0',
|
37
39
|
}
|
38
40
|
},
|
39
41
|
dripContracts: {
|
@@ -41,7 +43,7 @@ const testConfigParams = {
|
|
41
43
|
DripTokenRecyclerAddress: '0xe943A1320402fcf41cDc04275e842654165dAB78' // Sepolia contract address
|
42
44
|
}
|
43
45
|
};
|
44
|
-
const
|
46
|
+
const sepoliaConfigParams = {
|
45
47
|
subgraphUrl: 'https://subgraph.satsuma-prod.com/49eb322da234/solidant/spool-v2-sepolia/api',
|
46
48
|
priceFeedApiUrl: 'https://pricefeed.dev.spool.fi/',
|
47
49
|
rewardsUrl: 'https://rewards.dev.spool.fi/sepolia',
|
@@ -55,6 +57,7 @@ const configParams = {
|
|
55
57
|
IRewardManager: '0xcE7F66BD505a80129Ef25b06207Ac49620A55522',
|
56
58
|
IStrategyRegistry: '0xf978853Db777d00b1130Ea21d8d98E8710b0Bc56',
|
57
59
|
ISpoolLens: '0x33Df6cf08Fbb10047e318989fE687294CD45A7B4',
|
60
|
+
IMetaVaultFactory: '0xe07a896CFD8FEdFb6d7515480853c5D5ED30EBFE',
|
58
61
|
},
|
59
62
|
},
|
60
63
|
dripContracts: {
|
@@ -62,6 +65,24 @@ const configParams = {
|
|
62
65
|
DripTokenRecyclerAddress: '0xe943A1320402fcf41cDc04275e842654165dAB78' // Sepolia contract address
|
63
66
|
}
|
64
67
|
};
|
68
|
+
const mainnetConfigParams = {
|
69
|
+
subgraphUrl: 'https://subgraph.satsuma-prod.com/49eb322da234/solidant/spool-v2/api',
|
70
|
+
priceFeedApiUrl: 'https://pricefeed.v2.spool.fi/',
|
71
|
+
rewardsUrl: 'https://rewards.v2.spool.fi/',
|
72
|
+
fastRedeemApi: 'https://fastwithdraw.v2.spool.fi/',
|
73
|
+
contracts: {
|
74
|
+
1: {
|
75
|
+
ISmartVaultManager: '0x23Daf34e2b9Af02A74dC19cB52Af727B19403874',
|
76
|
+
IDepositSwap: '0xd8534197Bd587F8226d12E0C864ef2CaE6f82f5C',
|
77
|
+
ISmartVaultFactory: '0x362599Cdc123e3FFEB7c0812d769128D180667E8',
|
78
|
+
IDepositManager: '0x823Ba38992825FF37E72B6c3D669a09173B8F7bf',
|
79
|
+
IRewardManager: '0xd8d2C1C3C7982272e3e12dEC5aF681433fdcf003',
|
80
|
+
IStrategyRegistry: '0x554c6bCB54656390aca0a0af38CA954dbE653F15',
|
81
|
+
ISpoolLens: '0x8aa6174333F75421903b2B5c70DdF8DA5D84f74F',
|
82
|
+
IMetaVaultFactory: '0x28a3a4f4D469Fb33601639Db40a800ca6776A3d0'
|
83
|
+
},
|
84
|
+
}
|
85
|
+
};
|
65
86
|
const provider = new ethers_1.ethers.providers.StaticJsonRpcProvider('https://rpc.ankr.com/eth_sepolia', 11155111);
|
66
87
|
exports.signer = new ethers_1.ethers.Wallet(privKey, provider);
|
67
88
|
// const random_address = '0x25dFcFB061956c6f33B1ee032cc33837d0b83257';
|
@@ -70,21 +91,30 @@ const daiVaultPerq = '0x1977efe478ba17da8be6e93fdfadbd3055d30111'; // DAI PERQ S
|
|
70
91
|
const usdcVaultPerq = '0xf9795bfbf7c40981c372d0fb25a87e0b694c4fcd'; // USDC PERQ SEPOLIA
|
71
92
|
const daiTokenAddress = '0x2a3a3872c242c35093a8fc48dac838c4b2d24a03'; // DAI TOKEN
|
72
93
|
const usdcTokenAddress = '0xa6b92fcd4ee124353c8a6acf1edb574f46f3f8df'; // USDC TOKEN
|
94
|
+
const dripConfig = new DripConfig_1.DripConfig(DripConfig_1.Chain.SEPOLIA, 'http://localhost:3000');
|
73
95
|
const dripSdk = new DripSdk_1.default(DripConfig_1.Chain.SEPOLIA, exports.signer, 'https://localhost:3000');
|
74
96
|
// 0x689Baa4821865Cb328F5E847fB6133DEB315A832
|
75
97
|
// 0x9E9B6899Ea314dD553A99f4F49440d2CeD2b2848
|
98
|
+
const usdcMetaVaultAddress = '0x89845afce65a62a4411c7ed9d0729e06147b47ca'.toLowerCase();
|
99
|
+
const wethMetaVautlAddress = '0xecf5325ccd0cf71b9d400ebbefd84f70b76a56f2';
|
76
100
|
function main() {
|
77
101
|
return __awaiter(this, void 0, void 0, function* () {
|
78
102
|
try {
|
79
|
-
//
|
80
|
-
|
81
|
-
// await
|
82
|
-
//
|
83
|
-
//
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
103
|
+
// ==================================================
|
104
|
+
const spoolSdk = new spool_v2_sdk_1.SpoolSdk(dripConfig.internalConfig, exports.signer);
|
105
|
+
// const res = await spoolSdk.getOffchainRewards('drip_s');
|
106
|
+
// console.log(JSON.stringify(res, null, 2));
|
107
|
+
// ==================================================
|
108
|
+
const metavaultQuery = {
|
109
|
+
metaVaultAddress: '0x89845afce65a62a4411c7ed9d0729e06147b47ca'.toLowerCase(),
|
110
|
+
userAddress: '0x689Baa4821865Cb328F5E847fB6133DEB315A832'.toLowerCase()
|
111
|
+
};
|
112
|
+
const res = yield spoolSdk.metaVaultDeposit(usdcMetaVaultAddress, '10000000');
|
113
|
+
console.log(JSON.stringify(res, null, 2));
|
114
|
+
// const res = await dripSdk.getUserMetaVaultBalance('0x89845afce65a62a4411c7ed9d0729e06147b47ca');
|
115
|
+
// const res = await dripSdk.approveTokenForMetaVaultDeposit('0x88b25a14dae46c33ae3eef2b45a5ec758d9a5ec6', wethMetaVautlAddress, '0.002');
|
116
|
+
// const res = await dripSdk.depositMetaVault(wethMetaVautlAddress, '0.002');
|
117
|
+
// console.log(res);
|
88
118
|
}
|
89
119
|
catch (error) {
|
90
120
|
console.log(`Main error: ${error}`);
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { VaultDepositToken } from './VaultDepositToken';
|
2
|
+
type VaultAllocation = {
|
3
|
+
address: string;
|
4
|
+
name: string;
|
5
|
+
allocation: number;
|
6
|
+
};
|
7
|
+
export type MetaVault = {
|
8
|
+
name: string;
|
9
|
+
address: string;
|
10
|
+
depositToken: VaultDepositToken;
|
11
|
+
liveUntil: string;
|
12
|
+
liveUntilFormatted: string;
|
13
|
+
liveFrom: string;
|
14
|
+
hasPoolEnded: boolean;
|
15
|
+
allocations: VaultAllocation[];
|
16
|
+
};
|
17
|
+
export {};
|
package/dist/utils.d.ts
CHANGED
package/dist/utils.js
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.hasPoolEnded = void 0;
|
3
4
|
exports.insertDot = insertDot;
|
5
|
+
exports.getMonthDayUTCTimeString = getMonthDayUTCTimeString;
|
4
6
|
function insertDot(numberString, decimals) {
|
5
7
|
if (numberString.length < decimals + 1) {
|
6
8
|
numberString = '0'.repeat(decimals + 1 - numberString.length) + numberString;
|
@@ -11,3 +13,48 @@ function insertDot(numberString, decimals) {
|
|
11
13
|
const afterDecimal = numberString.slice(indexToInsertDot);
|
12
14
|
return `${beforeDecimal}.${afterDecimal}`;
|
13
15
|
}
|
16
|
+
function getMonthDayUTCTimeString(dateString) {
|
17
|
+
// Parse the input string into a Date object
|
18
|
+
const date = new Date(typeof dateString === 'number' ? dateString * 1000 : dateString);
|
19
|
+
if (isNaN(date.getTime())) {
|
20
|
+
return 'Unknown Date';
|
21
|
+
}
|
22
|
+
// Options for formatting time (12-hour with AM/PM)
|
23
|
+
const options = {
|
24
|
+
month: 'long', // Full month name
|
25
|
+
day: 'numeric', // Day of the month
|
26
|
+
hour: 'numeric', // Hour (12-hour format)
|
27
|
+
minute: '2-digit', // Minute with leading zero
|
28
|
+
hour12: true, // 12-hour time format
|
29
|
+
};
|
30
|
+
// Format the date and time to US format using the previous options
|
31
|
+
const localeTimeString = date.toLocaleString('en-US', options);
|
32
|
+
// localeTimeString will look like this: May 8 at 8:00 PM
|
33
|
+
// Format the date and time to US format using the previous options
|
34
|
+
const [monthDay, time] = localeTimeString.split(' at ');
|
35
|
+
const [month, day] = monthDay.split(' ');
|
36
|
+
const dayNum = parseInt(day, 10);
|
37
|
+
const daySuffix = getDaySuffix(dayNum);
|
38
|
+
return `${month} ${day}${daySuffix}, ${time}`;
|
39
|
+
}
|
40
|
+
function getDaySuffix(day) {
|
41
|
+
if (day >= 11 && day <= 13) {
|
42
|
+
return 'th';
|
43
|
+
}
|
44
|
+
switch (day % 10) {
|
45
|
+
case 1:
|
46
|
+
return 'st';
|
47
|
+
case 2:
|
48
|
+
return 'nd';
|
49
|
+
case 3:
|
50
|
+
return 'rd';
|
51
|
+
default:
|
52
|
+
return 'th';
|
53
|
+
}
|
54
|
+
}
|
55
|
+
const hasPoolEnded = (date) => {
|
56
|
+
const endDate = new Date(date).getTime();
|
57
|
+
const currentDate = new Date().getTime();
|
58
|
+
return endDate <= currentDate;
|
59
|
+
};
|
60
|
+
exports.hasPoolEnded = hasPoolEnded;
|