@scallop-io/sui-scallop-sdk 1.3.4-alpha.1 → 1.3.4-alpha.2

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 (102) hide show
  1. package/dist/index.js +550 -544
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.mjs +549 -544
  4. package/dist/index.mjs.map +1 -1
  5. package/package.json +2 -2
  6. package/src/builders/loyaltyProgramBuilder.ts +1 -1
  7. package/src/constants/common.ts +0 -1
  8. package/src/constants/enum.ts +12 -11
  9. package/src/constants/index.ts +0 -1
  10. package/src/constants/queryKeys.ts +1 -5
  11. package/src/constants/rpc.ts +16 -0
  12. package/src/constants/testAddress.ts +35 -76
  13. package/src/constants/tokenBucket.ts +1 -1
  14. package/src/models/scallop.ts +3 -2
  15. package/src/models/scallopAddress.ts +2 -2
  16. package/src/models/scallopBuilder.ts +7 -5
  17. package/src/models/scallopCache.ts +1 -1
  18. package/src/models/scallopClient.ts +27 -26
  19. package/src/models/scallopQuery.ts +61 -19
  20. package/src/models/scallopUtils.ts +74 -109
  21. package/src/models/suiKit.ts +11 -0
  22. package/src/queries/borrowIncentiveQuery.ts +6 -13
  23. package/src/queries/coreQuery.ts +245 -236
  24. package/src/queries/isolatedAsset.ts +4 -4
  25. package/src/queries/loyaltyProgramQuery.ts +1 -1
  26. package/src/queries/portfolioQuery.ts +58 -34
  27. package/src/queries/referralQuery.ts +1 -0
  28. package/src/queries/spoolQuery.ts +17 -17
  29. package/src/types/query/core.ts +0 -1
  30. package/src/utils/tokenBucket.ts +2 -1
  31. package/dist/builders/borrowIncentiveBuilder.d.ts +0 -12
  32. package/dist/builders/coreBuilder.d.ts +0 -12
  33. package/dist/builders/index.d.ts +0 -12
  34. package/dist/builders/loyaltyProgramBuilder.d.ts +0 -12
  35. package/dist/builders/oracle.d.ts +0 -14
  36. package/dist/builders/referralBuilder.d.ts +0 -12
  37. package/dist/builders/sCoinBuilder.d.ts +0 -4
  38. package/dist/builders/spoolBuilder.d.ts +0 -12
  39. package/dist/builders/vescaBuilder.d.ts +0 -25
  40. package/dist/constants/cache.d.ts +0 -14
  41. package/dist/constants/coinGecko.d.ts +0 -2
  42. package/dist/constants/common.d.ts +0 -20
  43. package/dist/constants/enum.d.ts +0 -13
  44. package/dist/constants/flashloan.d.ts +0 -2
  45. package/dist/constants/index.d.ts +0 -12
  46. package/dist/constants/poolAddress.d.ts +0 -5
  47. package/dist/constants/pyth.d.ts +0 -5
  48. package/dist/constants/queryKeys.d.ts +0 -59
  49. package/dist/constants/testAddress.d.ts +0 -2
  50. package/dist/constants/tokenBucket.d.ts +0 -2
  51. package/dist/constants/vesca.d.ts +0 -5
  52. package/dist/index.d.ts +0 -3
  53. package/dist/models/index.d.ts +0 -8
  54. package/dist/models/scallop.d.ts +0 -74
  55. package/dist/models/scallopAddress.d.ts +0 -150
  56. package/dist/models/scallopBuilder.d.ts +0 -89
  57. package/dist/models/scallopCache.d.ts +0 -74
  58. package/dist/models/scallopClient.d.ts +0 -321
  59. package/dist/models/scallopIndexer.d.ts +0 -89
  60. package/dist/models/scallopQuery.d.ts +0 -474
  61. package/dist/models/scallopUtils.d.ts +0 -222
  62. package/dist/queries/borrowIncentiveQuery.d.ts +0 -61
  63. package/dist/queries/coreQuery.d.ts +0 -167
  64. package/dist/queries/index.d.ts +0 -8
  65. package/dist/queries/isolatedAsset.d.ts +0 -14
  66. package/dist/queries/loyaltyProgramQuery.d.ts +0 -10
  67. package/dist/queries/portfolioQuery.d.ts +0 -73
  68. package/dist/queries/priceQuery.d.ts +0 -16
  69. package/dist/queries/referralQuery.d.ts +0 -7
  70. package/dist/queries/sCoinQuery.d.ts +0 -41
  71. package/dist/queries/spoolQuery.d.ts +0 -70
  72. package/dist/queries/supplyLimit.d.ts +0 -9
  73. package/dist/queries/vescaQuery.d.ts +0 -36
  74. package/dist/types/address.d.ts +0 -107
  75. package/dist/types/builder/borrowIncentive.d.ts +0 -35
  76. package/dist/types/builder/core.d.ts +0 -56
  77. package/dist/types/builder/index.d.ts +0 -24
  78. package/dist/types/builder/loyaltyProgram.d.ts +0 -23
  79. package/dist/types/builder/referral.d.ts +0 -30
  80. package/dist/types/builder/sCoin.d.ts +0 -37
  81. package/dist/types/builder/spool.d.ts +0 -29
  82. package/dist/types/builder/vesca.d.ts +0 -51
  83. package/dist/types/constant/common.d.ts +0 -24
  84. package/dist/types/constant/enum.d.ts +0 -48
  85. package/dist/types/constant/index.d.ts +0 -2
  86. package/dist/types/index.d.ts +0 -6
  87. package/dist/types/model.d.ts +0 -54
  88. package/dist/types/query/borrowIncentive.d.ts +0 -124
  89. package/dist/types/query/core.d.ts +0 -362
  90. package/dist/types/query/index.d.ts +0 -7
  91. package/dist/types/query/loyaltyProgram.d.ts +0 -5
  92. package/dist/types/query/portfolio.d.ts +0 -115
  93. package/dist/types/query/sCoin.d.ts +0 -1
  94. package/dist/types/query/spool.d.ts +0 -122
  95. package/dist/types/query/vesca.d.ts +0 -26
  96. package/dist/types/utils.d.ts +0 -21
  97. package/dist/utils/builder.d.ts +0 -15
  98. package/dist/utils/index.d.ts +0 -5
  99. package/dist/utils/indexer.d.ts +0 -17
  100. package/dist/utils/query.d.ts +0 -62
  101. package/dist/utils/tokenBucket.d.ts +0 -11
  102. package/dist/utils/util.d.ts +0 -26
