@scallop-io/sui-scallop-sdk 1.3.41 → 1.4.1-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 (46) hide show
  1. package/dist/constants/common.d.ts +3 -3
  2. package/dist/constants/enum.d.ts +2 -2
  3. package/dist/constants/tokenBucket.d.ts +1 -1
  4. package/dist/index.js +412 -334
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +411 -333
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/models/scallopClient.d.ts +4 -4
  9. package/dist/models/scallopQuery.d.ts +74 -20
  10. package/dist/models/scallopUtils.d.ts +11 -11
  11. package/dist/queries/borrowIncentiveQuery.d.ts +2 -2
  12. package/dist/queries/coreQuery.d.ts +0 -2
  13. package/dist/queries/portfolioQuery.d.ts +0 -2
  14. package/dist/queries/priceQuery.d.ts +32 -2
  15. package/dist/queries/sCoinQuery.d.ts +1 -1
  16. package/dist/test.d.ts +0 -0
  17. package/dist/types/builder/borrowIncentive.d.ts +6 -6
  18. package/dist/types/constant/common.d.ts +1 -1
  19. package/dist/types/utils.d.ts +2 -6
  20. package/package.json +1 -1
  21. package/src/builders/borrowIncentiveBuilder.ts +2 -13
  22. package/src/constants/coinGecko.ts +3 -2
  23. package/src/constants/common.ts +10 -5
  24. package/src/constants/enum.ts +44 -34
  25. package/src/constants/poolAddress.ts +9 -8
  26. package/src/constants/pyth.ts +3 -2
  27. package/src/constants/tokenBucket.ts +1 -1
  28. package/src/models/scallopClient.ts +27 -10
  29. package/src/models/scallopQuery.ts +55 -31
  30. package/src/models/scallopUtils.ts +23 -18
  31. package/src/queries/borrowIncentiveQuery.ts +29 -12
  32. package/src/queries/borrowLimitQuery.ts +3 -2
  33. package/src/queries/coreQuery.ts +185 -196
  34. package/src/queries/isolatedAssetQuery.ts +3 -2
  35. package/src/queries/portfolioQuery.ts +81 -77
  36. package/src/queries/priceQuery.ts +35 -2
  37. package/src/queries/sCoinQuery.ts +3 -3
  38. package/src/queries/spoolQuery.ts +4 -6
  39. package/src/queries/supplyLimitQuery.ts +3 -2
  40. package/src/test.ts +20 -0
  41. package/src/types/builder/borrowIncentive.ts +10 -15
  42. package/src/types/constant/common.ts +1 -2
  43. package/src/types/utils.ts +2 -10
  44. package/src/utils/indexer.ts +9 -3
  45. package/src/utils/query.ts +0 -87
  46. package/src/utils/tokenBucket.ts +2 -2
@@ -17,8 +17,9 @@ const borrowLimitZod = zod.object({
17
17
  }),
18
18
  });
19
19
 
