@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/constants/common.d.ts +1 -0
- package/dist/index.js +210 -93
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +181 -65
- package/dist/index.mjs.map +1 -1
- package/dist/types/address.d.ts +3 -0
- package/dist/types/query/borrowIncentive.d.ts +6 -1
- package/dist/types/query/core.d.ts +13 -1
- package/dist/types/query/portfolio.d.ts +13 -0
- package/dist/types/query/spool.d.ts +9 -2
- package/package.json +1 -1
- package/src/constants/common.ts +3 -0
- package/src/models/scallopAddress.ts +3 -0
- package/src/models/scallopUtils.ts +3 -1
- package/src/queries/borrowIncentiveQuery.ts +2 -1
- package/src/queries/coreQuery.ts +39 -4
- package/src/queries/portfolioQuery.ts +59 -5
- package/src/queries/spoolQuery.ts +85 -38
- package/src/types/address.ts +3 -0
- package/src/types/query/borrowIncentive.ts +6 -1
- package/src/types/query/core.ts +11 -0
- package/src/types/query/portfolio.ts +16 -0
- package/src/types/query/spool.ts +9 -2
- package/src/utils/query.ts +25 -6
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
|
|
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:
|
|
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:
|
|
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:
|
|
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 =
|
|
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 =
|
|
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: `${
|
|
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
|
|
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
|
|
1735
|
+
const spoolFields = spoolObject.content.fields;
|
|
1685
1736
|
const parsedSpoolData = parseOriginSpoolData({
|
|
1686
|
-
stakeType:
|
|
1687
|
-
maxDistributedPoint:
|
|
1688
|
-
distributedPoint:
|
|
1689
|
-
distributedPointPerPeriod:
|
|
1690
|
-
pointDistributionTime:
|
|
1691
|
-
maxStake:
|
|
1692
|
-
stakes:
|
|
1693
|
-
index:
|
|
1694
|
-
createdAt:
|
|
1695
|
-
lastUpdate:
|
|
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
|
|
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:
|
|
1708
|
-
exchange_rate_numerator:
|
|
1709
|
-
exchange_rate_denominator:
|
|
1710
|
-
|
|
1711
|
-
|
|
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
|
|
1749
|
-
const stakeAccountType = `${
|
|
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] = `${
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
|
1896
|
-
const
|
|
1897
|
-
const
|
|
1898
|
-
const
|
|
1899
|
-
const
|
|
1900
|
-
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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 [
|
|
2488
|
+
for (const [poolCoinName, obligationDebt] of Object.entries(
|
|
2375
2489
|
obligationAccount.debts
|
|
2376
2490
|
)) {
|
|
2377
|
-
const marketPool = market.pools[
|
|
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
|
|
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 `${
|
|
2976
|
+
return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;
|
|
2862
2977
|
}
|
|
2863
2978
|
parseCoinNameFromType(coinType) {
|
|
2864
|
-
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,
|