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

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 (37) hide show
  1. package/dist/constants/coinGecko.d.ts +2 -0
  2. package/dist/constants/index.d.ts +7 -0
  3. package/dist/constants/poolAddress.d.ts +5 -0
  4. package/dist/constants/pyth.d.ts +2 -0
  5. package/dist/constants/queryKeys.d.ts +2 -1
  6. package/dist/index.js +1471 -1311
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +1463 -1311
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/models/scallopQuery.d.ts +4 -4
  11. package/dist/models/scallopUtils.d.ts +6 -1
  12. package/dist/queries/sCoinQuery.d.ts +1 -1
  13. package/dist/queries/spoolQuery.d.ts +1 -1
  14. package/dist/types/query/core.d.ts +1 -0
  15. package/dist/types/utils.d.ts +12 -0
  16. package/dist/utils/util.d.ts +2 -2
  17. package/package.json +1 -1
  18. package/src/constants/coinGecko.ts +18 -0
  19. package/src/constants/enum.ts +11 -4
  20. package/src/constants/index.ts +7 -0
  21. package/src/constants/poolAddress.ts +94 -0
  22. package/src/constants/pyth.ts +19 -0
  23. package/src/constants/queryKeys.ts +2 -2
  24. package/src/constants/testAddress.ts +76 -35
  25. package/src/models/scallopBuilder.ts +2 -3
  26. package/src/models/scallopQuery.ts +4 -3
  27. package/src/models/scallopUtils.ts +64 -29
  28. package/src/queries/coreQuery.ts +222 -216
  29. package/src/queries/isolatedAsset.ts +4 -4
  30. package/src/queries/portfolioQuery.ts +6 -9
  31. package/src/queries/referralQuery.ts +0 -1
  32. package/src/queries/spoolQuery.ts +1 -1
  33. package/src/types/query/core.ts +1 -0
  34. package/src/types/utils.ts +13 -0
  35. package/src/utils/util.ts +2 -1
  36. package/dist/models/scallopPrice.d.ts +0 -0
  37. package/src/models/scallopPrice.ts +0 -0
@@ -4,7 +4,6 @@ import {
4
4
  PROTOCOL_OBJECT_ID,
5
5
  SUPPORT_COLLATERALS,
6
6
  BORROW_FEE_PROTOCOL_ID,
7
- USE_TEST_ADDRESS,
8
7
  FlashLoanFeeObjectMap,
9
8
  } from '../constants';
10
9
  import {
@@ -38,6 +37,7 @@ import {
38
37
  } from '../types';
39
38
  import BigNumber from 'bignumber.js';
40
39
  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,6 +204,7 @@ export const queryMarket = async (
204
204
  liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
205
205
  liquidationReserveFactor:
206
206
  parsedMarketCollateralData.liquidationReserveFactor,
207
+ isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),
207
208
  ...calculatedMarketCollateralData,
208
209
  };
209
210
  }
@@ -293,122 +294,129 @@ export const getMarketPool = async (
293
294
  indexer: boolean = false,
294
295
  marketObject?: SuiObjectData | null,
295
296
  coinPrice?: number
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;
302
-
303
- coinPrice =
304
- coinPrice ||
305
- (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
306
-
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
- );
313
-
314
- return marketPoolIndexer;
315
- }
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
+ );
316
309
 
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;
310
+ return marketPoolIndexer;
311
+ }
325
312
 
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
- },
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),
341
337
  },
342
- });
343
- if (!balanceSheetDynamicFieldObjectResponse) return undefined;
338
+ },
339
+ });
344
340
 
345
- const balanceSheetDynamicFieldObject =
346
- balanceSheetDynamicFieldObjectResponse.data;
347
- if (
341
+ const balanceSheetDynamicFieldObject =
342
+ balanceSheetDynamicFieldObjectResponse?.data;
343
+
344
+ if (
345
+ !(
348
346
  balanceSheetDynamicFieldObject &&
349
347
  balanceSheetDynamicFieldObject.content &&
350
348
  'fields' in balanceSheetDynamicFieldObject.content
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
- },
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),
368
368
  },
369
- });
370
- if (!borrowIndexDynamicFieldObjectResponse) return undefined;
369
+ },
370
+ });
371
371
 
372
- const borrowIndexDynamicFieldObject =
373
- borrowIndexDynamicFieldObjectResponse.data;
374
- if (
372
+ const borrowIndexDynamicFieldObject =
373
+ borrowIndexDynamicFieldObjectResponse?.data;
374
+ if (
375
+ !(
375
376
  borrowIndexDynamicFieldObject &&
376
377
  borrowIndexDynamicFieldObject.content &&
377
378
  'fields' in borrowIndexDynamicFieldObject.content
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
- },
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),
395
398
  },
396
- });
399
+ },
400
+ });
397
401
 
