@scallop-io/sui-scallop-sdk 1.4.6 → 1.4.8

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/index.d.ts +0 -1
  2. package/dist/constants/poolAddress.d.ts +1 -0
  3. package/dist/index.d.ts +0 -1
  4. package/dist/index.js +1657 -1472
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +1866 -1677
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/models/scallop.d.ts +1 -2
  9. package/dist/models/scallopCache.d.ts +16 -10
  10. package/dist/models/scallopQuery.d.ts +75 -3
  11. package/dist/queries/poolAddressesQuery.d.ts +2 -0
  12. package/dist/queries/portfolioQuery.d.ts +66 -3
  13. package/dist/types/model.d.ts +8 -2
  14. package/dist/utils/index.d.ts +0 -2
  15. package/package.json +1 -1
  16. package/src/constants/index.ts +0 -1
  17. package/src/constants/poolAddress.ts +93 -25
  18. package/src/index.ts +0 -1
  19. package/src/models/scallop.ts +8 -13
  20. package/src/models/scallopAddress.ts +2 -9
  21. package/src/models/scallopBuilder.ts +3 -6
  22. package/src/models/scallopCache.ts +88 -47
  23. package/src/models/scallopClient.ts +3 -6
  24. package/src/models/scallopIndexer.ts +1 -5
  25. package/src/models/scallopQuery.ts +49 -16
  26. package/src/models/scallopUtils.ts +7 -11
  27. package/src/queries/coreQuery.ts +4 -4
  28. package/src/queries/poolAddressesQuery.ts +6 -0
  29. package/src/queries/portfolioQuery.ts +238 -12
  30. package/src/queries/sCoinQuery.ts +2 -2
  31. package/src/types/model.ts +13 -2
  32. package/src/utils/index.ts +0 -2
  33. package/src/utils/indexer.ts +3 -1
  34. package/dist/constants/tokenBucket.d.ts +0 -2
  35. package/dist/utils/tokenBucket.d.ts +0 -11
  36. package/src/constants/tokenBucket.ts +0 -2
  37. package/src/utils/tokenBucket.ts +0 -68
