@scallop-io/sui-scallop-sdk 1.3.2-alpha.3 → 1.3.3-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/index.d.ts +1 -0
- package/dist/constants/queryKeys.d.ts +3 -5
- package/dist/index.js +830 -789
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1309 -1269
- package/dist/index.mjs.map +1 -1
- package/dist/types/query/core.d.ts +1 -0
- package/package.json +1 -2
- package/src/builders/spoolBuilder.ts +4 -0
- package/src/constants/enum.ts +8 -3
- package/src/constants/index.ts +1 -0
- package/src/constants/queryKeys.ts +3 -6
- package/src/constants/testAddress.ts +74 -33
- package/src/models/scallopBuilder.ts +2 -3
- package/src/models/scallopClient.ts +4 -4
- package/src/models/scallopQuery.ts +4 -3
- package/src/models/scallopUtils.ts +39 -26
- package/src/queries/coreQuery.ts +221 -213
- package/src/queries/isolatedAsset.ts +4 -4
- package/src/queries/referralQuery.ts +0 -1
- package/src/queries/sCoinQuery.ts +1 -1
- package/src/queries/spoolQuery.ts +76 -79
- package/src/queries/vescaQuery.ts +1 -1
- package/src/types/query/core.ts +1 -0
- 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 {
|
|
@@ -39,6 +38,7 @@ import {
|
|
|
39
38
|
import BigNumber from 'bignumber.js';
|
|
40
39
|
import { getSupplyLimit } from './supplyLimit';
|
|
41
40
|
import { isIsolatedAsset } from './isolatedAsset';
|
|
41
|
+
// import { isIsolatedAsset } from './isolatedAsset';
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* Query market data.
|
|
@@ -89,7 +89,7 @@ export const queryMarket = async (
|
|
|
89
89
|
const args = [marketId];
|
|
90
90
|
|
|
91
91
|
const queryResult = await query.cache.queryInspectTxn({ queryTarget, args });
|
|
92
|
-
const marketData = queryResult?.events[0]
|
|
92
|
+
const marketData = queryResult?.events[0]?.parsedJson as
|
|
93
93
|
| MarketQueryInterface
|
|
94
94
|
| undefined;
|
|
95
95
|
|
|
@@ -157,6 +157,7 @@ export const queryMarket = async (
|
|
|
157
157
|
marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
|
|
158
158
|
minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
|
|
159
159
|
isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
|
|
160
|
+
// isIsolated: false,
|
|
160
161
|
maxSupplyCoin,
|
|
161
162
|
...calculatedMarketPoolData,
|
|
162
163
|
};
|
|
@@ -203,6 +204,7 @@ export const queryMarket = async (
|
|
|
203
204
|
liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,
|
|
204
205
|
liquidationReserveFactor:
|
|
205
206
|
parsedMarketCollateralData.liquidationReserveFactor,
|
|
207
|
+
isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),
|
|
206
208
|
...calculatedMarketCollateralData,
|
|
207
209
|
};
|
|
208
210
|
}
|
|
@@ -292,122 +294,129 @@ export const getMarketPool = async (
|
|
|
292
294
|
indexer: boolean = false,
|
|
293
295
|
marketObject?: SuiObjectData | null,
|
|
294
296
|
coinPrice?: number
|
|
295
|
-
) => {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
|
|
308
|
-
marketPoolIndexer.coinPrice = coinPrice || marketPoolIndexer.coinPrice;
|
|
309
|
-
marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
|
|
310
|
-
marketPoolIndexer.coinName
|
|
311
|
-
);
|
|
312
|
-
|
|
313
|
-
return marketPoolIndexer;
|
|
314
|
-
}
|
|
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
|
+
);
|
|
315
309
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
marketObject ||
|
|
319
|
-
(
|
|
320
|
-
await query.cache.queryGetObject(marketId, {
|
|
321
|
-
showContent: true,
|
|
322
|
-
})
|
|
323
|
-
)?.data;
|
|
310
|
+
return marketPoolIndexer;
|
|
311
|
+
}
|
|
324
312
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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),
|
|
340
337
|
},
|
|
341
|
-
}
|
|
342
|
-
|
|
338
|
+
},
|
|
339
|
+
});
|
|
343
340
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
341
|
+
const balanceSheetDynamicFieldObject =
|
|
342
|
+
balanceSheetDynamicFieldObjectResponse?.data;
|
|
343
|
+
|
|
344
|
+
if (
|
|
345
|
+
!(
|
|
347
346
|
balanceSheetDynamicFieldObject &&
|
|
348
347
|
balanceSheetDynamicFieldObject.content &&
|
|
349
348
|
'fields' in balanceSheetDynamicFieldObject.content
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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),
|
|
367
368
|
},
|
|
368
|
-
}
|
|
369
|
-
|
|
369
|
+
},
|
|
370
|
+
});
|
|
370
371
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
372
|
+
const borrowIndexDynamicFieldObject =
|
|
373
|
+
borrowIndexDynamicFieldObjectResponse?.data;
|
|
374
|
+
if (
|
|
375
|
+
!(
|
|
374
376
|
borrowIndexDynamicFieldObject &&
|
|
375
377
|
borrowIndexDynamicFieldObject.content &&
|
|
376
378
|
'fields' in borrowIndexDynamicFieldObject.content
|
|
377
|
-
)
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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),
|
|
394
398
|
},
|
|
395
|
-
}
|
|
399
|
+
},
|
|
400
|
+
});
|
|
396
401
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
402
|
+
const interestModelDynamicFieldObject =
|
|
403
|
+
interestModelDynamicFieldObjectResponse?.data;
|
|
404
|
+
if (
|
|
405
|
+
!(
|
|
401
406
|
interestModelDynamicFieldObject &&
|
|
402
407
|
interestModelDynamicFieldObject.content &&
|
|
403
408
|
'fields' in interestModelDynamicFieldObject.content
|
|
404
|
-
)
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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;
|
|
409
417
|
|
|
410
|
-
|
|
418
|
+
// Get borrow fee.
|
|
419
|
+
const getBorrowFee = async () => {
|
|
411
420
|
const borrowFeeDynamicFieldObjectResponse =
|
|
412
421
|
await query.cache.queryGetDynamicFieldObject({
|
|
413
422
|
parentId: marketId,
|
|
@@ -421,26 +430,19 @@ export const getMarketPool = async (
|
|
|
421
430
|
},
|
|
422
431
|
});
|
|
423
432
|
|
|
424
|
-
if (!borrowFeeDynamicFieldObjectResponse) return undefined;
|
|
425
433
|
const borrowFeeDynamicFieldObject =
|
|
426
|
-
borrowFeeDynamicFieldObjectResponse
|
|
434
|
+
borrowFeeDynamicFieldObjectResponse?.data;
|
|
427
435
|
if (
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
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
|
+
};
|
|
437
445
|
|
|
438
|
-
if (
|
|
439
|
-
balanceSheet &&
|
|
440
|
-
borrowIndex &&
|
|
441
|
-
interestModel &&
|
|
442
|
-
(USE_TEST_ADDRESS || borrowFeeRate)
|
|
443
|
-
) {
|
|
444
446
|
const parsedMarketPoolData = parseOriginMarketPoolData({
|
|
445
447
|
type: interestModel.type.fields,
|
|
446
448
|
maxBorrowRate: interestModel.max_borrow_rate.fields,
|
|
@@ -454,7 +456,7 @@ export const getMarketPool = async (
|
|
|
454
456
|
reserve: balanceSheet.revenue,
|
|
455
457
|
reserveFactor: interestModel.revenue_factor.fields,
|
|
456
458
|
borrowWeight: interestModel.borrow_weight.fields,
|
|
457
|
-
borrowFeeRate:
|
|
459
|
+
borrowFeeRate: await getBorrowFee(),
|
|
458
460
|
baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
|
|
459
461
|
borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
|
|
460
462
|
borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
|
|
@@ -475,7 +477,7 @@ export const getMarketPool = async (
|
|
|
475
477
|
.shiftedBy(-coinDecimal)
|
|
476
478
|
.toNumber();
|
|
477
479
|
|
|
478
|
-
|
|
480
|
+
return {
|
|
479
481
|
coinName: poolCoinName,
|
|
480
482
|
symbol: query.utils.parseSymbol(poolCoinName),
|
|
481
483
|
coinType: query.utils.parseCoinType(poolCoinName),
|
|
@@ -495,11 +497,12 @@ export const getMarketPool = async (
|
|
|
495
497
|
minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
|
|
496
498
|
maxSupplyCoin,
|
|
497
499
|
isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
|
|
500
|
+
// isIsolated: false,
|
|
498
501
|
...calculatedMarketPoolData,
|
|
499
502
|
};
|
|
503
|
+
} catch (e) {
|
|
504
|
+
console.error(e);
|
|
500
505
|
}
|
|
501
|
-
|
|
502
|
-
return marketPool;
|
|
503
506
|
};
|
|
504
507
|
|
|
505
508
|
/**
|
|
@@ -577,7 +580,7 @@ export const getMarketCollateral = async (
|
|
|
577
580
|
indexer: boolean = false,
|
|
578
581
|
marketObject?: SuiObjectData | null,
|
|
579
582
|
coinPrice?: number
|
|
580
|
-
) => {
|
|
583
|
+
): Promise<MarketCollateral | undefined> => {
|
|
581
584
|
coinPrice =
|
|
582
585
|
coinPrice ||
|
|
583
586
|
(await query.utils.getCoinPrices([collateralCoinName]))?.[
|
|
@@ -596,9 +599,9 @@ export const getMarketCollateral = async (
|
|
|
596
599
|
return marketCollateralIndexer;
|
|
597
600
|
}
|
|
598
601
|
|
|
599
|
-
let marketCollateral: MarketCollateral | undefined;
|
|
600
|
-
let riskModel: RiskModel | undefined;
|
|
601
|
-
let collateralStat: CollateralStat | undefined;
|
|
602
|
+
// let marketCollateral: MarketCollateral | undefined;
|
|
603
|
+
// let riskModel: RiskModel | undefined;
|
|
604
|
+
// let collateralStat: CollateralStat | undefined;
|
|
602
605
|
|
|
603
606
|
const marketId = query.address.get('core.market');
|
|
604
607
|
marketObject =
|
|
@@ -609,101 +612,106 @@ export const getMarketCollateral = async (
|
|
|
609
612
|
})
|
|
610
613
|
)?.data;
|
|
611
614
|
|
|
612
|
-
if (marketObject)
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
if (!riskModelDynamicFieldObjectResponse) return undefined;
|
|
631
|
-
const riskModelDynamicFieldObject =
|
|
632
|
-
riskModelDynamicFieldObjectResponse.data;
|
|
633
|
-
if (
|
|
634
|
-
riskModelDynamicFieldObject &&
|
|
635
|
-
riskModelDynamicFieldObject.content &&
|
|
636
|
-
'fields' in riskModelDynamicFieldObject.content
|
|
637
|
-
) {
|
|
638
|
-
const dynamicFields = riskModelDynamicFieldObject.content.fields as any;
|
|
639
|
-
riskModel = dynamicFields.value.fields;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
// Get collateral stat.
|
|
643
|
-
const collateralStatParentId =
|
|
644
|
-
fields.collateral_stats.fields.table.fields.id.id;
|
|
645
|
-
const collateralStatDynamicFieldObjectResponse =
|
|
646
|
-
await query.cache.queryGetDynamicFieldObject({
|
|
647
|
-
parentId: collateralStatParentId,
|
|
648
|
-
name: {
|
|
649
|
-
type: '0x1::type_name::TypeName',
|
|
650
|
-
value: {
|
|
651
|
-
name: coinType.substring(2),
|
|
652
|
-
},
|
|
653
|
-
},
|
|
654
|
-
});
|
|
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
|
+
});
|
|
655
633
|
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
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
|
+
);
|
|
670
645
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
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
|
+
},
|
|
681
662
|
});
|
|
682
663
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
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()}`
|
|
686
676
|
);
|
|
687
677
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
...calculatedMarketCollateralData,
|
|
703
|
-
};
|
|
704
|
-
}
|
|
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
|
+
});
|
|
705
692
|
|
|
706
|
-
|
|
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
|
+
};
|
|
707
715
|
};
|
|
708
716
|
|
|
709
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',
|
|
@@ -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: {
|
|
@@ -33,7 +33,7 @@ export const getSCoinTotalSupply = async (
|
|
|
33
33
|
typeArgs,
|
|
34
34
|
});
|
|
35
35
|
const results = queryResults?.results;
|
|
36
|
-
if (results && results[0]
|
|
36
|
+
if (results && results[0]?.returnValues) {
|
|
37
37
|
const value = Uint8Array.from(results[0].returnValues[0][0]);
|
|
38
38
|
const type = results[0].returnValues[0][1]; // should be u64
|
|
39
39
|
assert(type === 'u64', 'Result type is not u64');
|