@scallop-io/sui-scallop-sdk 0.44.28 → 0.46.0

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 (60) hide show
  1. package/dist/builders/borrowIncentiveBuilder.d.ts +1 -1
  2. package/dist/builders/referralBuilder.d.ts +12 -0
  3. package/dist/constants/cache.d.ts +8 -0
  4. package/dist/constants/common.d.ts +1 -1
  5. package/dist/index.js +890 -419
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +967 -493
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/models/index.d.ts +1 -0
  10. package/dist/models/scallop.d.ts +7 -1
  11. package/dist/models/scallopAddress.d.ts +4 -2
  12. package/dist/models/scallopBuilder.d.ts +2 -0
  13. package/dist/models/scallopCache.d.ts +75 -0
  14. package/dist/models/scallopClient.d.ts +2 -0
  15. package/dist/models/scallopIndexer.d.ts +5 -3
  16. package/dist/models/scallopQuery.d.ts +28 -28
  17. package/dist/models/scallopUtils.d.ts +1 -0
  18. package/dist/queries/coreQuery.d.ts +3 -29
  19. package/dist/queries/index.d.ts +1 -0
  20. package/dist/queries/priceQuery.d.ts +3 -1
  21. package/dist/queries/referralQuery.d.ts +7 -0
  22. package/dist/queries/vescaQuery.d.ts +6 -2
  23. package/dist/types/address.d.ts +15 -0
  24. package/dist/types/builder/core.d.ts +2 -0
  25. package/dist/types/builder/index.d.ts +2 -1
  26. package/dist/types/builder/referral.d.ts +30 -0
  27. package/dist/types/builder/vesca.d.ts +1 -0
  28. package/dist/types/model.d.ts +2 -0
  29. package/package.json +8 -6
  30. package/src/builders/borrowIncentiveBuilder.ts +12 -21
  31. package/src/builders/coreBuilder.ts +54 -0
  32. package/src/builders/index.ts +5 -2
  33. package/src/builders/referralBuilder.ts +178 -0
  34. package/src/builders/vescaBuilder.ts +8 -6
  35. package/src/constants/cache.ts +15 -0
  36. package/src/constants/common.ts +9 -2
  37. package/src/constants/vesca.ts +1 -3
  38. package/src/models/index.ts +1 -0
  39. package/src/models/scallop.ts +26 -7
  40. package/src/models/scallopAddress.ts +87 -38
  41. package/src/models/scallopBuilder.ts +14 -4
  42. package/src/models/scallopCache.ts +285 -0
  43. package/src/models/scallopClient.ts +15 -4
  44. package/src/models/scallopIndexer.ts +58 -84
  45. package/src/models/scallopQuery.ts +54 -5
  46. package/src/models/scallopUtils.ts +66 -37
  47. package/src/queries/borrowIncentiveQuery.ts +6 -12
  48. package/src/queries/coreQuery.ts +83 -260
  49. package/src/queries/index.ts +1 -0
  50. package/src/queries/priceQuery.ts +48 -9
  51. package/src/queries/referralQuery.ts +27 -0
  52. package/src/queries/spoolQuery.ts +20 -27
  53. package/src/queries/vescaQuery.ts +95 -17
  54. package/src/types/address.ts +15 -0
  55. package/src/types/builder/core.ts +14 -0
  56. package/src/types/builder/index.ts +2 -0
  57. package/src/types/builder/referral.ts +51 -0
  58. package/src/types/builder/vesca.ts +1 -0
  59. package/src/types/model.ts +2 -0
  60. package/src/types/query/borrowIncentive.ts +0 -107
package/dist/index.mjs CHANGED
@@ -2,7 +2,10 @@
2
2
  var API_BASE_URL = "https://sui.api.scallop.io";
3
3
  var SDK_API_BASE_URL = "https://sdk.api.scallop.io";
4
4
  var IS_VE_SCA_TEST = false;
5
- var ADDRESSES_ID = IS_VE_SCA_TEST ? "65fb07c39c845425d71d7b18" : "6601955b8b0024600a917079";
5
+ var ADDRESSES_ID = IS_VE_SCA_TEST ? (
6
+ // ? ('65fb07c39c845425d71d7b18' as const)
7
+ "65fb07c39c845425d71d7b18"
8
+ ) : "664dfe22898c36c159e28bc8";
6
9
  var PROTOCOL_OBJECT_ID = IS_VE_SCA_TEST ? "0xc9f859f98ca352a11b97a038c4b4162bee437b8df8caa047990fe9cb03d4f778" : "0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf";
7
10
  var BORROW_FEE_PROTOCOL_ID = IS_VE_SCA_TEST ? "0xc9f859f98ca352a11b97a038c4b4162bee437b8df8caa047990fe9cb03d4f778" : "0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da";
8
11
  var SCA_COIN_TYPE = IS_VE_SCA_TEST ? `0x6cd813061a3adf3602b76545f076205f0c8e7ec1d3b1eab9a1da7992c18c0524::sca::SCA` : "0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA";
