@dripfi/drip-sdk 1.2.4 → 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 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>;
@@ -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();
@@ -446,6 +474,20 @@ class DripApi {
446
474
  };
447
475
  });
448
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
+ }
449
491
  fetchMyPerqData(userAddress, token, headers) {
450
492
  return __awaiter(this, void 0, void 0, function* () {
451
493
  const reqHeaders = headers ? headers : new Headers();
@@ -481,6 +523,53 @@ class DripApi {
481
523
  }
482
524
  });
483
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
+ }
484
573
  getSwapPerqForBeansInfo() {
485
574
  return __awaiter(this, void 0, void 0, function* () {
486
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>;
@@ -57,6 +69,7 @@ export default class DripSdk {
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
- private approveToken;
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();
@@ -456,6 +584,14 @@ class DripSdk {
456
584
  return this.dripApi.getSwapPerqForBeansInfo();
457
585
  });
458
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
+ }
459
595
  generateRedeemBagStruct(vault, signerAddress, amountToWithdraw) {
460
596
  return __awaiter(this, void 0, void 0, function* () {
461
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
- export { Vault, VaultReward, DripSdk, UserVaultBalance, UserBalance, VaultStats, AuthenticationStatus, NFTBoost, Strategy, StretchGoal, SwapInfo, VaultDepositToken, VaultType, MyPerqData, Chain, ELoyaltyCardTier };
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
- // const privKey: string = '6ffc226f7b7769e27124317372c9dbb579a324e67e97bf07131bf2f59ec0f4fe';
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 configParams = {
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
- // const res = await dripSdk.deposit(usdcTokenAddress,usdcVaultPerq, '1000');
80
- // const res = await dripSdk.withdraw(usdcVaultPerq, '1');
81
- // await dripSdk.authenticate()
82
- // const res = await dripSdk.getDripTokenBalance(account2)
83
- // const res = await dripSdk.getNextLoyaltyCard()
84
- // const res = await dripSdk.getOwnedLoyaltyCards()
85
- // const res = await dripSdk.getBeansBalance()
86
- // const res = await dripSdk.recycleTokens()
87
- // const res = await dripSdk.upgradeLoyaltyCard()
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,6 @@
1
+ export type DeployedMetaVault = {
2
+ address: string;
3
+ liveUntil: string;
4
+ liveFrom: string;
5
+ depositTokenId: string;
6
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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 {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ export type UserMetaVaultBalance = {
2
+ userBalance: string;
3
+ pendingUserBalance: string;
4
+ pendingWithdrawalBalance: string;
5
+ claimable: string;
6
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/dist/utils.d.ts CHANGED
@@ -1 +1,3 @@
1
1
  export declare function insertDot(numberString: string, decimals: number): string;
2
+ export declare function getMonthDayUTCTimeString(dateString: string | number): string;
3
+ export declare const hasPoolEnded: (date: string) => boolean;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dripfi/drip-sdk",
3
- "version": "1.2.4",
3
+ "version": "1.2.5-dev.1",
4
4
  "description": "Drip SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",