@scallop-io/sui-scallop-sdk 1.3.3-alpha.1 → 1.3.3

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.
@@ -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 {
@@ -37,7 +38,6 @@ import {
37
38
  } from '../types';
38
39
  import BigNumber from 'bignumber.js';
39
40
  import { getSupplyLimit } from './supplyLimit';
40
- import { isIsolatedAsset } from './isolatedAsset';
41
41
  // import { isIsolatedAsset } from './isolatedAsset';
42
42
 
43
43
  /**
@@ -156,8 +156,8 @@ export const queryMarket = async (
156
156
  borrowFee: parsedMarketPoolData.borrowFee,
157
157
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
158
158
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
159
- isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
160
- // isIsolated: false,
159
+ // isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
160
+ isIsolated: false,
161
161
  maxSupplyCoin,
162
162
  ...calculatedMarketPoolData,
163
163
  };
@@ -204,7 +204,6 @@ export const queryMarket = async (
204
204
  liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
205
205
  liquidationReserveFactor:
206
206
  parsedMarketCollateralData.liquidationReserveFactor,
207
- isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),
208
207
  ...calculatedMarketCollateralData,
209
208
  };
210
209
  }
@@ -294,129 +293,122 @@ export const getMarketPool = async (
294
293
  indexer: boolean = false,
295
294
  marketObject?: SuiObjectData | null,
296
295
  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
- );
296
+ ) => {
297
+ let marketPool: MarketPool | undefined;
298
+ let balanceSheet: BalanceSheet | undefined;
299
+ let borrowIndex: BorrowIndex | undefined;
300
+ let interestModel: InterestModel | undefined;
301
+ let borrowFeeRate: { value: string } | undefined;
309
302
 
310
- return marketPoolIndexer;
311
- }
303
+ coinPrice =
304
+ coinPrice ||
305
+ (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
312
306
 
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
- });
307
+ if (indexer) {
308
+ const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
309
+ marketPoolIndexer.coinPrice = coinPrice || marketPoolIndexer.coinPrice;
310
+ marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
311
+ marketPoolIndexer.coinName
312
+ );
340
313
 
341
- const balanceSheetDynamicFieldObject =
342
- balanceSheetDynamicFieldObjectResponse?.data;
314
+ return marketPoolIndexer;
315
+ }
343
316
 
344
- if (
345
- !(
317
+ const marketId = query.address.get('core.market');
318
+ marketObject =
319
+ marketObject ||
320
+ (
321
+ await query.cache.queryGetObject(marketId, {
322
+ showContent: true,
323
+ })
324
+ )?.data;
325
+
326
+ if (marketObject) {
327
+ if (marketObject.content && 'fields' in marketObject.content) {
328
+ const fields = marketObject.content.fields as any;
329
+ const coinType = query.utils.parseCoinType(poolCoinName);
330
+ // Get balance sheet.
331
+ const balanceSheetParentId =
332
+ fields.vault.fields.balance_sheets.fields.table.fields.id.id;
333
+ const balanceSheetDynamicFieldObjectResponse =
334
+ await query.cache.queryGetDynamicFieldObject({
335
+ parentId: balanceSheetParentId,
336
+ name: {
337
+ type: '0x1::type_name::TypeName',
338
+ value: {
339
+ name: coinType.substring(2),
340
+ },
341
+ },
342
+ });
343
+ if (!balanceSheetDynamicFieldObjectResponse) return undefined;
344
+
345
+ const balanceSheetDynamicFieldObject =
346
+ balanceSheetDynamicFieldObjectResponse.data;
347
+ if (
346
348
  balanceSheetDynamicFieldObject &&
347
349
  balanceSheetDynamicFieldObject.content &&
348
350
  '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),
351
+ ) {
352
+ const dynamicFields = balanceSheetDynamicFieldObject.content
353
+ .fields as any;
354
+ balanceSheet = dynamicFields.value.fields;
355
+ }
356
+
357
+ // Get borrow index.
358
+ const borrowIndexParentId =
359
+ fields.borrow_dynamics.fields.table.fields.id.id;
360
+ const borrowIndexDynamicFieldObjectResponse =
361
+ await query.cache.queryGetDynamicFieldObject({
362
+ parentId: borrowIndexParentId,
363
+ name: {
364
+ type: '0x1::type_name::TypeName',
365
+ value: {
366
+ name: coinType.substring(2),
367
+ },
368
368
  },
369
- },
370
- });
369
+ });
370
+ if (!borrowIndexDynamicFieldObjectResponse) return undefined;
371
371
 
372
- const borrowIndexDynamicFieldObject =
373
- borrowIndexDynamicFieldObjectResponse?.data;
374
- if (
375
- !(
372
+ const borrowIndexDynamicFieldObject =
373
+ borrowIndexDynamicFieldObjectResponse.data;
374
+ if (
376
375
  borrowIndexDynamicFieldObject &&
377
376
  borrowIndexDynamicFieldObject.content &&
378
377
  '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),
378
+ ) {
379
+ const dynamicFields = borrowIndexDynamicFieldObject.content
380
+ .fields as any;
381
+ borrowIndex = dynamicFields.value.fields;
382
+ }
383
+
384
+ // Get interest models.
385
+ const interestModelParentId =
386
+ fields.interest_models.fields.table.fields.id.id;
387
+ const interestModelDynamicFieldObjectResponse =
388
+ await query.cache.queryGetDynamicFieldObject({
389
+ parentId: interestModelParentId,
390
+ name: {
391
+ type: '0x1::type_name::TypeName',
392
+ value: {
393
+ name: coinType.substring(2),
394
+ },
398
395
  },
399
- },
400
- });
396
+ });
401
397
 
402
- const interestModelDynamicFieldObject =
403
- interestModelDynamicFieldObjectResponse?.data;
404
- if (
405
- !(
398
+ if (!interestModelDynamicFieldObjectResponse) return undefined;
399
+ const interestModelDynamicFieldObject =
400
+ interestModelDynamicFieldObjectResponse.data;
401
+ if (
406
402
  interestModelDynamicFieldObject &&
407
403
  interestModelDynamicFieldObject.content &&
408
404
  '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;
405
+ ) {
406
+ const dynamicFields = interestModelDynamicFieldObject.content
407
+ .fields as any;
408
+ interestModel = dynamicFields.value.fields;
409
+ }
417
410
 
418
- // Get borrow fee.
419
- const getBorrowFee = async () => {
411
+ // Get borrow fee.
420
412
  const borrowFeeDynamicFieldObjectResponse =
421
413
  await query.cache.queryGetDynamicFieldObject({
422
414
  parentId: marketId,
@@ -430,19 +422,26 @@ export const getMarketPool = async (
430
422
  },
431
423
  });
432
424
 
425
+ if (!borrowFeeDynamicFieldObjectResponse) return undefined;
433
426
  const borrowFeeDynamicFieldObject =
434
- borrowFeeDynamicFieldObjectResponse?.data;
427
+ borrowFeeDynamicFieldObjectResponse.data;
435
428
  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
- };
429
+ borrowFeeDynamicFieldObject &&
430
+ borrowFeeDynamicFieldObject.content &&
431
+ 'fields' in borrowFeeDynamicFieldObject.content
432
+ ) {
433
+ const dynamicFields = borrowFeeDynamicFieldObject.content.fields as any;
434
+ borrowFeeRate = dynamicFields.value.fields;
435
+ }
436
+ }
437
+ }
445
438
 
439
+ if (
440
+ balanceSheet &&
441
+ borrowIndex &&
442
+ interestModel &&
443
+ (USE_TEST_ADDRESS || borrowFeeRate)
444
+ ) {
446
445
  const parsedMarketPoolData = parseOriginMarketPoolData({
447
446
  type: interestModel.type.fields,
448
447
  maxBorrowRate: interestModel.max_borrow_rate.fields,
@@ -456,7 +455,7 @@ export const getMarketPool = async (
456
455
  reserve: balanceSheet.revenue,
457
456
  reserveFactor: interestModel.revenue_factor.fields,
458
457
  borrowWeight: interestModel.borrow_weight.fields,
459
- borrowFeeRate: await getBorrowFee(),
458
+ borrowFeeRate: borrowFeeRate || { value: '0' },
460
459
  baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
461
460
  borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
462
461
  borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
@@ -477,7 +476,7 @@ export const getMarketPool = async (
477
476
  .shiftedBy(-coinDecimal)
478
477
  .toNumber();
479
478
 
480
- return {
479
+ marketPool = {
481
480
  coinName: poolCoinName,
482
481
  symbol: query.utils.parseSymbol(poolCoinName),
483
482
  coinType: query.utils.parseCoinType(poolCoinName),
@@ -496,13 +495,13 @@ export const getMarketPool = async (
496
495
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
497
496
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
498
497
  maxSupplyCoin,
499
- isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
500
- // isIsolated: false,
498
+ // isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
499
+ isIsolated: false,
501
500
  ...calculatedMarketPoolData,
502
501
  };
503
- } catch (e) {
504
- console.error(e);
505
502
  }
503
+
504
+ return marketPool;
506
505
  };
507
506
 
508
507
  /**
@@ -580,7 +579,7 @@ export const getMarketCollateral = async (
580
579
  indexer: boolean = false,
581
580
  marketObject?: SuiObjectData | null,
582
581
  coinPrice?: number
583
- ): Promise<MarketCollateral | undefined> => {
582
+ ) => {
584
583
  coinPrice =
585
584
  coinPrice ||
586
585
  (await query.utils.getCoinPrices([collateralCoinName]))?.[
@@ -599,9 +598,9 @@ export const getMarketCollateral = async (
599
598
  return marketCollateralIndexer;
600
599
  }
601
600
 
602
- // let marketCollateral: MarketCollateral | undefined;
603
- // let riskModel: RiskModel | undefined;
604
- // let collateralStat: CollateralStat | undefined;
601
+ let marketCollateral: MarketCollateral | undefined;
602
+ let riskModel: RiskModel | undefined;
603
+ let collateralStat: CollateralStat | undefined;
605
604
 
606
605
  const marketId = query.address.get('core.market');
607
606
  marketObject =
@@ -612,106 +611,101 @@ export const getMarketCollateral = async (
612
611
  })
613
612
  )?.data;
614
613
 
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
- });
614
+ if (marketObject) {
615
+ if (marketObject.content && 'fields' in marketObject.content) {
616
+ const fields = marketObject.content.fields as any;
617
+ const coinType = query.utils.parseCoinType(collateralCoinName);
633
618
 
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 ftech riskModelDynamicFieldObject for ${riskModelDynamicFieldObjectResponse?.error?.code.toString()}: `
644
- );
619
+ // Get risk model.
620
+ const riskModelParentId = fields.risk_models.fields.table.fields.id.id;
621
+ const riskModelDynamicFieldObjectResponse =
622
+ await query.cache.queryGetDynamicFieldObject({
623
+ parentId: riskModelParentId,
624
+ name: {
625
+ type: '0x1::type_name::TypeName',
626
+ value: {
627
+ name: coinType.substring(2),
628
+ },
629
+ },
630
+ });
645
631
 
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
- });
632
+ if (!riskModelDynamicFieldObjectResponse) return undefined;
633
+ const riskModelDynamicFieldObject =
634
+ riskModelDynamicFieldObjectResponse.data;
635
+ if (
636
+ riskModelDynamicFieldObject &&
637
+ riskModelDynamicFieldObject.content &&
638
+ 'fields' in riskModelDynamicFieldObject.content
639
+ ) {
640
+ const dynamicFields = riskModelDynamicFieldObject.content.fields as any;
641
+ riskModel = dynamicFields.value.fields;
642
+ }
663
643
 
664
- const collateralStatDynamicFieldObject =
665
- collateralStatDynamicFieldObjectResponse?.data;
644
+ // Get collateral stat.
645
+ const collateralStatParentId =
646
+ fields.collateral_stats.fields.table.fields.id.id;
647
+ const collateralStatDynamicFieldObjectResponse =
648
+ await query.cache.queryGetDynamicFieldObject({
649
+ parentId: collateralStatParentId,
650
+ name: {
651
+ type: '0x1::type_name::TypeName',
652
+ value: {
653
+ name: coinType.substring(2),
654
+ },
655
+ },
656
+ });
666
657
 
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
- );
658
+ if (!collateralStatDynamicFieldObjectResponse) return undefined;
659
+ const collateralStatDynamicFieldObject =
660
+ collateralStatDynamicFieldObjectResponse.data;
661
+ if (
662
+ collateralStatDynamicFieldObject &&
663
+ collateralStatDynamicFieldObject.content &&
664
+ 'fields' in collateralStatDynamicFieldObject.content
665
+ ) {
666
+ const dynamicFields = collateralStatDynamicFieldObject.content
667
+ .fields as any;
668
+ collateralStat = dynamicFields.value.fields;
669
+ }
670
+ }
671
+ }
677
672
 
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
- });
673
+ if (riskModel && collateralStat) {
674
+ const parsedMarketCollateralData = parseOriginMarketCollateralData({
675
+ type: riskModel.type.fields,
676
+ collateralFactor: riskModel.collateral_factor.fields,
677
+ liquidationFactor: riskModel.liquidation_factor.fields,
678
+ liquidationDiscount: riskModel.liquidation_discount.fields,
679
+ liquidationPanelty: riskModel.liquidation_penalty.fields,
680
+ liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,
681
+ maxCollateralAmount: riskModel.max_collateral_amount,
682
+ totalCollateralAmount: collateralStat.amount,
683
+ });
692
684
 
693
- const calculatedMarketCollateralData = calculateMarketCollateralData(
694
- query.utils,
695
- parsedMarketCollateralData
696
- );
685
+ const calculatedMarketCollateralData = calculateMarketCollateralData(
686
+ query.utils,
687
+ parsedMarketCollateralData
688
+ );
697
689
 
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
- };
690
+ marketCollateral = {
691
+ coinName: collateralCoinName,
692
+ symbol: query.utils.parseSymbol(collateralCoinName),
693
+ coinType: query.utils.parseCoinType(collateralCoinName),
694
+ marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),
695
+ coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),
696
+ coinDecimal: query.utils.getCoinDecimal(collateralCoinName),
697
+ coinPrice: coinPrice ?? 0,
698
+ collateralFactor: parsedMarketCollateralData.collateralFactor,
699
+ liquidationFactor: parsedMarketCollateralData.liquidationFactor,
700
+ liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,
701
+ liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
702
+ liquidationReserveFactor:
703
+ parsedMarketCollateralData.liquidationReserveFactor,
704
+ ...calculatedMarketCollateralData,
705
+ };
706
+ }
707
+
708
+ return marketCollateral;
715
709
  };
716
710
 
717
711
  /**
@@ -741,6 +735,9 @@ export const getObligations = async (
741
735
  filter: {
742
736
  StructType: `${protocolObjectId}::obligation::ObligationKey`,
743
737
  },
738
+ options: {
739
+ showContent: true,
740
+ },
744
741
  cursor: nextCursor,
745
742
  limit: 10,
746
743
  });
@@ -759,17 +756,15 @@ export const getObligations = async (
759
756
  }
760
757
  } while (hasNextPage);
761
758
 
762
- const keyObjectIds: string[] = keyObjectsResponse
763
- .map((ref: any) => ref?.data?.objectId)
764
- .filter((id: any) => id !== undefined);
765
- const keyObjects = await address.cache.queryGetObjects(keyObjectIds);
759
+ const keyObjects = keyObjectsResponse.filter((ref) => !!ref.data);
766
760
 
767
761
  const obligations: Obligation[] = [];
768
762
  await Promise.allSettled(
769
- keyObjects.map(async (keyObject) => {
770
- const keyId = keyObject.objectId;
771
- if (keyObject.content && 'fields' in keyObject.content) {
772
- const fields = keyObject.content.fields as any;
763
+ keyObjects.map(async ({ data }) => {
764
+ const keyId = data?.objectId;
765
+ const content = data?.content;
766
+ if (keyId && content && 'fields' in content) {
767
+ const fields = content.fields as any;
773
768
  const obligationId = String(fields.ownership.fields.of);
774
769
  const locked = await getObligationLocked(address.cache, obligationId);
775
770
  obligations.push({ id: obligationId, keyId, locked });
@@ -18,6 +18,9 @@ const isolatedAssetZod = zod.object({
18
18
  }),
19
19
  });
20
20
 
21
+ const ISOLATED_ASSET_KEY =
22
+ '0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::IsolatedAssetKey';
23
+
21
24
  /**
22
25
  * Return list of isolated assets coin types
23
26
  * @param utils ScallopUtils
@@ -28,8 +31,6 @@ export const getIsolatedAssets = async (
28
31
  ): Promise<string[]> => {
29
32
  try {
30
33
  const marketObject = address.get('core.market');
31
- const protocolObject = address.get('core.packages.protocol.id');
32
- const ISOLATED_ASSET_KEY = `${protocolObject}::market_dynamic_keys::IsolatedAssetKey`;
33
34
  const isolatedAssets: string[] = [];
34
35
  if (!marketObject) return isolatedAssets;
35
36
 
@@ -82,8 +83,7 @@ export const isIsolatedAsset = async (
82
83
  ): Promise<boolean> => {
83
84
  try {
84
85
  const marketObject = utils.address.get('core.market');
85
- const protocolObject = utils.address.get('core.packages.protocol.id');
86
- const ISOLATED_ASSET_KEY = `${protocolObject}::market_dynamic_keys::IsolatedAssetKey`;
86
+
87
87
  // check if the coin type is in the list
88
88
  const cachedData = utils.address.cache.queryClient.getQueryData<string[]>([
89
89
  'getDynamicFields',
@@ -239,6 +239,7 @@ export const getLending = async (
239
239
  symbol: query.utils.parseSymbol(poolCoinName),
240
240
  coinType: query.utils.parseCoinType(poolCoinName),
241
241
  marketCoinType: query.utils.parseMarketCoinType(poolCoinName),
242
+ sCoinType: marketPool?.sCoinType ?? '',
242
243
  coinDecimal: coinDecimal,
243
244
  coinPrice: coinPrice ?? 0,
244
245
  conversionRate: marketPool?.conversionRate ?? 1,
@@ -10,6 +10,7 @@ export const queryVeScaKeyIdFromReferralBindings = async (
10
10
  refereeAddress: string
11
11
  ): Promise<string | null> => {
12
12
  const referralBindingTableId = address.get('referral.bindingTableId');
13
+
13
14
  const referralBindResponse = await address.cache.queryGetDynamicFieldObject({
14
15
  parentId: referralBindingTableId,
15
16
  name: {
@@ -114,7 +114,7 @@ export const getSpool = async (
114
114
  const coinName = query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);
115
115
  marketPool = marketPool || (await query.getMarketPool(coinName, indexer));
116
116
  if (!marketPool) {
117
- throw new Error('Failed to fetch marketPool');
117
+ throw new Error('Fail to fetch marketPool');
118
118
  }
119
119
 
120
120
  const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);
@@ -210,6 +210,7 @@ export const getSpool = async (
210
210
  rewardCoinType: isMarketCoin(rewardCoinName)
211
211
  ? query.utils.parseMarketCoinType(rewardCoinName)
212
212
  : query.utils.parseCoinType(rewardCoinName),
213
+ sCoinType: marketPool.sCoinType,
213
214
  coinDecimal: query.utils.getCoinDecimal(coinName),
214
215
  rewardCoinDecimal: query.utils.getCoinDecimal(rewardCoinName),
215
216
  coinPrice: coinPrices?.[coinName] ?? 0,