@scallop-io/sui-scallop-sdk 0.44.18 → 0.44.20

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.
Files changed (56) hide show
  1. package/dist/builders/borrowIncentiveBuilder.d.ts +7 -0
  2. package/dist/builders/vescaBuilder.d.ts +24 -0
  3. package/dist/constants/common.d.ts +7 -4
  4. package/dist/constants/index.d.ts +1 -0
  5. package/dist/constants/vesca.d.ts +5 -0
  6. package/dist/index.js +888 -255
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +877 -248
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/models/scallopClient.d.ts +7 -7
  11. package/dist/models/scallopUtils.d.ts +16 -14
  12. package/dist/queries/index.d.ts +1 -0
  13. package/dist/queries/vescaQuery.d.ts +28 -0
  14. package/dist/types/address.d.ts +9 -0
  15. package/dist/types/builder/borrowIncentive.d.ts +9 -6
  16. package/dist/types/builder/index.d.ts +3 -1
  17. package/dist/types/builder/vesca.d.ts +33 -0
  18. package/dist/types/constant/enum.d.ts +1 -1
  19. package/dist/types/query/borrowIncentive.d.ts +65 -60
  20. package/dist/types/query/index.d.ts +1 -0
  21. package/dist/types/query/portfolio.d.ts +12 -6
  22. package/dist/types/query/vesca.d.ts +7 -0
  23. package/dist/types/utils.d.ts +1 -2
  24. package/dist/utils/builder.d.ts +6 -0
  25. package/dist/utils/query.d.ts +4 -10
  26. package/dist/utils/util.d.ts +7 -0
  27. package/package.json +1 -1
  28. package/src/builders/borrowIncentiveBuilder.ts +174 -25
  29. package/src/builders/index.ts +6 -2
  30. package/src/builders/vescaBuilder.ts +392 -0
  31. package/src/constants/common.ts +19 -6
  32. package/src/constants/enum.ts +9 -3
  33. package/src/constants/index.ts +1 -0
  34. package/src/constants/vesca.ts +7 -0
  35. package/src/models/scallopAddress.ts +9 -1
  36. package/src/models/scallopClient.ts +29 -20
  37. package/src/models/scallopUtils.ts +45 -0
  38. package/src/queries/borrowIncentiveQuery.ts +93 -83
  39. package/src/queries/coreQuery.ts +19 -20
  40. package/src/queries/index.ts +1 -0
  41. package/src/queries/portfolioQuery.ts +79 -41
  42. package/src/queries/spoolQuery.ts +1 -1
  43. package/src/queries/vescaQuery.ts +124 -0
  44. package/src/types/address.ts +9 -0
  45. package/src/types/builder/borrowIncentive.ts +22 -5
  46. package/src/types/builder/index.ts +4 -1
  47. package/src/types/builder/vesca.ts +73 -0
  48. package/src/types/constant/enum.ts +1 -1
  49. package/src/types/query/borrowIncentive.ts +195 -74
  50. package/src/types/query/index.ts +1 -0
  51. package/src/types/query/portfolio.ts +17 -6
  52. package/src/types/query/vesca.ts +7 -0
  53. package/src/types/utils.ts +1 -1
  54. package/src/utils/builder.ts +141 -0
  55. package/src/utils/query.ts +226 -130
  56. package/src/utils/util.ts +34 -1
@@ -1,5 +1,5 @@
1
1
  import BigNumber from 'bignumber.js';