398
- if (!interestModelDynamicFieldObjectResponse) return undefined;
399
- const interestModelDynamicFieldObject =
400
- interestModelDynamicFieldObjectResponse.data;
401
- if (
402
+ const interestModelDynamicFieldObject =
403
+ interestModelDynamicFieldObjectResponse?.data;
404
+ if (
405
+ !(
402
406
  interestModelDynamicFieldObject &&
403
407
  interestModelDynamicFieldObject.content &&
404
408
  'fields' in interestModelDynamicFieldObject.content
405
- ) {
406
- const dynamicFields = interestModelDynamicFieldObject.content
407
- .fields as any;
408
- interestModel = dynamicFields.value.fields;
409
- }
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;
410
417
 
411
- // Get borrow fee.
418
+ // Get borrow fee.
419
+ const getBorrowFee = async () => {
412
420
  const borrowFeeDynamicFieldObjectResponse =
413
421
  await query.cache.queryGetDynamicFieldObject({
414
422
  parentId: marketId,
@@ -422,26 +430,19 @@ export const getMarketPool = async (
422
430
  },
423
431
  });
424
432
 
425
- if (!borrowFeeDynamicFieldObjectResponse) return undefined;
426
433
  const borrowFeeDynamicFieldObject =
427
- borrowFeeDynamicFieldObjectResponse.data;
434
+ borrowFeeDynamicFieldObjectResponse?.data;
428
435
  if (
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
- }
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
+ };
438
445
 
439
- if (
440
- balanceSheet &&
441
- borrowIndex &&
442
- interestModel &&
443
- (USE_TEST_ADDRESS || borrowFeeRate)
444
- ) {
445
446
  const parsedMarketPoolData = parseOriginMarketPoolData({
446
447
  type: interestModel.type.fields,
447
448
  maxBorrowRate: interestModel.max_borrow_rate.fields,
@@ -455,7 +456,7 @@ export const getMarketPool = async (
455
456
  reserve: balanceSheet.revenue,
456
457
  reserveFactor: interestModel.revenue_factor.fields,
457
458
  borrowWeight: interestModel.borrow_weight.fields,
458
- borrowFeeRate: borrowFeeRate || { value: '0' },
459
+ borrowFeeRate: await getBorrowFee(),
459
460
  baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
460
461
  borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
461
462
  borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
@@ -476,7 +477,7 @@ export const getMarketPool = async (
476
477
  .shiftedBy(-coinDecimal)
477
478
  .toNumber();
478
479
 
479
- marketPool = {
480
+ return {
480
481
  coinName: poolCoinName,
481
482
  symbol: query.utils.parseSymbol(poolCoinName),
482
483
  coinType: query.utils.parseCoinType(poolCoinName),
@@ -495,13 +496,13 @@ export const getMarketPool = async (
495
496
  marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
496
497
  minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
497
498
  maxSupplyCoin,
498
- // isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
499
- isIsolated: false,
499
+ isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
500
+ // isIsolated: false,
500
501
  ...calculatedMarketPoolData,
501
502
  };
503
+ } catch (e) {
504
+ console.error(e);
502
505
  }
503
-
504
- return marketPool;
505
506
  };
506
507
 
507
508
  /**
@@ -579,7 +580,7 @@ export const getMarketCollateral = async (
579
580
  indexer: boolean = false,
580
581
  marketObject?: SuiObjectData | null,
581
582
  coinPrice?: number
582
- ) => {
583
+ ): Promise<MarketCollateral | undefined> => {
583
584
  coinPrice =
584
585
  coinPrice ||
585
586
  (await query.utils.getCoinPrices([collateralCoinName]))?.[
@@ -598,9 +599,9 @@ export const getMarketCollateral = async (
598
599
  return marketCollateralIndexer;
599
600
  }
600
601
 
601
- let marketCollateral: MarketCollateral | undefined;
602
- let riskModel: RiskModel | undefined;
603
- let collateralStat: CollateralStat | undefined;
602
+ // let marketCollateral: MarketCollateral | undefined;
603
+ // let riskModel: RiskModel | undefined;
604
+ // let collateralStat: CollateralStat | undefined;
604
605
 
605
606
  const marketId = query.address.get('core.market');
606
607
  marketObject =
@@ -611,101 +612,106 @@ export const getMarketCollateral = async (
611
612
  })
612
613
  )?.data;
613
614
 
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);
618
-
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
- });
631
-
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
- }
643
-
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
- });
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
+ });
657
633
 
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
- }
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
+ );
672
645
 
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,
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
+ },
683
662
  });
684
663
 
685
- const calculatedMarketCollateralData = calculateMarketCollateralData(
686
- query.utils,
687
- parsedMarketCollateralData
664
+ const collateralStatDynamicFieldObject =
665
+ collateralStatDynamicFieldObjectResponse?.data;
666
+
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()}`
688
676
  );
689
677
 
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
- }
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
+ });
707
692
 
708
- return marketCollateral;
693
+ const calculatedMarketCollateralData = calculateMarketCollateralData(
694
+ query.utils,
695
+ parsedMarketCollateralData
696
+ );
697
+
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
+ };
709
715
  };
710
716
 
711
717
  /**
@@ -18,9 +18,6 @@ const isolatedAssetZod = zod.object({
18
18
  }),
19
19
  });
20
20
 
21
- const ISOLATED_ASSET_KEY =
22
- '0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::IsolatedAssetKey';
23
-
24
21
  /**
25
22
  * Return list of isolated assets coin types
26
23
  * @param utils ScallopUtils
@@ -31,6 +28,8 @@ export const getIsolatedAssets = async (
31
28
  ): Promise<string[]> => {
32
29
  try {
33
30
  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`;
34
33
  const isolatedAssets: string[] = [];
35
34
  if (!marketObject) return isolatedAssets;
36
35
 
@@ -83,7 +82,8 @@ export const isIsolatedAsset = async (
83
82
  ): Promise<boolean> => {
84
83
  try {
85
84
  const marketObject = utils.address.get('core.market');
86
-
85
+ const protocolObject = utils.address.get('core.packages.protocol.id');
86
+ const ISOLATED_ASSET_KEY = `${protocolObject}::market_dynamic_keys::IsolatedAssetKey`;
87
87
  // check if the coin type is in the list
88
88
  const cachedData = utils.address.cache.queryClient.getQueryData<string[]>([
89
89
  'getDynamicFields',
@@ -330,12 +330,8 @@ export const getObligationAccount = async (
330
330
  coinAmounts?: CoinAmounts
331
331
  ) => {
332
332
  market = market || (await query.queryMarket(indexer));
333
- const collateralAssetCoinNames: SupportCollateralCoins[] = [
334
- ...new Set([
335
- ...Object.values(market.collaterals).map(
336
- (collateral) => collateral.coinName
337
- ),
338
- ]),
333
+ const poolAssetCoinNames: SupportCollateralCoins[] = [
334
+ ...new Set([...Object.values(market.pools).map((pool) => pool.coinName)]),
339
335
  ];
340
336
  const obligationQuery = await query.queryObligation(obligationId);
341
337
  const borrowIncentivePools = await query.getBorrowIncentivePools(
@@ -345,11 +341,12 @@ export const getObligationAccount = async (
345
341
  const borrowIncentiveAccounts =
346
342
  await query.getBorrowIncentiveAccounts(obligationId);
347
343
  coinPrices =
348
- coinPrices || (await query.utils.getCoinPrices(collateralAssetCoinNames));
344
+ coinPrices || (await query.utils.getCoinPrices(poolAssetCoinNames));
349
345
  coinAmounts =
350
346
  coinAmounts ||
351
- (await query.getCoinAmounts(collateralAssetCoinNames, ownerAddress));
347
+ (await query.getCoinAmounts(poolAssetCoinNames, ownerAddress));
352
348
 
349
+ console.log(coinPrices);
353
350
  const collaterals: ObligationAccount['collaterals'] = {};
354
351
  const debts: ObligationAccount['debts'] = {};
355
352
  const borrowIncentives: ObligationAccount['borrowIncentives'] = {};
@@ -362,7 +359,7 @@ export const getObligationAccount = async (
362
359
  let totalBorrowedValue = BigNumber(0);
363
360
  let totalBorrowedValueWithWeight = BigNumber(0);
364
361
 
365
- for (const assetCoinName of collateralAssetCoinNames) {
362
+ for (const assetCoinName of poolAssetCoinNames) {
366
363
  const collateral = obligationQuery?.collaterals.find((collateral) => {
367
364
  const collateralCoinName =
368
365
  query.utils.parseCoinNameFromType<SupportCollateralCoins>(
@@ -10,7 +10,6 @@ export const queryVeScaKeyIdFromReferralBindings = async (
10
10
  refereeAddress: string
11
11
  ): Promise<string | null> => {
12
12
  const referralBindingTableId = address.get('referral.bindingTableId');
13
-
14
13
  const referralBindResponse = await address.cache.queryGetDynamicFieldObject({
15
14
  parentId: referralBindingTableId,
16
15
  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('Fail to fetch marketPool');
117
+ throw new Error(`Failed to fetch marketPool for ${marketCoinName}`);
118
118
  }
119
119
 
120
120
  const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);
@@ -153,6 +153,7 @@ export type MarketCollateral = {
153
153
  coinWrappedType: CoinWrappedType;
154
154
  coinDecimal: number;
155
155
  coinPrice: number;
156
+ isIsolated: boolean;
156
157
  } & Required<
157
158
  Pick<
158
159
  ParsedMarketCollateralData,
@@ -13,3 +13,16 @@ export type PriceMap = Map<
13
13
  publishTime: number;
14
14
  }
15
15
  >;
16
+
17
+ export type PoolAddressInfo = {
18
+ name: string;
19
+ coingeckoId: string;
20
+ decimal: number;
21
+ pythFeedId: string;
22
+ lendingPoolAddress: string;
23
+ collateralPoolAddress: string;
24
+ sCoinAddress: string | undefined;
25
+ marketCoinAddress: string;
26
+ coinAddress: string;
27
+ sCoinName: string | undefined;
28
+ };