@@ -4,6 +4,7 @@ import {
4
4
  PROTOCOL_OBJECT_ID,
5
5
  SUPPORT_COLLATERALS,
6
6
  BORROW_FEE_PROTOCOL_ID,
7
+ USE_TEST_ADDRESS,
7
8
  FlashLoanFeeObjectMap,
8
9
  } from '../constants';
9
10
  import {
@@ -34,10 +35,10 @@ import {
34
35
  CollateralStat,
35
36
  SupportMarketCoins,
36
37
  OptionalKeys,
38
+ CoinPrices,
37
39
  } from '../types';
38
40
  import BigNumber from 'bignumber.js';
39
41
  import { getSupplyLimit } from './supplyLimit';
40
- import { isIsolatedAsset } from './isolatedAsset';
41
42
  // import { isIsolatedAsset } from './isolatedAsset';
42
43
 
43
44
  /**
@@ -52,9 +53,10 @@ import { isIsolatedAsset } from './isolatedAsset';
52
53
  */
53
54
  export const queryMarket = async (
54
55
  query: ScallopQuery,
55
- indexer: boolean = false
56
+ indexer: boolean = false,
57
+ coinPrices?: CoinPrices
56
58
  ) => {
57
- const coinPrices = await query.utils.getCoinPrices();
59
+ coinPrices = coinPrices ?? (await query.utils.getCoinPrices()) ?? {};
58
60
 
59
61
  const pools: MarketPools = {};
60
62
  const collaterals: MarketCollaterals = {};
@@ -63,13 +65,13 @@ export const queryMarket = async (
63
65
  const marketIndexer = await query.indexer.getMarket();
64
66
 
65
67
  const updatePools = (item: MarketPool) => {
66
- item.coinPrice = coinPrices[item.coinName] || item.coinPrice;
68
+ item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;
67
69
  item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);
68
70
  pools[item.coinName] = item;
69
71
  };
70
72
 
71
73
  const updateCollaterals = (item: MarketCollateral) => {
72
- item.coinPrice = coinPrices[item.coinName] || item.coinPrice;
74
+ item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;
73
75
  item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);
74
76
  collaterals[item.coinName] = item;
75
77
  };
@@ -156,8 +158,8 @@ export const queryMarket = async (
156
158
  borrowFee: parsedMarketPoolData.borrowFee,
157
159
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
158
160
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
159
- isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
160
- // isIsolated: false,
161
+ // isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
162
+ isIsolated: false,
161
163
  maxSupplyCoin,
162
164
  ...calculatedMarketPoolData,
163
165
  };
@@ -204,7 +206,6 @@ export const queryMarket = async (
204
206
  liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
205
207
  liquidationReserveFactor:
206
208
  parsedMarketCollateralData.liquidationReserveFactor,
207
- isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),
208
209
  ...calculatedMarketCollateralData,
209
210
  };
