@scallop-io/sui-scallop-sdk 0.44.3 → 0.44.5

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/index.mjs CHANGED
@@ -2,6 +2,7 @@
2
2
  var API_BASE_URL = "https://sui.api.scallop.io";
3
3
  var ADDRESSES_ID = "6462a088a7ace142bb6d7e9b";
4
4
  var PROTOCOL_OBJECT_ID = "0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf";
5
+ var BORROW_FEE_PROTOCOL_ID = "0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da";
5
6
  var SUPPORT_POOLS = [
6
7
  "eth",
7
8
  "btc",
@@ -147,6 +148,7 @@ var EMPTY_ADDRESSES = {
147
148
  core: {
148
149
  version: "",
149
150
  versionCap: "",
151
+ object: "",
150
152
  market: "",
151
153
  adminCap: "",
152
154
  coinDecimalsRegistry: "",
@@ -324,6 +326,7 @@ var EMPTY_ADDRESSES = {
324
326
  spool: {
325
327
  id: "",
326
328
  adminCap: "",
329
+ object: "",
327
330
  pools: {
328
331
  ssui: {
329
332
  id: "",
@@ -338,6 +341,7 @@ var EMPTY_ADDRESSES = {
338
341
  borrowIncentive: {
339
342
  id: "",
340
343
  adminCap: "",
344
+ object: "",
341
345
  query: "",
342
346
  incentivePools: "",
343
347
  incentiveAccounts: ""
@@ -648,7 +652,7 @@ import { normalizeSuiAddress as normalizeSuiAddress2 } from "@mysten/sui.js/util
648
652
  import { SuiKit as SuiKit4 } from "@scallop-io/sui-kit";
649
653
 
650
654
  // src/models/scallopUtils.ts
651
- import { SUI_TYPE_ARG, normalizeStructTag as normalizeStructTag3 } from "@mysten/sui.js/utils";
655
+ import { SUI_TYPE_ARG, normalizeStructTag as normalizeStructTag5 } from "@mysten/sui.js/utils";
652
656
  import { SuiKit as SuiKit2 } from "@scallop-io/sui-kit";
653
657
  import { SuiPriceServiceConnection } from "@pythnetwork/pyth-sui-js";
654
658
 
@@ -656,6 +660,7 @@ import { SuiPriceServiceConnection } from "@pythnetwork/pyth-sui-js";
656
660
  import { SuiKit } from "@scallop-io/sui-kit";
657
661
 
658
662
  // src/queries/coreQuery.ts
663
+ import { normalizeStructTag as normalizeStructTag2 } from "@mysten/sui.js/utils";
659
664
  import { SuiTxBlock as SuiKitTxBlock } from "@scallop-io/sui-kit";
660
665
  import BigNumber2 from "bignumber.js";
661
666
 
@@ -673,7 +678,7 @@ import BigNumber from "bignumber.js";
673
678
  import { normalizeStructTag } from "@mysten/sui.js/utils";
674
679
  var parseOriginMarketPoolData = (originMarketPoolData) => {
675
680
  return {
676
- coinType: "0x" + originMarketPoolData.type.name,
681
+ coinType: normalizeStructTag(originMarketPoolData.type.name),
677
682
  // Parse origin data required for basic calculations.
678
683
  maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,
679
684
  borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,
@@ -686,6 +691,7 @@ var parseOriginMarketPoolData = (originMarketPoolData) => {
686
691
  reserveAmount: Number(originMarketPoolData.reserve),
687
692
  reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,
688
693
  borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,
694
+ borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,
689
695
  // Parse origin data required for additional display.
690
696
  baseBorrowRate: Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,
691
697
  borrowRateOnHighKink: Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,
@@ -767,7 +773,7 @@ var calculateMarketPoolData = (utils, parsedMarketPoolData) => {
767
773
  };
768
774
  var parseOriginMarketCollateralData = (originMarketCollateralData) => {
769
775
  return {
770
- coinType: "0x" + originMarketCollateralData.type.name,
776
+ coinType: normalizeStructTag(originMarketCollateralData.type.name),
771
777
  collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,
772
778
  liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,
773
779
  liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,
@@ -799,7 +805,7 @@ var calculateMarketCollateralData = (utils, parsedMarketCollateralData) => {
799
805
  };
800
806
  var parseOriginSpoolData = (originSpoolData) => {
801
807
  return {
802
- stakeType: "0x" + originSpoolData.stakeType.fields.name,
808
+ stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),
803
809
  maxPoint: Number(originSpoolData.maxDistributedPoint),
804
810
  distributedPoint: Number(originSpoolData.distributedPoint),
805
811
  pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),
@@ -856,12 +862,14 @@ var calculateSpoolData = (parsedSpoolData, stakeMarketCoinPrice, stakeMarketCoin
856
862
  var parseOriginSpoolRewardPoolData = (originSpoolRewardPoolData) => {
857
863
  return {
858
864
  claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),
859
- exchangeRateNumerator: Number(
860
- originSpoolRewardPoolData.exchange_rate_numerator
861
- ),
862
865
  exchangeRateDenominator: Number(
863
866
  originSpoolRewardPoolData.exchange_rate_denominator
864
867
  ),
868
+ exchangeRateNumerator: Number(
869
+ originSpoolRewardPoolData.exchange_rate_numerator
870
+ ),
871
+ feeRateDenominator: Number(originSpoolRewardPoolData.fee_rate_denominator),
872
+ feeRateNumerator: Number(originSpoolRewardPoolData.fee_rate_numerator),
865
873
  rewards: Number(originSpoolRewardPoolData.rewards),
866
874
  spoolId: String(originSpoolRewardPoolData.spool_id)
867
875
  };
@@ -886,6 +894,7 @@ var calculateSpoolRewardPoolData = (parsedSpoolData, parsedSpoolRewardPoolData,
886
894
  const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
887
895
  const rewardValueForYear = BigNumber(rewardPerSec).shiftedBy(-1 * rewardCoinDecimal).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
888
896
  const rewardRate = rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).isFinite() ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber() : Infinity;
897
+ const rewardFeeRate = BigNumber(parsedSpoolRewardPoolData.feeRateNumerator).dividedBy(parsedSpoolRewardPoolData.feeRateDenominator).toNumber();
889
898
  return {
890
899
  rewardApr: rewardRate,
891
900
  totalRewardAmount: totalRewardAmount.toNumber(),
@@ -897,7 +906,8 @@ var calculateSpoolRewardPoolData = (parsedSpoolData, parsedSpoolRewardPoolData,
897
906
  claimedRewardAmount: claimedRewardAmount.toNumber(),
898
907
  claimedRewardCoin: claimedRewardCoin.toNumber(),
899
908
  claimedRewardValue: claimedRewardValue.toNumber(),
900
- rewardPerSec: rewardPerSec.toNumber()
909
+ rewardPerSec: rewardPerSec.toNumber(),
910
+ rewardFee: rewardFeeRate
901
911
  };
902
912
  };
903
913
  var parseOriginBorrowIncentivePoolData = (originBorrowIncentivePoolData) => {
@@ -972,6 +982,12 @@ var parseOriginBorrowIncentiveRewardPoolData = (originBorrowIncentiveRewardPoolD
972
982
  exchangeRateDenominator: Number(
973
983
  originBorrowIncentiveRewardPoolData.exchange_rate_denominator
974
984
  ),
985
+ rewardsFeeRateNumerator: Number(
986
+ originBorrowIncentiveRewardPoolData.rewards_fee_rate_numerator
987
+ ),
988
+ rewardsFeeRateDenominator: Number(
989
+ originBorrowIncentiveRewardPoolData.rewards_fee_rate_denominator
990
+ ),
975
991
  remainingRewards: Number(
976
992
  originBorrowIncentiveRewardPoolData.remaining_reward
977
993
  )
@@ -1001,6 +1017,9 @@ var calculateBorrowIncentiveRewardPoolData = (parsedBorrowIncentivePoolData, par
1001
1017
  const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
1002
1018
  const rewardValueForYear = BigNumber(rewardPerSec).shiftedBy(-1 * rewardCoinDecimal).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
1003
1019
  const rewardRate = rewardValueForYear.dividedBy(calculatedBorrowIncentivePoolData.stakedValue).isFinite() ? rewardValueForYear.dividedBy(calculatedBorrowIncentivePoolData.stakedValue).toNumber() : Infinity;
1020
+ const rewardFeeRate = BigNumber(
1021
+ parsedBorrowIncentiveRewardPoolData.rewardsFeeRateNumerator
1022
+ ).dividedBy(parsedBorrowIncentiveRewardPoolData.rewardsFeeRateDenominator).toNumber();
1004
1023
  return {
1005
1024
  rewardApr: rewardRate,
1006
1025
  totalRewardAmount: totalRewardAmount.toNumber(),
@@ -1012,7 +1031,8 @@ var calculateBorrowIncentiveRewardPoolData = (parsedBorrowIncentivePoolData, par
1012
1031
  claimedRewardAmount: claimedRewardAmount.toNumber(),
1013
1032
  claimedRewardCoin: claimedRewardCoin.toNumber(),
1014
1033
  claimedRewardValue: claimedRewardValue.toNumber(),
1015
- rewardPerSec: rewardPerSec.toNumber()
1034
+ rewardPerSec: rewardPerSec.toNumber(),
1035
+ rewardFee: rewardFeeRate
1016
1036
  };
1017
1037
  };
1018
1038
  var parseOriginBorrowIncentiveAccountData = (originBorrowIncentiveAccountData) => {
@@ -1088,7 +1108,7 @@ var queryMarket = async (query) => {
1088
1108
  const pools = {};
1089
1109
  const collaterals = {};
1090
1110
  for (const pool of marketData.pools) {
1091
- const coinType = "0x" + pool.type.name;
1111
+ const coinType = normalizeStructTag2(pool.type.name);
1092
1112
  const poolCoinName = query.utils.parseCoinNameFromType(coinType);
1093
1113
  const coinPrice = (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName] ?? 0;
1094
1114
  if (!SUPPORT_POOLS.includes(poolCoinName)) {
@@ -1107,6 +1127,7 @@ var queryMarket = async (query) => {
1107
1127
  reserve: pool.reserve,
1108
1128
  reserveFactor: pool.reserveFactor,
1109
1129
  borrowWeight: pool.borrowWeight,
1130
+ borrowFeeRate: pool.borrowFeeRate,
1110
1131
  baseBorrowRatePerSec: pool.baseBorrowRatePerSec,
1111
1132
  borrowRateOnHighKink: pool.borrowRateOnHighKink,
1112
1133
  borrowRateOnMidKink: pool.borrowRateOnMidKink,
@@ -1130,13 +1151,14 @@ var queryMarket = async (query) => {
1130
1151
  midKink: parsedMarketPoolData.midKink,
1131
1152
  reserveFactor: parsedMarketPoolData.reserveFactor,
1132
1153
  borrowWeight: parsedMarketPoolData.borrowWeight,
1154
+ borrowFee: parsedMarketPoolData.borrowFee,
1133
1155
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
1134
1156
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
1135
1157
  ...calculatedMarketPoolData
1136
1158
  };
1137
1159
  }
1138
1160
  for (const collateral of marketData.collaterals) {
1139
- const coinType = "0x" + collateral.type.name;
1161
+ const coinType = normalizeStructTag2(collateral.type.name);
1140
1162
  const collateralCoinName = query.utils.parseCoinNameFromType(coinType);
1141
1163
  const coinPrice = (await query.utils.getCoinPrices([collateralCoinName]))?.[collateralCoinName] ?? 0;
1142
1164
  if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {
@@ -1214,6 +1236,7 @@ var getMarketPool = async (query, poolCoinName, marketObject, coinPrice) => {
1214
1236
  let balanceSheet;
1215
1237
  let borrowIndex;
1216
1238
  let interestModel;
1239
+ let borrowFeeRate;
1217
1240
  if (marketObject) {
1218
1241
  if (marketObject.content && "fields" in marketObject.content) {
1219
1242
  const fields = marketObject.content.fields;
@@ -1263,9 +1286,25 @@ var getMarketPool = async (query, poolCoinName, marketObject, coinPrice) => {
1263
1286
  const dynamicFields = interestModelDynamicFieldObject.content.fields;
1264
1287
  interestModel = dynamicFields.value.fields;
1265
1288
  }
1289
+ const borrowFeeDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1290
+ parentId: marketId,
1291
+ name: {
1292
+ type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
1293
+ value: {
1294
+ type: {
1295
+ name: coinType.substring(2)
1296
+ }
1297
+ }
1298
+ }
1299
+ });
1300
+ const borrowFeeDynamicFieldObject = borrowFeeDynamicFieldObjectResponse.data;
1301
+ if (borrowFeeDynamicFieldObject && borrowFeeDynamicFieldObject.content && "fields" in borrowFeeDynamicFieldObject.content) {
1302
+ const dynamicFields = borrowFeeDynamicFieldObject.content.fields;
1303
+ borrowFeeRate = dynamicFields.value.fields;
1304
+ }
1266
1305
  }
1267
1306
  }
1268
- if (balanceSheet && borrowIndex && interestModel) {
1307
+ if (balanceSheet && borrowIndex && interestModel && borrowFeeRate) {
1269
1308
  const parsedMarketPoolData = parseOriginMarketPoolData({
1270
1309
  type: interestModel.type.fields,
1271
1310
  maxBorrowRate: interestModel.max_borrow_rate.fields,
@@ -1279,6 +1318,7 @@ var getMarketPool = async (query, poolCoinName, marketObject, coinPrice) => {
1279
1318
  reserve: balanceSheet.revenue,
1280
1319
  reserveFactor: interestModel.revenue_factor.fields,
1281
1320
  borrowWeight: interestModel.borrow_weight.fields,
1321
+ borrowFeeRate,
1282
1322
  baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
1283
1323
  borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
1284
1324
  borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
@@ -1303,6 +1343,7 @@ var getMarketPool = async (query, poolCoinName, marketObject, coinPrice) => {
1303
1343
  midKink: parsedMarketPoolData.midKink,
1304
1344
  reserveFactor: parsedMarketPoolData.reserveFactor,
1305
1345
  borrowWeight: parsedMarketPoolData.borrowWeight,
1346
+ borrowFee: parsedMarketPoolData.borrowFee,
1306
1347
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
1307
1348
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
1308
1349
  ...calculatedMarketPoolData
@@ -1417,6 +1458,7 @@ var getMarketCollateral = async (query, collateralCoinName, marketObject, coinPr
1417
1458
  };
1418
1459
  var getObligations = async (query, ownerAddress) => {
1419
1460
  const owner = ownerAddress || query.suiKit.currentAddress();
1461
+ const protocolObjectId = query.address.get("core.object") || PROTOCOL_OBJECT_ID;
1420
1462
  const keyObjectsResponse = [];
1421
1463
  let hasNextPage = false;
1422
1464
  let nextCursor = null;
@@ -1424,7 +1466,7 @@ var getObligations = async (query, ownerAddress) => {
1424
1466
  const paginatedKeyObjectsResponse = await query.suiKit.client().getOwnedObjects({
1425
1467
  owner,
1426
1468
  filter: {
1427
- StructType: `${PROTOCOL_OBJECT_ID}::obligation::ObligationKey`
1469
+ StructType: `${protocolObjectId}::obligation::ObligationKey`
1428
1470
  },
1429
1471
  cursor: nextCursor
1430
1472
  });
@@ -1637,7 +1679,7 @@ var getMarketCoinAmount = async (query, marketCoinName, ownerAddress) => {
1637
1679
  };
1638
1680
 
1639
1681
  // src/queries/spoolQuery.ts
1640
- import { normalizeStructTag as normalizeStructTag2 } from "@mysten/sui.js/utils";
1682
+ import { normalizeStructTag as normalizeStructTag3 } from "@mysten/sui.js/utils";
1641
1683
  var getSpools = async (query, stakeMarketCoinNames) => {
1642
1684
  stakeMarketCoinNames = stakeMarketCoinNames || [...SUPPORT_SPOOLS];
1643
1685
  const stakeCoinNames = stakeMarketCoinNames.map(
@@ -1661,6 +1703,7 @@ var getSpools = async (query, stakeMarketCoinNames) => {
1661
1703
  var getSpool = async (query, marketCoinName, marketPool) => {
1662
1704
  const coinName = query.utils.parseCoinName(marketCoinName);
1663
1705
  marketPool = marketPool || await query.getMarketPool(coinName);
1706
+ const spoolPkgId = query.address.get(`spool.id`);
1664
1707
  const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);
1665
1708
  const rewardPoolId = query.address.get(
1666
1709
  `spool.pools.${marketCoinName}.rewardPoolId`
@@ -1672,6 +1715,13 @@ var getSpool = async (query, marketCoinName, marketPool) => {
1672
1715
  showContent: true
1673
1716
  }
1674
1717
  });
1718
+ const spoolRewardFeeDynamicFieldsResponse = await query.suiKit.client().getDynamicFieldObject({
1719
+ parentId: rewardPoolId,
1720
+ name: {
1721
+ type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,
1722
+ value: { dummy_field: false }
1723
+ }
1724
+ });
1675
1725
  if (marketPool && spoolObjectResponse[0].data && spoolObjectResponse[1].data) {
1676
1726
  const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);
1677
1727
  const coinPrices = await query.utils.getCoinPrices([
@@ -1680,19 +1730,20 @@ var getSpool = async (query, marketCoinName, marketPool) => {
1680
1730
  ]);
1681
1731
  const spoolObject = spoolObjectResponse[0].data;
1682
1732
  const rewardPoolObject = spoolObjectResponse[1].data;
1733
+ const rewardFeeObject = spoolRewardFeeDynamicFieldsResponse.data;
1683
1734
  if (spoolObject.content && "fields" in spoolObject.content) {
1684
- const fields = spoolObject.content.fields;
1735
+ const spoolFields = spoolObject.content.fields;
1685
1736
  const parsedSpoolData = parseOriginSpoolData({
1686
- stakeType: fields.stake_type,
1687
- maxDistributedPoint: fields.max_distributed_point,
1688
- distributedPoint: fields.distributed_point,
1689
- distributedPointPerPeriod: fields.distributed_point_per_period,
1690
- pointDistributionTime: fields.point_distribution_time,
1691
- maxStake: fields.max_stakes,
1692
- stakes: fields.stakes,
1693
- index: fields.index,
1694
- createdAt: fields.created_at,
1695
- lastUpdate: fields.last_update
1737
+ stakeType: spoolFields.stake_type,
1738
+ maxDistributedPoint: spoolFields.max_distributed_point,
1739
+ distributedPoint: spoolFields.distributed_point,
1740
+ distributedPointPerPeriod: spoolFields.distributed_point_per_period,
1741
+ pointDistributionTime: spoolFields.point_distribution_time,
1742
+ maxStake: spoolFields.max_stakes,
1743
+ stakes: spoolFields.stakes,
1744
+ index: spoolFields.index,
1745
+ createdAt: spoolFields.created_at,
1746
+ lastUpdate: spoolFields.last_update
1696
1747
  });
1697
1748
  const marketCoinPrice = (coinPrices?.[coinName] ?? 0) * marketPool.conversionRate;
1698
1749
  const marketCoinDecimal = query.utils.getCoinDecimal(marketCoinName);
@@ -1701,14 +1752,17 @@ var getSpool = async (query, marketCoinName, marketPool) => {
1701
1752
  marketCoinPrice,
1702
1753
  marketCoinDecimal
1703
1754
  );
1704
- if (rewardPoolObject.content && "fields" in rewardPoolObject.content) {
1705
- const fields2 = rewardPoolObject.content.fields;
1755
+ if (rewardPoolObject.content && rewardFeeObject?.content && "fields" in rewardPoolObject.content && "fields" in rewardFeeObject.content) {
1756
+ const rewardPoolFields = rewardPoolObject.content.fields;
1757
+ const rewardFeeFields = rewardFeeObject.content.fields.value.fields;
1706
1758
  const parsedSpoolRewardPoolData = parseOriginSpoolRewardPoolData({
1707
- claimed_rewards: fields2.claimed_rewards,
1708
- exchange_rate_numerator: fields2.exchange_rate_numerator,
1709
- exchange_rate_denominator: fields2.exchange_rate_denominator,
1710
- rewards: fields2.rewards,
1711
- spool_id: fields2.spool_id
1759
+ claimed_rewards: rewardPoolFields.claimed_rewards,
1760
+ exchange_rate_numerator: rewardPoolFields.exchange_rate_numerator,
1761
+ exchange_rate_denominator: rewardPoolFields.exchange_rate_denominator,
1762
+ fee_rate_numerator: rewardFeeFields.fee_rate_numerator,
1763
+ fee_rate_denominator: rewardFeeFields.fee_rate_denominator,
1764
+ rewards: rewardPoolFields.rewards,
1765
+ spool_id: rewardPoolFields.spool_id
1712
1766
  });
1713
1767
  const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;
1714
1768
  const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);
@@ -1745,8 +1799,8 @@ var getSpool = async (query, marketCoinName, marketPool) => {
1745
1799
  };
1746
1800
  var getStakeAccounts = async (query, ownerAddress) => {
1747
1801
  const owner = ownerAddress || query.suiKit.currentAddress();
1748
- const spoolPkgId = query.address.get("spool.id");
1749
- const stakeAccountType = `${spoolPkgId}::spool_account::SpoolAccount`;
1802
+ const spoolObjectId = query.address.get("spool.object");
1803
+ const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;
1750
1804
  const stakeObjectsResponse = [];
1751
1805
  let hasNextPage = false;
1752
1806
  let nextCursor = null;
@@ -1775,7 +1829,7 @@ var getStakeAccounts = async (query, ownerAddress) => {
1775
1829
  (types, stakeMarketCoinName) => {
1776
1830
  const stakeCoinName = query.utils.parseCoinName(stakeMarketCoinName);
1777
1831
  const marketCoinType = query.utils.parseMarketCoinType(stakeCoinName);
1778
- types[stakeMarketCoinName] = `${spoolPkgId}::spool_account::SpoolAccount<${marketCoinType}>`;
1832
+ types[stakeMarketCoinName] = `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;
1779
1833
  return types;
1780
1834
  },
1781
1835
  {}
@@ -1793,34 +1847,34 @@ var getStakeAccounts = async (query, ownerAddress) => {
1793
1847
  const index = Number(fields.index);
1794
1848
  const points = Number(fields.points);
1795
1849
  const totalPoints = Number(fields.total_points);
1796
- if (normalizeStructTag2(type) === stakeMarketCoinTypes.ssui) {
1850
+ if (normalizeStructTag3(type) === stakeMarketCoinTypes.ssui) {
1797
1851
  stakeAccounts.ssui.push({
1798
1852
  id,
1799
- type,
1853
+ type: normalizeStructTag3(type),
1800
1854
  stakePoolId,
1801
- stakeType,
1855
+ stakeType: normalizeStructTag3(stakeType),
1802
1856
  staked,
1803
1857
  index,
1804
1858
  points,
1805
1859
  totalPoints
1806
1860
  });
1807
- } else if (normalizeStructTag2(type) === stakeMarketCoinTypes.susdc) {
1861
+ } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.susdc) {
1808
1862
  stakeAccounts.susdc.push({
1809
1863
  id,
1810
- type,
1864
+ type: normalizeStructTag3(type),
1811
1865
  stakePoolId,
1812
- stakeType,
1866
+ stakeType: normalizeStructTag3(stakeType),
1813
1867
  staked,
1814
1868
  index,
1815
1869
  points,
1816
1870
  totalPoints
1817
1871
  });
1818
- } else if (normalizeStructTag2(type) === stakeMarketCoinTypes.susdt) {
1872
+ } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.susdt) {
1819
1873
  stakeAccounts.susdt.push({
1820
1874
  id,
1821
- type,
1875
+ type: normalizeStructTag3(type),
1822
1876
  stakePoolId,
1823
- stakeType,
1877
+ stakeType: normalizeStructTag3(stakeType),
1824
1878
  staked,
1825
1879
  index,
1826
1880
  points,
@@ -1859,13 +1913,13 @@ var getStakePool = async (query, marketCoinName) => {
1859
1913
  const lastUpdate = Number(fields.last_update);
1860
1914
  stakePool = {
1861
1915
  id,
1862
- type,
1916
+ type: normalizeStructTag3(type),
1863
1917
  maxPoint,
1864
1918
  distributedPoint,
1865
1919
  pointPerPeriod,
1866
1920
  period,
1867
1921
  maxStake,
1868
- stakeType,
1922
+ stakeType: normalizeStructTag3(stakeType),
1869
1923
  totalStaked,
1870
1924
  index,
1871
1925
  createdAt,
@@ -1876,6 +1930,7 @@ var getStakePool = async (query, marketCoinName) => {
1876
1930
  return stakePool;
1877
1931
  };
1878
1932
  var getStakeRewardPool = async (query, marketCoinName) => {
1933
+ const spoolPkgId = query.address.get("spool.id");
1879
1934
  const poolId = query.address.get(
1880
1935
  `spool.pools.${marketCoinName}.rewardPoolId`
1881
1936
  );
@@ -1887,23 +1942,38 @@ var getStakeRewardPool = async (query, marketCoinName) => {
1887
1942
  showType: true
1888
1943
  }
1889
1944
  });
1890
- if (stakeRewardPoolObjectResponse.data) {
1945
+ const stakeRewardFeeDynamicFieldsResponse = await query.suiKit.client().getDynamicFieldObject({
1946
+ parentId: poolId,
1947
+ name: {
1948
+ type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,
1949
+ value: { dummy_field: false }
1950
+ }
1951
+ });
1952
+ if (stakeRewardPoolObjectResponse.data && stakeRewardFeeDynamicFieldsResponse.data) {
1891
1953
  const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;
1954
+ const stakeRewardFeeDynamicFieldObject = stakeRewardFeeDynamicFieldsResponse.data;
1892
1955
  const id = stakeRewardPoolObject.objectId;
1893
1956
  const type = stakeRewardPoolObject.type;
1894
- if (stakeRewardPoolObject.content && "fields" in stakeRewardPoolObject.content) {
1895
- const fields = stakeRewardPoolObject.content.fields;
1896
- const stakePoolId = String(fields.spool_id);
1897
- const ratioNumerator = Number(fields.exchange_rate_numerator);
1898
- const ratioDenominator = Number(fields.exchange_rate_denominator);
1899
- const rewards = Number(fields.rewards);
1900
- const claimedRewards = Number(fields.claimed_rewards);
1957
+ if (stakeRewardPoolObject.content && stakeRewardFeeDynamicFieldObject.content && "fields" in stakeRewardPoolObject.content && "fields" in stakeRewardFeeDynamicFieldObject.content) {
1958
+ const rewardPoolFields = stakeRewardPoolObject.content.fields;
1959
+ const rewardFeeFields = stakeRewardFeeDynamicFieldObject.content.fields.value.fields;
1960
+ const stakePoolId = String(rewardPoolFields.spool_id);
1961
+ const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);
1962
+ const ratioDenominator = Number(
1963
+ rewardPoolFields.exchange_rate_denominator
1964
+ );
1965
+ const rewards = Number(rewardPoolFields.rewards);
1966
+ const claimedRewards = Number(rewardPoolFields.claimed_rewards);
1967
+ const feeRateNumerator = Number(rewardFeeFields.fee_rate_numerator);
1968
+ const feeRateDenominator = Number(rewardFeeFields.fee_rate_denominator);
1901
1969
  stakeRewardPool = {
1902
1970
  id,
1903
- type,
1971
+ type: normalizeStructTag3(type),
1904
1972
  stakePoolId,
1905
1973
  ratioNumerator,
1906
1974
  ratioDenominator,
1975
+ feeRateNumerator,
1976
+ feeRateDenominator,
1907
1977
  rewards,
1908
1978
  claimedRewards
1909
1979
  };
@@ -1913,6 +1983,7 @@ var getStakeRewardPool = async (query, marketCoinName) => {
1913
1983
  };
1914
1984
 
1915
1985
  // src/queries/borrowIncentiveQuery.ts
1986
+ import { normalizeStructTag as normalizeStructTag4 } from "@mysten/sui.js/utils";
1916
1987
  import { SuiTxBlock as SuiKitTxBlock2 } from "@scallop-io/sui-kit";
1917
1988
  var queryBorrowIncentivePools = async (query, borrowIncentiveCoinNames) => {
1918
1989
  borrowIncentiveCoinNames = borrowIncentiveCoinNames || [
@@ -1931,7 +2002,7 @@ var queryBorrowIncentivePools = async (query, borrowIncentiveCoinNames) => {
1931
2002
  const rewardCoinType = parsedBorrowIncentiveRewardPoolData.rewardType;
1932
2003
  const borrowIncentivePools = {};
1933
2004
  for (const pool of borrowIncentivePoolsQueryData.incentive_pools) {
1934
- const coinType = "0x" + pool.pool_type.name;
2005
+ const coinType = normalizeStructTag4(pool.pool_type.name);
1935
2006
  const coinName = query.utils.parseCoinNameFromType(coinType);
1936
2007
  const rewardCoinName = query.utils.parseCoinNameFromType(rewardCoinType);
1937
2008
  if (!borrowIncentiveCoinNames.includes(coinName)) {
@@ -2129,15 +2200,19 @@ var getLending = async (query, poolCoinName, ownerAddress, marketPool, spool, st
2129
2200
  availableUnstakeAmount = availableUnstakeAmount.plus(
2130
2201
  accountStakedMarketCoinAmount
2131
2202
  );
2132
- availableUnstakeCoin = availableUnstakeAmount.shiftedBy(-1 * coinDecimal);
2203
+ availableUnstakeCoin = availableUnstakeAmount.shiftedBy(
2204
+ -1 * spool.coinDecimal
2205
+ );
2133
2206
  const baseIndexRate = 1e9;
2134
2207
  const increasedPointRate = spool?.currentPointIndex ? BigNumber3(spool.currentPointIndex - stakeAccount.index).dividedBy(
2135
2208
  baseIndexRate
2136
2209
  ) : 1;
2137
2210
  availableClaimAmount = availableClaimAmount.plus(
2138
- BigNumber3(stakeAccount.staked).multipliedBy(increasedPointRate).plus(stakeAccount.points).multipliedBy(spool.exchangeRateNumerator).dividedBy(spool.exchangeRateDenominator)
2211
+ accountStakedMarketCoinAmount.multipliedBy(increasedPointRate).plus(stakeAccount.points).multipliedBy(spool.exchangeRateNumerator).dividedBy(spool.exchangeRateDenominator)
2212
+ );
2213
+ availableClaimCoin = availableClaimAmount.shiftedBy(
2214
+ -1 * spool.rewardCoinDecimal
2139
2215
  );
2140
- availableClaimCoin = availableClaimAmount.shiftedBy(-1 * coinDecimal);
2141
2216
  }
2142
2217
  }
2143
2218
  const suppliedAmount = BigNumber3(marketCoinAmount).multipliedBy(
@@ -2222,10 +2297,13 @@ var getObligationAccount = async (query, obligationId, ownerAddress, market, coi
2222
2297
  ])
2223
2298
  ];
2224
2299
  const obligationQuery = await query.queryObligation(obligationId);
2300
+ const borrowIncentivePools = await query.getBorrowIncentivePools();
2301
+ const borrowIncentiveAccounts = await query.getBorrowIncentiveAccounts(obligationId);
2225
2302
  coinPrices = coinPrices || await query.utils.getCoinPrices(assetCoinNames);
2226
2303
  coinAmounts = coinAmounts || await query.getCoinAmounts(assetCoinNames, ownerAddress);
2227
2304
  const collaterals = {};
2228
2305
  const debts = {};
2306
+ const borrowIncentives = {};
2229
2307
  let totalDepositedPools = 0;
2230
2308
  let totalDepositedValue = BigNumber3(0);
2231
2309
  let totalBorrowCapacityValue = BigNumber3(0);
@@ -2327,6 +2405,41 @@ var getObligationAccount = async (query, obligationId, ownerAddress, market, coi
2327
2405
  };
2328
2406
  }
2329
2407
  }
2408
+ for (const [poolCoinName, borrowIncentiveAccount] of Object.entries(
2409
+ borrowIncentiveAccounts
2410
+ )) {
2411
+ const coinName = poolCoinName;
2412
+ const borrowIncentivePool = borrowIncentivePools[coinName];
2413
+ let availableClaimAmount = BigNumber3(0);
2414
+ let availableClaimCoin = BigNumber3(0);
2415
+ if (borrowIncentivePool) {
2416
+ const accountBorrowedAmount = BigNumber3(borrowIncentiveAccount.amount);
2417
+ const baseIndexRate = 1e9;
2418
+ const increasedPointRate = borrowIncentivePool.currentPointIndex ? BigNumber3(
2419
+ borrowIncentivePool.currentPointIndex - borrowIncentiveAccount.index
2420
+ ).dividedBy(baseIndexRate) : 1;
2421
+ availableClaimAmount = availableClaimAmount.plus(
2422
+ accountBorrowedAmount.multipliedBy(increasedPointRate).plus(borrowIncentiveAccount.points).multipliedBy(borrowIncentivePool.exchangeRateNumerator).dividedBy(borrowIncentivePool.exchangeRateDenominator)
2423
+ );
2424
+ availableClaimCoin = availableClaimAmount.shiftedBy(
2425
+ -1 * borrowIncentivePool.rewardCoinDecimal
2426
+ );
2427
+ if (availableClaimAmount.isGreaterThan(0)) {
2428
+ borrowIncentives[coinName] = {
2429
+ coinName: borrowIncentivePool.coinName,
2430
+ coinType: borrowIncentivePool.coinType,
2431
+ rewardCoinType: borrowIncentivePool.rewardCoinType,
2432
+ symbol: borrowIncentivePool.symbol,
2433
+ coinDecimal: borrowIncentivePool.coinDecimal,
2434
+ rewardCoinDecimal: borrowIncentivePool.rewardCoinDecimal,
2435
+ coinPrice: borrowIncentivePool.coinPrice,
2436
+ rewardCoinPrice: borrowIncentivePool.rewardCoinPrice,
2437
+ availableClaimAmount: availableClaimAmount.toNumber(),
2438
+ availableClaimCoin: availableClaimCoin.toNumber()
2439
+ };
2440
+ }
2441
+ }
2442
+ }
2330
2443
  let riskLevel = totalRequiredCollateralValue.isZero() && totalBorrowedValueWithWeight.isZero() ? BigNumber3(0) : totalBorrowedValueWithWeight.dividedBy(totalRequiredCollateralValue);
2331
2444
  riskLevel = riskLevel.isFinite() ? riskLevel.isLessThan(1) ? riskLevel : BigNumber3(1) : BigNumber3(1);
2332
2445
  const accountBalanceValue = totalDepositedValue.minus(totalBorrowedValue).isGreaterThan(0) ? totalDepositedValue.minus(totalBorrowedValue) : BigNumber3(0);
@@ -2355,7 +2468,8 @@ var getObligationAccount = async (query, obligationId, ownerAddress, market, coi
2355
2468
  totalDepositedPools,
2356
2469
  totalBorrowedPools,
2357
2470
  collaterals,
2358
- debts
2471
+ debts,
2472
+ borrowIncentives
2359
2473
  };
2360
2474
  for (const [collateralCoinName, obligationCollateral] of Object.entries(
2361
2475
  obligationAccount.collaterals
@@ -2371,10 +2485,10 @@ var getObligationAccount = async (query, obligationId, ownerAddress, market, coi
2371
2485
  obligationCollateral.availableWithdrawCoin = availableWithdrawAmount.shiftedBy(-1 * obligationCollateral.coinDecimal).toNumber();
2372
2486
  }
2373
2487
  }
2374
- for (const [assetCoinName, obligationDebt] of Object.entries(
2488
+ for (const [poolCoinName, obligationDebt] of Object.entries(
2375
2489
  obligationAccount.debts
2376
2490
  )) {
2377
- const marketPool = market.pools[assetCoinName];
2491
+ const marketPool = market.pools[poolCoinName];
2378
2492
  if (marketPool) {
2379
2493
  const availableRepayAmount = BigNumber3(
2380
2494
  obligationDebt.availableRepayAmount
@@ -2829,7 +2943,7 @@ var ScallopUtils = class {
2829
2943
  throw Error(`Coin ${coinName} is not supported`);
2830
2944
  }
2831
2945
  if (coinName === "sui")
2832
- return normalizeStructTag3(`${coinPackageId}::sui::SUI`);
2946
+ return normalizeStructTag5(`${coinPackageId}::sui::SUI`);
2833
2947
  const wormHolePckageIds = [
2834
2948
  this._address.get("core.coins.usdc.id") ?? wormholeCoinIds.usdc,
2835
2949
  this._address.get("core.coins.usdt.id") ?? wormholeCoinIds.usdt,
@@ -2857,11 +2971,12 @@ var ScallopUtils = class {
2857
2971
  * @return Market coin type.
2858
2972
  */
2859
2973
  parseMarketCoinType(coinName) {
2974
+ const protocolObjectId = this._address.get("core.object") || PROTOCOL_OBJECT_ID;
2860
2975
  const coinType = this.parseCoinType(coinName);
2861
- return `${PROTOCOL_OBJECT_ID}::reserve::MarketCoin<${coinType}>`;
2976
+ return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;
2862
2977
  }
2863
2978
  parseCoinNameFromType(coinType) {
2864
- coinType = normalizeStructTag3(coinType);
2979
+ coinType = normalizeStructTag5(coinType);
2865
2980
  const coinTypeRegex = new RegExp(`((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)`);
2866
2981
  const coinTypeMatch = coinType.match(coinTypeRegex);
2867
2982
  const isMarketCoinType = coinType.includes("reserve::MarketCoin");
@@ -4555,6 +4670,7 @@ var Scallop = class {
4555
4670
  export {
4556
4671
  ADDRESSES_ID,
4557
4672
  API_BASE_URL,
4673
+ BORROW_FEE_PROTOCOL_ID,
4558
4674
  PROTOCOL_OBJECT_ID,
4559
4675
  SUPPORT_BORROW_INCENTIVE_POOLS,
4560
4676
  SUPPORT_BORROW_INCENTIVE_REWARDS,