2
- import { normalizeStructTag } from '@mysten/sui.js/utils';
2
+ import { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';
3
3
  import type { ScallopUtils } from '../models';
4
4
  import type {
5
5
  OriginMarketPoolData,
@@ -16,14 +16,16 @@ import type {
16
16
  CalculatedSpoolRewardPoolData,
17
17
  OriginBorrowIncentivePoolData,
18
18
  ParsedBorrowIncentivePoolData,
19
- CalculatedBorrowIncentivePoolData,
20
- OriginBorrowIncentiveRewardPoolData,
21
- ParsedBorrowIncentiveRewardPoolData,
22
- CalculatedBorrowIncentiveRewardPoolData,
23
19
  OriginBorrowIncentiveAccountData,
24
20
  ParsedBorrowIncentiveAccountData,
25
21
  SupportPoolCoins,
26
22
  SupportCollateralCoins,
23
+ OriginBorrowIncentivePoolPointData,
24
+ ParsedBorrowIncentivePoolPointData,
25
+ CalculatedBorrowIncentivePoolPointData,
26
+ OriginBorrowIncentiveAccountPoolData,
27
+ ParsedBorrowIncentiveAccountPoolData,
28
+ SupportBorrowIncentiveRewardCoins,
27
29
  } from '../types';
28
30
 
29
31
  /**
@@ -385,6 +387,28 @@ export const calculateSpoolRewardPoolData = (
385
387
  };
386
388
  };
387
389
 
390
+ export const parseOriginBorrowIncentivesPoolPointData = (
391
+ originBorrowIncentivePoolPointData: OriginBorrowIncentivePoolPointData
392
+ ): ParsedBorrowIncentivePoolPointData => {
393
+ return {
394
+ pointType: normalizeStructTag(
395
+ originBorrowIncentivePoolPointData.point_type.name
396
+ ),
397
+ distributedPointPerPeriod: Number(
398
+ originBorrowIncentivePoolPointData.distributed_point_per_period
399
+ ),
400
+ period: Number(originBorrowIncentivePoolPointData.point_distribution_time),
401
+ distributedPoint: Number(
402
+ originBorrowIncentivePoolPointData.distributed_point
403
+ ),
404
+ points: Number(originBorrowIncentivePoolPointData.points),
405
+ index: Number(originBorrowIncentivePoolPointData.index),
406
+ baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),
407
+ weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),
408
+ lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),
409
+ };
410
+ };
411
+
388
412
  /**
389
413
  * Parse origin borrow incentive pool data to a more readable format.
390
414
  *
@@ -396,174 +420,235 @@ export const parseOriginBorrowIncentivePoolData = (
396
420
  ): ParsedBorrowIncentivePoolData => {
397
421
  return {
398
422
  poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),
399
- maxPoint: Number(originBorrowIncentivePoolData.max_distributed_point),
400
- distributedPoint: Number(originBorrowIncentivePoolData.distributed_point),
401
- pointPerPeriod: Number(
402
- originBorrowIncentivePoolData.distributed_point_per_period
403
- ),
404
- period: Number(originBorrowIncentivePoolData.point_distribution_time),
405
- maxStake: Number(originBorrowIncentivePoolData.max_stakes),
423
+ minStakes: Number(originBorrowIncentivePoolData.min_stakes),
424
+ maxStakes: Number(originBorrowIncentivePoolData.max_stakes),
406
425
  staked: Number(originBorrowIncentivePoolData.stakes),
407
- index: Number(originBorrowIncentivePoolData.index),
408
426
  createdAt: Number(originBorrowIncentivePoolData.created_at),
409
- lastUpdate: Number(originBorrowIncentivePoolData.last_update),
427
+ poolPoints: originBorrowIncentivePoolData.points.reduce(
428
+ (acc, point) => {
429
+ const parsed = parseOriginBorrowIncentivesPoolPointData(point);
430
+ const name = parseStructTag(
431
+ parsed.pointType
432
+ ).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;
433
+ acc[name] = parsed;
434
+ return acc;
435
+ },
436
+ {} as Record<
437
+ SupportBorrowIncentiveRewardCoins,
438
+ ParsedBorrowIncentivePoolPointData
439
+ >
440
+ ),
410
441
  };
411
442
  };
412
443
 
413
- export const calculateBorrowIncentivePoolData = (
414
- parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,
415
- borrowIncentiveCoinPrice: number,
416
- borrowIncentiveCoinDecimal: number
417
- ): CalculatedBorrowIncentivePoolData => {
444
+ export const calculateBorrowIncentivePoolPointData = (
445
+ pasredBorrowIncentinvePoolData: ParsedBorrowIncentivePoolData,
446
+ parsedBorrowIncentivePoolPointData: ParsedBorrowIncentivePoolPointData,
447
+ rewardCoinPrice: number,
448
+ rewardCoinDecimal: number,
449
+ poolCoinPrice: number,
450
+ poolCoinDecimal: number
451
+ ): CalculatedBorrowIncentivePoolPointData => {
418
452
  const baseIndexRate = 1_000_000_000;
419
453
 
420
454
  const distributedPointPerSec = BigNumber(
421
- parsedBorrowIncentivePoolData.pointPerPeriod
422
- ).dividedBy(parsedBorrowIncentivePoolData.period);
423
-
424
- const pointPerSec = BigNumber(
425
- parsedBorrowIncentivePoolData.pointPerPeriod
426
- ).dividedBy(parsedBorrowIncentivePoolData.period);
427
- const remainingPeriod = BigNumber(parsedBorrowIncentivePoolData.maxPoint)
428
- .minus(parsedBorrowIncentivePoolData.distributedPoint)
429
- .dividedBy(pointPerSec);
430
- const startDate = parsedBorrowIncentivePoolData.createdAt;
431
- const endDate = remainingPeriod
432
- .plus(parsedBorrowIncentivePoolData.lastUpdate)
433
- .integerValue()
434
- .toNumber();
455
+ parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
456
+ ).dividedBy(parsedBorrowIncentivePoolPointData.period);
435
457
 
436
458
  const timeDelta = BigNumber(
437
459
  Math.floor(new Date().getTime() / 1000) -
438
- parsedBorrowIncentivePoolData.lastUpdate
460
+ parsedBorrowIncentivePoolPointData.lastUpdate
439
461
  )
440
- .dividedBy(parsedBorrowIncentivePoolData.period)
462
+ .dividedBy(parsedBorrowIncentivePoolPointData.period)
441
463
  .toFixed(0);
442
- const remainingPoints = BigNumber(
443
- parsedBorrowIncentivePoolData.maxPoint
444
- ).minus(parsedBorrowIncentivePoolData.distributedPoint);
445
464
  const accumulatedPoints = BigNumber.minimum(
446
465
  BigNumber(timeDelta).multipliedBy(
447
- parsedBorrowIncentivePoolData.pointPerPeriod
466
+ parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
448
467
  ),
449
- remainingPoints
468
+ BigNumber(parsedBorrowIncentivePoolPointData.points)
450
469
  );
451
470
 
452
- const currentPointIndex = BigNumber(parsedBorrowIncentivePoolData.index).plus(
453
- accumulatedPoints.dividedBy(parsedBorrowIncentivePoolData.staked).isFinite()
471
+ const currentPointIndex = BigNumber(
472
+ parsedBorrowIncentivePoolPointData.index
473
+ ).plus(
474
+ accumulatedPoints
475
+ .dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount)
476
+ .isFinite()
454
477
  ? BigNumber(baseIndexRate)
455
478
  .multipliedBy(accumulatedPoints)
456
- .dividedBy(parsedBorrowIncentivePoolData.staked)
479
+ .dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount)
457
480
  : 0
458
481
  );
459
482
  const currentTotalDistributedPoint = BigNumber(
460
- parsedBorrowIncentivePoolData.distributedPoint
483
+ parsedBorrowIncentivePoolPointData.distributedPoint
461
484
  ).plus(accumulatedPoints);
462
485
 
463
- const stakedAmount = BigNumber(parsedBorrowIncentivePoolData.staked);
464
- const stakedCoin = stakedAmount.shiftedBy(-1 * borrowIncentiveCoinDecimal);
465
- const stakedValue = stakedCoin.multipliedBy(borrowIncentiveCoinPrice);
466
-
467
- return {
468
- distributedPointPerSec: distributedPointPerSec.toNumber(),
469
- accumulatedPoints: accumulatedPoints.toNumber(),
470
- currentPointIndex: currentPointIndex.toNumber(),
471
- currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
472
- startDate: new Date(startDate * 1000),
473
- endDate: new Date(endDate * 1000),
474
- stakedAmount: stakedAmount.toNumber(),
475
- stakedCoin: stakedCoin.toNumber(),
476
- stakedValue: stakedValue.toNumber(),
477
- };
478
- };
479
-
480
- /**
481
- * Parse origin borrow incentive reward pool data to a more readable format.
482
- *
483
- * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data
484
- * @return Parsed borrow incentive reward pool data
485
- */
486
- export const parseOriginBorrowIncentiveRewardPoolData = (
487
- originBorrowIncentiveRewardPoolData: OriginBorrowIncentiveRewardPoolData
488
- ): ParsedBorrowIncentiveRewardPoolData => {
489
- return {
490
- rewardType: normalizeStructTag(
491
- originBorrowIncentiveRewardPoolData.reward_type.name
492
- ),
493
- claimedRewards: Number(originBorrowIncentiveRewardPoolData.claimed_rewards),
494
- exchangeRateNumerator: Number(
495
- originBorrowIncentiveRewardPoolData.exchange_rate_numerator
496
- ),
497
- exchangeRateDenominator: Number(
498
- originBorrowIncentiveRewardPoolData.exchange_rate_denominator
499
- ),
500
- remainingRewards: Number(
501
- originBorrowIncentiveRewardPoolData.remaining_reward
502
- ),
503
- };
504
- };
486
+ // pure staked amount
487
+ const stakedAmount = BigNumber(pasredBorrowIncentinvePoolData.staked);
505
488
 
506
- export const calculateBorrowIncentiveRewardPoolData = (
507
- parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,
508
- parsedBorrowIncentiveRewardPoolData: ParsedBorrowIncentiveRewardPoolData,
509
- calculatedBorrowIncentivePoolData: CalculatedBorrowIncentivePoolData,
510
- rewardCoinPrice: number,
511
- rewardCoinDecimal: number
512
- ): CalculatedBorrowIncentiveRewardPoolData => {
513
- const rateYearFactor = 365 * 24 * 60 * 60;
489
+ const stakedCoin = stakedAmount.shiftedBy(-1 * poolCoinDecimal);
490
+ const stakedValue = stakedCoin.multipliedBy(poolCoinPrice);
491
+ const baseWeight = BigNumber(parsedBorrowIncentivePoolPointData.baseWeight);
514
492
 
515
- const rewardPerSec = BigNumber(
516
- calculatedBorrowIncentivePoolData.distributedPointPerSec
517
- )
518
- .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)
519
- .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);
520
- const totalRewardAmount = BigNumber(parsedBorrowIncentivePoolData.maxPoint)
521
- .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)
522
- .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);
523
- const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);
524
- const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);
525
- const remaindRewardAmount = BigNumber(
526
- parsedBorrowIncentiveRewardPoolData.remainingRewards
493
+ // staked amount applied with weight
494
+ const weightedStakedAmount = BigNumber(
495
+ parsedBorrowIncentivePoolPointData.weightedAmount
527
496
  );
528
- const remaindRewardCoin = remaindRewardAmount.shiftedBy(
529
- -1 * rewardCoinDecimal
530
- );
531
- const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);
532
- const claimedRewardAmount = BigNumber(
533
- parsedBorrowIncentiveRewardPoolData.claimedRewards
497
+
498
+ const weightedStakedCoin = weightedStakedAmount.shiftedBy(
499
+ -1 * poolCoinDecimal
534
500
  );
535
- const claimedRewardCoin = claimedRewardAmount.shiftedBy(
501
+ const weightedStakedValue = weightedStakedCoin.multipliedBy(poolCoinPrice);
502
+
503
+ // Calculate the reward rate
504
+ const rateYearFactor = 365 * 24 * 60 * 60;
505
+ const rewardPerSec = BigNumber(distributedPointPerSec).shiftedBy(
536
506
  -1 * rewardCoinDecimal
537
507
  );
538
- const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
539
508
 
540
509
  const rewardValueForYear = BigNumber(rewardPerSec)
541
- .shiftedBy(-1 * rewardCoinDecimal)
542
510
  .multipliedBy(rateYearFactor)
543
511
  .multipliedBy(rewardCoinPrice);
512
+
513
+ const weightScale = BigNumber('1000000000000');
544
514
  const rewardRate = rewardValueForYear
545
- .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)
515
+ .multipliedBy(
516
+ BigNumber(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
517
+ weightScale
518
+ )
519
+ )
520
+ .dividedBy(weightedStakedValue)
546
521
  .isFinite()
547
522
  ? rewardValueForYear
548
- .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)
523
+ .multipliedBy(
524
+ BigNumber(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
525
+ weightScale
526
+ )
527
+ )
528
+ .dividedBy(weightedStakedValue)
549
529
  .toNumber()