package/dist/index.js CHANGED
@@ -35,8 +35,6 @@ __export(src_exports, {
35
35
  BORROW_FEE_PROTOCOL_ID: () => BORROW_FEE_PROTOCOL_ID,
36
36
  COIN_GECKGO_IDS: () => COIN_GECKGO_IDS,
37
37
  DEFAULT_CACHE_OPTIONS: () => DEFAULT_CACHE_OPTIONS,
38
- DEFAULT_INTERVAL_IN_MS: () => DEFAULT_INTERVAL_IN_MS,
39
- DEFAULT_TOKENS_PER_INTERVAL: () => DEFAULT_TOKENS_PER_INTERVAL,
40
38
  FlashLoanFeeObjectMap: () => FlashLoanFeeObjectMap,
41
39
  IS_VE_SCA_TEST: () => IS_VE_SCA_TEST,
42
40
  MAX_LOCK_DURATION: () => MAX_LOCK_DURATION,
@@ -71,11 +69,9 @@ __export(src_exports, {
71
69
  ScallopQuery: () => ScallopQuery,
72
70
  ScallopUtils: () => ScallopUtils,
73
71
  TEST_ADDRESSES: () => TEST_ADDRESSES,
74
- TokenBucket: () => TokenBucket,
75
72
  UNLOCK_ROUND_DURATION: () => UNLOCK_ROUND_DURATION,
76
73
  USE_TEST_ADDRESS: () => USE_TEST_ADDRESS,
77
74
  assetCoins: () => assetCoins,
78
- callWithRateLimit: () => callWithRateLimit,
79
75
  coinDecimals: () => coinDecimals,
80
76
  coinIds: () => coinIds,
81
77
  marketCoins: () => marketCoins,
@@ -446,7 +442,9 @@ var POOL_ADDRESSES = {
446
442
  spool: "0x0b5f5f413bd3799e4052c37311966c77f3a4545eb125d2e93e67a68478021918",
447
443
  spoolReward: "0x85ed6ed72ea97c35dbf0cdc7ed6fbc48d8ec15de9b17c74bf4512df8a6d7f166",
448
444
  sCoinTreasury: "0xbe6b63021f3d82e0e7e977cdd718ed7c019cf2eba374b7b546220402452f938e",
449
- coinDecimalId: "0x69b7a7c3c200439c1b5f3b19d7d495d5966d5f08de66c69276152f8db3992ec6"
445
+ sCoinType: "0x854950aa624b1df59fe64e630b2ba7c550642e9342267a33061d59fb31582da5::scallop_usdc::SCALLOP_USDC",
446
+ coinDecimalId: "0x69b7a7c3c200439c1b5f3b19d7d495d5966d5f08de66c69276152f8db3992ec6",
447
+ coinType: "dba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC"
450
448
  },
451
449
  sbeth: {
452
450
  lendingPoolAddress: "0xaa34c938e0394e5186c7dc626ad69be96af2194b23fdc6ac1c63090e399f5ba4",
@@ -461,7 +459,9 @@ var POOL_ADDRESSES = {
461
459
  spool: void 0,
462
460
  spoolReward: void 0,
463
461
  sCoinTreasury: "0xfd0f02def6358a1f266acfa1493d4707ee8387460d434fb667d63d755ff907ed",
464
- coinDecimalId: "0x89b04ba87f8832d4d76e17a1c9dce72eb3e64d372cf02012b8d2de5384faeef0"
462
+ sCoinType: "0xb14f82d8506d139eacef109688d1b71e7236bcce9b2c0ad526abcd6aa5be7de0::scallop_sb_eth::SCALLOP_SB_ETH",
463
+ coinDecimalId: "0x89b04ba87f8832d4d76e17a1c9dce72eb3e64d372cf02012b8d2de5384faeef0",
464
+ coinType: "d0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH"
465
465
  },
466
466
  weth: {
467
467
  lendingPoolAddress: "0xc8fcdff48efc265740ae0b74aae3faccae9ec00034039a113f3339798035108c",
@@ -476,7 +476,9 @@ var POOL_ADDRESSES = {
476
476
  spool: "0xeec40beccb07c575bebd842eeaabb835f77cd3dab73add433477e57f583a6787",
477
477
  spoolReward: "0x957de68a18d87817de8309b30c1ec269a4d87ae513abbeed86b5619cb9ce1077",
478
478
  sCoinTreasury: "0x4b7f5da0e306c9d52490a0c1d4091e653d6b89778b9b4f23c877e534e4d9cd21",
479
- coinDecimalId: "0x8900e4ceede3363bef086d6b50ca89d816d0e90bf6bc46efefe1f8455e08f50f"
479
+ sCoinType: "0x67540ceb850d418679e69f1fb6b2093d6df78a2a699ffc733f7646096d552e9b::scallop_wormhole_eth::SCALLOP_WORMHOLE_ETH",
480
+ coinDecimalId: "0x8900e4ceede3363bef086d6b50ca89d816d0e90bf6bc46efefe1f8455e08f50f",
481
+ coinType: "af8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN"
480
482
  },
481
483
  wbtc: {
482
484
  lendingPoolAddress: "0x65cc08a5aca0a0b8d72e1993ded8d145f06dd102fd0d8f285b92934faed564ab",
@@ -491,7 +493,9 @@ var POOL_ADDRESSES = {
491
493
  spool: void 0,
492
494
  spoolReward: void 0,
493
495
  sCoinTreasury: "0xe2883934ea42c99bc998bbe0f01dd6d27aa0e27a56455707b1b34e6a41c20baa",
494
- coinDecimalId: "0x5d3c6e60eeff8a05b693b481539e7847dfe33013e7070cdcb387f5c0cac05dfd"
496
+ sCoinType: "0x2cf76a9cf5d3337961d1154283234f94da2dcff18544dfe5cbdef65f319591b5::scallop_wormhole_btc::SCALLOP_WORMHOLE_BTC",
497
+ coinDecimalId: "0x5d3c6e60eeff8a05b693b481539e7847dfe33013e7070cdcb387f5c0cac05dfd",
498
+ coinType: "027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN"
495
499
  },
496
500
  wusdc: {
497
501
  lendingPoolAddress: "0x2f4df5e1368fbbdaa5c712d28b837b3d41c2d3872979ccededcdfdac55ff8a93",
@@ -506,7 +510,9 @@ var POOL_ADDRESSES = {
506
510
  spool: "0x4ace6648ddc64e646ba47a957c562c32c9599b3bba8f5ac1aadb2ae23a2f8ca0",
507
511
  spoolReward: "0xf4268cc9b9413b9bfe09e8966b8de650494c9e5784bf0930759cfef4904daff8",
508
512
  sCoinTreasury: "0x50c5cfcbcca3aaacab0984e4d7ad9a6ad034265bebb440f0d1cd688ec20b2548",
509
- coinDecimalId: "0x4fbf84f3029bd0c0b77164b587963be957f853eccf834a67bb9ecba6ec80f189"
513
+ sCoinType: "0xad4d71551d31092230db1fd482008ea42867dbf27b286e9c70a79d2a6191d58d::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC",
514
+ coinDecimalId: "0x4fbf84f3029bd0c0b77164b587963be957f853eccf834a67bb9ecba6ec80f189",
515
+ coinType: "5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN"
510
516
  },
511
517
  wusdt: {
512
518
  lendingPoolAddress: "0xfbc056f126dd35adc1f8fe985e2cedc8010e687e8e851e1c5b99fdf63cd1c879",
@@ -521,7 +527,9 @@ var POOL_ADDRESSES = {
521
527
  spool: "0xcb328f7ffa7f9342ed85af3fdb2f22919e1a06dfb2f713c04c73543870d7548f",
522
528
  spoolReward: "0x2c9f934d67a5baa586ceec2cc24163a2f049a6af3d5ba36b84d8ac40f25c4080",
523
529
  sCoinTreasury: "0x1f02e2fed702b477732d4ad6044aaed04f2e8e586a169153694861a901379df0",
524
- coinDecimalId: "0xfb0e3eb97dd158a5ae979dddfa24348063843c5b20eb8381dd5fa7c93699e45c"
530
+ sCoinType: "0xe6e5a012ec20a49a3d1d57bd2b67140b96cd4d3400b9d79e541f7bdbab661f95::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT",
531
+ coinDecimalId: "0xfb0e3eb97dd158a5ae979dddfa24348063843c5b20eb8381dd5fa7c93699e45c",
532
+ coinType: "c060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN"
525
533
  },
526
534
  sui: {
527
535
  lendingPoolAddress: "0x9c9077abf7a29eebce41e33addbcd6f5246a5221dd733e56ea0f00ae1b25c9e8",
@@ -536,7 +544,9 @@ var POOL_ADDRESSES = {
536
544
  spool: "0x4f0ba970d3c11db05c8f40c64a15b6a33322db3702d634ced6536960ab6f3ee4",
537
545
  spoolReward: "0x162250ef72393a4ad3d46294c4e1bdfcb03f04c869d390e7efbfc995353a7ee9",
538
546
  sCoinTreasury: "0x5c1678c8261ac9eec024d4d630006a9f55c80dc0b1aa38a003fcb1d425818c6b",
539
- coinDecimalId: "0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3"
547
+ sCoinType: "0xaafc4f740de0dd0dde642a31148fb94517087052f19afb0f7bed1dc41a50c77b::scallop_sui::SCALLOP_SUI",
548
+ coinDecimalId: "0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3",
549
+ coinType: "0000000000000000000000000000000000000000000000000000000000000002::sui::SUI"
540
550
  },
541
551
  wapt: {
542
552
  lendingPoolAddress: "0xca8c14a24e0c32b198eaf479a3317461e3cc339097ce88eaf296a15df8dcfdf5",
@@ -551,22 +561,9 @@ var POOL_ADDRESSES = {
551
561
  spool: void 0,
552
562
  spoolReward: void 0,
553
563
  sCoinTreasury: void 0,
554
- coinDecimalId: "0xc969c5251f372c0f34c32759f1d315cf1ea0ee5e4454b52aea08778eacfdd0a8"
555
- },
556
- wsol: {
557
- lendingPoolAddress: "0x985682c42984cdfb03f9ff7d8923344c2fe096b1ae4b82ea17721af19d22a21f",
558
- collateralPoolAddress: "0xdc1cc2c371a043ae8e3c3fe2d013c35f1346960b7dbb4c072982c5b794ed144f",
559
- borrowDynamic: "0xe3f301e16d4f1273ea659dd82c5c3f124ca5a5883a5726c7ec0f77bf43b70895",
560
- interestModel: "0xd95affaee077006b8dbb4b108c1b087e95fc6e5143ef0682da345d5b35bc6356",
561
- riskModel: "0x8e0da6358073144ec3557400c87f04991ba3a13ca7e0d0a19daed45260b32f16",
562
- borrowFeeKey: "0x604bffbc817e8e12db15f2373a9e15b2c7adbc510649cdf2cc62a594af90671c",
563
- supplyLimitKey: "0xbd419b536b3f9c9d4adfc20372ca6feedc53cc31798ac860dbfc847bcf05f54b",
564
- borrowLimitKey: "0x77d453c51948f32564c810bc73f9ba7abde880657b7f89e1c8a3bc28fa36ee87",
565
- isolatedAssetKey: void 0,
566
- spool: void 0,
567
- spoolReward: void 0,
568
- sCoinTreasury: "0x760fd66f5be869af4382fa32b812b3c67f0eca1bb1ed7a5578b21d56e1848819",
569
- coinDecimalId: "0x4d2c39082b4477e3e79dc4562d939147ab90c42fc5f3e4acf03b94383cd69b6e"
564
+ sCoinType: void 0,
565
+ coinDecimalId: "0xc969c5251f372c0f34c32759f1d315cf1ea0ee5e4454b52aea08778eacfdd0a8",
566
+ coinType: "3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37::coin::COIN"
570
567
  },
571
568
  cetus: {
572
569
  lendingPoolAddress: "0xc09858f60e74a1b671635bec4e8a2c84a0ff313eb87f525fba3258e88c6b6282",
@@ -581,7 +578,26 @@ var POOL_ADDRESSES = {
581
578
  spool: "0xac1bb13bf4472a637c18c2415fb0e3c1227ea2bcf35242e50563c98215bd298e",
582
579
  spoolReward: "0x6835c1224126a45086fc6406adc249e3f30df18d779ca4f4e570e38716a17f3f",
583
580
  sCoinTreasury: "0xa283c63488773c916cb3d6c64109536160d5eb496caddc721eb39aad2977d735",
584
- coinDecimalId: "0x4c0dce55eff2db5419bbd2d239d1aa22b4a400c01bbb648b058a9883989025da"
581
+ sCoinType: "0xea346ce428f91ab007210443efcea5f5cdbbb3aae7e9affc0ca93f9203c31f0c::scallop_cetus::SCALLOP_CETUS",
582
+ coinDecimalId: "0x4c0dce55eff2db5419bbd2d239d1aa22b4a400c01bbb648b058a9883989025da",
583
+ coinType: "06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS"
584
+ },
585
+ wsol: {
586
+ lendingPoolAddress: "0x985682c42984cdfb03f9ff7d8923344c2fe096b1ae4b82ea17721af19d22a21f",
587
+ collateralPoolAddress: "0xdc1cc2c371a043ae8e3c3fe2d013c35f1346960b7dbb4c072982c5b794ed144f",
588
+ borrowDynamic: "0xe3f301e16d4f1273ea659dd82c5c3f124ca5a5883a5726c7ec0f77bf43b70895",
589
+ interestModel: "0xd95affaee077006b8dbb4b108c1b087e95fc6e5143ef0682da345d5b35bc6356",
590
+ riskModel: "0x8e0da6358073144ec3557400c87f04991ba3a13ca7e0d0a19daed45260b32f16",
591
+ borrowFeeKey: "0x604bffbc817e8e12db15f2373a9e15b2c7adbc510649cdf2cc62a594af90671c",
592
+ supplyLimitKey: "0xbd419b536b3f9c9d4adfc20372ca6feedc53cc31798ac860dbfc847bcf05f54b",
593
+ borrowLimitKey: "0x77d453c51948f32564c810bc73f9ba7abde880657b7f89e1c8a3bc28fa36ee87",
594
+ isolatedAssetKey: void 0,
595
+ spool: void 0,
596
+ spoolReward: void 0,
597
+ sCoinTreasury: "0x760fd66f5be869af4382fa32b812b3c67f0eca1bb1ed7a5578b21d56e1848819",
598
+ sCoinType: "0x1392650f2eca9e3f6ffae3ff89e42a3590d7102b80e2b430f674730bc30d3259::scallop_wormhole_sol::SCALLOP_WORMHOLE_SOL",
599
+ coinDecimalId: "0x4d2c39082b4477e3e79dc4562d939147ab90c42fc5f3e4acf03b94383cd69b6e",
600
+ coinType: "b7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8::coin::COIN"
585
601
  },
586
602
  afsui: {
587
603
  lendingPoolAddress: "0x9b942a24ce390b7f5016d34a0217057bf9487b92aa6d7cc9894271dbbe62471a",
@@ -596,7 +612,9 @@ var POOL_ADDRESSES = {
596
612
  spool: "0xeedf438abcaa6ce4d9625ffca110920592d5867e4c5637d84ad9f466c4feb800",
597
613
  spoolReward: "0x89255a2f86ed7fbfef35ab8b7be48cc7667015975be2685dd9a55a9a64baf76e",
598
614
  sCoinTreasury: "0x55f4dfe9e40bc4cc11c70fcb1f3daefa2bdc330567c58d4f0792fbd9f9175a62",
599
- coinDecimalId: "0x2f9217f533e51334873a39b8026a4aa6919497b47f49d0986a4f1aec66f8a34d"
615
+ sCoinType: "0x00671b1fa2a124f5be8bdae8b91ee711462c5d9e31bda232e70fd9607b523c88::scallop_af_sui::SCALLOP_AF_SUI",
616
+ coinDecimalId: "0x2f9217f533e51334873a39b8026a4aa6919497b47f49d0986a4f1aec66f8a34d",
617
+ coinType: "f325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI"
600
618
  },
601
619
  hasui: {
602
620
  lendingPoolAddress: "0x7ebc607f6bdeb659fb6506cb91c5cc1d47bb365cfd5d2e637ea765346ec84ed4",
@@ -611,7 +629,9 @@ var POOL_ADDRESSES = {
611
629
  spool: "0xa6148bc1b623e936d39a952ceb5bea79e8b37228a8f595067bf1852efd3c34aa",
612
630
  spoolReward: "0x6f3563644d3e2ef13176dbf9d865bd93479df60ccbe07b7e66db57f6309f5a66",
613
631
  sCoinTreasury: "0x404ccc1404d74a90eb6f9c9d4b6cda6d417fb03189f80d9070a35e5dab1df0f5",
614
- coinDecimalId: "0x2c5f33af93f6511df699aaaa5822d823aac6ed99d4a0de2a4a50b3afa0172e24"
632
+ sCoinType: "0x9a2376943f7d22f88087c259c5889925f332ca4347e669dc37d54c2bf651af3c::scallop_ha_sui::SCALLOP_HA_SUI",
633
+ coinDecimalId: "0x2c5f33af93f6511df699aaaa5822d823aac6ed99d4a0de2a4a50b3afa0172e24",
634
+ coinType: "bde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI"
615
635
  },
616
636
  vsui: {
617
637
  lendingPoolAddress: "0xda9257c0731d8822e8a438ebced13415850d705b779c79958dcf2aeb21fcb43d",
@@ -626,7 +646,9 @@ var POOL_ADDRESSES = {
626
646
  spool: "0x69ce8e537e750a95381e6040794afa5ab1758353a1a2e1de7760391b01f91670",
627
647
  spoolReward: "0xbca914adce058ad0902c7f3cfcd698392a475f00dcfdc3f76001d0370b98777a",
628
648
  sCoinTreasury: "0xc06688ee1af25abc286ffb1d18ce273d1d5907cd1064c25f4e8ca61ea989c1d1",
629
- coinDecimalId: "0xabd84a23467b33854ab25cf862006fd97479f8f6f53e50fe732c43a274d939bd"
649
+ sCoinType: "0xe1a1cc6bcf0001a015eab84bcc6713393ce20535f55b8b6f35c142e057a25fbe::scallop_v_sui::SCALLOP_V_SUI",
650
+ coinDecimalId: "0xabd84a23467b33854ab25cf862006fd97479f8f6f53e50fe732c43a274d939bd",
651
+ coinType: "549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT"
630
652
  },
631
653
  sca: {
632
654
  lendingPoolAddress: "0x6fc7d4211fc7018b6c75e7b908b88f2e0536443239804a3d32af547637bd28d7",
@@ -641,7 +663,9 @@ var POOL_ADDRESSES = {
641
663
  spool: void 0,
642
664
  spoolReward: void 0,
643
665
  sCoinTreasury: "0xe04bfc95e00252bd654ee13c08edef9ac5e4b6ae4074e8390db39e9a0109c529",
644
- coinDecimalId: "0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844"
666
+ sCoinType: "0x5ca17430c1d046fae9edeaa8fd76c7b4193a00d764a0ecfa9418d733ad27bc1e::scallop_sca::SCALLOP_SCA",
667
+ coinDecimalId: "0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844",
668
+ coinType: "7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA"
645
669
  },
646
670
  fud: {
647
671
  lendingPoolAddress: "0xefed2cbe76b344792ac724523c8b2236740d1cea2100d46a0ed0dc760c7f4231",
@@ -656,7 +680,9 @@ var POOL_ADDRESSES = {
656
680
  spool: void 0,
657
681
  spoolReward: void 0,
658
682
  sCoinTreasury: "0xf25212f11d182decff7a86165699a73e3d5787aced203ca539f43cfbc10db867",
659
- coinDecimalId: "0x01087411ef48aaac1eb6e24803213e3a60a03b147dac930e5e341f17a85e524e"
683
+ sCoinType: "0xe56d5167f427cbe597da9e8150ef5c337839aaf46891d62468dcf80bdd8e10d1::scallop_fud::SCALLOP_FUD",
684
+ coinDecimalId: "0x01087411ef48aaac1eb6e24803213e3a60a03b147dac930e5e341f17a85e524e",
685
+ coinType: "76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD"
660
686
  },
661
687
  deep: {
662
688
  lendingPoolAddress: "0xf4a67ffb43da1e1c61c049f188f19463ea8dbbf2d5ef4722d6df854ff1b1cc03",
@@ -671,7 +697,9 @@ var POOL_ADDRESSES = {
671
697
  spool: void 0,
672
698
  spoolReward: void 0,
673
699
  sCoinTreasury: "0xc63838fabe37b25ad897392d89876d920f5e0c6a406bf3abcb84753d2829bc88",
674
- coinDecimalId: "0x6e60b051a08fa836f5a7acd7c464c8d9825bc29c44657fe170fe9b8e1e4770c0"
700
+ sCoinType: "0xeb7a05a3224837c5e5503575aed0be73c091d1ce5e43aa3c3e716e0ae614608f::scallop_deep::SCALLOP_DEEP",
701
+ coinDecimalId: "0x6e60b051a08fa836f5a7acd7c464c8d9825bc29c44657fe170fe9b8e1e4770c0",
702
+ coinType: "deeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP"
675
703
  },
676
704
  fdusd: {
677
705
  lendingPoolAddress: "0x4f46051a01f05c3ad9aecf29a771aad5c884e1a1888e08d7709085e3a095bc9c",
@@ -686,7 +714,9 @@ var POOL_ADDRESSES = {
686
714
  spool: void 0,
687
715
  spoolReward: void 0,
688
716
  sCoinTreasury: "0xdad9bc6293e694f67a5274ea51b596e0bdabfafc585ae6d7e82888e65f1a03e0",
689
- coinDecimalId: "0xdebee5265a67c186ed87fe93303d33dfe1de53e3b4fd7d9329c2852860acd3e7"
717
+ sCoinType: "0x6711551c1e7652a270d9fbf0eee25d99594c157cde3cb5fbb49035eb59b1b001::scallop_fdusd::SCALLOP_FDUSD",
718
+ coinDecimalId: "0xdebee5265a67c186ed87fe93303d33dfe1de53e3b4fd7d9329c2852860acd3e7",
719
+ coinType: "f16e6b723f242ec745dfd7634ad072c42d5c1d9ac9d62a39c381303eaa57693a::fdusd::FDUSD"
690
720
  }
691
721
  };
692
722
 
@@ -1294,10 +1324,6 @@ var TEST_ADDRESSES = {
1294
1324
  }
1295
1325
  };
1296
1326
 
1297
- // src/constants/tokenBucket.ts
1298
- var DEFAULT_TOKENS_PER_INTERVAL = 10;
1299
- var DEFAULT_INTERVAL_IN_MS = 250;
1300
-
1301
1327
  // src/constants/vesca.ts
1302
1328
  var UNLOCK_ROUND_DURATION = 60 * 60 * 24;
1303
1329
  var MAX_LOCK_ROUNDS = 1460;
@@ -1305,1027 +1331,400 @@ var MAX_LOCK_DURATION = MAX_LOCK_ROUNDS * UNLOCK_ROUND_DURATION;
1305
1331
  var MIN_INITIAL_LOCK_AMOUNT = 1e10;
1306
1332
  var MIN_TOP_UP_AMOUNT = 1e9;
1307
1333
 
1308
- // src/models/scallopAddress.ts
1309
- var import_sui_kit2 = require("@scallop-io/sui-kit");
1310
-
1311
1334
  // src/models/scallopCache.ts
1312
1335
  var import_query_core = require("@tanstack/query-core");
1313
- var import_sui_kit = require("@scallop-io/sui-kit");
1336
+ var import_sui_kit2 = require("@scallop-io/sui-kit");
1314
1337
 
1315
- // src/utils/builder.ts
1316
- var requireSender = (txBlock) => {
1317
- const sender = txBlock.blockData.sender;
1318
- if (!sender) {
1319
- throw new Error("Sender is required");
1320
- }
1321
- return sender;
1338
+ // src/models/suiKit.ts
1339
+ var import_sui_kit = require("@scallop-io/sui-kit");
1340
+ var newSuiKit = (params) => {
1341
+ return new import_sui_kit.SuiKit({
1342
+ ...params,
1343
+ fullnodeUrls: Array.from(
1344
+ /* @__PURE__ */ new Set([...params.fullnodeUrls ?? [], ...RPC_PROVIDERS])
1345
+ )
1346
+ });
1322
1347
  };
1323
- var checkVesca = (prevUnlockAtInMillisTimestamp) => {
1324
- if (prevUnlockAtInMillisTimestamp === void 0) {
1325
- throw new Error("veSca not found");
1348
+
1349
+ // src/models/scallopCache.ts
1350
+ var DEFAULT_TOKENS_PER_INTERVAL = 10;
1351
+ var DEFAULT_INTERVAL_IN_MS = 250;
1352
+ var ScallopCache = class {
1353
+ constructor(params, instance) {
1354
+ this.tokensPerInterval = DEFAULT_TOKENS_PER_INTERVAL;
1355
+ this.interval = DEFAULT_INTERVAL_IN_MS;
1356
+ this.params = params;
1357
+ this.suiKit = instance?.suiKit ?? newSuiKit(params);
1358
+ this.queryClient = instance?.queryClient ?? new import_query_core.QueryClient(params?.cacheOptions ?? DEFAULT_CACHE_OPTIONS);
1359
+ this.tokens = this.tokensPerInterval;
1360
+ this.lastRefill = Date.now();
1361
+ this.walletAddress = params.walletAddress ?? this.suiKit.currentAddress();
1326
1362
  }
1327
- };
1328
- var checkVescaExpired = (prevUnlockAtInMillisTimestamp) => {
1329
- if (prevUnlockAtInMillisTimestamp <= (/* @__PURE__ */ new Date()).getTime()) {
1330
- throw new Error("veSca is expired, use renewExpiredVeScaQuick instead");
1363
+ get client() {
1364
+ return this.suiKit.client();
1331
1365
  }
1332
- };
1333
- var checkExtendLockPeriod = (lockPeriodInDays, newUnlockAtInSecondTimestamp, prevUnlockAtInMillisTimestamp) => {
1334
- checkVesca(prevUnlockAtInMillisTimestamp);
1335
- checkVescaExpired(prevUnlockAtInMillisTimestamp);
1336
- const prevUnlockAtInSecondTimestamp = Math.floor(
1337
- prevUnlockAtInMillisTimestamp / 1e3
1338
- );
1339
- if (lockPeriodInDays < 1) {
1340
- throw new Error("Minimum lock period is 1 day");
1366
+ refill() {
1367
+ const now = Date.now();
1368
+ const elapsed = now - this.lastRefill;
1369
+ if (elapsed >= this.interval) {
1370
+ const tokensToAdd = Math.floor(elapsed / this.interval) * this.tokensPerInterval;
1371
+ this.tokens = Math.min(this.tokens + tokensToAdd, this.tokensPerInterval);
1372
+ this.lastRefill += Math.floor(elapsed / this.interval) * this.interval;
1373
+ }
1341
1374
  }
1342
- const availableLockPeriodInDays = Math.floor(
1343
- (newUnlockAtInSecondTimestamp - prevUnlockAtInSecondTimestamp) / UNLOCK_ROUND_DURATION
1344
- );
1345
- if (lockPeriodInDays > availableLockPeriodInDays) {
1346
- throw new Error(
1347
- `Cannot extend lock period by ${lockPeriodInDays} days, maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days), remaining lock period is ${MAX_LOCK_ROUNDS - availableLockPeriodInDays}`
1348
- );
1375
+ removeTokens(count) {
1376
+ this.refill();
1377
+ if (this.tokens >= count) {
1378
+ this.tokens -= count;
1379
+ return true;
1380
+ }
1381
+ return false;
1349
1382
  }
1350
- };
1351
- var checkLockSca = (scaAmountOrCoin, lockPeriodInDays, newUnlockAtInSecondTimestamp, prevUnlockAtInMillisTimestamp) => {
1352
- const prevUnlockAtInSecondTimestamp = prevUnlockAtInMillisTimestamp ? Math.floor(prevUnlockAtInMillisTimestamp / 1e3) : void 0;
1353
- const isInitialLock = !prevUnlockAtInSecondTimestamp;
1354
- const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1e3 <= (/* @__PURE__ */ new Date()).getTime();
1355
- if (isInitialLock || isLockExpired) {
1356
- if (scaAmountOrCoin !== void 0 && lockPeriodInDays !== void 0) {
1357
- if (lockPeriodInDays <= 0) {
1358
- throw new Error("Lock period must be greater than 0");
1383
+ async callWithRateLimit(fn, maxRetries = 15, backoffFactor = 1.25) {
1384
+ let retries = 0;
1385
+ const tryRequest = async () => {
1386
+ if (this.removeTokens(1)) {
1387
+ const result = await fn();
1388
+ return result;
1389
+ } else if (retries < maxRetries) {
1390
+ retries++;
1391
+ const delay = this.interval * Math.pow(backoffFactor, retries);
1392
+ await new Promise((resolve) => setTimeout(resolve, delay));
1393
+ return tryRequest();
1394
+ } else {
1395
+ console.error("Maximum retries reached");
1396
+ return null;
1359
1397
  }
1360
- if (typeof scaAmountOrCoin === "number" && scaAmountOrCoin < MIN_INITIAL_LOCK_AMOUNT) {
1361
- throw new Error(
1362
- `Minimum lock amount for ${isLockExpired ? "renewing expired veSca" : "initial lock"} is 10 SCA`
1398
+ };
1399
+ return tryRequest();
1400
+ }
1401
+ /**
1402
+ * @description Invalidate cache based on the refetchType parameter
1403
+ * @param refetchType Determines the type of queries to be refetched. Defaults to `active`.
1404
+ *
1405
+ * - `active`: Only queries that match the refetch predicate and are actively being rendered via useQuery and related functions will be refetched in the background.
1406
+ * - `inactive`: Only queries that match the refetch predicate and are NOT actively being rendered via useQuery and related functions will be refetched in the background.
1407
+ * - `all`: All queries that match the refetch predicate will be refetched in the background.
1408
+ * - `none`: No queries will be refetched. Queries that match the refetch predicate will only be marked as invalid.
1409
+ */
1410
+ // public async invalidateAllCache() {
1411
+ // return Object.values(queryKeys.rpc).map((t) =>
1412
+ // this.queryClient.invalidateQueries({
1413
+ // queryKey: t(),
1414
+ // type: 'all',
1415
+ // })
1416
+ // );
1417
+ // }
1418
+ retryFn(errCount, e) {
1419
+ if (errCount === 5)
1420
+ return false;
1421
+ if (e.status === 429)
1422
+ return true;
1423
+ return false;
1424
+ }
1425
+ /**
1426
+ * @description Provides cache for inspectTxn of the SuiKit.
1427
+ * @param QueryInspectTxnParams
1428
+ * @param txBlock
1429
+ * @returns Promise<DevInspectResults>
1430
+ */
1431
+ async queryInspectTxn({
1432
+ queryTarget,
1433
+ args,
1434
+ typeArgs
1435
+ }) {
1436
+ const txBlock = new import_sui_kit2.SuiTxBlock();
1437
+ const resolvedQueryTarget = await this.queryGetNormalizedMoveFunction(queryTarget);
1438
+ if (!resolvedQueryTarget)
1439
+ throw new Error("Invalid query target");
1440
+ const { parameters } = resolvedQueryTarget;
1441
+ const resolvedArgs = await Promise.all(
1442
+ (args ?? []).map(async (arg, idx) => {
1443
+ if (typeof arg !== "string")
1444
+ return arg;
1445
+ const cachedData = (await this.queryGetObject(arg))?.data;
1446
+ if (!cachedData)
1447
+ return arg;
1448
+ const owner = cachedData.owner;
1449
+ if (!owner || typeof owner !== "object" || !("Shared" in owner))
1450
+ return {
1451
+ objectId: cachedData.objectId,
1452
+ version: cachedData.version,
1453
+ digest: cachedData.digest
1454
+ };
1455
+ const parameter = parameters[idx];
1456
+ if (typeof parameter !== "object" || !("MutableReference" in parameter || "Reference" in parameter))
1457
+ return arg;
1458
+ return {
1459
+ objectId: cachedData.objectId,
1460
+ initialSharedVersion: owner.Shared.initial_shared_version,
1461
+ mutable: "MutableReference" in parameter
1462
+ };
1463
+ })
1464
+ );
1465
+ txBlock.moveCall(queryTarget, resolvedArgs, typeArgs);
1466
+ const query = await this.queryClient.fetchQuery({
1467
+ retry: this.retryFn,
1468
+ retryDelay: 1e3,
1469
+ queryKey: queryKeys.rpc.getInspectTxn(queryTarget, args, typeArgs),
1470
+ queryFn: async () => {
1471
+ return await this.callWithRateLimit(
1472
+ async () => await this.suiKit.inspectTxn(txBlock)
1363
1473
  );
1364
1474
  }
1365
- const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;
1366
- if (extendLockPeriodInSecond > MAX_LOCK_DURATION) {
1367
- throw new Error(
1368
- `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days)`
1475
+ });
1476
+ return query;
1477
+ }
1478
+ async queryGetNormalizedMoveFunction(target) {
1479
+ const { address, module: module2, name } = (0, import_sui_kit2.parseStructTag)(target);
1480
+ return this.queryClient.fetchQuery({
1481
+ queryKey: queryKeys.rpc.getNormalizedMoveFunction(target),
1482
+ queryFn: async () => {
1483
+ return await this.callWithRateLimit(
1484
+ async () => await this.suiKit.client().getNormalizedMoveFunction({
1485
+ package: address,
1486
+ module: module2,
1487
+ function: name
1488
+ })
1369
1489
  );
1370
1490
  }
1371
- } else {
1372
- throw new Error(
1373
- `SCA amount and lock period is required for ${isLockExpired ? "renewing expired veSca" : "initial lock"}`
1374
- );
1375
- }
1376
- } else {
1377
- checkVesca(prevUnlockAtInMillisTimestamp);
1378
- checkVescaExpired(prevUnlockAtInMillisTimestamp);
1379
- if (typeof scaAmountOrCoin === "number" && scaAmountOrCoin < MIN_TOP_UP_AMOUNT) {
1380
- throw new Error("Minimum top up amount is 1 SCA");
1381
- }
1382
- if (newUnlockAtInSecondTimestamp && lockPeriodInDays) {
1383
- checkExtendLockPeriod(
1384
- lockPeriodInDays,
1385
- newUnlockAtInSecondTimestamp,
1386
- prevUnlockAtInMillisTimestamp
1387
- );
1388
- }
1491
+ });
1389
1492
  }
1390
- };
1391
- var checkExtendLockAmount = (scaAmount, prevUnlockAtInMillisTimestamp) => {
1392
- checkVesca(prevUnlockAtInMillisTimestamp);
1393
- checkVescaExpired(prevUnlockAtInMillisTimestamp);
1394
- if (scaAmount < MIN_TOP_UP_AMOUNT) {
1395
- throw new Error("Minimum top up amount is 1 SCA");
1493
+ /**
1494
+ * @description Provides cache for getObject of the SuiKit.
1495
+ * @param objectId
1496
+ * @param QueryObjectParams
1497
+ * @returns Promise<SuiObjectResponse>
1498
+ */
1499
+ async queryGetObject(objectId, options) {
1500
+ options = {
1501
+ ...options,
1502
+ showOwner: true,
1503
+ showContent: true
1504
+ };
1505
+ return this.queryClient.fetchQuery({
1506
+ retry: this.retryFn,
1507
+ retryDelay: 1e3,
1508
+ queryKey: queryKeys.rpc.getObject(objectId, options),
1509
+ queryFn: async () => {
1510
+ return await this.callWithRateLimit(
1511
+ async () => await this.client.getObject({
1512
+ id: objectId,
1513
+ options
1514
+ })
1515
+ );
1516
+ }
1517
+ });
1396
1518
  }
1397
- const isInitialLock = !prevUnlockAtInMillisTimestamp;
1398
- const isLockExpired = !isInitialLock && prevUnlockAtInMillisTimestamp <= (/* @__PURE__ */ new Date()).getTime();
1399
- if (isLockExpired) {
1400
- throw new Error("veSca is expired, use renewExpiredVeScaQuick instead");
1519
+ /**
1520
+ * @description Provides cache for getObjects of the SuiKit.
1521
+ * @param objectIds
1522
+ * @returns Promise<SuiObjectData[]>
1523
+ */
1524
+ async queryGetObjects(objectIds, options = {
1525
+ showContent: true
1526
+ }) {
1527
+ if (objectIds.length === 0)
1528
+ return [];
1529
+ return this.queryClient.fetchQuery({
1530
+ retry: this.retryFn,
1531
+ retryDelay: 1e3,
1532
+ queryKey: queryKeys.rpc.getObjects(
1533
+ objectIds,
1534
+ this.walletAddress,
1535
+ options
1536
+ ),
1537
+ queryFn: async () => {
1538
+ const results = await this.callWithRateLimit(
1539
+ async () => await this.suiKit.getObjects(objectIds, options)
1540
+ );
1541
+ if (results) {
1542
+ results.forEach((result) => {
1543
+ this.queryClient.setQueriesData(
1544
+ {
1545
+ exact: false,
1546
+ queryKey: queryKeys.rpc.getObject(result.objectId, options)
1547
+ },
1548
+ {
1549
+ data: result,
1550
+ error: null
1551
+ },
1552
+ {
1553
+ updatedAt: Date.now()
1554
+ }
1555
+ );
1556
+ });
1557
+ }
1558
+ return results;
1559
+ }
1560
+ });
1401
1561
  }
1402
- };
1403
- var checkRenewExpiredVeSca = (scaAmount, lockPeriodInDays, prevUnlockAtInMillisTimestamp) => {
1404
- if (!prevUnlockAtInMillisTimestamp || prevUnlockAtInMillisTimestamp > (/* @__PURE__ */ new Date()).getTime()) {
1405
- throw new Error("Renew method can only be used for expired veSca");
1562
+ /**
1563
+ * @description Provides cache for getOwnedObjects of the SuiKit.
1564
+ * @param input
1565
+ * @returns Promise<PaginatedObjectsResponse>
1566
+ */
1567
+ async queryGetOwnedObjects(input) {
1568
+ return this.queryClient.fetchQuery({
1569
+ retry: this.retryFn,
1570
+ retryDelay: 1e3,
1571
+ queryKey: queryKeys.rpc.getOwnedObjects(input),
1572
+ queryFn: async () => {
1573
+ const results = await this.callWithRateLimit(
1574
+ async () => await this.client.getOwnedObjects(input)
1575
+ );
1576
+ if (results && results.data.length > 0) {
1577
+ results.data.filter(
1578
+ (result) => !!result.data
1579
+ ).forEach((result) => {
1580
+ this.queryClient.setQueriesData(
1581
+ {
1582
+ exact: false,
1583
+ queryKey: queryKeys.rpc.getObject(
1584
+ result.data.objectId,
1585
+ input.options ?? {}
1586
+ )
1587
+ },
1588
+ {
1589
+ data: result.data,
1590
+ error: null
1591
+ },
1592
+ {
1593
+ updatedAt: Date.now()
1594
+ }
1595
+ );
1596
+ });
1597
+ }
1598
+ return results;
1599
+ }
1600
+ });
1406
1601
  }
1407
- if (scaAmount < MIN_INITIAL_LOCK_AMOUNT) {
1408
- throw new Error("Minimum lock amount for renewing expired vesca 10 SCA");
1602
+ async queryGetDynamicFields(input) {
1603
+ return this.queryClient.fetchQuery({
1604
+ retry: this.retryFn,
1605
+ retryDelay: 1e3,
1606
+ queryKey: queryKeys.rpc.getDynamicFields(input),
1607
+ queryFn: async () => {
1608
+ return await this.callWithRateLimit(
1609
+ async () => await this.client.getDynamicFields(input)
1610
+ );
1611
+ }
1612
+ });
1409
1613
  }
1410
- const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;
1411
- if (extendLockPeriodInSecond >= MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {
1412
- throw new Error(
1413
- `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`
1414
- );
1614
+ async queryGetDynamicFieldObject(input) {
1615
+ return this.queryClient.fetchQuery({
1616
+ retry: this.retryFn,
1617
+ retryDelay: (attemptIndex) => Math.min(1e3 * attemptIndex, 8e3),
1618
+ queryKey: queryKeys.rpc.getDynamicFieldObject(input),
1619
+ queryFn: async () => {
1620
+ const result = await this.callWithRateLimit(
1621
+ () => this.client.getDynamicFieldObject(input)
1622
+ );
1623
+ if (result?.data) {
1624
+ this.queryClient.setQueriesData(
1625
+ {
1626
+ exact: false,
1627
+ queryKey: queryKeys.rpc.getObject(result?.data.objectId, {
1628
+ showContent: true,
1629
+ showOwner: true
1630
+ })
1631
+ },
1632
+ {
1633
+ data: result.data,
1634
+ error: null
1635
+ },
1636
+ {
1637
+ updatedAt: Date.now()
1638
+ }
1639
+ );
1640
+ }
1641
+ return result;
1642
+ }
1643
+ });
1644
+ }
1645
+ async queryGetAllCoinBalances(owner) {
1646
+ return this.queryClient.fetchQuery({
1647
+ retry: this.retryFn,
1648
+ retryDelay: 1e3,
1649
+ queryKey: queryKeys.rpc.getAllCoinBalances(owner),
1650
+ queryFn: async () => {
1651
+ const allBalances = await this.callWithRateLimit(
1652
+ async () => await this.client.getAllBalances({ owner })
1653
+ );
1654
+ if (!allBalances)
1655
+ return {};
1656
+ const balances = allBalances.reduce(
1657
+ (acc, coinBalance) => {
1658
+ if (coinBalance.totalBalance !== "0") {
1659
+ acc[(0, import_sui_kit2.normalizeStructTag)(coinBalance.coinType)] = coinBalance;
1660
+ }
1661
+ return acc;
1662
+ },
1663
+ {}
1664
+ );
1665
+ return balances;
1666
+ }
1667
+ });
1668
+ }
1669
+ async queryGetCoinBalance(input) {
1670
+ if (!input.coinType)
1671
+ return null;
1672
+ return (await this.queryGetAllCoinBalances(input.owner) ?? {})[(0, import_sui_kit2.normalizeStructTag)(input.coinType)] ?? "0";
1415
1673
  }
1416
1674
  };
1417
1675
 
1418
- // src/utils/query.ts
1419
- var import_bignumber = __toESM(require("bignumber.js"));
1420
- var import_utils = require("@mysten/sui/utils");
1421
- var parseOriginMarketPoolData = (originMarketPoolData) => {
1422
- return {
1423
- coinType: (0, import_utils.normalizeStructTag)(originMarketPoolData.type.name),
1424
- // Parse origin data required for basic calculations.
1425
- maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,
1426
- borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,
1427
- borrowRateScale: Number(originMarketPoolData.interestRateScale),
1428
- borrowIndex: Number(originMarketPoolData.borrowIndex),
1429
- lastUpdated: Number(originMarketPoolData.lastUpdated),
1430
- cashAmount: Number(originMarketPoolData.cash),
1431
- debtAmount: Number(originMarketPoolData.debt),
1432
- marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),
1433
- reserveAmount: Number(originMarketPoolData.reserve),
1434
- reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,
1435
- borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,
1436
- borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,
1437
- // Parse origin data required for additional display.
1438
- baseBorrowRate: Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,
1439
- borrowRateOnHighKink: Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,
1440
- borrowRateOnMidKink: Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,
1441
- highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,
1442
- midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,
1443
- minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),
1444
- isIsolated: originMarketPoolData.isIsolated,
1445
- supplyLimit: Number(originMarketPoolData.supplyLimit),
1446
- borrowLimit: Number(originMarketPoolData.borrowLimit)
1447
- };
1448
- };
1449
- var calculateMarketPoolData = (utils, parsedMarketPoolData) => {
1450
- const poolCoinName = utils.parseCoinNameFromType(
1451
- parsedMarketPoolData.coinType
1452
- );
1453
- const coinDecimal = utils.getCoinDecimal(poolCoinName);
1454
- const borrowYearFactor = 24 * 365 * 3600;
1455
- const baseBorrowApr = parsedMarketPoolData.baseBorrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
1456
- const borrowAprOnHighKink = parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
1457
- const borrowAprOnMidKink = parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
1458
- const maxBorrowApr = parsedMarketPoolData.maxBorrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
1459
- const borrowApr = parsedMarketPoolData.borrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
1460
- const timeDelta = Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedMarketPoolData.lastUpdated;
1461
- const borrowIndexDelta = (0, import_bignumber.default)(parsedMarketPoolData.borrowIndex).multipliedBy(
1462
- (0, import_bignumber.default)(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate)
1463
- ).dividedBy(parsedMarketPoolData.borrowRateScale);
1464
- const currentBorrowIndex = (0, import_bignumber.default)(parsedMarketPoolData.borrowIndex).plus(
1465
- borrowIndexDelta
1466
- );
1467
- const growthInterest = (0, import_bignumber.default)(currentBorrowIndex).dividedBy(parsedMarketPoolData.borrowIndex).minus(1);
1468
- const increasedDebtAmount = (0, import_bignumber.default)(
1469
- parsedMarketPoolData.debtAmount
1470
- ).multipliedBy(growthInterest);
1471
- const borrowAmount = increasedDebtAmount.plus(
1472
- parsedMarketPoolData.debtAmount
1473
- );
1474
- const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);
1475
- const reserveAmount = (0, import_bignumber.default)(parsedMarketPoolData.reserveAmount).plus(
1476
- increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor)
1477
- );
1478
- const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);
1479
- const supplyAmount = (0, import_bignumber.default)(borrowAmount).plus(
1480
- Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0)
1481
- );
1482
- const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);
1483
- let utilizationRate = (0, import_bignumber.default)(borrowAmount).dividedBy(supplyAmount);
1484
- utilizationRate = utilizationRate.isFinite() ? utilizationRate : (0, import_bignumber.default)(0);
1485
- let supplyApr = (0, import_bignumber.default)(borrowApr).multipliedBy(utilizationRate).multipliedBy(1 - parsedMarketPoolData.reserveFactor);
1486
- supplyApr = supplyApr.isFinite() ? supplyApr : (0, import_bignumber.default)(0);
1487
- let conversionRate = supplyAmount.dividedBy(
1488
- parsedMarketPoolData.marketCoinSupplyAmount
1489
- );
1490
- conversionRate = conversionRate.isFinite() && !conversionRate.isNaN() ? conversionRate : (0, import_bignumber.default)(1);
1491
- return {
1492
- baseBorrowApr,
1493
- baseBorrowApy: utils.parseAprToApy(baseBorrowApr),
1494
- borrowAprOnHighKink,
1495
- borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),
1496
- borrowAprOnMidKink,
1497
- borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),
1498
- coinDecimal,
1499
- maxBorrowApr,
1500
- maxBorrowApy: utils.parseAprToApy(maxBorrowApr),
1501
- borrowApr: Math.min(borrowApr, maxBorrowApr),
1502
- borrowApy: Math.min(
1503
- utils.parseAprToApy(borrowApr),
1504
- utils.parseAprToApy(maxBorrowApr)
1505
- ),
1506
- borrowIndex: currentBorrowIndex.toNumber(),
1507
- growthInterest: growthInterest.toNumber(),
1508
- supplyAmount: supplyAmount.toNumber(),
1509
- supplyCoin: supplyCoin.toNumber(),
1510
- borrowAmount: borrowAmount.toNumber(),
1511
- borrowCoin: borrowCoin.toNumber(),
1512
- reserveAmount: reserveAmount.toNumber(),
1513
- reserveCoin: reserveCoin.toNumber(),
1514
- utilizationRate: utilizationRate.toNumber(),
1515
- supplyApr: supplyApr.toNumber(),
1516
- supplyApy: utils.parseAprToApy(supplyApr.toNumber()),
1517
- conversionRate: conversionRate.toNumber(),
1518
- isIsolated: parsedMarketPoolData.isIsolated,
1519
- maxSupplyCoin: (0, import_bignumber.default)(parsedMarketPoolData.supplyLimit).shiftedBy(-coinDecimal).toNumber(),
1520
- maxBorrowCoin: (0, import_bignumber.default)(parsedMarketPoolData.borrowLimit).shiftedBy(-coinDecimal).toNumber()
1521
- };
1522
- };
1523
- var parseOriginMarketCollateralData = (originMarketCollateralData) => {
1524
- const divisor = 2 ** 32;
1525
- return {
1526
- coinType: (0, import_utils.normalizeStructTag)(originMarketCollateralData.type.name),
1527
- isIsolated: originMarketCollateralData.isIsolated,
1528
- collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / divisor,
1529
- liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / divisor,
1530
- liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / divisor,
1531
- liquidationPenalty: Number(originMarketCollateralData.liquidationPenalty.value) / divisor,
1532
- liquidationReserveFactor: Number(originMarketCollateralData.liquidationReserveFactor.value) / divisor,
1533
- maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),
1534
- totalCollateralAmount: Number(
1535
- originMarketCollateralData.totalCollateralAmount
1536
- )
1537
- };
1538
- };
1539
- var calculateMarketCollateralData = (utils, parsedMarketCollateralData) => {
1540
- const collateralCoinName = utils.parseCoinNameFromType(
1541
- parsedMarketCollateralData.coinType
1542
- );
1543
- const coinDecimal = utils.getCoinDecimal(collateralCoinName);
1544
- const maxCollateralCoin = (0, import_bignumber.default)(
1545
- parsedMarketCollateralData.maxCollateralAmount
1546
- ).shiftedBy(-1 * coinDecimal);
1547
- const depositCoin = (0, import_bignumber.default)(
1548
- parsedMarketCollateralData.totalCollateralAmount
1549
- ).shiftedBy(-1 * coinDecimal);
1550
- return {
1551
- coinDecimal,
1552
- isIsolated: parsedMarketCollateralData.isIsolated,
1553
- maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,
1554
- maxDepositCoin: maxCollateralCoin.toNumber(),
1555
- depositAmount: parsedMarketCollateralData.totalCollateralAmount,
1556
- depositCoin: depositCoin.toNumber()
1557
- };
1558
- };
1559
- var parseOriginSpoolData = (originSpoolData) => {
1560
- return {
1561
- stakeType: (0, import_utils.normalizeStructTag)(originSpoolData.stakeType.fields.name),
1562
- maxPoint: Number(originSpoolData.maxDistributedPoint),
1563
- distributedPoint: Number(originSpoolData.distributedPoint),
1564
- pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),
1565
- period: Number(originSpoolData.pointDistributionTime),
1566
- maxStake: Number(originSpoolData.maxStake),
1567
- staked: Number(originSpoolData.stakes),
1568
- index: Number(originSpoolData.index),
1569
- createdAt: Number(originSpoolData.createdAt),
1570
- lastUpdate: Number(originSpoolData.lastUpdate)
1571
- };
1572
- };
1573
- var calculateSpoolData = (parsedSpoolData, stakeMarketCoinPrice, stakeMarketCoinDecimal) => {
1574
- const baseIndexRate = 1e9;
1575
- const distributedPointPerSec = (0, import_bignumber.default)(
1576
- parsedSpoolData.pointPerPeriod
1577
- ).dividedBy(parsedSpoolData.period);
1578
- const pointPerSec = (0, import_bignumber.default)(parsedSpoolData.pointPerPeriod).dividedBy(
1579
- parsedSpoolData.period
1580
- );
1581
- const remainingPeriod = pointPerSec.gt(0) ? (0, import_bignumber.default)(parsedSpoolData.maxPoint).minus(parsedSpoolData.distributedPoint).dividedBy(pointPerSec) : (0, import_bignumber.default)(0);
1582
- const startDate = parsedSpoolData.createdAt;
1583
- const endDate = remainingPeriod.plus(parsedSpoolData.lastUpdate).integerValue().toNumber();
1584
- const timeDelta = (0, import_bignumber.default)(
1585
- Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedSpoolData.lastUpdate
1586
- ).dividedBy(parsedSpoolData.period).toFixed(0);
1587
- const remainingPoints = (0, import_bignumber.default)(parsedSpoolData.maxPoint).minus(
1588
- parsedSpoolData.distributedPoint
1589
- );
1590
- const accumulatedPoints = import_bignumber.default.minimum(
1591
- (0, import_bignumber.default)(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),
1592
- remainingPoints
1593
- );
1594
- const currentPointIndex = (0, import_bignumber.default)(parsedSpoolData.index).plus(
1595
- accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite() ? (0, import_bignumber.default)(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedSpoolData.staked) : 0
1596
- );
1597
- const currentTotalDistributedPoint = (0, import_bignumber.default)(
1598
- parsedSpoolData.distributedPoint
1599
- ).plus(accumulatedPoints);
1600
- const stakedAmount = (0, import_bignumber.default)(parsedSpoolData.staked);
1601
- const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);
1602
- const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);
1603
- return {
1604
- distributedPointPerSec: distributedPointPerSec.toNumber(),
1605
- accumulatedPoints: accumulatedPoints.toNumber(),
1606
- currentPointIndex: currentPointIndex.toNumber(),
1607
- currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
1608
- startDate: new Date(startDate * 1e3),
1609
- endDate: new Date(endDate * 1e3),
1610
- stakedAmount: stakedAmount.toNumber(),
1611
- stakedCoin: stakedCoin.toNumber(),
1612
- stakedValue: stakedValue.toNumber()
1613
- };
1614
- };
1615
- var parseOriginSpoolRewardPoolData = (originSpoolRewardPoolData) => {
1616
- return {
1617
- claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),
1618
- exchangeRateDenominator: Number(
1619
- originSpoolRewardPoolData.exchange_rate_denominator
1620
- ),
1621
- exchangeRateNumerator: Number(
1622
- originSpoolRewardPoolData.exchange_rate_numerator
1623
- ),
1624
- rewards: Number(originSpoolRewardPoolData.rewards),
1625
- spoolId: String(originSpoolRewardPoolData.spool_id)
1626
- };
1627
- };
1628
- var calculateSpoolRewardPoolData = (parsedSpoolData, parsedSpoolRewardPoolData, calculatedSpoolData, rewardCoinPrice, rewardCoinDecimal) => {
1629
- const rateYearFactor = 365 * 24 * 60 * 60;
1630
- const rewardPerSec = (0, import_bignumber.default)(calculatedSpoolData.distributedPointPerSec).multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator).dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);
1631
- const totalRewardAmount = (0, import_bignumber.default)(parsedSpoolData.maxPoint).multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator).dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);
1632
- const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);
1633
- const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);
1634
- const remaindRewardAmount = (0, import_bignumber.default)(parsedSpoolRewardPoolData.rewards);
1635
- const remaindRewardCoin = remaindRewardAmount.shiftedBy(
1636
- -1 * rewardCoinDecimal
1637
- );
1638
- const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);
1639
- const claimedRewardAmount = (0, import_bignumber.default)(
1640
- parsedSpoolRewardPoolData.claimedRewards
1641
- );
1642
- const claimedRewardCoin = claimedRewardAmount.shiftedBy(
1643
- -1 * rewardCoinDecimal
1644
- );
1645
- const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
1646
- const rewardValueForYear = (0, import_bignumber.default)(rewardPerSec).shiftedBy(-1 * rewardCoinDecimal).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
1647
- let rewardRate = rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).isFinite() ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber() : Infinity;
1648
- if (parsedSpoolData.maxPoint <= parsedSpoolData.distributedPoint || parsedSpoolData.pointPerPeriod === 0) {
1649
- rewardRate = Infinity;
1650
- }
1651
- return {
1652
- rewardApr: rewardRate,
1653
- totalRewardAmount: totalRewardAmount.toNumber(),
1654
- totalRewardCoin: totalRewardCoin.toNumber(),
1655
- totalRewardValue: totalRewardValue.toNumber(),
1656
- remaindRewardAmount: remaindRewardAmount.toNumber(),
1657
- remaindRewardCoin: remaindRewardCoin.toNumber(),
1658
- remaindRewardValue: remaindRewardValue.toNumber(),
1659
- claimedRewardAmount: claimedRewardAmount.toNumber(),
1660
- claimedRewardCoin: claimedRewardCoin.toNumber(),
1661
- claimedRewardValue: claimedRewardValue.toNumber(),
1662
- rewardPerSec: rewardPerSec.toNumber()
1663
- };
1664
- };
1665
- var parseOriginBorrowIncentivesPoolPointData = (originBorrowIncentivePoolPointData) => {
1666
- return {
1667
- pointType: (0, import_utils.normalizeStructTag)(
1668
- originBorrowIncentivePoolPointData.point_type.name
1669
- ),
1670
- distributedPointPerPeriod: Number(
1671
- originBorrowIncentivePoolPointData.distributed_point_per_period
1672
- ),
1673
- period: Number(originBorrowIncentivePoolPointData.point_distribution_time),
1674
- distributedPoint: Number(
1675
- originBorrowIncentivePoolPointData.distributed_point
1676
- ),
1677
- points: Number(originBorrowIncentivePoolPointData.points),
1678
- index: Number(originBorrowIncentivePoolPointData.index),
1679
- baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),
1680
- weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),
1681
- lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),
1682
- createdAt: Number(originBorrowIncentivePoolPointData.created_at)
1683
- };
1684
- };
1685
- var parseOriginBorrowIncentivePoolData = (utils, originBorrowIncentivePoolData) => {
1686
- return {
1687
- poolType: (0, import_utils.normalizeStructTag)(originBorrowIncentivePoolData.pool_type.name),
1688
- minStakes: Number(originBorrowIncentivePoolData.min_stakes),
1689
- maxStakes: Number(originBorrowIncentivePoolData.max_stakes),
1690
- staked: Number(originBorrowIncentivePoolData.stakes),
1691
- poolPoints: originBorrowIncentivePoolData.points.reduce(
1692
- (acc, point) => {
1693
- const parsed = parseOriginBorrowIncentivesPoolPointData(point);
1694
- const name = utils.parseSCoinTypeNameToMarketCoinName(
1695
- (0, import_utils.parseStructTag)(parsed.pointType).name.toLowerCase()
1696
- );
1697
- acc[name] = parsed;
1698
- return acc;
1676
+ // src/models/scallopAddress.ts
1677
+ var import_axios = __toESM(require("axios"));
1678
+ var EMPTY_ADDRESSES = {
1679
+ core: {
1680
+ version: "",
1681
+ versionCap: "",
1682
+ object: "",
1683
+ market: "",
1684
+ adminCap: "",
1685
+ coinDecimalsRegistry: "",
1686
+ obligationAccessStore: "",
1687
+ coins: {
1688
+ cetus: {
1689
+ id: "",
1690
+ metaData: "",
1691
+ treasury: "",
1692
+ oracle: {
1693
+ supra: "",
1694
+ switchboard: "",
1695
+ pyth: {
1696
+ feed: "",
1697
+ feedObject: ""
1698
+ }
1699
+ }
1699
1700
  },
1700
- {}
1701
- )
1702
- };
1703
- };
1704
- var calculateBorrowIncentivePoolPointData = (parsedBorrowIncentivePoolPointData, rewardCoinPrice, rewardCoinDecimal, poolCoinPrice, poolCoinDecimal) => {
1705
- const baseIndexRate = 1e9;
1706
- const distributedPointPerSec = (0, import_bignumber.default)(
1707
- parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
1708
- ).dividedBy(parsedBorrowIncentivePoolPointData.period);
1709
- const timeDelta = (0, import_bignumber.default)(
1710
- Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedBorrowIncentivePoolPointData.lastUpdate
1711
- ).dividedBy(parsedBorrowIncentivePoolPointData.period).toFixed(0);
1712
- const accumulatedPoints = import_bignumber.default.minimum(
1713
- (0, import_bignumber.default)(timeDelta).multipliedBy(
1714
- parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
1715
- ),
1716
- (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.points)
1717
- );
1718
- const currentPointIndex = (0, import_bignumber.default)(
1719
- parsedBorrowIncentivePoolPointData.index
1720
- ).plus(
1721
- accumulatedPoints.dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount).isFinite() ? (0, import_bignumber.default)(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount) : 0
1722
- );
1723
- const currentTotalDistributedPoint = (0, import_bignumber.default)(
1724
- parsedBorrowIncentivePoolPointData.distributedPoint
1725
- ).plus(accumulatedPoints);
1726
- const baseWeight = (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight);
1727
- const weightedStakedAmount = (0, import_bignumber.default)(
1728
- parsedBorrowIncentivePoolPointData.weightedAmount
1729
- );
1730
- const weightedStakedCoin = weightedStakedAmount.shiftedBy(
1731
- -1 * poolCoinDecimal
1732
- );
1733
- const weightedStakedValue = weightedStakedCoin.multipliedBy(poolCoinPrice);
1734
- const rateYearFactor = 365 * 24 * 60 * 60;
1735
- const rewardPerSec = (0, import_bignumber.default)(distributedPointPerSec).shiftedBy(
1736
- -1 * rewardCoinDecimal
1737
- );
1738
- const rewardValueForYear = (0, import_bignumber.default)(rewardPerSec).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
1739
- const weightScale = (0, import_bignumber.default)(1e12);
1740
- const rewardRate = rewardValueForYear.multipliedBy(
1741
- (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
1742
- weightScale
1743
- )
1744
- ).dividedBy(weightedStakedValue).isFinite() && parsedBorrowIncentivePoolPointData.points > 0 ? rewardValueForYear.multipliedBy(
1745
- (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
1746
- weightScale
1747
- )
1748
- ).dividedBy(weightedStakedValue).toNumber() : Infinity;
1749
- return {
1750
- distributedPointPerSec: distributedPointPerSec.toNumber(),
1751
- accumulatedPoints: accumulatedPoints.toNumber(),
1752
- currentPointIndex: currentPointIndex.toNumber(),
1753
- currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
1754
- baseWeight: baseWeight.toNumber(),
1755
- weightedStakedAmount: weightedStakedAmount.toNumber(),
1756
- weightedStakedCoin: weightedStakedCoin.toNumber(),
1757
- weightedStakedValue: weightedStakedValue.toNumber(),
1758
- rewardApr: rewardRate,
1759
- rewardPerSec: rewardPerSec.toNumber()
1760
- };
1761
- };
1762
- var parseOriginBorrowIncentiveAccountPoolPointData = (originBorrowIncentiveAccountPoolPointData) => {
1763
- return {
1764
- pointType: (0, import_utils.normalizeStructTag)(
1765
- originBorrowIncentiveAccountPoolPointData.point_type.name
1766
- ),
1767
- weightedAmount: Number(
1768
- originBorrowIncentiveAccountPoolPointData.weighted_amount
1769
- ),
1770
- points: Number(originBorrowIncentiveAccountPoolPointData.points),
1771
- totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),
1772
- index: Number(originBorrowIncentiveAccountPoolPointData.index)
1773
- };
1774
- };
1775
- var parseOriginBorrowIncentiveAccountData = (originBorrowIncentiveAccountData) => {
1776
- return {
1777
- poolType: (0, import_utils.normalizeStructTag)(
1778
- originBorrowIncentiveAccountData.pool_type.name
1779
- ),
1780
- debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),
1781
- pointList: originBorrowIncentiveAccountData.points_list.reduce(
1782
- (acc, point) => {
1783
- const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);
1784
- const name = (0, import_utils.parseStructTag)(
1785
- parsed.pointType
1786
- ).name.toLowerCase();
1787
- acc[name] = parsed;
1788
- return acc;
1701
+ wapt: {
1702
+ id: "",
1703
+ metaData: "",
1704
+ treasury: "",
1705
+ oracle: {
1706
+ supra: "",
1707
+ switchboard: "",
1708
+ pyth: {
1709
+ feed: "",
1710
+ feedObject: ""
1711
+ }
1712
+ }
1789
1713
  },
1790
- {}
1791
- )
1792
- };
1793
- };
1794
- var minBigNumber = (...args) => {
1795
- return (0, import_bignumber.default)(
1796
- args.reduce(
1797
- (min, current) => new import_bignumber.default(current).lt(min) ? current : min
1798
- )
1799
- );
1800
- };
1801
- var estimatedFactor = (amount, scaleStep, type) => {
1802
- const amountOfDigits = Math.max(
1803
- 1,
1804
- Math.floor(Math.log10(Math.abs(amount)) + 1)
1805
- );
1806
- const adjustScale = Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;
1807
- let adjustFactor = Math.pow(10, -adjustScale);
1808
- adjustFactor = type === "increase" ? 1 - adjustFactor : 1 + adjustFactor;
1809
- return adjustFactor;
1810
- };
1811
-
1812
- // src/utils/util.ts
1813
- var COIN_SET = Array.from(
1814
- /* @__PURE__ */ new Set([
1815
- ...SUPPORT_POOLS,
1816
- ...SUPPORT_COLLATERALS,
1817
- ...SUPPORT_SPOOLS_REWARDS,
1818
- ...SUPPORT_BORROW_INCENTIVE_REWARDS,
1819
- ...SUPPORT_SCOIN
1820
- ])
1821
- );
1822
- var isMarketCoin = (coinName) => {
1823
- const assetCoinName = coinName.slice(1).toLowerCase();
1824
- return coinName.charAt(0).toLowerCase() === "s" && COIN_SET.includes(assetCoinName);
1825
- };
1826
- var isSuiBridgeAsset = (coinName) => {
1827
- return SUPPORT_SUI_BRIDGE.includes(coinName);
1828
- };
1829
- var isWormholeAsset = (coinName) => {
1830
- return SUPPORT_WORMHOLE.includes(coinName);
1831
- };
1832
- var parseAssetSymbol = (coinName) => {
1833
- if (isWormholeAsset(coinName)) {
1834
- return `w${coinName.slice(1).toUpperCase()}`;
1835
- }
1836
- if (isSuiBridgeAsset(coinName)) {
1837
- return `sb${coinName.slice(2).toUpperCase()}`;
1838
- }
1839
- if (isMarketCoin(coinName)) {
1840
- const assetCoinName = coinName.slice(1).toLowerCase();
1841
- return coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName);
1842
- }
1843
- switch (coinName) {
1844
- case "afsui":
1845
- return "afSUI";
1846
- case "hasui":
1847
- return "haSUI";
1848
- case "vsui":
1849
- return "vSUI";
1850
- default:
1851
- return coinName.toUpperCase();
1852
- }
1853
- };
1854
- var parseDataFromPythPriceFeed = (feed, address) => {
1855
- const assetCoinNames = COIN_SET;
1856
- const assetCoinName = assetCoinNames.find((assetCoinName2) => {
1857
- return address.get(`core.coins.${assetCoinName2}.oracle.pyth.feed`) === feed.id;
1858
- });
1859
- if (assetCoinName) {
1860
- const price = feed.price.price * 10 ** feed.price.expo;
1861
- return {
1862
- coinName: assetCoinName,
1863
- price,
1864
- publishTime: Number(feed.price.publishTime) * 10 ** 3
1865
- };
1866
- } else {
1867
- throw new Error("Invalid feed id");
1868
- }
1869
- };
1870
- var findClosestUnlockRound = (unlockAtInSecondTimestamp) => {
1871
- const unlockDate = new Date(unlockAtInSecondTimestamp * 1e3);
1872
- const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1e3);
1873
- closestTwelveAM.setUTCHours(0, 0, 0, 0);
1874
- if (unlockDate.getUTCHours() >= 0) {
1875
- closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);
1876
- }
1877
- const now = (/* @__PURE__ */ new Date()).getTime();
1878
- if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1e3) {
1879
- closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);
1880
- }
1881
- return Math.floor(closestTwelveAM.getTime() / 1e3);
1882
- };
1883
- var partitionArray = (array, chunkSize) => {
1884
- const result = [];
1885
- for (let i = 0; i < array.length; i += chunkSize) {
1886
- result.push(array.slice(i, i + chunkSize));
1887
- }
1888
- return result;
1889
- };
1890
-
1891
- // src/utils/tokenBucket.ts
1892
- var TokenBucket = class {
1893
- constructor(tokensPerInterval, intervalInMs) {
1894
- this.tokensPerInterval = tokensPerInterval;
1895
- this.interval = intervalInMs;
1896
- this.tokens = tokensPerInterval;
1897
- this.lastRefill = Date.now();
1898
- }
1899
- refill() {
1900
- const now = Date.now();
1901
- const elapsed = now - this.lastRefill;
1902
- if (elapsed >= this.interval) {
1903
- const tokensToAdd = Math.floor(elapsed / this.interval) * this.tokensPerInterval;
1904
- this.tokens = Math.min(this.tokens + tokensToAdd, this.tokensPerInterval);
1905
- this.lastRefill += Math.floor(elapsed / this.interval) * this.interval;
1906
- }
1907
- }
1908
- removeTokens(count) {
1909
- this.refill();
1910
- if (this.tokens >= count) {
1911
- this.tokens -= count;
1912
- return true;
1913
- }
1914
- return false;
1915
- }
1916
- };
1917
- var callWithRateLimit = async (tokenBucket, fn, retryDelayInMs = DEFAULT_INTERVAL_IN_MS, maxRetries = 15, backoffFactor = 1.25) => {
1918
- let retries = 0;
1919
- const tryRequest = async () => {
1920
- if (tokenBucket.removeTokens(1)) {
1921
- const result = await fn();
1922
- return result;
1923
- } else if (retries < maxRetries) {
1924
- retries++;
1925
- const delay = retryDelayInMs * Math.pow(backoffFactor, retries);
1926
- await new Promise((resolve) => setTimeout(resolve, delay));
1927
- return tryRequest();
1928
- } else {
1929
- console.error("Maximum retries reached");
1930
- return null;
1931
- }
1932
- };
1933
- return tryRequest();
1934
- };
1935
-
1936
- // src/utils/indexer.ts
1937
- async function callMethodWithIndexerFallback(method, context, ...args) {
1938
- const lastArgs = args[args.length - 1];
1939
- if (typeof lastArgs === "object" && lastArgs.indexer) {
1940
- try {
1941
- return await method.apply(context, args);
1942
- } catch (e) {
1943
- console.warn(`Indexer requests failed: ${e}. Retrying without indexer..`);
1944
- return await method.apply(context, [
1945
- ...args.slice(0, -1),
1946
- {
1947
- ...lastArgs,
1948
- indexer: false
1714
+ wsol: {
1715
+ id: "",
1716
+ metaData: "",
1717
+ treasury: "",
1718
+ oracle: {
1719
+ supra: "",
1720
+ switchboard: "",
1721
+ pyth: {
1722
+ feed: "",
1723
+ feedObject: ""
1724
+ }
1949
1725
  }
1950
- ]);
1951
- }
1952
- }
1953
- return await method.apply(context, args);
1954
- }
1955
- function withIndexerFallback(method) {
1956
- return (...args) => {
1957
- return callMethodWithIndexerFallback(method, this, ...args);
1958
- };
1959
- }
1960
-
1961
- // src/utils/core.ts
1962
- var parseObjectAs = (object) => {
1963
- if (!(object && object.content && "fields" in object.content))
1964
- throw new Error(`Failed to parse object`);
1965
- const fields = object.content.fields;
1966
- if (typeof fields === "object" && "value" in fields) {
1967
- const value = fields.value;
1968
- if (typeof value === "object" && "fields" in value)
1969
- return value.fields;
1970
- return value;
1971
- } else if (typeof fields === "object") {
1972
- return fields;
1973
- }
1974
- return fields;
1975
- };
1976
-
1977
- // src/models/scallopCache.ts
1978
- var ScallopCache = class {
1979
- constructor(suiKit, walletAddress, cacheOptions, tokenBucket, queryClient) {
1980
- this.queryClient = queryClient ?? new import_query_core.QueryClient(cacheOptions ?? DEFAULT_CACHE_OPTIONS);
1981
- this._suiKit = suiKit;
1982
- this.tokenBucket = tokenBucket ?? new TokenBucket(DEFAULT_TOKENS_PER_INTERVAL, DEFAULT_INTERVAL_IN_MS);
1983
- this.walletAddress = walletAddress ?? suiKit.currentAddress();
1984
- }
1985
- get suiKit() {
1986
- if (!this._suiKit) {
1987
- throw new Error("SuiKit instance is not initialized");
1988
- }
1989
- return this._suiKit;
1990
- }
1991
- get client() {
1992
- return this.suiKit.client();
1993
- }
1994
- /**
1995
- * @description Invalidate cache based on the refetchType parameter
1996
- * @param refetchType Determines the type of queries to be refetched. Defaults to `active`.
1997
- *
1998
- * - `active`: Only queries that match the refetch predicate and are actively being rendered via useQuery and related functions will be refetched in the background.
1999
- * - `inactive`: Only queries that match the refetch predicate and are NOT actively being rendered via useQuery and related functions will be refetched in the background.
2000
- * - `all`: All queries that match the refetch predicate will be refetched in the background.
2001
- * - `none`: No queries will be refetched. Queries that match the refetch predicate will only be marked as invalid.
2002
- */
2003
- // public async invalidateAllCache() {
2004
- // return Object.values(queryKeys.rpc).map((t) =>
2005
- // this.queryClient.invalidateQueries({
2006
- // queryKey: t(),
2007
- // type: 'all',
2008
- // })
2009
- // );
2010
- // }
2011
- retryFn(errCount, e) {
2012
- if (errCount === 5)
2013
- return false;
2014
- if (e.status === 429)
2015
- return true;
2016
- return false;
2017
- }
2018
- /**
2019
- * @description Provides cache for inspectTxn of the SuiKit.
2020
- * @param QueryInspectTxnParams
2021
- * @param txBlock
2022
- * @returns Promise<DevInspectResults>
2023
- */
2024
- async queryInspectTxn({
2025
- queryTarget,
2026
- args,
2027
- typeArgs
2028
- }) {
2029
- const txBlock = new import_sui_kit.SuiTxBlock();
2030
- const resolvedQueryTarget = await this.queryGetNormalizedMoveFunction(queryTarget);
2031
- if (!resolvedQueryTarget)
2032
- throw new Error("Invalid query target");
2033
- const { parameters } = resolvedQueryTarget;
2034
- const resolvedArgs = await Promise.all(
2035
- (args ?? []).map(async (arg, idx) => {
2036
- if (typeof arg !== "string")
2037
- return arg;
2038
- const cachedData = (await this.queryGetObject(arg))?.data;
2039
- if (!cachedData)
2040
- return arg;
2041
- const owner = cachedData.owner;
2042
- if (!owner || typeof owner !== "object" || !("Shared" in owner))
2043
- return {
2044
- objectId: cachedData.objectId,
2045
- version: cachedData.version,
2046
- digest: cachedData.digest
2047
- };
2048
- const parameter = parameters[idx];
2049
- if (typeof parameter !== "object" || !("MutableReference" in parameter || "Reference" in parameter))
2050
- return arg;
2051
- return {
2052
- objectId: cachedData.objectId,
2053
- initialSharedVersion: owner.Shared.initial_shared_version,
2054
- mutable: "MutableReference" in parameter
2055
- };
2056
- })
2057
- );
2058
- txBlock.moveCall(queryTarget, resolvedArgs, typeArgs);
2059
- const query = await this.queryClient.fetchQuery({
2060
- retry: this.retryFn,
2061
- retryDelay: 1e3,
2062
- queryKey: queryKeys.rpc.getInspectTxn(queryTarget, args, typeArgs),
2063
- queryFn: async () => {
2064
- return await callWithRateLimit(
2065
- this.tokenBucket,
2066
- async () => await this.suiKit.inspectTxn(txBlock)
2067
- );
2068
- }
2069
- });
2070
- return query;
2071
- }
2072
- async queryGetNormalizedMoveFunction(target) {
2073
- const { address, module: module2, name } = (0, import_sui_kit.parseStructTag)(target);
2074
- return this.queryClient.fetchQuery({
2075
- queryKey: queryKeys.rpc.getNormalizedMoveFunction(target),
2076
- queryFn: async () => {
2077
- return await callWithRateLimit(
2078
- this.tokenBucket,
2079
- async () => await this.suiKit.client().getNormalizedMoveFunction({
2080
- package: address,
2081
- module: module2,
2082
- function: name
2083
- })
2084
- );
2085
- }
2086
- });
2087
- }
2088
- /**
2089
- * @description Provides cache for getObject of the SuiKit.
2090
- * @param objectId
2091
- * @param QueryObjectParams
2092
- * @returns Promise<SuiObjectResponse>
2093
- */
2094
- async queryGetObject(objectId, options) {
2095
- options = {
2096
- ...options,
2097
- showOwner: true,
2098
- showContent: true
2099
- };
2100
- return this.queryClient.fetchQuery({
2101
- retry: this.retryFn,
2102
- retryDelay: 1e3,
2103
- queryKey: queryKeys.rpc.getObject(objectId, options),
2104
- queryFn: async () => {
2105
- return await callWithRateLimit(
2106
- this.tokenBucket,
2107
- async () => await this.client.getObject({
2108
- id: objectId,
2109
- options
2110
- })
2111
- );
2112
- }
2113
- });
2114
- }
2115
- /**
2116
- * @description Provides cache for getObjects of the SuiKit.
2117
- * @param objectIds
2118
- * @returns Promise<SuiObjectData[]>
2119
- */
2120
- async queryGetObjects(objectIds, options = {
2121
- showContent: true
2122
- }) {
2123
- if (objectIds.length === 0)
2124
- return [];
2125
- return this.queryClient.fetchQuery({
2126
- retry: this.retryFn,
2127
- retryDelay: 1e3,
2128
- queryKey: queryKeys.rpc.getObjects(
2129
- objectIds,
2130
- this.walletAddress,
2131
- options
2132
- ),
2133
- queryFn: async () => {
2134
- const results = await callWithRateLimit(
2135
- this.tokenBucket,
2136
- async () => await this.suiKit.getObjects(objectIds, options)
2137
- );
2138
- if (results) {
2139
- results.forEach((result) => {
2140
- this.queryClient.setQueriesData(
2141
- {
2142
- exact: false,
2143
- queryKey: queryKeys.rpc.getObject(result.objectId, options)
2144
- },
2145
- {
2146
- data: result,
2147
- error: null
2148
- },
2149
- {
2150
- updatedAt: Date.now()
2151
- }
2152
- );
2153
- });
2154
- }
2155
- return results;
2156
- }
2157
- });
2158
- }
2159
- /**
2160
- * @description Provides cache for getOwnedObjects of the SuiKit.
2161
- * @param input
2162
- * @returns Promise<PaginatedObjectsResponse>
2163
- */
2164
- async queryGetOwnedObjects(input) {
2165
- return this.queryClient.fetchQuery({
2166
- retry: this.retryFn,
2167
- retryDelay: 1e3,
2168
- queryKey: queryKeys.rpc.getOwnedObjects(input),
2169
- queryFn: async () => {
2170
- const results = await callWithRateLimit(
2171
- this.tokenBucket,
2172
- async () => await this.client.getOwnedObjects(input)
2173
- );
2174
- if (results && results.data.length > 0) {
2175
- results.data.filter(
2176
- (result) => !!result.data
2177
- ).forEach((result) => {
2178
- this.queryClient.setQueriesData(
2179
- {
2180
- exact: false,
2181
- queryKey: queryKeys.rpc.getObject(
2182
- result.data.objectId,
2183
- input.options ?? {}
2184
- )
2185
- },
2186
- {
2187
- data: result.data,
2188
- error: null
2189
- },
2190
- {
2191
- updatedAt: Date.now()
2192
- }
2193
- );
2194
- });
2195
- }
2196
- return results;
2197
- }
2198
- });
2199
- }
2200
- async queryGetDynamicFields(input) {
2201
- return this.queryClient.fetchQuery({
2202
- retry: this.retryFn,
2203
- retryDelay: 1e3,
2204
- queryKey: queryKeys.rpc.getDynamicFields(input),
2205
- queryFn: async () => {
2206
- return await callWithRateLimit(
2207
- this.tokenBucket,
2208
- async () => await this.client.getDynamicFields(input)
2209
- );
2210
- }
2211
- });
2212
- }
2213
- async queryGetDynamicFieldObject(input) {
2214
- return this.queryClient.fetchQuery({
2215
- retry: this.retryFn,
2216
- retryDelay: (attemptIndex) => Math.min(1e3 * attemptIndex, 8e3),
2217
- queryKey: queryKeys.rpc.getDynamicFieldObject(input),
2218
- queryFn: async () => {
2219
- const result = await callWithRateLimit(
2220
- this.tokenBucket,
2221
- () => this.client.getDynamicFieldObject(input)
2222
- );
2223
- if (result?.data) {
2224
- this.queryClient.setQueriesData(
2225
- {
2226
- exact: false,
2227
- queryKey: queryKeys.rpc.getObject(result?.data.objectId, {
2228
- showContent: true,
2229
- showOwner: true
2230
- })
2231
- },
2232
- {
2233
- data: result.data,
2234
- error: null
2235
- },
2236
- {
2237
- updatedAt: Date.now()
2238
- }
2239
- );
2240
- }
2241
- return result;
2242
- }
2243
- });
2244
- }
2245
- async queryGetAllCoinBalances(owner) {
2246
- return this.queryClient.fetchQuery({
2247
- retry: this.retryFn,
2248
- retryDelay: 1e3,
2249
- queryKey: queryKeys.rpc.getAllCoinBalances(owner),
2250
- queryFn: async () => {
2251
- const allBalances = await callWithRateLimit(
2252
- this.tokenBucket,
2253
- async () => await this.client.getAllBalances({ owner })
2254
- );
2255
- if (!allBalances)
2256
- return {};
2257
- const balances = allBalances.reduce(
2258
- (acc, coinBalance) => {
2259
- if (coinBalance.totalBalance !== "0") {
2260
- acc[(0, import_sui_kit.normalizeStructTag)(coinBalance.coinType)] = coinBalance.totalBalance;
2261
- }
2262
- return acc;
2263
- },
2264
- {}
2265
- );
2266
- return balances;
2267
- }
2268
- });
2269
- }
2270
- async queryGetCoinBalance(input) {
2271
- if (!input.coinType)
2272
- return "0";
2273
- return (await this.queryGetAllCoinBalances(input.owner) ?? {})[(0, import_sui_kit.normalizeStructTag)(input.coinType)] ?? "0";
2274
- }
2275
- };
2276
-
2277
- // src/models/scallopAddress.ts
2278
- var import_axios = __toESM(require("axios"));
2279
- var EMPTY_ADDRESSES = {
2280
- core: {
2281
- version: "",
2282
- versionCap: "",
2283
- object: "",
2284
- market: "",
2285
- adminCap: "",
2286
- coinDecimalsRegistry: "",
2287
- obligationAccessStore: "",
2288
- coins: {
2289
- cetus: {
2290
- id: "",
2291
- metaData: "",
2292
- treasury: "",
2293
- oracle: {
2294
- supra: "",
2295
- switchboard: "",
2296
- pyth: {
2297
- feed: "",
2298
- feedObject: ""
2299
- }
2300
- }
2301
- },
2302
- wapt: {
2303
- id: "",
2304
- metaData: "",
2305
- treasury: "",
2306
- oracle: {
2307
- supra: "",
2308
- switchboard: "",
2309
- pyth: {
2310
- feed: "",
2311
- feedObject: ""
2312
- }
2313
- }
2314
- },
2315
- wsol: {
2316
- id: "",
2317
- metaData: "",
2318
- treasury: "",
2319
- oracle: {
2320
- supra: "",
2321
- switchboard: "",
2322
- pyth: {
2323
- feed: "",
2324
- feedObject: ""
2325
- }
2326
- }
2327
- },
2328
- wbtc: {
1726
+ },
1727
+ wbtc: {
2329
1728
  id: "",
2330
1729
  metaData: "",
2331
1730
  treasury: "",
@@ -2606,346 +2005,963 @@ var EMPTY_ADDRESSES = {
2606
2005
  coinType: "",
2607
2006
  treasury: ""
2608
2007
  },
2609
- shasui: {
2610
- coinType: "",
2611
- treasury: ""
2008
+ shasui: {
2009
+ coinType: "",
2010
+ treasury: ""
2011
+ },
2012
+ svsui: {
2013
+ coinType: "",
2014
+ treasury: ""
2015
+ }
2016
+ }
2017
+ }
2018
+ };
2019
+ var ScallopAddress = class {
2020
+ constructor(params, instance) {
2021
+ const { id, auth, network, forceInterface } = params;
2022
+ this.cache = instance?.cache ?? new ScallopCache({});
2023
+ this._requestClient = import_axios.default.create({
2024
+ baseURL: API_BASE_URL,
2025
+ headers: {
2026
+ "Content-Type": "application/json",
2027
+ Accept: "application/json"
2028
+ },
2029
+ timeout: 8e3
2030
+ });
2031
+ if (auth)
2032
+ this._auth = auth;
2033
+ this._id = id;
2034
+ this._network = network ?? "mainnet";
2035
+ this._addressesMap = USE_TEST_ADDRESS ? /* @__PURE__ */ new Map([["mainnet", TEST_ADDRESSES]]) : /* @__PURE__ */ new Map();
2036
+ if (USE_TEST_ADDRESS)
2037
+ this._currentAddresses = TEST_ADDRESSES;
2038
+ if (forceInterface) {
2039
+ for (const [network2, addresses] of Object.entries(
2040
+ forceInterface
2041
+ )) {
2042
+ if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2043
+ if (network2 === this._network)
2044
+ this._currentAddresses = addresses;
2045
+ this._addressesMap.set(network2, addresses);
2046
+ }
2047
+ }
2048
+ }
2049
+ }
2050
+ /**
2051
+ * Get addresses API id.
2052
+ *
2053
+ * @return The addresses API id.
2054
+ */
2055
+ getId() {
2056
+ return this._id || void 0;
2057
+ }
2058
+ /**
2059
+ * Get the address at the provided path.
2060
+ *
2061
+ * @param path - The path of the address to get.
2062
+ * @return The address at the provided path.
2063
+ */
2064
+ get(path) {
2065
+ if (this._currentAddresses) {
2066
+ const value = path.split(".").reduce(
2067
+ (nestedAddressObj, key) => typeof nestedAddressObj === "object" ? nestedAddressObj[key] : nestedAddressObj,
2068
+ this._currentAddresses
2069
+ );
2070
+ return value || void 0;
2071
+ } else {
2072
+ return void 0;
2073
+ }
2074
+ }
2075
+ /**
2076
+ * Sets the address for the specified path, it does not interact with the API.
2077
+ *
2078
+ * @param path - The path of the address to set.
2079
+ * @param address - The address be setted to the tartget path.
2080
+ * @return The addresses.
2081
+ */
2082
+ set(path, address) {
2083
+ if (this._currentAddresses) {
2084
+ const keys = path.split(".");
2085
+ keys.reduce((nestedAddressObj, key, index) => {
2086
+ if (index === keys.length - 1) {
2087
+ nestedAddressObj[key] = address;
2088
+ } else {
2089
+ return nestedAddressObj[key];
2090
+ }
2091
+ }, this._currentAddresses);
2092
+ }
2093
+ return this._currentAddresses;
2094
+ }
2095
+ /**
2096
+ * Synchronize the specified network addresses from the addresses map to the
2097
+ * current addresses and change the default network to specified network.
2098
+ *
2099
+ * @param network - Specifies which network's addresses you want to get.
2100
+ * @return Current addresses.
2101
+ */
2102
+ switchCurrentAddresses(network) {
2103
+ if (this._addressesMap.has(network)) {
2104
+ this._currentAddresses = this._addressesMap.get(network);
2105
+ this._network = network;
2106
+ }
2107
+ return this._currentAddresses;
2108
+ }
2109
+ /**
2110
+ * Get the addresses, If `network` is not provided, returns the current
2111
+ * addresses or the default network addresses in the addresses map.
2112
+ *
2113
+ * @param network - Specifies which network's addresses you want to get.
2114
+ */
2115
+ getAddresses(network) {
2116
+ if (network) {
2117
+ return this._addressesMap.get(network);
2118
+ } else {
2119
+ return this._currentAddresses ?? this._addressesMap.get(this._network);
2120
+ }
2121
+ }
2122
+ /**
2123
+ * Set the addresses into addresses map. If the specified network is the same
2124
+ * as the current network, the current addresses will be updated at the same time.
2125
+ *
2126
+ * @param addresses - The addresses be setted to the tartget network.
2127
+ * @param network - Specifies which network's addresses you want to set.
2128
+ * @return The addresses.
2129
+ */
2130
+ setAddresses(addresses, network) {
2131
+ const targetNetwork = network || this._network;
2132
+ if (targetNetwork === this._network)
2133
+ this._currentAddresses = addresses;
2134
+ this._addressesMap.set(targetNetwork, addresses);
2135
+ }
2136
+ /**
2137
+ * Get all addresses.
2138
+ *
2139
+ * @return All addresses.
2140
+ */
2141
+ getAllAddresses() {
2142
+ return Object.fromEntries(this._addressesMap);
2143
+ }
2144
+ /**
2145
+ * Create a new addresses through the API and synchronize it back to the
2146
+ * instance.
2147
+ *
2148
+ * @description
2149
+ * If the `network` is not specified, the mainnet is used by default.
2150
+ * If no `addresses` from instance or parameter is provided, an addresses with
2151
+ * all empty strings is created by default.
2152
+ *
2153
+ * This function only allows for one addresses to be input into a specific network
2154
+ * at a time, and does not provide an addresses map for setting addresses
2155
+ * across all networks at once.
2156
+ *
2157
+ * @param params.addresses - The addresses be setted to the tartget network.
2158
+ * @param params.network - Specifies which network's addresses you want to set.
2159
+ * @param params.auth - The authentication API key.
2160
+ * @param params.memo - Add memo to the addresses created in the API.
2161
+ * @return All addresses.
2162
+ */
2163
+ async create(params) {
2164
+ const { addresses, network, auth, memo } = params ?? {};
2165
+ const apiKey = auth || this._auth || void 0;
2166
+ const targetNetwork = network || this._network;
2167
+ const targetAddresses = addresses || this._currentAddresses || this._addressesMap.get(targetNetwork) || EMPTY_ADDRESSES;
2168
+ if (apiKey !== void 0) {
2169
+ this._addressesMap.clear();
2170
+ this.setAddresses(targetAddresses, targetNetwork);
2171
+ const response = await this._requestClient.post(
2172
+ `/addresses`,
2173
+ JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
2174
+ {
2175
+ headers: {
2176
+ "Content-Type": "application/json",
2177
+ "api-key": auth || this._auth
2178
+ }
2179
+ }
2180
+ );
2181
+ if (response.status === 201) {
2182
+ for (const [network2, addresses2] of Object.entries(
2183
+ response.data
2184
+ )) {
2185
+ if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2186
+ if (network2 === this._network)
2187
+ this._currentAddresses = addresses2;
2188
+ this._addressesMap.set(network2, addresses2);
2189
+ }
2190
+ }
2191
+ this._id = response.data.id;
2192
+ return this.getAllAddresses();
2193
+ } else {
2194
+ throw Error("Failed to create addresses.");
2195
+ }
2196
+ } else {
2197
+ throw Error("You don't have permission to access this request.");
2198
+ }
2199
+ }
2200
+ /**
2201
+ * Read and synchronizes all addresses from the API into instance.
2202
+ *
2203
+ * @param id - The id of the addresses to get.
2204
+ * @return All addresses.
2205
+ */
2206
+ async read(id) {
2207
+ const addressesId = id || this._id || void 0;
2208
+ if (addressesId !== void 0) {
2209
+ const response = await this.cache.queryClient.fetchQuery({
2210
+ queryKey: queryKeys.api.getAddresses(addressesId),
2211
+ queryFn: async () => {
2212
+ return await this._requestClient.get(`/addresses/${addressesId}`, {
2213
+ headers: {
2214
+ "Content-Type": "application/json"
2215
+ }
2216
+ });
2217
+ }
2218
+ });
2219
+ if (response.status === 200) {
2220
+ for (const [network, addresses] of Object.entries(
2221
+ response.data
2222
+ )) {
2223
+ if (["localnet", "devnet", "testnet", "mainnet"].includes(network)) {
2224
+ if (network === this._network)
2225
+ this._currentAddresses = addresses;
2226
+ this._addressesMap.set(network, addresses);
2227
+ }
2228
+ }
2229
+ this._id = response.data.id;
2230
+ return this.getAllAddresses();
2231
+ } else {
2232
+ throw Error("Failed to create addresses.");
2233
+ }
2234
+ } else {
2235
+ throw Error("Please provide API addresses id.");
2236
+ }
2237
+ }
2238
+ /**
2239
+ * Update the addresses through the API and synchronize it back to the
2240
+ * instance.
2241
+ *
2242
+ * @description
2243
+ * If the `network` is not specified, the mainnet is used by default.
2244
+ * If no `addresses` from instance or parameter is provided, an addresses with
2245
+ * all empty strings is created by default.
2246
+ *
2247
+ * This function only allows for one addresses to be input into a specific network
2248
+ * at a time, and does not provide an addresses map for setting addresses
2249
+ * across all networks at once.
2250
+ *
2251
+ * @param params.id - The id of the addresses to update.
2252
+ * @param params.addresses - The addresses be setted to the tartget network.
2253
+ * @param params.network - Specifies which network's addresses you want to set.
2254
+ * @param params.auth - The authentication api key.
2255
+ * @param params.memo - Add memo to the addresses created in the API.
2256
+ * @return All addresses.
2257
+ */
2258
+ async update(params) {
2259
+ const { id, addresses, network, auth, memo } = params ?? {};
2260
+ const apiKey = auth || this._auth || void 0;
2261
+ const targetId = id || this._id || void 0;
2262
+ const targetNetwork = network || this._network;
2263
+ const targetAddresses = addresses || this._currentAddresses || this._addressesMap.get(targetNetwork) || EMPTY_ADDRESSES;
2264
+ if (targetId === void 0)
2265
+ throw Error("Require specific addresses id to be updated.");
2266
+ if (apiKey !== void 0) {
2267
+ if (id !== this._id) {
2268
+ this._addressesMap.clear();
2269
+ }
2270
+ this.setAddresses(targetAddresses, targetNetwork);
2271
+ const response = await this._requestClient.put(
2272
+ `/addresses/${targetId}`,
2273
+ JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
2274
+ {
2275
+ headers: {
2276
+ "Content-Type": "application/json",
2277
+ "api-key": auth || this._auth
2278
+ }
2279
+ }
2280
+ );
2281
+ if (response.status === 200) {
2282
+ for (const [network2, addresses2] of Object.entries(
2283
+ response.data
2284
+ )) {
2285
+ if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2286
+ if (network2 === this._network)
2287
+ this._currentAddresses = addresses2;
2288
+ this._addressesMap.set(network2, addresses2);
2289
+ }
2290
+ }
2291
+ this._id = response.data.id;
2292
+ return this.getAllAddresses();
2293
+ } else {
2294
+ throw Error("Failed to update addresses.");
2295
+ }
2296
+ } else {
2297
+ throw Error("You don't have permission to access this request.");
2298
+ }
2299
+ }
2300
+ /**
2301
+ * Deletes all addresses of a specified id through the API and clear all
2302
+ * addresses in the instance.
2303
+ *
2304
+ * @param id - The id of the addresses to delete.
2305
+ * @param auth - The authentication API key.
2306
+ */
2307
+ async delete(id, auth) {
2308
+ const apiKey = auth || this._auth || void 0;
2309
+ const targetId = id || this._id || void 0;
2310
+ if (targetId === void 0)
2311
+ throw Error("Require specific addresses id to be deleted.");
2312
+ if (apiKey !== void 0) {
2313
+ const response = await this._requestClient.delete(
2314
+ `/addresses/${targetId}`,
2315
+ {
2316
+ headers: {
2317
+ "Content-Type": "application/json",
2318
+ "api-key": auth || this._auth
2319
+ }
2320
+ }
2321
+ );
2322
+ if (response.status === 200) {
2323
+ this._id = void 0;
2324
+ this._currentAddresses = void 0;
2325
+ this._addressesMap.clear();
2326
+ } else {
2327
+ throw Error("Failed to delete addresses.");
2328
+ }
2329
+ } else {
2330
+ throw Error("You don't have permission to access this request.");
2331
+ }
2332
+ }
2333
+ };
2334
+
2335
+ // src/models/scallopClient.ts
2336
+ var import_utils25 = require("@mysten/sui/utils");
2337
+
2338
+ // src/models/scallopUtils.ts
2339
+ var import_utils10 = require("@mysten/sui/utils");
2340
+ var import_pyth_sui_js = require("@pythnetwork/pyth-sui-js");
2341
+
2342
+ // src/queries/borrowIncentiveQuery.ts
2343
+ var import_utils2 = require("@mysten/sui/utils");
2344
+
2345
+ // src/utils/builder.ts
2346
+ var requireSender = (txBlock) => {
2347
+ const sender = txBlock.blockData.sender;
2348
+ if (!sender) {
2349
+ throw new Error("Sender is required");
2350
+ }
2351
+ return sender;
2352
+ };
2353
+ var checkVesca = (prevUnlockAtInMillisTimestamp) => {
2354
+ if (prevUnlockAtInMillisTimestamp === void 0) {
2355
+ throw new Error("veSca not found");
2356
+ }
2357
+ };
2358
+ var checkVescaExpired = (prevUnlockAtInMillisTimestamp) => {
2359
+ if (prevUnlockAtInMillisTimestamp <= (/* @__PURE__ */ new Date()).getTime()) {
2360
+ throw new Error("veSca is expired, use renewExpiredVeScaQuick instead");
2361
+ }
2362
+ };
2363
+ var checkExtendLockPeriod = (lockPeriodInDays, newUnlockAtInSecondTimestamp, prevUnlockAtInMillisTimestamp) => {
2364
+ checkVesca(prevUnlockAtInMillisTimestamp);
2365
+ checkVescaExpired(prevUnlockAtInMillisTimestamp);
2366
+ const prevUnlockAtInSecondTimestamp = Math.floor(
2367
+ prevUnlockAtInMillisTimestamp / 1e3
2368
+ );
2369
+ if (lockPeriodInDays < 1) {
2370
+ throw new Error("Minimum lock period is 1 day");
2371
+ }
2372
+ const availableLockPeriodInDays = Math.floor(
2373
+ (newUnlockAtInSecondTimestamp - prevUnlockAtInSecondTimestamp) / UNLOCK_ROUND_DURATION
2374
+ );
2375
+ if (lockPeriodInDays > availableLockPeriodInDays) {
2376
+ throw new Error(
2377
+ `Cannot extend lock period by ${lockPeriodInDays} days, maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days), remaining lock period is ${MAX_LOCK_ROUNDS - availableLockPeriodInDays}`
2378
+ );
2379
+ }
2380
+ };
2381
+ var checkLockSca = (scaAmountOrCoin, lockPeriodInDays, newUnlockAtInSecondTimestamp, prevUnlockAtInMillisTimestamp) => {
2382
+ const prevUnlockAtInSecondTimestamp = prevUnlockAtInMillisTimestamp ? Math.floor(prevUnlockAtInMillisTimestamp / 1e3) : void 0;
2383
+ const isInitialLock = !prevUnlockAtInSecondTimestamp;
2384
+ const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1e3 <= (/* @__PURE__ */ new Date()).getTime();
2385
+ if (isInitialLock || isLockExpired) {
2386
+ if (scaAmountOrCoin !== void 0 && lockPeriodInDays !== void 0) {
2387
+ if (lockPeriodInDays <= 0) {
2388
+ throw new Error("Lock period must be greater than 0");
2389
+ }
2390
+ if (typeof scaAmountOrCoin === "number" && scaAmountOrCoin < MIN_INITIAL_LOCK_AMOUNT) {
2391
+ throw new Error(
2392
+ `Minimum lock amount for ${isLockExpired ? "renewing expired veSca" : "initial lock"} is 10 SCA`
2393
+ );
2394
+ }
2395
+ const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;
2396
+ if (extendLockPeriodInSecond > MAX_LOCK_DURATION) {
2397
+ throw new Error(
2398
+ `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days)`
2399
+ );
2400
+ }
2401
+ } else {
2402
+ throw new Error(
2403
+ `SCA amount and lock period is required for ${isLockExpired ? "renewing expired veSca" : "initial lock"}`
2404
+ );
2405
+ }
2406
+ } else {
2407
+ checkVesca(prevUnlockAtInMillisTimestamp);
2408
+ checkVescaExpired(prevUnlockAtInMillisTimestamp);
2409
+ if (typeof scaAmountOrCoin === "number" && scaAmountOrCoin < MIN_TOP_UP_AMOUNT) {
2410
+ throw new Error("Minimum top up amount is 1 SCA");
2411
+ }
2412
+ if (newUnlockAtInSecondTimestamp && lockPeriodInDays) {
2413
+ checkExtendLockPeriod(
2414
+ lockPeriodInDays,
2415
+ newUnlockAtInSecondTimestamp,
2416
+ prevUnlockAtInMillisTimestamp
2417
+ );
2418
+ }
2419
+ }
2420
+ };
2421
+ var checkExtendLockAmount = (scaAmount, prevUnlockAtInMillisTimestamp) => {
2422
+ checkVesca(prevUnlockAtInMillisTimestamp);
2423
+ checkVescaExpired(prevUnlockAtInMillisTimestamp);
2424
+ if (scaAmount < MIN_TOP_UP_AMOUNT) {
2425
+ throw new Error("Minimum top up amount is 1 SCA");
2426
+ }
2427
+ const isInitialLock = !prevUnlockAtInMillisTimestamp;
2428
+ const isLockExpired = !isInitialLock && prevUnlockAtInMillisTimestamp <= (/* @__PURE__ */ new Date()).getTime();
2429
+ if (isLockExpired) {
2430
+ throw new Error("veSca is expired, use renewExpiredVeScaQuick instead");
2431
+ }
2432
+ };
2433
+ var checkRenewExpiredVeSca = (scaAmount, lockPeriodInDays, prevUnlockAtInMillisTimestamp) => {
2434
+ if (!prevUnlockAtInMillisTimestamp || prevUnlockAtInMillisTimestamp > (/* @__PURE__ */ new Date()).getTime()) {
2435
+ throw new Error("Renew method can only be used for expired veSca");
2436
+ }
2437
+ if (scaAmount < MIN_INITIAL_LOCK_AMOUNT) {
2438
+ throw new Error("Minimum lock amount for renewing expired vesca 10 SCA");
2439
+ }
2440
+ const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;
2441
+ if (extendLockPeriodInSecond >= MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {
2442
+ throw new Error(
2443
+ `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`
2444
+ );
2445
+ }
2446
+ };
2447
+
2448
+ // src/utils/query.ts
2449
+ var import_bignumber = __toESM(require("bignumber.js"));
2450
+ var import_utils = require("@mysten/sui/utils");
2451
+ var parseOriginMarketPoolData = (originMarketPoolData) => {
2452
+ return {
2453
+ coinType: (0, import_utils.normalizeStructTag)(originMarketPoolData.type.name),
2454
+ // Parse origin data required for basic calculations.
2455
+ maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,
2456
+ borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,
2457
+ borrowRateScale: Number(originMarketPoolData.interestRateScale),
2458
+ borrowIndex: Number(originMarketPoolData.borrowIndex),
2459
+ lastUpdated: Number(originMarketPoolData.lastUpdated),
2460
+ cashAmount: Number(originMarketPoolData.cash),
2461
+ debtAmount: Number(originMarketPoolData.debt),
2462
+ marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),
2463
+ reserveAmount: Number(originMarketPoolData.reserve),
2464
+ reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,
2465
+ borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,
2466
+ borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,
2467
+ // Parse origin data required for additional display.
2468
+ baseBorrowRate: Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,
2469
+ borrowRateOnHighKink: Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,
2470
+ borrowRateOnMidKink: Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,
2471
+ highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,
2472
+ midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,
2473
+ minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),
2474
+ isIsolated: originMarketPoolData.isIsolated,
2475
+ supplyLimit: Number(originMarketPoolData.supplyLimit),
2476
+ borrowLimit: Number(originMarketPoolData.borrowLimit)
2477
+ };
2478
+ };
2479
+ var calculateMarketPoolData = (utils, parsedMarketPoolData) => {
2480
+ const poolCoinName = utils.parseCoinNameFromType(
2481
+ parsedMarketPoolData.coinType
2482
+ );
2483
+ const coinDecimal = utils.getCoinDecimal(poolCoinName);
2484
+ const borrowYearFactor = 24 * 365 * 3600;
2485
+ const baseBorrowApr = parsedMarketPoolData.baseBorrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
2486
+ const borrowAprOnHighKink = parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
2487
+ const borrowAprOnMidKink = parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
2488
+ const maxBorrowApr = parsedMarketPoolData.maxBorrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
2489
+ const borrowApr = parsedMarketPoolData.borrowRate * borrowYearFactor / parsedMarketPoolData.borrowRateScale;
2490
+ const timeDelta = Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedMarketPoolData.lastUpdated;
2491
+ const borrowIndexDelta = (0, import_bignumber.default)(parsedMarketPoolData.borrowIndex).multipliedBy(
2492
+ (0, import_bignumber.default)(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate)
2493
+ ).dividedBy(parsedMarketPoolData.borrowRateScale);
2494
+ const currentBorrowIndex = (0, import_bignumber.default)(parsedMarketPoolData.borrowIndex).plus(
2495
+ borrowIndexDelta
2496
+ );
2497
+ const growthInterest = (0, import_bignumber.default)(currentBorrowIndex).dividedBy(parsedMarketPoolData.borrowIndex).minus(1);
2498
+ const increasedDebtAmount = (0, import_bignumber.default)(
2499
+ parsedMarketPoolData.debtAmount
2500
+ ).multipliedBy(growthInterest);
2501
+ const borrowAmount = increasedDebtAmount.plus(
2502
+ parsedMarketPoolData.debtAmount
2503
+ );
2504
+ const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);
2505
+ const reserveAmount = (0, import_bignumber.default)(parsedMarketPoolData.reserveAmount).plus(
2506
+ increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor)
2507
+ );
2508
+ const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);
2509
+ const supplyAmount = (0, import_bignumber.default)(borrowAmount).plus(
2510
+ Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0)
2511
+ );
2512
+ const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);
2513
+ let utilizationRate = (0, import_bignumber.default)(borrowAmount).dividedBy(supplyAmount);
2514
+ utilizationRate = utilizationRate.isFinite() ? utilizationRate : (0, import_bignumber.default)(0);
2515
+ let supplyApr = (0, import_bignumber.default)(borrowApr).multipliedBy(utilizationRate).multipliedBy(1 - parsedMarketPoolData.reserveFactor);
2516
+ supplyApr = supplyApr.isFinite() ? supplyApr : (0, import_bignumber.default)(0);
2517
+ let conversionRate = supplyAmount.dividedBy(
2518
+ parsedMarketPoolData.marketCoinSupplyAmount
2519
+ );
2520
+ conversionRate = conversionRate.isFinite() && !conversionRate.isNaN() ? conversionRate : (0, import_bignumber.default)(1);
2521
+ return {
2522
+ baseBorrowApr,
2523
+ baseBorrowApy: utils.parseAprToApy(baseBorrowApr),
2524
+ borrowAprOnHighKink,
2525
+ borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),
2526
+ borrowAprOnMidKink,
2527
+ borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),
2528
+ coinDecimal,
2529
+ maxBorrowApr,
2530
+ maxBorrowApy: utils.parseAprToApy(maxBorrowApr),
2531
+ borrowApr: Math.min(borrowApr, maxBorrowApr),
2532
+ borrowApy: Math.min(
2533
+ utils.parseAprToApy(borrowApr),
2534
+ utils.parseAprToApy(maxBorrowApr)
2535
+ ),
2536
+ borrowIndex: currentBorrowIndex.toNumber(),
2537
+ growthInterest: growthInterest.toNumber(),
2538
+ supplyAmount: supplyAmount.toNumber(),
2539
+ supplyCoin: supplyCoin.toNumber(),
2540
+ borrowAmount: borrowAmount.toNumber(),
2541
+ borrowCoin: borrowCoin.toNumber(),
2542
+ reserveAmount: reserveAmount.toNumber(),
2543
+ reserveCoin: reserveCoin.toNumber(),
2544
+ utilizationRate: utilizationRate.toNumber(),
2545
+ supplyApr: supplyApr.toNumber(),
2546
+ supplyApy: utils.parseAprToApy(supplyApr.toNumber()),
2547
+ conversionRate: conversionRate.toNumber(),
2548
+ isIsolated: parsedMarketPoolData.isIsolated,
2549
+ maxSupplyCoin: (0, import_bignumber.default)(parsedMarketPoolData.supplyLimit).shiftedBy(-coinDecimal).toNumber(),
2550
+ maxBorrowCoin: (0, import_bignumber.default)(parsedMarketPoolData.borrowLimit).shiftedBy(-coinDecimal).toNumber()
2551
+ };
2552
+ };
2553
+ var parseOriginMarketCollateralData = (originMarketCollateralData) => {
2554
+ const divisor = 2 ** 32;
2555
+ return {
2556
+ coinType: (0, import_utils.normalizeStructTag)(originMarketCollateralData.type.name),
2557
+ isIsolated: originMarketCollateralData.isIsolated,
2558
+ collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / divisor,
2559
+ liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / divisor,
2560
+ liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / divisor,
2561
+ liquidationPenalty: Number(originMarketCollateralData.liquidationPenalty.value) / divisor,
2562
+ liquidationReserveFactor: Number(originMarketCollateralData.liquidationReserveFactor.value) / divisor,
2563
+ maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),
2564
+ totalCollateralAmount: Number(
2565
+ originMarketCollateralData.totalCollateralAmount
2566
+ )
2567
+ };
2568
+ };
2569
+ var calculateMarketCollateralData = (utils, parsedMarketCollateralData) => {
2570
+ const collateralCoinName = utils.parseCoinNameFromType(
2571
+ parsedMarketCollateralData.coinType
2572
+ );
2573
+ const coinDecimal = utils.getCoinDecimal(collateralCoinName);
2574
+ const maxCollateralCoin = (0, import_bignumber.default)(
2575
+ parsedMarketCollateralData.maxCollateralAmount
2576
+ ).shiftedBy(-1 * coinDecimal);
2577
+ const depositCoin = (0, import_bignumber.default)(
2578
+ parsedMarketCollateralData.totalCollateralAmount
2579
+ ).shiftedBy(-1 * coinDecimal);
2580
+ return {
2581
+ coinDecimal,
2582
+ isIsolated: parsedMarketCollateralData.isIsolated,
2583
+ maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,
2584
+ maxDepositCoin: maxCollateralCoin.toNumber(),
2585
+ depositAmount: parsedMarketCollateralData.totalCollateralAmount,
2586
+ depositCoin: depositCoin.toNumber()
2587
+ };
2588
+ };
2589
+ var parseOriginSpoolData = (originSpoolData) => {
2590
+ return {
2591
+ stakeType: (0, import_utils.normalizeStructTag)(originSpoolData.stakeType.fields.name),
2592
+ maxPoint: Number(originSpoolData.maxDistributedPoint),
2593
+ distributedPoint: Number(originSpoolData.distributedPoint),
2594
+ pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),
2595
+ period: Number(originSpoolData.pointDistributionTime),
2596
+ maxStake: Number(originSpoolData.maxStake),
2597
+ staked: Number(originSpoolData.stakes),
2598
+ index: Number(originSpoolData.index),
2599
+ createdAt: Number(originSpoolData.createdAt),
2600
+ lastUpdate: Number(originSpoolData.lastUpdate)
2601
+ };
2602
+ };
2603
+ var calculateSpoolData = (parsedSpoolData, stakeMarketCoinPrice, stakeMarketCoinDecimal) => {
2604
+ const baseIndexRate = 1e9;
2605
+ const distributedPointPerSec = (0, import_bignumber.default)(
2606
+ parsedSpoolData.pointPerPeriod
2607
+ ).dividedBy(parsedSpoolData.period);
2608
+ const pointPerSec = (0, import_bignumber.default)(parsedSpoolData.pointPerPeriod).dividedBy(
2609
+ parsedSpoolData.period
2610
+ );
2611
+ const remainingPeriod = pointPerSec.gt(0) ? (0, import_bignumber.default)(parsedSpoolData.maxPoint).minus(parsedSpoolData.distributedPoint).dividedBy(pointPerSec) : (0, import_bignumber.default)(0);
2612
+ const startDate = parsedSpoolData.createdAt;
2613
+ const endDate = remainingPeriod.plus(parsedSpoolData.lastUpdate).integerValue().toNumber();
2614
+ const timeDelta = (0, import_bignumber.default)(
2615
+ Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedSpoolData.lastUpdate
2616
+ ).dividedBy(parsedSpoolData.period).toFixed(0);
2617
+ const remainingPoints = (0, import_bignumber.default)(parsedSpoolData.maxPoint).minus(
2618
+ parsedSpoolData.distributedPoint
2619
+ );
2620
+ const accumulatedPoints = import_bignumber.default.minimum(
2621
+ (0, import_bignumber.default)(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),
2622
+ remainingPoints
2623
+ );
2624
+ const currentPointIndex = (0, import_bignumber.default)(parsedSpoolData.index).plus(
2625
+ accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite() ? (0, import_bignumber.default)(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedSpoolData.staked) : 0
2626
+ );
2627
+ const currentTotalDistributedPoint = (0, import_bignumber.default)(
2628
+ parsedSpoolData.distributedPoint
2629
+ ).plus(accumulatedPoints);
2630
+ const stakedAmount = (0, import_bignumber.default)(parsedSpoolData.staked);
2631
+ const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);
2632
+ const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);
2633
+ return {
2634
+ distributedPointPerSec: distributedPointPerSec.toNumber(),
2635
+ accumulatedPoints: accumulatedPoints.toNumber(),
2636
+ currentPointIndex: currentPointIndex.toNumber(),
2637
+ currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
2638
+ startDate: new Date(startDate * 1e3),
2639
+ endDate: new Date(endDate * 1e3),
2640
+ stakedAmount: stakedAmount.toNumber(),
2641
+ stakedCoin: stakedCoin.toNumber(),
2642
+ stakedValue: stakedValue.toNumber()
2643
+ };
2644
+ };
2645
+ var parseOriginSpoolRewardPoolData = (originSpoolRewardPoolData) => {
2646
+ return {
2647
+ claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),
2648
+ exchangeRateDenominator: Number(
2649
+ originSpoolRewardPoolData.exchange_rate_denominator
2650
+ ),
2651
+ exchangeRateNumerator: Number(
2652
+ originSpoolRewardPoolData.exchange_rate_numerator
2653
+ ),
2654
+ rewards: Number(originSpoolRewardPoolData.rewards),
2655
+ spoolId: String(originSpoolRewardPoolData.spool_id)
2656
+ };
2657
+ };
2658
+ var calculateSpoolRewardPoolData = (parsedSpoolData, parsedSpoolRewardPoolData, calculatedSpoolData, rewardCoinPrice, rewardCoinDecimal) => {
2659
+ const rateYearFactor = 365 * 24 * 60 * 60;
2660
+ const rewardPerSec = (0, import_bignumber.default)(calculatedSpoolData.distributedPointPerSec).multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator).dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);
2661
+ const totalRewardAmount = (0, import_bignumber.default)(parsedSpoolData.maxPoint).multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator).dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);
2662
+ const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);
2663
+ const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);
2664
+ const remaindRewardAmount = (0, import_bignumber.default)(parsedSpoolRewardPoolData.rewards);
2665
+ const remaindRewardCoin = remaindRewardAmount.shiftedBy(
2666
+ -1 * rewardCoinDecimal
2667
+ );
2668
+ const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);
2669
+ const claimedRewardAmount = (0, import_bignumber.default)(
2670
+ parsedSpoolRewardPoolData.claimedRewards
2671
+ );
2672
+ const claimedRewardCoin = claimedRewardAmount.shiftedBy(
2673
+ -1 * rewardCoinDecimal
2674
+ );
2675
+ const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);
2676
+ const rewardValueForYear = (0, import_bignumber.default)(rewardPerSec).shiftedBy(-1 * rewardCoinDecimal).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
2677
+ let rewardRate = rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).isFinite() ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber() : Infinity;
2678
+ if (parsedSpoolData.maxPoint <= parsedSpoolData.distributedPoint || parsedSpoolData.pointPerPeriod === 0) {
2679
+ rewardRate = Infinity;
2680
+ }
2681
+ return {
2682
+ rewardApr: rewardRate,
2683
+ totalRewardAmount: totalRewardAmount.toNumber(),
2684
+ totalRewardCoin: totalRewardCoin.toNumber(),
2685
+ totalRewardValue: totalRewardValue.toNumber(),
2686
+ remaindRewardAmount: remaindRewardAmount.toNumber(),
2687
+ remaindRewardCoin: remaindRewardCoin.toNumber(),
2688
+ remaindRewardValue: remaindRewardValue.toNumber(),
2689
+ claimedRewardAmount: claimedRewardAmount.toNumber(),
2690
+ claimedRewardCoin: claimedRewardCoin.toNumber(),
2691
+ claimedRewardValue: claimedRewardValue.toNumber(),
2692
+ rewardPerSec: rewardPerSec.toNumber()
2693
+ };
2694
+ };
2695
+ var parseOriginBorrowIncentivesPoolPointData = (originBorrowIncentivePoolPointData) => {
2696
+ return {
2697
+ pointType: (0, import_utils.normalizeStructTag)(
2698
+ originBorrowIncentivePoolPointData.point_type.name
2699
+ ),
2700
+ distributedPointPerPeriod: Number(
2701
+ originBorrowIncentivePoolPointData.distributed_point_per_period
2702
+ ),
2703
+ period: Number(originBorrowIncentivePoolPointData.point_distribution_time),
2704
+ distributedPoint: Number(
2705
+ originBorrowIncentivePoolPointData.distributed_point
2706
+ ),
2707
+ points: Number(originBorrowIncentivePoolPointData.points),
2708
+ index: Number(originBorrowIncentivePoolPointData.index),
2709
+ baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),
2710
+ weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),
2711
+ lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),
2712
+ createdAt: Number(originBorrowIncentivePoolPointData.created_at)
2713
+ };
2714
+ };
2715
+ var parseOriginBorrowIncentivePoolData = (utils, originBorrowIncentivePoolData) => {
2716
+ return {
2717
+ poolType: (0, import_utils.normalizeStructTag)(originBorrowIncentivePoolData.pool_type.name),
2718
+ minStakes: Number(originBorrowIncentivePoolData.min_stakes),
2719
+ maxStakes: Number(originBorrowIncentivePoolData.max_stakes),
2720
+ staked: Number(originBorrowIncentivePoolData.stakes),
2721
+ poolPoints: originBorrowIncentivePoolData.points.reduce(
2722
+ (acc, point) => {
2723
+ const parsed = parseOriginBorrowIncentivesPoolPointData(point);
2724
+ const name = utils.parseSCoinTypeNameToMarketCoinName(
2725
+ (0, import_utils.parseStructTag)(parsed.pointType).name.toLowerCase()
2726
+ );
2727
+ acc[name] = parsed;
2728
+ return acc;
2729
+ },
2730
+ {}
2731
+ )
2732
+ };
2733
+ };
2734
+ var calculateBorrowIncentivePoolPointData = (parsedBorrowIncentivePoolPointData, rewardCoinPrice, rewardCoinDecimal, poolCoinPrice, poolCoinDecimal) => {
2735
+ const baseIndexRate = 1e9;
2736
+ const distributedPointPerSec = (0, import_bignumber.default)(
2737
+ parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
2738
+ ).dividedBy(parsedBorrowIncentivePoolPointData.period);
2739
+ const timeDelta = (0, import_bignumber.default)(
2740
+ Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - parsedBorrowIncentivePoolPointData.lastUpdate
2741
+ ).dividedBy(parsedBorrowIncentivePoolPointData.period).toFixed(0);
2742
+ const accumulatedPoints = import_bignumber.default.minimum(
2743
+ (0, import_bignumber.default)(timeDelta).multipliedBy(
2744
+ parsedBorrowIncentivePoolPointData.distributedPointPerPeriod
2745
+ ),
2746
+ (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.points)
2747
+ );
2748
+ const currentPointIndex = (0, import_bignumber.default)(
2749
+ parsedBorrowIncentivePoolPointData.index
2750
+ ).plus(
2751
+ accumulatedPoints.dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount).isFinite() ? (0, import_bignumber.default)(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount) : 0
2752
+ );
2753
+ const currentTotalDistributedPoint = (0, import_bignumber.default)(
2754
+ parsedBorrowIncentivePoolPointData.distributedPoint
2755
+ ).plus(accumulatedPoints);
2756
+ const baseWeight = (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight);
2757
+ const weightedStakedAmount = (0, import_bignumber.default)(
2758
+ parsedBorrowIncentivePoolPointData.weightedAmount
2759
+ );
2760
+ const weightedStakedCoin = weightedStakedAmount.shiftedBy(
2761
+ -1 * poolCoinDecimal
2762
+ );
2763
+ const weightedStakedValue = weightedStakedCoin.multipliedBy(poolCoinPrice);
2764
+ const rateYearFactor = 365 * 24 * 60 * 60;
2765
+ const rewardPerSec = (0, import_bignumber.default)(distributedPointPerSec).shiftedBy(
2766
+ -1 * rewardCoinDecimal
2767
+ );
2768
+ const rewardValueForYear = (0, import_bignumber.default)(rewardPerSec).multipliedBy(rateYearFactor).multipliedBy(rewardCoinPrice);
2769
+ const weightScale = (0, import_bignumber.default)(1e12);
2770
+ const rewardRate = rewardValueForYear.multipliedBy(
2771
+ (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
2772
+ weightScale
2773
+ )
2774
+ ).dividedBy(weightedStakedValue).isFinite() && parsedBorrowIncentivePoolPointData.points > 0 ? rewardValueForYear.multipliedBy(
2775
+ (0, import_bignumber.default)(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(
2776
+ weightScale
2777
+ )
2778
+ ).dividedBy(weightedStakedValue).toNumber() : Infinity;
2779
+ return {
2780
+ distributedPointPerSec: distributedPointPerSec.toNumber(),
2781
+ accumulatedPoints: accumulatedPoints.toNumber(),
2782
+ currentPointIndex: currentPointIndex.toNumber(),
2783
+ currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),
2784
+ baseWeight: baseWeight.toNumber(),
2785
+ weightedStakedAmount: weightedStakedAmount.toNumber(),
2786
+ weightedStakedCoin: weightedStakedCoin.toNumber(),
2787
+ weightedStakedValue: weightedStakedValue.toNumber(),
2788
+ rewardApr: rewardRate,
2789
+ rewardPerSec: rewardPerSec.toNumber()
2790
+ };
2791
+ };
2792
+ var parseOriginBorrowIncentiveAccountPoolPointData = (originBorrowIncentiveAccountPoolPointData) => {
2793
+ return {
2794
+ pointType: (0, import_utils.normalizeStructTag)(
2795
+ originBorrowIncentiveAccountPoolPointData.point_type.name
2796
+ ),
2797
+ weightedAmount: Number(
2798
+ originBorrowIncentiveAccountPoolPointData.weighted_amount
2799
+ ),
2800
+ points: Number(originBorrowIncentiveAccountPoolPointData.points),
2801
+ totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),
2802
+ index: Number(originBorrowIncentiveAccountPoolPointData.index)
2803
+ };
2804
+ };
2805
+ var parseOriginBorrowIncentiveAccountData = (originBorrowIncentiveAccountData) => {
2806
+ return {
2807
+ poolType: (0, import_utils.normalizeStructTag)(
2808
+ originBorrowIncentiveAccountData.pool_type.name
2809
+ ),
2810
+ debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),
2811
+ pointList: originBorrowIncentiveAccountData.points_list.reduce(
2812
+ (acc, point) => {
2813
+ const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);
2814
+ const name = (0, import_utils.parseStructTag)(
2815
+ parsed.pointType
2816
+ ).name.toLowerCase();
2817
+ acc[name] = parsed;
2818
+ return acc;
2612
2819
  },
2613
- svsui: {
2614
- coinType: "",
2615
- treasury: ""
2616
- }
2617
- }
2618
- }
2820
+ {}
2821
+ )
2822
+ };
2823
+ };
2824
+ var minBigNumber = (...args) => {
2825
+ return (0, import_bignumber.default)(
2826
+ args.reduce(
2827
+ (min, current) => new import_bignumber.default(current).lt(min) ? current : min
2828
+ )
2829
+ );
2830
+ };
2831
+ var estimatedFactor = (amount, scaleStep, type) => {
2832
+ const amountOfDigits = Math.max(
2833
+ 1,
2834
+ Math.floor(Math.log10(Math.abs(amount)) + 1)
2835
+ );
2836
+ const adjustScale = Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;
2837
+ let adjustFactor = Math.pow(10, -adjustScale);
2838
+ adjustFactor = type === "increase" ? 1 - adjustFactor : 1 + adjustFactor;
2839
+ return adjustFactor;
2840
+ };
2841
+
2842
+ // src/utils/util.ts
2843
+ var COIN_SET = Array.from(
2844
+ /* @__PURE__ */ new Set([
2845
+ ...SUPPORT_POOLS,
2846
+ ...SUPPORT_COLLATERALS,
2847
+ ...SUPPORT_SPOOLS_REWARDS,
2848
+ ...SUPPORT_BORROW_INCENTIVE_REWARDS,
2849
+ ...SUPPORT_SCOIN
2850
+ ])
2851
+ );
2852
+ var isMarketCoin = (coinName) => {
2853
+ const assetCoinName = coinName.slice(1).toLowerCase();
2854
+ return coinName.charAt(0).toLowerCase() === "s" && COIN_SET.includes(assetCoinName);
2619
2855
  };