@@ -186,7 +189,7 @@ var voloCoinIds = {
186
189
 
187
190
  // src/constants/vesca.ts
188
191
  var UNLOCK_ROUND_DURATION = 60 * 60 * 24;
189
- var MAX_LOCK_ROUNDS = IS_VE_SCA_TEST ? 9 : 1460;
192
+ var MAX_LOCK_ROUNDS = 1460;
190
193
  var MAX_LOCK_DURATION = MAX_LOCK_ROUNDS * UNLOCK_ROUND_DURATION;
191
194
  var MIN_INITIAL_LOCK_AMOUNT = 1e10;
192
195
  var MIN_TOP_UP_AMOUNT = 1e9;
@@ -194,6 +197,226 @@ var MIN_TOP_UP_AMOUNT = 1e9;
194
197
  // src/models/scallop.ts
195
198
  import { SuiKit as SuiKit5 } from "@scallop-io/sui-kit";
196
199
 
200
+ // src/models/scallopCache.ts
201
+ import { QueryClient } from "@tanstack/query-core";
202
+ import { SuiTxBlock, normalizeStructTag } from "@scallop-io/sui-kit";
203
+
204
+ // src/constants/cache.ts
205
+ var DEFAULT_CACHE_OPTIONS = {
206
+ defaultOptions: {
207
+ queries: {
208
+ staleTime: 3e3
209
+ }
210
+ }
211
+ };
212
+
213
+ // src/models/scallopCache.ts
214
+ var ScallopCache = class {
215
+ constructor(cacheOptions, suiKit) {
216
+ this.queryClient = new QueryClient(cacheOptions ?? DEFAULT_CACHE_OPTIONS);
217
+ this._suiKit = suiKit;
218
+ }
219
+ get suiKit() {
220
+ if (!this._suiKit) {
221
+ throw new Error("SuiKit instance is not initialized");
222
+ }
223
+ return this._suiKit;
224
+ }
225
+ /**
226
+ * @description Invalidate cache based on the refetchType parameter
227
+ * @param refetchType Determines the type of queries to be refetched. Defaults to `active`.
228
+ *
229
+ * - `active`: Only queries that match the refetch predicate and are actively being rendered via useQuery and related functions will be refetched in the background.
230
+ * - `inactive`: Only queries that match the refetch predicate and are NOT actively being rendered via useQuery and related functions will be refetched in the background.
231
+ * - `all`: All queries that match the refetch predicate will be refetched in the background.
232
+ * - `none`: No queries will be refetched. Queries that match the refetch predicate will only be marked as invalid.
233
+ */
234
+ invalidateAndRefetchAllCache(refetchType) {
235
+ return this.queryClient.invalidateQueries({
236
+ refetchType
237
+ });
238
+ }
239
+ /**
240
+ * @description Cache protocol config call for 60 seconds.
241
+ * @returns Promise<ProtocolConfig>
242
+ */
243
+ async getProtocolConfig() {
244
+ return await this.queryClient.fetchQuery({
245
+ queryKey: ["getProtocolConfig"],
246
+ queryFn: async () => {
247
+ return await this.suiKit.client().getProtocolConfig();
248
+ },
249
+ staleTime: 3e4
250
+ });
251
+ }
252
+ /**
253
+ * @description Provides cache for inspectTxn of the SuiKit.
254
+ * @param QueryInspectTxnParams
255
+ * @param txBlock
256
+ * @returns Promise<DevInspectResults>
257
+ */
258
+ async queryInspectTxn({
259
+ queryTarget,
260
+ args,
261
+ typeArgs
262
+ }) {
263
+ const txBlock = new SuiTxBlock();
264
+ const resolvedArgs = await Promise.all(
265
+ args.map(async (arg) => {
266
+ if (typeof arg === "string") {
267
+ return (await this.queryGetObject(arg, { showContent: true })).data;
268
+ }
269
+ return arg;
270
+ })
271
+ );
272
+ txBlock.moveCall(queryTarget, resolvedArgs, typeArgs);
273
+ const txBytes = await txBlock.txBlock.build({
274
+ client: this.suiKit.client(),
275
+ onlyTransactionKind: true,
276
+ protocolConfig: await this.getProtocolConfig()
277
+ });
278
+ const query = await this.queryClient.fetchQuery({
279
+ queryKey: typeArgs ? ["inspectTxn", queryTarget, JSON.stringify(args)] : [
280
+ "inspectTxn",
281
+ queryTarget,
282
+ JSON.stringify(args),
283
+ JSON.stringify(typeArgs)
284
+ ],
285
+ queryFn: async () => {
286
+ return await this.suiKit.inspectTxn(txBytes);
287
+ },
288
+ staleTime: 8e3
289
+ // make stale time longer for inspectTxn results
290
+ });
291
+ return query;
292
+ }
293
+ /**
294
+ * @description Provides cache for getObject of the SuiKit.
295
+ * @param objectId
296
+ * @param QueryObjectParams
297
+ * @returns Promise<SuiObjectResponse>
298
+ */
299
+ async queryGetObject(objectId, options) {
300
+ const queryKey = ["getObject", objectId, this.suiKit.currentAddress()];
301
+ if (options) {
302
+ queryKey.push(JSON.stringify(options));
303
+ }
304
+ return this.queryClient.fetchQuery({
305
+ queryKey,
306
+ queryFn: async () => {
307
+ return await this.suiKit.client().getObject({
308
+ id: objectId,
309
+ options
310
+ });
311
+ }
312
+ });
313
+ }
314
+ /**
315
+ * @description Provides cache for getObjects of the SuiKit.
316
+ * @param objectIds
317
+ * @returns Promise<SuiObjectData[]>
318
+ */
319
+ async queryGetObjects(objectIds, options) {
320
+ const queryKey = [
321
+ "getObjects",
322
+ JSON.stringify(objectIds),
323
+ this.suiKit.currentAddress()
324
+ ];
325
+ return this.queryClient.fetchQuery({
326
+ queryKey,
327
+ queryFn: async () => {
328
+ return await this.suiKit.getObjects(objectIds, options);
329
+ }
330
+ });
331
+ }
332
+ /**
333
+ * @description Provides cache for getOwnedObjects of the SuiKit.
334
+ * @param input
335
+ * @returns Promise<PaginatedObjectsResponse>
336
+ */
337
+ async queryGetOwnedObjects(input) {
338
+ const queryKey = ["getOwnedObjects", input.owner];
339
+ if (input.cursor) {
340
+ queryKey.push(JSON.stringify(input.cursor));
341
+ }
342
+ if (input.options) {
343
+ queryKey.push(JSON.stringify(input.options));
344
+ }
345
+ if (input.filter) {
346
+ queryKey.push(JSON.stringify(input.filter));
347
+ }
348
+ if (input.limit) {
349
+ queryKey.push(JSON.stringify(input.limit));
350
+ }
351
+ return this.queryClient.fetchQuery({
352
+ queryKey,
353
+ queryFn: async () => {
354
+ return await this.suiKit.client().getOwnedObjects(input);
355
+ }
356
+ });
357
+ }
358
+ async queryGetDynamicFields(input) {
359
+ const queryKey = ["getDynamicFields", input.parentId];
360
+ if (input.cursor) {
361
+ queryKey.push(JSON.stringify(input.cursor));
362
+ }
363
+ if (input.cursor) {
364
+ queryKey.push(JSON.stringify(input.cursor));
365
+ }
366
+ if (input.limit) {
367
+ queryKey.push(JSON.stringify(input.limit));
368
+ }
369
+ return this.queryClient.fetchQuery({
370
+ queryKey,
371
+ queryFn: async () => {
372
+ return await this.suiKit.client().getDynamicFields(input);
373
+ }
374
+ });
375
+ }
376
+ async queryGetDynamicFieldObject(input) {
377
+ const queryKey = [
378
+ "getDynamicFieldObject",
379
+ input.parentId,
380
+ input.name.value
381
+ ];
382
+ return this.queryClient.fetchQuery({
383
+ queryKey,
384
+ queryFn: async () => {
385
+ return await this.suiKit.client().getDynamicFieldObject(input);
386
+ }
387
+ });
388
+ }
389
+ async queryGetAllCoinBalances(owner) {
390
+ const queryKey = ["getAllCoinBalances", owner];
391
+ return this.queryClient.fetchQuery({
392
+ queryKey,
393
+ queryFn: async () => {
394
+ const allBalances = await this.suiKit.client().getAllBalances({ owner });
395
+ return allBalances.reduce(
396
+ (acc, coinBalance) => {
397
+ if (coinBalance.totalBalance !== "0") {
398
+ acc[normalizeStructTag(coinBalance.coinType)] = coinBalance.totalBalance;
399
+ }
400
+ return acc;
401
+ },
402
+ {}
403
+ );
404
+ }
405
+ });
406
+ }
407
+ async queryGetCoinBalance(input) {
408
+ const queryKey = ["getCoinBalance", input.owner, input.coinType];
409
+ return this.queryClient.fetchQuery({
410
+ queryKey,
411
+ queryFn: async () => {
412
+ if (!input.coinType)
413
+ return "0";
414
+ return (await this.queryGetAllCoinBalances(input.owner))[normalizeStructTag(input.coinType)] ?? "0";
415
+ }
416
+ });
417
+ }
418
+ };
419
+
197
420
  // src/models/scallopAddress.ts
198
421
  import axios from "axios";
199
422
  var EMPTY_ADDRESSES = {
@@ -206,6 +429,45 @@ var EMPTY_ADDRESSES = {
206
429
  coinDecimalsRegistry: "",
207
430
  obligationAccessStore: "",
208
431
  coins: {
432
+ cetus: {
433
+ id: "",
434
+ metaData: "",
435
+ treasury: "",
436
+ oracle: {
437
+ supra: "",
438
+ switchboard: "",
439
+ pyth: {
440
+ feed: "",
441
+ feedObject: ""
442
+ }
443
+ }
444
+ },
445
+ apt: {
446
+ id: "",
447
+ metaData: "",
448
+ treasury: "",
449
+ oracle: {
450
+ supra: "",
451
+ switchboard: "",
452
+ pyth: {
453
+ feed: "",
454
+ feedObject: ""
455
+ }
456
+ }
457
+ },
458
+ sol: {
459
+ id: "",
460
+ metaData: "",
461
+ treasury: "",
462
+ oracle: {
463
+ supra: "",
464
+ switchboard: "",
465
+ pyth: {
466
+ feed: "",
467
+ feedObject: ""
468
+ }
469
+ }
470
+ },
209
471
  btc: {
210
472
  id: "",
211
473
  metaData: "",
@@ -327,15 +589,8 @@ var EMPTY_ADDRESSES = {
327
589
  oracles: {
328
590
  xOracle: "",
329
591
  xOracleCap: "",
330
- supra: {
331
- registry: "",
332
- registryCap: "",
333
- holder: ""
334
- },
335
- switchboard: {
336
- registry: "",
337
- registryCap: ""
338
- },
592
+ supra: { registry: "", registryCap: "", holder: "" },
593
+ switchboard: { registry: "", registryCap: "" },
339
594
  pyth: {
340
595
  registry: "",
341
596
  registryCap: "",
@@ -365,27 +620,25 @@ var EMPTY_ADDRESSES = {
365
620
  id: "",
366
621
  upgradeCap: ""
367
622
  },
368
- query: {
623
+ protocolWhitelist: {
369
624
  id: "",
370
625
  upgradeCap: ""
371
626
  },
372
- pyth: {
627
+ query: {
373
628
  id: "",
374
629
  upgradeCap: ""
375
630
  },
376
- switchboard: {
631
+ supra: { id: "", upgradeCap: "" },
632
+ pyth: {
377
633
  id: "",
378
634
  upgradeCap: ""
379
635
  },
636
+ switchboard: { id: "", upgradeCap: "" },
380
637
  xOracle: {
381
638
  id: "",
382
639
  upgradeCap: ""
383
640
  },
384
- // Deploy for faucet on testnet.
385
- testCoin: {
386
- id: "",
387
- upgradeCap: ""
388
- }
641
+ testCoin: { id: "", upgradeCap: "" }
389
642
  }
390
643
  },
391
644
  spool: {
@@ -425,34 +678,45 @@ var EMPTY_ADDRESSES = {
425
678
  id: "",
426
679
  rewardPoolId: ""
427
680
  }
428
- }
681
+ },
682
+ config: ""
429
683
  },
430
684
  borrowIncentive: {
431
685
  id: "",
432
686
  adminCap: "",
433
687
  object: "",
434
688
  query: "",
435
- config: "",
436
689
  incentivePools: "",
437
- incentiveAccounts: ""
690
+ incentiveAccounts: "",
691
+ config: ""
438
692
  },
439
693
  vesca: {
440
694
  id: "",
695
+ object: "",
441
696
  adminCap: "",
442
697
  tableId: "",
443
698
  table: "",
444
699
  treasury: "",
445
700
  config: ""
701
+ },
702
+ referral: {
703
+ id: "",
704
+ version: "",
705
+ object: "",
706
+ adminCap: "",
707
+ referralBindings: "",
708
+ bindingTableId: "",
709
+ referralRevenuePool: "",
710
+ revenueTableId: "",
711
+ referralTiers: "",
712
+ tiersTableId: "",
713
+ authorizedWitnessList: ""
446
714
  }
447
715
  };
448
716
  var ScallopAddress = class {
449
- constructor(params) {
717
+ constructor(params, cache) {
450
718
  const { id, auth, network } = params;
451
- if (auth)
452
- this._auth = auth;
453
- this._id = id;
454
- this._network = network || "mainnet";
455
- this._addressesMap = /* @__PURE__ */ new Map();
719
+ this._cache = cache ?? new ScallopCache(DEFAULT_CACHE_OPTIONS);
456
720
  this._requestClient = axios.create({
457
721
  baseURL: API_BASE_URL,
458
722
  headers: {
@@ -461,6 +725,11 @@ var ScallopAddress = class {
461
725
  },
462
726
  timeout: 3e4
463
727
  });
728
+ if (auth)
729
+ this._auth = auth;
730
+ this._id = id;
731
+ this._network = network || "mainnet";
732
+ this._addressesMap = /* @__PURE__ */ new Map();
464
733
  }
465
734
  /**
466
735
  * Get addresses API id.
@@ -584,7 +853,7 @@ var ScallopAddress = class {
584
853
  this._addressesMap.clear();
585
854
  this.setAddresses(targetAddresses, targetNetwork);
586
855
  const response = await this._requestClient.post(
587
- `${API_BASE_URL}/addresses`,
856
+ `/addresses`,
588
857
  JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
589
858
  {
590
859
  headers: {
@@ -621,14 +890,16 @@ var ScallopAddress = class {
621
890
  async read(id) {
622
891
  const addressesId = id || this._id || void 0;
623
892
  if (addressesId !== void 0) {
624
- const response = await this._requestClient.get(
625
- `${API_BASE_URL}/addresses/${addressesId}`,
626
- {
627
- headers: {
628
- "Content-Type": "application/json"
629
- }
893
+ const response = await this._cache.queryClient.fetchQuery({
894
+ queryKey: ["api-getAddresses", addressesId],
895
+ queryFn: async () => {
896
+ return await this._requestClient.get(`/addresses/${addressesId}`, {
897
+ headers: {
898
+ "Content-Type": "application/json"
899
+ }
900
+ });
630
901
  }
631
- );
902
+ });
632
903
  if (response.status === 200) {
633
904
  for (const [network, addresses] of Object.entries(
634
905
  response.data
@@ -682,7 +953,7 @@ var ScallopAddress = class {
682
953
  }
683
954
  this.setAddresses(targetAddresses, targetNetwork);
684
955
  const response = await this._requestClient.put(
685
- `${API_BASE_URL}/addresses/${targetId}`,
956
+ `/addresses/${targetId}`,
686
957
  JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
687
958
  {
688
959
  headers: {
@@ -724,7 +995,7 @@ var ScallopAddress = class {
724
995
  throw Error("Require specific addresses id to be deleted.");
725
996
  if (apiKey !== void 0) {
726
997
  const response = await this._requestClient.delete(
727
- `${API_BASE_URL}/addresses/${targetId}`,
998
+ `/addresses/${targetId}`,
728
999
  {
729
1000
  headers: {
730
1001
  "Content-Type": "application/json",
@@ -750,7 +1021,7 @@ import { normalizeSuiAddress as normalizeSuiAddress2 } from "@mysten/sui.js/util
750
1021
  import { SuiKit as SuiKit4 } from "@scallop-io/sui-kit";
751
1022
 
752
1023
  // src/models/scallopUtils.ts
753
- import { SUI_TYPE_ARG, normalizeStructTag as normalizeStructTag5 } from "@mysten/sui.js/utils";
1024
+ import { SUI_TYPE_ARG, normalizeStructTag as normalizeStructTag6 } from "@mysten/sui.js/utils";
754
1025
  import { SuiKit as SuiKit2 } from "@scallop-io/sui-kit";
755
1026
  import { SuiPriceServiceConnection } from "@pythnetwork/pyth-sui-js";
756
1027
 
@@ -758,9 +1029,7 @@ import { SuiPriceServiceConnection } from "@pythnetwork/pyth-sui-js";
758
1029
  import { SuiKit } from "@scallop-io/sui-kit";
759
1030
 
760
1031
  // src/queries/coreQuery.ts
761
- import { normalizeStructTag as normalizeStructTag2 } from "@mysten/sui.js/utils";
762
- import { SuiTxBlock as SuiKitTxBlock } from "@scallop-io/sui-kit";
763
- import BigNumber2 from "bignumber.js";
1032
+ import { normalizeStructTag as normalizeStructTag3 } from "@mysten/sui.js/utils";
764
1033
 
765
1034
  // src/utils/builder.ts
766
1035
  var requireSender = (txBlock) => {
@@ -859,10 +1128,10 @@ var checkVesca = (prevUnlockAtInSecondTimestamp) => {
859
1128
 
860
1129
  // src/utils/query.ts
861
1130
  import BigNumber from "bignumber.js";
862
- import { normalizeStructTag, parseStructTag } from "@mysten/sui.js/utils";
1131
+ import { normalizeStructTag as normalizeStructTag2, parseStructTag } from "@mysten/sui.js/utils";
863
1132
  var parseOriginMarketPoolData = (originMarketPoolData) => {
864
1133
  return {
865
- coinType: normalizeStructTag(originMarketPoolData.type.name),
1134
+ coinType: normalizeStructTag2(originMarketPoolData.type.name),
866
1135
  // Parse origin data required for basic calculations.
867
1136
  maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,
868
1137
  borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,
@@ -957,7 +1226,7 @@ var calculateMarketPoolData = (utils, parsedMarketPoolData) => {
957
1226
  };
958
1227
  var parseOriginMarketCollateralData = (originMarketCollateralData) => {
959
1228
  return {
960
- coinType: normalizeStructTag(originMarketCollateralData.type.name),
1229
+ coinType: normalizeStructTag2(originMarketCollateralData.type.name),
961
1230
  collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,
962
1231
  liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,
963
1232
  liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,
@@ -989,7 +1258,7 @@ var calculateMarketCollateralData = (utils, parsedMarketCollateralData) => {
989
1258
  };
990
1259
  var parseOriginSpoolData = (originSpoolData) => {
991
1260
  return {
992
- stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),
1261
+ stakeType: normalizeStructTag2(originSpoolData.stakeType.fields.name),
993
1262
  maxPoint: Number(originSpoolData.maxDistributedPoint),
994
1263
  distributedPoint: Number(originSpoolData.distributedPoint),
995
1264
  pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),
@@ -1095,7 +1364,7 @@ var calculateSpoolRewardPoolData = (parsedSpoolData, parsedSpoolRewardPoolData,
1095
1364
  };
1096
1365
  var parseOriginBorrowIncentivesPoolPointData = (originBorrowIncentivePoolPointData) => {
1097
1366
  return {
1098
- pointType: normalizeStructTag(
1367
+ pointType: normalizeStructTag2(
1099
1368
  originBorrowIncentivePoolPointData.point_type.name
1100
1369
  ),
1101
1370
  distributedPointPerPeriod: Number(
@@ -1114,7 +1383,7 @@ var parseOriginBorrowIncentivesPoolPointData = (originBorrowIncentivePoolPointDa
1114
1383
  };
1115
1384
  var parseOriginBorrowIncentivePoolData = (originBorrowIncentivePoolData) => {
1116
1385
  return {
1117
- poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),
1386
+ poolType: normalizeStructTag2(originBorrowIncentivePoolData.pool_type.name),
1118
1387
  minStakes: Number(originBorrowIncentivePoolData.min_stakes),
1119
1388
  maxStakes: Number(originBorrowIncentivePoolData.max_stakes),
1120
1389
  staked: Number(originBorrowIncentivePoolData.stakes),
@@ -1198,7 +1467,7 @@ var calculateBorrowIncentivePoolPointData = (pasredBorrowIncentinvePoolData, par
1198
1467
  };
1199
1468
  var parseOriginBorrowIncentiveAccountPoolPointData = (originBorrowIncentiveAccountPoolPointData) => {
1200
1469
  return {
1201
- pointType: normalizeStructTag(
1470
+ pointType: normalizeStructTag2(
1202
1471
  originBorrowIncentiveAccountPoolPointData.point_type.name
1203
1472
  ),
1204
1473
  weightedAmount: Number(
@@ -1211,7 +1480,7 @@ var parseOriginBorrowIncentiveAccountPoolPointData = (originBorrowIncentiveAccou
1211
1480
  };
1212
1481
  var parseOriginBorrowIncentiveAccountData = (originBorrowIncentiveAccountData) => {
1213
1482
  return {
1214
- poolType: normalizeStructTag(
1483
+ poolType: normalizeStructTag2(
1215
1484
  originBorrowIncentiveAccountData.pool_type.name
1216
1485
  ),
1217
1486
  debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),
@@ -1308,13 +1577,16 @@ var findClosestUnlockRound = (unlockAtInSecondTimestamp) => {
1308
1577
  };
1309
1578
 
1310
1579
  // src/queries/coreQuery.ts
1580
+ import BigNumber2 from "bignumber.js";
1311
1581
  var queryMarket = async (query, indexer = false) => {
1312
1582
  const packageId = query.address.get("core.packages.query.id");
1313
1583
  const marketId = query.address.get("core.market");
1314
- const txBlock = new SuiKitTxBlock();
1315
1584
  const queryTarget = `${packageId}::market_query::market_data`;
1316
- txBlock.moveCall(queryTarget, [marketId]);
1317
- const queryResult = await query.suiKit.inspectTxn(txBlock);
1585
+ const args = [marketId];
1586
+ const queryResult = await query.cache.queryInspectTxn(
1587
+ { queryTarget, args }
1588
+ // txBlock
1589
+ );
1318
1590
  const marketData = queryResult.events[0].parsedJson;
1319
1591
  const coinPrices = await query.utils.getCoinPrices();
1320
1592
  const pools = {};
@@ -1337,7 +1609,7 @@ var queryMarket = async (query, indexer = false) => {
1337
1609
  };
1338
1610
  }
1339
1611
  for (const pool of marketData.pools) {
1340
- const coinType = normalizeStructTag2(pool.type.name);
1612
+ const coinType = normalizeStructTag3(pool.type.name);
1341
1613
  const poolCoinName = query.utils.parseCoinNameFromType(coinType);
1342
1614
  const coinPrice = coinPrices[poolCoinName] ?? 0;
1343
1615
  if (!SUPPORT_POOLS.includes(poolCoinName)) {
@@ -1387,7 +1659,7 @@ var queryMarket = async (query, indexer = false) => {
1387
1659
  };
1388
1660
  }
1389
1661
  for (const collateral of marketData.collaterals) {
1390
- const coinType = normalizeStructTag2(collateral.type.name);
1662
+ const coinType = normalizeStructTag3(collateral.type.name);
1391
1663
  const collateralCoinName = query.utils.parseCoinNameFromType(coinType);
1392
1664
  const coinPrice = coinPrices[collateralCoinName] ?? 0;
1393
1665
  if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {
@@ -1432,11 +1704,8 @@ var queryMarket = async (query, indexer = false) => {
1432
1704
  var getMarketPools = async (query, poolCoinNames, indexer = false) => {
1433
1705
  poolCoinNames = poolCoinNames || [...SUPPORT_POOLS];
1434
1706
  const marketId = query.address.get("core.market");
1435
- const marketObjectResponse = await query.suiKit.client().getObject({
1436
- id: marketId,
1437
- options: {
1438
- showContent: true
1439
- }
1707
+ const marketObjectResponse = await query.cache.queryGetObject(marketId, {
1708
+ showContent: true
1440
1709
  });
1441
1710
  const coinPrices = await query.utils.getCoinPrices(poolCoinNames ?? []);
1442
1711
  const marketPools = {};
@@ -1469,11 +1738,8 @@ var getMarketPools = async (query, poolCoinNames, indexer = false) => {
1469
1738
  };
1470
1739
  var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, coinPrice) => {
1471
1740
  const marketId = query.address.get("core.market");
1472
- marketObject = marketObject || (await query.suiKit.client().getObject({
1473
- id: marketId,
1474
- options: {
1475
- showContent: true
1476
- }
1741
+ marketObject = marketObject || (await query.cache.queryGetObject(marketId, {
1742
+ showContent: true
1477
1743
  })).data;
1478
1744
  coinPrice = coinPrice || (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
1479
1745
  let marketPool;
@@ -1494,7 +1760,7 @@ var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, c
1494
1760
  const fields = marketObject.content.fields;
1495
1761
  const coinType = query.utils.parseCoinType(poolCoinName);
1496
1762
  const balanceSheetParentId = fields.vault.fields.balance_sheets.fields.table.fields.id.id;
1497
- const balanceSheetDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1763
+ const balanceSheetDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1498
1764
  parentId: balanceSheetParentId,
1499
1765
  name: {
1500
1766
  type: "0x1::type_name::TypeName",
@@ -1509,7 +1775,7 @@ var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, c
1509
1775
  balanceSheet = dynamicFields.value.fields;
1510
1776
  }
1511
1777
  const borrowIndexParentId = fields.borrow_dynamics.fields.table.fields.id.id;
1512
- const borrowIndexDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1778
+ const borrowIndexDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1513
1779
  parentId: borrowIndexParentId,
1514
1780
  name: {
1515
1781
  type: "0x1::type_name::TypeName",
@@ -1524,7 +1790,7 @@ var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, c
1524
1790
  borrowIndex = dynamicFields.value.fields;
1525
1791
  }
1526
1792
  const interestModelParentId = fields.interest_models.fields.table.fields.id.id;
1527
- const interestModelDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1793
+ const interestModelDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1528
1794
  parentId: interestModelParentId,
1529
1795
  name: {
1530
1796
  type: "0x1::type_name::TypeName",
@@ -1538,7 +1804,7 @@ var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, c
1538
1804
  const dynamicFields = interestModelDynamicFieldObject.content.fields;
1539
1805
  interestModel = dynamicFields.value.fields;
1540
1806
  }
1541
- const borrowFeeDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1807
+ const borrowFeeDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1542
1808
  parentId: marketId,
1543
1809
  name: {
1544
1810
  type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
@@ -1605,11 +1871,8 @@ var getMarketPool = async (query, poolCoinName, indexer = false, marketObject, c
1605
1871
  var getMarketCollaterals = async (query, collateralCoinNames, indexer = false) => {
1606
1872
  collateralCoinNames = collateralCoinNames || [...SUPPORT_COLLATERALS];
1607
1873
  const marketId = query.address.get("core.market");
1608
- const marketObjectResponse = await query.suiKit.client().getObject({
1609
- id: marketId,
1610
- options: {
1611
- showContent: true
1612
- }
1874
+ const marketObjectResponse = await query.cache.queryGetObject(marketId, {
1875
+ showContent: true
1613
1876
  });
1614
1877
  const coinPrices = await query.utils.getCoinPrices(collateralCoinNames ?? []);
1615
1878
  const marketCollaterals = {};
@@ -1642,11 +1905,8 @@ var getMarketCollaterals = async (query, collateralCoinNames, indexer = false) =
1642
1905
  };
1643
1906
  var getMarketCollateral = async (query, collateralCoinName, indexer = false, marketObject, coinPrice) => {
1644
1907
  const marketId = query.address.get("core.market");
1645
- marketObject = marketObject || (await query.suiKit.client().getObject({
1646
- id: marketId,
1647
- options: {
1648
- showContent: true
1649
- }
1908
+ marketObject = marketObject || (await query.cache.queryGetObject(marketId, {
1909
+ showContent: true
1650
1910
  })).data;
1651
1911
  coinPrice = coinPrice || (await query.utils.getCoinPrices([collateralCoinName]))?.[collateralCoinName];
1652
1912
  let marketCollateral;
@@ -1665,7 +1925,7 @@ var getMarketCollateral = async (query, collateralCoinName, indexer = false, mar
1665
1925
  const fields = marketObject.content.fields;
1666
1926
  const coinType = query.utils.parseCoinType(collateralCoinName);
1667
1927
  const riskModelParentId = fields.risk_models.fields.table.fields.id.id;
1668
- const riskModelDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1928
+ const riskModelDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1669
1929
  parentId: riskModelParentId,
1670
1930
  name: {
1671
1931
  type: "0x1::type_name::TypeName",
@@ -1680,7 +1940,7 @@ var getMarketCollateral = async (query, collateralCoinName, indexer = false, mar
1680
1940
  riskModel = dynamicFields.value.fields;
1681
1941
  }
1682
1942
  const collateralStatParentId = fields.collateral_stats.fields.table.fields.id.id;
1683
- const collateralStatDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
1943
+ const collateralStatDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
1684
1944
  parentId: collateralStatParentId,
1685
1945
  name: {
1686
1946
  type: "0x1::type_name::TypeName",
@@ -1736,7 +1996,7 @@ var getObligations = async (query, ownerAddress) => {
1736
1996
  let hasNextPage = false;
1737
1997
  let nextCursor = null;
1738
1998
  do {
1739
- const paginatedKeyObjectsResponse = await query.suiKit.client().getOwnedObjects({
1999
+ const paginatedKeyObjectsResponse = await query.cache.queryGetOwnedObjects({
1740
2000
  owner,
1741
2001
  filter: {
1742
2002
  StructType: `${protocolObjectId}::obligation::ObligationKey`
@@ -1752,7 +2012,7 @@ var getObligations = async (query, ownerAddress) => {
1752
2012
  }
1753
2013
  } while (hasNextPage);
1754
2014
  const keyObjectIds = keyObjectsResponse.map((ref) => ref?.data?.objectId).filter((id) => id !== void 0);
1755
- const keyObjects = await query.suiKit.getObjects(keyObjectIds);
2015
+ const keyObjects = await query.cache.queryGetObjects(keyObjectIds);
1756
2016
  const obligations = [];
1757
2017
  for (const keyObject of keyObjects) {
1758
2018
  const keyId = keyObject.objectId;
@@ -1766,12 +2026,10 @@ var getObligations = async (query, ownerAddress) => {
1766
2026
  return obligations;
1767
2027
  };
1768
2028
  var getObligationLocked = async (query, obligationId) => {
1769
- const obligationObjectResponse = await query.suiKit.client().getObject({
1770
- id: obligationId,
1771
- options: {
1772
- showContent: true
1773
- }
1774
- });
2029
+ const obligationObjectResponse = await query.cache.queryGetObject(
2030
+ obligationId,
2031
+ { showContent: true }
2032
+ );
1775
2033
  let obligationLocked = false;
1776
2034
  if (obligationObjectResponse.data && obligationObjectResponse?.data?.content?.dataType === "moveObject" && "lock_key" in obligationObjectResponse.data.content.fields) {
1777
2035
  obligationLocked = Boolean(
@@ -1783,186 +2041,64 @@ var getObligationLocked = async (query, obligationId) => {
1783
2041
  var queryObligation = async (query, obligationId) => {
1784
2042
  const packageId = query.address.get("core.packages.query.id");
1785
2043
  const queryTarget = `${packageId}::obligation_query::obligation_data`;
1786
- const txBlock = new SuiKitTxBlock();
1787
- txBlock.moveCall(queryTarget, [obligationId]);
1788
- const queryResult = await query.suiKit.inspectTxn(txBlock);
2044
+ const args = [obligationId];
2045
+ const queryResult = await query.cache.queryInspectTxn(
2046
+ { queryTarget, args }
2047
+ // txBlock
2048
+ );
1789
2049
  return queryResult.events[0].parsedJson;
1790
2050
  };
1791
2051
  var getCoinAmounts = async (query, assetCoinNames, ownerAddress) => {
1792
2052
  assetCoinNames = assetCoinNames || [...SUPPORT_POOLS];
1793
2053
  const owner = ownerAddress || query.suiKit.currentAddress();
1794
- const coinObjectsResponse = [];
1795
- let hasNextPage = false;
1796
- let nextCursor = null;
1797
- do {
1798
- const paginatedCoinObjectsResponse = await query.suiKit.client().getOwnedObjects({
1799
- owner,
1800
- filter: {
1801
- MatchAny: assetCoinNames.map((assetCoinName) => {
1802
- const coinType = query.utils.parseCoinType(assetCoinName);
1803
- return { StructType: `0x2::coin::Coin<${coinType}>` };
1804
- })
1805
- },
1806
- options: {
1807
- showType: true,
1808
- showContent: true
1809
- },
1810
- cursor: nextCursor
1811
- });
1812
- coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);
1813
- if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {
1814
- hasNextPage = true;
1815
- nextCursor = paginatedCoinObjectsResponse.nextCursor;
1816
- } else {
1817
- hasNextPage = false;
1818
- }
1819
- } while (hasNextPage);
1820
- const coinAmounts = {};
1821
- const coinObjects = coinObjectsResponse.map((response) => {
1822
- return response.data;
1823
- }).filter(
1824
- (object) => object !== void 0 && object !== null
2054
+ const assetCoins2 = {};
2055
+ await Promise.allSettled(
2056
+ assetCoinNames.map(async (assetCoinName) => {
2057
+ const marketCoin = await getCoinAmount(query, assetCoinName, owner);
2058
+ assetCoins2[assetCoinName] = marketCoin;
2059
+ })
1825
2060
  );
1826
- for (const coinObject of coinObjects) {
1827
- const type = coinObject.type;
1828
- if (coinObject.content && "fields" in coinObject.content) {
1829
- const fields = coinObject.content.fields;
1830
- const poolCoinName = query.utils.parseCoinNameFromType(type);
1831
- if (poolCoinName) {
1832
- coinAmounts[poolCoinName] = BigNumber2(coinAmounts[poolCoinName] ?? 0).plus(fields.balance).toNumber();
1833
- }
1834
- }
1835
- }
1836
- return coinAmounts;
2061
+ return assetCoins2;
1837
2062
  };
1838
2063
  var getCoinAmount = async (query, assetCoinName, ownerAddress) => {
1839
2064
  const owner = ownerAddress || query.suiKit.currentAddress();
1840
2065
  const coinType = query.utils.parseCoinType(assetCoinName);
1841
- const coinObjectsResponse = [];
1842
- let hasNextPage = false;
1843
- let nextCursor = null;
1844
- do {
1845
- const paginatedCoinObjectsResponse = await query.suiKit.client().getOwnedObjects({
1846
- owner,
1847
- filter: { StructType: `0x2::coin::Coin<${coinType}>` },
1848
- options: {
1849
- showContent: true
1850
- },
1851
- cursor: nextCursor
1852
- });
1853
- coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);
1854
- if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {
1855
- hasNextPage = true;
1856
- nextCursor = paginatedCoinObjectsResponse.nextCursor;
1857
- } else {
1858
- hasNextPage = false;
1859
- }
1860
- } while (hasNextPage);
1861
- let coinAmount = 0;
1862
- const coinObjects = coinObjectsResponse.map((response) => {
1863
- return response.data;
1864
- }).filter(
1865
- (object) => object !== void 0 && object !== null
1866
- );
1867
- for (const coinObject of coinObjects) {
1868
- if (coinObject.content && "fields" in coinObject.content) {
1869
- const fields = coinObject.content.fields;
1870
- coinAmount = BigNumber2(coinAmount).plus(fields.balance).toNumber();
1871
- }
1872
- }
1873
- return coinAmount;
2066
+ const amount = await query.cache.queryGetCoinBalance({
2067
+ owner,
2068
+ coinType
2069
+ });
2070
+ return BigNumber2(amount).toNumber();
1874
2071
  };
1875
2072
  var getMarketCoinAmounts = async (query, marketCoinNames, ownerAddress) => {
1876
2073
  marketCoinNames = marketCoinNames || [...SUPPORT_POOLS].map(
1877
2074
  (poolCoinName) => query.utils.parseMarketCoinName(poolCoinName)
1878
2075
  );
1879
2076
  const owner = ownerAddress || query.suiKit.currentAddress();
1880
- const marketCoinObjectsResponse = [];
1881
- let hasNextPage = false;
1882
- let nextCursor = null;
1883
- do {
1884
- const paginatedMarketCoinObjectsResponse = await query.suiKit.client().getOwnedObjects({
1885
- owner,
1886
- filter: {
1887
- MatchAny: marketCoinNames.map((marketCoinName) => {
1888
- const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);
1889
- return { StructType: `0x2::coin::Coin<${marketCoinType}>` };
1890
- })
1891
- },
1892
- options: {
1893
- showType: true,
1894
- showContent: true
1895
- },
1896
- cursor: nextCursor
1897
- });
1898
- marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);
1899
- if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {
1900
- hasNextPage = true;
1901
- nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;
1902
- } else {
1903
- hasNextPage = false;
1904
- }
1905
- } while (hasNextPage);
1906
- const marketCoinAmounts = {};
1907
- const marketCoinObjects = marketCoinObjectsResponse.map((response) => {
1908
- return response.data;
1909
- }).filter(
1910
- (object) => object !== void 0 && object !== null
2077
+ const marketCoins2 = {};
2078
+ Promise.allSettled(
2079
+ marketCoinNames.map(async (marketCoinName) => {
2080
+ const marketCoin = await getMarketCoinAmount(
2081
+ query,
2082
+ marketCoinName,
2083
+ owner
2084
+ );
2085
+ marketCoins2[marketCoinName] = marketCoin;
2086
+ })
1911
2087
  );
1912
- for (const marketCoinObject of marketCoinObjects) {
1913
- const marketCoinType = marketCoinObject.type;
1914
- if (marketCoinObject.content && "fields" in marketCoinObject.content) {
1915
- const fields = marketCoinObject.content.fields;
1916
- const marketCoinName = query.utils.parseCoinNameFromType(marketCoinType);
1917
- if (marketCoinName) {
1918
- marketCoinAmounts[marketCoinName] = BigNumber2(
1919
- marketCoinAmounts[marketCoinName] ?? 0
1920
- ).plus(fields.balance).toNumber();
1921
- }
1922
- }
1923
- }
1924
- return marketCoinAmounts;
2088
+ return marketCoins2;
1925
2089
  };
1926
2090
  var getMarketCoinAmount = async (query, marketCoinName, ownerAddress) => {
1927
2091
  const owner = ownerAddress || query.suiKit.currentAddress();
1928
2092
  const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);
1929
- const marketCoinObjectsResponse = [];
1930
- let hasNextPage = false;
1931
- let nextCursor = null;
1932
- do {
1933
- const paginatedMarketCoinObjectsResponse = await query.suiKit.client().getOwnedObjects({
1934
- owner,
1935
- filter: { StructType: `0x2::coin::Coin<${marketCoinType}>` },
1936
- options: {
1937
- showContent: true
1938
- },
1939
- cursor: nextCursor
1940
- });
1941
- marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);
1942
- if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {
1943
- hasNextPage = true;
1944
- nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;
1945
- } else {
1946
- hasNextPage = false;
1947
- }
1948
- } while (hasNextPage);
1949
- let marketCoinAmount = 0;
1950
- const marketCoinObjects = marketCoinObjectsResponse.map((response) => {
1951
- return response.data;
1952
- }).filter(
1953
- (object) => object !== void 0 && object !== null
1954
- );
1955
- for (const marketCoinObject of marketCoinObjects) {
1956
- if (marketCoinObject.content && "fields" in marketCoinObject.content) {
1957
- const fields = marketCoinObject.content.fields;
1958
- marketCoinAmount = BigNumber2(marketCoinAmount).plus(fields.balance).toNumber();
1959
- }
1960
- }
1961
- return marketCoinAmount;
2093
+ const amount = await query.cache.queryGetCoinBalance({
2094
+ owner,
2095
+ coinType: marketCoinType
2096
+ });
2097
+ return BigNumber2(amount).toNumber();
1962
2098
  };
1963
2099
 
1964
2100
  // src/queries/spoolQuery.ts
1965
- import { normalizeStructTag as normalizeStructTag3 } from "@mysten/sui.js/utils";
2101
+ import { normalizeStructTag as normalizeStructTag4 } from "@mysten/sui.js/utils";
1966
2102
  var getSpools = async (query, stakeMarketCoinNames, indexer = false) => {
1967
2103
  stakeMarketCoinNames = stakeMarketCoinNames || [...SUPPORT_SPOOLS];
1968
2104
  const stakeCoinNames = stakeMarketCoinNames.map(
@@ -2028,17 +2164,17 @@ var getSpool = async (query, marketCoinName, indexer = false, marketPool, coinPr
2028
2164
  spoolIndexer.rewardCoinPrice = coinPrices?.[rewardCoinName] || spoolIndexer.rewardCoinPrice;
2029
2165
  return spoolIndexer;
2030
2166
  }
2031
- const spoolObjectResponse = await query.suiKit.client().multiGetObjects({
2032
- ids: [poolId, rewardPoolId],
2033
- options: {
2167
+ const spoolObjectResponse = await query.cache.queryGetObjects(
2168
+ [poolId, rewardPoolId],
2169
+ {
2034
2170
  showContent: true
2035
2171
  }
2036
- });
2037
- if (marketPool && spoolObjectResponse[0].data && spoolObjectResponse[1].data) {
2172
+ );
2173
+ if (marketPool && spoolObjectResponse[0] && spoolObjectResponse[1]) {
2038
2174
  const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);
2039
2175
  coinPrices = coinPrices || await query.utils.getCoinPrices([coinName, rewardCoinName]);
2040
- const spoolObject = spoolObjectResponse[0].data;
2041
- const rewardPoolObject = spoolObjectResponse[1].data;
2176
+ const spoolObject = spoolObjectResponse[0];
2177
+ const rewardPoolObject = spoolObjectResponse[1];
2042
2178
  if (spoolObject.content && "fields" in spoolObject.content) {
2043
2179
  const spoolFields = spoolObject.content.fields;
2044
2180
  const parsedSpoolData = parseOriginSpoolData({
@@ -2110,7 +2246,7 @@ var getStakeAccounts = async (query, ownerAddress) => {
2110
2246
  let hasNextPage = false;
2111
2247
  let nextCursor = null;
2112
2248
  do {
2113
- const paginatedStakeObjectsResponse = await query.suiKit.client().getOwnedObjects({
2249
+ const paginatedStakeObjectsResponse = await query.cache.queryGetOwnedObjects({
2114
2250
  owner,
2115
2251
  filter: { StructType: stakeAccountType },
2116
2252
  options: {
@@ -2148,7 +2284,7 @@ var getStakeAccounts = async (query, ownerAddress) => {
2148
2284
  {}
2149
2285
  );
2150
2286
  const stakeObjectIds = stakeObjectsResponse.map((ref) => ref?.data?.objectId).filter((id) => id !== void 0);
2151
- const stakeObjects = await query.suiKit.getObjects(stakeObjectIds);
2287
+ const stakeObjects = await query.cache.queryGetObjects(stakeObjectIds);
2152
2288
  for (const stakeObject of stakeObjects) {
2153
2289
  const id = stakeObject.objectId;
2154
2290
  const type = stakeObject.type;
@@ -2160,89 +2296,89 @@ var getStakeAccounts = async (query, ownerAddress) => {
2160
2296
  const index = Number(fields.index);
2161
2297
  const points = Number(fields.points);
2162
2298
  const totalPoints = Number(fields.total_points);
2163
- if (normalizeStructTag3(type) === stakeMarketCoinTypes.seth) {
2299
+ if (normalizeStructTag4(type) === stakeMarketCoinTypes.seth) {
2164
2300
  stakeAccounts.seth.push({
2165
2301
  id,
2166
- type: normalizeStructTag3(type),
2302
+ type: normalizeStructTag4(type),
2167
2303
  stakePoolId,
2168
- stakeType: normalizeStructTag3(stakeType),
2304
+ stakeType: normalizeStructTag4(stakeType),
2169
2305
  staked,
2170
2306
  index,
2171
2307
  points,
2172
2308
  totalPoints
2173
2309
  });
2174
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.ssui) {
2310
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.ssui) {
2175
2311
  stakeAccounts.ssui.push({
2176
2312
  id,
2177
- type: normalizeStructTag3(type),
2313
+ type: normalizeStructTag4(type),
2178
2314
  stakePoolId,
2179
- stakeType: normalizeStructTag3(stakeType),
2315
+ stakeType: normalizeStructTag4(stakeType),
2180
2316
  staked,
2181
2317
  index,
2182
2318
  points,
2183
2319
  totalPoints
2184
2320
  });
2185
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.susdc) {
2321
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.susdc) {
2186
2322
  stakeAccounts.susdc.push({
2187
2323
  id,
2188
- type: normalizeStructTag3(type),
2324
+ type: normalizeStructTag4(type),
2189
2325
  stakePoolId,
2190
- stakeType: normalizeStructTag3(stakeType),
2326
+ stakeType: normalizeStructTag4(stakeType),
2191
2327
  staked,
2192
2328
  index,
2193
2329
  points,
2194
2330
  totalPoints
2195
2331
  });
2196
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.susdt) {
2332
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.susdt) {
2197
2333
  stakeAccounts.susdt.push({
2198
2334
  id,
2199
- type: normalizeStructTag3(type),
2335
+ type: normalizeStructTag4(type),
2200
2336
  stakePoolId,
2201
- stakeType: normalizeStructTag3(stakeType),
2337
+ stakeType: normalizeStructTag4(stakeType),
2202
2338
  staked,
2203
2339
  index,
2204
2340
  points,
2205
2341
  totalPoints
2206
2342
  });
2207
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.scetus) {
2343
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.scetus) {
2208
2344
  stakeAccounts.scetus.push({
2209
2345
  id,
2210
- type: normalizeStructTag3(type),
2346
+ type: normalizeStructTag4(type),
2211
2347
  stakePoolId,
2212
- stakeType: normalizeStructTag3(stakeType),
2348
+ stakeType: normalizeStructTag4(stakeType),
2213
2349
  staked,
2214
2350
  index,
2215
2351
  points,
2216
2352
  totalPoints
2217
2353
  });
2218
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.safsui) {
2354
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.safsui) {
2219
2355
  stakeAccounts.safsui.push({
2220
2356
  id,
2221
- type: normalizeStructTag3(type),
2357
+ type: normalizeStructTag4(type),
2222
2358
  stakePoolId,
2223
- stakeType: normalizeStructTag3(stakeType),
2359
+ stakeType: normalizeStructTag4(stakeType),
2224
2360
  staked,
2225
2361
  index,
2226
2362
  points,
2227
2363
  totalPoints
2228
2364
  });
2229
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.shasui) {
2365
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.shasui) {
2230
2366
  stakeAccounts.shasui.push({
2231
2367
  id,
2232
- type: normalizeStructTag3(type),
2368
+ type: normalizeStructTag4(type),
2233
2369
  stakePoolId,
2234
- stakeType: normalizeStructTag3(stakeType),
2370
+ stakeType: normalizeStructTag4(stakeType),
2235
2371
  staked,
2236
2372
  index,
2237
2373
  points,
2238
2374
  totalPoints
2239
2375
  });
2240
- } else if (normalizeStructTag3(type) === stakeMarketCoinTypes.svsui) {
2376
+ } else if (normalizeStructTag4(type) === stakeMarketCoinTypes.svsui) {
2241
2377
  stakeAccounts.svsui.push({
2242
2378
  id,
2243
- type: normalizeStructTag3(type),
2379
+ type: normalizeStructTag4(type),
2244
2380
  stakePoolId,
2245
- stakeType: normalizeStructTag3(stakeType),
2381
+ stakeType: normalizeStructTag4(stakeType),
2246
2382
  staked,
2247
2383
  index,
2248
2384
  points,
@@ -2256,12 +2392,9 @@ var getStakeAccounts = async (query, ownerAddress) => {
2256
2392
  var getStakePool = async (query, marketCoinName) => {
2257
2393
  const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);
2258
2394
  let stakePool = void 0;
2259
- const stakePoolObjectResponse = await query.suiKit.client().getObject({
2260
- id: poolId,
2261
- options: {
2262
- showContent: true,
2263
- showType: true
2264
- }
2395
+ const stakePoolObjectResponse = await query.cache.queryGetObject(poolId, {
2396
+ showContent: true,
2397
+ showType: true
2265
2398
  });
2266
2399
  if (stakePoolObjectResponse.data) {
2267
2400
  const stakePoolObject = stakePoolObjectResponse.data;
@@ -2281,13 +2414,13 @@ var getStakePool = async (query, marketCoinName) => {
2281
2414
  const lastUpdate = Number(fields.last_update);
2282
2415
  stakePool = {
2283
2416
  id,
2284
- type: normalizeStructTag3(type),
2417
+ type: normalizeStructTag4(type),
2285
2418
  maxPoint,
2286
2419
  distributedPoint,
2287
2420
  pointPerPeriod,
2288
2421
  period,
2289
2422
  maxStake,
2290
- stakeType: normalizeStructTag3(stakeType),
2423
+ stakeType: normalizeStructTag4(stakeType),
2291
2424
  totalStaked,
2292
2425
  index,
2293
2426
  createdAt,
@@ -2302,13 +2435,13 @@ var getStakeRewardPool = async (query, marketCoinName) => {
2302
2435
  `spool.pools.${marketCoinName}.rewardPoolId`
2303
2436
  );
2304
2437
  let stakeRewardPool = void 0;
2305
- const stakeRewardPoolObjectResponse = await query.suiKit.client().getObject({
2306
- id: poolId,
2307
- options: {
2438
+ const stakeRewardPoolObjectResponse = await query.cache.queryGetObject(
2439
+ poolId,
2440
+ {
2308
2441
  showContent: true,
2309
2442
  showType: true
2310
2443
  }
2311
- });
2444
+ );
2312
2445
  if (stakeRewardPoolObjectResponse.data) {
2313
2446
  const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;
2314
2447
  const id = stakeRewardPoolObject.objectId;
@@ -2324,7 +2457,7 @@ var getStakeRewardPool = async (query, marketCoinName) => {
2324
2457
  const claimedRewards = Number(rewardPoolFields.claimed_rewards);
2325
2458
  stakeRewardPool = {
2326
2459
  id,
2327
- type: normalizeStructTag3(type),
2460
+ type: normalizeStructTag4(type),
2328
2461
  stakePoolId,
2329
2462
  ratioNumerator,
2330
2463
  ratioDenominator,
@@ -2337,18 +2470,16 @@ var getStakeRewardPool = async (query, marketCoinName) => {
2337
2470
  };
2338
2471
 
2339
2472
  // src/queries/borrowIncentiveQuery.ts
2340
- import { normalizeStructTag as normalizeStructTag4 } from "@mysten/sui.js/utils";
2341
- import { SuiTxBlock as SuiKitTxBlock2 } from "@scallop-io/sui-kit";
2473
+ import { normalizeStructTag as normalizeStructTag5 } from "@mysten/sui.js/utils";
2342
2474
  var queryBorrowIncentivePools = async (query, borrowIncentiveCoinNames, indexer = false) => {
2343
2475
  borrowIncentiveCoinNames = borrowIncentiveCoinNames || [
2344
2476
  ...SUPPORT_BORROW_INCENTIVE_POOLS
2345
2477
  ];
2346
2478
  const queryPkgId = query.address.get("borrowIncentive.query");
2347
2479
  const incentivePoolsId = query.address.get("borrowIncentive.incentivePools");
2348
- const txBlock = new SuiKitTxBlock2();
2349
2480
  const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data`;
2350
- txBlock.moveCall(queryTarget, [incentivePoolsId]);
2351
- const queryResult = await query.suiKit.inspectTxn(txBlock);
2481
+ const args = [incentivePoolsId];
2482
+ const queryResult = await query.cache.queryInspectTxn({ queryTarget, args });
2352
2483
  const borrowIncentivePoolsQueryData = queryResult.events[0].parsedJson;
2353
2484
  const borrowIncentivePools = {};
2354
2485
  if (indexer) {
@@ -2364,7 +2495,7 @@ var queryBorrowIncentivePools = async (query, borrowIncentiveCoinNames, indexer
2364
2495
  ])
2365
2496
  ]
2366
2497
  );
2367
- const poolCoinType = normalizeStructTag4(pool.pool_type.name);
2498
+ const poolCoinType = normalizeStructTag5(pool.pool_type.name);
2368
2499
  const poolCoinName = query.utils.parseCoinNameFromType(
2369
2500
  poolCoinType
2370
2501
  );
@@ -2376,7 +2507,7 @@ var queryBorrowIncentivePools = async (query, borrowIncentiveCoinNames, indexer
2376
2507
  for (const [coinName, poolPoint] of Object.entries(
2377
2508
  parsedBorrowIncentivePoolData.poolPoints
2378
2509
  )) {
2379
- const rewardCoinType = normalizeStructTag4(poolPoint.pointType);
2510
+ const rewardCoinType = normalizeStructTag5(poolPoint.pointType);
2380
2511
  const rewardCoinName = query.utils.parseCoinNameFromType(
2381
2512
  rewardCoinType
2382
2513
  );
@@ -2425,9 +2556,8 @@ var queryBorrowIncentiveAccounts = async (query, obligationId, borrowIncentiveCo
2425
2556
  "borrowIncentive.incentiveAccounts"
2426
2557
  );
2427
2558
  const queryTarget = `${queryPkgId}::incentive_account_query::incentive_account_data`;
2428
- const txBlock = new SuiKitTxBlock2();
2429
- txBlock.moveCall(queryTarget, [incentiveAccountsId, obligationId]);
2430
- const queryResult = await query.suiKit.inspectTxn(txBlock);
2559
+ const args = [incentiveAccountsId, obligationId];
2560
+ const queryResult = await query.cache.queryInspectTxn({ queryTarget, args });
2431
2561
  const borrowIncentiveAccountsQueryData = queryResult.events[0].parsedJson;
2432
2562
  const borrowIncentiveAccounts = Object.values(
2433
2563
  borrowIncentiveAccountsQueryData.pool_records
@@ -2445,7 +2575,7 @@ var queryBorrowIncentiveAccounts = async (query, obligationId, borrowIncentiveCo
2445
2575
  var getBindedObligationId = async (query, veScaKeyId) => {
2446
2576
  const borrowIncentiveObjectId = query.address.get("borrowIncentive.object");
2447
2577
  const incentivePoolsId = query.address.get("borrowIncentive.incentivePools");
2448
- const veScaPkgId = IS_VE_SCA_TEST ? "0xb220d034bdf335d77ae5bfbf6daf059c2cc7a1f719b12bfed75d1736fac038c8" : query.address.get("vesca.id");
2578
+ const veScaObjId = query.address.get("vesca.object");
2449
2579
  const client = query.suiKit.client();
2450
2580
  const incentivePoolsResponse = await client.getObject({
2451
2581
  id: incentivePoolsId,
@@ -2457,7 +2587,7 @@ var getBindedObligationId = async (query, veScaKeyId) => {
2457
2587
  return null;
2458
2588
  const incentivePoolFields = incentivePoolsResponse.data.content.fields;
2459
2589
  const veScaBindTableId = incentivePoolFields.ve_sca_bind.fields.id.id;
2460
- const keyType = `${borrowIncentiveObjectId}::typed_id::TypedID<${veScaPkgId}::ve_sca::VeScaKey>`;
2590
+ const keyType = `${borrowIncentiveObjectId}::typed_id::TypedID<${veScaObjId}::ve_sca::VeScaKey>`;
2461
2591
  const veScaBindTableResponse = await client.getDynamicFieldObject({
2462
2592
  parentId: veScaBindTableId,
2463
2593
  name: {
@@ -2501,18 +2631,13 @@ var getBindedVeScaKey = async (query, obliationId) => {
2501
2631
  };
2502
2632
 
2503
2633
  // src/queries/priceQuery.ts
2504
- var getPythPrice = async (query, assetCoinName) => {
2634
+ var getPythPrice = async (query, assetCoinName, priceFeedObject) => {
2505
2635
  const pythFeedObjectId = query.address.get(
2506
2636
  `core.coins.${assetCoinName}.oracle.pyth.feedObject`
2507
2637
  );
2508
- const priceFeedObjectResponse = await query.suiKit.client().getObject({
2509
- id: pythFeedObjectId,
2510
- options: {
2511
- showContent: true
2512
- }
2513
- });
2514
- if (priceFeedObjectResponse.data) {
2515
- const priceFeedPoolObject = priceFeedObjectResponse.data;
2638
+ priceFeedObject = priceFeedObject || (await query.cache.queryGetObject(pythFeedObjectId, { showContent: true })).data;
2639
+ if (priceFeedObject) {
2640
+ const priceFeedPoolObject = priceFeedObject;
2516
2641
  if (priceFeedPoolObject.content && "fields" in priceFeedPoolObject.content) {
2517
2642
  const fields = priceFeedPoolObject.content.fields;
2518
2643
  const expoMagnitude = Number(
@@ -2532,6 +2657,36 @@ var getPythPrice = async (query, assetCoinName) => {
2532
2657
  }
2533
2658
  return 0;
2534
2659
  };
2660
+ var getPythPrices = async (query, assetCoinNames) => {
2661
+ const seen = {};
2662
+ const pythFeedObjectIds = assetCoinNames.map((assetCoinName) => {
2663
+ const pythFeedObjectId = query.address.get(
2664
+ `core.coins.${assetCoinName}.oracle.pyth.feedObject`
2665
+ );
2666
+ if (seen[pythFeedObjectId])
2667
+ return null;
2668
+ seen[pythFeedObjectId] = true;
2669
+ return pythFeedObjectId;
2670
+ }).filter((item) => !!item);
2671
+ const priceFeedObjects = await query.cache.queryGetObjects(
2672
+ pythFeedObjectIds,
2673
+ {
2674
+ showContent: true
2675
+ }
2676
+ );
2677
+ return (await Promise.all(
2678
+ priceFeedObjects.map(async (priceFeedObject, idx) => ({
2679
+ coinName: assetCoinNames[idx],
2680
+ price: await getPythPrice(query, assetCoinNames[idx], priceFeedObject)
2681
+ }))
2682
+ )).reduce(
2683
+ (prev, curr) => {
2684
+ prev[curr.coinName] = curr.price;
2685
+ return prev;
2686
+ },
2687
+ {}
2688
+ );
2689
+ };
2535
2690
 
2536
2691
  // src/queries/portfolioQuery.ts
2537
2692
  import BigNumber3 from "bignumber.js";
@@ -3033,10 +3188,12 @@ var getTotalValueLocked = async (query, indexer = false) => {
3033
3188
 
3034
3189
  // src/queries/vescaQuery.ts
3035
3190
  import BigNumber4 from "bignumber.js";
3191
+ import { SUI_CLOCK_OBJECT_ID, SuiTxBlock as SuiTxBlock2 } from "@scallop-io/sui-kit";
3192
+ import { bcs } from "@mysten/sui.js/bcs";
3036
3193
  var getVescaKeys = async (query, ownerAddress) => {
3037
3194
  const owner = ownerAddress || query.suiKit.currentAddress();
3038
- const veScaPkgId = IS_VE_SCA_TEST ? "0xb220d034bdf335d77ae5bfbf6daf059c2cc7a1f719b12bfed75d1736fac038c8" : query.address.get("vesca.id");
3039
- const veScaKeyType = `${veScaPkgId}::ve_sca::VeScaKey`;
3195
+ const veScaObjId = query.address.get("vesca.object");
3196
+ const veScaKeyType = `${veScaObjId}::ve_sca::VeScaKey`;
3040
3197
  const keyObjectsResponse = [];
3041
3198
  let hasNextPage = false;
3042
3199
  let nextCursor = null;
@@ -3062,19 +3219,21 @@ var getVescaKeys = async (query, ownerAddress) => {
3062
3219
  var getVeScas = async (query, ownerAddress) => {
3063
3220
  const keyObjectDatas = await getVescaKeys(query, ownerAddress);
3064
3221
  const keyObjectId = keyObjectDatas.map((data) => data.objectId);
3065
- const veScas = [];
3066
- for (const keyId of keyObjectId) {
3222
+ const veScas = Array(keyObjectId.length).fill(null);
3223
+ const tasks = keyObjectId.map(async (keyId, idx) => {
3067
3224
  const veSca = await getVeSca(query, keyId);
3068
- if (veSca)
3069
- veScas.push(veSca);
3070
- }
3071
- return veScas;
3225
+ if (veSca) {
3226
+ veScas[idx] = veSca;
3227
+ }
3228
+ });
3229
+ await Promise.allSettled(tasks);
3230
+ return veScas.filter(Boolean).sort((a, b) => a.currentVeScaBalance - b.currentVeScaBalance);
3072
3231
  };
3073
3232
  var getVeSca = async (query, veScaKeyId, ownerAddress) => {
3074
- const tableId = IS_VE_SCA_TEST ? "0xc607241e4a679fe376d1170b2fbe07b64917bfe69100d4825241cda20039d4bd" : query.address.get(`vesca.tableId`);
3233
+ const tableId = query.address.get(`vesca.tableId`);
3075
3234
  veScaKeyId = veScaKeyId || (await getVescaKeys(query, ownerAddress))[0].objectId;
3076
3235
  let vesca = void 0;
3077
- const veScaDynamicFieldObjectResponse = await query.suiKit.client().getDynamicFieldObject({
3236
+ const veScaDynamicFieldObjectResponse = await query.cache.queryGetDynamicFieldObject({
3078
3237
  parentId: tableId,
3079
3238
  name: {
3080
3239
  type: "0x2::object::ID",
@@ -3102,11 +3261,79 @@ var getVeSca = async (query, veScaKeyId, ownerAddress) => {
3102
3261
  }
3103
3262
  return vesca;
3104
3263
  };
3264
+ var getTotalVeScaTreasuryAmount = async (query) => {
3265
+ const veScaPkgId = query.address.get("vesca.id");
3266
+ const veScaConfig = query.address.get("vesca.config");
3267
+ const veScaTreasury = query.address.get("vesca.treasury");
3268
+ const refreshQueryTarget = `${veScaPkgId}::treasury::refresh`;
3269
+ const refreshArgs = [veScaConfig, veScaTreasury, SUI_CLOCK_OBJECT_ID];
3270
+ const veScaAmountQueryTarget = `${veScaPkgId}::treasury::total_ve_sca_amount`;
3271
+ const veScaAmountArgs = [veScaTreasury, SUI_CLOCK_OBJECT_ID];
3272
+ const resolvedRefreshArgs = await Promise.all(
3273
+ refreshArgs.map(async (arg) => {
3274
+ if (typeof arg === "string") {
3275
+ return (await query.cache.queryGetObject(arg, { showContent: true })).data;
3276
+ }
3277
+ return arg;
3278
+ })
3279
+ );
3280
+ const resolvedVeScaAmountArgs = await Promise.all(
3281
+ veScaAmountArgs.map(async (arg) => {
3282
+ if (typeof arg === "string") {
3283
+ return (await query.cache.queryGetObject(arg, { showContent: true })).data;
3284
+ }
3285
+ return arg;
3286
+ })
3287
+ );
3288
+ const txb = new SuiTxBlock2();
3289
+ txb.moveCall(refreshQueryTarget, resolvedRefreshArgs);
3290
+ txb.moveCall(veScaAmountQueryTarget, resolvedVeScaAmountArgs);
3291
+ const txBytes = await txb.txBlock.build({
3292
+ client: query.suiKit.client(),
3293
+ onlyTransactionKind: true,
3294
+ protocolConfig: await query.cache.getProtocolConfig()
3295
+ });
3296
+ const res = await query.cache.queryClient.fetchQuery({
3297
+ queryKey: [
3298
+ "getTotalVeScaTreasuryAmount",
3299
+ JSON.stringify([...refreshArgs, ...veScaAmountArgs])
3300
+ ],
3301
+ queryFn: async () => {
3302
+ return await query.suiKit.inspectTxn(txBytes);
3303
+ },
3304
+ staleTime: 8e3
3305
+ });
3306
+ const results = res.results;
3307
+ if (results && results[1].returnValues) {
3308
+ const value = Uint8Array.from(results[1].returnValues[0][0]);
3309
+ const type = results[1].returnValues[0][1];
3310
+ return bcs.de(type, value);
3311
+ }
3312
+ return "0";
3313
+ };
3314
+
3315
+ // src/queries/referralQuery.ts
3316
+ var queryVeScaKeyIdFromReferralBindings = async (query, refereeAddress) => {
3317
+ const referralBindingTableId = query.address.get("referral.bindingTableId");
3318
+ const referralBindResponse = await query.cache.queryGetDynamicFieldObject({
3319
+ parentId: referralBindingTableId,
3320
+ name: {
3321
+ type: "address",
3322
+ value: refereeAddress
3323
+ }
3324
+ });
3325
+ if (referralBindResponse.data?.content?.dataType !== "moveObject")
3326
+ return null;
3327
+ const fields = referralBindResponse.data.content.fields;
3328
+ return fields.value;
3329
+ };
3105
3330
 
3106
3331
  // src/models/scallopIndexer.ts
3107
3332
  import axios2 from "axios";
3108
3333
  var ScallopIndexer = class {
3109
- constructor() {
3334
+ constructor(params, instance) {
3335
+ this.params = params;
3336
+ this._cache = instance?.cache ?? new ScallopCache();
3110
3337
  this._requestClient = axios2.create({
3111
3338
  baseURL: SDK_API_BASE_URL,
3112
3339
  headers: {
@@ -3122,7 +3349,12 @@ var ScallopIndexer = class {
3122
3349
  * @return Market data.
3123
3350
  */
3124
3351
  async getMarket() {
3125
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market`);
3352
+ const response = await this._cache.queryClient.fetchQuery({
3353
+ queryKey: ["market"],
3354
+ queryFn: async () => {
3355
+ return await this._requestClient.get(`/api/market`);
3356
+ }
3357
+ });
3126
3358
  if (response.status === 200) {
3127
3359
  return {
3128
3360
  pools: response.data.pools.reduce((marketPools, marketPool) => {
@@ -3147,15 +3379,8 @@ var ScallopIndexer = class {
3147
3379
  * @return Market pools data.
3148
3380
  */
3149
3381
  async getMarketPools() {
3150
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market/pools`);
3151
- if (response.status === 200) {
3152
- return response.data.pools.reduce((marketPools, marketPool) => {
3153
- marketPools[marketPool.coinName] = marketPool;
3154
- return marketPools;
3155
- }, {});
3156
- } else {
3157
- throw Error("Failed to getMarketPools.");
3158
- }
3382
+ const response = (await this.getMarket()).pools;
3383
+ return response;
3159
3384
  }
3160
3385
  /**
3161
3386
  * Get market pool index data.
@@ -3163,12 +3388,7 @@ var ScallopIndexer = class {
3163
3388
  * @return Market pool data.
3164
3389
  */
3165
3390
  async getMarketPool(poolCoinName) {
3166
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market/pool/${poolCoinName}`);
3167
- if (response.status === 200) {
3168
- return response.data.pool;
3169
- } else {
3170
- throw Error("Failed to getMarketPool.");
3171
- }
3391
+ return (await this.getMarketPools())[poolCoinName];
3172
3392
  }
3173
3393
  /**
3174
3394
  * Get market collaterals index data.
@@ -3176,18 +3396,7 @@ var ScallopIndexer = class {
3176
3396
  * @return Market collaterals data.
3177
3397
  */
3178
3398
  async getMarketCollaterals() {
3179
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market/collaterals`);
3180
- if (response.status === 200) {
3181
- return response.data.collaterals.reduce(
3182
- (marketCollaterals, marketCollateral) => {
3183
- marketCollaterals[marketCollateral.coinName] = marketCollateral;
3184
- return marketCollaterals;
3185
- },
3186
- {}
3187
- );
3188
- } else {
3189
- throw Error("Failed to getMarketCollaterals.");
3190
- }
3399
+ return (await this.getMarket()).collaterals;
3191
3400
  }
3192
3401
  /**
3193
3402
  * Get market collateral index data.
@@ -3195,12 +3404,7 @@ var ScallopIndexer = class {
3195
3404
  * @return Market collateral data.
3196
3405
  */
3197
3406
  async getMarketCollateral(collateralCoinName) {
3198
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market/collateral/${collateralCoinName}`);
3199
- if (response.status === 200) {
3200
- return response.data.collateral;
3201
- } else {
3202
- throw Error("Failed to getMarketCollateral.");
3203
- }
3407
+ return (await this.getMarketCollaterals())[collateralCoinName];
3204
3408
  }
3205
3409
  /**
3206
3410
  * Get spools index data.
@@ -3208,7 +3412,12 @@ var ScallopIndexer = class {
3208
3412
  * @return Spools data.
3209
3413
  */
3210
3414
  async getSpools() {
3211
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/spools`);
3415
+ const response = await this._cache.queryClient.fetchQuery({
3416
+ queryKey: ["spools"],
3417
+ queryFn: async () => {
3418
+ return await this._requestClient.get(`/api/spools`);
3419
+ }
3420
+ });
3212
3421
  if (response.status === 200) {
3213
3422
  return response.data.spools.reduce((spools, spool) => {
3214
3423
  spools[spool.marketCoinName] = spool;
@@ -3224,12 +3433,7 @@ var ScallopIndexer = class {
3224
3433
  * @return Spool data.
3225
3434
  */
3226
3435
  async getSpool(marketCoinName) {
3227
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/spool/${marketCoinName}`);
3228
- if (response.status === 200) {
3229
- return response.data.spool;
3230
- } else {
3231
- throw Error("Failed to getSpool.");
3232
- }
3436
+ return (await this.getSpools())[marketCoinName];
3233
3437
  }
3234
3438
  /**
3235
3439
  * Get borrow incentive pools index data.
@@ -3237,7 +3441,12 @@ var ScallopIndexer = class {
3237
3441
  * @return Borrow incentive pools data.
3238
3442
  */
3239
3443
  async getBorrowIncentivePools() {
3240
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/borrowIncentivePools`);
3444
+ const response = await this._cache.queryClient.fetchQuery({
3445
+ queryKey: ["borrowIncentivePools"],
3446
+ queryFn: async () => {
3447
+ return await this._requestClient.get(`/api/borrowIncentivePools`);
3448
+ }
3449
+ });
3241
3450
  if (response.status === 200) {
3242
3451
  return response.data.borrowIncentivePools.reduce(
3243
3452
  (borrowIncentivePools, borrowIncentivePool) => {
@@ -3256,14 +3465,7 @@ var ScallopIndexer = class {
3256
3465
  * @return Borrow incentive pool data.
3257
3466
  */
3258
3467
  async getBorrowIncentivePool(borrowIncentiveCoinName) {
3259
- const response = await this._requestClient.get(
3260
- `${SDK_API_BASE_URL}/api/borrowIncentivePool/${borrowIncentiveCoinName}`
3261
- );
3262
- if (response.status === 200) {
3263
- return response.data.borrowIncentivePool;
3264
- } else {
3265
- throw Error("Failed to getSpool.");
3266
- }
3468
+ return (await this.getBorrowIncentivePools())[borrowIncentiveCoinName];
3267
3469
  }
3268
3470
  /**
3269
3471
  * Get total value locked index data.
@@ -3271,7 +3473,12 @@ var ScallopIndexer = class {
3271
3473
  * @return Total value locked.
3272
3474
  */
3273
3475
  async getTotalValueLocked() {
3274
- const response = await this._requestClient.get(`${SDK_API_BASE_URL}/api/market/tvl`);
3476
+ const response = await this._cache.queryClient.fetchQuery({
3477
+ queryKey: ["totalValueLocked"],
3478
+ queryFn: async () => {
3479
+ return await this._requestClient.get(`/api/market/tvl`);
3480
+ }
3481
+ });
3275
3482
  if (response.status === 200) {
3276
3483
  return response.data;
3277
3484
  } else {
@@ -3285,16 +3492,21 @@ var ScallopQuery = class {
3285
3492
  constructor(params, instance) {
3286
3493
  this.params = params;
3287
3494
  this.suiKit = instance?.suiKit ?? new SuiKit(params);
3288
- this.address = instance?.address ?? new ScallopAddress({
3289
- id: params?.addressesId || ADDRESSES_ID,
3290
- network: params?.networkType
3291
- });
3495
+ this.cache = instance?.cache ?? new ScallopCache(DEFAULT_CACHE_OPTIONS, this.suiKit);
3496
+ this.address = instance?.address ?? new ScallopAddress(
3497
+ {
3498
+ id: params?.addressesId || ADDRESSES_ID,
3499
+ network: params?.networkType
3500
+ },
3501
+ this.cache
3502
+ );
3292
3503
  this.utils = instance?.utils ?? new ScallopUtils(this.params, {
3293
3504
  suiKit: this.suiKit,
3294
3505
  address: this.address,
3506
+ cache: this.cache,
3295
3507
  query: this
3296
3508
  });
3297
- this.indexer = new ScallopIndexer();
3509
+ this.indexer = new ScallopIndexer(this.params, { cache: this.cache });
3298
3510
  }
3299
3511
  /**
3300
3512
  * Request the scallop API to initialize data.
@@ -3434,6 +3646,15 @@ var ScallopQuery = class {
3434
3646
  async getPriceFromPyth(assetCoinName) {
3435
3647
  return await getPythPrice(this, assetCoinName);
3436
3648
  }
3649
+ /**
3650
+ * Get prices from pyth fee object.
3651
+ *
3652
+ * @param assetCoinNames - Array of supported asset coin names.
3653
+ * @return Array of asset coin prices.
3654
+ */
3655
+ async getPricesFromPyth(assetCoinNames) {
3656
+ return await getPythPrices(this, assetCoinNames);
3657
+ }
3437
3658
  /* ==================== Spool Query Methods ==================== */
3438
3659
  /**
3439
3660
  * Get spools data.
@@ -3632,6 +3853,29 @@ var ScallopQuery = class {
3632
3853
  async getTvl(indexer = false) {
3633
3854
  return await getTotalValueLocked(this, indexer);
3634
3855
  }
3856
+ /**
3857
+ * Get all veSca from walletAdddress
3858
+ * @param walletAddress
3859
+ * @returns array of veSca
3860
+ */
3861
+ async getVeScas(walletAddress) {
3862
+ return await getVeScas(this, walletAddress);
3863
+ }
3864
+ /**
3865
+ * Get total vesca treasury with movecall
3866
+ * @returns Promise<string | undefined>
3867
+ */
3868
+ async getTotalVeScaTreasuryAmount() {
3869
+ return await getTotalVeScaTreasuryAmount(this);
3870
+ }
3871
+ /**
3872
+ * Return binded veScaKeyId of walletAddress if exist
3873
+ * @param walletAddress
3874
+ * @returns veScaKeyId
3875
+ */
3876
+ async getVeScaKeyIdFromReferralBindings(walletAddress) {
3877
+ return await queryVeScaKeyIdFromReferralBindings(this, walletAddress);
3878
+ }
3635
3879
  /**
3636
3880
  * Get binded obligationId from a veScaKey if it exists.
3637
3881
  * @param veScaKey
@@ -3680,13 +3924,18 @@ var ScallopUtils = class {
3680
3924
  };
3681
3925
  this.params = params;
3682
3926
  this._suiKit = instance?.suiKit ?? new SuiKit2(params);
3683
- this._address = instance?.address ?? new ScallopAddress({
3684
- id: params?.addressesId || ADDRESSES_ID,
3685
- network: params?.networkType
3686
- });
3927
+ this._cache = instance?.cache ?? new ScallopCache(DEFAULT_CACHE_OPTIONS, this._suiKit);
3928
+ this._address = instance?.address ?? new ScallopAddress(
3929
+ {
3930
+ id: params?.addressesId || ADDRESSES_ID,
3931
+ network: params?.networkType
3932
+ },
3933
+ this._cache
3934
+ );
3687
3935
  this._query = instance?.query ?? new ScallopQuery(params, {
3688
3936
  suiKit: this._suiKit,
3689
- address: this._address
3937
+ address: this._address,
3938
+ cache: this._cache
3690
3939
  });
3691
3940
  this.isTestnet = params.networkType ? params.networkType === "testnet" : false;
3692
3941
  }
@@ -3738,7 +3987,7 @@ var ScallopUtils = class {
3738
3987
  throw Error(`Coin ${coinName} is not supported`);
3739
3988
  }
3740
3989
  if (coinName === "sui")
3741
- return normalizeStructTag5(`${coinPackageId}::sui::SUI`);
3990
+ return normalizeStructTag6(`${coinPackageId}::sui::SUI`);
3742
3991
  const wormHolePckageIds = [
3743
3992
  this._address.get("core.coins.usdc.id") ?? wormholeCoinIds.usdc,
3744
3993
  this._address.get("core.coins.usdt.id") ?? wormholeCoinIds.usdt,
@@ -3771,7 +4020,7 @@ var ScallopUtils = class {
3771
4020
  return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;
3772
4021
  }
3773
4022
  parseCoinNameFromType(coinType) {
3774
- coinType = normalizeStructTag5(coinType);
4023
+ coinType = normalizeStructTag6(coinType);
3775
4024
  const coinTypeRegex = new RegExp(`((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)`);
3776
4025
  const coinTypeMatch = coinType.match(coinTypeRegex);
3777
4026
  const isMarketCoinType = coinType.includes("reserve::MarketCoin");
@@ -3903,40 +4152,60 @@ var ScallopUtils = class {
3903
4152
  }
3904
4153
  if (lackPricesCoinNames.length > 0) {
3905
4154
  const endpoints = this.params.pythEndpoints ?? PYTH_ENDPOINTS[this.isTestnet ? "testnet" : "mainnet"];
3906
- try {
3907
- for (const endpoint of endpoints) {
3908
- try {
3909
- const pythConnection = new SuiPriceServiceConnection(endpoint);
3910
- const priceIds = lackPricesCoinNames.map(
3911
- (coinName) => this._address.get(`core.coins.${coinName}.oracle.pyth.feed`)
4155
+ const failedRequests = new Set(
4156
+ lackPricesCoinNames
4157
+ );
4158
+ for (const endpoint of endpoints) {
4159
+ const priceIds = Array.from(failedRequests.values()).reduce(
4160
+ (acc, coinName) => {
4161
+ const priceId = this._address.get(
4162
+ `core.coins.${coinName}.oracle.pyth.feed`
3912
4163
  );
3913
- const priceFeeds = await pythConnection.getLatestPriceFeeds(priceIds) || [];
3914
- for (const [index, feed] of priceFeeds.entries()) {
3915
- const data = parseDataFromPythPriceFeed(feed, this._address);
3916
- const coinName = lackPricesCoinNames[index];
3917
- this._priceMap.set(coinName, {
3918
- price: data.price,
3919
- publishTime: data.publishTime
4164
+ acc[coinName] = priceId;
4165
+ return acc;
4166
+ },
4167
+ {}
4168
+ );
4169
+ await Promise.allSettled(
4170
+ Object.entries(priceIds).map(async ([coinName, priceId]) => {
4171
+ const pythConnection = new SuiPriceServiceConnection(endpoint);
4172
+ try {
4173
+ const feed = await this._cache.queryClient.fetchQuery({
4174
+ queryKey: [priceId],
4175
+ queryFn: async () => {
4176
+ return await pythConnection.getLatestPriceFeeds([priceId]);
4177
+ }
3920
4178
  });
3921
- coinPrices[coinName] = data.price;
4179
+ if (feed) {
4180
+ const data = parseDataFromPythPriceFeed(feed[0], this._address);
4181
+ this._priceMap.set(coinName, {
4182
+ price: data.price,
4183
+ publishTime: data.publishTime
4184
+ });
4185
+ coinPrices[coinName] = data.price;
4186
+ }
4187
+ failedRequests.delete(coinName);
4188
+ } catch (e) {
4189
+ console.warn(
4190
+ `Failed to get price ${coinName} feeds with endpoint ${endpoint}: ${e}`
4191
+ );
3922
4192
  }
3923
- break;
3924
- } catch (e) {
3925
- console.warn(
3926
- `Failed to update price feeds with endpoint ${endpoint}: ${e}`
3927
- );
3928
- }
3929
- throw new Error("Failed to update price feeds with all endpoins");
3930
- }
3931
- } catch (_e) {
3932
- for (const coinName of lackPricesCoinNames) {
3933
- const price = await this._query.getPriceFromPyth(coinName);
3934
- this._priceMap.set(coinName, {
3935
- price,
3936
- publishTime: Date.now()
3937
- });
3938
- coinPrices[coinName] = price;
3939
- }
4193
+ })
4194
+ );
4195
+ if (failedRequests.size === 0)
4196
+ break;
4197
+ }
4198
+ if (failedRequests.size > 0) {
4199
+ await Promise.allSettled(
4200
+ Array.from(failedRequests.values()).map(async (coinName) => {
4201
+ const price = await this._query.getPriceFromPyth(coinName);
4202
+ this._priceMap.set(coinName, {
4203
+ price,
4204
+ publishTime: Date.now()
4205
+ });
4206
+ coinPrices[coinName] = price;
4207
+ })
4208
+ );
3940
4209
  }
3941
4210
  }
3942
4211
  return coinPrices;
@@ -4001,11 +4270,11 @@ import { SuiKit as SuiKit3 } from "@scallop-io/sui-kit";
4001
4270
 
4002
4271
  // src/builders/coreBuilder.ts
4003
4272
  import { TransactionBlock } from "@mysten/sui.js/transactions";
4004
- import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID2 } from "@mysten/sui.js/utils";
4005
- import { SuiTxBlock as SuiKitTxBlock3 } from "@scallop-io/sui-kit";
4273
+ import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID3 } from "@mysten/sui.js/utils";
4274
+ import { SuiTxBlock as SuiKitTxBlock } from "@scallop-io/sui-kit";
4006
4275
 
4007
4276
  // src/builders/oracle.ts
4008
- import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui.js/utils";
4277
+ import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID2 } from "@mysten/sui.js/utils";
4009
4278
  import {
4010
4279
  SuiPythClient,
4011
4280
  SuiPriceServiceConnection as SuiPriceServiceConnection2
@@ -4122,27 +4391,27 @@ var priceUpdateRequest = (txBlock, packageId, xOracleId, coinType) => {
4122
4391
  var confirmPriceUpdateRequest = (txBlock, packageId, xOracleId, request, coinType) => {
4123
4392
  const target = `${packageId}::x_oracle::confirm_price_update_request`;
4124
4393
  const typeArgs = [coinType];
4125
- txBlock.moveCall(target, [xOracleId, request, SUI_CLOCK_OBJECT_ID], typeArgs);
4394
+ txBlock.moveCall(target, [xOracleId, request, SUI_CLOCK_OBJECT_ID2], typeArgs);
4126
4395
  return txBlock;
4127
4396
  };
4128
4397
  var updateSupraPrice = (txBlock, packageId, request, holderId, registryId, coinType) => {
4129
4398
  txBlock.moveCall(
4130
4399
  `${packageId}::rule::set_price`,
4131
- [request, holderId, registryId, SUI_CLOCK_OBJECT_ID],
4400
+ [request, holderId, registryId, SUI_CLOCK_OBJECT_ID2],
4132
4401
  [coinType]
4133
4402
  );
4134
4403
  };
4135
4404
  var updateSwitchboardPrice = (txBlock, packageId, request, aggregatorId, registryId, coinType) => {
4136
4405
  txBlock.moveCall(
4137
4406
  `${packageId}::rule::set_price`,
4138
- [request, aggregatorId, registryId, SUI_CLOCK_OBJECT_ID],
4407
+ [request, aggregatorId, registryId, SUI_CLOCK_OBJECT_ID2],
4139
4408
  [coinType]
4140
4409
  );
4141
4410
  };
4142
4411
  var updatePythPrice = (txBlock, packageId, request, stateId, feedObjectId, registryId, coinType) => {
4143
4412
  txBlock.moveCall(
4144
4413
  `${packageId}::rule::set_price`,
4145
- [request, stateId, feedObjectId, registryId, SUI_CLOCK_OBJECT_ID],
4414
+ [request, stateId, feedObjectId, registryId, SUI_CLOCK_OBJECT_ID2],
4146
4415
  [coinType]
4147
4416
  );
4148
4417
  };
@@ -4175,6 +4444,8 @@ var generateCoreNormalMethod = ({
4175
4444
  coinDecimalsRegistry: builder.address.get("core.coinDecimalsRegistry"),
4176
4445
  xOracle: builder.address.get("core.oracles.xOracle")
4177
4446
  };
4447
+ const referralPkgId = builder.address.get("referral.id");
4448
+ const referralWitnessType = `${referralPkgId}::scallop_referral_program::REFERRAL_WITNESS`;
4178
4449
  return {
4179
4450
  openObligation: () => txBlock.moveCall(
4180
4451
  `${coreIds.protocolPkg}::open_obligation::open_obligation`,
@@ -4208,7 +4479,7 @@ var generateCoreNormalMethod = ({
4208
4479
  coreIds.coinDecimalsRegistry,
4209
4480
  amount,
4210
4481
  coreIds.xOracle,
4211
- SUI_CLOCK_OBJECT_ID2
4482
+ SUI_CLOCK_OBJECT_ID3
4212
4483
  ],
4213
4484
  [coinType]
4214
4485
  );
@@ -4217,7 +4488,7 @@ var generateCoreNormalMethod = ({
4217
4488
  const coinType = builder.utils.parseCoinType(poolCoinName);
4218
4489
  return txBlock.moveCall(
4219
4490
  `${coreIds.protocolPkg}::mint::mint`,
4220
- [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID2],
4491
+ [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID3],
4221
4492
  [coinType]
4222
4493
  );
4223
4494
  },
@@ -4225,7 +4496,7 @@ var generateCoreNormalMethod = ({
4225
4496
  const coinType = builder.utils.parseCoinType(poolCoinName);
4226
4497
  return txBlock.moveCall(
4227
4498
  `${coreIds.protocolPkg}::mint::mint_entry`,
4228
- [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID2],
4499
+ [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID3],
4229
4500
  [coinType]
4230
4501
  );
4231
4502
  },
@@ -4233,7 +4504,7 @@ var generateCoreNormalMethod = ({
4233
4504
  const coinType = builder.utils.parseCoinType(poolCoinName);
4234
4505
  return txBlock.moveCall(
4235
4506
  `${coreIds.protocolPkg}::redeem::redeem`,
4236
- [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID2],
4507
+ [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID3],
4237
4508
  [coinType]
4238
4509
  );
4239
4510
  },
@@ -4241,7 +4512,7 @@ var generateCoreNormalMethod = ({
4241
4512
  const coinType = builder.utils.parseCoinType(poolCoinName);
4242
4513
  return txBlock.moveCall(
4243
4514
  `${coreIds.protocolPkg}::redeem::redeem_entry`,
4244
- [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID2],
4515
+ [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID3],
4245
4516
  [coinType]
4246
4517
  );
4247
4518
  },
@@ -4257,11 +4528,29 @@ var generateCoreNormalMethod = ({
4257
4528
  coreIds.coinDecimalsRegistry,
4258
4529
  amount,
4259
4530
  coreIds.xOracle,
4260
- SUI_CLOCK_OBJECT_ID2
4531
+ SUI_CLOCK_OBJECT_ID3
4261
4532
  ],
4262
4533
  [coinType]
4263
4534
  );
4264
4535
  },
4536
+ borrowWithReferral: (obligation, obligationKey, borrowReferral, amount, poolCoinName) => {
4537
+ const coinType = builder.utils.parseCoinType(poolCoinName);
4538
+ return txBlock.moveCall(
4539
+ `${coreIds.protocolPkg}::borrow::borrow_with_referral`,
4540
+ [
4541
+ coreIds.version,
4542
+ obligation,
4543
+ obligationKey,
4544
+ coreIds.market,
4545
+ coreIds.coinDecimalsRegistry,
4546
+ borrowReferral,
4547
+ amount,
4548
+ coreIds.xOracle,
4549
+ SUI_CLOCK_OBJECT_ID3
4550
+ ],
4551
+ [coinType, referralWitnessType]
4552
+ );
4553
+ },
4265
4554
  borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {
4266
4555
  const coinType = builder.utils.parseCoinType(poolCoinName);
4267
4556
  return txBlock.moveCall(
@@ -4274,7 +4563,7 @@ var generateCoreNormalMethod = ({
4274
4563
  coreIds.coinDecimalsRegistry,
4275
4564
  amount,
4276
4565
  coreIds.xOracle,
4277
- SUI_CLOCK_OBJECT_ID2
4566
+ SUI_CLOCK_OBJECT_ID3
4278
4567
  ],
4279
4568
  [coinType]
4280
4569
  );
@@ -4288,7 +4577,7 @@ var generateCoreNormalMethod = ({
4288
4577
  obligation,
4289
4578
  coreIds.market,
4290
4579
  coin,
4291
- SUI_CLOCK_OBJECT_ID2
4580
+ SUI_CLOCK_OBJECT_ID3
4292
4581
  ],
4293
4582
  [coinType]
4294
4583
  );
@@ -4402,6 +4691,26 @@ var generateCoreQuickMethod = ({
4402
4691
  poolCoinName
4403
4692
  );
4404
4693
  },
4694
+ borrowWithReferralQuick: async (amount, poolCoinName, borrowReferral, obligationId, obligationKey) => {
4695
+ const obligationInfo = await requireObligationInfo(
4696
+ builder,
4697
+ txBlock,
4698
+ obligationId,
4699
+ obligationKey
4700
+ );
4701
+ const obligationCoinNames = await builder.utils.getObligationCoinNames(
4702
+ obligationInfo.obligationId
4703
+ );
4704
+ const updateCoinNames = [...obligationCoinNames, poolCoinName];
4705
+ await updateOracles(builder, txBlock, updateCoinNames);
4706
+ return txBlock.borrowWithReferral(
4707
+ obligationInfo.obligationId,
4708
+ obligationInfo.obligationKey,
4709
+ borrowReferral,
4710
+ amount,
4711
+ poolCoinName
4712
+ );
4713
+ },
4405
4714
  repayQuick: async (amount, poolCoinName, obligationId) => {
4406
4715
  const sender = requireSender(txBlock);
4407
4716
  const obligationInfo = await requireObligationInfo(
@@ -4437,7 +4746,7 @@ var generateCoreQuickMethod = ({
4437
4746
  };
4438
4747
  };
4439
4748
  var newCoreTxBlock = (builder, initTxBlock) => {
4440
- const txBlock = initTxBlock instanceof TransactionBlock ? new SuiKitTxBlock3(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock3();
4749
+ const txBlock = initTxBlock instanceof TransactionBlock ? new SuiKitTxBlock(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock();
4441
4750
  const normalMethod = generateCoreNormalMethod({
4442
4751
  builder,
4443
4752
  txBlock
@@ -4466,8 +4775,8 @@ var newCoreTxBlock = (builder, initTxBlock) => {
4466
4775
 
4467
4776
  // src/builders/spoolBuilder.ts
4468
4777
  import { TransactionBlock as TransactionBlock2 } from "@mysten/sui.js/transactions";
4469
- import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID3 } from "@mysten/sui.js/utils";
4470
- import { SuiTxBlock as SuiKitTxBlock4 } from "@scallop-io/sui-kit";
4778
+ import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID4 } from "@mysten/sui.js/utils";
4779
+ import { SuiTxBlock as SuiKitTxBlock2 } from "@scallop-io/sui-kit";
4471
4780
  var requireStakeAccountIds = async (...params) => {
4472
4781
  const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;
4473
4782
  if (params.length === 4 && stakeAccountId)
@@ -4506,7 +4815,7 @@ var generateSpoolNormalMethod = ({
4506
4815
  );
4507
4816
  return txBlock.moveCall(
4508
4817
  `${spoolIds.spoolPkg}::user::new_spool_account`,
4509
- [stakePoolId, SUI_CLOCK_OBJECT_ID3],
4818
+ [stakePoolId, SUI_CLOCK_OBJECT_ID4],
4510
4819
  [marketCoinType]
4511
4820
  );
4512
4821
  },
@@ -4517,7 +4826,7 @@ var generateSpoolNormalMethod = ({
4517
4826
  );
4518
4827
  txBlock.moveCall(
4519
4828
  `${spoolIds.spoolPkg}::user::stake`,
4520
- [stakePoolId, stakeAccount, coin, SUI_CLOCK_OBJECT_ID3],
4829
+ [stakePoolId, stakeAccount, coin, SUI_CLOCK_OBJECT_ID4],
4521
4830
  [marketCoinType]
4522
4831
  );
4523
4832
  },
@@ -4528,7 +4837,7 @@ var generateSpoolNormalMethod = ({
4528
4837
  );
4529
4838
  return txBlock.moveCall(
4530
4839
  `${spoolIds.spoolPkg}::user::unstake`,
4531
- [stakePoolId, stakeAccount, amount, SUI_CLOCK_OBJECT_ID3],
4840
+ [stakePoolId, stakeAccount, amount, SUI_CLOCK_OBJECT_ID4],
4532
4841
  [marketCoinType]
4533
4842
  );
4534
4843
  },
@@ -4544,7 +4853,7 @@ var generateSpoolNormalMethod = ({
4544
4853
  const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);
4545
4854
  return txBlock.moveCall(
4546
4855
  `${spoolIds.spoolPkg}::user::redeem_rewards`,
4547
- [stakePoolId, rewardPoolId, stakeAccount, SUI_CLOCK_OBJECT_ID3],
4856
+ [stakePoolId, rewardPoolId, stakeAccount, SUI_CLOCK_OBJECT_ID4],
4548
4857
  [marketCoinType, rewardCoinType]
4549
4858
  );
4550
4859
  }
@@ -4625,7 +4934,7 @@ var generateSpoolQuickMethod = ({
4625
4934
  };
4626
4935
  };
4627
4936
  var newSpoolTxBlock = (builder, initTxBlock) => {
4628
- const txBlock = initTxBlock instanceof TransactionBlock2 ? new SuiKitTxBlock4(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock4();
4937
+ const txBlock = initTxBlock instanceof TransactionBlock2 ? new SuiKitTxBlock2(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock2();
4629
4938
  const normalMethod = generateSpoolNormalMethod({
4630
4939
  builder,
4631
4940
  txBlock
@@ -4654,14 +4963,14 @@ var newSpoolTxBlock = (builder, initTxBlock) => {
4654
4963
 
4655
4964
  // src/builders/borrowIncentiveBuilder.ts
4656
4965
  import { TransactionBlock as TransactionBlock4 } from "@mysten/sui.js/transactions";
4657
- import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID5 } from "@mysten/sui.js/utils";
4658
- import { SuiTxBlock as SuiKitTxBlock6 } from "@scallop-io/sui-kit";
4966
+ import { SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID6 } from "@mysten/sui.js/utils";
4967
+ import { SuiTxBlock as SuiKitTxBlock4 } from "@scallop-io/sui-kit";
4659
4968
 
4660
4969
  // src/builders/vescaBuilder.ts
4661
4970
  import {
4662
- SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID4,
4971
+ SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID5,
4663
4972
  TransactionBlock as TransactionBlock3,
4664
- SuiTxBlock as SuiKitTxBlock5
4973
+ SuiTxBlock as SuiKitTxBlock3
4665
4974
  } from "@scallop-io/sui-kit";
4666
4975
  var requireVeSca = async (...params) => {
4667
4976
  const [builder, txBlock, veScaKey] = params;
@@ -4677,10 +4986,7 @@ var requireVeSca = async (...params) => {
4677
4986
  if (veScas.length === 0) {
4678
4987
  return void 0;
4679
4988
  }
4680
- return veScas.reduce(
4681
- (prev, acc) => acc.currentVeScaBalance > prev.currentVeScaBalance ? acc : prev,
4682
- veScas[0]
4683
- );
4989
+ return veScas[0];
4684
4990
  };
4685
4991
  var generateNormalVeScaMethod = ({
4686
4992
  builder,
@@ -4702,7 +5008,7 @@ var generateNormalVeScaMethod = ({
4702
5008
  veScaIds.treasury,
4703
5009
  scaCoin,
4704
5010
  unlockAtInSecondTimestamp,
4705
- SUI_CLOCK_OBJECT_ID4
5011
+ SUI_CLOCK_OBJECT_ID5
4706
5012
  ],
4707
5013
  []
4708
5014
  );
@@ -4716,7 +5022,7 @@ var generateNormalVeScaMethod = ({
4716
5022
  veScaIds.table,
4717
5023
  veScaIds.treasury,
4718
5024
  newUnlockAtInSecondTimestamp,
4719
- SUI_CLOCK_OBJECT_ID4
5025
+ SUI_CLOCK_OBJECT_ID5
4720
5026
  ],
4721
5027
  []
4722
5028
  );
@@ -4730,7 +5036,7 @@ var generateNormalVeScaMethod = ({
4730
5036
  veScaIds.table,
4731
5037
  veScaIds.treasury,
4732
5038
  scaCoin,
4733
- SUI_CLOCK_OBJECT_ID4
5039
+ SUI_CLOCK_OBJECT_ID5
4734
5040
  ],
4735
5041
  []
4736
5042
  );
@@ -4745,7 +5051,7 @@ var generateNormalVeScaMethod = ({
4745
5051
  veScaIds.treasury,
4746
5052
  scaCoin,
4747
5053
  newUnlockAtInSecondTimestamp,
4748
- SUI_CLOCK_OBJECT_ID4
5054
+ SUI_CLOCK_OBJECT_ID5
4749
5055
  ],
4750
5056
  []
4751
5057
  );
@@ -4758,10 +5064,17 @@ var generateNormalVeScaMethod = ({
4758
5064
  veScaKey,
4759
5065
  veScaIds.table,
4760
5066
  veScaIds.treasury,
4761
- SUI_CLOCK_OBJECT_ID4
5067
+ SUI_CLOCK_OBJECT_ID5
4762
5068
  ],
4763
5069
  []
4764
5070
  );
5071
+ },
5072
+ mintEmptyVeSca: () => {
5073
+ return txBlock.moveCall(
5074
+ `${veScaIds.pkgId}::ve_sca::mint_ve_sca_placeholder_key`,
5075
+ [veScaIds.config, veScaIds.table],
5076
+ []
5077
+ );
4765
5078
  }
4766
5079
  };
4767
5080
  };
@@ -4904,7 +5217,7 @@ var generateQuickVeScaMethod = ({
4904
5217
  };
4905
5218
  };
4906
5219
  var newVeScaTxBlock = (builder, initTxBlock) => {
4907
- const txBlock = initTxBlock instanceof TransactionBlock3 ? new SuiKitTxBlock5(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock5();
5220
+ const txBlock = initTxBlock instanceof TransactionBlock3 ? new SuiKitTxBlock3(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock3();
4908
5221
  const normalMethod = generateNormalVeScaMethod({
4909
5222
  builder,
4910
5223
  txBlock
@@ -4957,7 +5270,7 @@ var requireObligationInfo2 = async (...params) => {
4957
5270
  };
4958
5271
  var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
4959
5272
  const borrowIncentiveIds = {
4960
- borrowIncentivePkg: IS_VE_SCA_TEST ? "0x4d5a7cefa4147b4ace0ca845b20437d6ac0d32e5f2f855171f745472c2576246" : builder.address.get("borrowIncentive.id"),
5273
+ borrowIncentivePkg: builder.address.get("borrowIncentive.id"),
4961
5274
  query: builder.address.get("borrowIncentive.query"),
4962
5275
  config: builder.address.get("borrowIncentive.config"),
4963
5276
  incentivePools: builder.address.get("borrowIncentive.incentivePools"),
@@ -4982,7 +5295,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
4982
5295
  obligationKey,
4983
5296
  obligationId,
4984
5297
  borrowIncentiveIds.obligationAccessStore,
4985
- SUI_CLOCK_OBJECT_ID5
5298
+ SUI_CLOCK_OBJECT_ID6
4986
5299
  ]
4987
5300
  );
4988
5301
  },
@@ -5000,7 +5313,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
5000
5313
  veScaIds.treasury,
5001
5314
  veScaIds.table,
5002
5315
  veScaKey,
5003
- SUI_CLOCK_OBJECT_ID5
5316
+ SUI_CLOCK_OBJECT_ID6
5004
5317
  ],
5005
5318
  []
5006
5319
  );
@@ -5014,12 +5327,12 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
5014
5327
  borrowIncentiveIds.incentiveAccounts,
5015
5328
  obligationKey,
5016
5329
  obligationId,
5017
- SUI_CLOCK_OBJECT_ID5
5330
+ SUI_CLOCK_OBJECT_ID6
5018
5331
  ]
5019
5332
  );
5020
5333
  },
5021
5334
  claimBorrowIncentive: (obligationId, obligationKey, coinName, rewardCoinName) => {
5022
- const rewardCoinNames = borrowIncentiveRewardCoins[coinName];
5335
+ const rewardCoinNames = builder.utils.getBorrowIncentiveRewardCoinName(coinName);
5023
5336
  if (rewardCoinNames.includes(rewardCoinName) === false) {
5024
5337
  throw new Error(`Invalid reward coin name ${rewardCoinName}`);
5025
5338
  }
@@ -5032,7 +5345,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
5032
5345
  borrowIncentiveIds.incentiveAccounts,
5033
5346
  obligationKey,
5034
5347
  obligationId,
5035
- SUI_CLOCK_OBJECT_ID5
5348
+ SUI_CLOCK_OBJECT_ID6
5036
5349
  ],
5037
5350
  [rewardType]
5038
5351
  );
@@ -5046,7 +5359,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
5046
5359
  borrowIncentiveIds.incentiveAccounts,
5047
5360
  obligation,
5048
5361
  veScaKey,
5049
- SUI_CLOCK_OBJECT_ID5
5362
+ SUI_CLOCK_OBJECT_ID6
5050
5363
  ]
5051
5364
  );
5052
5365
  }
@@ -5066,9 +5379,7 @@ var generateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {
5066
5379
  obligationKey
5067
5380
  );
5068
5381
  const unstakeObligationBeforeStake = !!txBlock.txBlock.blockData.transactions.find(
5069
- (txn) => txn.kind === "MoveCall" && (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` || txn.target === (IS_VE_SCA_TEST ? `${"0x4d5a7cefa4147b4ace0ca845b20437d6ac0d32e5f2f855171f745472c2576246"}::user::unstake` : `${builder.address.get(
5070
- "borrowIncentive.id"
5071
- )}::user::unstake`))
5382
+ (txn) => txn.kind === "MoveCall" && (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` || txn.target === `${builder.address.get("borrowIncentive.id")}::user::unstake`)
5072
5383
  );
5073
5384
  if (!obligationLocked || unstakeObligationBeforeStake) {
5074
5385
  txBlock.stakeObligation(obligationArg, obligationtKeyArg);
@@ -5086,9 +5397,7 @@ var generateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {
5086
5397
  obligationKey
5087
5398
  );
5088
5399
  const unstakeObligationBeforeStake = !!txBlock.txBlock.blockData.transactions.find(
5089
- (txn) => txn.kind === "MoveCall" && (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` || txn.target === (IS_VE_SCA_TEST ? `${"0x4d5a7cefa4147b4ace0ca845b20437d6ac0d32e5f2f855171f745472c2576246"}::user::unstake` : `${builder.address.get(
5090
- "borrowIncentive.id"
5091
- )}::user::unstake`))
5400
+ (txn) => txn.kind === "MoveCall" && (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` || txn.target === `${builder.address.get("borrowIncentive.id")}::user::unstake`)
5092
5401
  );
5093
5402
  if (!obligationLocked || unstakeObligationBeforeStake) {
5094
5403
  const veSca = await requireVeSca(builder, txBlock, veScaKey);
@@ -5097,7 +5406,7 @@ var generateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {
5097
5406
  builder.query,
5098
5407
  veSca.keyId
5099
5408
  );
5100
- if (!bindedObligationId || bindedObligationId === obligationArg) {
5409
+ if ((!bindedObligationId || bindedObligationId === obligationArg) && veSca.currentVeScaBalance > 0) {
5101
5410
  txBlock.stakeObligationWithVesca(
5102
5411
  obligationArg,
5103
5412
  obligationtKeyArg,
@@ -5146,7 +5455,7 @@ var generateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {
5146
5455
  };
5147
5456
  };
5148
5457
  var newBorrowIncentiveTxBlock = (builder, initTxBlock) => {
5149
- const txBlock = initTxBlock instanceof TransactionBlock4 ? new SuiKitTxBlock6(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock6();
5458
+ const txBlock = initTxBlock instanceof TransactionBlock4 ? new SuiKitTxBlock4(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock4();
5150
5459
  const normalMethod = generateBorrowIncentiveNormalMethod({
5151
5460
  builder,
5152
5461
  txBlock
@@ -5173,6 +5482,142 @@ var newBorrowIncentiveTxBlock = (builder, initTxBlock) => {
5173
5482
  });
5174
5483
  };
5175
5484
 
5485
+ // src/builders/referralBuilder.ts
5486
+ import {
5487
+ SUI_CLOCK_OBJECT_ID as SUI_CLOCK_OBJECT_ID7,
5488
+ SuiTxBlock as SuiKitTxBlock5,
5489
+ TransactionBlock as TransactionBlock5
5490
+ } from "@scallop-io/sui-kit";
5491
+ var generateReferralNormalMethod = ({
5492
+ builder,
5493
+ txBlock
5494
+ }) => {
5495
+ const referralIds = {
5496
+ referralPgkId: builder.address.get("referral.id"),
5497
+ referralBindings: builder.address.get("referral.referralBindings"),
5498
+ referralRevenuePool: builder.address.get("referral.referralRevenuePool"),
5499
+ authorizedWitnessList: builder.address.get(
5500
+ "referral.authorizedWitnessList"
5501
+ ),
5502
+ referralTiers: builder.address.get("referral.referralTiers"),
5503
+ version: builder.address.get("referral.version")
5504
+ };
5505
+ const veScaTable = builder.address.get("vesca.table");
5506
+ return {
5507
+ bindToReferral: (veScaKeyId) => {
5508
+ return txBlock.moveCall(
5509
+ `${referralIds.referralPgkId}::referral_bindings::bind_ve_sca_referrer`,
5510
+ [
5511
+ referralIds.referralBindings,
5512
+ txBlock.pure(veScaKeyId),
5513
+ veScaTable,
5514
+ SUI_CLOCK_OBJECT_ID7
5515
+ ],
5516
+ []
5517
+ );
5518
+ },
5519
+ claimReferralTicket: (poolCoinName) => {
5520
+ const coinType = builder.utils.parseCoinType(poolCoinName);
5521
+ return txBlock.moveCall(
5522
+ `${referralIds.referralPgkId}::scallop_referral_program::claim_ve_sca_referral_ticket`,
5523
+ [
5524
+ referralIds.version,
5525
+ veScaTable,
5526
+ referralIds.referralBindings,
5527
+ referralIds.authorizedWitnessList,
5528
+ referralIds.referralTiers,
5529
+ SUI_CLOCK_OBJECT_ID7
5530
+ ],
5531
+ [coinType]
5532
+ );
5533
+ },
5534
+ burnReferralTicket: (ticket, poolCoinName) => {
5535
+ const coinType = builder.utils.parseCoinType(poolCoinName);
5536
+ return txBlock.moveCall(
5537
+ `${referralIds.referralPgkId}::scallop_referral_program::burn_ve_sca_referral_ticket`,
5538
+ [
5539
+ referralIds.version,
5540
+ ticket,
5541
+ referralIds.referralRevenuePool,
5542
+ SUI_CLOCK_OBJECT_ID7
5543
+ ],
5544
+ [coinType]
5545
+ );
5546
+ },
5547
+ claimReferralRevenue: (veScaKey, poolCoinName) => {
5548
+ const coinType = builder.utils.parseCoinType(poolCoinName);
5549
+ return txBlock.moveCall(
5550
+ `${referralIds.referralPgkId}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,
5551
+ [
5552
+ referralIds.version,
5553
+ referralIds.referralRevenuePool,
5554
+ veScaKey,
5555
+ SUI_CLOCK_OBJECT_ID7
5556
+ ],
5557
+ [coinType]
5558
+ );
5559
+ }
5560
+ };
5561
+ };
5562
+ var generateReferralQuickMethod = ({
5563
+ builder,
5564
+ txBlock
5565
+ }) => {
5566
+ return {
5567
+ claimReferralRevenueQuick: async (veScaKey, coinNames = [...SUPPORT_POOLS]) => {
5568
+ const sender = requireSender(txBlock);
5569
+ const objToTransfer = [];
5570
+ for (const coinName of coinNames) {
5571
+ if (coinName === "sui") {
5572
+ const rewardCoin = txBlock.claimReferralRevenue(veScaKey, coinName);
5573
+ objToTransfer.push(rewardCoin);
5574
+ } else {
5575
+ const coins = await builder.suiKit.suiInteractor.selectCoins(
5576
+ sender,
5577
+ Infinity,
5578
+ builder.utils.parseCoinType(coinName)
5579
+ );
5580
+ const rewardCoin = txBlock.claimReferralRevenue(veScaKey, coinName);
5581
+ if (coins.length > 0) {
5582
+ txBlock.mergeCoins(rewardCoin, coins);
5583
+ }
5584
+ objToTransfer.push(rewardCoin);
5585
+ }
5586
+ }
5587
+ if (objToTransfer.length > 0) {
5588
+ txBlock.transferObjects(objToTransfer, sender);
5589
+ }
5590
+ }
5591
+ };
5592
+ };
5593
+ var newReferralTxBlock = (builder, initTxBlock) => {
5594
+ const txBlock = initTxBlock instanceof TransactionBlock5 ? new SuiKitTxBlock5(initTxBlock) : initTxBlock ? initTxBlock : new SuiKitTxBlock5();
5595
+ const normalMethod = generateReferralNormalMethod({
5596
+ builder,
5597
+ txBlock
5598
+ });
5599
+ const normalTxBlock = new Proxy(txBlock, {
5600
+ get: (target, prop) => {
5601
+ if (prop in normalMethod) {
5602
+ return Reflect.get(normalMethod, prop);
5603
+ }
5604
+ return Reflect.get(target, prop);
5605
+ }
5606
+ });
5607
+ const quickMethod = generateReferralQuickMethod({
5608
+ builder,
5609
+ txBlock: normalTxBlock
5610
+ });
5611
+ return new Proxy(normalTxBlock, {
5612
+ get: (target, prop) => {
5613
+ if (prop in quickMethod) {
5614
+ return Reflect.get(quickMethod, prop);
5615
+ }
5616
+ return Reflect.get(target, prop);
5617
+ }
5618
+ });
5619
+ };
5620
+
5176
5621
  // src/builders/index.ts
5177
5622
  var newScallopTxBlock = (builder, initTxBlock) => {
5178
5623
  const vescaTxBlock = newVeScaTxBlock(builder, initTxBlock);
@@ -5180,7 +5625,8 @@ var newScallopTxBlock = (builder, initTxBlock) => {
5180
5625
  builder,
5181
5626
  vescaTxBlock
5182
5627
  );
5183
- const spoolTxBlock = newSpoolTxBlock(builder, borrowIncentiveTxBlock);
5628
+ const referralTxBlock = newReferralTxBlock(builder, borrowIncentiveTxBlock);
5629
+ const spoolTxBlock = newSpoolTxBlock(builder, referralTxBlock);
5184
5630
  const coreTxBlock = newCoreTxBlock(builder, spoolTxBlock);
5185
5631
  return new Proxy(coreTxBlock, {
5186
5632
  get: (target, prop) => {
@@ -5188,6 +5634,8 @@ var newScallopTxBlock = (builder, initTxBlock) => {
5188
5634
  return Reflect.get(vescaTxBlock, prop);
5189
5635
  } else if (prop in borrowIncentiveTxBlock) {
5190
5636
  return Reflect.get(borrowIncentiveTxBlock, prop);
5637
+ } else if (prop in referralTxBlock) {
5638
+ return Reflect.get(referralTxBlock, prop);
5191
5639
  } else if (prop in spoolTxBlock) {
5192
5640
  return Reflect.get(spoolTxBlock, prop);
5193
5641
  }
@@ -5201,18 +5649,24 @@ var ScallopBuilder = class {
5201
5649
  constructor(params, instance) {
5202
5650
  this.params = params;
5203
5651
  this.suiKit = instance?.suiKit ?? new SuiKit3(params);
5204
- this.address = instance?.address ?? new ScallopAddress({
5205
- id: params?.addressesId || ADDRESSES_ID,
5206
- network: params?.networkType
5207
- });
5652
+ this.cache = instance?.cache ?? new ScallopCache(DEFAULT_CACHE_OPTIONS, this.suiKit);
5653
+ this.address = instance?.address ?? new ScallopAddress(
5654
+ {
5655
+ id: params?.addressesId || ADDRESSES_ID,
5656
+ network: params?.networkType
5657
+ },
5658
+ this.cache
5659
+ );
5208
5660
  this.query = instance?.query ?? new ScallopQuery(params, {
5209
5661
  suiKit: this.suiKit,
5210
- address: this.address
5662
+ address: this.address,
5663
+ cache: this.cache
5211
5664
  });
5212
5665
  this.utils = instance?.utils ?? new ScallopUtils(this.params, {
5213
5666
  suiKit: this.suiKit,
5214
5667
  address: this.address,
5215
- query: this.query
5668
+ query: this.query,
5669
+ cache: this.cache
5216
5670
  });
5217
5671
  this.walletAddress = normalizeSuiAddress(
5218
5672
  params?.walletAddress || this.suiKit.currentAddress()
@@ -5294,24 +5748,31 @@ var ScallopClient = class {
5294
5748
  constructor(params, instance) {
5295
5749
  this.params = params;
5296
5750
  this.suiKit = instance?.suiKit ?? new SuiKit4(params);
5297
- this.address = instance?.address ?? new ScallopAddress({
5298
- id: params?.addressesId || ADDRESSES_ID,
5299
- network: params?.networkType
5300
- });
5751
+ this.cache = instance?.cache ?? new ScallopCache(DEFAULT_CACHE_OPTIONS, this.suiKit);
5752
+ this.address = instance?.address ?? new ScallopAddress(
5753
+ {
5754
+ id: params?.addressesId || ADDRESSES_ID,
5755
+ network: params?.networkType
5756
+ },
5757
+ this.cache
5758
+ );
5301
5759
  this.query = instance?.query ?? new ScallopQuery(params, {
5302
5760
  suiKit: this.suiKit,
5303
- address: this.address
5761
+ address: this.address,
5762
+ cache: this.cache
5304
5763
  });
5305
5764
  this.utils = instance?.utils ?? new ScallopUtils(params, {
5306
5765
  suiKit: this.suiKit,
5307
5766
  address: this.address,
5308
- query: this.query
5767
+ query: this.query,
5768
+ cache: this.cache
5309
5769
  });
5310
5770
  this.builder = instance?.builder ?? new ScallopBuilder(params, {
5311
5771
  suiKit: this.suiKit,
5312
5772
  address: this.address,
5313
5773
  query: this.query,
5314
- utils: this.utils
5774
+ utils: this.utils,
5775
+ cache: this.cache
5315
5776
  });
5316
5777
  this.walletAddress = normalizeSuiAddress2(
5317
5778
  params?.walletAddress || this.suiKit.currentAddress()
@@ -5817,13 +6278,20 @@ var ScallopClient = class {
5817
6278
 
5818
6279
  // src/models/scallop.ts
5819
6280
  var Scallop = class {
5820
- constructor(params) {
6281
+ constructor(params, cacheOptions) {
5821
6282
  this.params = params;
5822
6283
  this.suiKit = new SuiKit5(params);
5823
- this._address = new ScallopAddress({
5824
- id: params?.addressesId || ADDRESSES_ID,
5825
- network: params?.networkType
5826
- });
6284
+ this.cache = new ScallopCache(
6285
+ cacheOptions ?? DEFAULT_CACHE_OPTIONS,
6286
+ this.suiKit
6287
+ );
6288
+ this._address = new ScallopAddress(
6289
+ {
6290
+ id: params?.addressesId || ADDRESSES_ID,
6291
+ network: params?.networkType
6292
+ },
6293
+ this.cache
6294
+ );
5827
6295
  }
5828
6296
  /**
5829
6297
  * Get a scallop address instance that already has read addresses.
@@ -5845,7 +6313,8 @@ var Scallop = class {
5845
6313
  await this._address.read();
5846
6314
  const scallopBuilder = new ScallopBuilder(this.params, {
5847
6315
  suiKit: this.suiKit,
5848
- address: this._address
6316
+ address: this._address,
6317
+ cache: this.cache
5849
6318
  });
5850
6319
  return scallopBuilder;
5851
6320
  }
@@ -5860,7 +6329,7 @@ var Scallop = class {
5860
6329
  await this._address.read();
5861
6330
  const scallopClient = new ScallopClient(
5862
6331
  { ...this.params, walletAddress },
5863
- { suiKit: this.suiKit, address: this._address }
6332
+ { suiKit: this.suiKit, address: this._address, cache: this.cache }
5864
6333
  );
5865
6334
  return scallopClient;
5866
6335
  }
@@ -5874,7 +6343,8 @@ var Scallop = class {
5874
6343
  await this._address.read();
5875
6344
  const scallopQuery = new ScallopQuery(this.params, {
5876
6345
  suiKit: this.suiKit,
5877
- address: this._address
6346
+ address: this._address,
6347
+ cache: this.cache
5878
6348
  });
5879
6349
  return scallopQuery;
5880
6350
  }
@@ -5884,7 +6354,9 @@ var Scallop = class {
5884
6354
  * @return Scallop Indexer.
5885
6355
  */
5886
6356
  async createScallopIndexer() {
5887
- const scallopIndexer = new ScallopIndexer();
6357
+ const scallopIndexer = new ScallopIndexer(this.params, {
6358
+ cache: this.cache
6359
+ });
5888
6360
  return scallopIndexer;
5889
6361
  }
5890
6362
  /**
@@ -5897,7 +6369,8 @@ var Scallop = class {
5897
6369
  await this._address.read();
5898
6370
  const scallopUtils = new ScallopUtils(this.params, {
5899
6371
  suiKit: this.suiKit,
5900
- address: this._address
6372
+ address: this._address,
6373
+ cache: this.cache
5901
6374
  });
5902
6375
  return scallopUtils;
5903
6376
  }
@@ -5926,6 +6399,7 @@ export {
5926
6399
  Scallop,
5927
6400
  ScallopAddress,
5928
6401
  ScallopBuilder,
6402
+ ScallopCache,
5929
6403
  ScallopClient,
5930
6404
  ScallopIndexer,
5931
6405
  ScallopQuery,