550
530
  : Infinity;
551
531
 
552
532
  return {
533
+ distributedPointPerSec: distributedPointPerSec.toNumber(),
534
+ accumulatedPoints: accumulatedPoints.toNumber(),
535
+ currentPointIndex: currentPointIndex.toNumber(),
536
+ currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
537
+ stakedAmount: stakedAmount.toNumber(),
538
+ stakedCoin: stakedCoin.toNumber(),
539
+ stakedValue: stakedValue.toNumber(),
540
+ baseWeight: baseWeight.toNumber(),
541
+ weightedStakedAmount: weightedStakedAmount.toNumber(),
542
+ weightedStakedCoin: weightedStakedCoin.toNumber(),
543
+ weightedStakedValue: weightedStakedValue.toNumber(),
553
544
  rewardApr: rewardRate,
554
- totalRewardAmount: totalRewardAmount.toNumber(),
555
- totalRewardCoin: totalRewardCoin.toNumber(),
556
- totalRewardValue: totalRewardValue.toNumber(),
557
- remaindRewardAmount: remaindRewardAmount.toNumber(),
558
- remaindRewardCoin: remaindRewardCoin.toNumber(),
559
- remaindRewardValue: remaindRewardValue.toNumber(),
560
- claimedRewardAmount: claimedRewardAmount.toNumber(),
561
- claimedRewardCoin: claimedRewardCoin.toNumber(),
562
- claimedRewardValue: claimedRewardValue.toNumber(),
563
545
  rewardPerSec: rewardPerSec.toNumber(),
564
546
  };