2620
- var ScallopAddress = class {
2621
- constructor(params, instance) {
2622
- const { id, auth, network, forceInterface } = params;
2623
- this.cache = instance?.cache ?? new ScallopCache(
2624
- instance?.suiKit ?? new import_sui_kit2.SuiKit({}),
2625
- void 0,
2626
- DEFAULT_CACHE_OPTIONS
2627
- );
2628
- this._requestClient = import_axios.default.create({
2629
- baseURL: API_BASE_URL,
2630
- headers: {
2631
- "Content-Type": "application/json",
2632
- Accept: "application/json"
2633
- },
2634
- timeout: 8e3
2635
- });
2636
- if (auth)
2637
- this._auth = auth;
2638
- this._id = id;
2639
- this._network = network ?? "mainnet";
2640
- this._addressesMap = USE_TEST_ADDRESS ? /* @__PURE__ */ new Map([["mainnet", TEST_ADDRESSES]]) : /* @__PURE__ */ new Map();
2641
- if (USE_TEST_ADDRESS)
2642
- this._currentAddresses = TEST_ADDRESSES;
2643
- if (forceInterface) {
2644
- for (const [network2, addresses] of Object.entries(
2645
- forceInterface
2646
- )) {
2647
- if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2648
- if (network2 === this._network)
2649
- this._currentAddresses = addresses;
2650
- this._addressesMap.set(network2, addresses);
2651
- }
2652
- }
2653
- }
2654
- }
2655
- /**
2656
- * Get addresses API id.
2657
- *
2658
- * @return The addresses API id.
2659
- */
2660
- getId() {
2661
- return this._id || void 0;
2662
- }
2663
- /**
2664
- * Get the address at the provided path.
2665
- *
2666
- * @param path - The path of the address to get.
2667
- * @return The address at the provided path.
2668
- */
2669
- get(path) {
2670
- if (this._currentAddresses) {
2671
- const value = path.split(".").reduce(
2672
- (nestedAddressObj, key) => typeof nestedAddressObj === "object" ? nestedAddressObj[key] : nestedAddressObj,
2673
- this._currentAddresses
2674
- );
2675
- return value || void 0;
2676
- } else {
2677
- return void 0;
2678
- }
2679
- }
2680
- /**
2681
- * Sets the address for the specified path, it does not interact with the API.
2682
- *
2683
- * @param path - The path of the address to set.
2684
- * @param address - The address be setted to the tartget path.
2685
- * @return The addresses.
2686
- */
2687
- set(path, address) {
2688
- if (this._currentAddresses) {
2689
- const keys = path.split(".");
2690
- keys.reduce((nestedAddressObj, key, index) => {
2691
- if (index === keys.length - 1) {
2692
- nestedAddressObj[key] = address;
2693
- } else {
2694
- return nestedAddressObj[key];
2695
- }
2696
- }, this._currentAddresses);
2697
- }
2698
- return this._currentAddresses;
2699
- }
2700
- /**
2701
- * Synchronize the specified network addresses from the addresses map to the
2702
- * current addresses and change the default network to specified network.
2703
- *
2704
- * @param network - Specifies which network's addresses you want to get.
2705
- * @return Current addresses.
2706
- */
2707
- switchCurrentAddresses(network) {
2708
- if (this._addressesMap.has(network)) {
2709
- this._currentAddresses = this._addressesMap.get(network);
2710
- this._network = network;
2711
- }
2712
- return this._currentAddresses;
2856
+ var isSuiBridgeAsset = (coinName) => {
2857
+ return SUPPORT_SUI_BRIDGE.includes(coinName);
2858
+ };
2859
+ var isWormholeAsset = (coinName) => {
2860
+ return SUPPORT_WORMHOLE.includes(coinName);
2861
+ };
2862
+ var parseAssetSymbol = (coinName) => {
2863
+ if (isWormholeAsset(coinName)) {
2864
+ return `w${coinName.slice(1).toUpperCase()}`;
2713
2865
  }
2714
- /**
2715
- * Get the addresses, If `network` is not provided, returns the current
2716
- * addresses or the default network addresses in the addresses map.
2717
- *
2718
- * @param network - Specifies which network's addresses you want to get.
2719
- */
2720
- getAddresses(network) {
2721
- if (network) {
2722
- return this._addressesMap.get(network);
2723
- } else {
2724
- return this._currentAddresses ?? this._addressesMap.get(this._network);
2725
- }
2866
+ if (isSuiBridgeAsset(coinName)) {
2867
+ return `sb${coinName.slice(2).toUpperCase()}`;
2726
2868
  }
2727
- /**
2728
- * Set the addresses into addresses map. If the specified network is the same
2729
- * as the current network, the current addresses will be updated at the same time.
2730
- *
2731
- * @param addresses - The addresses be setted to the tartget network.
2732
- * @param network - Specifies which network's addresses you want to set.
2733
- * @return The addresses.
2734
- */
2735
- setAddresses(addresses, network) {
2736
- const targetNetwork = network || this._network;
2737
- if (targetNetwork === this._network)
2738
- this._currentAddresses = addresses;
2739
- this._addressesMap.set(targetNetwork, addresses);
2869
+ if (isMarketCoin(coinName)) {
2870
+ const assetCoinName = coinName.slice(1).toLowerCase();
2871
+ return coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName);
2740
2872
  }
2741
- /**
2742
- * Get all addresses.
2743
- *
2744
- * @return All addresses.
2745
- */
2746
- getAllAddresses() {
2747
- return Object.fromEntries(this._addressesMap);
2873
+ switch (coinName) {
2874
+ case "afsui":
2875
+ return "afSUI";
2876
+ case "hasui":
2877
+ return "haSUI";
2878
+ case "vsui":
2879
+ return "vSUI";
2880
+ default:
2881
+ return coinName.toUpperCase();
2748
2882
  }
2749
- /**
2750
- * Create a new addresses through the API and synchronize it back to the
2751
- * instance.
2752
- *
2753
- * @description
2754
- * If the `network` is not specified, the mainnet is used by default.
2755
- * If no `addresses` from instance or parameter is provided, an addresses with
2756
- * all empty strings is created by default.
2757
- *
2758
- * This function only allows for one addresses to be input into a specific network
2759
- * at a time, and does not provide an addresses map for setting addresses
2760
- * across all networks at once.
2761
- *
2762
- * @param params.addresses - The addresses be setted to the tartget network.
2763
- * @param params.network - Specifies which network's addresses you want to set.
2764
- * @param params.auth - The authentication API key.
2765
- * @param params.memo - Add memo to the addresses created in the API.
2766
- * @return All addresses.
2767
- */
2768
- async create(params) {
2769
- const { addresses, network, auth, memo } = params ?? {};
2770
- const apiKey = auth || this._auth || void 0;
2771
- const targetNetwork = network || this._network;
2772
- const targetAddresses = addresses || this._currentAddresses || this._addressesMap.get(targetNetwork) || EMPTY_ADDRESSES;
2773
- if (apiKey !== void 0) {
2774
- this._addressesMap.clear();
2775
- this.setAddresses(targetAddresses, targetNetwork);
2776
- const response = await this._requestClient.post(
2777
- `/addresses`,
2778
- JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
2779
- {
2780
- headers: {
2781
- "Content-Type": "application/json",
2782
- "api-key": auth || this._auth
2783
- }
2784
- }
2785
- );
2786
- if (response.status === 201) {
2787
- for (const [network2, addresses2] of Object.entries(
2788
- response.data
2789
- )) {
2790
- if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2791
- if (network2 === this._network)
2792
- this._currentAddresses = addresses2;
2793
- this._addressesMap.set(network2, addresses2);
2794
- }
2795
- }
2796
- this._id = response.data.id;
2797
- return this.getAllAddresses();
2798
- } else {
2799
- throw Error("Failed to create addresses.");
2800
- }
2801
- } else {
2802
- throw Error("You don't have permission to access this request.");
2803
- }
2883
+ };
2884
+ var parseDataFromPythPriceFeed = (feed, address) => {
2885
+ const assetCoinNames = COIN_SET;
2886
+ const assetCoinName = assetCoinNames.find((assetCoinName2) => {
2887
+ return address.get(`core.coins.${assetCoinName2}.oracle.pyth.feed`) === feed.id;
2888
+ });
2889
+ if (assetCoinName) {
2890
+ const price = feed.price.price * 10 ** feed.price.expo;
2891
+ return {
2892
+ coinName: assetCoinName,
2893
+ price,
2894
+ publishTime: Number(feed.price.publishTime) * 10 ** 3
2895
+ };
2896
+ } else {
2897
+ throw new Error("Invalid feed id");
2804
2898
  }
2805
- /**
2806
- * Read and synchronizes all addresses from the API into instance.
2807
- *
2808
- * @param id - The id of the addresses to get.
2809
- * @return All addresses.
2810
- */
2811
- async read(id) {
2812
- const addressesId = id || this._id || void 0;
2813
- if (addressesId !== void 0) {
2814
- const response = await this.cache.queryClient.fetchQuery({
2815
- queryKey: queryKeys.api.getAddresses(addressesId),
2816
- queryFn: async () => {
2817
- return await this._requestClient.get(`/addresses/${addressesId}`, {
2818
- headers: {
2819
- "Content-Type": "application/json"
2820
- }
2821
- });
2822
- }
2823
- });
2824
- if (response.status === 200) {
2825
- for (const [network, addresses] of Object.entries(
2826
- response.data
2827
- )) {
2828
- if (["localnet", "devnet", "testnet", "mainnet"].includes(network)) {
2829
- if (network === this._network)
2830
- this._currentAddresses = addresses;
2831
- this._addressesMap.set(network, addresses);
2832
- }
2833
- }
2834
- this._id = response.data.id;
2835
- return this.getAllAddresses();
2836
- } else {
2837
- throw Error("Failed to create addresses.");
2838
- }
2839
- } else {
2840
- throw Error("Please provide API addresses id.");
2841
- }
2899
+ };
2900
+ var findClosestUnlockRound = (unlockAtInSecondTimestamp) => {
2901
+ const unlockDate = new Date(unlockAtInSecondTimestamp * 1e3);
2902
+ const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1e3);
2903
+ closestTwelveAM.setUTCHours(0, 0, 0, 0);
2904
+ if (unlockDate.getUTCHours() >= 0) {
2905
+ closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);
2842
2906
  }
2843
- /**
2844
- * Update the addresses through the API and synchronize it back to the
2845
- * instance.
2846
- *
2847
- * @description
2848
- * If the `network` is not specified, the mainnet is used by default.
2849
- * If no `addresses` from instance or parameter is provided, an addresses with
2850
- * all empty strings is created by default.
2851
- *
2852
- * This function only allows for one addresses to be input into a specific network
2853
- * at a time, and does not provide an addresses map for setting addresses
2854
- * across all networks at once.
2855
- *
2856
- * @param params.id - The id of the addresses to update.
2857
- * @param params.addresses - The addresses be setted to the tartget network.
2858
- * @param params.network - Specifies which network's addresses you want to set.
2859
- * @param params.auth - The authentication api key.
2860
- * @param params.memo - Add memo to the addresses created in the API.
2861
- * @return All addresses.
2862
- */
2863
- async update(params) {
2864
- const { id, addresses, network, auth, memo } = params ?? {};
2865
- const apiKey = auth || this._auth || void 0;
2866
- const targetId = id || this._id || void 0;
2867
- const targetNetwork = network || this._network;
2868
- const targetAddresses = addresses || this._currentAddresses || this._addressesMap.get(targetNetwork) || EMPTY_ADDRESSES;
2869
- if (targetId === void 0)
2870
- throw Error("Require specific addresses id to be updated.");
2871
- if (apiKey !== void 0) {
2872
- if (id !== this._id) {
2873
- this._addressesMap.clear();
2874
- }
2875
- this.setAddresses(targetAddresses, targetNetwork);
2876
- const response = await this._requestClient.put(
2877
- `/addresses/${targetId}`,
2878
- JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),
2879
- {
2880
- headers: {
2881
- "Content-Type": "application/json",
2882
- "api-key": auth || this._auth
2883
- }
2884
- }
2885
- );
2886
- if (response.status === 200) {
2887
- for (const [network2, addresses2] of Object.entries(
2888
- response.data
2889
- )) {
2890
- if (["localnet", "devnet", "testnet", "mainnet"].includes(network2)) {
2891
- if (network2 === this._network)
2892
- this._currentAddresses = addresses2;
2893
- this._addressesMap.set(network2, addresses2);
2894
- }
2895
- }
2896
- this._id = response.data.id;
2897
- return this.getAllAddresses();
2898
- } else {
2899
- throw Error("Failed to update addresses.");
2900
- }
2901
- } else {
2902
- throw Error("You don't have permission to access this request.");
2903
- }
2907
+ const now = (/* @__PURE__ */ new Date()).getTime();
2908
+ if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1e3) {
2909
+ closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);
2904
2910
  }
2905
- /**
2906
- * Deletes all addresses of a specified id through the API and clear all
2907
- * addresses in the instance.
2908
- *
2909
- * @param id - The id of the addresses to delete.
2910
- * @param auth - The authentication API key.
2911
- */
2912
- async delete(id, auth) {
2913
- const apiKey = auth || this._auth || void 0;
2914
- const targetId = id || this._id || void 0;
2915
- if (targetId === void 0)
2916
- throw Error("Require specific addresses id to be deleted.");
2917
- if (apiKey !== void 0) {
2918
- const response = await this._requestClient.delete(
2919
- `/addresses/${targetId}`,
2911
+ return Math.floor(closestTwelveAM.getTime() / 1e3);
2912
+ };
2913
+ var partitionArray = (array, chunkSize) => {
2914
+ const result = [];
2915
+ for (let i = 0; i < array.length; i += chunkSize) {
2916
+ result.push(array.slice(i, i + chunkSize));
2917
+ }
2918
+ return result;
2919
+ };
2920
+
2921
+ // src/utils/indexer.ts
2922
+ async function callMethodWithIndexerFallback(method, context, ...args) {
2923
+ const lastArgs = args[args.length - 1];
2924
+ if (typeof lastArgs === "object" && lastArgs.indexer) {
2925
+ try {
2926
+ return await method.apply(context, args);
2927
+ } catch (e) {
2928
+ console.warn(
2929
+ `Indexer requests failed: ${e.message}. Retrying without indexer..`
2930
+ );
2931
+ return await method.apply(context, [
2932
+ ...args.slice(0, -1),
2920
2933
  {
2921
- headers: {
2922
- "Content-Type": "application/json",
2923
- "api-key": auth || this._auth
2924
- }
2934
+ ...lastArgs,
2935
+ indexer: false
2925
2936
  }
2926
- );
2927
- if (response.status === 200) {
2928
- this._id = void 0;
2929
- this._currentAddresses = void 0;
2930
- this._addressesMap.clear();
2931
- } else {
2932
- throw Error("Failed to delete addresses.");
2933
- }
2934
- } else {
2935
- throw Error("You don't have permission to access this request.");
2937
+ ]);
2936
2938
  }
2937
2939
  }
2938
- };
2939
-
2940
- // src/models/scallopClient.ts
2941
- var import_utils26 = require("@mysten/sui/utils");
2940
+ return await method.apply(context, args);
2941
+ }
2942
+ function withIndexerFallback(method) {
2943
+ return (...args) => {
2944
+ return callMethodWithIndexerFallback(method, this, ...args);
2945
+ };
2946
+ }
2942
2947
 
2943
- // src/models/scallopUtils.ts
2944
- var import_utils11 = require("@mysten/sui/utils");
2945
- var import_pyth_sui_js = require("@pythnetwork/pyth-sui-js");
2948
+ // src/utils/core.ts
2949
+ var parseObjectAs = (object) => {
2950
+ if (!(object && object.content && "fields" in object.content))
2951
+ throw new Error(`Failed to parse object`);
2952
+ const fields = object.content.fields;
2953
+ if (typeof fields === "object" && "value" in fields) {
2954
+ const value = fields.value;
2955
+ if (typeof value === "object" && "fields" in value)
2956
+ return value.fields;
2957
+ return value;
2958
+ } else if (typeof fields === "object") {
2959
+ return fields;
2960
+ }
2961
+ return fields;
2962
+ };
2946
2963
 
2947
2964
  // src/queries/borrowIncentiveQuery.ts
2948
- var import_utils3 = require("@mysten/sui/utils");
2949
2965
  var import_bignumber2 = __toESM(require("bignumber.js"));
2950
2966
  var queryBorrowIncentivePools = async (address) => {
2951
2967
  const queryPkgId = address.get("borrowIncentive.query");
@@ -2992,7 +3008,7 @@ var getBorrowIncentivePools = async (query, borrowIncentiveCoinNames = [
2992
3008
  query.utils,
2993
3009
  pool
2994
3010
  );
2995
- const poolCoinType = (0, import_utils3.normalizeStructTag)(pool.pool_type.name);
3011
+ const poolCoinType = (0, import_utils2.normalizeStructTag)(pool.pool_type.name);
2996
3012
  const poolCoinName = query.utils.parseCoinNameFromType(
2997
3013
  poolCoinType
2998
3014
  );
@@ -3136,7 +3152,7 @@ var getBindedVeScaKey = async ({
3136
3152
  };
3137
3153
 
3138
3154
  // src/queries/coreQuery.ts
3139
- var import_utils6 = require("@mysten/sui/utils");
3155
+ var import_utils5 = require("@mysten/sui/utils");
3140
3156
  var import_bignumber3 = __toESM(require("bignumber.js"));
3141
3157
 
3142
3158
  // src/queries/supplyLimitQuery.ts
@@ -3344,7 +3360,7 @@ var queryMarket = async (query, indexer = false, coinPrices) => {
3344
3360
  const queryResult = await query.cache.queryInspectTxn({ queryTarget, args });
3345
3361
  const marketData = queryResult?.events[0]?.parsedJson;
3346
3362
  for (const pool of marketData?.pools ?? []) {
3347
- const coinType = (0, import_utils6.normalizeStructTag)(pool.type.name);
3363
+ const coinType = (0, import_utils5.normalizeStructTag)(pool.type.name);
3348
3364
  const poolCoinName = query.utils.parseCoinNameFromType(coinType);
3349
3365
  const coinPrice = coinPrices[poolCoinName] ?? 0;
3350
3366
  if (!SUPPORT_POOLS.includes(poolCoinName)) {
@@ -3399,7 +3415,7 @@ var queryMarket = async (query, indexer = false, coinPrices) => {
3399
3415
  };
3400
3416
  }
3401
3417
  for (const collateral of marketData?.collaterals ?? []) {
3402
- const coinType = (0, import_utils6.normalizeStructTag)(collateral.type.name);
3418
+ const coinType = (0, import_utils5.normalizeStructTag)(collateral.type.name);
3403
3419
  const collateralCoinName = query.utils.parseCoinNameFromType(coinType);
3404
3420
  const coinPrice = coinPrices[collateralCoinName] ?? 0;
3405
3421
  if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {
@@ -3971,11 +3987,11 @@ var getCoinAmounts = async (query, assetCoinNames = [...SUPPORT_POOLS], ownerAdd
3971
3987
  var getCoinAmount = async (query, assetCoinName, ownerAddress) => {
3972
3988
  const owner = ownerAddress ?? query.suiKit.currentAddress();
3973
3989
  const coinType = query.utils.parseCoinType(assetCoinName);
3974
- const amount = await query.cache.queryGetCoinBalance({
3990
+ const coinBalance = await query.cache.queryGetCoinBalance({
3975
3991
  owner,
3976
3992
  coinType
3977
3993
  });
3978
- return (0, import_bignumber3.default)(amount).toNumber();
3994
+ return (0, import_bignumber3.default)(coinBalance?.totalBalance ?? "0").toNumber();
3979
3995
  };
3980
3996
  var getMarketCoinAmounts = async (query, marketCoinNames, ownerAddress) => {
3981
3997
  marketCoinNames = marketCoinNames || [...SUPPORT_POOLS].map(
@@ -3998,11 +4014,11 @@ var getMarketCoinAmounts = async (query, marketCoinNames, ownerAddress) => {
3998
4014
  var getMarketCoinAmount = async (query, marketCoinName, ownerAddress) => {
3999
4015
  const owner = ownerAddress ?? query.suiKit.currentAddress();
4000
4016
  const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);
4001
- const amount = await query.cache.queryGetCoinBalance({
4017
+ const coinBalance = await query.cache.queryGetCoinBalance({
4002
4018
  owner,
4003
4019
  coinType: marketCoinType
4004
4020
  });
4005
- return (0, import_bignumber3.default)(amount).toNumber();
4021
+ return (0, import_bignumber3.default)(coinBalance?.totalBalance ?? "0").toNumber();
4006
4022
  };
4007
4023
  var getFlashLoanFees = async (query, assetNames) => {
4008
4024
  const FEE_RATE = 1e4;
@@ -4116,15 +4132,16 @@ var getLoyaltyProgramInformations = async (query, veScaKey) => {
4116
4132
 
4117
4133
  // src/queries/portfolioQuery.ts
4118
4134
  var import_bignumber5 = __toESM(require("bignumber.js"));
4119
- var getLendings = async (query, poolCoinNames = [...SUPPORT_POOLS], ownerAddress, indexer = false) => {
4135
+ var import_sui_kit3 = require("@scallop-io/sui-kit");
4136
+ var getLendings = async (query, poolCoinNames = [...SUPPORT_POOLS], ownerAddress, marketPools, coinPrices, indexer = false) => {
4120
4137
  const marketCoinNames = poolCoinNames.map(
4121
4138
  (poolCoinName) => query.utils.parseMarketCoinName(poolCoinName)
4122
4139
  );
4123
4140
  const stakeMarketCoinNames = marketCoinNames.filter(
4124
4141
  (marketCoinName) => SUPPORT_SPOOLS.includes(marketCoinName)
4125
4142
  );
4126
- const coinPrices = await query.utils.getCoinPrices();
4127
- const marketPools = (await query.getMarketPools(poolCoinNames, {
4143
+ coinPrices = coinPrices ?? await query.utils.getCoinPrices();
4144
+ marketPools = marketPools ?? (await query.getMarketPools(poolCoinNames, {
4128
4145
  indexer,
4129
4146
  coinPrices
4130
4147
  })).pools;
@@ -4294,9 +4311,9 @@ var getLending = async (query, poolCoinName, ownerAddress, indexer = false, mark
4294
4311
  };
4295
4312
  return lending;
4296
4313
  };
4297
- var getObligationAccounts = async (query, ownerAddress, indexer = false) => {
4298
- const market = await query.getMarketPools(void 0, { indexer });
4299
- const coinPrices = await query.getAllCoinPrices({
4314
+ var getObligationAccounts = async (query, ownerAddress, market, coinPrices, indexer = false) => {
4315
+ market = market ?? await query.getMarketPools(void 0, { indexer });
4316
+ coinPrices = coinPrices ?? await query.getAllCoinPrices({
4300
4317
  marketPools: market.pools
4301
4318
  });
4302
4319
  const [coinAmounts, obligations] = await Promise.all([
@@ -4337,7 +4354,6 @@ var getObligationAccount = async (query, obligation, ownerAddress, indexer = fal
4337
4354
  query.queryObligation(obligation),
4338
4355
  query.getBorrowIncentivePools(void 0, {
4339
4356
  coinPrices,
4340
- indexer,
4341
4357
  marketPools: market.pools
4342
4358
  }),
4343
4359
  query.getBorrowIncentiveAccounts(obligation)
@@ -4656,6 +4672,171 @@ var getTotalValueLocked = async (query, indexer = false) => {
4656
4672
  };
4657
4673
  return tvl;
4658
4674
  };
4675
+ var getUserPortfolio = async (query, walletAddress, indexer = false) => {
4676
+ const coinPrices = await query.utils.getCoinPrices();
4677
+ const market = await query.getMarketPools(void 0, { indexer, coinPrices });
4678
+ const [lendings, obligationAccounts, borrowIncentivePools, veScas] = await Promise.all([
4679
+ query.getLendings(void 0, walletAddress, {
4680
+ indexer,
4681
+ marketPools: market.pools,
4682
+ coinPrices
4683
+ }),
4684
+ query.getObligationAccounts(walletAddress, {
4685
+ indexer,
4686
+ market,
4687
+ coinPrices
4688
+ }),
4689
+ query.getBorrowIncentivePools(void 0, {
4690
+ marketPools: market.pools,
4691
+ coinPrices
4692
+ }),
4693
+ query.getVeScas({ walletAddress, excludeEmpty: true })
4694
+ ]);
4695
+ const parsedLendings = Object.values(lendings).filter((t) => t.availableWithdrawCoin > 0).map((lending) => ({
4696
+ suppliedCoin: lending.availableWithdrawCoin,
4697
+ suppliedValue: lending.suppliedValue,
4698
+ stakedCoin: lending.availableUnstakeCoin,
4699
+ coinName: lending.coinName,
4700
+ symbol: lending.symbol,
4701
+ coinType: lending.coinType,
4702
+ coinPrice: lending.coinPrice,
4703
+ coinDecimals: lending.coinDecimal,
4704
+ supplyApr: lending.supplyApr,
4705
+ supplyApy: lending.supplyApy,
4706
+ incentiveApr: isFinite(lending.rewardApr) ? lending.rewardApr : 0
4707
+ }));
4708
+ const parsedObligationAccounts = Object.values(obligationAccounts).filter(
4709
+ (t) => !!t && t.totalBorrowedValueWithWeight > 0
4710
+ ).map((obligationAccount) => {
4711
+ return {
4712
+ obligationId: obligationAccount.obligationId,
4713
+ totalDebtsInUsd: obligationAccount.totalBorrowedValueWithWeight,
4714
+ totalCollateralInUsd: obligationAccount.totalDepositedValue,
4715
+ riskLevel: obligationAccount.totalRiskLevel,
4716
+ availableCollateralInUsd: obligationAccount.totalAvailableCollateralValue,
4717
+ totalUnhealthyCollateralInUsd: obligationAccount.totalUnhealthyCollateralValue,
4718
+ borrowedPools: Object.values(obligationAccount.debts).filter((debt) => debt.borrowedCoin > 0).map((debt) => ({
4719
+ coinName: debt.coinName,
4720
+ symbol: debt.symbol,
4721
+ coinDecimals: debt.coinDecimal,
4722
+ coinType: debt.coinType,
4723
+ coinPrice: debt.coinPrice,
4724
+ borrowedCoin: debt.borrowedCoin,
4725
+ borrowedValueInUsd: debt.borrowedValueWithWeight,
4726
+ borrowApr: market.pools[debt.coinName]?.borrowApr,
4727
+ borrowApy: market.pools[debt.coinName]?.borrowApy,
4728
+ incentiveInfos: Object.values(
4729
+ borrowIncentivePools[debt.coinName]?.points ?? {}
4730
+ ).filter((t) => isFinite(t.rewardApr)).map((t) => ({
4731
+ coinName: t.coinName,
4732
+ symbol: t.symbol,
4733
+ coinType: t.coinType,
4734
+ incentiveApr: t.rewardApr
4735
+ }))
4736
+ }))
4737
+ };
4738
+ });
4739
+ const pendingLendingRewards = Object.values(lendings).reduce(
4740
+ (acc, reward) => {
4741
+ if (reward.availableClaimCoin === 0)
4742
+ return acc;
4743
+ if (!acc[reward.symbol]) {
4744
+ acc[reward.symbol] = {
4745
+ symbol: reward.symbol,
4746
+ coinType: (0, import_sui_kit3.normalizeStructTag)(import_sui_kit3.SUI_TYPE_ARG),
4747
+ // @TODO: for now lending reward is all in SUI
4748
+ coinPrice: reward.coinPrice,
4749
+ pendingRewardInCoin: reward.availableClaimCoin
4750
+ };
4751
+ } else {
4752
+ acc[reward.symbol].pendingRewardInCoin += reward.availableClaimCoin;
4753
+ }
4754
+ return acc;
4755
+ },
4756
+ {}
4757
+ );
4758
+ const pendingBorrowIncentiveRewards = Object.values(obligationAccounts).filter((t) => !!t).reduce(
4759
+ (acc, curr) => {
4760
+ Object.values(curr.borrowIncentives).forEach((incentive) => {
4761
+ incentive.rewards.forEach((reward) => {
4762
+ if (reward.availableClaimCoin === 0)
4763
+ return acc;
4764
+ if (!acc[reward.coinName]) {
4765
+ acc[reward.coinName] = {
4766
+ symbol: reward.symbol,
4767
+ coinType: reward.coinType,
4768
+ coinPrice: reward.coinPrice,
4769
+ pendingRewardInCoin: reward.availableClaimCoin
4770
+ };
4771
+ } else {
4772
+ acc[reward.coinName].pendingRewardInCoin += reward.availableClaimCoin;
4773
+ }
4774
+ });
4775
+ });
4776
+ return acc;
4777
+ },
4778
+ {}
4779
+ );
4780
+ const parsedVeScas = veScas.map(
4781
+ ({ keyId, lockedScaCoin, currentVeScaBalance, unlockAt }) => ({
4782
+ veScaKey: keyId,
4783
+ coinPrice: coinPrices.sca ?? 0,
4784
+ lockedScaInCoin: lockedScaCoin,
4785
+ lockedScaInUsd: lockedScaCoin * (coinPrices.sca ?? 0),
4786
+ currentVeScaBalance,
4787
+ remainingLockPeriodInDays: unlockAt - Date.now() > 0 ? (unlockAt - Date.now()) / 864e5 : 0,
4788
+ unlockAt
4789
+ })
4790
+ );
4791
+ return {
4792
+ totalSupplyValue: parsedLendings.reduce((acc, curr) => {
4793
+ acc += curr.suppliedValue;
4794
+ return acc;
4795
+ }, 0),
4796
+ ...parsedObligationAccounts.reduce(
4797
+ (acc, curr) => {
4798
+ acc.totalDebtValue += curr.totalDebtsInUsd;
4799
+ acc.totalCollateralValue += curr.totalCollateralInUsd;
4800
+ return acc;
4801
+ },
4802
+ {
4803
+ totalDebtValue: 0,
4804
+ totalCollateralValue: 0
4805
+ }
4806
+ ),
4807
+ totalLockedScaValue: parsedVeScas.reduce((acc, curr) => {
4808
+ acc += curr.lockedScaInUsd;
4809
+ return acc;
4810
+ }, 0),
4811
+ lendings: parsedLendings,
4812
+ borrowings: parsedObligationAccounts,
4813
+ pendingRewards: {
4814
+ lendings: Object.entries(pendingLendingRewards).reduce(
4815
+ (acc, [key, value]) => {
4816
+ acc.push({
4817
+ ...value,
4818
+ coinName: key,
4819
+ pendingRewardInUsd: value.coinPrice * value.pendingRewardInCoin
4820
+ });
4821
+ return acc;
4822
+ },
4823
+ []
4824
+ ),
4825
+ borrowIncentives: Object.entries(pendingBorrowIncentiveRewards).reduce(
4826
+ (acc, [key, value]) => {
4827
+ acc.push({
4828
+ coinName: key,
4829
+ ...value,
4830
+ pendingRewardInUsd: value.coinPrice * value.pendingRewardInCoin
4831
+ });
4832
+ return acc;
4833
+ },
4834
+ []
4835
+ )
4836
+ },
4837
+ veScas: parsedVeScas
4838
+ };
4839
+ };
4659
4840
 
4660
4841
  // src/queries/priceQuery.ts
4661
4842
  var import_bignumber6 = __toESM(require("bignumber.js"));
@@ -4819,11 +5000,11 @@ var getSCoinAmount = async ({
4819
5000
  }, sCoinName, ownerAddress) => {
4820
5001
  const owner = ownerAddress || utils.suiKit.currentAddress();
4821
5002
  const sCoinType = utils.parseSCoinType(sCoinName);
4822
- const amount = await utils.cache.queryGetCoinBalance({
5003
+ const coinBalance = await utils.cache.queryGetCoinBalance({
4823
5004
  owner,
4824
5005
  coinType: sCoinType
4825
5006
  });
4826
- return (0, import_bignumber7.default)(amount).toNumber();
5007
+ return (0, import_bignumber7.default)(coinBalance?.totalBalance ?? "0").toNumber();
4827
5008
  };
4828
5009
  var isSupportStakeCoins = (value) => {
4829
5010
  return SUPPORT_SCOIN.includes(value);
@@ -4867,7 +5048,7 @@ var getSCoinSwapRate = async (query, fromSCoin, toSCoin, underlyingCoinPrice) =>
4867
5048
  };
4868
5049
 
4869
5050
  // src/queries/spoolQuery.ts
4870
- var import_utils9 = require("@mysten/sui/utils");
5051
+ var import_utils8 = require("@mysten/sui/utils");
4871
5052
  var queryRequiredSpoolObjects = async (query, stakePoolCoinNames) => {
4872
5053
  const tasks = stakePoolCoinNames.map((t, idx) => ({
4873
5054
  poolCoinName: stakePoolCoinNames[idx],
@@ -5127,14 +5308,14 @@ var getStakeAccounts = async ({
5127
5308
  svsui: stakeAccounts.svsui,
5128
5309
  susdc: stakeAccounts.susdc
5129
5310
  };
5130
- const normalizedType = (0, import_utils9.normalizeStructTag)(type);
5311
+ const normalizedType = (0, import_utils8.normalizeStructTag)(type);
5131
5312
  const stakeAccountArray = stakeMarketCoinTypeMap[reversedStakeMarketCoinTypes[normalizedType]];
5132
5313
  if (stakeAccountArray) {
5133
5314
  stakeAccountArray.push({
5134
5315
  id,
5135
5316
  type: normalizedType,
5136
5317
  stakePoolId,
5137
- stakeType: (0, import_utils9.normalizeStructTag)(stakeType),
5318
+ stakeType: (0, import_utils8.normalizeStructTag)(stakeType),
5138
5319
  staked,
5139
5320
  index,
5140
5321
  points,
@@ -5172,13 +5353,13 @@ var getStakePool = async ({
5172
5353
  const lastUpdate = Number(fields.last_update);
5173
5354
  stakePool = {
5174
5355
  id,
5175
- type: (0, import_utils9.normalizeStructTag)(type),
5356
+ type: (0, import_utils8.normalizeStructTag)(type),
5176
5357
  maxPoint,
5177
5358
  distributedPoint,
5178
5359
  pointPerPeriod,
5179
5360
  period,
5180
5361
  maxStake,
5181
- stakeType: (0, import_utils9.normalizeStructTag)(stakeType),
5362
+ stakeType: (0, import_utils8.normalizeStructTag)(stakeType),
5182
5363
  totalStaked,
5183
5364
  index,
5184
5365
  createdAt,
@@ -5217,7 +5398,7 @@ var getStakeRewardPool = async ({
5217
5398
  const claimedRewards = Number(rewardPoolFields.claimed_rewards);
5218
5399
  stakeRewardPool = {
5219
5400
  id,
5220
- type: (0, import_utils9.normalizeStructTag)(type),
5401
+ type: (0, import_utils8.normalizeStructTag)(type),
5221
5402
  stakePoolId,
5222
5403
  ratioNumerator,
5223
5404
  ratioDenominator,
@@ -5231,7 +5412,7 @@ var getStakeRewardPool = async ({
5231
5412
 
5232
5413
  // src/queries/vescaQuery.ts
5233
5414
  var import_bignumber8 = __toESM(require("bignumber.js"));
5234
- var import_sui_kit3 = require("@scallop-io/sui-kit");
5415
+ var import_sui_kit4 = require("@scallop-io/sui-kit");
5235
5416
  var import_bcs2 = require("@mysten/sui/bcs");
5236
5417
  var import_zod5 = require("zod");
5237
5418
  var import_assert2 = __toESM(require("assert"));
@@ -5332,9 +5513,9 @@ var getTotalVeScaTreasuryAmount = async (utils, veScaTreasury) => {
5332
5513
  const veScaConfig = utils.address.get("vesca.config");
5333
5514
  veScaTreasury = veScaTreasury ?? utils.address.get("vesca.treasury");
5334
5515
  const refreshQueryTarget = `${veScaPkgId}::treasury::refresh`;
5335
- const refreshArgs = [veScaConfig, veScaTreasury, import_sui_kit3.SUI_CLOCK_OBJECT_ID];
5516
+ const refreshArgs = [veScaConfig, veScaTreasury, import_sui_kit4.SUI_CLOCK_OBJECT_ID];
5336
5517
  const veScaAmountQueryTarget = `${veScaPkgId}::treasury::total_ve_sca_amount`;
5337
- const veScaAmountArgs = [veScaTreasury, import_sui_kit3.SUI_CLOCK_OBJECT_ID];
5518
+ const veScaAmountArgs = [veScaTreasury, import_sui_kit4.SUI_CLOCK_OBJECT_ID];
5338
5519
  const resolvedRefreshArgs = await Promise.all(
5339
5520
  refreshArgs.map(async (arg) => {
5340
5521
  if (typeof arg === "string") {
@@ -5351,7 +5532,7 @@ var getTotalVeScaTreasuryAmount = async (utils, veScaTreasury) => {
5351
5532
  return arg;
5352
5533
  })
5353
5534
  );
5354
- const txb = new import_sui_kit3.SuiTxBlock();
5535
+ const txb = new import_sui_kit4.SuiTxBlock();
5355
5536
  txb.moveCall(refreshQueryTarget, resolvedRefreshArgs);
5356
5537
  txb.moveCall(veScaAmountQueryTarget, resolvedVeScaAmountArgs);
5357
5538
  const txBytes = await txb.txBlock.build({
@@ -5471,6 +5652,7 @@ var getAllAddresses = async (query) => {
5471
5652
  // @ts-ignore
5472
5653
  `spool.pools.s${coinName}.rewardPoolId`
5473
5654
  );
5655
+ const sCoinType = query.address.get(`scoin.coins.s${coinName}.coinType`);
5474
5656
  const sCoinTreasury = query.address.get(
5475
5657
  // @ts-ignore
5476
5658
  `scoin.coins.s${coinName}.treasury`
@@ -5491,7 +5673,9 @@ var getAllAddresses = async (query) => {
5491
5673
  spool,
5492
5674
  spoolReward: rewardPool,
5493
5675
  sCoinTreasury,
5494
- coinDecimalId
5676
+ sCoinType,
5677
+ coinDecimalId,
5678
+ coinType: `0x${coinType}`
5495
5679
  };
5496
5680
  await new Promise((resolve) => setTimeout(resolve, 200));
5497
5681
  })
@@ -5499,17 +5683,6 @@ var getAllAddresses = async (query) => {
5499
5683
  return results;
5500
5684
  };
5501
5685
 
5502
- // src/models/suiKit.ts
5503
- var import_sui_kit4 = require("@scallop-io/sui-kit");
5504
- var newSuiKit = (params) => {
5505
- return new import_sui_kit4.SuiKit({
5506
- ...params,
5507
- fullnodeUrls: Array.from(
5508
- /* @__PURE__ */ new Set([...params.fullnodeUrls ?? [], ...RPC_PROVIDERS])
5509
- )
5510
- });
5511
- };
5512
-
5513
5686
  // src/models/scallopUtils.ts
5514
5687
  var ScallopUtils = class {
5515
5688
  constructor(params, instance) {
@@ -5526,18 +5699,15 @@ var ScallopUtils = class {
5526
5699
  pythEndpoints: params.pythEndpoints ?? PYTH_ENDPOINTS["mainnet"],
5527
5700
  ...params
5528
5701
  };
5529
- this.suiKit = instance?.suiKit ?? instance?.address?.cache._suiKit ?? newSuiKit(params);
5530
- this.walletAddress = params.walletAddress ?? this.suiKit.currentAddress();
5702
+ this.walletAddress = params.walletAddress ?? instance?.suiKit?.currentAddress() ?? "";
5703
+ this.suiKit = instance?.suiKit ?? instance?.address?.cache.suiKit ?? newSuiKit(params);
5531
5704
  if (instance?.address) {
5532
5705
  this.address = instance.address;
5533
5706
  this.cache = this.address.cache;
5534
- this.suiKit = this.address.cache._suiKit;
5535
5707
  } else {
5536
- this.cache = new ScallopCache(
5537
- this.suiKit,
5538
- this.walletAddress,
5539
- DEFAULT_CACHE_OPTIONS
5540
- );
5708
+ this.cache = new ScallopCache(this.params, {
5709
+ suiKit: this.suiKit
5710
+ });
5541
5711
  this.address = instance?.address ?? new ScallopAddress(
5542
5712
  {
5543
5713
  id: params?.addressesId ?? ADDRESSES_ID,
@@ -5601,7 +5771,7 @@ var ScallopUtils = class {
5601
5771
  throw Error(`Coin ${coinName} is not supported`);
5602
5772
  }
5603
5773
  if (coinName === "sui")
5604
- return (0, import_utils11.normalizeStructTag)(`${coinPackageId}::sui::SUI`);
5774
+ return (0, import_utils10.normalizeStructTag)(`${coinPackageId}::sui::SUI`);
5605
5775
  const wormHolePackageIds = [
5606
5776
  this.address.get("core.coins.wusdc.id") ?? wormholeCoinIds.wusdc,
5607
5777
  this.address.get("core.coins.wusdt.id") ?? wormholeCoinIds.wusdt,
@@ -5705,7 +5875,7 @@ var ScallopUtils = class {
5705
5875
  return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;
5706
5876
  }
5707
5877
  parseCoinNameFromType(coinType) {
5708
- coinType = (0, import_utils11.normalizeStructTag)(coinType);
5878
+ coinType = (0, import_utils10.normalizeStructTag)(coinType);
5709
5879
  if (sCoinTypeToName[coinType]) {
5710
5880
  return sCoinTypeToName[coinType];
5711
5881
  }
@@ -5789,8 +5959,8 @@ var ScallopUtils = class {
5789
5959
  * @param coinType - The coin type, default is 0x2::SUI::SUI.
5790
5960
  * @return The selected transaction coin arguments.
5791
5961
  */
5792
- async selectCoins(amount, coinType = import_utils11.SUI_TYPE_ARG, ownerAddress) {
5793
- ownerAddress = ownerAddress ?? this.suiKit.currentAddress();
5962
+ async selectCoins(amount, coinType = import_utils10.SUI_TYPE_ARG, ownerAddress) {
5963
+ ownerAddress = ownerAddress ?? this.walletAddress;
5794
5964
  const coins = await this.suiKit.suiInteractor.selectCoins(
5795
5965
  ownerAddress,
5796
5966
  amount,
@@ -5987,15 +6157,15 @@ var ScallopUtils = class {
5987
6157
  };
5988
6158
 
5989
6159
  // src/models/scallopBuilder.ts
5990
- var import_utils25 = require("@mysten/sui/utils");
6160
+ var import_utils24 = require("@mysten/sui/utils");
5991
6161
 
5992
6162
  // src/builders/coreBuilder.ts
5993
6163
  var import_transactions = require("@mysten/sui/transactions");
5994
- var import_utils14 = require("@mysten/sui/utils");
6164
+ var import_utils13 = require("@mysten/sui/utils");
5995
6165
  var import_sui_kit5 = require("@scallop-io/sui-kit");
5996
6166
 
5997
6167
  // src/builders/oracle.ts
5998
- var import_utils13 = require("@mysten/sui/utils");
6168
+ var import_utils12 = require("@mysten/sui/utils");
5999
6169
  var import_pyth_sui_js2 = require("@pythnetwork/pyth-sui-js");
6000
6170
  var updateOracles = async (builder, txBlock, assetCoinNames, options = { usePythPullModel: true }) => {
6001
6171
  const usePythPullModel = builder.params.usePythPullModel ?? options.usePythPullModel;
@@ -6111,27 +6281,27 @@ var priceUpdateRequest = (txBlock, packageId, xOracleId, coinType) => {
6111
6281
  var confirmPriceUpdateRequest = (txBlock, packageId, xOracleId, request, coinType) => {
6112
6282
  const target = `${packageId}::x_oracle::confirm_price_update_request`;
6113
6283
  const typeArgs = [coinType];
6114
- txBlock.moveCall(target, [xOracleId, request, import_utils13.SUI_CLOCK_OBJECT_ID], typeArgs);
6284
+ txBlock.moveCall(target, [xOracleId, request, import_utils12.SUI_CLOCK_OBJECT_ID], typeArgs);
6115
6285
  return txBlock;
6116
6286
  };
6117
6287
  var updateSupraPrice = (txBlock, packageId, request, holderId, registryId, coinType) => {
6118
6288
  txBlock.moveCall(
6119
6289
  `${packageId}::rule::set_price`,
6120
- [request, holderId, registryId, import_utils13.SUI_CLOCK_OBJECT_ID],
6290
+ [request, holderId, registryId, import_utils12.SUI_CLOCK_OBJECT_ID],
6121
6291
  [coinType]
6122
6292
  );
6123
6293
  };
6124
6294
  var updateSwitchboardPrice = (txBlock, packageId, request, aggregatorId, registryId, coinType) => {
6125
6295
  txBlock.moveCall(
6126
6296
  `${packageId}::rule::set_price`,
6127
- [request, aggregatorId, registryId, import_utils13.SUI_CLOCK_OBJECT_ID],
6297
+ [request, aggregatorId, registryId, import_utils12.SUI_CLOCK_OBJECT_ID],
6128
6298
  [coinType]
6129
6299
  );
6130
6300
  };
6131
6301
  var updatePythPrice = (txBlock, packageId, request, stateId, feedObjectId, registryId, coinType) => {
6132
6302
  txBlock.moveCall(
6133
6303
  `${packageId}::rule::set_price`,
6134
- [request, stateId, feedObjectId, registryId, import_utils13.SUI_CLOCK_OBJECT_ID],
6304
+ [request, stateId, feedObjectId, registryId, import_utils12.SUI_CLOCK_OBJECT_ID],
6135
6305
  [coinType]
6136
6306
  );
6137
6307
  };
@@ -6211,7 +6381,7 @@ var generateCoreNormalMethod = ({
6211
6381
  coreIds.coinDecimalsRegistry,
6212
6382
  txBlock.pure.u64(amount),
6213
6383
  coreIds.xOracle,
6214
- import_utils14.SUI_CLOCK_OBJECT_ID
6384
+ import_utils13.SUI_CLOCK_OBJECT_ID
6215
6385
  ],
6216
6386
  [coinType]
6217
6387
  );
@@ -6221,7 +6391,7 @@ var generateCoreNormalMethod = ({
6221
6391
  return builder.moveCall(
6222
6392
  txBlock,
6223
6393
  `${coreIds.protocolPkg}::mint::mint`,
6224
- [coreIds.version, coreIds.market, coin, import_utils14.SUI_CLOCK_OBJECT_ID],
6394
+ [coreIds.version, coreIds.market, coin, import_utils13.SUI_CLOCK_OBJECT_ID],
6225
6395
  [coinType]
6226
6396
  );
6227
6397
  },
@@ -6230,7 +6400,7 @@ var generateCoreNormalMethod = ({
6230
6400
  return builder.moveCall(
6231
6401
  txBlock,
6232
6402
  `${coreIds.protocolPkg}::mint::mint_entry`,
6233
- [coreIds.version, coreIds.market, coin, import_utils14.SUI_CLOCK_OBJECT_ID],
6403
+ [coreIds.version, coreIds.market, coin, import_utils13.SUI_CLOCK_OBJECT_ID],
6234
6404
  [coinType]
6235
6405
  );
6236
6406
  },
@@ -6239,7 +6409,7 @@ var generateCoreNormalMethod = ({
6239
6409
  return builder.moveCall(
6240
6410
  txBlock,
6241
6411
  `${coreIds.protocolPkg}::redeem::redeem`,
6242
- [coreIds.version, coreIds.market, marketCoin, import_utils14.SUI_CLOCK_OBJECT_ID],
6412
+ [coreIds.version, coreIds.market, marketCoin, import_utils13.SUI_CLOCK_OBJECT_ID],
6243
6413
  [coinType]
6244
6414
  );
6245
6415
  },
@@ -6248,7 +6418,7 @@ var generateCoreNormalMethod = ({
6248
6418
  return builder.moveCall(
6249
6419
  txBlock,
6250
6420
  `${coreIds.protocolPkg}::redeem::redeem_entry`,
6251
- [coreIds.version, coreIds.market, marketCoin, import_utils14.SUI_CLOCK_OBJECT_ID],
6421
+ [coreIds.version, coreIds.market, marketCoin, import_utils13.SUI_CLOCK_OBJECT_ID],
6252
6422
  [coinType]
6253
6423
  );
6254
6424
  },
@@ -6265,7 +6435,7 @@ var generateCoreNormalMethod = ({
6265
6435
  coreIds.coinDecimalsRegistry,
6266
6436
  amount,
6267
6437
  coreIds.xOracle,
6268
- import_utils14.SUI_CLOCK_OBJECT_ID
6438
+ import_utils13.SUI_CLOCK_OBJECT_ID
6269
6439
  ],
6270
6440
  [coinType]
6271
6441
  );
@@ -6284,7 +6454,7 @@ var generateCoreNormalMethod = ({
6284
6454
  borrowReferral,
6285
6455
  typeof amount === "number" ? txBlock.pure.u64(amount) : amount,
6286
6456
  coreIds.xOracle,
6287
- import_utils14.SUI_CLOCK_OBJECT_ID
6457
+ import_utils13.SUI_CLOCK_OBJECT_ID
6288
6458
  ],
6289
6459
  [coinType, referralWitnessType]
6290
6460
  );
@@ -6302,7 +6472,7 @@ var generateCoreNormalMethod = ({
6302
6472
  coreIds.coinDecimalsRegistry,
6303
6473
  txBlock.pure.u64(amount),
6304
6474
  coreIds.xOracle,
6305
- import_utils14.SUI_CLOCK_OBJECT_ID
6475
+ import_utils13.SUI_CLOCK_OBJECT_ID
6306
6476
  ],
6307
6477
  [coinType]
6308
6478
  );
@@ -6317,7 +6487,7 @@ var generateCoreNormalMethod = ({
6317
6487
  obligation,
6318
6488
  coreIds.market,
6319
6489
  coin,
6320
- import_utils14.SUI_CLOCK_OBJECT_ID
6490
+ import_utils13.SUI_CLOCK_OBJECT_ID
6321
6491
  ],
6322
6492
  [coinType]
6323
6493
  );
@@ -6554,7 +6724,7 @@ var newCoreTxBlock = (builder, initTxBlock) => {
6554
6724
 
6555
6725
  // src/builders/spoolBuilder.ts
6556
6726
  var import_transactions2 = require("@mysten/sui/transactions");
6557
- var import_utils16 = require("@mysten/sui/utils");
6727
+ var import_utils15 = require("@mysten/sui/utils");
6558
6728
  var import_sui_kit6 = require("@scallop-io/sui-kit");
6559
6729
  var requireStakeAccountIds = async (...params) => {
6560
6730
  const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;
@@ -6610,7 +6780,7 @@ var generateSpoolNormalMethod = ({
6610
6780
  return builder.moveCall(
6611
6781
  txBlock,
6612
6782
  `${spoolIds.spoolPkg}::user::new_spool_account`,
6613
- [stakePoolId, import_utils16.SUI_CLOCK_OBJECT_ID],
6783
+ [stakePoolId, import_utils15.SUI_CLOCK_OBJECT_ID],
6614
6784
  [marketCoinType]
6615
6785
  );
6616
6786
  },
@@ -6622,7 +6792,7 @@ var generateSpoolNormalMethod = ({
6622
6792
  builder.moveCall(
6623
6793
  txBlock,
6624
6794
  `${spoolIds.spoolPkg}::user::stake`,
6625
- [stakePoolId, stakeAccount, coin, import_utils16.SUI_CLOCK_OBJECT_ID],
6795
+ [stakePoolId, stakeAccount, coin, import_utils15.SUI_CLOCK_OBJECT_ID],
6626
6796
  [marketCoinType]
6627
6797
  );
6628
6798
  },
@@ -6634,7 +6804,7 @@ var generateSpoolNormalMethod = ({
6634
6804
  return builder.moveCall(
6635
6805
  txBlock,
6636
6806
  `${spoolIds.spoolPkg}::user::unstake`,
6637
- [stakePoolId, stakeAccount, amount, import_utils16.SUI_CLOCK_OBJECT_ID],
6807
+ [stakePoolId, stakeAccount, amount, import_utils15.SUI_CLOCK_OBJECT_ID],
6638
6808
  [marketCoinType]
6639
6809
  );
6640
6810
  },
@@ -6651,7 +6821,7 @@ var generateSpoolNormalMethod = ({
6651
6821
  return builder.moveCall(
6652
6822
  txBlock,
6653
6823
  `${spoolIds.spoolPkg}::user::redeem_rewards`,
6654
- [stakePoolId, rewardPoolId, stakeAccount, import_utils16.SUI_CLOCK_OBJECT_ID],
6824
+ [stakePoolId, rewardPoolId, stakeAccount, import_utils15.SUI_CLOCK_OBJECT_ID],
6655
6825
  [marketCoinType, rewardCoinType]
6656
6826
  );
6657
6827
  }
@@ -6786,7 +6956,7 @@ var newSpoolTxBlock = (builder, initTxBlock) => {
6786
6956
 
6787
6957
  // src/builders/borrowIncentiveBuilder.ts
6788
6958
  var import_transactions3 = require("@mysten/sui/transactions");
6789
- var import_utils18 = require("@mysten/sui/utils");
6959
+ var import_utils17 = require("@mysten/sui/utils");
6790
6960
  var import_sui_kit7 = require("@scallop-io/sui-kit");
6791
6961
  var requireObligationInfo2 = async (...params) => {
6792
6962
  const [builder, txBlock, obligationId, obligationKey] = params;
@@ -6839,7 +7009,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
6839
7009
  obligationKey,
6840
7010
  obligationId,
6841
7011
  borrowIncentiveIds.obligationAccessStore,
6842
- import_utils18.SUI_CLOCK_OBJECT_ID
7012
+ import_utils17.SUI_CLOCK_OBJECT_ID
6843
7013
  ]
6844
7014
  );
6845
7015
  },
@@ -6858,7 +7028,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
6858
7028
  veScaIds.treasury,
6859
7029
  veScaIds.table,
6860
7030
  veScaKey,
6861
- import_utils18.SUI_CLOCK_OBJECT_ID
7031
+ import_utils17.SUI_CLOCK_OBJECT_ID
6862
7032
  ],
6863
7033
  []
6864
7034
  );
@@ -6873,7 +7043,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
6873
7043
  borrowIncentiveIds.incentiveAccounts,
6874
7044
  obligationKey,
6875
7045
  obligationId,
6876
- import_utils18.SUI_CLOCK_OBJECT_ID
7046
+ import_utils17.SUI_CLOCK_OBJECT_ID
6877
7047
  ]
6878
7048
  );
6879
7049
  },
@@ -6888,7 +7058,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
6888
7058
  borrowIncentiveIds.incentiveAccounts,
6889
7059
  obligationKey,
6890
7060
  obligationId,
6891
- import_utils18.SUI_CLOCK_OBJECT_ID
7061
+ import_utils17.SUI_CLOCK_OBJECT_ID
6892
7062
  ],
6893
7063
  [rewardType]
6894
7064
  );
@@ -6903,7 +7073,7 @@ var generateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {
6903
7073
  borrowIncentiveIds.incentiveAccounts,
6904
7074
  obligation,
6905
7075
  veScaKey,
6906
- import_utils18.SUI_CLOCK_OBJECT_ID
7076
+ import_utils17.SUI_CLOCK_OBJECT_ID
6907
7077
  ]
6908
7078
  );
6909
7079
  }
@@ -7636,11 +7806,10 @@ var newScallopTxBlock = (builder, initTxBlock) => {
7636
7806
 
7637
7807
  // src/models/scallopIndexer.ts
7638
7808
  var import_axios2 = __toESM(require("axios"));
7639
- var import_sui_kit12 = require("@scallop-io/sui-kit");
7640
7809
  var ScallopIndexer = class {
7641
7810
  constructor(params, instance) {
7642
7811
  this.params = params;
7643
- this.cache = instance?.cache ?? new ScallopCache(new import_sui_kit12.SuiKit({}), void 0, DEFAULT_CACHE_OPTIONS);
7812
+ this.cache = instance?.cache ?? new ScallopCache(this.params);
7644
7813
  this._requestClient = import_axios2.default.create({
7645
7814
  baseURL: SDK_API_BASE_URL,
7646
7815
  headers: {
@@ -7812,12 +7981,12 @@ var ScallopIndexer = class {
7812
7981
  };
7813
7982
 
7814
7983
  // src/models/scallopQuery.ts
7815
- var import_utils24 = require("@mysten/sui/utils");
7984
+ var import_utils23 = require("@mysten/sui/utils");
7816
7985
  var ScallopQuery = class {
7817
7986
  constructor(params, instance) {
7818
7987
  this.params = params;
7819
7988
  this.suiKit = instance?.suiKit ?? instance?.utils?.suiKit ?? newSuiKit(params);
7820
- this.walletAddress = (0, import_utils24.normalizeSuiAddress)(
7989
+ this.walletAddress = (0, import_utils23.normalizeSuiAddress)(
7821
7990
  params.walletAddress ?? this.suiKit.currentAddress()
7822
7991
  );
7823
7992
  if (instance?.utils) {
@@ -7825,11 +7994,9 @@ var ScallopQuery = class {
7825
7994
  this.address = instance.utils.address;
7826
7995
  this.cache = this.address.cache;
7827
7996
  } else {
7828
- this.cache = new ScallopCache(
7829
- this.suiKit,
7830
- this.walletAddress,
7831
- DEFAULT_CACHE_OPTIONS
7832
- );
7997
+ this.cache = new ScallopCache(this.params, {
7998
+ suiKit: this.suiKit
7999
+ });
7833
8000
  this.address = new ScallopAddress(
7834
8001
  {
7835
8002
  id: params?.addressesId ?? ADDRESSES_ID,
@@ -8184,7 +8351,14 @@ var ScallopQuery = class {
8184
8351
  * @return All lending and spool infomation.
8185
8352
  */
8186
8353
  async getLendings(poolCoinNames, ownerAddress = this.walletAddress, args) {
8187
- return await getLendings(this, poolCoinNames, ownerAddress, args?.indexer);
8354
+ return await getLendings(
8355
+ this,
8356
+ poolCoinNames,
8357
+ ownerAddress,
8358
+ args?.marketPools,
8359
+ args?.coinPrices,
8360
+ args?.indexer
8361
+ );
8188
8362
  }
8189
8363
  /**
8190
8364
  * Get user lending and spool information for specific pool.
@@ -8208,7 +8382,13 @@ var ScallopQuery = class {
8208
8382
  * @return All obligation accounts information.
8209
8383
  */
8210
8384
  async getObligationAccounts(ownerAddress = this.walletAddress, args) {
8211
- return await getObligationAccounts(this, ownerAddress, args?.indexer);
8385
+ return await getObligationAccounts(
8386
+ this,
8387
+ ownerAddress,
8388
+ args?.market,
8389
+ args?.coinPrices,
8390
+ args?.indexer
8391
+ );
8212
8392
  }
8213
8393
  /**
8214
8394
  * Get obligation account information for specific id.
@@ -8383,12 +8563,22 @@ var ScallopQuery = class {
8383
8563
  return getAllCoinPrices(this, args?.marketPools, args?.coinPrices);
8384
8564
  }
8385
8565
  /**
8386
- * Query all address (lending pool, collateral pool, borrow dynamics, interest models) of all pool
8566
+ * Query all address (lending pool, collateral pool, borrow dynamics, interest models, etc.) of all pool
8387
8567
  * @returns
8388
8568
  */
8389
8569
  async getPoolAddresses() {
8390
8570
  return getAllAddresses(this);
8391
8571
  }
8572
+ /**
8573
+ * Get user portfolio
8574
+ */
8575
+ async getUserPortfolio(args) {
8576
+ return getUserPortfolio(
8577
+ this,
8578
+ args?.walletAddress ?? this.walletAddress,
8579
+ args?.indexer ?? false
8580
+ );
8581
+ }
8392
8582
  };
8393
8583
 
8394
8584
  // src/models/scallopBuilder.ts
@@ -8396,7 +8586,7 @@ var ScallopBuilder = class {
8396
8586
  constructor(params, instance) {
8397
8587
  this.suiKit = instance?.suiKit ?? newSuiKit(params);
8398
8588
  this.params = params;
8399
- this.walletAddress = (0, import_utils25.normalizeSuiAddress)(
8589
+ this.walletAddress = (0, import_utils24.normalizeSuiAddress)(
8400
8590
  params?.walletAddress ?? this.suiKit.currentAddress()
8401
8591
  );
8402
8592
  if (instance?.query) {
@@ -8405,11 +8595,9 @@ var ScallopBuilder = class {
8405
8595
  this.address = this.utils.address;
8406
8596
  this.cache = this.address.cache;
8407
8597
  } else {
8408
- this.cache = new ScallopCache(
8409
- this.suiKit,
8410
- this.walletAddress,
8411
- DEFAULT_CACHE_OPTIONS
8412
- );
8598
+ this.cache = new ScallopCache(this.params, {
8599
+ suiKit: this.suiKit
8600
+ });
8413
8601
  this.address = new ScallopAddress(
8414
8602
  {
8415
8603
  id: params?.addressesId ?? ADDRESSES_ID,
@@ -8545,7 +8733,7 @@ var ScallopClient = class {
8545
8733
  constructor(params, instance) {
8546
8734
  this.params = params;
8547
8735
  this.suiKit = instance?.suiKit ?? instance?.builder?.suiKit ?? newSuiKit(params);
8548
- this.walletAddress = (0, import_utils26.normalizeSuiAddress)(
8736
+ this.walletAddress = (0, import_utils25.normalizeSuiAddress)(
8549
8737
  params?.walletAddress ?? this.suiKit.currentAddress()
8550
8738
  );
8551
8739
  if (instance?.builder) {
@@ -8555,11 +8743,9 @@ var ScallopClient = class {
8555
8743
  this.address = this.utils.address;
8556
8744
  this.cache = this.address.cache;
8557
8745
  } else {
8558
- this.cache = new ScallopCache(
8559
- this.suiKit,
8560
- this.walletAddress,
8561
- DEFAULT_CACHE_OPTIONS
8562
- );
8746
+ this.cache = new ScallopCache(this.params, {
8747
+ suiKit: this.suiKit
8748
+ });
8563
8749
  this.address = new ScallopAddress(
8564
8750
  {
8565
8751
  id: params?.addressesId ?? ADDRESSES_ID,
@@ -9233,15 +9419,18 @@ var ScallopClient = class {
9233
9419
 
9234
9420
  // src/models/scallop.ts
9235
9421
  var Scallop = class {
9236
- constructor(params, cacheOptions, tokenBucket, queryClient) {
9422
+ constructor(params, cacheOptions, queryClient) {
9237
9423
  this.params = params;
9238
9424
  this.suiKit = newSuiKit(params);
9239
9425
  this.cache = new ScallopCache(
9240
- this.suiKit,
9241
- params.walletAddress,
9242
- cacheOptions ?? DEFAULT_CACHE_OPTIONS,
9243
- tokenBucket ?? new TokenBucket(DEFAULT_TOKENS_PER_INTERVAL, DEFAULT_INTERVAL_IN_MS),
9244
- queryClient
9426
+ {
9427
+ ...this.params,
9428
+ cacheOptions
9429
+ },
9430
+ {
9431
+ suiKit: this.suiKit,
9432
+ queryClient
9433
+ }
9245
9434
  );
9246
9435
  this.address = new ScallopAddress(
9247
9436
  {
@@ -9352,8 +9541,6 @@ var Scallop = class {
9352
9541
  BORROW_FEE_PROTOCOL_ID,
9353
9542
  COIN_GECKGO_IDS,
9354
9543
  DEFAULT_CACHE_OPTIONS,
9355
- DEFAULT_INTERVAL_IN_MS,
9356
- DEFAULT_TOKENS_PER_INTERVAL,
9357
9544
  FlashLoanFeeObjectMap,
9358
9545
  IS_VE_SCA_TEST,
9359
9546
  MAX_LOCK_DURATION,
@@ -9388,11 +9575,9 @@ var Scallop = class {
9388
9575
  ScallopQuery,
9389
9576
  ScallopUtils,
9390
9577
  TEST_ADDRESSES,
9391
- TokenBucket,
9392
9578
  UNLOCK_ROUND_DURATION,
9393
9579
  USE_TEST_ADDRESS,
9394
9580
  assetCoins,
9395
- callWithRateLimit,
9396
9581
  coinDecimals,
9397
9582
  coinIds,
9398
9583
  marketCoins,