210
211
  }
@@ -231,13 +232,14 @@ export const queryMarket = async (
231
232
  export const getMarketPools = async (
232
233
  query: ScallopQuery,
233
234
  poolCoinNames: SupportPoolCoins[] = [...SUPPORT_POOLS],
234
- indexer: boolean = false
235
+ indexer: boolean = false,
236
+ coinPrices?: CoinPrices
235
237
  ) => {
236
238
  const marketId = query.address.get('core.market');
237
239
  const marketObjectResponse = await query.cache.queryGetObject(marketId, {
238
240
  showContent: true,
239
241
  });
240
- const coinPrices = (await query.utils.getCoinPrices(poolCoinNames)) ?? {};
242
+ coinPrices = (await query.utils.getCoinPrices(poolCoinNames)) ?? {};
241
243
 
242
244
  const marketPools: MarketPools = {};
243
245
 
@@ -247,7 +249,7 @@ export const getMarketPools = async (
247
249
  const updateMarketPool = (marketPool: MarketPool) => {
248
250
  if (!poolCoinNames.includes(marketPool.coinName)) return;
249
251
  marketPool.coinPrice =
250
- coinPrices[marketPool.coinName] || marketPool.coinPrice;
252
+ coinPrices[marketPool.coinName] ?? marketPool.coinPrice;
251
253
  marketPool.coinWrappedType = query.utils.getCoinWrappedType(
252
254
  marketPool.coinName
253
255
  );
@@ -294,129 +296,131 @@ export const getMarketPool = async (
294
296
  indexer: boolean = false,
295
297
  marketObject?: SuiObjectData | null,
296
298
  coinPrice?: number
297
- ): Promise<MarketPool | undefined> => {
298
- try {
299
- coinPrice =
300
- coinPrice ||
301
- (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
302
-
303
- if (indexer) {
304
- const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
305
- marketPoolIndexer.coinPrice = coinPrice || marketPoolIndexer.coinPrice;
306
- marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
307
- marketPoolIndexer.coinName
308
- );
299
+ ) => {
300
+ let marketPool: MarketPool | undefined;
301
+ let balanceSheet: BalanceSheet | undefined;
302
+ let borrowIndex: BorrowIndex | undefined;
303
+ let interestModel: InterestModel | undefined;
304
+ let borrowFeeRate: { value: string } | undefined;
309
305
 
310
- return marketPoolIndexer;
311
- }
306
+ coinPrice =
307
+ coinPrice ??
308
+ (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
312
309
 
313
- const marketId = query.address.get('core.market');
314
- marketObject =
315
- marketObject ||
316
- (
317
- await query.cache.queryGetObject(marketId, {
318
- showContent: true,
319
- })
320
- )?.data;
321
-
322
- if (!(marketObject && marketObject.content?.dataType === 'moveObject'))
323
- throw new Error(`Failed to fetch marketObject`);
324
-
325
- const fields = marketObject.content.fields as any;
326
- const coinType = query.utils.parseCoinType(poolCoinName);
327
- // Get balance sheet.
328
- const balanceSheetParentId =
329
- fields.vault.fields.balance_sheets.fields.table.fields.id.id;
330
- const balanceSheetDynamicFieldObjectResponse =
331
- await query.cache.queryGetDynamicFieldObject({
332
- parentId: balanceSheetParentId,
333
- name: {
334
- type: '0x1::type_name::TypeName',
335
- value: {
336
- name: coinType.substring(2),
337
- },
338
- },
339
- });
310
+ if (indexer) {
311
+ const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
312
+ marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;
313
+ marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
314
+ marketPoolIndexer.coinName
315
+ );
340
316
 
341
- const balanceSheetDynamicFieldObject =
342
- balanceSheetDynamicFieldObjectResponse?.data;
317
+ return marketPoolIndexer;
318
+ }
343
319
 
344
- if (
345
- !(
320
+ const marketId = query.address.get('core.market');
321
+ marketObject =
322
+ marketObject ??
323
+ (
324
+ await query.cache.queryGetObject(marketId, {
325
+ showContent: true,
326
+ })
327
+ )?.data;
328
+
329
+ if (marketObject) {
330
+ if (marketObject.content && 'fields' in marketObject.content) {
331
+ const fields = marketObject.content.fields as any;
332
+ const coinType = query.utils.parseCoinType(poolCoinName);
333
+ // Get balance sheet.
334
+ const balanceSheetParentId =
335
+ fields.vault.fields.balance_sheets.fields.table.fields.id.id;
336
+ const balanceSheetDynamicFieldObjectResponse =
337
+ await query.cache.queryGetDynamicFieldObject({
338
+ parentId: balanceSheetParentId,
339
+ name: {
340
+ type: '0x1::type_name::TypeName',
341
+ value: {
342
+ name: coinType.substring(2),
343
+ },
344
+ },
345
+ });
346
+ if (!balanceSheetDynamicFieldObjectResponse)
347
+ throw new Error(
348
+ `Failed to fetch balanceSheetDynamicFieldObjectResponse for ${poolCoinName}`
349
+ );
350
+
351
+ const balanceSheetDynamicFieldObject =
352
+ balanceSheetDynamicFieldObjectResponse.data;
353
+ if (
346
354
  balanceSheetDynamicFieldObject &&
347
355
  balanceSheetDynamicFieldObject.content &&
348
356
  'fields' in balanceSheetDynamicFieldObject.content
349
- )
350
- )
351
- throw new Error(
352
- `Failed to fetch balanceSheetDynamicFieldObject for ${poolCoinName}: ${balanceSheetDynamicFieldObjectResponse?.error?.code.toString()}`
353
- );
354
- const balanceSheet: BalanceSheet = (
355
- balanceSheetDynamicFieldObject.content.fields as any
356
- ).value.fields;
357
-
358
- // Get borrow index.
359
- const borrowIndexParentId =
360
- fields.borrow_dynamics.fields.table.fields.id.id;
361
- const borrowIndexDynamicFieldObjectResponse =
362
- await query.cache.queryGetDynamicFieldObject({
363
- parentId: borrowIndexParentId,
364
- name: {
365
- type: '0x1::type_name::TypeName',
366
- value: {
367
- name: coinType.substring(2),
357
+ ) {
358
+ const dynamicFields = balanceSheetDynamicFieldObject.content
359
+ .fields as any;
360
+ balanceSheet = dynamicFields.value.fields;
361
+ }
362
+
363
+ // Get borrow index.
364
+ const borrowIndexParentId =
365
+ fields.borrow_dynamics.fields.table.fields.id.id;
366
+ const borrowIndexDynamicFieldObjectResponse =
367
+ await query.cache.queryGetDynamicFieldObject({
368
+ parentId: borrowIndexParentId,
369
+ name: {
370
+ type: '0x1::type_name::TypeName',
371
+ value: {
372
+ name: coinType.substring(2),
373
+ },
368
374
  },
369
- },
370
- });
375
+ });
376
+ if (!borrowIndexDynamicFieldObjectResponse)
377
+ throw new Error(
378
+ `Failed to fetch borrowIndexDynamicFieldObjectResponse for ${poolCoinName}`
379
+ );
371
380
 
372
- const borrowIndexDynamicFieldObject =
373
- borrowIndexDynamicFieldObjectResponse?.data;
374
- if (
375
- !(
381
+ const borrowIndexDynamicFieldObject =
382
+ borrowIndexDynamicFieldObjectResponse.data;
383
+ if (
376
384
  borrowIndexDynamicFieldObject &&
377
385
  borrowIndexDynamicFieldObject.content &&
378
386
  'fields' in borrowIndexDynamicFieldObject.content
379
- )
380
- )
381
- throw new Error(
382
- `Failed to fetch borrowIndexDynamicFieldObject for ${poolCoinName}`
383
- );
384
- const borrowIndex: BorrowIndex = (
385
- borrowIndexDynamicFieldObject.content.fields as any
386
- ).value.fields;
387
-
388
- // Get interest models.
389
- const interestModelParentId =
390
- fields.interest_models.fields.table.fields.id.id;
391
- const interestModelDynamicFieldObjectResponse =
392
- await query.cache.queryGetDynamicFieldObject({
393
- parentId: interestModelParentId,
394
- name: {
395
- type: '0x1::type_name::TypeName',
396
- value: {
397
- name: coinType.substring(2),
387
+ ) {
388
+ const dynamicFields = borrowIndexDynamicFieldObject.content
389
+ .fields as any;
390
+ borrowIndex = dynamicFields.value.fields;
391
+ }
392
+
393
+ // Get interest models.
394
+ const interestModelParentId =
395
+ fields.interest_models.fields.table.fields.id.id;
396
+ const interestModelDynamicFieldObjectResponse =
397
+ await query.cache.queryGetDynamicFieldObject({
398
+ parentId: interestModelParentId,
399
+ name: {
400
+ type: '0x1::type_name::TypeName',
401
+ value: {
402
+ name: coinType.substring(2),
403
+ },
398
404
  },
399
- },
400
- });
405
+ });
401
406
 
402
- const interestModelDynamicFieldObject =
403
- interestModelDynamicFieldObjectResponse?.data;
404
- if (
405
- !(
407
+ if (!interestModelDynamicFieldObjectResponse)
408
+ throw new Error(
409
+ `Failed to fetch interestModelDynamicFieldObjectResponse for ${poolCoinName}`
410
+ );
411
+ const interestModelDynamicFieldObject =
412
+ interestModelDynamicFieldObjectResponse.data;
413
+ if (
406
414
  interestModelDynamicFieldObject &&
407
415
  interestModelDynamicFieldObject.content &&
408
416
  'fields' in interestModelDynamicFieldObject.content
409
- )
410
- )
411
- throw new Error(
412
- `Failed to fetch interestModelDynamicFieldObject for ${poolCoinName}: ${interestModelDynamicFieldObject}`
413
- );
414
- const interestModel: InterestModel = (
415
- interestModelDynamicFieldObject.content.fields as any
416
- ).value.fields;
417
+ ) {
418
+ const dynamicFields = interestModelDynamicFieldObject.content
419
+ .fields as any;
420
+ interestModel = dynamicFields.value.fields;
421
+ }
417
422
 
418
- // Get borrow fee.
419
- const getBorrowFee = async () => {
423
+ // Get borrow fee.
420
424
  const borrowFeeDynamicFieldObjectResponse =
421
425
  await query.cache.queryGetDynamicFieldObject({
422
426
  parentId: marketId,
@@ -430,19 +434,29 @@ export const getMarketPool = async (
430
434
  },
431
435
  });
432
436
 
437
+ if (!borrowFeeDynamicFieldObjectResponse)
438
+ throw new Error(
439
+ `Failed to fetch borrowFeeDynamicFieldObjectResponse for ${poolCoinName}`
440
+ );
433
441
  const borrowFeeDynamicFieldObject =
434
- borrowFeeDynamicFieldObjectResponse?.data;
442
+ borrowFeeDynamicFieldObjectResponse.data;
435
443
  if (
436
- !(
437
- borrowFeeDynamicFieldObject &&
438
- borrowFeeDynamicFieldObject.content &&
439
- 'fields' in borrowFeeDynamicFieldObject.content
440
- )
441
- )
442
- return { value: '0' };
443
- return (borrowFeeDynamicFieldObject.content.fields as any).value.fields;
444
- };
444
+ borrowFeeDynamicFieldObject &&
445
+ borrowFeeDynamicFieldObject.content &&
446
+ 'fields' in borrowFeeDynamicFieldObject.content
447
+ ) {
448
+ const dynamicFields = borrowFeeDynamicFieldObject.content.fields as any;
449
+ borrowFeeRate = dynamicFields.value.fields;
450
+ }
451
+ }
452
+ }
445
453
 
454
+ if (
455
+ balanceSheet &&
456
+ borrowIndex &&
457
+ interestModel &&
458
+ (USE_TEST_ADDRESS || borrowFeeRate)
459
+ ) {
446
460
  const parsedMarketPoolData = parseOriginMarketPoolData({
447
461
  type: interestModel.type.fields,
448
462
  maxBorrowRate: interestModel.max_borrow_rate.fields,
@@ -456,7 +470,7 @@ export const getMarketPool = async (
456
470
  reserve: balanceSheet.revenue,
457
471
  reserveFactor: interestModel.revenue_factor.fields,
458
472
  borrowWeight: interestModel.borrow_weight.fields,
459
- borrowFeeRate: await getBorrowFee(),
473
+ borrowFeeRate: borrowFeeRate ?? { value: '0' },
460
474
  baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
461
475
  borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
462
476
  borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
@@ -477,7 +491,7 @@ export const getMarketPool = async (
477
491
  .shiftedBy(-coinDecimal)
478
492
  .toNumber();
479
493
 
480
- return {
494
+ marketPool = {
481
495
  coinName: poolCoinName,
482
496
  symbol: query.utils.parseSymbol(poolCoinName),
483
497
  coinType: query.utils.parseCoinType(poolCoinName),
@@ -496,13 +510,13 @@ export const getMarketPool = async (
496
510
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
497
511
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
498
512
  maxSupplyCoin,
499
- isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
500
- // isIsolated: false,
513
+ // isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
514
+ isIsolated: false,
501
515
  ...calculatedMarketPoolData,
502
516
  };
503
- } catch (e) {
504
- console.error(e);
505
517
  }
518
+
519
+ return marketPool;
506
520
  };
507
521
 
508
522
  /**
@@ -532,7 +546,7 @@ export const getMarketCollaterals = async (
532
546
  const updateMarketCollateral = (marketCollateral: MarketCollateral) => {
533
547
  if (!collateralCoinNames.includes(marketCollateral.coinName)) return;
534
548
  marketCollateral.coinPrice =
535
- coinPrices[marketCollateral.coinName] || marketCollateral.coinPrice;
549
+ coinPrices[marketCollateral.coinName] ?? marketCollateral.coinPrice;
536
550
  marketCollateral.coinWrappedType = query.utils.getCoinWrappedType(
537
551
  marketCollateral.coinName
538
552
  );
@@ -580,7 +594,7 @@ export const getMarketCollateral = async (
580
594
  indexer: boolean = false,
581
595
  marketObject?: SuiObjectData | null,
582
596
  coinPrice?: number
583
- ): Promise<MarketCollateral | undefined> => {
597
+ ) => {
584
598
  coinPrice =
585
599
  coinPrice ||
586
600
  (await query.utils.getCoinPrices([collateralCoinName]))?.[
@@ -591,7 +605,7 @@ export const getMarketCollateral = async (
591
605
  const marketCollateralIndexer =
592
606
  await query.indexer.getMarketCollateral(collateralCoinName);
593
607
  marketCollateralIndexer.coinPrice =
594
- coinPrice || marketCollateralIndexer.coinPrice;
608
+ coinPrice ?? marketCollateralIndexer.coinPrice;
595
609
  marketCollateralIndexer.coinWrappedType = query.utils.getCoinWrappedType(
596
610
  marketCollateralIndexer.coinName
597
611
  );
@@ -599,9 +613,9 @@ export const getMarketCollateral = async (
599
613
  return marketCollateralIndexer;
600
614
  }
601
615
 
602
- // let marketCollateral: MarketCollateral | undefined;
603
- // let riskModel: RiskModel | undefined;
604
- // let collateralStat: CollateralStat | undefined;
616
+ let marketCollateral: MarketCollateral | undefined;
617
+ let riskModel: RiskModel | undefined;
618
+ let collateralStat: CollateralStat | undefined;
605
619
 
606
620
  const marketId = query.address.get('core.market');
607
621
  marketObject =
@@ -612,106 +626,101 @@ export const getMarketCollateral = async (
612
626
  })
613
627
  )?.data;
614
628
 
615
- if (!(marketObject && marketObject.content?.dataType === 'moveObject'))
616
- throw new Error(`Failed to fetch marketObject`);
617
-
618
- const fields = marketObject.content.fields as any;
619
- const coinType = query.utils.parseCoinType(collateralCoinName);
620
-
621
- // Get risk model.
622
- const riskModelParentId = fields.risk_models.fields.table.fields.id.id;
623
- const riskModelDynamicFieldObjectResponse =
624
- await query.cache.queryGetDynamicFieldObject({
625
- parentId: riskModelParentId,
626
- name: {
627
- type: '0x1::type_name::TypeName',
628
- value: {
629
- name: coinType.substring(2),
630
- },
631
- },
632
- });
629
+ if (marketObject) {
630
+ if (marketObject.content && 'fields' in marketObject.content) {
631
+ const fields = marketObject.content.fields as any;
632
+ const coinType = query.utils.parseCoinType(collateralCoinName);
633
633
 
634
- const riskModelDynamicFieldObject = riskModelDynamicFieldObjectResponse?.data;
635
- if (
636
- !(
637
- riskModelDynamicFieldObject &&
638
- riskModelDynamicFieldObject.content &&
639
- 'fields' in riskModelDynamicFieldObject.content
640
- )
641
- )
642
- throw new Error(
643
- `Failed to fetch riskModelDynamicFieldObject for ${riskModelDynamicFieldObjectResponse?.error?.code.toString()}: `
644
- );
634
+ // Get risk model.
635
+ const riskModelParentId = fields.risk_models.fields.table.fields.id.id;
636
+ const riskModelDynamicFieldObjectResponse =
637
+ await query.cache.queryGetDynamicFieldObject({
638
+ parentId: riskModelParentId,
639
+ name: {
640
+ type: '0x1::type_name::TypeName',
641
+ value: {
642
+ name: coinType.substring(2),
643
+ },
644
+ },
645
+ });
645
646
 
646
- const riskModel: RiskModel = (
647
- riskModelDynamicFieldObject.content.fields as any
648
- ).value.fields;
649
-
650
- // Get collateral stat.
651
- const collateralStatParentId =
652
- fields.collateral_stats.fields.table.fields.id.id;
653
- const collateralStatDynamicFieldObjectResponse =
654
- await query.cache.queryGetDynamicFieldObject({
655
- parentId: collateralStatParentId,
656
- name: {
657
- type: '0x1::type_name::TypeName',
658
- value: {
659
- name: coinType.substring(2),
660
- },
661
- },
662
- });
647
+ if (!riskModelDynamicFieldObjectResponse) return undefined;
648
+ const riskModelDynamicFieldObject =
649
+ riskModelDynamicFieldObjectResponse.data;
650
+ if (
651
+ riskModelDynamicFieldObject &&
652
+ riskModelDynamicFieldObject.content &&
653
+ 'fields' in riskModelDynamicFieldObject.content
654
+ ) {
655
+ const dynamicFields = riskModelDynamicFieldObject.content.fields as any;
656
+ riskModel = dynamicFields.value.fields;
657
+ }
663
658
 
664
- const collateralStatDynamicFieldObject =
665
- collateralStatDynamicFieldObjectResponse?.data;
659
+ // Get collateral stat.
660
+ const collateralStatParentId =
661
+ fields.collateral_stats.fields.table.fields.id.id;
662
+ const collateralStatDynamicFieldObjectResponse =
663
+ await query.cache.queryGetDynamicFieldObject({
664
+ parentId: collateralStatParentId,
665
+ name: {
666
+ type: '0x1::type_name::TypeName',
667
+ value: {
668
+ name: coinType.substring(2),
669
+ },
670
+ },
671
+ });
666
672
 
667
- if (
668
- !(
669
- collateralStatDynamicFieldObject &&
670
- collateralStatDynamicFieldObject.content &&
671
- 'fields' in collateralStatDynamicFieldObject.content
672
- )
673
- )
674
- throw new Error(
675
- `Failed to fetch collateralStatDynamicFieldObject for ${collateralCoinName}: ${collateralStatDynamicFieldObjectResponse?.error?.code.toString()}`
676
- );
673
+ if (!collateralStatDynamicFieldObjectResponse) return undefined;
674
+ const collateralStatDynamicFieldObject =
675
+ collateralStatDynamicFieldObjectResponse.data;
676
+ if (
677
+ collateralStatDynamicFieldObject &&
678
+ collateralStatDynamicFieldObject.content &&
679
+ 'fields' in collateralStatDynamicFieldObject.content
680
+ ) {
681
+ const dynamicFields = collateralStatDynamicFieldObject.content
682
+ .fields as any;
683
+ collateralStat = dynamicFields.value.fields;
684
+ }
685
+ }
686
+ }
677
687
 
678
- const collateralStat: CollateralStat = (
679
- collateralStatDynamicFieldObject.content.fields as any
680
- ).value.fields;
681
-
682
- const parsedMarketCollateralData = parseOriginMarketCollateralData({
683
- type: riskModel.type.fields,
684
- collateralFactor: riskModel.collateral_factor.fields,
685
- liquidationFactor: riskModel.liquidation_factor.fields,
686
- liquidationDiscount: riskModel.liquidation_discount.fields,
687
- liquidationPanelty: riskModel.liquidation_penalty.fields,
688
- liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,
689
- maxCollateralAmount: riskModel.max_collateral_amount,
690
- totalCollateralAmount: collateralStat.amount,
691
- });
688
+ if (riskModel && collateralStat) {
689
+ const parsedMarketCollateralData = parseOriginMarketCollateralData({
690
+ type: riskModel.type.fields,
691
+ collateralFactor: riskModel.collateral_factor.fields,
692
+ liquidationFactor: riskModel.liquidation_factor.fields,
693
+ liquidationDiscount: riskModel.liquidation_discount.fields,
694
+ liquidationPanelty: riskModel.liquidation_penalty.fields,
695
+ liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,
696
+ maxCollateralAmount: riskModel.max_collateral_amount,
697
+ totalCollateralAmount: collateralStat.amount,
698
+ });
692
699
 
693
- const calculatedMarketCollateralData = calculateMarketCollateralData(
694
- query.utils,
695
- parsedMarketCollateralData
696
- );
700
+ const calculatedMarketCollateralData = calculateMarketCollateralData(
701
+ query.utils,
702
+ parsedMarketCollateralData
703
+ );
697
704
 
698
- return {
699
- coinName: collateralCoinName,
700
- symbol: query.utils.parseSymbol(collateralCoinName),
701
- coinType: query.utils.parseCoinType(collateralCoinName),
702
- marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),
703
- coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),
704
- coinDecimal: query.utils.getCoinDecimal(collateralCoinName),
705
- coinPrice: coinPrice ?? 0,
706
- collateralFactor: parsedMarketCollateralData.collateralFactor,
707
- liquidationFactor: parsedMarketCollateralData.liquidationFactor,
708
- liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,
709
- liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
710
- liquidationReserveFactor:
711
- parsedMarketCollateralData.liquidationReserveFactor,
712
- isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),
713
- ...calculatedMarketCollateralData,
714
- };
705
+ marketCollateral = {
706
+ coinName: collateralCoinName,
707
+ symbol: query.utils.parseSymbol(collateralCoinName),
708
+ coinType: query.utils.parseCoinType(collateralCoinName),
709
+ marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),
710
+ coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),
711
+ coinDecimal: query.utils.getCoinDecimal(collateralCoinName),
712
+ coinPrice: coinPrice ?? 0,
713
+ collateralFactor: parsedMarketCollateralData.collateralFactor,
714
+ liquidationFactor: parsedMarketCollateralData.liquidationFactor,
715
+ liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,
716
+ liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
717
+ liquidationReserveFactor:
718
+ parsedMarketCollateralData.liquidationReserveFactor,
719
+ ...calculatedMarketCollateralData,
720
+ };
721
+ }
722
+
723
+ return marketCollateral;
715
724
  };
716
725
 
717
726
  /**
@@ -730,7 +739,7 @@ export const getObligations = async (
730
739
  ownerAddress: string
731
740
  ) => {
732
741
  const owner = ownerAddress;
733
- const protocolObjectId = address.get('core.object') || PROTOCOL_OBJECT_ID;
742
+ const protocolObjectId = address.get('core.object') ?? PROTOCOL_OBJECT_ID;
734
743
  const keyObjectsResponse: SuiObjectResponse[] = [];
735
744
  let hasNextPage = false;
736
745
  let nextCursor: string | null | undefined = null;
@@ -860,7 +869,7 @@ export const getCoinAmounts = async (
860
869
  assetCoinNames: SupportAssetCoins[] = [...SUPPORT_POOLS],
861
870
  ownerAddress?: string
862
871
  ) => {
863
- const owner = ownerAddress || query.suiKit.currentAddress();
872
+ const owner = ownerAddress ?? query.suiKit.currentAddress();
864
873
  const assetCoins = {} as OptionalKeys<Record<SupportAssetCoins, number>>;
865
874
 
866
875
  await Promise.allSettled(
@@ -886,7 +895,7 @@ export const getCoinAmount = async (
886
895
  assetCoinName: SupportAssetCoins,
887
896
  ownerAddress?: string
888
897
  ) => {
889
- const owner = ownerAddress || query.suiKit.currentAddress();
898
+ const owner = ownerAddress ?? query.suiKit.currentAddress();
890
899
  const coinType = query.utils.parseCoinType(assetCoinName);
891
900
  const amount = await query.cache.queryGetCoinBalance({
892
901
  owner,
@@ -913,7 +922,7 @@ export const getMarketCoinAmounts = async (
913
922
  [...SUPPORT_POOLS].map((poolCoinName) =>
914
923
  query.utils.parseMarketCoinName(poolCoinName)
915
924
  );
916
- const owner = ownerAddress || query.suiKit.currentAddress();
925
+ const owner = ownerAddress ?? query.suiKit.currentAddress();
917
926
  const marketCoins = {} as OptionalKeys<Record<SupportMarketCoins, number>>;
918
927
 
919
928
  await Promise.allSettled(
@@ -943,7 +952,7 @@ export const getMarketCoinAmount = async (
943
952
  marketCoinName: SupportMarketCoins,
944
953
  ownerAddress?: string
945
954
  ) => {
946
- const owner = ownerAddress || query.suiKit.currentAddress();
955
+ const owner = ownerAddress ?? query.suiKit.currentAddress();
947
956
  const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);
948
957
  const amount = await query.cache.queryGetCoinBalance({
949
958
  owner,