565
547
  };
566
548
 
549
+ // /**
550
+ // * Parse origin borrow incentive reward pool data to a more readable format.
551
+ // *
552
+ // * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data
553
+ // * @return Parsed borrow incentive reward pool data
554
+ // */
555
+ // export const parseOriginBorrowIncentiveRewardPoolData = (
556
+ // originBorrowIncentiveRewardPoolData: OriginBorrowIncentiveRewardPoolData
557
+ // ): ParsedBorrowIncentiveRewardPoolData => {
558
+ // return {
559
+ // rewardType: normalizeStructTag(
560
+ // originBorrowIncentiveRewardPoolData.reward_type.name
561
+ // ),
562
+ // claimedRewards: Number(originBorrowIncentiveRewardPoolData.claimed_rewards),
563
+ // exchangeRateNumerator: Number(
564
+ // originBorrowIncentiveRewardPoolData.exchange_rate_numerator
565
+ // ),
566
+ // exchangeRateDenominator: Number(
567
+ // originBorrowIncentiveRewardPoolData.exchange_rate_denominator
568
+ // ),
569
+ // remainingRewards: Number(
570
+ // originBorrowIncentiveRewardPoolData.remaining_reward
571
+ // ),
572
+ // };
573
+ // };
574
+
575
+ // export const calculateBorrowIncentiveRewardPoolData = (
576
+ // parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,
577
+ // parsedBorrowIncentiveRewardPoolData: ParsedBorrowIncentiveRewardPoolData,
578
+ // calculatedBorrowIncentivePoolData: CalculatedBorrowIncentivePoolData,
579
+ // rewardCoinPrice: number,
580
+ // rewardCoinDecimal: number
581
+ // ): CalculatedBorrowIncentiveRewardPoolData => {
582
+ // const rateYearFactor = 365 * 24 * 60 * 60;
583
+
584
+ // const rewardPerSec = BigNumber(
585
+ // calculatedBorrowIncentivePoolData.distributedPointPerSec
586
+ // )
587
+ // .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)
588
+ // .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);
589
+ // const totalRewardAmount = BigNumber(parsedBorrowIncentivePoolData.maxPoint)
590
+ // .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)
591
+ // .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);
592
+ // const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);
593
+ // const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);
594
+ // const remaindRewardAmount = BigNumber(
595
+ // parsedBorrowIncentiveRewardPoolData.remainingRewards
596
+ // );
597
+ // const remaindRewardCoin = remaindRewardAmount.shiftedBy(
598
+ // -1 * rewardCoinDecimal
599
+ // );
600
+ // const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);
601
+ // const claimedRewardAmount = BigNumber(
602
+ // parsedBorrowIncentiveRewardPoolData.claimedRewards
603
+ // );
604
+ // const claimedRewardCoin = claimedRewardAmount.shiftedBy(
605
+ // -1 * rewardCoinDecimal
606
+ // );
607
+ // const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
608
+
609
+ // const rewardValueForYear = BigNumber(rewardPerSec)
610
+ // .shiftedBy(-1 * rewardCoinDecimal)
611
+ // .multipliedBy(rateYearFactor)
612
+ // .multipliedBy(rewardCoinPrice);
613
+ // const rewardRate = rewardValueForYear
614
+ // .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)
615
+ // .isFinite()
616
+ // ? rewardValueForYear
617
+ // .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)
618
+ // .toNumber()
619
+ // : Infinity;
620
+
621
+ // return {
622
+ // rewardApr: rewardRate,
623
+ // totalRewardAmount: totalRewardAmount.toNumber(),
624
+ // totalRewardCoin: totalRewardCoin.toNumber(),
625
+ // totalRewardValue: totalRewardValue.toNumber(),
626
+ // remaindRewardAmount: remaindRewardAmount.toNumber(),
627
+ // remaindRewardCoin: remaindRewardCoin.toNumber(),
628
+ // remaindRewardValue: remaindRewardValue.toNumber(),
629
+ // claimedRewardAmount: claimedRewardAmount.toNumber(),
630
+ // claimedRewardCoin: claimedRewardCoin.toNumber(),
631
+ // claimedRewardValue: claimedRewardValue.toNumber(),
632
+ // rewardPerSec: rewardPerSec.toNumber(),
633
+ // };
634
+ // };
635
+
636
+ export const parseOriginBorrowIncentiveAccountPoolPointData = (
637
+ originBorrowIncentiveAccountPoolPointData: OriginBorrowIncentiveAccountPoolData
638
+ ): ParsedBorrowIncentiveAccountPoolData => {
639
+ return {
640
+ pointType: normalizeStructTag(
641
+ originBorrowIncentiveAccountPoolPointData.point_type.name
642
+ ),
643
+ weightedAmount: Number(
644
+ originBorrowIncentiveAccountPoolPointData.weighted_amount
645
+ ),
646
+ points: Number(originBorrowIncentiveAccountPoolPointData.points),
647
+ totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),
648
+ index: Number(originBorrowIncentiveAccountPoolPointData.index),
649
+ };
650
+ };
651
+
567
652
  /**
568
653
  * Parse origin borrow incentive account data to a more readable format.
569
654
  *
@@ -577,10 +662,21 @@ export const parseOriginBorrowIncentiveAccountData = (
577
662
  poolType: normalizeStructTag(
578
663
  originBorrowIncentiveAccountData.pool_type.name
579
664
  ),
580
- amount: Number(originBorrowIncentiveAccountData.amount),
581
- index: Number(originBorrowIncentiveAccountData.index),
582
- points: Number(originBorrowIncentiveAccountData.points),
583
- totalPoints: Number(originBorrowIncentiveAccountData.total_points),
665
+ debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),
666
+ pointList: originBorrowIncentiveAccountData.points_list.reduce(
667
+ (acc, point) => {
668
+ const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);
669
+ const name = parseStructTag(
670
+ parsed.pointType
671
+ ).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;
672
+ acc[name] = parsed;
673
+ return acc;
674
+ },
675
+ {} as Record<
676
+ SupportBorrowIncentiveRewardCoins,
677
+ ParsedBorrowIncentiveAccountPoolData
678
+ >
679
+ ),
584
680
  };
585
681
  };
586
682
 
package/src/utils/util.ts CHANGED
@@ -3,6 +3,8 @@ import {
3
3
  SUPPORT_POOLS,
4
4
  SUPPORT_COLLATERALS,
5
5
  SUPPORT_SPOOLS_REWARDS,
6
+ MAX_LOCK_DURATION,
7
+ SUPPORT_BORROW_INCENTIVE_REWARDS,
6
8
  } from '../constants';
7
9
  import type { ScallopAddress } from '../models';
8
10
  import type {
@@ -22,6 +24,7 @@ export const isMarketCoin = (
22
24
  ...SUPPORT_POOLS,
23
25
  ...SUPPORT_COLLATERALS,
24
26
  ...SUPPORT_SPOOLS_REWARDS,
27
+ ...SUPPORT_BORROW_INCENTIVE_REWARDS,
25
28
  ]),
26
29
  ].includes(assetCoinName)
27
30
  );
@@ -52,7 +55,12 @@ export const parseDataFromPythPriceFeed = (
52
55
  address: ScallopAddress
53
56
  ) => {
54
57
  const assetCoinNames = [
55
- ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),
58
+ ...new Set([
59
+ ...SUPPORT_POOLS,
60
+ ...SUPPORT_COLLATERALS,
61
+ ...SUPPORT_SPOOLS_REWARDS,
62
+ ...SUPPORT_BORROW_INCENTIVE_REWARDS,
63
+ ]),
56
64
  ] as SupportAssetCoins[];
57
65
  const assetCoinName = assetCoinNames.find((assetCoinName) => {
58
66
  return (
@@ -71,3 +79,28 @@ export const parseDataFromPythPriceFeed = (
71
79
  throw new Error('Invalid feed id');
72
80
  }
73
81
  };
82
+
83
+ /**
84
+ * Find the closest unlock round timestamp (12AM) to the given unlock at timestamp in seconds.
85
+ *
86
+ * @param unlockAtInSecondTimestamp - Unlock at in seconds timestamp to find the closest round.
87
+ * @returns Closest round (12AM) in seconds timestamp.
88
+ */
89
+ export const findClosestUnlockRound = (unlockAtInSecondTimestamp: number) => {
90
+ const unlockDate = new Date(unlockAtInSecondTimestamp * 1000);
91
+ const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1000);
92
+
93
+ closestTwelveAM.setUTCHours(0, 0, 0, 0); // Set the time to the next 12 AM UTC
94
+
95
+ // If the current time is past 12 AM, set the date to the next day
96
+ if (unlockDate.getUTCHours() >= 0) {
97
+ closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);
98
+ }
99
+
100
+ const now = new Date().getTime();
101
+ // check if unlock period > 4 years
102
+ if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1000) {
103
+ closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);
104
+ }
105
+ return Math.floor(closestTwelveAM.getTime() / 1000);
106
+ };