@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.
- package/dist/constants/coinGecko.d.ts +2 -0
- package/dist/constants/index.d.ts +7 -0
- package/dist/constants/poolAddress.d.ts +5 -0
- package/dist/constants/pyth.d.ts +2 -0
- package/dist/constants/queryKeys.d.ts +2 -1
- package/dist/index.js +1471 -1311
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1463 -1311
- package/dist/index.mjs.map +1 -1
- package/dist/models/scallopQuery.d.ts +4 -4
- package/dist/models/scallopUtils.d.ts +6 -1
- package/dist/queries/sCoinQuery.d.ts +1 -1
- package/dist/queries/spoolQuery.d.ts +1 -1
- package/dist/types/query/core.d.ts +1 -0
- package/dist/types/utils.d.ts +12 -0
- package/dist/utils/util.d.ts +2 -2
- package/package.json +1 -1
- package/src/constants/coinGecko.ts +18 -0
- package/src/constants/enum.ts +11 -4
- package/src/constants/index.ts +7 -0
- package/src/constants/poolAddress.ts +94 -0
- package/src/constants/pyth.ts +19 -0
- package/src/constants/queryKeys.ts +2 -2
- package/src/constants/testAddress.ts +76 -35
- package/src/models/scallopBuilder.ts +2 -3
- package/src/models/scallopQuery.ts +4 -3
- package/src/models/scallopUtils.ts +64 -29
- package/src/queries/coreQuery.ts +222 -216
- package/src/queries/isolatedAsset.ts +4 -4
- package/src/queries/portfolioQuery.ts +6 -9
- package/src/queries/referralQuery.ts +0 -1
- package/src/queries/spoolQuery.ts +1 -1
- package/src/types/query/core.ts +1 -0
- package/src/types/utils.ts +13 -0
- package/src/utils/util.ts +2 -1
- package/dist/models/scallopPrice.d.ts +0 -0
- package/src/models/scallopPrice.ts +0 -0
package/src/queries/coreQuery.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
-
|
|
318
|
-
|
|
319
|
-
marketObject ||
|
|
320
|
-
(
|
|
321
|
-
await query.cache.queryGetObject(marketId, {
|
|
322
|
-
showContent: true,
|
|
323
|
-
})
|
|
324
|
-
)?.data;
|
|
310
|
+
return marketPoolIndexer;
|
|
311
|
+
}
|
|
325
312
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
338
|
+
},
|
|
339
|
+
});
|
|
344
340
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
371
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
372
|
+
const borrowIndexDynamicFieldObject =
|
|
373
|
+
borrowIndexDynamicFieldObjectResponse?.data;
|
|
374
|
+
if (
|
|
375
|
+
!(
|
|
375
376
|
borrowIndexDynamicFieldObject &&
|
|
376
377
|
borrowIndexDynamicFieldObject.content &&
|
|
377
378
|
'fields' in borrowIndexDynamicFieldObject.content
|
|
378
|
-
)
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
+
const interestModelDynamicFieldObject =
|
|
403
|
+
interestModelDynamicFieldObjectResponse?.data;
|
|
404
|
+
if (
|
|
405
|
+
!(
|
|
402
406
|
interestModelDynamicFieldObject &&
|
|
403
407
|
interestModelDynamicFieldObject.content &&
|
|
404
408
|
'fields' in interestModelDynamicFieldObject.content
|
|
405
|
-
)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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
|
|
434
|
+
borrowFeeDynamicFieldObjectResponse?.data;
|
|
428
435
|
if (
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
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
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
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
|
-
|
|
686
|
-
|
|
687
|
-
|
|
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
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
344
|
+
coinPrices || (await query.utils.getCoinPrices(poolAssetCoinNames));
|
|
349
345
|
coinAmounts =
|
|
350
346
|
coinAmounts ||
|
|
351
|
-
(await query.getCoinAmounts(
|
|
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
|
|
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(
|
|
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`);
|
package/src/types/query/core.ts
CHANGED
package/src/types/utils.ts
CHANGED
|
@@ -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
|
+
};
|