20
- const borrowLimitKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey`; // prod
21
- // const borrowLimitKeyType = `0xb784ea287d944e478a3ceaa071f8885072cce6b7224cf245914dc2f9963f460e::market_dynamic_keys::BorrowLimitKey`;
20
+ // TODO: enable for production
21
+ // const borrowLimitKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey`; // prod
22
+ const borrowLimitKeyType = `0xb784ea287d944e478a3ceaa071f8885072cce6b7224cf245914dc2f9963f460e::market_dynamic_keys::BorrowLimitKey`;
22
23
  /**
23
24
  * Return supply limit of a pool (including the decimals)
24
25
  * @param utils
@@ -247,7 +247,7 @@ export const getMarketPools = async (
247
247
  const marketObjectResponse = await query.cache.queryGetObject(marketId, {
248
248
  showContent: true,
249
249
  });
250
- coinPrices = (await query.utils.getCoinPrices(poolCoinNames)) ?? {};
250
+ coinPrices = coinPrices ?? (await query.utils.getCoinPrices());
251
251
 
252
252
  const marketPools: MarketPools = {};
253
253
 
@@ -305,222 +305,215 @@ export const getMarketPool = async (
305
305
  marketObject?: SuiObjectData | null,
306
306
  coinPrice?: number
307
307
  ): Promise<MarketPool | undefined> => {
308
- try {
309
- coinPrice =
310
- coinPrice ||
311
- (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
312
-
313
- if (indexer) {
314
- const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
315
- if (!marketPoolIndexer) {
316
- return undefined;
317
- }
318
- marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;
319
- marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
320
- marketPoolIndexer.coinName
321
- );
308
+ coinPrice = coinPrice ?? (await query.utils.getCoinPrices())?.[poolCoinName];
322
309
 
323
- return marketPoolIndexer;
310
+ if (indexer) {
311
+ const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
312
+ if (!marketPoolIndexer) {
313
+ return undefined;
324
314
  }
315
+ marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;
316
+ marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
317
+ marketPoolIndexer.coinName
318
+ );
325
319
 
326
- const marketId = query.address.get('core.market');
327
- marketObject =
328
- marketObject ||
329
- (
330
- await query.cache.queryGetObject(marketId, {
331
- showContent: true,
332
- })
333
- )?.data;
320
+ return marketPoolIndexer;
321
+ }
334
322
 
335
- if (!(marketObject && marketObject.content?.dataType === 'moveObject'))
336
- throw new Error(`Failed to fetch marketObject`);
323
+ const marketId = query.address.get('core.market');
324
+ marketObject =
325
+ marketObject ||
326
+ (
327
+ await query.cache.queryGetObject(marketId, {
328
+ showContent: true,
329
+ })
330
+ )?.data;
337
331
 
338
- const fields = marketObject.content.fields as any;
339
- const coinType = query.utils.parseCoinType(poolCoinName);
340
- // Get balance sheet.
341
- const balanceSheetParentId =
342
- fields.vault.fields.balance_sheets.fields.table.fields.id.id;
343
- const balanceSheetDynamicFieldObjectResponse =
344
- await query.cache.queryGetDynamicFieldObject({
345
- parentId: balanceSheetParentId,
346
- name: {
347
- type: '0x1::type_name::TypeName',
348
- value: {
349
- name: coinType.substring(2),
350
- },
332
+ if (!(marketObject && marketObject.content?.dataType === 'moveObject'))
333
+ throw new Error(`Failed to fetch marketObject`);
334
+
335
+ const fields = marketObject.content.fields as any;
336
+ const coinType = query.utils.parseCoinType(poolCoinName);
337
+ // Get balance sheet.
338
+ const balanceSheetParentId =
339
+ fields.vault.fields.balance_sheets.fields.table.fields.id.id;
340
+ const balanceSheetDynamicFieldObjectResponse =
341
+ await query.cache.queryGetDynamicFieldObject({
342
+ parentId: balanceSheetParentId,
343
+ name: {
344
+ type: '0x1::type_name::TypeName',
345
+ value: {
346
+ name: coinType.substring(2),
351
347
  },
352
- });
348
+ },
349
+ });
353
350
 
354
- const balanceSheetDynamicFieldObject =
355
- balanceSheetDynamicFieldObjectResponse?.data;
351
+ const balanceSheetDynamicFieldObject =
352
+ balanceSheetDynamicFieldObjectResponse?.data;
356
353
 
357
- if (
358
- !(
359
- balanceSheetDynamicFieldObject &&
360
- balanceSheetDynamicFieldObject.content &&
361
- 'fields' in balanceSheetDynamicFieldObject.content
362
- )
354
+ if (
355
+ !(
356
+ balanceSheetDynamicFieldObject &&
357
+ balanceSheetDynamicFieldObject.content &&
358
+ 'fields' in balanceSheetDynamicFieldObject.content
363
359
  )
364
- throw new Error(
365
- `Failed to fetch balanceSheetDynamicFieldObject for ${poolCoinName}: ${balanceSheetDynamicFieldObjectResponse?.error?.code.toString()}`
366
- );
367
- const balanceSheet: BalanceSheet = (
368
- balanceSheetDynamicFieldObject.content.fields as any
369
- ).value.fields;
370
-
371
- // Get borrow index.
372
- const borrowIndexParentId =
373
- fields.borrow_dynamics.fields.table.fields.id.id;
374
- const borrowIndexDynamicFieldObjectResponse =
375
- await query.cache.queryGetDynamicFieldObject({
376
- parentId: borrowIndexParentId,
377
- name: {
378
- type: '0x1::type_name::TypeName',
379
- value: {
380
- name: coinType.substring(2),
381
- },
360
+ )
361
+ throw new Error(
362
+ `Failed to fetch balanceSheetDynamicFieldObject for ${poolCoinName}: ${balanceSheetDynamicFieldObjectResponse?.error?.code.toString()}`
363
+ );
364
+ const balanceSheet: BalanceSheet = (
365
+ balanceSheetDynamicFieldObject.content.fields as any
366
+ ).value.fields;
367
+
368
+ // Get borrow index.
369
+ const borrowIndexParentId = fields.borrow_dynamics.fields.table.fields.id.id;
370
+ const borrowIndexDynamicFieldObjectResponse =
371
+ await query.cache.queryGetDynamicFieldObject({
372
+ parentId: borrowIndexParentId,
373
+ name: {
374
+ type: '0x1::type_name::TypeName',
375
+ value: {
376
+ name: coinType.substring(2),
382
377
  },
383
- });
378
+ },
379
+ });
384
380
 
385
- const borrowIndexDynamicFieldObject =
386
- borrowIndexDynamicFieldObjectResponse?.data;
387
- if (
388
- !(
389
- borrowIndexDynamicFieldObject &&
390
- borrowIndexDynamicFieldObject.content &&
391
- 'fields' in borrowIndexDynamicFieldObject.content
392
- )
381
+ const borrowIndexDynamicFieldObject =
382
+ borrowIndexDynamicFieldObjectResponse?.data;
383
+ if (
384
+ !(
385
+ borrowIndexDynamicFieldObject &&
386
+ borrowIndexDynamicFieldObject.content &&
387
+ 'fields' in borrowIndexDynamicFieldObject.content
393
388
  )
394
- throw new Error(
395
- `Failed to fetch borrowIndexDynamicFieldObject for ${poolCoinName}`
396
- );
397
- const borrowIndex: BorrowIndex = (
398
- borrowIndexDynamicFieldObject.content.fields as any
399
- ).value.fields;
400
-
401
- // Get interest models.
402
- const interestModelParentId =
403
- fields.interest_models.fields.table.fields.id.id;
404
- const interestModelDynamicFieldObjectResponse =
389
+ )
390
+ throw new Error(
391
+ `Failed to fetch borrowIndexDynamicFieldObject for ${poolCoinName}`
392
+ );
393
+ const borrowIndex: BorrowIndex = (
394
+ borrowIndexDynamicFieldObject.content.fields as any
395
+ ).value.fields;
396
+
397
+ // Get interest models.
398
+ const interestModelParentId =
399
+ fields.interest_models.fields.table.fields.id.id;
400
+ const interestModelDynamicFieldObjectResponse =
401
+ await query.cache.queryGetDynamicFieldObject({
402
+ parentId: interestModelParentId,
403
+ name: {
404
+ type: '0x1::type_name::TypeName',
405
+ value: {
406
+ name: coinType.substring(2),
407
+ },
408
+ },
409
+ });
410
+
411
+ const interestModelDynamicFieldObject =
412
+ interestModelDynamicFieldObjectResponse?.data;
413
+ if (
414
+ !(
415
+ interestModelDynamicFieldObject &&
416
+ interestModelDynamicFieldObject.content &&
417
+ 'fields' in interestModelDynamicFieldObject.content
418
+ )
419
+ )
420
+ throw new Error(
421
+ `Failed to fetch interestModelDynamicFieldObject for ${poolCoinName}: ${interestModelDynamicFieldObject}`
422
+ );
423
+ const interestModel: InterestModel = (
424
+ interestModelDynamicFieldObject.content.fields as any
425
+ ).value.fields;
426
+
427
+ // Get borrow fee.
428
+ const getBorrowFee = async () => {
429
+ const borrowFeeDynamicFieldObjectResponse =
405
430
  await query.cache.queryGetDynamicFieldObject({
406
- parentId: interestModelParentId,
431
+ parentId: marketId,
407
432
  name: {
408
- type: '0x1::type_name::TypeName',
433
+ type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
409
434
  value: {
410
- name: coinType.substring(2),
435
+ type: {
436
+ name: coinType.substring(2),
437
+ },
411
438
  },
412
439
  },
413
440
  });
414
441
 
415
- const interestModelDynamicFieldObject =
416
- interestModelDynamicFieldObjectResponse?.data;
442
+ const borrowFeeDynamicFieldObject =
443
+ borrowFeeDynamicFieldObjectResponse?.data;
417
444
  if (
418
445
  !(
419
- interestModelDynamicFieldObject &&
420
- interestModelDynamicFieldObject.content &&
421
- 'fields' in interestModelDynamicFieldObject.content
446
+ borrowFeeDynamicFieldObject &&
447
+ borrowFeeDynamicFieldObject.content &&
448
+ 'fields' in borrowFeeDynamicFieldObject.content
422
449
  )
423
450
  )
424
- throw new Error(
425
- `Failed to fetch interestModelDynamicFieldObject for ${poolCoinName}: ${interestModelDynamicFieldObject}`
426
- );
427
- const interestModel: InterestModel = (
428
- interestModelDynamicFieldObject.content.fields as any
429
- ).value.fields;
430
-
431
- // Get borrow fee.
432
- const getBorrowFee = async () => {
433
- const borrowFeeDynamicFieldObjectResponse =
434
- await query.cache.queryGetDynamicFieldObject({
435
- parentId: marketId,
436
- name: {
437
- type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
438
- value: {
439
- type: {
440
- name: coinType.substring(2),
441
- },
442
- },
443
- },
444
- });
445
-
446
- const borrowFeeDynamicFieldObject =
447
- borrowFeeDynamicFieldObjectResponse?.data;
448
- if (
449
- !(
450
- borrowFeeDynamicFieldObject &&
451
- borrowFeeDynamicFieldObject.content &&
452
- 'fields' in borrowFeeDynamicFieldObject.content
453
- )
454
- )
455
- return { value: '0' };
456
- return (borrowFeeDynamicFieldObject.content.fields as any).value.fields;
457
- };
451
+ return { value: '0' };
452
+ return (borrowFeeDynamicFieldObject.content.fields as any).value.fields;
453
+ };
458
454
 
459
- const parsedMarketPoolData = parseOriginMarketPoolData({
460
- type: interestModel.type.fields,
461
- maxBorrowRate: interestModel.max_borrow_rate.fields,
462
- interestRate: borrowIndex.interest_rate.fields,
463
- interestRateScale: borrowIndex.interest_rate_scale,
464
- borrowIndex: borrowIndex.borrow_index,
465
- lastUpdated: borrowIndex.last_updated,
466
- cash: balanceSheet.cash,
467
- debt: balanceSheet.debt,
468
- marketCoinSupply: balanceSheet.market_coin_supply,
469
- reserve: balanceSheet.revenue,
470
- reserveFactor: interestModel.revenue_factor.fields,
471
- borrowWeight: interestModel.borrow_weight.fields,
472
- borrowFeeRate: await getBorrowFee(),
473
- baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
474
- borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
475
- borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
476
- highKink: interestModel.high_kink.fields,
477
- midKink: interestModel.mid_kink.fields,
478
- minBorrowAmount: interestModel.min_borrow_amount,
479
- });
455
+ const parsedMarketPoolData = parseOriginMarketPoolData({
456
+ type: interestModel.type.fields,
457
+ maxBorrowRate: interestModel.max_borrow_rate.fields,
458
+ interestRate: borrowIndex.interest_rate.fields,
459
+ interestRateScale: borrowIndex.interest_rate_scale,
460
+ borrowIndex: borrowIndex.borrow_index,
461
+ lastUpdated: borrowIndex.last_updated,
462
+ cash: balanceSheet.cash,
463
+ debt: balanceSheet.debt,
464
+ marketCoinSupply: balanceSheet.market_coin_supply,
465
+ reserve: balanceSheet.revenue,
466
+ reserveFactor: interestModel.revenue_factor.fields,
467
+ borrowWeight: interestModel.borrow_weight.fields,
468
+ borrowFeeRate: await getBorrowFee(),
469
+ baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
470
+ borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
471
+ borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
472
+ highKink: interestModel.high_kink.fields,
473
+ midKink: interestModel.mid_kink.fields,
474
+ minBorrowAmount: interestModel.min_borrow_amount,
475
+ });
480
476
 
481
- const calculatedMarketPoolData = calculateMarketPoolData(
482
- query.utils,
483
- parsedMarketPoolData
484
- );
477
+ const calculatedMarketPoolData = calculateMarketPoolData(
478
+ query.utils,
479
+ parsedMarketPoolData
480
+ );
485
481
 
486
- const coinDecimal = query.utils.getCoinDecimal(poolCoinName);
487
- const maxSupplyCoin = BigNumber(
488
- (await getSupplyLimit(query.utils, poolCoinName)) ?? '0'
489
- )
490
- .shiftedBy(-coinDecimal)
491
- .toNumber();
492
- const maxBorrowCoin = BigNumber(
493
- (await getBorrowLimit(query.utils, poolCoinName)) ?? '0'
494
- )
495
- .shiftedBy(-coinDecimal)
496
- .toNumber();
482
+ const coinDecimal = query.utils.getCoinDecimal(poolCoinName);
483
+ const maxSupplyCoin = BigNumber(
484
+ (await getSupplyLimit(query.utils, poolCoinName)) ?? '0'
485
+ )
486
+ .shiftedBy(-coinDecimal)
487
+ .toNumber();
488
+ const maxBorrowCoin = BigNumber(
489
+ (await getBorrowLimit(query.utils, poolCoinName)) ?? '0'
490
+ )
491
+ .shiftedBy(-coinDecimal)
492
+ .toNumber();
497
493
 
498
- return {
499
- coinName: poolCoinName,
500
- symbol: query.utils.parseSymbol(poolCoinName),
501
- coinType: query.utils.parseCoinType(poolCoinName),
502
- marketCoinType: query.utils.parseMarketCoinType(poolCoinName),
503
- sCoinType: query.utils.parseSCoinType(
504
- query.utils.parseMarketCoinName(poolCoinName)
505
- ),
506
- coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),
507
- coinDecimal,
508
- coinPrice: coinPrice ?? 0,
509
- highKink: parsedMarketPoolData.highKink,
510
- midKink: parsedMarketPoolData.midKink,
511
- reserveFactor: parsedMarketPoolData.reserveFactor,
512
- borrowWeight: parsedMarketPoolData.borrowWeight,
513
- borrowFee: parsedMarketPoolData.borrowFee,
514
- marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
515
- minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
516
- maxSupplyCoin,
517
- maxBorrowCoin,
518
- isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
519
- ...calculatedMarketPoolData,
520
- };
521
- } catch (e: any) {
522
- console.error(e.message);
523
- }
494
+ return {
495
+ coinName: poolCoinName,
496
+ symbol: query.utils.parseSymbol(poolCoinName),
497
+ coinType: query.utils.parseCoinType(poolCoinName),
498
+ marketCoinType: query.utils.parseMarketCoinType(poolCoinName),
499
+ sCoinType: query.utils.parseSCoinType(
500
+ query.utils.parseMarketCoinName(poolCoinName)
501
+ ),
502
+ coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),
503
+ coinDecimal,
504
+ coinPrice: coinPrice ?? 0,
505
+ highKink: parsedMarketPoolData.highKink,
506
+ midKink: parsedMarketPoolData.midKink,
507
+ reserveFactor: parsedMarketPoolData.reserveFactor,
508
+ borrowWeight: parsedMarketPoolData.borrowWeight,
509
+ borrowFee: parsedMarketPoolData.borrowFee,
510
+ marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
511
+ minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
512
+ maxSupplyCoin,
513
+ maxBorrowCoin,
514
+ isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
515
+ ...calculatedMarketPoolData,
516
+ };
524
517
  };
525
518
 
526
519
  /**
@@ -541,8 +534,7 @@ export const getMarketCollaterals = async (
541
534
  indexer: boolean = false
542
535
  ) => {
543
536
  const marketId = query.address.get('core.market');
544
- const coinPrices =
545
- (await query.utils.getCoinPrices(collateralCoinNames)) ?? {};
537
+ const coinPrices = (await query.utils.getCoinPrices()) ?? {};
546
538
  const marketCollaterals: MarketCollaterals = {};
547
539
 
548
540
  if (indexer) {
@@ -600,10 +592,7 @@ export const getMarketCollateral = async (
600
592
  coinPrice?: number
601
593
  ): Promise<MarketCollateral | undefined> => {
602
594
  coinPrice =
603
- coinPrice ||
604
- (await query.utils.getCoinPrices([collateralCoinName]))?.[
605
- collateralCoinName
606
- ];
595
+ coinPrice ?? (await query.utils.getCoinPrices())?.[collateralCoinName];
607
596
 
608
597
  if (indexer) {
609
598
  const marketCollateralIndexer =
@@ -18,8 +18,9 @@ const isolatedAssetZod = zod.object({
18
18
  }),
19
19
  });
20
20
 
21
- const isolatedAssetKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey`; // prod
22
- // const isolatedAssetKeyType = `0x6c23585e940a989588432509107e98bae06dbca4e333f26d0635d401b3c7c76d::market_dynamic_keys::IsolatedAssetKey`;
21
+ // TODO: enable for production
22
+ // const isolatedAssetKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey`; // prod
23
+ const isolatedAssetKeyType = `0x6c23585e940a989588432509107e98bae06dbca4e333f26d0635d401b3c7c76d::market_dynamic_keys::IsolatedAssetKey`;
23
24
 
24
25
  /**
25
26
  * Return list of isolated assets coin types