@scallop-io/sui-scallop-sdk 1.5.0-alpha.1 → 1.5.0

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 (99) hide show
  1. package/dist/index.d.mts +3159 -0
  2. package/dist/index.d.ts +3159 -3
  3. package/dist/index.js +78 -9966
  4. package/dist/index.mjs +15 -9892
  5. package/package.json +5 -6
  6. package/src/constants/coinGecko.ts +14 -4
  7. package/src/constants/common.ts +7 -0
  8. package/src/constants/enum.ts +23 -0
  9. package/src/constants/poolAddress.ts +112 -1
  10. package/src/constants/pyth.ts +4 -1
  11. package/src/constants/testAddress.ts +220 -49
  12. package/src/constants/xoracle.ts +3 -0
  13. package/src/models/scallopAddress.ts +9 -0
  14. package/src/models/scallopQuery.ts +4 -2
  15. package/src/queries/poolAddressesQuery.ts +2 -2
  16. package/src/queries/portfolioQuery.ts +7 -8
  17. package/src/types/address.ts +1 -0
  18. package/src/utils/util.ts +8 -3
  19. package/dist/builders/borrowIncentiveBuilder.d.ts +0 -12
  20. package/dist/builders/coreBuilder.d.ts +0 -12
  21. package/dist/builders/index.d.ts +0 -12
  22. package/dist/builders/loyaltyProgramBuilder.d.ts +0 -12
  23. package/dist/builders/oracle.d.ts +0 -14
  24. package/dist/builders/referralBuilder.d.ts +0 -12
  25. package/dist/builders/sCoinBuilder.d.ts +0 -4
  26. package/dist/builders/spoolBuilder.d.ts +0 -12
  27. package/dist/builders/vescaBuilder.d.ts +0 -25
  28. package/dist/constants/cache.d.ts +0 -14
  29. package/dist/constants/coinGecko.d.ts +0 -2
  30. package/dist/constants/common.d.ts +0 -20
  31. package/dist/constants/enum.d.ts +0 -14
  32. package/dist/constants/flashloan.d.ts +0 -2
  33. package/dist/constants/index.d.ts +0 -13
  34. package/dist/constants/poolAddress.d.ts +0 -27
  35. package/dist/constants/pyth.d.ts +0 -5
  36. package/dist/constants/queryKeys.d.ts +0 -54
  37. package/dist/constants/rpc.d.ts +0 -1
  38. package/dist/constants/testAddress.d.ts +0 -2
  39. package/dist/constants/vesca.d.ts +0 -5
  40. package/dist/constants/xoracle.d.ts +0 -2
  41. package/dist/index.js.map +0 -1
  42. package/dist/index.mjs.map +0 -1
  43. package/dist/models/index.d.ts +0 -8
  44. package/dist/models/scallop.d.ts +0 -73
  45. package/dist/models/scallopAddress.d.ts +0 -150
  46. package/dist/models/scallopBuilder.d.ts +0 -90
  47. package/dist/models/scallopCache.d.ts +0 -81
  48. package/dist/models/scallopClient.d.ts +0 -321
  49. package/dist/models/scallopIndexer.d.ts +0 -90
  50. package/dist/models/scallopPrice.d.ts +0 -0
  51. package/dist/models/scallopQuery.d.ts +0 -704
  52. package/dist/models/scallopUtils.d.ts +0 -229
  53. package/dist/models/suiKit.d.ts +0 -2
  54. package/dist/queries/borrowIncentiveQuery.d.ts +0 -82
  55. package/dist/queries/borrowLimitQuery.d.ts +0 -9
  56. package/dist/queries/coreQuery.d.ts +0 -171
  57. package/dist/queries/index.d.ts +0 -15
  58. package/dist/queries/isolatedAssetQuery.d.ts +0 -14
  59. package/dist/queries/loyaltyProgramQuery.d.ts +0 -10
  60. package/dist/queries/objectsQuery.d.ts +0 -2
  61. package/dist/queries/poolAddressesQuery.d.ts +0 -29
  62. package/dist/queries/portfolioQuery.d.ts +0 -143
  63. package/dist/queries/priceQuery.d.ts +0 -58
  64. package/dist/queries/referralQuery.d.ts +0 -7
  65. package/dist/queries/sCoinQuery.d.ts +0 -41
  66. package/dist/queries/spoolQuery.d.ts +0 -74
  67. package/dist/queries/supplyLimitQuery.d.ts +0 -9
  68. package/dist/queries/vescaQuery.d.ts +0 -36
  69. package/dist/queries/xOracleQuery.d.ts +0 -13
  70. package/dist/types/address.d.ts +0 -108
  71. package/dist/types/builder/borrowIncentive.d.ts +0 -35
  72. package/dist/types/builder/core.d.ts +0 -56
  73. package/dist/types/builder/index.d.ts +0 -24
  74. package/dist/types/builder/loyaltyProgram.d.ts +0 -23
  75. package/dist/types/builder/referral.d.ts +0 -30
  76. package/dist/types/builder/sCoin.d.ts +0 -37
  77. package/dist/types/builder/spool.d.ts +0 -29
  78. package/dist/types/builder/vesca.d.ts +0 -51
  79. package/dist/types/constant/common.d.ts +0 -24
  80. package/dist/types/constant/enum.d.ts +0 -48
  81. package/dist/types/constant/index.d.ts +0 -3
  82. package/dist/types/constant/xOracle.d.ts +0 -9
  83. package/dist/types/index.d.ts +0 -6
  84. package/dist/types/model.d.ts +0 -60
  85. package/dist/types/query/borrowIncentive.d.ts +0 -124
  86. package/dist/types/query/core.d.ts +0 -380
  87. package/dist/types/query/index.d.ts +0 -7
  88. package/dist/types/query/loyaltyProgram.d.ts +0 -5
  89. package/dist/types/query/portfolio.d.ts +0 -119
  90. package/dist/types/query/sCoin.d.ts +0 -1
  91. package/dist/types/query/spool.d.ts +0 -142
  92. package/dist/types/query/vesca.d.ts +0 -26
  93. package/dist/types/utils.d.ts +0 -22
  94. package/dist/utils/builder.d.ts +0 -15
  95. package/dist/utils/core.d.ts +0 -2
  96. package/dist/utils/index.d.ts +0 -5
  97. package/dist/utils/indexer.d.ts +0 -17
  98. package/dist/utils/query.d.ts +0 -62
  99. package/dist/utils/util.d.ts +0 -27
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants/cache.ts","../src/constants/coinGecko.ts","../src/constants/common.ts","../src/constants/enum.ts","../src/constants/flashloan.ts","../src/constants/poolAddress.ts","../src/constants/pyth.ts","../src/constants/queryKeys.ts","../src/constants/rpc.ts","../src/constants/testAddress.ts","../src/constants/vesca.ts","../src/constants/xoracle.ts","../src/models/scallopCache.ts","../src/models/suiKit.ts","../src/models/scallopAddress.ts","../src/models/scallopClient.ts","../src/models/scallopUtils.ts","../src/queries/borrowIncentiveQuery.ts","../src/utils/builder.ts","../src/utils/query.ts","../src/utils/util.ts","../src/utils/indexer.ts","../src/utils/core.ts","../src/queries/coreQuery.ts","../src/queries/supplyLimitQuery.ts","../src/queries/isolatedAssetQuery.ts","../src/queries/borrowLimitQuery.ts","../src/queries/objectsQuery.ts","../src/queries/loyaltyProgramQuery.ts","../src/queries/portfolioQuery.ts","../src/queries/priceQuery.ts","../src/queries/referralQuery.ts","../src/queries/sCoinQuery.ts","../src/queries/spoolQuery.ts","../src/queries/vescaQuery.ts","../src/queries/poolAddressesQuery.ts","../src/queries/xOracleQuery.ts","../src/models/scallopBuilder.ts","../src/builders/coreBuilder.ts","../src/builders/oracle.ts","../src/builders/spoolBuilder.ts","../src/builders/borrowIncentiveBuilder.ts","../src/builders/vescaBuilder.ts","../src/builders/referralBuilder.ts","../src/builders/loyaltyProgramBuilder.ts","../src/builders/sCoinBuilder.ts","../src/builders/index.ts","../src/models/scallopIndexer.ts","../src/models/scallopQuery.ts","../src/models/scallop.ts"],"sourcesContent":["/**\n * Default cache options for the QueryClient.\n * @type {QueryClientConfig}\n * @description Default cache options for the QueryClient\n * We set the default to 5s to prevent duplicate requests from being requested (e.g. query MarketObject, etc.)\n */\nexport const DEFAULT_CACHE_OPTIONS = {\n defaultOptions: {\n queries: {\n staleTime: 5000,\n gcTime: 5000,\n },\n },\n};\n","import { SupportPoolCoins } from 'src/types/constant/common';\n\nexport const COIN_GECKGO_IDS: Record<SupportPoolCoins, string> = {\n usdc: 'usdc',\n sbeth: 'ethereum',\n sbusdt: 'tether',\n sbwbtc: 'bitcoin',\n weth: 'ethereum',\n wbtc: 'bitcoin',\n wusdc: 'usdc',\n wusdt: 'tether',\n sui: 'sui',\n wapt: 'aptos',\n wsol: 'solana',\n cetus: 'cetus-protocol',\n afsui: 'sui',\n hasui: 'sui',\n vsui: 'sui',\n sca: 'scallop-2',\n fdusd: 'first-digital-usd',\n deep: 'deepbook',\n fud: 'fud-the-pug',\n blub: 'blub',\n};\n","export const API_BASE_URL = 'https://sui.apis.scallop.io' as const;\nexport const SDK_API_BASE_URL = 'https://sdk.api.scallop.io' as const;\n\nexport const IS_VE_SCA_TEST: boolean = false;\nexport const USE_TEST_ADDRESS: boolean = false;\n\nexport const ADDRESSES_ID =\n IS_VE_SCA_TEST || USE_TEST_ADDRESS\n ? ('65fb07c39c845425d71d7b18' as const)\n : ('675c65cd301dd817ea262e76' as const);\n// : ('66f8e7ed9bb9e07fdfb86bbb' as const);\n\nexport const PROTOCOL_OBJECT_ID = IS_VE_SCA_TEST\n ? ('0xc9f859f98ca352a11b97a038c4b4162bee437b8df8caa047990fe9cb03d4f778' as const)\n : ('0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf' as const);\n// export const PROTOCOL_OBJECT_ID =\n// '0x87ddec2984645dbbe2403a509cc6edf393a43acdba9b77d45da2bcbefcf733c1' as const;\n\nexport const BORROW_FEE_PROTOCOL_ID = IS_VE_SCA_TEST\n ? ('0xc9f859f98ca352a11b97a038c4b4162bee437b8df8caa047990fe9cb03d4f778' as const) // test environment\n : ('0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da' as const);\n// export const BORROW_FEE_PROTOCOL_ID =\n// '0x87ddec2984645dbbe2403a509cc6edf393a43acdba9b77d45da2bcbefcf733c1' as const;\n\nexport const SCA_COIN_TYPE = IS_VE_SCA_TEST\n ? (`0x6cd813061a3adf3602b76545f076205f0c8e7ec1d3b1eab9a1da7992c18c0524::sca::SCA` as const)\n : ('0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA' as const);\n\nexport const OLD_BORROW_INCENTIVE_PROTOCOL_ID =\n '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410' as const;\n\nexport const SUPPORT_POOLS = [\n 'usdc', // native USDC\n 'sbeth', // sui bridge ETH\n 'sbusdt', // sui bridge USDT\n 'sbwbtc', // sui bridge WBTC\n 'weth',\n 'wbtc',\n 'wusdc',\n 'wusdt',\n 'sui',\n 'wapt',\n 'wsol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n 'fud',\n 'deep',\n 'fdusd',\n 'blub',\n] as const;\n\nexport const SUPPORT_COLLATERALS = [\n 'usdc', // native USDC\n 'sbeth', // sui bridge ETH\n 'sbusdt', // sui bridge USDT\n 'sbwbtc', // sui bridge WBTC\n 'weth',\n 'wbtc',\n 'wusdc',\n 'wusdt',\n 'sui',\n 'wapt',\n 'wsol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n 'fdusd',\n] as const;\n\nexport const SUPPORT_SPOOLS = [\n 'susdc',\n 'sweth',\n 'ssui',\n 'swusdc',\n 'swusdt',\n 'scetus',\n 'safsui',\n 'shasui',\n 'svsui',\n] as const;\n\nexport const SUPPORT_SCOIN = [\n 'susdc',\n 'ssbeth',\n 'ssbusdt',\n 'ssbwbtc',\n 'ssui',\n 'swusdc',\n 'swusdt',\n 'safsui',\n 'shasui',\n 'svsui',\n 'sweth',\n 'ssca',\n 'scetus',\n 'swsol',\n 'swbtc',\n 'sdeep',\n 'sfud',\n 'sfdusd',\n 'sblub',\n] as const;\n\nexport const SUPPORT_SUI_BRIDGE = ['sbeth', 'sbusdt', 'sbwbtc'] as const;\nexport const SUPPORT_WORMHOLE = [\n 'wusdc',\n 'wusdt',\n 'weth',\n 'wbtc',\n 'wapt',\n 'wsol',\n] as const;\n\nexport const SUPPORT_SPOOLS_REWARDS = ['sui'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_POOLS = [...SUPPORT_POOLS] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_REWARDS = [\n ...SUPPORT_POOLS,\n ...SUPPORT_SCOIN,\n] as const;\nexport const SUPPORT_ORACLES = ['supra', 'switchboard', 'pyth'] as const;\n\nexport const SUPPORT_PACKAGES = [\n 'coinDecimalsRegistry',\n 'math',\n 'whitelist',\n 'x',\n 'protocol',\n 'protocolWhitelist',\n 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n","import type * as types from '../types';\nimport { IS_VE_SCA_TEST } from './common';\n\nexport const coinDecimals: types.SupportCoinDecimals = {\n usdc: 6,\n sbeth: 8,\n sbusdt: 6,\n sbwbtc: 8,\n weth: 8,\n wbtc: 8,\n wusdc: 6,\n wusdt: 6,\n sui: 9,\n wapt: 8,\n wsol: 8,\n cetus: 9,\n afsui: 9,\n hasui: 9,\n vsui: 9,\n sca: 9,\n fdusd: 6,\n deep: 6,\n fud: 5,\n blub: 2,\n susdc: 6,\n sweth: 8,\n ssbeth: 8,\n ssbusdt: 6,\n ssbwbtc: 8,\n swbtc: 8,\n swusdc: 6,\n swusdt: 6,\n ssui: 9,\n swapt: 8,\n swsol: 8,\n scetus: 9,\n safsui: 9,\n shasui: 9,\n svsui: 9,\n ssca: 9,\n sfdusd: 6,\n sdeep: 6,\n sfud: 5,\n sblub: 2,\n};\n\nexport const assetCoins: types.AssetCoins = {\n usdc: 'usdc',\n sbeth: 'sbeth',\n sbusdt: 'sbusdt',\n sbwbtc: 'sbwbtc',\n weth: 'weth',\n wbtc: 'wbtc',\n wusdc: 'wusdc',\n wusdt: 'wusdt',\n sui: 'sui',\n wapt: 'wapt',\n wsol: 'wsol',\n cetus: 'cetus',\n afsui: 'afsui',\n hasui: 'hasui',\n vsui: 'vsui',\n sca: 'sca',\n fdusd: 'fdusd',\n deep: 'deep',\n fud: 'fud',\n blub: 'blub',\n};\n\nexport const marketCoins: types.MarketCoins = {\n susdc: 'susdc',\n ssbeth: 'ssbeth',\n ssbusdt: 'ssbusdt',\n ssbwbtc: 'ssbwbtc',\n sweth: 'sweth',\n swbtc: 'swbtc',\n swusdc: 'swusdc',\n swusdt: 'swusdt',\n ssui: 'ssui',\n swapt: 'swapt',\n swsol: 'swsol',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n ssca: 'ssca',\n sfdusd: 'sfdusd',\n sdeep: 'sdeep',\n sfud: 'sfud',\n sblub: 'sblub',\n};\n\nexport const sCoins: types.SCoins = {\n susdc: 'susdc',\n ssbeth: 'ssbeth',\n ssbusdt: 'ssbusdt',\n sweth: 'sweth',\n swusdc: 'swusdc',\n swusdt: 'swusdt',\n ssbwbtc: 'ssbwbtc',\n ssui: 'ssui',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n ssca: 'ssca',\n swsol: 'swsol',\n swbtc: 'swbtc',\n sfdusd: 'sfdusd',\n sfud: 'sfud',\n sdeep: 'sdeep',\n sblub: 'sblub',\n};\n\nexport const stakeMarketCoins: types.StakeMarketCoins = {\n susdc: 'susdc',\n sweth: 'sweth',\n ssui: 'ssui',\n swusdc: 'swusdc',\n swusdt: 'swusdt',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n};\n\nexport const spoolRewardCoins: types.StakeRewardCoins = {\n sweth: 'sui',\n ssui: 'sui',\n swusdc: 'sui',\n swusdt: 'sui',\n scetus: 'sui',\n safsui: 'sui',\n shasui: 'sui',\n svsui: 'sui',\n susdc: 'sui',\n};\n\nexport const suiBridgeCoins: types.SuiBridgeCoins = {\n sbeth: 'sbeth',\n sbusdt: 'sbusdt',\n sbwbtc: 'sbwbtc',\n};\n\nexport const coinIds: types.AssetCoinIds = {\n sui: '0x0000000000000000000000000000000000000000000000000000000000000002',\n cetus: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n sca: IS_VE_SCA_TEST\n ? '0x6cd813061a3adf3602b76545f076205f0c8e7ec1d3b1eab9a1da7992c18c0524'\n : '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n // Wormhole assets\n weth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n wbtc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n wapt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n wsol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n // Sui LST\n afsui: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n hasui: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n // stable coins\n usdc: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7',\n wusdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n wusdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n fdusd: '0xf16e6b723f242ec745dfd7634ad072c42d5c1d9ac9d62a39c381303eaa57693a',\n // isolated assets\n deep: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270',\n fud: '0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1',\n blub: '0xfa7ac3951fdca92c5200d468d31a365eb03b2be9936fde615e69f0c1274ad3a0',\n // Sui bridge assets\n sbeth: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29',\n sbusdt: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068',\n sbwbtc: '0xaafb102dd0902f5055cadecd687fb5b71ca82ef0e0285d90afde828ec58ca96b',\n};\n\nexport const wormholeCoinIds: types.WormholeCoinIds = {\n weth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n wbtc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n wusdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n wusdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n wapt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n wsol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n};\n\nexport const voloCoinIds: types.VoloCoinIds = {\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n\n// PROD VERSION\nexport const sCoinIds: types.SCoinIds = {\n // ssui: '0xaafc4f740de0dd0dde642a31148fb94517087052f19afb0f7bed1dc41a50c77b::scallop_sui::SCALLOP_SUI', // @TODO: restore on prod\n ssui: '0x88618204de2dfdc2597681a8441ee726b0dc13494c41e319c3264eb7b35fea90::scallop_sui::SCALLOP_SUI',\n // ssca: '0x5ca17430c1d046fae9edeaa8fd76c7b4193a00d764a0ecfa9418d733ad27bc1e::scallop_sca::SCALLOP_SCA', // @TODO: restore on prod\n ssca: '0x9f64a180373a6b66595025ae16a4ab701f0af1dd5c7ce1ac91dc112e52c2a3f8::scallop_sca::SCALLOP_SCA',\n scetus:\n '0xea346ce428f91ab007210443efcea5f5cdbbb3aae7e9affc0ca93f9203c31f0c::scallop_cetus::SCALLOP_CETUS',\n // Wormhole assets\n sweth:\n '0x67540ceb850d418679e69f1fb6b2093d6df78a2a699ffc733f7646096d552e9b::scallop_wormhole_eth::SCALLOP_WORMHOLE_ETH',\n swsol:\n '0x1392650f2eca9e3f6ffae3ff89e42a3590d7102b80e2b430f674730bc30d3259::scallop_wormhole_sol::SCALLOP_WORMHOLE_SOL',\n swbtc:\n '0x2cf76a9cf5d3337961d1154283234f94da2dcff18544dfe5cbdef65f319591b5::scallop_wormhole_btc::SCALLOP_WORMHOLE_BTC',\n // Sui LST\n safsui:\n '0x00671b1fa2a124f5be8bdae8b91ee711462c5d9e31bda232e70fd9607b523c88::scallop_af_sui::SCALLOP_AF_SUI',\n shasui:\n '0x9a2376943f7d22f88087c259c5889925f332ca4347e669dc37d54c2bf651af3c::scallop_ha_sui::SCALLOP_HA_SUI',\n svsui:\n '0xe1a1cc6bcf0001a015eab84bcc6713393ce20535f55b8b6f35c142e057a25fbe::scallop_v_sui::SCALLOP_V_SUI',\n // stable coins\n susdc:\n // '0x854950aa624b1df59fe64e630b2ba7c550642e9342267a33061d59fb31582da5::scallop_usdc::SCALLOP_USDC', // @TODO: restore on prod\n '0x55ed015f9f006c0c96ad36ebe3b3570d088e8498f52defea48e5634c110e485c::scallop_usdc::SCALLOP_USDC',\n swusdc:\n '0xad4d71551d31092230db1fd482008ea42867dbf27b286e9c70a79d2a6191d58d::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC',\n swusdt:\n '0xe6e5a012ec20a49a3d1d57bd2b67140b96cd4d3400b9d79e541f7bdbab661f95::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT',\n sfdusd:\n '0x6711551c1e7652a270d9fbf0eee25d99594c157cde3cb5fbb49035eb59b1b001::scallop_fdusd::SCALLOP_FDUSD',\n // isolated assets\n sdeep:\n // '0xeb7a05a3224837c5e5503575aed0be73c091d1ce5e43aa3c3e716e0ae614608f::scallop_deep::SCALLOP_DEEP', // @TODO: restore on prod\n '0x34f0a2e793e1f79ceac72cfe3bb95f65541da449418289ccd12922d16140c882::scallop_deep::SCALLOP_DEEP',\n // sfud: '0xe56d5167f427cbe597da9e8150ef5c337839aaf46891d62468dcf80bdd8e10d1::scallop_fud::SCALLOP_FUD', // @TODO: restore on prod\n sfud: '0x3b23c05f917052255a0b16a534dbd4446911aa4a30bd3497cdf5b736551e7ef8::scallop_fud::SCALLOP_FUD',\n sblub:\n '0xe72f65446eabfad2103037af2d49d24599106fb44bf4c046c1e7e9acf6844dd0::scallop_blub::SCALLOP_BLUB',\n // Sui bridge assets\n ssbeth:\n '0xb14f82d8506d139eacef109688d1b71e7236bcce9b2c0ad526abcd6aa5be7de0::scallop_sb_eth::SCALLOP_SB_ETH',\n ssbusdt:\n '0xb1d7df34829d1513b73ba17cb7ad90c88d1e104bb65ab8f62f13e0cc103783d3::scallop_sb_usdt::SCALLOP_SB_USDT',\n ssbwbtc:\n '0x08c0fe357d3a138f4552bee393ce3a28a45bebcca43373d6a90bc44ab76f82e2::scallop_sb_wbtc::SCALLOP_SB_WBTC',\n} as const;\n\nexport const sCoinTypeToName = Object.entries(sCoinIds).reduce(\n (acc, [coinName, coinType]) => {\n acc[coinType] = coinName as types.SupportSCoin;\n return acc;\n },\n {} as Record<string, types.SupportSCoin>\n);\n\nexport const sCoinRawNameToName = Object.entries(sCoinIds).reduce(\n (acc, [coinName, coinType]) => {\n acc[coinType.split('::')[2].toLowerCase()] = coinName as types.SupportSCoin;\n return acc;\n },\n {} as Record<string, types.SupportSCoin>\n);\n\n// TEST VERSION\n// export const sCoinIds: types.SCoinIds = {\n// ssui: '0xf569919046f19a0c40b519ecfbb6ca0319698cd5908716c29b62ef56541f298b::scallop_sui::SCALLOP_SUI',\n// swusdt: '0xac781d9f73058ff5e69f9bf8dde32f2e8c71c66d7fe8497fc83b2d9182254b22::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT',\n// swusdc: '0xf5447c4305a486d8c8557559887c2c39449ddb5e748f15d33946d02a1663c158::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC',\n// ssca: '0x958428555e778e55918a59eb1c92c77f32b5c554fa3a5e56cd0815086b5072e7::scallop_sca::SCALLOP_SCA',\n// } as const;\n\n// export const sCoinTreasuryCaps: types.SCoinTreasuryCaps = {\n// ssui: '0xd2c65de0495a060114c6ecc45f5573b8a4519e9538b93075aa2116e94209db55',\n// scetus: '0x24ba523450908240698628d554d910ed9aba6ff6c73ad735ee571cebd833fc4c',\n// ssca: '0xda98f336dd1d5827bfaee0fda75c9618d4c730df79623baca7b13037b514643d',\n// swusdc: '0xd74d585df52333ac463746225b2ae1a48d7f6b037ee97dd43f746e0f6b6a4723',\n// swusdt: '0x7bc99da1e37d838c49b018ed061f115d26c364a6b1a25059aebb372dfadba753',\n// sweth: '0xc2a793057fffb91be6cb026cd35e1fc51d5fdd9fae73d2c1cde19ddde0463c2d',\n// safsui: '0x20df47fa386c9948e255072df3f4e79e32921846770a0d2e01eb4336b5581aa9',\n// shasui: '0x5bb658edbd3f905494862e4b69101922fb3bea9ac5b035c32e66ec3ee1f4e685',\n// svsui: '0x3718f9350999e8be4c20064eaf874f470de4f36e3a7ca580fcd94d640a128936',\n// };\n\n// PROD VERSION\n// export const sCoinConverterTreasury: types.SCoinConverterTreasury = {\n// ssui: '0x5fe57239383098ef93f75912b145e5937a1b3fc78451c78bb1964bc8c4189d5c',\n// scetus: '0x065ab504806e2a013308de3d60940d9550d39ef83c8a3882f5cbc9019388eeee',\n// ssca: '0xa9aa774956ec3ee0cafef4084e16e37aacd15564f6e6eb646a63bd96cb959b27',\n// swusdc: '0x2081a7fe4847aef473729bd6755686a7f232db46a2ff1be187fca961a6767363',\n// swusdt: '0xc19b204eee6306c794d4d8c1b02b6f58862a52d2cdfc2f580131abd967292450',\n// sweth: '0x0517d6380ff1687faf0385ccf758c815f114399e408d8b761fbcac4a3bf32495',\n// safsui: '0x088d0c107a29f250ead75e561a0f5039397da69fffd09392b33939ddc191cd31',\n// shasui: '0xa883cc4c09d51d3c3713124efce616a343a1158d3430cb42147488321db22fcf',\n// svsui: '0x8bd37d8aee69f17c5bb54c77d0d40ff6020b7b4a2c295ed455a79f72fb1c07e7',\n// };\n\n// TEST VERSION\n// export const sCoinConverterTreasury: types.SCoinConverterTreasury = {\n// ssui: '0x9cb4551b36c17d37e19d700147fa819ea1c487ff8bcf18374de2cceb2e9d4845',\n// scetus: '0xd786f4b2d26278cc7911a3445b1b085eab60f269ef9dbb6b87e803d52f155003',\n// ssca: '0xe818636d1d6c46d6ea1a2dce9d94696d7cbc18ce27451b603eeaa47aba8d75e0',\n// swusdc: '0xfc6971648f867f7fd6928d1b873af71577e2eaf2c7543ef8bc82c431d833ae78',\n// swusdt: '0xb9593e2c3a0ba796ee815012b75ae46468ea78cda0188b9ac6816efe65503521',\n// sweth: '0x032b4c8fac94c038dbe986f7587e9b1e4ef580b5ee06d2ef249d85459b7ef05d',\n// safsui: '0x21450ef0570ef3d224ffa3b873ab802e439ece7b93cc7efad10ae0c1e3b3fcfe',\n// shasui: '0xf822fc1402207e47d2e3ba8ff6e1e594bf1de777dc5ebd2744619cd2726e3b0d',\n// svsui: '0x327114f0bf3559d7e2de10282147ed76a236c7c6775029165c4db09a6062ead6',\n// };\n","import { OptionalKeys, SupportPoolCoins } from 'src/types';\n\nexport const FlashLoanFeeObjectMap: OptionalKeys<\n Record<SupportPoolCoins, string>\n> = {\n vsui: '0x0069cddee7a5c0b1d34beb5ef0620f978096525f1830b055f38b110f40d73fbb',\n wbtc: '0x2078490aa37d8fb42b511e5c95e217cb957d141267e16980bc802d76b42719f7',\n sui: '0x27614284a8f0a699ffd35aae8f2572c937ec76771cb21b0d7930ec4491a76ed4',\n wusdt: '0x5b61983a19b5159ca348d291e4b595f42db70ccda32852a2ed85528aa65171e4',\n wapt: '0x9d5898edcd1e4abcb044273242293a9d036f6a977bf3fe57ab71f5a87c505ee6',\n afsui: '0xac87fde83d434554ec300c1334c9a622aa5b59e82a04334dc99e1cc1f75d4eae',\n hasui: '0xb9f505d532de1d6c9f3a8522a2d16f2958b75c0ed939d4f80b96f584a2a8ed5e',\n wusdc: '0xd241d6a7e44ac11a6689370ed9a98eec389b98b8a6695c61fddede9fa7567b90',\n weth: '0xd252acb058e77877810c1290564e290a8f9fcab5bc9aca2884ede8a38810cf34',\n sca: '0xe04e46471754b6f48d81c549ecfec09de02733715a63bec02364c6ac7c4dd2dc',\n cetus: '0xe65a73d11c31b2d323ad2b9f6b4bb0a3c0df9c1b212eef66c854941186a5ddc7',\n wsol: '0xe84bdb35b790fc7bdd1645122ac6ac0fc904531d6772c9e25904fece322c5f34',\n};\n","import { OptionalKeys, SupportPoolCoins } from 'src/types';\n\nexport const POOL_ADDRESSES: OptionalKeys<\n Record<\n SupportPoolCoins,\n {\n coinName: string;\n symbol: string;\n coinType: string;\n lendingPoolAddress: string;\n borrowDynamic: string;\n interestModel: string;\n borrowFeeKey: string;\n coinMetadataId: string;\n decimals: number;\n pythFeed: string;\n pythFeedObjectId: string;\n // optional keys\n collateralPoolAddress?: string; // not all pool has collateral\n riskModel?: string;\n supplyLimitKey?: string;\n borrowLimitKey?: string;\n sCoinType?: string;\n sCoinName?: string;\n sCoinSymbol?: string;\n sCoinMetadataId?: string;\n sCoinTreasury?: string;\n isolatedAssetKey?: string;\n spool?: string;\n spoolReward?: string;\n spoolName?: string;\n }\n >\n> = {\n sbeth: {\n coinName: 'sbeth',\n symbol: 'sbETH',\n lendingPoolAddress:\n '0xaa34c938e0394e5186c7dc626ad69be96af2194b23fdc6ac1c63090e399f5ba4',\n collateralPoolAddress:\n '0xce0549a1cbe952e734f56646988e6b02bbae14667889a60e24d0d03540a6119f',\n borrowDynamic:\n '0x7bbe75e8b924229f2f2110838ff612ea66e670fa3766759515dee78f617b1ea3',\n interestModel:\n '0x9e6cae260d05155785a1904d24e6abc98368509c5752c8a9cec15a35aabc1512',\n riskModel:\n '0xcf10334cfee675ecea2d2fee37b0f7cd2835c84b8b5692a853021debe6af80ab',\n borrowFeeKey:\n '0x4298c8b6afe7a42a8e3ff93773fb9769529fe6d37e085ab411acf2ba2a44a931',\n supplyLimitKey:\n '0x812fe508b78d3e0817149c0b39976221ddb267b5cc9514e81679f9b9a2f3624c',\n borrowLimitKey:\n '0x165c274c67eda2b0d13563124741fffd0ce7d643f4c1c4b59d7e53a83796ae25',\n sCoinTreasury:\n '0xfd0f02def6358a1f266acfa1493d4707ee8387460d434fb667d63d755ff907ed',\n sCoinType:\n '0xb14f82d8506d139eacef109688d1b71e7236bcce9b2c0ad526abcd6aa5be7de0::scallop_sb_eth::SCALLOP_SB_ETH',\n sCoinName: 'ssbeth',\n sCoinSymbol: 'ssbETH',\n coinMetadataId:\n '0x89b04ba87f8832d4d76e17a1c9dce72eb3e64d372cf02012b8d2de5384faeef0',\n coinType:\n '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n sCoinMetadataId:\n '0xdfdd14d53ed8c7ace7cac8a0eecdfa4c2345e15d9efcbd4e1828f81a107cbe2d',\n decimals: 8,\n pythFeed:\n 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n pythFeedObjectId:\n '0x9193fd47f9a0ab99b6e365a464c8a9ae30e6150fc37ed2a89c1586631f6fc4ab',\n },\n sbusdt: {\n coinName: 'sbusdt',\n symbol: 'sbUSDT',\n lendingPoolAddress:\n '0x958ca02058a7dd8b00e26ed6988f45d7c2834ae2a47ee4c4a8fdedea155f18ca',\n collateralPoolAddress:\n '0x63c861f97192ceab2dabb1e74649ae87a9e36c33aaedcc43e40a811d3a39e653',\n borrowDynamic:\n '0xf1ef9a19881ed6ddeb88f361c83f37c592ec5b9c64fe715383f63ccc094be205',\n interestModel:\n '0x62c46e4667c4fa69a29030ecbc0f661c61365d02adc3810b08b11cfd8f42ca1c',\n riskModel:\n '0x59d5f3dbcd14a0aab6ee6e2879803e10b0a752119d19c4ac0bd389d71dc8c2bf',\n borrowFeeKey:\n '0xa418990ad042e97cca61830476483933b9e026970fc33451072b2627ccb31da2',\n supplyLimitKey:\n '0x93641bfb62ea40760f0c15911b4ec0eb866f8725e36b0ca9a786775d93629139',\n borrowLimitKey:\n '0x953a9b8d5353abb38db21a2cbbc5c54f8f23348895acb26cbe2c0ab61b54635d',\n sCoinTreasury:\n '0x58bdf6a9752e3a60144d0b70e8608d630dfd971513e2b2bfa7282f5eaa7d04d8',\n sCoinType:\n '0xb1d7df34829d1513b73ba17cb7ad90c88d1e104bb65ab8f62f13e0cc103783d3::scallop_sb_usdt::SCALLOP_SB_USDT',\n sCoinName: 'ssbusdt',\n sCoinSymbol: 'ssbUSDT',\n coinMetadataId:\n '0xda61b33ac61ed4c084bbda65a2229459ed4eb2185729e70498538f0688bec3cc',\n coinType:\n '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n sCoinMetadataId:\n '0x1ce77b036043c8fdcc5cd050ed06433ae60296b194c2abf7ade8b7b7c8386d36',\n decimals: 6,\n pythFeed:\n '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n pythFeedObjectId:\n '0x985e3db9f93f76ee8bace7c3dd5cc676a096accd5d9e09e9ae0fb6e492b14572',\n },\n sbwbtc: {\n coinName: 'sbwbtc',\n symbol: 'sbwBTC',\n lendingPoolAddress:\n '0x5c4fc366c39e0969ddb8912da221cbf298656466f3b58039ff82c5ce64071ad8',\n collateralPoolAddress:\n '0x85fb30d16d66f08e8bc8013665b786d5ca04652015c5ac7461cee51c54d7d507',\n borrowDynamic:\n '0x1e25ebd25b6e1d4c765ff3172472ae21903e7f237b3efe1f6f011c93fef9f634',\n interestModel:\n '0x5f7bff8aa04cc6790a88c51014d5b6feadf6441e4c40a496d67705c2856183b3',\n riskModel:\n '0xb62fb27d5f1305ed94092ff4fd7015a71420bd2b47542599d361a1e8b88c46ad',\n borrowFeeKey:\n '0x4ede8076a8d83315c49df8db9e6774d55ba149fcfb4a7a38845cd76c34f590d1',\n supplyLimitKey:\n '0x4f5dfd04f32cc7ba8fba665486838fd3a291324980460d31bf79918a6b68a112',\n sCoinTreasury:\n '0x21db1d3b310d32b5fb1383591103bfea57c6aed62ef6d3b6d469bab752b8681f',\n borrowLimitKey:\n '0xc32b0a82ae08248912c39da03c1b347bcfbc7b63da0385e24306c4b97777da56',\n sCoinType:\n '0x08c0fe357d3a138f4552bee393ce3a28a45bebcca43373d6a90bc44ab76f82e2::scallop_sb_wbtc::SCALLOP_SB_WBTC',\n sCoinName: 'ssbwbtc',\n sCoinSymbol: 'ssbwBTC',\n coinMetadataId:\n '0x53e1cae1ad70a778d0b450d36c7c2553314ca029919005aad26945d65a8fb784',\n coinType:\n '0xaafb102dd0902f5055cadecd687fb5b71ca82ef0e0285d90afde828ec58ca96b::btc::BTC',\n sCoinMetadataId:\n '0x83d3d44ca57f9b1657065865caa497188d6fc1429f0ca846a51a9058f066f591',\n decimals: 8,\n pythFeed:\n 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n pythFeedObjectId:\n '0x9a62b4863bdeaabdc9500fce769cf7e72d5585eeb28a6d26e4cafadc13f76ab2',\n },\n usdc: {\n ...{\n coinName: 'usdc',\n symbol: 'USDC',\n lendingPoolAddress:\n '0xd3be98bf540f7603eeb550c0c0a19dbfc78822f25158b5fa84ebd9609def415f',\n collateralPoolAddress:\n '0x8f0d529ba179c5b3d508213003eab813aaae31f78226099639b9a69d1aec17af',\n borrowDynamic:\n '0x77837ecd4f26fac9a410fff594f2c0bd3288904a15492ca77cb8a52684dbb866',\n interestModel:\n '0xaae3f179d63009380cbdcb9acb12907afc9c3cb79cc3460be296a9c6d28f3ff3',\n riskModel:\n '0x198b24db213bfeb8b3c80ae63dde92e32fd24984d25da8233ff777b851edd574',\n borrowFeeKey:\n '0xd37c5316cfe0a5967d14264fa6b423f880518b294a1ee6581ccbb49ccc401fb8',\n supplyLimitKey:\n '0x4be9ae54ac4d320f4f9c14cae78cb85c8e0e67791dd9bdba6d2db20614a28a24',\n borrowLimitKey:\n '0x6b01093cba95b835181f00e3a2c31ed8dfc8d64fe3db0fb80933a09f66e1ccf1',\n spool:\n '0x0b5f5f413bd3799e4052c37311966c77f3a4545eb125d2e93e67a68478021918',\n spoolReward:\n '0x85ed6ed72ea97c35dbf0cdc7ed6fbc48d8ec15de9b17c74bf4512df8a6d7f166',\n sCoinTreasury:\n '0xbe6b63021f3d82e0e7e977cdd718ed7c019cf2eba374b7b546220402452f938e',\n sCoinType:\n '0x854950aa624b1df59fe64e630b2ba7c550642e9342267a33061d59fb31582da5::scallop_usdc::SCALLOP_USDC',\n sCoinName: 'susdc',\n sCoinSymbol: 'sUSDC',\n coinMetadataId:\n '0x69b7a7c3c200439c1b5f3b19d7d495d5966d5f08de66c69276152f8db3992ec6',\n coinType:\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n sCoinMetadataId:\n '0x763a21eba338e00bc684aaad80491c89eea5f247b59c47df45b17610c9ad58f2',\n spoolName: 'susdc',\n decimals: 6,\n pythFeed:\n 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n pythFeedObjectId:\n '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n ...{\n coinName: 'usdc',\n symbol: 'USDC',\n lendingPoolAddress:\n '0x13319d295914b390b22484373f20f822bca10314c34c227ae6e28df3d9aa8e01',\n collateralPoolAddress:\n '0x2fdcf63682577f6bfdd4296500067543ba9877d5d5e41ebd9e51b97ab071ce69',\n borrowDynamic:\n '0x7fd0660f0102789ad039542165c6cbc2d90ba3c1d9dbd4ac4ae8804d80817542',\n interestModel:\n '0xd4e7b06a79f63706523167f055296db641b0f8ddd6734c05e205f2de0fcefdd0',\n riskModel:\n '0x19e5993350186f192ffeb2cba0650b04c291390e149c8ac9b324ecf394daaa1a',\n spool:\n '0x0b5f5f413bd3799e4052c37311966c77f3a4545eb125d2e93e67a68478021918',\n spoolReward:\n '0x85ed6ed72ea97c35dbf0cdc7ed6fbc48d8ec15de9b17c74bf4512df8a6d7f166',\n sCoinTreasury:\n '0x6ef82ef94472dcb8c2cdeac8df38874024c08570ca165986ba56d1e38fe0c0a3',\n sCoinType:\n '0x55ed015f9f006c0c96ad36ebe3b3570d088e8498f52defea48e5634c110e485c::scallop_usdc::SCALLOP_USDC',\n sCoinName: 'susdc',\n sCoinSymbol: 'sUSDC',\n coinMetadataId:\n '0x69b7a7c3c200439c1b5f3b19d7d495d5966d5f08de66c69276152f8db3992ec6',\n coinType:\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n spoolName: 'susdc',\n decimals: 6,\n pythFeed:\n 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n pythFeedObjectId:\n '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n }, // @TODO: restore on prod\n weth: {\n coinName: 'weth',\n symbol: 'wETH',\n lendingPoolAddress:\n '0xc8fcdff48efc265740ae0b74aae3faccae9ec00034039a113f3339798035108c',\n collateralPoolAddress:\n '0xad7ced91ed6e7f2b81805561eee27fa6f3e72fdae561077334c7248583db4dbf',\n borrowDynamic:\n '0xd1578e1d1c9c82eb4c5bf14beece8142a67a683b2647d7276e92984119fc1445',\n interestModel:\n '0xa1dc08541cd2cb7cfb4e56272292d5c6a4780e80fd210c58abffae98268b5ed9',\n riskModel:\n '0x9f05a25fd33a9e8cf33962126b175d038e184f0ee1b87dc41d4cedbe6abebbe5',\n borrowFeeKey:\n '0x29672ba8ab4625b8181d8ed739e5344de22a97d417748c4d1276c7379283d7a3',\n supplyLimitKey:\n '0x2b957941bdc9432bbc83ab74dc194b6ebb7c927bc4c6926a5492b5503499e509',\n borrowLimitKey:\n '0x51f256d87e51a7ca2b1c482923096f4b6dac6beac89d8ecf4c65b7d5764115d6',\n spool: '0xeec40beccb07c575bebd842eeaabb835f77cd3dab73add433477e57f583a6787',\n spoolReward:\n '0x957de68a18d87817de8309b30c1ec269a4d87ae513abbeed86b5619cb9ce1077',\n sCoinTreasury:\n '0x4b7f5da0e306c9d52490a0c1d4091e653d6b89778b9b4f23c877e534e4d9cd21',\n sCoinType:\n '0x67540ceb850d418679e69f1fb6b2093d6df78a2a699ffc733f7646096d552e9b::scallop_wormhole_eth::SCALLOP_WORMHOLE_ETH',\n sCoinName: 'sweth',\n sCoinSymbol: 'swETH',\n coinMetadataId:\n '0x8900e4ceede3363bef086d6b50ca89d816d0e90bf6bc46efefe1f8455e08f50f',\n coinType:\n '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n sCoinMetadataId:\n '0x077d0fd835b559e5b4bb52641f7627ddbf8b200f9b2cf4e28b3514da2a32a4dd',\n spoolName: 'sweth',\n decimals: 8,\n pythFeed:\n 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n pythFeedObjectId:\n '0x9193fd47f9a0ab99b6e365a464c8a9ae30e6150fc37ed2a89c1586631f6fc4ab',\n },\n wbtc: {\n coinName: 'wbtc',\n symbol: 'wBTC',\n lendingPoolAddress:\n '0x65cc08a5aca0a0b8d72e1993ded8d145f06dd102fd0d8f285b92934faed564ab',\n collateralPoolAddress:\n '0x1aa4e5cf743cd797b4eb8bf1e614f80ae2cf556ced426cddaaf190ffcd0e59c3',\n borrowDynamic:\n '0x6f97dcf54158a5d08f359a213a41e347bc1e6316414288dc1e1b674dc008742e',\n interestModel:\n '0x582b915cca0ffca9576a7cedd505d0fd7cb146e9521ccf10e7453ed93705684d',\n riskModel:\n '0x1d0a242bf1682e259112239720da19d3155dd99d70b1f4b3b973eecbab858911',\n borrowFeeKey:\n '0x654ab7e8ff6d9ef04da697e1f12ca21eaf72ebb495daf877e0776e65187dcb92',\n supplyLimitKey:\n '0xac3b0d17df9f98aa2798c54405cf1d8d5356ef22f76f02d150cbe5195e9f3a36',\n borrowLimitKey:\n '0x231e13ba6b1eb26c562f4a125778d3152f9a77e31f124bd6012e234a73012169',\n sCoinTreasury:\n '0xe2883934ea42c99bc998bbe0f01dd6d27aa0e27a56455707b1b34e6a41c20baa',\n sCoinType:\n '0x2cf76a9cf5d3337961d1154283234f94da2dcff18544dfe5cbdef65f319591b5::scallop_wormhole_btc::SCALLOP_WORMHOLE_BTC',\n sCoinName: 'swbtc',\n sCoinSymbol: 'swBTC',\n coinMetadataId:\n '0x5d3c6e60eeff8a05b693b481539e7847dfe33013e7070cdcb387f5c0cac05dfd',\n coinType:\n '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN',\n sCoinMetadataId:\n '0x1ba5904dae41699683da767c7a97785a55c51ec1253498c8fe1980169a96523d',\n decimals: 8,\n pythFeed:\n 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n pythFeedObjectId:\n '0x9a62b4863bdeaabdc9500fce769cf7e72d5585eeb28a6d26e4cafadc13f76ab2',\n },\n wusdc: {\n coinName: 'wusdc',\n symbol: 'wUSDC',\n lendingPoolAddress:\n '0x2f4df5e1368fbbdaa5c712d28b837b3d41c2d3872979ccededcdfdac55ff8a93',\n collateralPoolAddress:\n '0x94cf69158114c5b242d2ee5d0149a335bddf3b9c9a6ba919cca58097a4814980',\n borrowDynamic:\n '0x0464d117908b52fc75f7f85322a47caa078ef56f48681bcfdcb630a66f2591e6',\n interestModel:\n '0xd72e2b5ba486752939d6dfb86a67b86ce9a60c83cb8fb893caac54a0f112577f',\n riskModel:\n '0xb74035de8f70c1531ceb8e2e8c152d6b8db24c8a9fe7bbf6f75dbf7c6700a0a3',\n borrowFeeKey:\n '0x76dcf1acbd9951fe3d1a3fe28403fec089ffe53a7c7d6c77e3ea97033a63581a',\n supplyLimitKey:\n '0x7b302196907e87c5d5872f2e6f40628d110170f994e0e08bc607bded001958c3',\n borrowLimitKey:\n '0x97f1502ce994db0bcb15aac1760d174def9e88e97cd2262eed54521ee2c19f81',\n spool: '0x4ace6648ddc64e646ba47a957c562c32c9599b3bba8f5ac1aadb2ae23a2f8ca0',\n spoolReward:\n '0xf4268cc9b9413b9bfe09e8966b8de650494c9e5784bf0930759cfef4904daff8',\n sCoinTreasury:\n '0x50c5cfcbcca3aaacab0984e4d7ad9a6ad034265bebb440f0d1cd688ec20b2548',\n sCoinType:\n '0xad4d71551d31092230db1fd482008ea42867dbf27b286e9c70a79d2a6191d58d::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC',\n sCoinName: 'swusdc',\n sCoinSymbol: 'swUSDC',\n coinMetadataId:\n '0x4fbf84f3029bd0c0b77164b587963be957f853eccf834a67bb9ecba6ec80f189',\n coinType:\n '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n sCoinMetadataId:\n '0xdc0595d068621d630f3c7c364dd257f7e3f8079e00c31c8d18755a033c15ae93',\n spoolName: 'swusdc',\n decimals: 6,\n pythFeed:\n 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n pythFeedObjectId:\n '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n wusdt: {\n coinName: 'wusdt',\n symbol: 'wUSDT',\n lendingPoolAddress:\n '0xfbc056f126dd35adc1f8fe985e2cedc8010e687e8e851e1c5b99fdf63cd1c879',\n collateralPoolAddress:\n '0x2260cb5b24929dd20a1742f37a61ff3ce4fde5cdb023e2d3ce2e0ce2d90719e3',\n borrowDynamic:\n '0xb524030cc8f7cdbf13f1925a0a2b5e77cc52bab73b070f42c5e510f6083da1ba',\n interestModel:\n '0x92f93c4431b4c51774d6d964da516af2def18b78f49dbbf519e58449a8ba4659',\n riskModel:\n '0xdf89d66988cb506ddeff46f5dfd1d11aaece345e9a05a0c6a18a0788647de2a7',\n borrowFeeKey:\n '0xda8f8b3522fc4086eae4ae7ce8844d60aa0dc3eab8ffc91fe93e922a72639b2d',\n supplyLimitKey:\n '0xa9cb5ebb90ca6e808a2bd7728cca4a6fa8b565d4deeda96eb23c8322c477c24e',\n borrowLimitKey:\n '0xa3278564fc613680a69c10972a0299965bf6e12e9ac171388842fc958de0f90e',\n spool: '0xcb328f7ffa7f9342ed85af3fdb2f22919e1a06dfb2f713c04c73543870d7548f',\n spoolReward:\n '0x2c9f934d67a5baa586ceec2cc24163a2f049a6af3d5ba36b84d8ac40f25c4080',\n sCoinTreasury:\n '0x1f02e2fed702b477732d4ad6044aaed04f2e8e586a169153694861a901379df0',\n sCoinType:\n '0xe6e5a012ec20a49a3d1d57bd2b67140b96cd4d3400b9d79e541f7bdbab661f95::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT',\n sCoinName: 'swusdt',\n sCoinSymbol: 'swUSDT',\n coinMetadataId:\n '0xfb0e3eb97dd158a5ae979dddfa24348063843c5b20eb8381dd5fa7c93699e45c',\n coinType:\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n sCoinMetadataId:\n '0x171d0f1ca99d5fefb8b2e40b89899bacdc5417a783906ae119b9cb1c113d59ae',\n spoolName: 'swusdt',\n decimals: 6,\n pythFeed:\n '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n pythFeedObjectId:\n '0x985e3db9f93f76ee8bace7c3dd5cc676a096accd5d9e09e9ae0fb6e492b14572',\n },\n sui: {\n ...{\n coinName: 'sui',\n symbol: 'SUI',\n lendingPoolAddress:\n '0x9c9077abf7a29eebce41e33addbcd6f5246a5221dd733e56ea0f00ae1b25c9e8',\n collateralPoolAddress:\n '0x75aacfb7dcbf92ee0111fc1bf975b12569e4ba632e81ed7ae5ac090d40cd3acb',\n borrowDynamic:\n '0xbf68e6159c99dcaf87717385f1143d2891c2d19663bd51f0bc9b6909e4bb7c27',\n interestModel:\n '0x0dad9baa89b863c15a0487575de7cc428b01f1aa3998ad7a9e9752d96e83ffa9',\n riskModel:\n '0xcd6675864690b5648a6e309f2f02a66914b2b2bd9c31936f4e0f7fc0f792bc86',\n borrowFeeKey:\n '0xda5ede87a05c0677b17511c859b22d0a2b0229ee374d5d7a1274cb836b9fe5f8',\n supplyLimitKey:\n '0x0602418e66fb7a73fa997077bd66f248ad5b090d43344a14b9f1db598ecc1d47',\n borrowLimitKey:\n '0x2b33a7efdcf6a6df24f4d8a356dd52f58d75bc023c3f171d99502d4d008b53f0',\n spool:\n '0x4f0ba970d3c11db05c8f40c64a15b6a33322db3702d634ced6536960ab6f3ee4',\n spoolReward:\n '0x162250ef72393a4ad3d46294c4e1bdfcb03f04c869d390e7efbfc995353a7ee9',\n sCoinTreasury:\n '0x5c1678c8261ac9eec024d4d630006a9f55c80dc0b1aa38a003fcb1d425818c6b',\n sCoinType:\n '0xaafc4f740de0dd0dde642a31148fb94517087052f19afb0f7bed1dc41a50c77b::scallop_sui::SCALLOP_SUI',\n sCoinName: 'ssui',\n sCoinSymbol: 'sSUI',\n coinMetadataId:\n '0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3',\n coinType:\n '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n sCoinMetadataId:\n '0xac724644f481f4870ecdc29b9549aa8ea5180f10827c0d97b493f9f65a91455d',\n spoolName: 'ssui',\n decimals: 9,\n pythFeed:\n '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n pythFeedObjectId:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n ...{\n coinName: 'sui',\n symbol: 'SUI',\n lendingPoolAddress:\n '0xeb86ad67543c1ac2c4cbaf178d38a45ab27c2e69d60f0f8badd83f563f012c3c',\n collateralPoolAddress:\n '0xcba7bb07d4d3ce01d81e71d9def680aa8b417347bfd7834aee8fc3b85b61c9a1',\n borrowDynamic:\n '0xd47c2fd3dbb95ed06e5da92f6b99611ba94a36efa6a13d9b33b02519761cc84e',\n interestModel:\n '0x4742bb49aa49ab4e5d9dfa119cddc027d1b7811ac42ca1ce794818d4a4da68e7',\n riskModel:\n '0x6dc356e829cfca2d79f0d68a79b5ddd5296ad0c955a38e2fc397485e2b629367',\n spool:\n '0xb9617f83c06ebdeac0a8834782b1015e1cc7ea23739e30c132c4bfb95c37a579',\n spoolReward:\n '0xc3206071a8d43212efb6e3b5504f2321f8df97ab122b466c0bc7cfdf398dc13a',\n sCoinTreasury:\n '0x03f1d94a40bd9f5d556bacb5c5245732b185572f6a29b36ad8b555d9a8a24f09',\n sCoinType:\n '0x88618204de2dfdc2597681a8441ee726b0dc13494c41e319c3264eb7b35fea90::scallop_sui::SCALLOP_SUI',\n sCoinName: 'ssui',\n sCoinSymbol: 'sSUI',\n coinMetadataId:\n '0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3',\n coinType:\n '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n spoolName: 'ssui',\n decimals: 9,\n pythFeed:\n '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n pythFeedObjectId:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n }, // @TODO: restore on prod\n wapt: {\n coinName: 'wapt',\n symbol: 'wAPT',\n lendingPoolAddress:\n '0xca8c14a24e0c32b198eaf479a3317461e3cc339097ce88eaf296a15df8dcfdf5',\n collateralPoolAddress:\n '0xde33f9ac5bb0ed34598da4e64b4983832716ced65f172fbf267bcfe859c4ad9c',\n borrowDynamic:\n '0xadda873fb6bf68e1ba3f2dfaa51cf75d4a1bef73d9627bd36e77d2baecb1f2dc',\n interestModel:\n '0xa4a29d07beecea5eb0c59745bb89d7a1380c6f206a7f1ca37046e05db6025c43',\n riskModel:\n '0x7ada83b473af30aed50d187de82a0912878b53ade7ac30e11ce23953cf739d84',\n borrowFeeKey:\n '0x768735df587c7e0f141dcd035fbbcbf9d2149a7b23888baed4e2baa160fa2eeb',\n coinMetadataId:\n '0xc969c5251f372c0f34c32759f1d315cf1ea0ee5e4454b52aea08778eacfdd0a8',\n coinType:\n '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37::coin::COIN',\n decimals: 8,\n pythFeed:\n '03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5',\n pythFeedObjectId:\n '0x7c5b7837c44a69b469325463ac0673ac1aa8435ff44ddb4191c9ae380463647f',\n },\n wsol: {\n coinName: 'wsol',\n symbol: 'wSOL',\n lendingPoolAddress:\n '0x985682c42984cdfb03f9ff7d8923344c2fe096b1ae4b82ea17721af19d22a21f',\n collateralPoolAddress:\n '0xdc1cc2c371a043ae8e3c3fe2d013c35f1346960b7dbb4c072982c5b794ed144f',\n borrowDynamic:\n '0xe3f301e16d4f1273ea659dd82c5c3f124ca5a5883a5726c7ec0f77bf43b70895',\n interestModel:\n '0xd95affaee077006b8dbb4b108c1b087e95fc6e5143ef0682da345d5b35bc6356',\n riskModel:\n '0x8e0da6358073144ec3557400c87f04991ba3a13ca7e0d0a19daed45260b32f16',\n borrowFeeKey:\n '0x604bffbc817e8e12db15f2373a9e15b2c7adbc510649cdf2cc62a594af90671c',\n supplyLimitKey:\n '0xbd419b536b3f9c9d4adfc20372ca6feedc53cc31798ac860dbfc847bcf05f54b',\n borrowLimitKey:\n '0x77d453c51948f32564c810bc73f9ba7abde880657b7f89e1c8a3bc28fa36ee87',\n sCoinTreasury:\n '0x760fd66f5be869af4382fa32b812b3c67f0eca1bb1ed7a5578b21d56e1848819',\n sCoinType:\n '0x1392650f2eca9e3f6ffae3ff89e42a3590d7102b80e2b430f674730bc30d3259::scallop_wormhole_sol::SCALLOP_WORMHOLE_SOL',\n sCoinName: 'swsol',\n sCoinSymbol: 'swSOL',\n coinMetadataId:\n '0x4d2c39082b4477e3e79dc4562d939147ab90c42fc5f3e4acf03b94383cd69b6e',\n coinType:\n '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8::coin::COIN',\n sCoinMetadataId:\n '0xee202d2013fc09453d695c640088ee08f14afc8f1ae26284b4ebbc4712ff1ba5',\n decimals: 8,\n pythFeed:\n 'ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',\n pythFeedObjectId:\n '0x9d0d275efbd37d8a8855f6f2c761fa5983293dd8ce202ee5196626de8fcd4469',\n },\n cetus: {\n coinName: 'cetus',\n symbol: 'CETUS',\n lendingPoolAddress:\n '0xc09858f60e74a1b671635bec4e8a2c84a0ff313eb87f525fba3258e88c6b6282',\n collateralPoolAddress:\n '0xe363967e29b7b9c1245d6d46d63e719de8f90b37e3358c545b55d945ea0b676a',\n borrowDynamic:\n '0xcc725fd5d71990cdccc7e16c88a2abde6dbcd0bf6e805ccc1c0cb83a106bbf4e',\n interestModel:\n '0x2f1258aab89d04d11834121599ab1317dfecb582b4246f106df399911125845a',\n riskModel:\n '0x03fed312dbba624dff5edaf4736891a1c7d864445fd268e7572b42ec7381132e',\n borrowFeeKey:\n '0xdf5fb0cc4ebbf5eebfae23dfa5b266f6a58c18a894a13054ae60c0eb6e79c382',\n supplyLimitKey:\n '0xa5ea3d4bf663d7bc667e82b40a98923590ff3851b9ea8e7afbc26c588c7007d3',\n borrowLimitKey:\n '0xf44218a5f0feb128e6fbe74b91d1e7e9ef859bd23a576ff0de151829e015a157',\n spool: '0xac1bb13bf4472a637c18c2415fb0e3c1227ea2bcf35242e50563c98215bd298e',\n spoolReward:\n '0x6835c1224126a45086fc6406adc249e3f30df18d779ca4f4e570e38716a17f3f',\n sCoinTreasury:\n '0xa283c63488773c916cb3d6c64109536160d5eb496caddc721eb39aad2977d735',\n sCoinType:\n '0xea346ce428f91ab007210443efcea5f5cdbbb3aae7e9affc0ca93f9203c31f0c::scallop_cetus::SCALLOP_CETUS',\n sCoinName: 'scetus',\n sCoinSymbol: 'sCETUS',\n coinMetadataId:\n '0x4c0dce55eff2db5419bbd2d239d1aa22b4a400c01bbb648b058a9883989025da',\n coinType:\n '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n sCoinMetadataId:\n '0xf022d041455a038d762a091f7a9e9521211f20501bcf8b6913ef5493a023218f',\n spoolName: 'scetus',\n decimals: 9,\n pythFeed:\n 'e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef',\n pythFeedObjectId:\n '0x24c0247fb22457a719efac7f670cdc79be321b521460bd6bd2ccfa9f80713b14',\n },\n afsui: {\n coinName: 'afsui',\n symbol: 'afSUI',\n lendingPoolAddress:\n '0x9b942a24ce390b7f5016d34a0217057bf9487b92aa6d7cc9894271dbbe62471a',\n collateralPoolAddress:\n '0xe5e56f5c0e3072760b21f9d49a5cc793f37d736c412a9065c16e1265c74e6341',\n borrowDynamic:\n '0x1c76d4df9506154a117bbac0f5e005d8a9c0d9ca60e3fe0c9d080006f6f54e81',\n interestModel:\n '0xb155c536b37c9601baaa734ad1dd0ef335b2b597aceb8d3ecee41a43f94dcd70',\n riskModel:\n '0x75371b1d04b5bebc0738af548ba64ea658e74f78228ec8014336d8eebb992312',\n borrowFeeKey:\n '0xabc6422db2d4ee01635ddaeaa44ba68370eebd785d2c4632515f841ae9bc47d9',\n supplyLimitKey:\n '0x61a2054eb37f543c0d774da57f2c9542aad8d79a197f748ac08ef5df6cc47028',\n borrowLimitKey:\n '0x4459498a043872cd107ea917493fee0baf2d37a273c7538e1d6581cc61b92af8',\n spool: '0xeedf438abcaa6ce4d9625ffca110920592d5867e4c5637d84ad9f466c4feb800',\n spoolReward:\n '0x89255a2f86ed7fbfef35ab8b7be48cc7667015975be2685dd9a55a9a64baf76e',\n sCoinTreasury:\n '0x55f4dfe9e40bc4cc11c70fcb1f3daefa2bdc330567c58d4f0792fbd9f9175a62',\n sCoinType:\n '0x00671b1fa2a124f5be8bdae8b91ee711462c5d9e31bda232e70fd9607b523c88::scallop_af_sui::SCALLOP_AF_SUI',\n sCoinName: 'safsui',\n sCoinSymbol: 'safSUI',\n coinMetadataId:\n '0x2f9217f533e51334873a39b8026a4aa6919497b47f49d0986a4f1aec66f8a34d',\n coinType:\n '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI',\n sCoinMetadataId:\n '0xfd81c4d1b4d9d1b8c522e91121d22e94759386b29eafe1cc3888ca0ebe369b9e',\n spoolName: 'safsui',\n decimals: 9,\n pythFeed:\n '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n pythFeedObjectId:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n hasui: {\n coinName: 'hasui',\n symbol: 'haSUI',\n lendingPoolAddress:\n '0x7ebc607f6bdeb659fb6506cb91c5cc1d47bb365cfd5d2e637ea765346ec84ed4',\n collateralPoolAddress:\n '0xad9ed40d6486e4c26cec7370dffce8dc4821eb79178250b5938a34ccafd61e6d',\n borrowDynamic:\n '0x13ec1220b41c6e0f11dd6113199a2aff8e4cf2223047b5bd06d7a3ed5d23e1d2',\n interestModel:\n '0x987c58cbe48096618f4d9d83e0bde2ff638ce4753aba40dab7c302ac3e4b4519',\n riskModel:\n '0xe42d8497d423eca0d8df89850c2d77d3644e7f54a2d28f59c315903ea5ec8dec',\n borrowFeeKey:\n '0xef885c382d461c4fb14d1f3b3758c380c78a1a4b2a3d2fafe6e8649a60fdd7ab',\n supplyLimitKey:\n '0xc7385b1703693cbbc9c97227fe3fd5c91d7afda00e0da69d942c3260d78e45e0',\n borrowLimitKey:\n '0x65333e606eead786a999c8267bc9886b0fdbc298a8a8635a48a9c9b8838d9395',\n spool: '0xa6148bc1b623e936d39a952ceb5bea79e8b37228a8f595067bf1852efd3c34aa',\n spoolReward:\n '0x6f3563644d3e2ef13176dbf9d865bd93479df60ccbe07b7e66db57f6309f5a66',\n sCoinTreasury:\n '0x404ccc1404d74a90eb6f9c9d4b6cda6d417fb03189f80d9070a35e5dab1df0f5',\n sCoinType:\n '0x9a2376943f7d22f88087c259c5889925f332ca4347e669dc37d54c2bf651af3c::scallop_ha_sui::SCALLOP_HA_SUI',\n sCoinName: 'shasui',\n sCoinSymbol: 'shaSUI',\n coinMetadataId:\n '0x2c5f33af93f6511df699aaaa5822d823aac6ed99d4a0de2a4a50b3afa0172e24',\n coinType:\n '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n sCoinMetadataId:\n '0x0a2a4a25aac50ac79210d710f93cb22db58bc6ee22f213364dda9a709cab2189',\n spoolName: 'shasui',\n decimals: 9,\n pythFeed:\n '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n pythFeedObjectId:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n vsui: {\n coinName: 'vsui',\n symbol: 'vSUI',\n lendingPoolAddress:\n '0xda9257c0731d8822e8a438ebced13415850d705b779c79958dcf2aeb21fcb43d',\n collateralPoolAddress:\n '0x4435e8b8ec2a04094d863aa52deb6ab6f8f47ed8778f4d9f1b27afc4a6e85f1e',\n borrowDynamic:\n '0x8eae703505246f975e83f5af24780e5f1b89ef403d5a80ea15534624d6f1a503',\n interestModel:\n '0xaf6a52b5eaaa5af4d9e49d83de0d504c295ae21f3a37560c3f48e0e15a1d4625',\n riskModel:\n '0x1e862f27a6bd47c3041159a5cf392f549485c6605ed9aa937f16ecc951e82e65',\n borrowFeeKey:\n '0x5230de0f41a5e4c05b3d1187a90a9eeab491cec97b08b71512d9785e8af36aa6',\n supplyLimitKey:\n '0x1d40e34d1f365ec431fff020bd75c16b14b340b3ed6c139803cc15c2384621b2',\n borrowLimitKey:\n '0x4eb206b4417642cfc1b02f80bb5f5e366af2af2f9fb4ea4f4e898ae82367f8a0',\n spool: '0x69ce8e537e750a95381e6040794afa5ab1758353a1a2e1de7760391b01f91670',\n spoolReward:\n '0xbca914adce058ad0902c7f3cfcd698392a475f00dcfdc3f76001d0370b98777a',\n sCoinTreasury:\n '0xc06688ee1af25abc286ffb1d18ce273d1d5907cd1064c25f4e8ca61ea989c1d1',\n sCoinType:\n '0xe1a1cc6bcf0001a015eab84bcc6713393ce20535f55b8b6f35c142e057a25fbe::scallop_v_sui::SCALLOP_V_SUI',\n sCoinName: 'svsui',\n sCoinSymbol: 'svSUI',\n coinMetadataId:\n '0xabd84a23467b33854ab25cf862006fd97479f8f6f53e50fe732c43a274d939bd',\n coinType:\n '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n sCoinMetadataId:\n '0xa96cc21ddfb6486be4a96cda0c58734e4ddea2a8c04984f9e6121d8fae997ddf',\n spoolName: 'svsui',\n decimals: 9,\n pythFeed:\n '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n pythFeedObjectId:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n sca: {\n ...{\n coinName: 'sca',\n symbol: 'SCA',\n lendingPoolAddress:\n '0x6fc7d4211fc7018b6c75e7b908b88f2e0536443239804a3d32af547637bd28d7',\n collateralPoolAddress:\n '0xff677a5d9e9dc8f08f0a8681ebfc7481d1c7d57bc441f2881974adcdd7b13c31',\n borrowDynamic:\n '0x4e24f52edd739dab59ca4c6353ca430b7ce57e7f333abd0957958570a7cd09ca',\n interestModel:\n '0xbdcd48cf5b1a814911dc2d5c72d393a980c87820199fe5d799289ce94f4c47df',\n riskModel:\n '0xc437c24b67b8e2676907700fa395af337ad6463d2c0b4f4fa2e9276414026089',\n borrowFeeKey:\n '0xee55ba0f9800a62d9e7aef667f87e658258f41814d2c9fa02e25590671b4e5ad',\n supplyLimitKey:\n '0x8dd938856b972a10ea27ecab2af7ed78e48fc5f6ccedaf2b2119959f747dc2e3',\n borrowLimitKey:\n '0x04c7de61c5b42972f9bf6a8b1848e5fea2d037ee8deba81741ecd4a70aa80d30',\n sCoinTreasury:\n '0xe04bfc95e00252bd654ee13c08edef9ac5e4b6ae4074e8390db39e9a0109c529',\n sCoinType:\n '0x5ca17430c1d046fae9edeaa8fd76c7b4193a00d764a0ecfa9418d733ad27bc1e::scallop_sca::SCALLOP_SCA',\n sCoinName: 'ssca',\n sCoinSymbol: 'sSCA',\n coinMetadataId:\n '0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844',\n coinType:\n '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA',\n sCoinMetadataId:\n '0x27e3877491b308dfac46fb3d9f7dfa6a1e8b7dc3c374e92ecda7976055746964',\n decimals: 9,\n pythFeed:\n '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n pythFeedObjectId:\n '0xf6de1d3279a269a597d813cbaca59aa906543ab9a8c64e84a4722f1a20863985',\n },\n ...{\n coinName: 'sca',\n symbol: 'SCA',\n lendingPoolAddress:\n '0xd08ef85bc753616ce0f1e3ac01bbc8bd1ee53e03b1e82aaa9690db5cd285ef4c',\n collateralPoolAddress:\n '0x4f59b8ef2cdd195830890cf0c01e29c159e48a6a6c766c64fd4b26cfa9ee58c6',\n borrowDynamic:\n '0x7f6e11fbd32b5d0223f03bfda67a5b48c551a09cfff88edc187591f9a4b0ab10',\n interestModel:\n '0xcb10daf0fee6f416463444f5b47aac0f0197a889bc60be2c4f90916f6a8d2faa',\n riskModel:\n '0x043f21a35bd1e1060a7c579db46e10cfd039d0b75d6bfd758de97b60434ae708',\n sCoinTreasury:\n '0x1b05d2cd8b20dba19da073a54195fc52d2f438ea19dea0713bae7a7dab308199',\n sCoinType:\n '0x9f64a180373a6b66595025ae16a4ab701f0af1dd5c7ce1ac91dc112e52c2a3f8::scallop_sca::SCALLOP_SCA',\n sCoinName: 'ssca',\n sCoinSymbol: 'sSCA',\n coinMetadataId:\n '0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844',\n coinType:\n '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA',\n decimals: 9,\n pythFeed:\n '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n pythFeedObjectId:\n '0xf6de1d3279a269a597d813cbaca59aa906543ab9a8c64e84a4722f1a20863985',\n },\n }, // @TODO: restore on prod\n fud: {\n ...{\n coinName: 'fud',\n symbol: 'FUD',\n lendingPoolAddress:\n '0xefed2cbe76b344792ac724523c8b2236740d1cea2100d46a0ed0dc760c7f4231',\n borrowDynamic:\n '0x14367ddca30e2860cb89ed4eaca20c7ece260c5d59dd9990d2c85a8321326acb',\n interestModel:\n '0x2600ac100ef154eb2329ffd3aad47aca308ff9f9348de3e8e94aaeb906ec2303',\n borrowFeeKey:\n '0xa87e8b26e07ff35ac9fb57adcc779be2883080fc7d12de2d9e7e16d8d8d5e529',\n supplyLimitKey:\n '0xf98419aecc37a3c5de716f8ec590f8991a5be34da72ce1a2da09531ff45adf7d',\n borrowLimitKey:\n '0x3d928a001c453c50004baa54e14b0a0e1b0907d9c613dfd76064fd7ed4e8beb8',\n isolatedAssetKey:\n '0xfcb533e9e4e31f9c9f32d6cbf7fbb3425f1d60474e229a363a2dc7f835d587e2',\n sCoinTreasury:\n '0xf25212f11d182decff7a86165699a73e3d5787aced203ca539f43cfbc10db867',\n sCoinType:\n '0xe56d5167f427cbe597da9e8150ef5c337839aaf46891d62468dcf80bdd8e10d1::scallop_fud::SCALLOP_FUD',\n sCoinName: 'sfud',\n sCoinSymbol: 'sFUD',\n coinMetadataId:\n '0x01087411ef48aaac1eb6e24803213e3a60a03b147dac930e5e341f17a85e524e',\n coinType:\n '0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD',\n sCoinMetadataId:\n '0x4e03390de36b8c84e0a8297d3d0d08a8a34bed93787e37fcb26bfc26df33226c',\n decimals: 5,\n pythFeed:\n '6a4090703da959247727f2b490eb21aea95c8684ecfac675f432008830890c75',\n pythFeedObjectId:\n '0x4531c3ed0d22f21f5fce882905372006c9aafa30f01db03b789e95a6c50de7b2',\n },\n ...{\n coinName: 'fud',\n symbol: 'FUD',\n lendingPoolAddress:\n '0xc8a078d15ee7bbff49a14835f36951833d2d55c91ffd2972251dadbff8045ca8',\n borrowDynamic:\n '0x345a2fa0fe5d5d704fd8ad609a9b7529f22e3cda738ad26756ad2a85e5d43777',\n interestModel:\n '0xc84a22d8bca58e5f05673d1de2a7406b1b7bc9dcd15fd848ba6555c7ecab9d83',\n sCoinTreasury:\n '0x858c492d51425b922c040c1a389e185b3b00d565e7d72ead1a81dc733104660d',\n sCoinType:\n '0x3b23c05f917052255a0b16a534dbd4446911aa4a30bd3497cdf5b736551e7ef8::scallop_fud::SCALLOP_FUD',\n sCoinName: 'sfud',\n sCoinSymbol: 'sFUD',\n coinMetadataId:\n '0x01087411ef48aaac1eb6e24803213e3a60a03b147dac930e5e341f17a85e524e',\n coinType:\n '0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD',\n decimals: 5,\n pythFeed:\n '6a4090703da959247727f2b490eb21aea95c8684ecfac675f432008830890c75',\n pythFeedObjectId:\n '0x4531c3ed0d22f21f5fce882905372006c9aafa30f01db03b789e95a6c50de7b2',\n },\n }, // @TODO: restore on prod\n blub: {\n coinName: 'blub',\n symbol: 'BLUB',\n lendingPoolAddress:\n '0x4dede1d8eda98647c3fc9838e94a890b73ca37a20764087eb78ba0473edea1a5',\n borrowDynamic:\n '0xb2e9df6917ff3cb93fc4361102504c2d225913b3860458ef40f83b370601bec2',\n interestModel:\n '0xec07bfcf93df52d1c0dabecc88b1ee66445a2fda6b98378c19d8e029022f2012',\n borrowFeeKey:\n '0x59b820845932c1f151793b1c6e605ad993535784ccfaa83e709207d6aed3ab99',\n supplyLimitKey:\n '0xc25e930484a10498a53562cfb87da47280e842564d455f25e5b80a913002d5a0',\n borrowLimitKey:\n '0xaf4560140b2c6906befd546cc556f7c459964e7c31e20a6e1ab992bbc6d12b7f',\n isolatedAssetKey:\n '0x30a8f1dbf9dc05dae26c25fac6dfa80fa2d886e05e61cefc697b94959dd75007',\n sCoinTreasury:\n '0x87d34361dfd0e2accc946684d10b176484f348892f6cc51a829418040c4700e1',\n sCoinType:\n '0xe72f65446eabfad2103037af2d49d24599106fb44bf4c046c1e7e9acf6844dd0::scallop_blub::SCALLOP_BLUB',\n coinMetadataId:\n '0xac32b519790cae96c3317457d903d61d04f1bc8f7710096d80fcba72c7a53703',\n coinType:\n '0xfa7ac3951fdca92c5200d468d31a365eb03b2be9936fde615e69f0c1274ad3a0::BLUB::BLUB',\n sCoinMetadataId:\n '0xfa11263cb39de80b9e224d7e0391866a7e779d3d62451de82a91ba601bfb1ce3',\n decimals: 2,\n pythFeed:\n '5fc11ffe4975b624be495be038da30e30bee2004d8ae6282b5364577ef4ca92c',\n pythFeedObjectId:\n '0x246658c3324f2477568c78cca622518fbc6969a004b841d81409d24a7ec39b18',\n },\n deep: {\n ...{\n coinName: 'deep',\n symbol: 'DEEP',\n lendingPoolAddress:\n '0xf4a67ffb43da1e1c61c049f188f19463ea8dbbf2d5ef4722d6df854ff1b1cc03',\n borrowDynamic:\n '0x95e00d7466f97a100e70f08bd37788dc49335796f6f49fab996d40dd0681c6d3',\n interestModel:\n '0x4143c298506a332d92ea8a995e6f3991ee3215f58f6fc6441752835d275b9a69',\n borrowFeeKey:\n '0xb14ee43f4ad2a2c40bac8c4406a401690e93c982e289cf3802fedf74a159cab2',\n supplyLimitKey:\n '0x599528fdfdc253e90dfd0acf4f4a166b391e2aac1ca6528abbff63225b548fee',\n borrowLimitKey:\n '0xf4217e8ef9d9c32e8992092e910a77535a8124c19b8a762a673f227f5f765a4e',\n isolatedAssetKey:\n '0x208d3a24ba369dcfc8f0387333d1512b98199eb150d2f2a69359ff708cf761e3',\n sCoinTreasury:\n '0xc63838fabe37b25ad897392d89876d920f5e0c6a406bf3abcb84753d2829bc88',\n sCoinType:\n '0xeb7a05a3224837c5e5503575aed0be73c091d1ce5e43aa3c3e716e0ae614608f::scallop_deep::SCALLOP_DEEP',\n sCoinName: 'sdeep',\n sCoinSymbol: 'sDEEP',\n coinMetadataId:\n '0x6e60b051a08fa836f5a7acd7c464c8d9825bc29c44657fe170fe9b8e1e4770c0',\n coinType:\n '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP',\n sCoinMetadataId:\n '0x2443014594a500a9119e11c6c6a86e865834f496c4614280ce8cace33c0b072e',\n decimals: 6,\n pythFeed:\n '29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff',\n pythFeedObjectId:\n '0x8c7f3a322b94cc69db2a2ac575cbd94bf5766113324c3a3eceac91e3e88a51ed',\n },\n ...{\n coinName: 'deep',\n symbol: 'DEEP',\n lendingPoolAddress:\n '0xfb8e4f68c9b14034da7f1f4703013dda69ebbb4578f835825bcf92ab89c3b5ae',\n borrowDynamic:\n '0xbf983b12a8707b174c0b037096ba2fbf1b30e6efb9cce14fc35207de0a696f79',\n interestModel:\n '0xb7f04cd3aaaefe671a79f9aed8646ae085a7e6812c1604044977c9355e0769c8',\n sCoinTreasury:\n '0x71d41465cf2d16fa0206126526bebdf65c8871d1fcfbd0c2237db2306afd67ba',\n sCoinType:\n '0x34f0a2e793e1f79ceac72cfe3bb95f65541da449418289ccd12922d16140c882::scallop_deep::SCALLOP_DEEP',\n sCoinName: 'sdeep',\n sCoinSymbol: 'sDEEP',\n coinMetadataId:\n '0x6e60b051a08fa836f5a7acd7c464c8d9825bc29c44657fe170fe9b8e1e4770c0',\n coinType:\n '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP',\n decimals: 6,\n pythFeed:\n '29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff',\n pythFeedObjectId:\n '0x8c7f3a322b94cc69db2a2ac575cbd94bf5766113324c3a3eceac91e3e88a51ed',\n },\n }, // @TODO: restore on prod\n fdusd: {\n coinName: 'fdusd',\n symbol: 'FDUSD',\n lendingPoolAddress:\n '0x4f46051a01f05c3ad9aecf29a771aad5c884e1a1888e08d7709085e3a095bc9c',\n collateralPoolAddress:\n '0x4f6647a9afcfdb62bb9b27e4d1cb7bd7130aca1b4f13fa7164453c869c1681ae',\n borrowDynamic:\n '0x4ddcf19b6290a8b048ecb314b14ef7f52c1c5b9ddc9259a2a242cd91d681a085',\n interestModel:\n '0xb57a33706b29d2d253c74c1c0869e6e20da99036338d2b0b7235ab41621ee9dd',\n riskModel:\n '0xd65fb21758dc1e6184940a1a27efb13228d7cf5e19f6dcca06cc2d996af4a6b9',\n borrowFeeKey:\n '0xafe673a27747b063fa918d2dfe47794e44af553737ac562c2a63186539a07f45',\n supplyLimitKey:\n '0x730e0785ba056a7a95f4a6959371a598d7fe782e81c40785c79982ced4cf4e35',\n sCoinTreasury:\n '0xdad9bc6293e694f67a5274ea51b596e0bdabfafc585ae6d7e82888e65f1a03e0',\n sCoinType:\n '0x6711551c1e7652a270d9fbf0eee25d99594c157cde3cb5fbb49035eb59b1b001::scallop_fdusd::SCALLOP_FDUSD',\n sCoinName: 'sfdusd',\n sCoinSymbol: 'sFDUSD',\n coinMetadataId:\n '0xdebee5265a67c186ed87fe93303d33dfe1de53e3b4fd7d9329c2852860acd3e7',\n coinType:\n '0xf16e6b723f242ec745dfd7634ad072c42d5c1d9ac9d62a39c381303eaa57693a::fdusd::FDUSD',\n sCoinMetadataId:\n '0xb1529a3b5e5831d19a722493eec19785f613945d3dc984602d44a418f990d73f',\n decimals: 6,\n pythFeed:\n '0xccdc1a08923e2e4f4b1e6ea89de6acbc5fe1948e9706f5604b8cb50bc1ed3979',\n pythFeedObjectId:\n '0x5f6583b2b0fe1ecf94aaffeaab8a838794693960cea48c0da282d5f4a24be027',\n },\n};\n","import { SupportPoolCoins } from 'src/types';\n\nexport const PYTH_ENDPOINTS: {\n [k in 'mainnet' | 'testnet']: string[];\n} = {\n testnet: ['https://hermes-beta.pyth.network'],\n mainnet: ['https://hermes.pyth.network', 'https://scallop.rpc.p2p.world'],\n};\n\nexport const PYTH_FEED_IDS: Record<SupportPoolCoins, string> = {\n usdc: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n sbeth: 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n sbusdt: '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n sbwbtc: 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n weth: 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n wbtc: 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n wusdc: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n wusdt: '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n sui: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n wapt: '03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5',\n wsol: 'ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',\n cetus: 'e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef',\n afsui: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n hasui: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n vsui: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n sca: '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n fdusd: '0xccdc1a08923e2e4f4b1e6ea89de6acbc5fe1948e9706f5604b8cb50bc1ed3979',\n deep: '29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff',\n fud: '6a4090703da959247727f2b490eb21aea95c8684ecfac675f432008830890c75',\n blub: '5fc11ffe4975b624be495be038da30e30bee2004d8ae6282b5364577ef4ca92c',\n};\n","import type {\n GetDynamicFieldObjectParams,\n GetDynamicFieldsParams,\n GetOwnedObjectsParams,\n SuiObjectData,\n SuiObjectDataOptions,\n} from '@mysten/sui/client';\nimport type { SuiObjectArg, SuiTxArg } from '@scallop-io/sui-kit';\n\nexport const queryKeys = {\n api: {\n getAddresses: (addressesId?: string) => [\n 'api',\n 'getAddresses',\n { addressesId },\n ],\n getMarket: () => ['api', 'getMarket'],\n getSpools: () => ['api', 'getSpools'],\n getBorrowIncentivePool: () => ['api', 'getBorrowIncentivePools'],\n getTotalValueLocked: () => ['api', 'getTotalValueLocked'],\n },\n\n rpc: {\n getInspectTxn: (\n queryTarget?: string,\n args?: SuiObjectArg[],\n typeArgs?: any[]\n ) => [\n 'rpc',\n 'getInspectTxn',\n {\n queryTarget,\n args: JSON.stringify(args),\n typeArgs: !typeArgs ? undefined : JSON.stringify(typeArgs),\n },\n ],\n getObject: (objectId?: string, options?: SuiObjectDataOptions) => [\n 'rpc',\n 'getObject',\n { objectId, options },\n ],\n getObjects: (objectIds?: string[]) => [\n 'rpc',\n 'getObjects',\n {\n objectIds: JSON.stringify(objectIds ?? undefined),\n },\n ],\n getOwnedObjects: (input?: Partial<GetOwnedObjectsParams>) => [\n 'rpc',\n 'getOwnedObjects',\n {\n walletAddress: input?.owner,\n cursor: input?.cursor ?? undefined,\n options: input?.options ?? undefined,\n filter: JSON.stringify(input?.filter ?? undefined),\n limit: input?.limit ?? undefined,\n },\n ],\n getDynamicFields: (input?: Partial<GetDynamicFieldsParams>) => [\n 'rpc',\n 'getDynamicFields',\n {\n parentId: input?.parentId,\n cursor: input?.cursor ?? undefined,\n limit: input?.limit ?? undefined,\n },\n ],\n getDynamicFieldObject: (input?: Partial<GetDynamicFieldObjectParams>) => [\n 'rpc',\n 'getDynamicFieldObject',\n {\n parentId: input?.parentId,\n name: JSON.stringify(input?.name ?? undefined),\n },\n ],\n getTotalVeScaTreasuryAmount: (\n refreshArgs?: any[],\n vescaAmountArgs?: (string | SuiObjectData | SuiTxArg)[]\n ) => [\n 'rpc',\n 'getTotalVeScaTreasuryAmount',\n {\n refreshArgs: JSON.stringify(refreshArgs),\n vescaAmountArgs: JSON.stringify(vescaAmountArgs),\n },\n ],\n\n getAllCoinBalances: (owner?: string) => [\n 'rpc',\n 'getAllCoinBalances',\n { owner },\n ],\n\n getNormalizedMoveFunction: (target?: string) => {\n return ['rpc', 'getNormalizedMoveCall', target];\n },\n },\n oracle: {\n getPythLatestPriceFeeds: () => ['oracle', 'getPythPriceIds'],\n },\n};\n","import { getFullnodeUrl } from '@mysten/sui/client';\n\nexport const RPC_PROVIDERS = [\n getFullnodeUrl('mainnet'),\n 'https://sui-mainnet.public.blastapi.io',\n 'https://sui-mainnet-ca-2.cosmostation.io',\n 'https://sui-mainnet-eu-4.cosmostation.io',\n 'https://sui-mainnet-endpoint.blockvision.org',\n 'https://sui-rpc.publicnode.com',\n 'https://sui-mainnet-rpc.allthatnode.com',\n 'https://mainnet.suiet.app',\n 'https://mainnet.sui.rpcpool.com',\n 'https://sui1mainnet-rpc.chainode.tech',\n 'https://fullnode.mainnet.apis.scallop.io',\n 'https://sui-mainnet-us-2.cosmostation.io',\n];\n","import { AddressesInterface } from 'src/types';\n\nexport const TEST_ADDRESSES: AddressesInterface = {\n core: {\n version:\n '0xee15d07800e2ad4852505c57cd86afea774af02c17388f8bd907de75f915b4f4',\n versionCap:\n '0x590a4011cb649b3878f3ea14b3a78674642a9548d79b7e091ef679574b158a07',\n object:\n '0xb03fa00e2d9f17d78a9d48bd94d8852abec68c19d55e819096b1e062e69bfad1',\n market:\n '0xa7f41efe3b551c20ad6d6cea6ccd0fd68d2e2eaaacdca5e62d956209f6a51312',\n adminCap:\n '0x09689d018e71c337d9db6d67cbca06b74ed92196103624028ccc3ecea411777c',\n coinDecimalsRegistry:\n '0x200abe9bf19751cc566ae35aa58e2b7e4ff688fc1130f8d8909ea09bc137d668',\n obligationAccessStore:\n '0xb7d7e1464936fbdcdd4913308b40335e662401029635289bdb317c7dde9d6c68',\n coins: {\n usdc: {\n id: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7',\n metaData:\n '0x69b7a7c3c200439c1b5f3b19d7d495d5966d5f08de66c69276152f8db3992ec6',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n feedObject:\n '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n },\n },\n sui: {\n id: '0x0000000000000000000000000000000000000000000000000000000000000002',\n metaData:\n '0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3',\n treasury: '',\n oracle: {\n supra: '',\n switchboard:\n '0xbca474133638352ba83ccf7b5c931d50f764b09550e16612c9f70f1e21f3f594',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject:\n '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n sca: {\n id: '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n metaData:\n '0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n feedObject:\n '0xf6de1d3279a269a597d813cbaca59aa906543ab9a8c64e84a4722f1a20863985',\n },\n },\n },\n deep: {\n id: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270',\n metaData:\n '0x6e60b051a08fa836f5a7acd7c464c8d9825bc29c44657fe170fe9b8e1e4770c0',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff',\n feedObject:\n '0x8c7f3a322b94cc69db2a2ac575cbd94bf5766113324c3a3eceac91e3e88a51ed',\n },\n },\n },\n fud: {\n id: '0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1',\n metaData:\n '0x01087411ef48aaac1eb6e24803213e3a60a03b147dac930e5e341f17a85e524e',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '6a4090703da959247727f2b490eb21aea95c8684ecfac675f432008830890c75',\n feedObject:\n '0x4531c3ed0d22f21f5fce882905372006c9aafa30f01db03b789e95a6c50de7b2',\n },\n },\n },\n },\n oracles: {\n xOracle:\n '0x0c09daac413e834f2fe69601c41e836022fa9a185df6b56a80f6bcd8a3ecb8a2',\n xOracleCap:\n '0x1edeae568fde99e090dbdec4bcdbd33a15f53a1ce1f87aeef1a560dedf4b4a90',\n supra: { registry: '', registryCap: '', holder: '' },\n switchboard: { registry: '', registryCap: '' },\n pyth: {\n registry:\n '0xdcf813893649521abd27816ba8d946b0cb7fc98d776cc9adcecba54688ccc109',\n registryCap:\n '0xbcb07141eb1f7e01fbda4130ecf5f5adaeabb77f5d9c32158b7532bcd2197acd',\n state:\n '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n wormhole:\n '0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a',\n wormholeState:\n '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '0xca5a5a62f01c79a104bf4d31669e29daa387f325c241de4edbe30986a9bc8b0d',\n upgradeCap:\n '0x34e76a945d29f195bc53ca704fa70877d1cf3a5d7bbfdda1b13e633fff13c0f6',\n },\n math: {\n id: '0xad013d5fde39e15eabda32b3dbdafd67dac32b798ce63237c27a8f73339b9b6f',\n upgradeCap:\n '0x3a329598231de02e6135c62284b66005b41cad1d9ab7ca2dc79c08293aba2ec6',\n },\n whitelist: {\n id: '0x1318fdc90319ec9c24df1456d960a447521b0a658316155895014a6e39b5482f',\n upgradeCap:\n '0xf5a22aea23db664f7b69855b6a546747f17c1ec4230319cfc17225e462b05761',\n },\n x: {\n id: '0x779b5c547976899f5474f3a5bc0db36ddf4697ad7e5a901db0415c2281d28162',\n upgradeCap:\n '0x3f203f6fff6a69d151e4f1cd931f22b68c489ef2759765662fc7baf673943c9e',\n },\n protocol: {\n id: '0xb03fa00e2d9f17d78a9d48bd94d8852abec68c19d55e819096b1e062e69bfad1',\n upgradeCap:\n '0x38527d154618d1fd5a644b90717fe07cf0e9f26b46b63e9568e611a3f86d5c1a',\n },\n protocolWhitelist: {\n id: '0x4c262d9343dac53ecb28f482a2a3f62c73d0ebac5b5f03d57383d56ff219acdf',\n upgradeCap:\n '0x4a5e88a75039b00988f633f811f58117f31b8627a46bf822aa114d9010049449',\n },\n query: {\n id: '0x3a0dbce719fc56a96bf8e8dd53cd57eb9c313642a88d99b86f51208762eba258',\n object: '',\n upgradeCap:\n '0x0d535c35f608b9b01b7ccce11acf43b1dd80c1b72bf8b541744a6e28e8d2745f',\n },\n supra: { id: '', object: '', upgradeCap: '' },\n pyth: {\n id: '0xe622909f9252d4ef1737c41ea430ef44203d8f5dc8e01e1b3950a31405bc54eb',\n object:\n '0xe622909f9252d4ef1737c41ea430ef44203d8f5dc8e01e1b3950a31405bc54eb',\n upgradeCap:\n '0xdf0ffbae1ea5bb25fbca5efba433dcf00c7cced65679af2f04728901275c6157',\n },\n switchboard: { id: '', upgradeCap: '' },\n xOracle: {\n id: '0xe7511600c924f1d0ac4b3fa5de3ae26b8845545902b015dc5fc7894307365d7b',\n object:\n '0xe7511600c924f1d0ac4b3fa5de3ae26b8845545902b015dc5fc7894307365d7b',\n upgradeCap:\n '0x0f928a6b2e26b73330fecaf9b44acfc9800a4a9794d6415c2a3153bc70e3c1f0',\n },\n testCoin: { id: '', upgradeCap: '' },\n },\n },\n spool: {\n id: '0x1742655fe5872dfa6456673f9e38612a4965e6979e6cd7696a7f1225f28bae21',\n adminCap:\n '0xdd8a047cbbf802bfcde5288b8ef1910965d789cc614da11d39af05fca0bd020a',\n object:\n '0x1742655fe5872dfa6456673f9e38612a4965e6979e6cd7696a7f1225f28bae21',\n pools: {\n sweth: {\n id: '0xeec40beccb07c575bebd842eeaabb835f77cd3dab73add433477e57f583a6787',\n rewardPoolId:\n '0x957de68a18d87817de8309b30c1ec269a4d87ae513abbeed86b5619cb9ce1077',\n },\n ssui: {\n id: '0xb9617f83c06ebdeac0a8834782b1015e1cc7ea23739e30c132c4bfb95c37a579',\n rewardPoolId:\n '0xc3206071a8d43212efb6e3b5504f2321f8df97ab122b466c0bc7cfdf398dc13a',\n },\n susdc: {\n id: '0x0b5f5f413bd3799e4052c37311966c77f3a4545eb125d2e93e67a68478021918',\n rewardPoolId:\n '0x85ed6ed72ea97c35dbf0cdc7ed6fbc48d8ec15de9b17c74bf4512df8a6d7f166',\n },\n swusdc: {\n id: '0xf1b383b9cf2e9f515fc69567df1053098f273849d09cd84b0278a773429bd2b2',\n rewardPoolId:\n '0xc71c53ee6505d928ba15bea4fe4f45d98c9c31eced94b72d00a7827d4b7ba3ff',\n },\n swusdt: {\n id: '0xb5567dfa5c7fc17a249e959732664c50713dd8c23db1a11376b27df800c17418',\n rewardPoolId:\n '0x60768b0687ff0235e376a039709a683e4c436098785e473b67b32dbab47b69ab',\n },\n scetus: {\n id: '0xac1bb13bf4472a637c18c2415fb0e3c1227ea2bcf35242e50563c98215bd298e',\n rewardPoolId:\n '0x6835c1224126a45086fc6406adc249e3f30df18d779ca4f4e570e38716a17f3f',\n },\n safsui: {\n id: '0xc568bb4c991258e839aa54802ecda04fcd9838c826bc3b42b40af81b23c458c8',\n rewardPoolId:\n '0x389a3cbeda742b918941bb24fd00e077bad3367484394d6234f8209b9a6aa03d',\n },\n shasui: {\n id: '0x93f3f4499bf89f2d05ddc1f8b15f51701a7c6c4d0ac0b9c3bc99462cbbd8e321',\n rewardPoolId:\n '0x94cee1be7f5ff34193f3aabef0b14142cb28af4d905fe487a9a7d85a15edb6aa',\n },\n svsui: {\n id: '0xa970e9087f80cb59e9299b8e7af7175d977ad6c9af0322aa4440e138fbd7ae00',\n rewardPoolId:\n '0x38eee9699c4fc132a6623e54b865f047df4fc6eb83af807300f44e8f4b235ff0',\n },\n },\n config: '',\n },\n borrowIncentive: {\n id: '0x8fe05c796e779c71e7739dcaecefb8757ff9482f62e419dbd0dd9c35b740054f',\n adminCap:\n '0x56ac8e6f2b360b2b35c0168d72cc6cd17d9592afb83709865cb87af24bb2025b',\n object:\n '0x8fe05c796e779c71e7739dcaecefb8757ff9482f62e419dbd0dd9c35b740054f',\n query: '0x5fba54ac5862f087112c54c02339623bd245721f5e21ea3330fc8c8afc8f51f4',\n incentivePools:\n '0xcace4f4736229043d9f897667d046370b8a4d6534bfd307787c40b4c9f42514a',\n incentiveAccounts:\n '0x41ff558f580ca0f711910fd6ef687fce9df76ee8e7fc5e150bdfae08e17fae62',\n config:\n '0x9636e7b947b806b9fe438d037f02bb24026c5b2691d2f6bad349c2e117f77cc3',\n },\n referral: {\n id: '0x1bf5a8ce77050d8052549d743e16b469f15aa6b81b752b78b6ebb65179665f5a',\n object:\n '0x5658d4bf5ddcba27e4337b4262108b3ad1716643cac8c2054ac341538adc72ec',\n adminCap:\n '0xc5dc06b9074291259f2cac460c940012c781c4430e42125c541cc43101c3bcbd',\n referralBindings:\n '0xcf184487782bed962bf678001efe775d31fb94b9992333a57594cf15d79d5ced',\n bindingTableId:\n '0x41a50e258c0a266ce84e0e1a618dbf70b878cc943909e613089a50afcceb2bc0',\n referralRevenuePool:\n '0xc24e3e5e37032f29a3dd91a9a1f057af8821b7e6c148e9683900ac8b6d30f0c6',\n revenueTableId:\n '0x595baa3654c297bff84ab7786a2d250f019cefc66e8df8e89fd9d41e02bd30dd',\n referralTiers:\n '0x144350f3db9b46d11b140084cd54e6de0b9c3b8d265ce8059b51d0ef58ea464b',\n tiersTableId:\n '0xeac755a7a8b7798530905ac79e8c114f19d0f130f6eab012954f08faac29c75d',\n authorizedWitnessList:\n '0x9d6223dc52015b8a3986a573590ef2af8f1b8f3e4685513888c052f001b87e7f',\n version:\n '0x3545849eb97723e676a476ec9d4fe5f2eb0eb2c6b78972851114fd4c7ed4639f',\n },\n vesca: {\n id: '0x1158813b32962c2d22888fae257d5f2365b03631f0cd5d5b912ccdf51ff4e2f2',\n object:\n '0x1158813b32962c2d22888fae257d5f2365b03631f0cd5d5b912ccdf51ff4e2f2',\n adminCap:\n '0x8ffa76135c5b85c5fbd73a6448a4a733d826cb63a267ab817656acb77c72d4a5',\n tableId:\n '0x0a0b7f749baeb61e3dfee2b42245e32d0e6b484063f0a536b33e771d573d7246',\n table: '0xd3a4632b1080f7d96e1c2487d4dabf2c1196916937c505a69954ac9f393be8d0',\n treasury:\n '0xafa4b6231e49c15a22d641ce33fda761baaf650fa21899dfa2eb1716146e7306',\n config:\n '0x7cbcb0a342179577a117dfdff974cf1ab765d3b571067bf22ddf5f9e3a667922',\n },\n loyaltyProgram: {\n id: '0xd17bcf8b5a59652c36225d478564a8593ae0ed7d650bcacdda1d6fe179127907',\n object:\n '0xd17bcf8b5a59652c36225d478564a8593ae0ed7d650bcacdda1d6fe179127907',\n rewardPool:\n '0xf9c090492ef476bd542109d0913ffe871cbfa28578b7114eca2a8c0e5671786f',\n userRewardTableId:\n '0x748a80395849ed37db1b0e14f2ab5d1d96458d2359ab3a84eb079d0f4ac7cf2e',\n },\n scoin: {\n id: '0x826a4934bee9487e558eed603cf42f30cdc4321d6f31083930791b95f903b9f9',\n coins: {\n ssui: {\n coinType:\n '0x88618204de2dfdc2597681a8441ee726b0dc13494c41e319c3264eb7b35fea90::scallop_sui::SCALLOP_SUI',\n treasury:\n '0x03f1d94a40bd9f5d556bacb5c5245732b185572f6a29b36ad8b555d9a8a24f09',\n },\n ssca: {\n coinType:\n '0x9f64a180373a6b66595025ae16a4ab701f0af1dd5c7ce1ac91dc112e52c2a3f8::scallop_sca::SCALLOP_SCA',\n treasury:\n '0x1b05d2cd8b20dba19da073a54195fc52d2f438ea19dea0713bae7a7dab308199',\n },\n susdc: {\n coinType:\n '0x55ed015f9f006c0c96ad36ebe3b3570d088e8498f52defea48e5634c110e485c::scallop_usdc::SCALLOP_USDC',\n treasury:\n '0x6ef82ef94472dcb8c2cdeac8df38874024c08570ca165986ba56d1e38fe0c0a3',\n },\n swusdc: {\n coinType:\n '0xf5447c4305a486d8c8557559887c2c39449ddb5e748f15d33946d02a1663c158::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC',\n treasury:\n '0x471fbab72578bab577263006fe32543b6e76153fffa2bef69affe4bc4934258f',\n },\n swusdt: {\n coinType:\n '0xac781d9f73058ff5e69f9bf8dde32f2e8c71c66d7fe8497fc83b2d9182254b22::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT',\n treasury:\n '0x921a4ed4bb4b4f11f51a462c83f4c0f6b60a90e441d1bc0d26d6fd893146bf4d',\n },\n sweth: {\n coinType:\n '0x27d54f43e3eda701be56b82e5756e41c84467cd202f5cf713d5f9e45a9f1b6bc::scallop_wormhole_eth::SCALLOP_WORMHOLE_ETH',\n treasury:\n '0x032b4c8fac94c038dbe986f7587e9b1e4ef580b5ee06d2ef249d85459b7ef05d',\n },\n safsui: {\n coinType:\n '0xb75b46d975d8d80670b53a6bee90baaa8ce2e0b7d397f079447d641eef6b44ad::scallop_af_sui::SCALLOP_AF_SUI',\n treasury:\n '0x21450ef0570ef3d224ffa3b873ab802e439ece7b93cc7efad10ae0c1e3b3fcfe',\n },\n shasui: {\n coinType:\n '0xd973a723874e2c7cde196602a79155a1343a933f8cf87d9b1bb7408bc1acbc58::scallop_ha_sui::SCALLOP_HA_SUI',\n treasury:\n '0xf822fc1402207e47d2e3ba8ff6e1e594bf1de777dc5ebd2744619cd2726e3b0d',\n },\n svsui: {\n coinType:\n '0x97023a317320c4498cc4cd239dd02fd30c28246e5e8f81325d63f2bd8d70f6b3::scallop_v_sui::SCALLOP_V_SUI',\n treasury:\n '0x327114f0bf3559d7e2de10282147ed76a236c7c6775029165c4db09a6062ead6',\n },\n ssbeth: {\n coinType:\n '0xb14f82d8506d139eacef109688d1b71e7236bcce9b2c0ad526abcd6aa5be7de0::scallop_sb_eth::SCALLOP_SB_ETH',\n treasury:\n '0xfd0f02def6358a1f266acfa1493d4707ee8387460d434fb667d63d755ff907ed',\n },\n sfdusd: {\n coinType:\n '0x6711551c1e7652a270d9fbf0eee25d99594c157cde3cb5fbb49035eb59b1b001::scallop_fdusd::SCALLOP_FDUSD',\n treasury:\n '0xdad9bc6293e694f67a5274ea51b596e0bdabfafc585ae6d7e82888e65f1a03e0',\n },\n sdeep: {\n coinType:\n '0x34f0a2e793e1f79ceac72cfe3bb95f65541da449418289ccd12922d16140c882::scallop_deep::SCALLOP_DEEP',\n treasury:\n '0x71d41465cf2d16fa0206126526bebdf65c8871d1fcfbd0c2237db2306afd67ba',\n },\n sfud: {\n coinType:\n '0x3b23c05f917052255a0b16a534dbd4446911aa4a30bd3497cdf5b736551e7ef8::scallop_fud::SCALLOP_FUD',\n treasury:\n '0x858c492d51425b922c040c1a389e185b3b00d565e7d72ead1a81dc733104660d',\n },\n },\n },\n};\n","export const UNLOCK_ROUND_DURATION = 60 * 60 * 24; // 1 day in seconds\nexport const MAX_LOCK_ROUNDS = 1460 as const; // 4 years in days (or 9 days for testing)\nexport const MAX_LOCK_DURATION = MAX_LOCK_ROUNDS * UNLOCK_ROUND_DURATION; // 4 years in seconds\n\nexport const MIN_INITIAL_LOCK_AMOUNT = 10_000_000_000 as const;\nexport const MIN_TOP_UP_AMOUNT = 1_000_000_000 as const;\n","import { xOracleListType } from 'src/types';\n\nexport const xOracleList: xOracleListType = {\n // @TODO: Update to real oracle list\n usdc: { primary: ['pyth'], secondary: [] },\n sbeth: { primary: [], secondary: [] },\n sbusdt: { primary: [], secondary: [] },\n sbwbtc: { primary: [], secondary: [] },\n weth: { primary: [], secondary: [] },\n wbtc: { primary: [], secondary: [] },\n wusdc: { primary: [], secondary: [] },\n wusdt: { primary: [], secondary: [] },\n sui: { primary: ['pyth'], secondary: [] },\n wapt: { primary: [], secondary: [] },\n wsol: { primary: [], secondary: [] },\n cetus: { primary: [], secondary: [] },\n afsui: { primary: [], secondary: [] },\n hasui: { primary: [], secondary: [] },\n vsui: { primary: [], secondary: [] },\n sca: { primary: ['pyth'], secondary: [] },\n fud: { primary: ['pyth'], secondary: [] },\n deep: { primary: ['pyth'], secondary: [] },\n fdusd: { primary: [], secondary: [] },\n blub: { primary: [], secondary: [] },\n};\n","import { QueryClient } from '@tanstack/query-core';\nimport {\n SuiObjectArg,\n SuiTxBlock,\n normalizeStructTag,\n parseStructTag,\n} from '@scallop-io/sui-kit';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport type {\n SuiObjectResponse,\n SuiObjectDataOptions,\n SuiObjectData,\n GetOwnedObjectsParams,\n DevInspectResults,\n GetDynamicFieldsParams,\n DynamicFieldPage,\n GetDynamicFieldObjectParams,\n GetBalanceParams,\n SuiClient,\n CoinBalance,\n} from '@mysten/sui/client';\nimport { DEFAULT_CACHE_OPTIONS } from 'src/constants/cache';\nimport { queryKeys } from 'src/constants';\nimport { ScallopCacheInstanceParams, ScallopCacheParams } from 'src/types';\nimport { newSuiKit } from './suiKit';\n\ntype QueryInspectTxnParams = {\n queryTarget: string;\n args: SuiObjectArg[];\n typeArgs?: any[];\n};\n\nconst DEFAULT_TOKENS_PER_INTERVAL = 10;\nconst DEFAULT_INTERVAL_IN_MS = 250;\n\nconst deepMergeObject = <T>(curr: T, update: T): T => {\n const result = { ...curr }; // Clone the current object to avoid mutation\n\n for (const key in update) {\n if (\n update[key] &&\n typeof update[key] === 'object' &&\n !Array.isArray(update[key])\n ) {\n // If the value is an object, recurse\n result[key] = deepMergeObject(\n curr[key] || ({} as T[Extract<keyof T, string>]),\n update[key]\n );\n } else {\n // Otherwise, directly assign the value\n result[key] = update[key];\n }\n }\n\n return result;\n};\n\n/**\n * @description\n * It provides caching for moveCall, RPC Request, and API Request.\n *\n *\n * @example\n * ```typescript\n * const scallopCache = new scallopCache(<parameters>);\n * scallopCache.<indexer functions>();\n * await scallopCache.<indexer async functions>();\n * ```\n */\n\nexport class ScallopCache {\n public readonly params: ScallopCacheParams;\n\n public queryClient: QueryClient;\n public suiKit: SuiKit;\n // private tokenBucket: TokenBucket;\n public walletAddress: string;\n private tokensPerInterval: number = DEFAULT_TOKENS_PER_INTERVAL;\n private interval: number = DEFAULT_INTERVAL_IN_MS;\n private tokens: number;\n private lastRefill: number;\n\n public constructor(\n params: ScallopCacheParams = {},\n instance?: ScallopCacheInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? newSuiKit(params);\n this.queryClient =\n instance?.queryClient ??\n new QueryClient(params?.cacheOptions ?? DEFAULT_CACHE_OPTIONS);\n\n // handle case where there's existing queryClient and cacheOptions is also passed\n // if (queryClient && cacheOptions) {\n // // override the default options with the cacheOptions\n // if (cacheOptions.defaultOptions)\n // this.queryClient.setDefaultOptions(cacheOptions.defaultOptions);\n // // if (cacheOptions.queryCache)\n // // this.queryClient.defaultQueryOptions(cacheOptions.queryCache);\n // // if(cacheOptions.mutations)this.queryClient.setMutationDefaults(cacheOptions.mutations);\n // }\n\n this.tokens = this.tokensPerInterval;\n this.lastRefill = Date.now();\n this.walletAddress = params.walletAddress ?? this.suiKit.currentAddress();\n }\n\n private get client(): SuiClient {\n return this.suiKit.client();\n }\n\n private refill() {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n\n if (elapsed >= this.interval) {\n const tokensToAdd =\n Math.floor(elapsed / this.interval) * this.tokensPerInterval;\n this.tokens = Math.min(this.tokens + tokensToAdd, this.tokensPerInterval);\n\n // Update lastRefill to reflect the exact time of the last \"refill\"\n this.lastRefill += Math.floor(elapsed / this.interval) * this.interval;\n }\n }\n\n private removeTokens(count: number) {\n this.refill();\n if (this.tokens >= count) {\n this.tokens -= count;\n return true;\n }\n return false;\n }\n\n private async callWithRateLimit<T>(\n fn: () => Promise<T>,\n maxRetries = 15,\n backoffFactor = 1.25 // The factor by which to increase the delay\n ): Promise<T | null> {\n let retries = 0;\n\n const tryRequest = async (): Promise<T | null> => {\n if (this.removeTokens(1)) {\n const result = await fn();\n return result;\n } else if (retries < maxRetries) {\n retries++;\n const delay = this.interval * Math.pow(backoffFactor, retries);\n // console.error(`Rate limit exceeded, retrying in ${delay} ms`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n return tryRequest();\n } else {\n console.error('Maximum retries reached');\n return null;\n }\n };\n\n return tryRequest();\n }\n\n /**\n * @description Invalidate cache based on the refetchType parameter\n * @param refetchType Determines the type of queries to be refetched. Defaults to `active`.\n *\n * - `active`: Only queries that match the refetch predicate and are actively being rendered via useQuery and related functions will be refetched in the background.\n * - `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.\n * - `all`: All queries that match the refetch predicate will be refetched in the background.\n * - `none`: No queries will be refetched. Queries that match the refetch predicate will only be marked as invalid.\n */\n // public async invalidateAllCache() {\n // return Object.values(queryKeys.rpc).map((t) =>\n // this.queryClient.invalidateQueries({\n // queryKey: t(),\n // type: 'all',\n // })\n // );\n // }\n\n private retryFn(errCount: number, e: any) {\n if (errCount === 5) return false;\n if (e.status === 429) return true;\n return false;\n }\n\n /**\n * @description Provides cache for inspectTxn of the SuiKit.\n * @param QueryInspectTxnParams\n * @param txBlock\n * @returns Promise<DevInspectResults>\n */\n public async queryInspectTxn({\n queryTarget,\n args,\n typeArgs,\n }: QueryInspectTxnParams): Promise<DevInspectResults | null> {\n const txBlock = new SuiTxBlock();\n\n const resolvedQueryTarget =\n await this.queryGetNormalizedMoveFunction(queryTarget);\n if (!resolvedQueryTarget) throw new Error('Invalid query target');\n\n const { parameters } = resolvedQueryTarget;\n\n const resolvedArgs = await Promise.all(\n (args ?? []).map(async (arg, idx) => {\n if (typeof arg !== 'string') return arg;\n\n const cachedData = (await this.queryGetObject(arg))?.data;\n if (!cachedData) return arg;\n\n const owner = cachedData.owner;\n if (!owner || typeof owner !== 'object' || !('Shared' in owner))\n return {\n objectId: cachedData.objectId,\n version: cachedData.version,\n digest: cachedData.digest,\n };\n\n const parameter = parameters[idx];\n if (\n typeof parameter !== 'object' ||\n !('MutableReference' in parameter || 'Reference' in parameter)\n )\n return arg;\n\n return {\n objectId: cachedData.objectId,\n initialSharedVersion: owner.Shared.initial_shared_version,\n mutable: 'MutableReference' in parameter,\n };\n })\n );\n txBlock.moveCall(queryTarget, resolvedArgs, typeArgs);\n\n const query = await this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getInspectTxn(queryTarget, args, typeArgs),\n queryFn: async () => {\n return await this.callWithRateLimit(\n async () => await this.suiKit.inspectTxn(txBlock)\n );\n },\n });\n return query;\n }\n\n public async queryGetNormalizedMoveFunction(target: string) {\n const { address, module, name } = parseStructTag(target);\n return this.queryClient.fetchQuery({\n queryKey: queryKeys.rpc.getNormalizedMoveFunction(target),\n queryFn: async () => {\n return await this.callWithRateLimit(\n async () =>\n await this.suiKit.client().getNormalizedMoveFunction({\n package: address,\n module,\n function: name,\n })\n );\n },\n });\n }\n\n /**\n * @description Provides cache for getObject of the SuiKit.\n * @param objectId\n * @param QueryObjectParams\n * @returns Promise<SuiObjectResponse>\n */\n public async queryGetObject(\n objectId: string,\n options?: SuiObjectDataOptions\n ) {\n options = {\n ...options,\n showOwner: true,\n showContent: true,\n showType: true,\n };\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getObject(objectId, options),\n queryFn: async () => {\n return await this.callWithRateLimit(\n async () =>\n await this.client.getObject({\n id: objectId,\n options,\n })\n );\n },\n });\n }\n\n /**\n * @description Provides cache for getObjects of the SuiKit.\n * @param objectIds\n * @returns Promise<SuiObjectData[]>\n */\n public async queryGetObjects(objectIds: string[]): Promise<SuiObjectData[]> {\n if (objectIds.length === 0) return [];\n const options: SuiObjectDataOptions = {\n showContent: true,\n showOwner: true,\n showType: true,\n };\n\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getObjects(objectIds),\n queryFn: async () => {\n const results = await this.callWithRateLimit(\n async () => await this.suiKit.getObjects(objectIds, options)\n );\n if (results) {\n results.forEach((result) => {\n // fetch previous data\n const queryKey = queryKeys.rpc.getObject(result.objectId);\n const prevDatas =\n this.queryClient.getQueriesData<SuiObjectResponse>({\n exact: false,\n queryKey,\n });\n prevDatas.forEach(([key, prevData]) => {\n this.queryClient.setQueryData(\n key,\n deepMergeObject(prevData, { data: result, error: null }),\n { updatedAt: Date.now() }\n );\n });\n });\n }\n return results;\n },\n });\n }\n\n /**\n * @description Provides cache for getOwnedObjects of the SuiKit.\n * @param input\n * @returns Promise<PaginatedObjectsResponse>\n */\n public async queryGetOwnedObjects(input: GetOwnedObjectsParams) {\n // @TODO: This query need its own separate rate limiter (as owned objects can theoretically be infinite), need a better way to handle this\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getOwnedObjects(input),\n queryFn: async () => {\n const results = await this.callWithRateLimit(\n async () => await this.client.getOwnedObjects(input)\n );\n if (results && results.data.length > 0) {\n results.data\n .filter(\n (\n result\n ): result is typeof result &\n NonNullable<{ data: SuiObjectData }> => !!result.data\n )\n .forEach((result) => {\n // fetch previous data\n const queryKey = queryKeys.rpc.getObject(result.data.objectId);\n const prevDatas =\n this.queryClient.getQueriesData<SuiObjectResponse>({\n exact: false,\n queryKey,\n });\n prevDatas.forEach(([key, prevData]) => {\n this.queryClient.setQueryData(\n key,\n deepMergeObject(prevData, { data: result.data, error: null }),\n { updatedAt: Date.now() }\n );\n });\n });\n }\n return results;\n },\n });\n }\n\n public async queryGetDynamicFields(\n input: GetDynamicFieldsParams\n ): Promise<DynamicFieldPage | null> {\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getDynamicFields(input),\n queryFn: async () => {\n return await this.callWithRateLimit(\n async () => await this.client.getDynamicFields(input)\n );\n },\n });\n }\n\n public async queryGetDynamicFieldObject(\n input: GetDynamicFieldObjectParams\n ): Promise<SuiObjectResponse | null> {\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: (attemptIndex) => Math.min(1000 * attemptIndex, 8000),\n queryKey: queryKeys.rpc.getDynamicFieldObject(input),\n queryFn: async () => {\n const result = await this.callWithRateLimit(() =>\n this.client.getDynamicFieldObject(input)\n );\n if (result?.data) {\n const queryKey = queryKeys.rpc.getObject(result.data.objectId);\n const prevDatas = this.queryClient.getQueriesData<SuiObjectResponse>({\n exact: false,\n queryKey,\n });\n prevDatas.forEach(([key, prevData]) => {\n this.queryClient.setQueryData(\n key,\n deepMergeObject(prevData, { data: result.data, error: null }),\n { updatedAt: Date.now() }\n );\n });\n }\n return result;\n },\n });\n }\n\n public async queryGetAllCoinBalances(\n owner: string\n ): Promise<{ [k: string]: CoinBalance }> {\n return this.queryClient.fetchQuery({\n retry: this.retryFn,\n retryDelay: 1000,\n queryKey: queryKeys.rpc.getAllCoinBalances(owner),\n queryFn: async () => {\n const allBalances = await this.callWithRateLimit(\n async () => await this.client.getAllBalances({ owner })\n );\n if (!allBalances) return {};\n const balances = allBalances.reduce(\n (acc, coinBalance) => {\n if (coinBalance.totalBalance !== '0') {\n acc[normalizeStructTag(coinBalance.coinType)] = coinBalance;\n }\n return acc;\n },\n {} as { [k: string]: CoinBalance }\n );\n\n return balances;\n },\n });\n }\n\n public async queryGetCoinBalance(\n input: GetBalanceParams\n ): Promise<CoinBalance | null> {\n if (!input.coinType) return null;\n\n return (\n ((await this.queryGetAllCoinBalances(input.owner)) ?? {})[\n normalizeStructTag(input.coinType)\n ] ?? '0'\n );\n }\n}\n","import { SuiKit, SuiKitParams } from '@scallop-io/sui-kit';\nimport { RPC_PROVIDERS } from 'src/constants/rpc';\n\nexport const newSuiKit = (params: SuiKitParams) => {\n return new SuiKit({\n ...params,\n fullnodeUrls: Array.from(\n new Set([...(params.fullnodeUrls ?? []), ...RPC_PROVIDERS])\n ),\n });\n};\n","import { API_BASE_URL, USE_TEST_ADDRESS } from '../constants';\nimport { type NetworkType } from '@scallop-io/sui-kit';\nimport type {\n ScallopAddressParams,\n AddressesInterface,\n AddressStringPath,\n ScallopAddressInstanceParams,\n} from '../types';\nimport { ScallopCache } from './scallopCache';\nimport axios, { AxiosInstance } from 'axios';\nimport { TEST_ADDRESSES } from 'src/constants/testAddress';\nimport { queryKeys } from 'src/constants';\n\nconst EMPTY_ADDRESSES: AddressesInterface = {\n core: {\n version: '',\n versionCap: '',\n object: '',\n market: '',\n adminCap: '',\n coinDecimalsRegistry: '',\n obligationAccessStore: '',\n coins: {\n cetus: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n wapt: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n wsol: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n wbtc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n weth: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n wusdc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n wusdt: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n sui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n afsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n hasui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n vsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n sca: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n },\n oracles: {\n xOracle: '',\n xOracleCap: '',\n supra: { registry: '', registryCap: '', holder: '' },\n switchboard: { registry: '', registryCap: '' },\n pyth: {\n registry: '',\n registryCap: '',\n state: '',\n wormhole: '',\n wormholeState: '',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '',\n upgradeCap: '',\n },\n math: {\n id: '',\n upgradeCap: '',\n },\n whitelist: {\n id: '',\n upgradeCap: '',\n },\n x: {\n id: '',\n upgradeCap: '',\n },\n protocol: {\n id: '',\n upgradeCap: '',\n },\n protocolWhitelist: {\n id: '',\n upgradeCap: '',\n },\n query: {\n id: '',\n upgradeCap: '',\n },\n supra: { id: '', upgradeCap: '' },\n pyth: {\n id: '',\n upgradeCap: '',\n },\n switchboard: { id: '', upgradeCap: '' },\n xOracle: {\n id: '',\n upgradeCap: '',\n },\n testCoin: { id: '', upgradeCap: '' },\n },\n },\n spool: {\n id: '',\n adminCap: '',\n object: '',\n pools: {\n sweth: {\n id: '',\n rewardPoolId: '',\n },\n ssui: {\n id: '',\n rewardPoolId: '',\n },\n swusdc: {\n id: '',\n rewardPoolId: '',\n },\n swusdt: {\n id: '',\n rewardPoolId: '',\n },\n scetus: {\n id: '',\n rewardPoolId: '',\n },\n safsui: {\n id: '',\n rewardPoolId: '',\n },\n shasui: {\n id: '',\n rewardPoolId: '',\n },\n svsui: {\n id: '',\n rewardPoolId: '',\n },\n },\n config: '',\n },\n borrowIncentive: {\n id: '',\n adminCap: '',\n object: '',\n query: '',\n incentivePools: '',\n incentiveAccounts: '',\n config: '',\n },\n vesca: {\n id: '',\n object: '',\n adminCap: '',\n tableId: '',\n table: '',\n treasury: '',\n config: '',\n },\n referral: {\n id: '',\n version: '',\n object: '',\n adminCap: '',\n referralBindings: '',\n bindingTableId: '',\n referralRevenuePool: '',\n revenueTableId: '',\n referralTiers: '',\n tiersTableId: '',\n authorizedWitnessList: '',\n },\n loyaltyProgram: {\n id: '',\n object: '',\n rewardPool: '',\n userRewardTableId: '',\n },\n scoin: {\n id: '',\n coins: {\n ssui: {\n coinType: '',\n treasury: '',\n },\n scetus: {\n coinType: '',\n treasury: '',\n },\n ssca: {\n coinType: '',\n treasury: '',\n },\n swusdc: {\n coinType: '',\n treasury: '',\n },\n swusdt: {\n coinType: '',\n treasury: '',\n },\n sweth: {\n coinType: '',\n treasury: '',\n },\n safsui: {\n coinType: '',\n treasury: '',\n },\n shasui: {\n coinType: '',\n treasury: '',\n },\n svsui: {\n coinType: '',\n treasury: '',\n },\n },\n },\n};\n/**\n * @description\n * It provides methods for managing addresses.\n *\n * @example\n * ```typescript\n * const scallopAddress = new ScallopAddress(<parameters>);\n * scallopAddress.<address functions>();\n * await scallopAddress.<address async functions>();\n * ```\n */\nexport class ScallopAddress {\n private readonly _auth?: string;\n private readonly _requestClient: AxiosInstance;\n\n private _id?: string;\n private _network: NetworkType;\n private _currentAddresses?: AddressesInterface;\n private _addressesMap: Map<NetworkType, AddressesInterface>;\n public cache: ScallopCache;\n\n public constructor(\n params: ScallopAddressParams,\n instance?: ScallopAddressInstanceParams\n ) {\n const { id, auth, network, forceInterface } = params;\n this.cache = instance?.cache ?? new ScallopCache({});\n\n this._requestClient = axios.create({\n baseURL: API_BASE_URL,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 8000,\n });\n if (auth) this._auth = auth;\n this._id = id;\n this._network = network ?? 'mainnet';\n this._addressesMap = USE_TEST_ADDRESS\n ? new Map([['mainnet', TEST_ADDRESSES]])\n : new Map();\n if (USE_TEST_ADDRESS) this._currentAddresses = TEST_ADDRESSES;\n\n // Set the addresses from the forceInterface if it is provided.\n if (forceInterface) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n forceInterface\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n }\n }\n\n /**\n * Get addresses API id.\n *\n * @return The addresses API id.\n */\n public getId() {\n return this._id || undefined;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @return The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._currentAddresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object'\n ? nestedAddressObj[key]\n : nestedAddressObj,\n this._currentAddresses\n );\n return value || undefined;\n } else {\n return undefined;\n }\n }\n\n /**\n * Sets the address for the specified path, it does not interact with the API.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @return The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._currentAddresses) {\n const keys = path.split('.');\n keys.reduce((nestedAddressObj: any, key: string, index) => {\n if (index === keys.length - 1) {\n nestedAddressObj[key] = address;\n } else {\n return nestedAddressObj[key];\n }\n }, this._currentAddresses);\n }\n return this._currentAddresses;\n }\n\n /**\n * Synchronize the specified network addresses from the addresses map to the\n * current addresses and change the default network to specified network.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @return Current addresses.\n */\n public switchCurrentAddresses(network: NetworkType) {\n if (this._addressesMap.has(network)) {\n this._currentAddresses = this._addressesMap.get(network);\n this._network = network;\n }\n return this._currentAddresses;\n }\n\n /**\n * Get the addresses, If `network` is not provided, returns the current\n * addresses or the default network addresses in the addresses map.\n *\n * @param network - Specifies which network's addresses you want to get.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n } else {\n return this._currentAddresses ?? this._addressesMap.get(this._network);\n }\n }\n\n /**\n * Set the addresses into addresses map. If the specified network is the same\n * as the current network, the current addresses will be updated at the same time.\n *\n * @param addresses - The addresses be setted to the tartget network.\n * @param network - Specifies which network's addresses you want to set.\n * @return The addresses.\n */\n public setAddresses(addresses: AddressesInterface, network?: NetworkType) {\n const targetNetwork = network || this._network;\n if (targetNetwork === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(targetNetwork, addresses);\n }\n\n /**\n * Get all addresses.\n *\n * @return All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n /**\n * Create a new addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication API key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async create(params?: {\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (apiKey !== undefined) {\n this._addressesMap.clear();\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.post(\n `/addresses`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 201) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Read and synchronizes all addresses from the API into instance.\n *\n * @param id - The id of the addresses to get.\n * @return All addresses.\n */\n public async read(id?: string) {\n const addressesId = id || this._id || undefined;\n if (addressesId !== undefined) {\n const response = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.api.getAddresses(addressesId),\n queryFn: async () => {\n return await this._requestClient.get(`/addresses/${addressesId}`, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n },\n });\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error('Please provide API addresses id.');\n }\n }\n\n /**\n * Update the addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.id - The id of the addresses to update.\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication api key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async update(params?: {\n id?: string;\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { id, addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be updated.');\n if (apiKey !== undefined) {\n if (id !== this._id) {\n this._addressesMap.clear();\n }\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.put(\n `/addresses/${targetId}`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to update addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Deletes all addresses of a specified id through the API and clear all\n * addresses in the instance.\n *\n * @param id - The id of the addresses to delete.\n * @param auth - The authentication API key.\n */\n public async delete(id?: string, auth?: string) {\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be deleted.');\n if (apiKey !== undefined) {\n const response = await this._requestClient.delete(\n `/addresses/${targetId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n this._id = undefined;\n this._currentAddresses = undefined;\n this._addressesMap.clear();\n } else {\n throw Error('Failed to delete addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n}\n","import { normalizeSuiAddress } from '@mysten/sui/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport {\n ADDRESSES_ID,\n SUPPORT_BORROW_INCENTIVE_POOLS,\n SUPPORT_SCOIN,\n SUPPORT_SPOOLS,\n} from '../constants';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type {\n TransactionObjectArgument,\n TransactionResult,\n} from '@mysten/sui/transactions';\nimport { ScallopCache } from './scallopCache';\nimport { requireSender } from 'src/utils';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\nimport type {\n ScallopClientFnReturnType,\n ScallopClientParams,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportAssetCoins,\n SupportStakeCoins,\n SupportStakeMarketCoins,\n ScallopTxBlock,\n SupportSCoin,\n ScallopClientVeScaReturnType,\n ScallopClientInstanceParams,\n} from '../types';\nimport { newSuiKit } from './suiKit';\n\n/**\n * @description\n * It provides contract interaction operations for general users.\n *\n * @example\n * ```typescript\n * const scallopClient = new ScallopClient(<parameters>);\n * await scallopClient.init();\n * scallopClient.<client functions>();\n * await scallopClient.<client async functions>();\n * ```\n */\nexport class ScallopClient {\n public readonly params: ScallopClientParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public builder: ScallopBuilder;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public cache: ScallopCache;\n public walletAddress: string;\n\n public constructor(\n params: ScallopClientParams = {},\n instance?: ScallopClientInstanceParams\n ) {\n this.params = params;\n this.suiKit =\n instance?.suiKit ?? instance?.builder?.suiKit ?? newSuiKit(params);\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress ?? this.suiKit.currentAddress()\n );\n\n if (instance?.builder) {\n this.builder = instance.builder;\n this.query = this.builder.query;\n this.utils = this.query.utils;\n this.address = this.utils.address;\n this.cache = this.address.cache;\n } else {\n this.cache = new ScallopCache(this.params, {\n suiKit: this.suiKit,\n });\n this.address = new ScallopAddress(\n {\n id: params?.addressesId ?? ADDRESSES_ID,\n network: params?.networkType,\n forceInterface: params?.forceAddressesInterface,\n },\n {\n cache: this.cache,\n }\n );\n this.utils = new ScallopUtils(this.params, {\n address: this.address,\n });\n this.query = new ScallopQuery(this.params, {\n utils: this.utils,\n });\n this.builder = new ScallopBuilder(this.params, {\n query: this.query,\n });\n }\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n */\n public async init(force: boolean = false) {\n if (force || !this.address.getAddresses()) {\n await this.address.read();\n }\n\n await this.builder.init(force, this.address);\n await this.query.init(force, this.address);\n await this.utils.init(force, this.address);\n }\n\n /* ==================== Query Method ==================== */\n\n /**\n * Query market data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @return Market data.\n */\n public async queryMarket() {\n return await this.query.queryMarket();\n }\n\n /**\n * Get obligations data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n const owner = ownerAddress ?? this.walletAddress;\n return await this.query.getObligations(owner);\n }\n\n /**\n * Query obligation data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(obligationId: string) {\n return await this.query.queryObligation(obligationId);\n }\n\n /**\n * Query all stake accounts data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return All stake accounts data.\n */\n async getAllStakeAccounts(ownerAddress?: string) {\n const owner = ownerAddress ?? this.walletAddress;\n return await this.query.getAllStakeAccounts(owner);\n }\n\n /**\n * Query stake account data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress?: string\n ) {\n const owner = ownerAddress ?? this.walletAddress;\n return await this.query.getStakeAccounts(stakeMarketCoinName, owner);\n }\n\n /**\n * Query stake pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Stake pool data.\n */\n async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakePool(stakeMarketCoinName);\n }\n\n /**\n * Query reward pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Reward pool data.\n */\n async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakeRewardPool(stakeMarketCoinName);\n }\n\n /* ==================== Core Method ==================== */\n\n /**\n * Open obligation.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async openObligation(): Promise<SuiTransactionBlockResponse>;\n public async openObligation<S extends boolean>(\n sign?: S\n ): Promise<ScallopClientFnReturnType<S>>;\n public async openObligation<S extends boolean>(\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n txBlock.openObligationEntry();\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit collateral into the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign?: S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const obligations = await this.query.getObligations(sender);\n const specificObligationId = obligationId ?? obligations[0]?.id;\n if (specificObligationId) {\n await txBlock.addCollateralQuick(\n amount,\n collateralCoinName,\n specificObligationId\n );\n } else {\n const [obligation, obligationKey, hotPotato] = txBlock.openObligation();\n await txBlock.addCollateralQuick(amount, collateralCoinName, obligation);\n txBlock.returnObligation(obligation, hotPotato);\n txBlock.transferObjects([obligationKey], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw collateral from the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdrawCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await txBlock.takeCollateralQuick(\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([collateralCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool.\n *\n * @param poolCoinName - Types of pool coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async deposit(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const sCoin = await txBlock.depositQuick(amount, poolCoinName);\n txBlock.transferObjects([sCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool and Stake market coin into the corresponding spool.\n *\n * @param stakeCoinName - Types of stake coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositAndStake(\n stakeCoinName: SupportStakeCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoinName =\n this.utils.parseMarketCoinName<SupportStakeMarketCoins>(stakeCoinName);\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId ?? stakeAccounts[0]?.id;\n\n const marketCoin = await txBlock.depositQuick(amount, stakeCoinName, false);\n if (targetStakeAccount) {\n await txBlock.stakeQuick(\n marketCoin,\n stakeMarketCoinName,\n targetStakeAccount\n );\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(marketCoin, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw asset from the specific pool, must return market coin.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would withdraw.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdraw(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.withdrawQuick(amount, poolCoinName);\n txBlock.transferObjects([coin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Borrow asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrow<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(obligationId, obligationKey);\n }\n const coin = await txBlock.borrowQuick(\n amount,\n poolCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([coin], sender);\n if (sign && availableStake) {\n await txBlock.stakeObligationWithVeScaQuick(obligationId, obligationKey);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Repay asset into the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would repay.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async repay<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(obligationId, obligationKey);\n }\n await txBlock.repayQuick(amount, poolCoinName, obligationId);\n if (sign && availableStake) {\n await txBlock.stakeObligationWithVeScaQuick(obligationId, obligationKey);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * FlashLoan asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name..\n * @param amount - The amount of coins would repay.\n * @param callback - The callback function to build transaction block and return coin argument.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async flashLoan(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg\n ): Promise<SuiTransactionBlockResponse>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg | Promise<SuiObjectArg>,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n const [coin, loan] = txBlock.borrowFlashLoan(amount, poolCoinName);\n txBlock.repayFlashLoan(await callback(txBlock, coin), loan, poolCoinName);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Spool Method ==================== */\n\n /**\n * Create stake account.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async createStakeAccount(\n marketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccount = txBlock.createStakeAccount(marketCoinName);\n txBlock.transferObjects([stakeAccount], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Stake market coin into the specific spool.\n *\n * @param marketCoinName - Types of market coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId ?? stakeAccounts[0]?.id;\n if (targetStakeAccount) {\n await txBlock.stakeQuick(amount, stakeMarketCoinName, targetStakeAccount);\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(amount, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const sCoin = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n if (sCoin) {\n // merge to existing sCoins if exist\n await this.utils.mergeSimilarCoins(\n txBlock,\n sCoin,\n this.utils.parseSCoinType(stakeMarketCoinName),\n requireSender(txBlock)\n );\n }\n\n txBlock.transferObjects([sCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool and withdraw asset from the corresponding pool.\n *\n * @param marketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstakeAndWithdraw(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoin = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId,\n false\n );\n const stakeCoinName =\n this.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n\n if (stakeMarketCoin) {\n const coin = txBlock.withdraw(stakeMarketCoin, stakeCoinName);\n await this.utils.mergeSimilarCoins(\n txBlock,\n coin,\n this.utils.parseCoinType(stakeCoinName),\n requireSender(txBlock)\n );\n\n txBlock.transferObjects([coin], sender);\n } else {\n throw new Error(`No stake found for ${stakeMarketCoinName}`);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Claim reward coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async claim(\n stakeMarketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoins = await txBlock.claimQuick(\n stakeMarketCoinName,\n stakeAccountId\n );\n txBlock.transferObjects(rewardCoins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Borrow Incentive Method ==================== */\n\n /**\n * stake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async stakeObligation<S extends boolean>(\n obligationId: string,\n obligationKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.stakeObligationWithVeScaQuick(obligationId, obligationKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * unstake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async unstakeObligation<S extends boolean>(\n obligationId: string,\n obligationKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.unstakeObligationQuick(obligationId, obligationKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Claim borrow incentive reward.\n *\n * @param poolName\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async claimBorrowIncentive<S extends boolean>(\n obligationId: string,\n obligationKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress ?? this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoinsCollection: Record<string, TransactionResult[]> = {};\n const obligationAccount =\n await this.query.getObligationAccount(obligationId);\n if (!obligationAccount) throw new Error('Obligation not found');\n const rewardCoinNames = Object.values(obligationAccount.borrowIncentives)\n .flatMap(({ rewards }) =>\n rewards.filter(({ availableClaimAmount }) => availableClaimAmount > 0)\n )\n .flatMap(({ coinName }) => coinName);\n for (const rewardCoinName of rewardCoinNames) {\n const rewardCoin = await txBlock.claimBorrowIncentiveQuick(\n rewardCoinName,\n obligationId,\n obligationKeyId\n );\n if (!rewardCoinsCollection[rewardCoinName]) {\n rewardCoinsCollection[rewardCoinName] = [rewardCoin];\n } else {\n rewardCoinsCollection[rewardCoinName].push(rewardCoin);\n }\n }\n\n txBlock.transferObjects(\n Object.values(rewardCoinsCollection).map((rewardCoins) => {\n const mergeDest = rewardCoins[0];\n if (rewardCoins.length > 1) {\n txBlock.mergeCoins(mergeDest, rewardCoins.slice(1));\n }\n return mergeDest;\n }),\n sender\n );\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Migrate market coin to sCoin method ==================== */\n /**\n * Function to migrate all market coin in user wallet into sCoin\n * @returns Transaction response\n */\n public async migrateAllMarketCoin<S extends boolean>(\n includeStakePool: boolean = true,\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n txBlock.setSender(this.walletAddress);\n\n const toTransfer: SuiObjectArg[] = [];\n await Promise.all(\n SUPPORT_SCOIN.map(async (sCoinName) => {\n /**\n * First check marketCoin inside mini wallet\n * Then check stakedMarketCoin inside spool\n */\n const sCoins: SuiObjectArg[] = [];\n let toDestroyMarketCoin: SuiObjectArg | undefined;\n\n // check market coin in mini wallet\n try {\n const marketCoins = await this.utils.selectCoins(\n Number.MAX_SAFE_INTEGER,\n this.utils.parseMarketCoinType(sCoinName as SupportSCoin),\n this.walletAddress\n ); // throw error no coins found\n\n toDestroyMarketCoin = marketCoins[0];\n if (marketCoins.length > 1) {\n txBlock.mergeCoins(toDestroyMarketCoin, marketCoins.slice(1));\n }\n } catch (e: any) {\n // Ignore\n const errMsg = e.toString() as String;\n if (!errMsg.includes('No valid coins found for the transaction'))\n throw e;\n }\n\n // if market coin found, mint sCoin\n if (toDestroyMarketCoin) {\n // mint new sCoin\n const sCoin = txBlock.mintSCoin(\n sCoinName as SupportSCoin,\n toDestroyMarketCoin\n );\n\n // Merge with existing sCoin\n await this.utils.mergeSimilarCoins(\n txBlock,\n sCoin,\n this.utils.parseSCoinType(sCoinName as SupportSCoin),\n requireSender(txBlock)\n );\n sCoins.push(sCoin);\n }\n if (includeStakePool) {\n // check for staked market coin in spool\n if (SUPPORT_SPOOLS.includes(sCoinName as SupportStakeMarketCoins)) {\n try {\n const sCoin = await txBlock.unstakeQuick(\n Number.MAX_SAFE_INTEGER,\n sCoinName as SupportStakeMarketCoins\n );\n if (sCoin) {\n sCoins.push(sCoin);\n }\n } catch (_e: any) {\n // ignore\n }\n }\n }\n\n if (sCoins.length > 0) {\n const mergedSCoin = sCoins[0];\n if (sCoins.length > 1) {\n txBlock.mergeCoins(mergedSCoin, sCoins.slice(1));\n }\n\n toTransfer.push(mergedSCoin);\n }\n })\n );\n\n if (toTransfer.length > 0) {\n txBlock.transferObjects(toTransfer, this.walletAddress);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== VeSCA ==================== */\n /**\n * Claim unlocked SCA from all veSCA accounts.\n */\n public async claimAllUnlockedSca(): Promise<SuiTransactionBlockResponse>;\n public async claimAllUnlockedSca<S extends boolean>(\n sign?: S\n ): Promise<ScallopClientVeScaReturnType<S>>;\n public async claimAllUnlockedSca<S extends boolean>(\n sign: S = true as S\n ): Promise<ScallopClientVeScaReturnType<S>> {\n // get all veSca keys\n const veScaKeys = (\n (await this.query.getVeScas({\n walletAddress: this.walletAddress,\n })) ?? []\n ).map(({ keyObject }) => keyObject);\n if (veScaKeys.length === 0) {\n throw new Error('No veSCA found in the wallet');\n }\n\n const scaCoins: TransactionResult[] = [];\n const tx = this.builder.createTxBlock();\n tx.setSender(this.walletAddress);\n\n await Promise.all(\n veScaKeys.map(async (key) => {\n try {\n const scaCoin = await tx.redeemScaQuick(key, false);\n if (!scaCoin) return;\n scaCoins.push(scaCoin);\n } catch (_e) {\n // ignore\n }\n })\n );\n\n if (scaCoins.length === 0) {\n throw new Error('No unlocked SCA found in the veSCA accounts');\n }\n\n if (scaCoins.length > 1) {\n tx.mergeCoins(scaCoins[0], scaCoins.slice(1));\n }\n await this.utils.mergeSimilarCoins(\n tx,\n scaCoins[0],\n 'sca',\n this.walletAddress\n );\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n tx\n )) as ScallopClientVeScaReturnType<S>;\n } else {\n return {\n tx: tx.txBlock,\n scaCoin: scaCoins[0],\n } as ScallopClientVeScaReturnType<S>;\n }\n }\n\n /* ==================== Other Method ==================== */\n\n /**\n * Mint and get test coin.\n *\n * @remarks\n * Only be used on the test network.\n *\n * @param assetCoinName - Specific asset coin name.\n * @param amount - The amount of coins minted and received.\n * @param receiveAddress - The wallet address that receives the coins.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async mintTestCoin(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign?: S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign: S = true as S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const isTestnet = this.params.networkType\n ? this.params.networkType === 'testnet'\n : false;\n\n if (!isTestnet) {\n throw new Error('Only be used on the test network.');\n }\n\n const txBlock = this.builder.createTxBlock();\n const recipient = receiveAddress ?? this.walletAddress;\n const packageId = this.address.get('core.packages.testCoin.id');\n const treasuryId = this.address.get(`core.coins.${assetCoinName}.treasury`);\n const target = `${packageId}::${assetCoinName}::mint`;\n const coin = txBlock.moveCall(target, [treasuryId, amount]);\n txBlock.transferObjects([coin], recipient);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n}\n","import { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js';\nimport { ScallopAddress } from './scallopAddress';\nimport {\n ADDRESSES_ID,\n PROTOCOL_OBJECT_ID,\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n spoolRewardCoins,\n coinDecimals,\n wormholeCoinIds,\n voloCoinIds,\n coinIds,\n UNLOCK_ROUND_DURATION,\n MAX_LOCK_DURATION,\n SUPPORT_SCOIN,\n sCoinIds,\n suiBridgeCoins,\n COIN_GECKGO_IDS,\n POOL_ADDRESSES,\n sCoinTypeToName,\n sCoinRawNameToName,\n} from '../constants';\nimport { getPythPrices, queryObligation } from '../queries';\nimport {\n parseDataFromPythPriceFeed,\n isMarketCoin,\n parseAssetSymbol,\n findClosestUnlockRound,\n isSuiBridgeAsset,\n isWormholeAsset,\n} from '../utils';\nimport { PYTH_ENDPOINTS, PYTH_FEED_IDS } from 'src/constants/pyth';\nimport { ScallopCache } from './scallopCache';\nimport type {\n ScallopUtilsParams,\n SupportCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n SupportStakeMarketCoins,\n CoinPrices,\n CoinWrappedType,\n SupportSCoin,\n ScallopUtilsInstanceParams,\n SupportSuiBridgeCoins,\n SupportWormholeCoins,\n PoolAddressInfo,\n} from '../types';\nimport { queryKeys } from 'src/constants';\nimport type { SuiObjectArg, SuiTxBlock } from '@scallop-io/sui-kit';\nimport { newSuiKit } from './suiKit';\n\n/**\n * @description\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopUtils = new ScallopUtils(<parameters>);\n * await scallopUtils.init();\n * scallopUtils.<utils functions>();\n * await scallopUtils.<utils functions>();\n * ```\n */\nexport class ScallopUtils {\n public readonly params: ScallopUtilsParams;\n public readonly isTestnet: boolean;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public cache: ScallopCache;\n public walletAddress: string;\n\n public constructor(\n params: ScallopUtilsParams,\n instance?: ScallopUtilsInstanceParams\n ) {\n this.params = {\n pythEndpoints: params.pythEndpoints ?? PYTH_ENDPOINTS['mainnet'],\n ...params,\n };\n this.walletAddress =\n params.walletAddress ?? instance?.suiKit?.currentAddress() ?? '';\n this.suiKit =\n instance?.suiKit ?? instance?.address?.cache.suiKit ?? newSuiKit(params);\n\n if (instance?.address) {\n this.address = instance.address;\n this.cache = this.address.cache;\n } else {\n this.cache = new ScallopCache(this.params, {\n suiKit: this.suiKit,\n });\n this.address =\n instance?.address ??\n new ScallopAddress(\n {\n id: params?.addressesId ?? ADDRESSES_ID,\n network: params?.networkType,\n forceInterface: params?.forceAddressesInterface,\n },\n {\n cache: this.cache,\n }\n );\n }\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n // -------------- TYPE GUARDS --------------\n public isSuiBridgeAsset(coinName: any): coinName is SupportSuiBridgeCoins {\n return isSuiBridgeAsset(coinName);\n }\n\n public isWormholeAsset(coinName: any): coinName is SupportWormholeCoins {\n return isWormholeAsset(coinName);\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public async init(force: boolean = false, address?: ScallopAddress) {\n if (address && !this.address) this.address = address;\n if (force || !this.address.getAddresses()) {\n await this.address.read();\n }\n }\n\n /**\n * Convert coin name to symbol.\n *\n * @param coinName - Specific support coin name.\n * @return Symbol string.\n */\n public parseSymbol(coinName: SupportCoins) {\n return parseAssetSymbol(coinName);\n }\n\n /**\n * Convert coin name to coin type.\n *\n * @description\n * The Coin type of wormhole is fixed `coin:Coin`. Here using package id\n * to determine and return the type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Coin type.\n */\n public parseCoinType(\n coinName: SupportCoins,\n useOldMarketCoin: boolean = false\n ) {\n // try parse scoin first\n if (sCoinIds[coinName as SupportSCoin] && !useOldMarketCoin) {\n return sCoinIds[coinName as SupportSCoin];\n }\n coinName = isMarketCoin(coinName) ? this.parseCoinName(coinName) : coinName;\n const coinPackageId =\n this.address.get(`core.coins.${coinName}.id`) ||\n coinIds[coinName] ||\n undefined;\n if (!coinPackageId) {\n throw Error(`Coin ${coinName} is not supported`);\n }\n if (coinName === 'sui')\n return normalizeStructTag(`${coinPackageId}::sui::SUI`);\n if (coinName === 'blub')\n return normalizeStructTag(`${coinPackageId}::BLUB::BLUB`);\n if (coinName === 'sbwbtc')\n return normalizeStructTag(`${coinPackageId}::btc::BTC`);\n\n const wormHolePackageIds = [\n this.address.get('core.coins.wusdc.id') ?? wormholeCoinIds.wusdc,\n this.address.get('core.coins.wusdt.id') ?? wormholeCoinIds.wusdt,\n this.address.get('core.coins.weth.id') ?? wormholeCoinIds.weth,\n this.address.get('core.coins.wbtc.id') ?? wormholeCoinIds.wbtc,\n this.address.get('core.coins.wsol.id') ?? wormholeCoinIds.wsol,\n this.address.get('core.coins.wapt.id') ?? wormholeCoinIds.wapt,\n ];\n const voloPackageIds = [\n this.address.get('core.coins.vsui.id') ?? voloCoinIds.vsui,\n ];\n\n const suiBridgePackageIds = Object.values<SupportSuiBridgeCoins>(\n suiBridgeCoins\n ).reduce((curr, coinName) => {\n curr.push(\n this.address.get(`core.coins.${coinName}.id`) ?? coinIds[coinName]\n );\n return curr;\n }, [] as string[]);\n if (wormHolePackageIds.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n } else if (voloPackageIds.includes(coinPackageId)) {\n return `${coinPackageId}::cert::CERT`;\n } else if (suiBridgePackageIds.includes(coinPackageId)) {\n // handle sui bridge assets\n const typeCoinName = coinName.slice(2);\n return `${coinPackageId}::${typeCoinName}::${typeCoinName.toUpperCase()}`;\n } else {\n return `${coinPackageId}::${coinName}::${coinName.toUpperCase()}`;\n }\n }\n\n /**\n * Convert coin name to sCoin name.\n *\n * @param coinName - Specific support coin name.\n * @return sCoin name.\n */\n public parseSCoinName<T extends SupportSCoin>(\n coinName: SupportCoins | SupportMarketCoins\n ) {\n // need more check because swapt has no sCoin type\n if (\n isMarketCoin(coinName) &&\n SUPPORT_SCOIN.includes(coinName as SupportSCoin)\n ) {\n return coinName as T;\n } else {\n const marketCoinName = `s${coinName}`;\n if (SUPPORT_SCOIN.includes(marketCoinName as SupportSCoin)) {\n return marketCoinName as T;\n }\n return undefined;\n }\n }\n\n /**\n * Convert sCoin name to market coin name.\n * This function will parse new sCoin name `scallop_...` to its old market coin name which is shorter\n * e.g: `scallop_sui -> ssui\n * if no `scallop_...` is encountered, return coinName\n * @return sCoin name\n */\n public parseSCoinTypeNameToMarketCoinName(coinName: string) {\n return sCoinRawNameToName[coinName] ?? coinName;\n }\n\n /**\n * Convert sCoin name into sCoin type\n * @param sCoinName\n * @returns sCoin type\n */\n public parseSCoinType(sCoinName: SupportSCoin) {\n return sCoinIds[sCoinName];\n }\n\n /**\n * Convert sCoinType into sCoin name\n * @param sCoinType\n * @returns sCoin name\n */\n public parseSCoinNameFromType(sCoinType: string) {\n return sCoinTypeToName[sCoinType];\n }\n\n /**\n * Convert sCoin name into its underlying coin type\n * @param sCoinName\n * @returns coin type\n */\n public parseUnderlyingSCoinType(sCoinName: SupportSCoin) {\n const coinName = this.parseCoinName(sCoinName);\n return this.parseCoinType(coinName);\n }\n\n /**\n * Get sCoin treasury id from sCoin name\n * @param sCoinName\n * @returns sCoin treasury id\n */\n public getSCoinTreasury(sCoinName: SupportSCoin) {\n return this.address.get(`scoin.coins.${sCoinName}.treasury`);\n }\n\n /**\n * Convert coin name to market coin type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Market coin type.\n */\n public parseMarketCoinType(coinName: SupportCoins) {\n const protocolObjectId =\n this.address.get('core.object') || PROTOCOL_OBJECT_ID;\n const coinType = this.parseCoinType(coinName, true);\n return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;\n }\n\n /**\n * Convert coin type to coin name.\n *\n * @description\n * The coin name cannot be obtained directly from the wormhole type. Here\n * the package id is used to determine and return a specific name.\n *\n * @param coinType - Specific support coin type.\n * @return Coin Name.\n */\n public parseCoinNameFromType<T extends SupportAssetCoins>(\n coinType: string\n ): T extends SupportAssetCoins ? T : SupportAssetCoins;\n public parseCoinNameFromType<T extends SupportMarketCoins>(\n coinType: string\n ): T extends SupportMarketCoins ? T : SupportMarketCoins;\n public parseCoinNameFromType<T extends SupportCoins>(\n coinType: string\n ): T extends SupportCoins ? T : SupportCoins;\n public parseCoinNameFromType<T extends SupportSCoin>(\n coinType: string\n ): T extends SupportSCoin ? T : SupportSCoin;\n public parseCoinNameFromType(coinType: string) {\n coinType = normalizeStructTag(coinType);\n if (sCoinTypeToName[coinType]) {\n return sCoinTypeToName[coinType] as SupportSCoin;\n }\n\n const coinTypeRegex = new RegExp(`((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)`);\n const coinTypeMatch = coinType.match(coinTypeRegex);\n const isMarketCoinType = coinType.includes('reserve::MarketCoin');\n coinType = coinTypeMatch?.[1] ?? coinType;\n\n const wormholeCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this.address.get('core.coins.wusdc.id') ?? wormholeCoinIds.wusdc\n }::coin::COIN`]: 'wusdc',\n [`${\n this.address.get('core.coins.wusdt.id') ?? wormholeCoinIds.wusdt\n }::coin::COIN`]: 'wusdt',\n [`${\n this.address.get('core.coins.weth.id') ?? wormholeCoinIds.weth\n }::coin::COIN`]: 'weth',\n [`${\n this.address.get('core.coins.wbtc.id') ?? wormholeCoinIds.wbtc\n }::coin::COIN`]: 'wbtc',\n [`${\n this.address.get('core.coins.wsol.id') ?? wormholeCoinIds.wsol\n }::coin::COIN`]: 'wsol',\n [`${\n this.address.get('core.coins.wapt.id') ?? wormholeCoinIds.wapt\n }::coin::COIN`]: 'wapt',\n };\n const voloCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this.address.get('core.coins.vsui.id') ?? voloCoinIds.vsui\n }::cert::CERT`]: 'vsui',\n };\n\n const suiBridgeTypeMap = Object.values<SupportSuiBridgeCoins>(\n suiBridgeCoins\n ).reduce(\n (curr, coinName) => {\n curr[this.parseCoinType(coinName)] = coinName;\n return curr;\n },\n {} as Record<string, SupportSuiBridgeCoins>\n );\n\n const assetCoinName =\n wormholeCoinTypeMap[coinType] ||\n voloCoinTypeMap[coinType] ||\n suiBridgeTypeMap[coinType] ||\n (coinType.split('::')[2].toLowerCase() as SupportAssetCoins);\n\n return isMarketCoinType\n ? this.parseMarketCoinName(assetCoinName)\n : assetCoinName;\n }\n\n /**\n * Convert market coin name to coin name.\n *\n * @param marketCoinName - Specific support market coin name.\n * @return Coin Name.\n */\n public parseCoinName<T extends SupportAssetCoins>(marketCoinName: string) {\n return marketCoinName.slice(1) as T;\n }\n\n /**\n * Convert coin name to market coin name.\n *\n * @param coinName - Specific support coin name.\n * @return Market coin name.\n */\n public parseMarketCoinName<T extends SupportMarketCoins>(\n coinName: SupportCoins\n ) {\n return `s${coinName}` as T;\n }\n\n /**\n * Get reward type of spool.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Spool reward coin name.\n */\n public getSpoolRewardCoinName = (\n stakeMarketCoinName: SupportStakeMarketCoins\n ) => {\n return spoolRewardCoins[stakeMarketCoinName];\n };\n\n /**\n * Get coin decimal.\n *\n * return Coin decimal.\n */\n public getCoinDecimal(coinName: SupportCoins) {\n return coinDecimals[coinName];\n }\n\n /**\n * Get coin wrapped type.\n *\n * return Coin wrapped type.\n */\n public getCoinWrappedType(assetCoinName: SupportAssetCoins): CoinWrappedType {\n if (this.isSuiBridgeAsset(assetCoinName)) {\n return {\n from: 'Sui Bridge',\n type: 'Asset from Sui Bridge',\n };\n } else if (this.isWormholeAsset(assetCoinName)) {\n return {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n };\n }\n\n return undefined;\n }\n\n /**\n * Select coin id that add up to the given amount as transaction arguments.\n *\n * @param ownerAddress - The address of the owner.\n * @param amount - The amount that including coin decimals.\n * @param coinType - The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoins(\n amount: number,\n coinType: string = SUI_TYPE_ARG,\n ownerAddress?: string\n ) {\n ownerAddress = ownerAddress ?? this.walletAddress;\n const coins = await this.suiKit.suiInteractor.selectCoins(\n ownerAddress,\n amount,\n coinType\n );\n return coins;\n }\n\n /**\n * Merge coins with type `coinType` to dest\n * @param txBlock\n * @param dest\n * @param coinType\n * @param sender\n */\n public async mergeSimilarCoins(\n txBlock: SuiTxBlock,\n dest: SuiObjectArg,\n coinType: string,\n sender: string = this.walletAddress\n ): Promise<void> {\n // merge to existing coins if exist\n try {\n const existingCoins = await this.selectCoins(\n Number.MAX_SAFE_INTEGER,\n coinType,\n sender\n );\n\n if (existingCoins.length > 0) {\n txBlock.mergeCoins(dest, existingCoins.slice(0, 500));\n }\n } catch (_e) {\n // ignore\n }\n }\n\n /**\n * Get all asset coin names in the obligation record by obligation id.\n *\n * @description\n * This can often be used to determine which assets in an obligation require\n * price updates before interacting with specific instructions of the Scallop contract.\n *\n * @param obligationId - The obligation id.\n * @return Asset coin Names.\n */\n public async getObligationCoinNames(obligationId: SuiObjectArg) {\n const obligation = await queryObligation(this, obligationId);\n if (!obligation) return undefined;\n\n const collateralCoinTypes = obligation.collaterals.map((collateral) => {\n return `0x${collateral.type.name}`;\n });\n const debtCoinTypes = obligation.debts.map((debt) => {\n return `0x${debt.type.name}`;\n });\n const obligationCoinTypes = [\n ...new Set([...collateralCoinTypes, ...debtCoinTypes]),\n ];\n const obligationCoinNames = obligationCoinTypes.map((coinType) => {\n return this.parseCoinNameFromType(coinType);\n });\n return obligationCoinNames;\n }\n\n /**\n * Get asset coin price.\n *\n * @description\n * The strategy for obtaining the price is to get it through API first,\n * and then on-chain data if API cannot be retrieved.\n * Currently, we only support obtaining from pyth protocol, other\n * oracles will be supported in the future.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @return Asset coin price.\n */\n public async getCoinPrices(\n _: SupportAssetCoins[] = [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ] as SupportAssetCoins[]\n ) {\n let coinPrices: CoinPrices = {};\n\n const endpoints =\n this.params.pythEndpoints ??\n PYTH_ENDPOINTS[this.isTestnet ? 'testnet' : 'mainnet'];\n\n const failedRequests: Set<SupportAssetCoins> = new Set([\n ...SUPPORT_POOLS,\n ...SUPPORT_COLLATERALS,\n ]);\n\n for (const endpoint of endpoints) {\n const priceIdPairs = Array.from(failedRequests.values()).reduce(\n (acc, coinName) => {\n const priceId =\n this.address.get(`core.coins.${coinName}.oracle.pyth.feed`) ??\n PYTH_FEED_IDS[coinName];\n acc.push([coinName, priceId]);\n return acc;\n },\n [] as [string, string][]\n );\n\n const priceIds = priceIdPairs.map(([_, priceId]) => priceId);\n\n const pythConnection = new SuiPriceServiceConnection(endpoint, {\n timeout: 4000,\n });\n\n try {\n const feeds = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.oracle.getPythLatestPriceFeeds(),\n queryFn: async () => {\n return await pythConnection.getLatestPriceFeeds(priceIds);\n },\n staleTime: 30000,\n gcTime: 30000,\n });\n if (feeds) {\n feeds.forEach((feed, idx) => {\n const coinName = priceIdPairs[idx][0] as SupportAssetCoins;\n const data = parseDataFromPythPriceFeed(feed, this.address);\n coinPrices[coinName as SupportAssetCoins] = data.price;\n failedRequests.delete(coinName as SupportAssetCoins); // remove success price feed to prevent duplicate request on the next endpoint\n });\n }\n } catch (e: any) {\n console.error(e.message);\n }\n if (failedRequests.size === 0) break;\n }\n\n if (failedRequests.size > 0) {\n coinPrices = {\n ...coinPrices,\n ...(await getPythPrices(this, Array.from(failedRequests.values()))),\n };\n failedRequests.clear();\n }\n\n return coinPrices;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The annual percentage rate (APR).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage yield (APY) for the given APR and compounding frequency.\n */\n public parseAprToApy(apr: number, compoundFrequency = 365) {\n return (1 + apr / compoundFrequency) ** compoundFrequency - 1;\n }\n\n /**\n * Convert apy to apr.\n *\n * @param apr The equivalent annual percentage yield (APY).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage rate (APR) for the given APY and compounding frequency.\n */\n public parseApyToApr(apy: number, compoundFrequency = 365) {\n return ((1 + apy) ** (1 / compoundFrequency) - 1) * compoundFrequency;\n }\n\n /**\n * Give extend lock period to get unlock at in seconds timestamp.\n *\n * @description\n * - When the user without remaining unlock period, If the extended unlock day is not specified,\n * the unlock period will be increased by one day by default.\n * - When the given extended day plus the user's remaining unlock period exceeds the maximum\n * unlock period, the maximum unlock period is used as unlock period.\n *\n * @param extendLockPeriodInDay The extend lock period in day.\n * @param unlockAtInSecondTimestamp The unlock timestamp from veSca object.\n * @return New unlock at in seconds timestamp.\n */\n public getUnlockAt(\n extendLockPeriodInDay?: number,\n unlockAtInMillisTimestamp?: number\n ) {\n const now = Math.floor(new Date().getTime() / 1000);\n const remainingLockPeriod = unlockAtInMillisTimestamp\n ? Math.max(Math.floor(unlockAtInMillisTimestamp / 1000) - now, 0)\n : 0;\n\n let newUnlockAtInSecondTimestamp = 0;\n\n if (remainingLockPeriod === 0) {\n const lockPeriod = (extendLockPeriodInDay ?? 1) * UNLOCK_ROUND_DURATION;\n newUnlockAtInSecondTimestamp = Math.min(\n now + lockPeriod,\n now + MAX_LOCK_DURATION\n );\n } else {\n const lockPeriod = Math.min(\n extendLockPeriodInDay\n ? extendLockPeriodInDay * UNLOCK_ROUND_DURATION + remainingLockPeriod\n : remainingLockPeriod,\n MAX_LOCK_DURATION\n );\n newUnlockAtInSecondTimestamp = now + lockPeriod;\n }\n return findClosestUnlockRound(newUnlockAtInSecondTimestamp);\n }\n\n /**\n * Get detailed contract address and price id information for supported pool in Scallop\n * @returns Supported pool informations\n */\n public getSupportedPoolAddresses(): PoolAddressInfo[] {\n return SUPPORT_POOLS.map((poolName) => {\n const sCoinName = this.parseSCoinName(poolName)!;\n return {\n name: this.parseSymbol(poolName),\n coingeckoId: COIN_GECKGO_IDS[poolName],\n decimal: coinDecimals[poolName],\n pythFeedId: PYTH_FEED_IDS[poolName],\n ...POOL_ADDRESSES[poolName],\n sCoinAddress: sCoinIds[sCoinName],\n marketCoinAddress: this.parseMarketCoinType(poolName),\n coinAddress: this.parseCoinType(poolName),\n sCoinName: sCoinName ? this.parseSymbol(sCoinName) : undefined,\n };\n });\n }\n}\n","import { normalizeStructTag } from '@mysten/sui/utils';\nimport {\n SUPPORT_BORROW_INCENTIVE_POOLS,\n SUPPORT_BORROW_INCENTIVE_REWARDS,\n} from '../constants';\nimport {\n parseOriginBorrowIncentivePoolData,\n parseOriginBorrowIncentiveAccountData,\n calculateBorrowIncentivePoolPointData,\n} from '../utils';\nimport type { ScallopAddress, ScallopQuery, ScallopUtils } from '../models';\nimport type {\n BorrowIncentivePoolsQueryInterface,\n BorrowIncentivePools,\n BorrowIncentiveAccountsQueryInterface,\n BorrowIncentiveAccounts,\n SupportBorrowIncentiveCoins,\n SupportBorrowIncentiveRewardCoins,\n BorrowIncentivePoolPoints,\n OptionalKeys,\n BorrowIncentivePool,\n CoinPrices,\n MarketPools,\n} from '../types';\nimport BigNumber from 'bignumber.js';\nimport { SuiObjectRef } from '@mysten/sui/client';\n\n/**\n * Query borrow incentive pools data using moveCall\n * @param address\n * @returns\n */\nexport const queryBorrowIncentivePools = async (address: ScallopAddress) => {\n const queryPkgId = address.get('borrowIncentive.query');\n const incentivePoolsId = address.get('borrowIncentive.incentivePools');\n\n const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data`;\n const args = [incentivePoolsId];\n const queryResult = await address.cache.queryInspectTxn({\n queryTarget,\n args,\n });\n const borrowIncentivePoolsQueryData = queryResult?.events[0].parsedJson as\n | BorrowIncentivePoolsQueryInterface\n | undefined;\n return borrowIncentivePoolsQueryData;\n};\n\n/**\n * Get borrow incentive pools data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\nexport const getBorrowIncentivePools = async (\n query: ScallopQuery,\n borrowIncentiveCoinNames: SupportBorrowIncentiveCoins[] = [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ],\n indexer: boolean = false,\n marketPools?: MarketPools,\n coinPrices?: CoinPrices\n) => {\n const borrowIncentivePools: BorrowIncentivePools = {};\n marketPools =\n marketPools ??\n (await query.getMarketPools(undefined, { coinPrices, indexer })).pools;\n coinPrices = coinPrices ?? (await query.getAllCoinPrices({ marketPools }));\n\n if (indexer) {\n const borrowIncentivePoolsIndexer =\n await query.indexer.getBorrowIncentivePools();\n\n const updateBorrowIncentivePool = (pool: BorrowIncentivePool) => {\n if (!borrowIncentiveCoinNames.includes(pool.coinName)) return;\n pool.coinPrice = coinPrices[pool.coinName] || pool.coinPrice;\n for (const sCoinName of SUPPORT_BORROW_INCENTIVE_REWARDS) {\n if (pool.points[sCoinName]) {\n pool.points[sCoinName].coinPrice =\n coinPrices[sCoinName] ?? pool.points[sCoinName].coinPrice;\n }\n }\n borrowIncentivePools[pool.coinName] = pool;\n };\n\n Object.values(borrowIncentivePoolsIndexer).forEach(\n updateBorrowIncentivePool\n );\n\n return borrowIncentivePools;\n }\n\n const borrowIncentivePoolsQueryData = await queryBorrowIncentivePools(\n query.address\n );\n\n for (const pool of borrowIncentivePoolsQueryData?.incentive_pools ?? []) {\n const borrowIncentivePoolPoints: OptionalKeys<\n Record<SupportBorrowIncentiveRewardCoins, BorrowIncentivePoolPoints>\n > = {};\n const parsedBorrowIncentivePoolData = parseOriginBorrowIncentivePoolData(\n query.utils,\n pool\n );\n\n const poolCoinType = normalizeStructTag(pool.pool_type.name);\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(\n poolCoinType\n );\n const poolCoinPrice = coinPrices?.[poolCoinName] ?? 0;\n const poolCoinDecimal = query.utils.getCoinDecimal(poolCoinName);\n\n // Filter pools not yet supported by the SDK.\n if (!borrowIncentiveCoinNames.includes(poolCoinName)) {\n continue;\n }\n\n // pool points for borrow incentive reward\n for (const [coinName, poolPoint] of Object.entries(\n parsedBorrowIncentivePoolData.poolPoints\n )) {\n const rewardCoinType = poolPoint.pointType;\n const rewardCoinName = query.utils.parseCoinNameFromType(\n rewardCoinType\n ) as SupportBorrowIncentiveRewardCoins;\n // handle for scoin name\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n\n const symbol = query.utils.parseSymbol(rewardCoinName);\n const coinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n\n const calculatedPoolPoint = calculateBorrowIncentivePoolPointData(\n // parsedBorrowIncentivePoolData,\n poolPoint,\n rewardCoinPrice,\n rewardCoinDecimal,\n poolCoinPrice,\n poolCoinDecimal\n );\n\n borrowIncentivePoolPoints[coinName as SupportBorrowIncentiveRewardCoins] =\n {\n symbol,\n coinName: rewardCoinName,\n coinType: rewardCoinType,\n coinDecimal,\n coinPrice: rewardCoinPrice,\n points: poolPoint.points,\n distributedPoint: poolPoint.distributedPoint,\n weightedAmount: poolPoint.weightedAmount,\n ...calculatedPoolPoint,\n };\n }\n\n const stakedAmount = BigNumber(parsedBorrowIncentivePoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * poolCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(poolCoinPrice);\n\n borrowIncentivePools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: poolCoinType,\n coinDecimal: poolCoinDecimal,\n coinPrice: poolCoinPrice,\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n points: borrowIncentivePoolPoints,\n };\n }\n\n return borrowIncentivePools;\n};\n\n/**\n * Query borrow incentive accounts data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive accounts data.\n */\nexport const queryBorrowIncentiveAccounts = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n obligationId: string | SuiObjectRef,\n borrowIncentiveCoinNames: SupportBorrowIncentiveCoins[] = [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ]\n) => {\n const queryPkgId = utils.address.get('borrowIncentive.query');\n const incentiveAccountsId = utils.address.get(\n 'borrowIncentive.incentiveAccounts'\n );\n const queryTarget = `${queryPkgId}::incentive_account_query::incentive_account_data`;\n const args = [incentiveAccountsId, obligationId];\n\n const queryResult = await utils.cache.queryInspectTxn({ queryTarget, args });\n const borrowIncentiveAccountsQueryData = queryResult?.events[0]\n ?.parsedJson as BorrowIncentiveAccountsQueryInterface | undefined;\n\n const borrowIncentiveAccounts: BorrowIncentiveAccounts = Object.values(\n borrowIncentiveAccountsQueryData?.pool_records ?? []\n ).reduce((accounts, accountData) => {\n const parsedBorrowIncentiveAccount =\n parseOriginBorrowIncentiveAccountData(accountData);\n const poolType = parsedBorrowIncentiveAccount.poolType;\n const coinName =\n utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolType);\n\n if (\n borrowIncentiveCoinNames &&\n borrowIncentiveCoinNames.includes(coinName)\n ) {\n accounts[coinName] = parsedBorrowIncentiveAccount;\n }\n\n return accounts;\n }, {} as BorrowIncentiveAccounts);\n\n return borrowIncentiveAccounts;\n};\n\n/**\n * Check veSca bind status\n * @param query\n * @param veScaKey\n * @returns\n */\nexport const getBindedObligationId = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n veScaKeyId: string\n): Promise<string | null> => {\n const borrowIncentiveObjectId = address.get('borrowIncentive.object');\n const incentivePoolsId = address.get('borrowIncentive.incentivePools');\n const veScaObjId = address.get('vesca.object');\n\n // get incentive pools\n const incentivePoolsResponse =\n await address.cache.queryGetObject(incentivePoolsId);\n\n if (incentivePoolsResponse?.data?.content?.dataType !== 'moveObject')\n return null;\n const incentivePoolFields = incentivePoolsResponse.data.content.fields as any;\n const veScaBindTableId = incentivePoolFields.ve_sca_bind.fields.id\n .id as string;\n\n // check if veSca is inside the bind table\n const keyType = `${borrowIncentiveObjectId}::typed_id::TypedID<${veScaObjId}::ve_sca::VeScaKey>`;\n const veScaBindTableResponse = await address.cache.queryGetDynamicFieldObject(\n {\n parentId: veScaBindTableId,\n name: {\n type: keyType,\n value: veScaKeyId,\n },\n }\n );\n\n if (veScaBindTableResponse?.data?.content?.dataType !== 'moveObject')\n return null;\n const veScaBindTableFields = veScaBindTableResponse.data.content\n .fields as any;\n // get obligationId pair\n const obligationId = veScaBindTableFields.value.fields.id as string;\n\n return obligationId;\n};\n\nexport const getBindedVeScaKey = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n obligationId: string\n): Promise<string | null> => {\n const borrowIncentiveObjectId = address.get('borrowIncentive.object');\n const incentiveAccountsId = address.get('borrowIncentive.incentiveAccounts');\n const corePkg = address.get('core.object');\n\n // get IncentiveAccounts object\n const incentiveAccountsObject =\n await address.cache.queryGetObject(incentiveAccountsId);\n if (incentiveAccountsObject?.data?.content?.dataType !== 'moveObject')\n return null;\n const incentiveAccountsTableId = (\n incentiveAccountsObject.data.content.fields as any\n ).accounts.fields.id.id;\n\n // Search in the table\n const bindedIncentiveAcc = await address.cache.queryGetDynamicFieldObject({\n parentId: incentiveAccountsTableId,\n name: {\n type: `${borrowIncentiveObjectId}::typed_id::TypedID<${corePkg}::obligation::Obligation>`,\n value: obligationId,\n },\n });\n\n if (bindedIncentiveAcc?.data?.content?.dataType !== 'moveObject') return null;\n const bindedIncentiveAccFields = bindedIncentiveAcc.data.content\n .fields as any;\n\n return (\n bindedIncentiveAccFields.value.fields.binded_ve_sca_key?.fields.id ?? null\n );\n};\n","import type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport {\n UNLOCK_ROUND_DURATION,\n MAX_LOCK_DURATION,\n MAX_LOCK_ROUNDS,\n MIN_INITIAL_LOCK_AMOUNT,\n MIN_TOP_UP_AMOUNT,\n} from '../constants';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\n\n/**\n * Check and get the sender from the transaction block.\n *\n * @param txBlock - TxBlock created by SuiKit.\n * @return Sender of transaction.\n */\nexport const requireSender = (txBlock: SuiKitTxBlock) => {\n const sender = txBlock.blockData.sender;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n\nexport const checkVesca = (prevUnlockAtInMillisTimestamp?: number) => {\n if (prevUnlockAtInMillisTimestamp === undefined) {\n throw new Error('veSca not found');\n }\n};\n\nexport const checkVescaExpired = (prevUnlockAtInMillisTimestamp: number) => {\n if (prevUnlockAtInMillisTimestamp <= new Date().getTime()) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n};\n\nexport const checkExtendLockPeriod = (\n lockPeriodInDays: number,\n newUnlockAtInSecondTimestamp: number,\n prevUnlockAtInMillisTimestamp?: number\n) => {\n checkVesca(prevUnlockAtInMillisTimestamp);\n checkVescaExpired(prevUnlockAtInMillisTimestamp!);\n const prevUnlockAtInSecondTimestamp = Math.floor(\n prevUnlockAtInMillisTimestamp! / 1000\n );\n if (lockPeriodInDays < 1) {\n throw new Error('Minimum lock period is 1 day');\n }\n\n const availableLockPeriodInDays = Math.floor(\n (newUnlockAtInSecondTimestamp - prevUnlockAtInSecondTimestamp) /\n UNLOCK_ROUND_DURATION\n );\n\n if (lockPeriodInDays > availableLockPeriodInDays) {\n throw new Error(\n `Cannot extend lock period by ${lockPeriodInDays} days, maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days), remaining lock period is ${\n MAX_LOCK_ROUNDS - availableLockPeriodInDays\n }`\n );\n }\n};\n\nexport const checkLockSca = (\n scaAmountOrCoin: number | SuiObjectArg | undefined,\n lockPeriodInDays?: number,\n newUnlockAtInSecondTimestamp?: number,\n prevUnlockAtInMillisTimestamp?: number\n) => {\n const prevUnlockAtInSecondTimestamp = prevUnlockAtInMillisTimestamp\n ? Math.floor(prevUnlockAtInMillisTimestamp / 1000)\n : undefined;\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired =\n !isInitialLock &&\n prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n\n // handle for initial lock / renewing expired veSca\n if (isInitialLock || isLockExpired) {\n if (scaAmountOrCoin !== undefined && lockPeriodInDays !== undefined) {\n if (lockPeriodInDays <= 0) {\n throw new Error('Lock period must be greater than 0');\n }\n if (\n typeof scaAmountOrCoin === 'number' &&\n scaAmountOrCoin < MIN_INITIAL_LOCK_AMOUNT\n ) {\n throw new Error(\n `Minimum lock amount for ${\n isLockExpired ? 'renewing expired veSca' : 'initial lock'\n } is 10 SCA`\n );\n }\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond > MAX_LOCK_DURATION) {\n throw new Error(\n `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days)`\n );\n }\n } else {\n throw new Error(\n `SCA amount and lock period is required for ${\n isLockExpired ? 'renewing expired veSca' : 'initial lock'\n }`\n );\n }\n } else {\n // handle for extending lock period / top up / both\n checkVesca(prevUnlockAtInMillisTimestamp);\n checkVescaExpired(prevUnlockAtInMillisTimestamp!);\n if (\n typeof scaAmountOrCoin === 'number' &&\n scaAmountOrCoin < MIN_TOP_UP_AMOUNT\n ) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n // for topup and extend lock period\n if (newUnlockAtInSecondTimestamp && lockPeriodInDays) {\n checkExtendLockPeriod(\n lockPeriodInDays,\n newUnlockAtInSecondTimestamp,\n prevUnlockAtInMillisTimestamp\n );\n }\n }\n};\n\nexport const checkExtendLockAmount = (\n scaAmount: number,\n prevUnlockAtInMillisTimestamp?: number\n) => {\n checkVesca(prevUnlockAtInMillisTimestamp);\n checkVescaExpired(prevUnlockAtInMillisTimestamp!);\n\n if (scaAmount < MIN_TOP_UP_AMOUNT) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n const isInitialLock = !prevUnlockAtInMillisTimestamp;\n const isLockExpired =\n !isInitialLock && prevUnlockAtInMillisTimestamp <= new Date().getTime();\n\n if (isLockExpired) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n};\n\nexport const checkRenewExpiredVeSca = (\n scaAmount: number,\n lockPeriodInDays: number,\n prevUnlockAtInMillisTimestamp?: number\n) => {\n if (\n !prevUnlockAtInMillisTimestamp ||\n prevUnlockAtInMillisTimestamp > new Date().getTime()\n ) {\n throw new Error('Renew method can only be used for expired veSca');\n }\n\n if (scaAmount < MIN_INITIAL_LOCK_AMOUNT) {\n throw new Error('Minimum lock amount for renewing expired vesca 10 SCA');\n }\n\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond >= MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(\n `Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`\n );\n }\n};\n","import BigNumber from 'bignumber.js';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui/utils';\nimport type { ScallopUtils } from '../models';\nimport type {\n OriginMarketPoolData,\n ParsedMarketPoolData,\n CalculatedMarketPoolData,\n OriginMarketCollateralData,\n ParsedMarketCollateralData,\n CalculatedMarketCollateralData,\n OriginSpoolData,\n ParsedSpoolData,\n CalculatedSpoolData,\n OriginSpoolRewardPoolData,\n ParsedSpoolRewardPoolData,\n CalculatedSpoolRewardPoolData,\n OriginBorrowIncentivePoolData,\n ParsedBorrowIncentivePoolData,\n OriginBorrowIncentiveAccountData,\n ParsedBorrowIncentiveAccountData,\n SupportPoolCoins,\n SupportCollateralCoins,\n OriginBorrowIncentivePoolPointData,\n ParsedBorrowIncentivePoolPointData,\n CalculatedBorrowIncentivePoolPointData,\n OriginBorrowIncentiveAccountPoolData,\n ParsedBorrowIncentiveAccountPoolData,\n SupportBorrowIncentiveRewardCoins,\n} from '../types';\n\n/**\n * Parse origin market pool data to a more readable format.\n *\n * @param originMarketPoolData - Origin market pool data\n * @return Parsed market pool data\n */\nexport const parseOriginMarketPoolData = (\n originMarketPoolData: OriginMarketPoolData\n): ParsedMarketPoolData => {\n return {\n coinType: normalizeStructTag(originMarketPoolData.type.name),\n // Parse origin data required for basic calculations.\n maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,\n borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,\n borrowRateScale: Number(originMarketPoolData.interestRateScale),\n borrowIndex: Number(originMarketPoolData.borrowIndex),\n lastUpdated: Number(originMarketPoolData.lastUpdated),\n cashAmount: Number(originMarketPoolData.cash),\n debtAmount: Number(originMarketPoolData.debt),\n marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),\n reserveAmount: Number(originMarketPoolData.reserve),\n reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,\n borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,\n borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,\n // Parse origin data required for additional display.\n baseBorrowRate:\n Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,\n borrowRateOnHighKink:\n Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,\n borrowRateOnMidKink:\n Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,\n highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,\n midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,\n minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),\n isIsolated: originMarketPoolData.isIsolated,\n supplyLimit: Number(originMarketPoolData.supplyLimit),\n borrowLimit: Number(originMarketPoolData.borrowLimit),\n };\n};\n\nexport const calculateMarketPoolData = (\n utils: ScallopUtils,\n parsedMarketPoolData: ParsedMarketPoolData\n): CalculatedMarketPoolData => {\n const poolCoinName = utils.parseCoinNameFromType<SupportPoolCoins>(\n parsedMarketPoolData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(poolCoinName);\n\n const borrowYearFactor = 24 * 365 * 3600;\n\n const baseBorrowApr =\n (parsedMarketPoolData.baseBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnHighKink =\n (parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnMidKink =\n (parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const maxBorrowApr =\n (parsedMarketPoolData.maxBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowApr =\n (parsedMarketPoolData.borrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n\n const timeDelta =\n Math.floor(new Date().getTime() / 1000) - parsedMarketPoolData.lastUpdated;\n const borrowIndexDelta = BigNumber(parsedMarketPoolData.borrowIndex)\n .multipliedBy(\n BigNumber(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate)\n )\n .dividedBy(parsedMarketPoolData.borrowRateScale);\n const currentBorrowIndex = BigNumber(parsedMarketPoolData.borrowIndex).plus(\n borrowIndexDelta\n );\n // How much accumulated interest since `lastUpdate`.\n const growthInterest = BigNumber(currentBorrowIndex)\n .dividedBy(parsedMarketPoolData.borrowIndex)\n .minus(1);\n const increasedDebtAmount = BigNumber(\n parsedMarketPoolData.debtAmount\n ).multipliedBy(growthInterest);\n const borrowAmount = increasedDebtAmount.plus(\n parsedMarketPoolData.debtAmount\n );\n const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);\n const reserveAmount = BigNumber(parsedMarketPoolData.reserveAmount).plus(\n increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor)\n );\n const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);\n const supplyAmount = BigNumber(borrowAmount).plus(\n Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0)\n );\n const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);\n let utilizationRate = BigNumber(borrowAmount).dividedBy(supplyAmount);\n utilizationRate = utilizationRate.isFinite() ? utilizationRate : BigNumber(0);\n let supplyApr = BigNumber(borrowApr)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - parsedMarketPoolData.reserveFactor);\n supplyApr = supplyApr.isFinite() ? supplyApr : BigNumber(0);\n let conversionRate = supplyAmount.dividedBy(\n parsedMarketPoolData.marketCoinSupplyAmount\n );\n conversionRate =\n conversionRate.isFinite() && !conversionRate.isNaN()\n ? conversionRate\n : BigNumber(1);\n\n return {\n baseBorrowApr,\n baseBorrowApy: utils.parseAprToApy(baseBorrowApr),\n borrowAprOnHighKink,\n borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),\n borrowAprOnMidKink,\n borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),\n coinDecimal,\n maxBorrowApr,\n maxBorrowApy: utils.parseAprToApy(maxBorrowApr),\n borrowApr: Math.min(borrowApr, maxBorrowApr),\n borrowApy: Math.min(\n utils.parseAprToApy(borrowApr),\n utils.parseAprToApy(maxBorrowApr)\n ),\n borrowIndex: currentBorrowIndex.toNumber(),\n growthInterest: growthInterest.toNumber(),\n supplyAmount: supplyAmount.toNumber(),\n supplyCoin: supplyCoin.toNumber(),\n borrowAmount: borrowAmount.toNumber(),\n borrowCoin: borrowCoin.toNumber(),\n reserveAmount: reserveAmount.toNumber(),\n reserveCoin: reserveCoin.toNumber(),\n utilizationRate: utilizationRate.toNumber(),\n supplyApr: supplyApr.toNumber(),\n supplyApy: utils.parseAprToApy(supplyApr.toNumber()),\n conversionRate: conversionRate.toNumber(),\n isIsolated: parsedMarketPoolData.isIsolated,\n maxSupplyCoin: BigNumber(parsedMarketPoolData.supplyLimit)\n .shiftedBy(-coinDecimal)\n .toNumber(),\n maxBorrowCoin: BigNumber(parsedMarketPoolData.borrowLimit)\n .shiftedBy(-coinDecimal)\n .toNumber(),\n };\n};\n\n/**\n * Parse origin market collateral data to a more readable format.\n *\n * @param originMarketCollateralData - Origin market collateral data\n * @return Parsed market collateral data\n */\nexport const parseOriginMarketCollateralData = (\n originMarketCollateralData: OriginMarketCollateralData\n): ParsedMarketCollateralData => {\n const divisor = 2 ** 32;\n return {\n coinType: normalizeStructTag(originMarketCollateralData.type.name),\n isIsolated: originMarketCollateralData.isIsolated,\n collateralFactor:\n Number(originMarketCollateralData.collateralFactor.value) / divisor,\n liquidationFactor:\n Number(originMarketCollateralData.liquidationFactor.value) / divisor,\n liquidationDiscount:\n Number(originMarketCollateralData.liquidationDiscount.value) / divisor,\n liquidationPenalty:\n Number(originMarketCollateralData.liquidationPenalty.value) / divisor,\n liquidationReserveFactor:\n Number(originMarketCollateralData.liquidationReserveFactor.value) /\n divisor,\n maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),\n totalCollateralAmount: Number(\n originMarketCollateralData.totalCollateralAmount\n ),\n };\n};\n\nexport const calculateMarketCollateralData = (\n utils: ScallopUtils,\n parsedMarketCollateralData: ParsedMarketCollateralData\n): CalculatedMarketCollateralData => {\n const collateralCoinName =\n utils.parseCoinNameFromType<SupportCollateralCoins>(\n parsedMarketCollateralData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(collateralCoinName);\n\n const maxCollateralCoin = BigNumber(\n parsedMarketCollateralData.maxCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n const depositCoin = BigNumber(\n parsedMarketCollateralData.totalCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n\n return {\n coinDecimal,\n isIsolated: parsedMarketCollateralData.isIsolated,\n maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,\n maxDepositCoin: maxCollateralCoin.toNumber(),\n depositAmount: parsedMarketCollateralData.totalCollateralAmount,\n depositCoin: depositCoin.toNumber(),\n };\n};\n\n/**\n * Parse origin spool data to a more readable format.\n *\n * @param originSpoolData - Origin spool data\n * @return Parsed spool data\n */\nexport const parseOriginSpoolData = (\n originSpoolData: OriginSpoolData\n): ParsedSpoolData => {\n return {\n stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),\n maxPoint: Number(originSpoolData.maxDistributedPoint),\n distributedPoint: Number(originSpoolData.distributedPoint),\n pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),\n period: Number(originSpoolData.pointDistributionTime),\n maxStake: Number(originSpoolData.maxStake),\n staked: Number(originSpoolData.stakes),\n index: Number(originSpoolData.index),\n createdAt: Number(originSpoolData.createdAt),\n lastUpdate: Number(originSpoolData.lastUpdate),\n };\n};\n\nexport const calculateSpoolData = (\n parsedSpoolData: ParsedSpoolData,\n stakeMarketCoinPrice: number,\n stakeMarketCoinDecimal: number\n): CalculatedSpoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedSpoolData.pointPerPeriod\n ).dividedBy(parsedSpoolData.period);\n\n const pointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(\n parsedSpoolData.period\n );\n const remainingPeriod = pointPerSec.gt(0)\n ? BigNumber(parsedSpoolData.maxPoint)\n .minus(parsedSpoolData.distributedPoint)\n .dividedBy(pointPerSec)\n : BigNumber(0);\n const startDate = parsedSpoolData.createdAt;\n const endDate = remainingPeriod\n .plus(parsedSpoolData.lastUpdate)\n .integerValue()\n .toNumber();\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) - parsedSpoolData.lastUpdate\n )\n .dividedBy(parsedSpoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(parsedSpoolData.maxPoint).minus(\n parsedSpoolData.distributedPoint\n );\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),\n remainingPoints\n );\n\n const currentPointIndex = BigNumber(parsedSpoolData.index).plus(\n accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedSpoolData.staked)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedSpoolData.distributedPoint\n ).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedSpoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin spool reward pool data to a more readable format.\n *\n * @param originRewardPoolData - Origin reward pool data\n * @return Parsed spool reward pool data\n */\nexport const parseOriginSpoolRewardPoolData = (\n originSpoolRewardPoolData: OriginSpoolRewardPoolData\n): ParsedSpoolRewardPoolData => {\n return {\n claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),\n exchangeRateDenominator: Number(\n originSpoolRewardPoolData.exchange_rate_denominator\n ),\n exchangeRateNumerator: Number(\n originSpoolRewardPoolData.exchange_rate_numerator\n ),\n rewards: Number(originSpoolRewardPoolData.rewards),\n spoolId: String(originSpoolRewardPoolData.spool_id),\n };\n};\n\nexport const calculateSpoolRewardPoolData = (\n parsedSpoolData: ParsedSpoolData,\n parsedSpoolRewardPoolData: ParsedSpoolRewardPoolData,\n calculatedSpoolData: CalculatedSpoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number\n): CalculatedSpoolRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(calculatedSpoolData.distributedPointPerSec)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedSpoolData.maxPoint)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(parsedSpoolRewardPoolData.rewards);\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(\n parsedSpoolRewardPoolData.claimedRewards\n );\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n\n let rewardRate = rewardValueForYear\n .dividedBy(calculatedSpoolData.stakedValue)\n .isFinite()\n ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber()\n : Infinity;\n\n if (\n parsedSpoolData.maxPoint <= parsedSpoolData.distributedPoint ||\n parsedSpoolData.pointPerPeriod === 0\n ) {\n rewardRate = Infinity;\n }\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n };\n};\n\nexport const parseOriginBorrowIncentivesPoolPointData = (\n originBorrowIncentivePoolPointData: OriginBorrowIncentivePoolPointData\n): ParsedBorrowIncentivePoolPointData => {\n return {\n pointType: normalizeStructTag(\n originBorrowIncentivePoolPointData.point_type.name\n ),\n distributedPointPerPeriod: Number(\n originBorrowIncentivePoolPointData.distributed_point_per_period\n ),\n period: Number(originBorrowIncentivePoolPointData.point_distribution_time),\n distributedPoint: Number(\n originBorrowIncentivePoolPointData.distributed_point\n ),\n points: Number(originBorrowIncentivePoolPointData.points),\n index: Number(originBorrowIncentivePoolPointData.index),\n baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),\n weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),\n lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),\n createdAt: Number(originBorrowIncentivePoolPointData.created_at),\n };\n};\n\n/**\n * Parse origin borrow incentive pool data to a more readable format.\n *\n * @param originBorrowIncentivePoolData - Origin borrow incentive pool data\n * @return Parsed borrow incentive pool data\n */\nexport const parseOriginBorrowIncentivePoolData = (\n utils: ScallopUtils,\n originBorrowIncentivePoolData: OriginBorrowIncentivePoolData\n): ParsedBorrowIncentivePoolData => {\n return {\n poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),\n minStakes: Number(originBorrowIncentivePoolData.min_stakes),\n maxStakes: Number(originBorrowIncentivePoolData.max_stakes),\n staked: Number(originBorrowIncentivePoolData.stakes),\n poolPoints: originBorrowIncentivePoolData.points.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentivesPoolPointData(point);\n const name = utils.parseSCoinTypeNameToMarketCoinName(\n parseStructTag(parsed.pointType).name.toLowerCase()\n ) as SupportBorrowIncentiveRewardCoins;\n\n acc[name] = parsed;\n return acc;\n },\n {} as Record<\n SupportBorrowIncentiveRewardCoins,\n ParsedBorrowIncentivePoolPointData\n >\n ),\n };\n};\n\nexport const calculateBorrowIncentivePoolPointData = (\n // parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,\n parsedBorrowIncentivePoolPointData: ParsedBorrowIncentivePoolPointData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number,\n poolCoinPrice: number,\n poolCoinDecimal: number\n): CalculatedBorrowIncentivePoolPointData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedBorrowIncentivePoolPointData.distributedPointPerPeriod\n ).dividedBy(parsedBorrowIncentivePoolPointData.period);\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) -\n parsedBorrowIncentivePoolPointData.lastUpdate\n )\n .dividedBy(parsedBorrowIncentivePoolPointData.period)\n .toFixed(0);\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(\n parsedBorrowIncentivePoolPointData.distributedPointPerPeriod\n ),\n BigNumber(parsedBorrowIncentivePoolPointData.points)\n );\n\n const currentPointIndex = BigNumber(\n parsedBorrowIncentivePoolPointData.index\n ).plus(\n accumulatedPoints\n .dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount)\n .isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedBorrowIncentivePoolPointData.weightedAmount)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedBorrowIncentivePoolPointData.distributedPoint\n ).plus(accumulatedPoints);\n\n const baseWeight = BigNumber(parsedBorrowIncentivePoolPointData.baseWeight);\n\n // staked amount applied with weight\n const weightedStakedAmount = BigNumber(\n parsedBorrowIncentivePoolPointData.weightedAmount\n );\n\n const weightedStakedCoin = weightedStakedAmount.shiftedBy(\n -1 * poolCoinDecimal\n );\n const weightedStakedValue = weightedStakedCoin.multipliedBy(poolCoinPrice);\n\n // Calculate the reward rate\n const rateYearFactor = 365 * 24 * 60 * 60;\n const rewardPerSec = BigNumber(distributedPointPerSec).shiftedBy(\n -1 * rewardCoinDecimal\n );\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n\n const weightScale = BigNumber(1_000_000_000_000);\n\n const rewardRate =\n rewardValueForYear\n .multipliedBy(\n BigNumber(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(\n weightScale\n )\n )\n .dividedBy(weightedStakedValue)\n .isFinite() && parsedBorrowIncentivePoolPointData.points > 0\n ? rewardValueForYear\n .multipliedBy(\n BigNumber(parsedBorrowIncentivePoolPointData.baseWeight).dividedBy(\n weightScale\n )\n )\n .dividedBy(weightedStakedValue)\n .toNumber()\n : Infinity;\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n baseWeight: baseWeight.toNumber(),\n weightedStakedAmount: weightedStakedAmount.toNumber(),\n weightedStakedCoin: weightedStakedCoin.toNumber(),\n weightedStakedValue: weightedStakedValue.toNumber(),\n rewardApr: rewardRate,\n rewardPerSec: rewardPerSec.toNumber(),\n };\n};\n\nexport const parseOriginBorrowIncentiveAccountPoolPointData = (\n originBorrowIncentiveAccountPoolPointData: OriginBorrowIncentiveAccountPoolData\n): ParsedBorrowIncentiveAccountPoolData => {\n return {\n pointType: normalizeStructTag(\n originBorrowIncentiveAccountPoolPointData.point_type.name\n ),\n weightedAmount: Number(\n originBorrowIncentiveAccountPoolPointData.weighted_amount\n ),\n points: Number(originBorrowIncentiveAccountPoolPointData.points),\n totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),\n index: Number(originBorrowIncentiveAccountPoolPointData.index),\n };\n};\n\n/**\n * Parse origin borrow incentive account data to a more readable format.\n *\n * @param originBorrowIncentiveAccountData - Origin borrow incentive account data\n * @return Parsed borrow incentive account data\n */\nexport const parseOriginBorrowIncentiveAccountData = (\n originBorrowIncentiveAccountData: OriginBorrowIncentiveAccountData\n): ParsedBorrowIncentiveAccountData => {\n return {\n poolType: normalizeStructTag(\n originBorrowIncentiveAccountData.pool_type.name\n ),\n debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),\n pointList: originBorrowIncentiveAccountData.points_list.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);\n const name = parseStructTag(\n parsed.pointType\n ).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;\n acc[name] = parsed;\n return acc;\n },\n {} as Record<\n SupportBorrowIncentiveRewardCoins,\n ParsedBorrowIncentiveAccountPoolData\n >\n ),\n };\n};\n\nexport const minBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((min, current) =>\n new BigNumber(current).lt(min) ? current : min\n )\n );\n};\n\nexport const maxBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((max, current) =>\n new BigNumber(current).gt(max) ? current : max\n )\n );\n};\n\n/**\n * Dynamically adjust the decrease or increase ratio according to the amount\n * @param amount - The amount required to calculate factor.\n * @param scaleStep - The scale step required to determine the factor..\n * @param type - The type of the calculation.\n * @return The estimated factor\n * */\nexport const estimatedFactor = (\n amount: number,\n scaleStep: number,\n type: 'increase' | 'decrease'\n) => {\n const amountOfDigits = Math.max(\n 1,\n Math.floor(Math.log10(Math.abs(amount)) + 1)\n );\n\n const adjustScale =\n Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;\n\n let adjustFactor = Math.pow(10, -adjustScale);\n adjustFactor = type === 'increase' ? 1 - adjustFactor : 1 + adjustFactor;\n\n return adjustFactor;\n};\n","import type { PriceFeed } from '@pythnetwork/pyth-sui-js';\nimport {\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n SUPPORT_SPOOLS_REWARDS,\n MAX_LOCK_DURATION,\n SUPPORT_BORROW_INCENTIVE_REWARDS,\n SUPPORT_SCOIN,\n SUPPORT_SUI_BRIDGE,\n SUPPORT_WORMHOLE,\n} from '../constants';\nimport type { ScallopAddress } from '../models';\nimport type {\n SupportAssetCoins,\n SupportCoins,\n SupportMarketCoins,\n SupportSCoin,\n SupportSuiBridgeCoins,\n SupportWormholeCoins,\n} from '../types';\n\nconst COIN_SET = Array.from(\n new Set([\n ...SUPPORT_POOLS,\n ...SUPPORT_COLLATERALS,\n ...SUPPORT_SPOOLS_REWARDS,\n ...SUPPORT_BORROW_INCENTIVE_REWARDS,\n ...SUPPORT_SCOIN,\n ])\n);\n\nexport const isMarketCoin = (\n coinName: SupportCoins\n): coinName is SupportMarketCoins | SupportSCoin => {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return (\n coinName.charAt(0).toLowerCase() === 's' && COIN_SET.includes(assetCoinName)\n );\n};\n\nexport const isSuiBridgeAsset = (\n coinName: any\n): coinName is SupportSuiBridgeCoins => {\n return SUPPORT_SUI_BRIDGE.includes(coinName);\n};\n\nexport const isWormholeAsset = (\n coinName: any\n): coinName is SupportWormholeCoins => {\n return SUPPORT_WORMHOLE.includes(coinName);\n};\n\nexport const parseAssetSymbol = (coinName: SupportCoins): string => {\n if (isWormholeAsset(coinName)) {\n return `w${coinName.slice(1).toUpperCase()}`;\n }\n if (isSuiBridgeAsset(coinName)) {\n if (coinName.startsWith('sbw') && coinName.length > 3) {\n return `sbw${coinName.slice(3).toUpperCase()}`;\n }\n return `sb${coinName.slice(2).toUpperCase()}`;\n }\n if (isMarketCoin(coinName)) {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName);\n }\n switch (coinName) {\n case 'afsui':\n return 'afSUI';\n case 'hasui':\n return 'haSUI';\n case 'vsui':\n return 'vSUI';\n default:\n return coinName.toUpperCase();\n }\n};\n\n/**\n * Parse price from pyth price feed.\n *\n * @param feed - Price feed object from pyth.\n * @param address - Scallop address instance.\n * @return Price Data inclue coin name, price, and publish time.\n */\nexport const parseDataFromPythPriceFeed = (\n feed: PriceFeed,\n address: ScallopAddress\n) => {\n const assetCoinNames = COIN_SET as SupportAssetCoins[];\n const assetCoinName = assetCoinNames.find((assetCoinName) => {\n return (\n address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`) === feed.id\n );\n });\n if (assetCoinName) {\n const price = feed.price.price * 10 ** feed.price.expo;\n\n return {\n coinName: assetCoinName,\n price,\n publishTime: Number(feed.price.publishTime) * 10 ** 3,\n };\n } else {\n throw new Error(`Invalid feed id: ${feed.id}`);\n }\n};\n\n/**\n * Find the closest unlock round timestamp (12AM) to the given unlock at timestamp in seconds.\n *\n * @param unlockAtInSecondTimestamp - Unlock at in seconds timestamp to find the closest round.\n * @returns Closest round (12AM) in seconds timestamp.\n */\nexport const findClosestUnlockRound = (unlockAtInSecondTimestamp: number) => {\n const unlockDate = new Date(unlockAtInSecondTimestamp * 1000);\n const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1000);\n\n closestTwelveAM.setUTCHours(0, 0, 0, 0); // Set the time to the next 12 AM UTC\n\n // If the current time is past 12 AM, set the date to the next day\n if (unlockDate.getUTCHours() >= 0) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);\n }\n\n const now = new Date().getTime();\n // check if unlock period > 4 years\n if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1000) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);\n }\n return Math.floor(closestTwelveAM.getTime() / 1000);\n};\n\nexport const partitionArray = <T>(array: T[], chunkSize: number) => {\n const result: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n return result;\n};\n","/**\n * Generic wrapper for methods with indexer fallback.\n *\n * @param method - The method to call with fallback behavior.\n * @param context - The context (`this`) of the class instance.\n * @param args - The arguments to pass to the method.\n * @returns The result of the method call.\n */\nexport async function callMethodWithIndexerFallback(\n method: Function,\n context: any,\n ...args: any[]\n) {\n const lastArgs = args[args.length - 1]; // Assume last argument is always `indexer`\n\n if (typeof lastArgs === 'object' && lastArgs.indexer) {\n try {\n return await method.apply(context, args);\n } catch (e: any) {\n console.warn(\n `Indexer requests failed: ${e.message}. Retrying without indexer..`\n );\n return await method.apply(context, [\n ...args.slice(0, -1),\n {\n ...lastArgs,\n indexer: false,\n },\n ]);\n }\n }\n return await method.apply(context, args);\n}\n\n/**\n * This function creates a wrapper for methods that have an indexer parameter.\n * It ensures fallback behavior if indexer fails.\n *\n * @param method - The method to wrap.\n * @returns A function that applies indexer fallback.\n */\nexport function withIndexerFallback(method: Function) {\n return (...args: any[]) => {\n // @ts-ignore\n return callMethodWithIndexerFallback(method, this, ...args); // Preserve `this` with arrow function\n };\n}\n","import { SuiObjectData } from '@mysten/sui/client';\n\nexport const parseObjectAs = <T>(object: SuiObjectData): T => {\n if (!(object && object.content && 'fields' in object.content))\n throw new Error(`Failed to parse object`);\n\n const fields = object.content.fields as any;\n\n if (typeof fields === 'object' && 'value' in fields) {\n const value = fields.value;\n if (typeof value === 'object' && 'fields' in value)\n return value.fields as T;\n return value as T;\n } else if (typeof fields === 'object') {\n return fields as T;\n }\n return fields as T;\n};\n","import { normalizeStructTag, SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n SUPPORT_POOLS,\n PROTOCOL_OBJECT_ID,\n SUPPORT_COLLATERALS,\n FlashLoanFeeObjectMap,\n POOL_ADDRESSES,\n} from '../constants';\nimport {\n parseOriginMarketPoolData,\n calculateMarketPoolData,\n parseOriginMarketCollateralData,\n calculateMarketCollateralData,\n parseObjectAs,\n} from '../utils';\nimport type {\n SuiObjectResponse,\n SuiObjectData,\n SuiParsedData,\n} from '@mysten/sui/client';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\nimport type { ScallopAddress, ScallopCache, ScallopQuery } from '../models';\nimport {\n Market,\n MarketPools,\n MarketPool,\n MarketCollaterals,\n MarketCollateral,\n MarketQueryInterface,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n ObligationQueryInterface,\n Obligation,\n InterestModel,\n BalanceSheet,\n RiskModel,\n CollateralStat,\n SupportMarketCoins,\n OptionalKeys,\n CoinPrices,\n OriginMarketPoolData,\n BorrowFee,\n BorrowDynamic,\n OriginMarketCollateralData,\n} from '../types';\nimport BigNumber from 'bignumber.js';\nimport { getSupplyLimit } from './supplyLimitQuery';\nimport { isIsolatedAsset } from './isolatedAssetQuery';\nimport { getBorrowLimit } from './borrowLimitQuery';\nimport { queryMultipleObjects } from './objectsQuery';\n\n/**\n * Query market data.\n *\n * @deprecated Use query market pools\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param indexer - Whether to use indexer.\n * @return Market data.\n */\nexport const queryMarket = async (\n query: ScallopQuery,\n indexer: boolean = false,\n coinPrices?: CoinPrices\n) => {\n coinPrices = coinPrices ?? (await query.utils.getCoinPrices()) ?? {};\n\n const pools: MarketPools = {};\n const collaterals: MarketCollaterals = {};\n\n if (indexer) {\n const marketIndexer = await query.indexer.getMarket();\n\n const updatePools = (item: MarketPool) => {\n item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;\n item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);\n pools[item.coinName] = item;\n };\n\n const updateCollaterals = (item: MarketCollateral) => {\n item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;\n item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);\n collaterals[item.coinName] = item;\n };\n\n Object.values(marketIndexer.pools).forEach(updatePools);\n Object.values(marketIndexer.collaterals).forEach(updateCollaterals);\n\n return {\n pools,\n collaterals,\n };\n }\n\n const packageId = query.address.get('core.packages.query.id');\n const marketId = query.address.get('core.market');\n const queryTarget = `${packageId}::market_query::market_data`;\n const args = [marketId];\n\n const queryResult = await query.cache.queryInspectTxn({ queryTarget, args });\n const marketData = queryResult?.events[0]?.parsedJson as\n | MarketQueryInterface\n | undefined;\n\n for (const pool of marketData?.pools ?? []) {\n const coinType = normalizeStructTag(pool.type.name);\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportPoolCoins>(coinType);\n const coinPrice = coinPrices[poolCoinName] ?? 0;\n\n // Filter pools not yet supported by the SDK.\n if (!SUPPORT_POOLS.includes(poolCoinName)) {\n continue;\n }\n\n const parsedMarketPoolData = parseOriginMarketPoolData({\n type: pool.type,\n maxBorrowRate: pool.maxBorrowRate,\n interestRate: pool.interestRate,\n interestRateScale: pool.interestRateScale,\n borrowIndex: pool.borrowIndex,\n lastUpdated: pool.lastUpdated,\n cash: pool.cash,\n debt: pool.debt,\n marketCoinSupply: pool.marketCoinSupply,\n reserve: pool.reserve,\n reserveFactor: pool.reserveFactor,\n borrowWeight: pool.borrowWeight,\n borrowFeeRate: pool.borrowFeeRate,\n baseBorrowRatePerSec: pool.baseBorrowRatePerSec,\n borrowRateOnHighKink: pool.borrowRateOnHighKink,\n borrowRateOnMidKink: pool.borrowRateOnMidKink,\n highKink: pool.highKink,\n midKink: pool.midKink,\n minBorrowAmount: pool.minBorrowAmount,\n isIsolated: await isIsolatedAsset(query.utils, poolCoinName),\n supplyLimit: (await getSupplyLimit(query.utils, poolCoinName)) ?? '0',\n borrowLimit: (await getBorrowLimit(query.utils, poolCoinName)) ?? '0',\n });\n\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n\n pools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n sCoinType: query.utils.parseSCoinType(\n query.utils.parseMarketCoinName(poolCoinName)\n ),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinPrice: coinPrice,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n };\n }\n\n for (const collateral of marketData?.collaterals ?? []) {\n const coinType = normalizeStructTag(collateral.type.name);\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(coinType);\n const coinPrice = coinPrices[collateralCoinName] ?? 0;\n\n // Filter collaterals not yet supported by the SDK.\n if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {\n continue;\n }\n\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: collateral.type,\n collateralFactor: collateral.collateralFactor,\n liquidationFactor: collateral.liquidationFactor,\n liquidationDiscount: collateral.liquidationDiscount,\n liquidationPenalty: collateral.liquidationPanelty,\n liquidationReserveFactor: collateral.liquidationReserveFactor,\n maxCollateralAmount: collateral.maxCollateralAmount,\n totalCollateralAmount: collateral.totalCollateralAmount,\n isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n collaterals[collateralCoinName] = {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinPrice: coinPrice,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPenalty: parsedMarketCollateralData.liquidationPenalty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n\n ...calculatedMarketCollateralData,\n };\n }\n\n return {\n pools,\n collaterals,\n // data: marketData,\n } as Market;\n};\n\nconst queryRequiredMarketObjects = async (\n query: ScallopQuery,\n poolCoinNames: SupportPoolCoins[]\n) => {\n // Prepare all tasks for querying each object type\n const tasks = poolCoinNames.map((t) => ({\n poolCoinName: t,\n balanceSheet: POOL_ADDRESSES[t]?.lendingPoolAddress,\n collateralStat: POOL_ADDRESSES[t]?.collateralPoolAddress,\n borrowDynamic: POOL_ADDRESSES[t]?.borrowDynamic,\n interestModel: POOL_ADDRESSES[t]?.interestModel,\n riskModel: POOL_ADDRESSES[t]?.riskModel,\n borrowFeeKey: POOL_ADDRESSES[t]?.borrowFeeKey,\n supplyLimitKey: POOL_ADDRESSES[t]?.supplyLimitKey,\n borrowLimitKey: POOL_ADDRESSES[t]?.borrowLimitKey,\n isolatedAssetKey: POOL_ADDRESSES[t]?.isolatedAssetKey,\n }));\n\n // Query all objects for each key in parallel\n const [\n balanceSheetObjects,\n collateralStatObjects,\n borrowDynamicObjects,\n interestModelObjects,\n riskModelObjects,\n borrowFeeObjects,\n supplyLimitObjects,\n borrowLimitObjects,\n isolatedAssetObjects,\n ] = await Promise.all([\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.balanceSheet).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.collateralStat).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.borrowDynamic).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.interestModel).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.riskModel).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.borrowFeeKey).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.supplyLimitKey).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.borrowLimitKey).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.isolatedAssetKey).filter((t): t is string => !!t)\n ),\n ]);\n\n // Map the results back to poolCoinNames\n const mapObjects = (\n tasks: { poolCoinName: string; [key: string]: string | undefined }[],\n fetchedObjects: SuiObjectData[],\n keyValue: string\n ) => {\n const resultMap: Record<string, SuiObjectData> = {};\n const fetchedObjectMap = fetchedObjects.reduce(\n (acc, obj) => {\n acc[obj.objectId] = obj;\n return acc;\n },\n {} as Record<string, SuiObjectData>\n );\n\n for (const task of tasks) {\n if (task[keyValue]) {\n resultMap[task.poolCoinName] = fetchedObjectMap[task[keyValue]];\n }\n }\n return resultMap;\n };\n\n const balanceSheetMap = mapObjects(\n tasks,\n balanceSheetObjects,\n 'balanceSheet'\n );\n const collateralStatMap = mapObjects(\n tasks,\n collateralStatObjects,\n 'collateralStat'\n );\n const borrowDynamicMap = mapObjects(\n tasks,\n borrowDynamicObjects,\n 'borrowDynamic'\n );\n const interestModelMap = mapObjects(\n tasks,\n interestModelObjects,\n 'interestModel'\n );\n const riskModelMap = mapObjects(tasks, riskModelObjects, 'riskModel');\n const borrowFeeMap = mapObjects(tasks, borrowFeeObjects, 'borrowFeeKey');\n const supplyLimitMap = mapObjects(\n tasks,\n supplyLimitObjects,\n 'supplyLimitKey'\n );\n const borrowLimitMap = mapObjects(\n tasks,\n borrowLimitObjects,\n 'borrowLimitKey'\n );\n const isolatedAssetMap = mapObjects(\n tasks,\n isolatedAssetObjects,\n 'isolatedAssetKey'\n );\n // Construct the final requiredObjects result\n const result = poolCoinNames.reduce(\n (acc, name) => {\n acc[name] = {\n balanceSheet: balanceSheetMap[name],\n collateralStat: collateralStatMap[name],\n borrowDynamic: borrowDynamicMap[name],\n interestModel: interestModelMap[name],\n riskModel: riskModelMap[name],\n borrowFeeKey: borrowFeeMap[name],\n supplyLimitKey: supplyLimitMap[name],\n borrowLimitKey: borrowLimitMap[name],\n isolatedAssetKey: isolatedAssetMap[name],\n };\n return acc;\n },\n {} as Record<\n SupportPoolCoins,\n {\n balanceSheet: SuiObjectData;\n collateralStat?: SuiObjectData;\n riskModel?: SuiObjectData;\n borrowDynamic: SuiObjectData;\n interestModel: SuiObjectData;\n borrowFeeKey: SuiObjectData;\n supplyLimitKey: SuiObjectData;\n borrowLimitKey: SuiObjectData;\n isolatedAssetKey: SuiObjectData;\n }\n >\n );\n\n return result;\n};\n\n/**\n * Get coin market pools data.\n *\n * @description\n * To obtain all market pools information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param coinNames - Specific an array of support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pools data.\n */\nexport const getMarketPools = async (\n query: ScallopQuery,\n poolCoinNames: SupportPoolCoins[],\n indexer: boolean = false,\n coinPrices?: CoinPrices\n): Promise<{\n pools: MarketPools;\n collaterals: MarketCollaterals;\n}> => {\n coinPrices = coinPrices ?? (await query.utils.getCoinPrices());\n\n const pools: MarketPools = {};\n const collaterals: MarketCollaterals = {};\n\n if (indexer) {\n // const marketPoolsIndexer = await query.indexer.getMarketPools();\n\n // const updateMarketPool = (marketPool: MarketPool) => {\n // if (!poolCoinNames.includes(marketPool.coinName)) return;\n // marketPool.coinPrice =\n // coinPrices[marketPool.coinName] ?? marketPool.coinPrice;\n // marketPool.coinWrappedType = query.utils.getCoinWrappedType(\n // marketPool.coinName\n // );\n // pools[marketPool.coinName] = marketPool;\n // };\n\n // Object.values(marketPoolsIndexer).forEach(updateMarketPool);\n\n // return pools;\n const marketIndexer = await query.indexer.getMarket();\n\n const updatePools = (item: MarketPool) => {\n item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;\n item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);\n pools[item.coinName] = item;\n };\n\n const updateCollaterals = (item: MarketCollateral) => {\n item.coinPrice = coinPrices[item.coinName] ?? item.coinPrice;\n item.coinWrappedType = query.utils.getCoinWrappedType(item.coinName);\n collaterals[item.coinName] = item;\n };\n\n Object.values(marketIndexer.pools).forEach(updatePools);\n Object.values(marketIndexer.collaterals).forEach(updateCollaterals);\n\n return {\n pools,\n collaterals,\n };\n }\n\n const requiredObjects = await queryRequiredMarketObjects(\n query,\n poolCoinNames\n );\n\n await Promise.allSettled(\n poolCoinNames.map(async (poolCoinName) => {\n try {\n const result = await getMarketPool(\n query,\n poolCoinName,\n indexer,\n coinPrices?.[poolCoinName] ?? 0,\n requiredObjects[poolCoinName]\n );\n if (result?.marketPool) {\n pools[poolCoinName] = result?.marketPool;\n }\n if (result?.collateral) {\n collaterals[poolCoinName as SupportCollateralCoins] =\n result.collateral;\n }\n } catch (e) {\n console.error(e);\n }\n })\n );\n\n return {\n pools,\n collaterals,\n };\n};\n\nconst parseMarketPoolObjects = ({\n balanceSheet,\n borrowDynamic,\n collateralStat,\n interestModel,\n riskModel,\n borrowFeeKey,\n supplyLimitKey,\n borrowLimitKey,\n isolatedAssetKey,\n}: {\n balanceSheet: SuiObjectData;\n borrowDynamic: SuiObjectData;\n collateralStat?: SuiObjectData;\n interestModel: SuiObjectData;\n riskModel?: SuiObjectData;\n borrowFeeKey: SuiObjectData;\n supplyLimitKey?: SuiObjectData;\n borrowLimitKey?: SuiObjectData;\n isolatedAssetKey: SuiObjectData;\n}): OriginMarketPoolData & {\n parsedOriginMarketCollateral?: OriginMarketCollateralData;\n} => {\n const _balanceSheet = parseObjectAs<BalanceSheet>(balanceSheet);\n const _interestModel = parseObjectAs<InterestModel>(interestModel);\n const _borrowDynamic = parseObjectAs<BorrowDynamic>(borrowDynamic);\n const _borrowFee = parseObjectAs<BorrowFee>(borrowFeeKey);\n const _supplyLimit = supplyLimitKey\n ? parseObjectAs<string>(supplyLimitKey)\n : '0';\n const _borrowLimit = borrowLimitKey\n ? parseObjectAs<string>(borrowLimitKey)\n : '0';\n const _riskModel = riskModel\n ? parseObjectAs<RiskModel>(riskModel)\n : undefined;\n const _collateralStat = collateralStat\n ? parseObjectAs<CollateralStat>(collateralStat)\n : undefined;\n\n const parsedOriginMarketCollateral =\n _riskModel && _collateralStat\n ? {\n type: _interestModel.type.fields,\n isIsolated: !!isolatedAssetKey,\n collateralFactor: _riskModel.collateral_factor.fields,\n liquidationFactor: _riskModel.liquidation_factor.fields,\n liquidationPenalty: _riskModel.liquidation_penalty.fields,\n liquidationDiscount: _riskModel.liquidation_discount.fields,\n liquidationReserveFactor:\n _riskModel.liquidation_revenue_factor.fields,\n maxCollateralAmount: _riskModel.max_collateral_amount,\n totalCollateralAmount: _collateralStat.amount,\n }\n : undefined;\n\n return {\n type: _interestModel.type.fields,\n maxBorrowRate: _interestModel.max_borrow_rate.fields,\n interestRate: _borrowDynamic.interest_rate.fields,\n interestRateScale: _borrowDynamic.interest_rate_scale,\n borrowIndex: _borrowDynamic.borrow_index,\n lastUpdated: _borrowDynamic.last_updated,\n cash: _balanceSheet.cash,\n debt: _balanceSheet.debt,\n marketCoinSupply: _balanceSheet.market_coin_supply,\n reserve: _balanceSheet.revenue,\n reserveFactor: _interestModel.revenue_factor.fields,\n borrowWeight: _interestModel.borrow_weight.fields,\n borrowFeeRate: _borrowFee,\n baseBorrowRatePerSec: _interestModel.base_borrow_rate_per_sec.fields,\n borrowRateOnHighKink: _interestModel.borrow_rate_on_high_kink.fields,\n borrowRateOnMidKink: _interestModel.borrow_rate_on_mid_kink.fields,\n highKink: _interestModel.high_kink.fields,\n midKink: _interestModel.mid_kink.fields,\n minBorrowAmount: _interestModel.min_borrow_amount,\n isIsolated: !!isolatedAssetKey,\n supplyLimit: _supplyLimit,\n borrowLimit: _borrowLimit,\n parsedOriginMarketCollateral,\n };\n};\n\n/**\n * Get market pool data.\n *\n * @param query - The Scallop query instance.\n * @param poolCoinName - Specific support pool coin name.\n * @param indexer - Whether to use indexer.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market pool data.\n */\nexport const getMarketPool = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n indexer: boolean = false,\n coinPrice: number,\n requiredObjects?: {\n balanceSheet: SuiObjectData;\n borrowDynamic: SuiObjectData;\n interestModel: SuiObjectData;\n borrowFeeKey: SuiObjectData;\n supplyLimitKey: SuiObjectData;\n borrowLimitKey: SuiObjectData;\n isolatedAssetKey: SuiObjectData;\n }\n): Promise<\n { marketPool: MarketPool; collateral?: MarketCollateral } | undefined\n> => {\n coinPrice = coinPrice ?? (await query.utils.getCoinPrices())?.[poolCoinName];\n\n if (indexer) {\n const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);\n if (!marketPoolIndexer) {\n return undefined;\n }\n marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;\n marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(\n marketPoolIndexer.coinName\n );\n\n let marketCollateralIndexer: MarketCollateral | undefined = undefined;\n if (SUPPORT_COLLATERALS.includes(poolCoinName as SupportCollateralCoins)) {\n marketCollateralIndexer = await query.indexer.getMarketCollateral(\n poolCoinName as SupportCollateralCoins\n );\n marketCollateralIndexer.coinPrice =\n coinPrice ?? marketCollateralIndexer.coinPrice;\n marketCollateralIndexer.coinWrappedType = query.utils.getCoinWrappedType(\n marketCollateralIndexer.coinName\n );\n }\n\n return {\n marketPool: marketPoolIndexer,\n collateral: marketCollateralIndexer,\n };\n }\n\n requiredObjects ??= (await queryRequiredMarketObjects(query, [poolCoinName]))[\n poolCoinName\n ];\n\n const parsedMarketPoolObjects = parseMarketPoolObjects(requiredObjects);\n const parsedMarketPoolData = parseOriginMarketPoolData(\n parsedMarketPoolObjects\n );\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n const parsedMarketCollateralData =\n parsedMarketPoolObjects.parsedOriginMarketCollateral\n ? parseOriginMarketCollateralData(\n parsedMarketPoolObjects.parsedOriginMarketCollateral\n )\n : undefined;\n\n const basePoolData = <T extends SupportPoolCoins = SupportPoolCoins>() => ({\n coinName: poolCoinName as T,\n symbol: query.utils.parseSymbol(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n });\n return {\n marketPool: {\n ...basePoolData(),\n sCoinType: query.utils.parseSCoinType(\n query.utils.parseMarketCoinName(poolCoinName)\n ),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinPrice: coinPrice ?? 0,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n },\n collateral: parsedMarketCollateralData\n ? {\n ...basePoolData<SupportCollateralCoins>(),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinPrice: coinPrice,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPenalty: parsedMarketCollateralData.liquidationPenalty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n ),\n }\n : undefined,\n };\n};\n\n/**\n * Get coin market collaterals data.\n *\n * @description\n * To obtain all market collaterals information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collaterals data.\n */\nexport const getMarketCollaterals = async (\n query: ScallopQuery,\n collateralCoinNames: SupportCollateralCoins[] = [...SUPPORT_COLLATERALS],\n indexer: boolean = false\n) => {\n const marketId = query.address.get('core.market');\n const coinPrices = (await query.utils.getCoinPrices()) ?? {};\n const marketCollaterals: MarketCollaterals = {};\n\n if (indexer) {\n const marketCollateralsIndexer = await query.indexer.getMarketCollaterals();\n const updateMarketCollateral = (marketCollateral: MarketCollateral) => {\n if (!collateralCoinNames.includes(marketCollateral.coinName)) return;\n marketCollateral.coinPrice =\n coinPrices[marketCollateral.coinName] ?? marketCollateral.coinPrice;\n marketCollateral.coinWrappedType = query.utils.getCoinWrappedType(\n marketCollateral.coinName\n );\n marketCollaterals[marketCollateral.coinName] = marketCollateral;\n };\n Object.values(marketCollateralsIndexer).forEach(updateMarketCollateral);\n return marketCollaterals;\n }\n\n const marketObjectResponse = await query.cache.queryGetObject(marketId);\n await Promise.allSettled(\n collateralCoinNames.map(async (collateralCoinName) => {\n const marketCollateral = await getMarketCollateral(\n query,\n collateralCoinName,\n indexer,\n marketObjectResponse?.data,\n coinPrices?.[collateralCoinName]\n );\n\n if (marketCollateral) {\n marketCollaterals[collateralCoinName] = marketCollateral;\n }\n })\n );\n\n return marketCollaterals;\n};\n\n/**\n * Get market collateral data.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinName - Specific support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market collateral data.\n */\nexport const getMarketCollateral = async (\n query: ScallopQuery,\n collateralCoinName: SupportCollateralCoins,\n indexer: boolean = false,\n marketObject?: SuiObjectData | null,\n coinPrice?: number\n): Promise<MarketCollateral | undefined> => {\n coinPrice =\n coinPrice ?? (await query.utils.getCoinPrices())?.[collateralCoinName];\n\n if (indexer) {\n const marketCollateralIndexer =\n await query.indexer.getMarketCollateral(collateralCoinName);\n marketCollateralIndexer.coinPrice =\n coinPrice ?? marketCollateralIndexer.coinPrice;\n marketCollateralIndexer.coinWrappedType = query.utils.getCoinWrappedType(\n marketCollateralIndexer.coinName\n );\n\n return marketCollateralIndexer;\n }\n\n // let marketCollateral: MarketCollateral | undefined;\n // let riskModel: RiskModel | undefined;\n // let collateralStat: CollateralStat | undefined;\n\n const marketId = query.address.get('core.market');\n marketObject =\n marketObject || (await query.cache.queryGetObject(marketId))?.data;\n\n if (!(marketObject && marketObject.content?.dataType === 'moveObject'))\n throw new Error(`Failed to fetch marketObject`);\n\n const fields = marketObject.content.fields as any;\n const coinType = query.utils.parseCoinType(collateralCoinName);\n\n // Get risk model.\n const riskModelParentId = fields.risk_models.fields.table.fields.id.id;\n const riskModelDynamicFieldObjectResponse =\n await query.cache.queryGetDynamicFieldObject({\n parentId: riskModelParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n\n const riskModelDynamicFieldObject = riskModelDynamicFieldObjectResponse?.data;\n if (\n !(\n riskModelDynamicFieldObject &&\n riskModelDynamicFieldObject.content &&\n 'fields' in riskModelDynamicFieldObject.content\n )\n )\n throw new Error(\n `Failed to fetch riskModelDynamicFieldObject for ${riskModelDynamicFieldObjectResponse?.error?.code.toString()}: `\n );\n\n const riskModel: RiskModel = (\n riskModelDynamicFieldObject.content.fields as any\n ).value.fields;\n\n // Get collateral stat.\n const collateralStatParentId =\n fields.collateral_stats.fields.table.fields.id.id;\n const collateralStatDynamicFieldObjectResponse =\n await query.cache.queryGetDynamicFieldObject({\n parentId: collateralStatParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n\n const collateralStatDynamicFieldObject =\n collateralStatDynamicFieldObjectResponse?.data;\n\n if (\n !(\n collateralStatDynamicFieldObject &&\n collateralStatDynamicFieldObject.content &&\n 'fields' in collateralStatDynamicFieldObject.content\n )\n )\n throw new Error(\n `Failed to fetch collateralStatDynamicFieldObject for ${collateralCoinName}: ${collateralStatDynamicFieldObjectResponse?.error?.code.toString()}`\n );\n\n const collateralStat: CollateralStat = (\n collateralStatDynamicFieldObject.content.fields as any\n ).value.fields;\n\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: riskModel.type.fields,\n collateralFactor: riskModel.collateral_factor.fields,\n liquidationFactor: riskModel.liquidation_factor.fields,\n liquidationDiscount: riskModel.liquidation_discount.fields,\n liquidationPenalty: riskModel.liquidation_penalty.fields,\n liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,\n maxCollateralAmount: riskModel.max_collateral_amount,\n totalCollateralAmount: collateralStat.amount,\n isIsolated: await isIsolatedAsset(query.utils, collateralCoinName),\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n return {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: query.utils.parseCoinType(collateralCoinName),\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinPrice: coinPrice ?? 0,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPenalty: parsedMarketCollateralData.liquidationPenalty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculatedMarketCollateralData,\n };\n};\n\n/**\n * Query all owned obligations.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned obligations.\n */\nexport const getObligations = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n ownerAddress: string\n) => {\n const owner = ownerAddress;\n const protocolObjectId = address.get('core.object') || PROTOCOL_OBJECT_ID;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n do {\n const paginatedKeyObjectsResponse =\n await address.cache.queryGetOwnedObjects({\n owner,\n filter: {\n StructType: `${protocolObjectId}::obligation::ObligationKey`,\n },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n limit: 10,\n });\n\n if (!paginatedKeyObjectsResponse) break;\n\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (\n paginatedKeyObjectsResponse.hasNextPage &&\n paginatedKeyObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjects = keyObjectsResponse.filter((ref) => !!ref.data);\n\n const obligations: Obligation[] = [];\n // fetch all obligations with multi get objects\n const obligationsObjects = await queryMultipleObjects(\n address.cache,\n keyObjects\n .map((ref) => ref.data?.content)\n .filter(\n (content): content is SuiParsedData & { dataType: 'moveObject' } =>\n content?.dataType === 'moveObject'\n )\n .map((content) => (content.fields as any).ownership.fields.of)\n );\n\n await Promise.allSettled(\n keyObjects.map(async ({ data }, idx) => {\n const keyId = data?.objectId;\n const content = data?.content;\n if (keyId && content && 'fields' in content) {\n const fields = content.fields as any;\n const obligationId = String(fields.ownership.fields.of);\n const locked = await getObligationLocked(\n address.cache,\n obligationsObjects[idx]\n );\n obligations.push({ id: obligationId, keyId, locked });\n }\n })\n );\n\n return obligations;\n};\n\n/**\n * Query obligation locked status.\n *\n * @param query - The Scallop query instance.\n * @param obligation - The obligation id or the obligation object.\n * @return Obligation locked status.\n */\nexport const getObligationLocked = async (\n cache: ScallopCache,\n obligation: string | SuiObjectData\n) => {\n const obligationObjectData =\n typeof obligation === 'string'\n ? (await cache.queryGetObject(obligation))?.data\n : obligation;\n let obligationLocked = false;\n if (\n obligationObjectData &&\n obligationObjectData?.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectData.content.fields\n ) {\n obligationLocked = Boolean(obligationObjectData.content.fields.lock_key);\n }\n\n return obligationLocked;\n};\n\n/**\n * Query obligation data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\nexport const queryObligation = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n obligationId: SuiObjectArg,\n version: SuiObjectArg = address.get('core.version'),\n market: SuiObjectArg = address.get('core.market')\n) => {\n const packageId = address.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data`;\n\n const args = [\n version,\n market,\n obligationId,\n {\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n },\n ]; // @TODO: recheck and confirm on production, need to re-deploy the query package (remind Nathan)\n\n const queryResult = await address.cache.queryInspectTxn(\n { queryTarget, args }\n // txBlock\n );\n return queryResult?.events[0]?.parsedJson as\n | ObligationQueryInterface\n | undefined;\n};\n\n/**\n * Query all owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All owned coin amounts.\n */\nexport const getCoinAmounts = async (\n query: ScallopQuery,\n assetCoinNames: SupportAssetCoins[] = [...SUPPORT_POOLS],\n ownerAddress?: string\n) => {\n const owner = ownerAddress ?? query.suiKit.currentAddress();\n const assetCoins = {} as OptionalKeys<Record<SupportAssetCoins, number>>;\n\n await Promise.allSettled(\n assetCoinNames.map(async (assetCoinName) => {\n const marketCoin = await getCoinAmount(query, assetCoinName, owner);\n assetCoins[assetCoinName] = marketCoin;\n })\n );\n\n return assetCoins;\n};\n\n/**\n * Query owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Owned coin amount.\n */\nexport const getCoinAmount = async (\n query: ScallopQuery,\n assetCoinName: SupportAssetCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress ?? query.suiKit.currentAddress();\n const coinType = query.utils.parseCoinType(assetCoinName);\n const coinBalance = await query.cache.queryGetCoinBalance({\n owner,\n coinType: coinType,\n });\n return BigNumber(coinBalance?.totalBalance ?? '0').toNumber();\n};\n\n/**\n * Query all owned market coins (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All owned market coins amount.\n */\nexport const getMarketCoinAmounts = async (\n query: ScallopQuery,\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress?: string\n) => {\n marketCoinNames =\n marketCoinNames ||\n [...SUPPORT_POOLS].map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const owner = ownerAddress ?? query.suiKit.currentAddress();\n const marketCoins = {} as OptionalKeys<Record<SupportMarketCoins, number>>;\n\n await Promise.allSettled(\n marketCoinNames.map(async (marketCoinName) => {\n const marketCoin = await getMarketCoinAmount(\n query,\n marketCoinName,\n owner\n );\n marketCoins[marketCoinName] = marketCoin;\n })\n );\n\n return marketCoins;\n};\n\n/**\n * Query owned market coin (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Owned market coin amount.\n */\nexport const getMarketCoinAmount = async (\n query: ScallopQuery,\n marketCoinName: SupportMarketCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress ?? query.suiKit.currentAddress();\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n const coinBalance = await query.cache.queryGetCoinBalance({\n owner,\n coinType: marketCoinType,\n });\n return BigNumber(coinBalance?.totalBalance ?? '0').toNumber();\n};\n\n/**\n * Get flashloan fee for specific asset\n * @param query - The Scallop query instance.\n * @param assetNames - Specific an array of support pool coin name.\n * @returns Record of asset name to flashloan fee in decimal\n */\n\nexport const getFlashLoanFees = async (\n query: ScallopQuery,\n assetNames: SupportPoolCoins[]\n): Promise<Record<SupportPoolCoins, number>> => {\n const FEE_RATE = 1e4;\n const missingAssets: SupportPoolCoins[] = [];\n\n // create mapping from asset type to asset name\n const assetTypeMap = assetNames.reduce(\n (prev, curr) => {\n const assetType = query.utils.parseCoinType(curr).slice(2);\n prev[assetType] = curr;\n return prev;\n },\n {} as Record<string, SupportPoolCoins>\n );\n\n // use the mapped object first\n const objIds = assetNames\n .map((assetName) => {\n if (!FlashLoanFeeObjectMap[assetName]) {\n missingAssets.push(assetName);\n return null;\n } else {\n return FlashLoanFeeObjectMap[assetName];\n }\n })\n .filter((t) => !!t) as string[];\n\n const flashloanFeeObjects = await query.cache.queryGetObjects(objIds);\n\n if (missingAssets.length > 0) {\n // get market object\n const marketObjectId = query.address.get('core.market');\n const marketObjectRes = await query.cache.queryGetObject(marketObjectId);\n if (marketObjectRes?.data?.content?.dataType !== 'moveObject')\n throw new Error('Failed to get market object');\n\n // get vault\n const vault = (marketObjectRes.data.content.fields as any).vault;\n\n // get vault balance sheet object id\n const flashloanFeesTableId = vault.fields.flash_loan_fees.fields.table\n .fields.id.id as string;\n\n // the balance sheet is a VecSet<0x1::type_name::TypeName\n const balanceSheetDynamicFields = await query.cache.queryGetDynamicFields({\n parentId: flashloanFeesTableId,\n limit: 10,\n });\n\n // get the dynamic object ids\n const dynamicFieldObjectIds =\n balanceSheetDynamicFields?.data\n .filter((field) => {\n const assetType = (field.name.value as any).name as string;\n return !!assetTypeMap[assetType];\n })\n .map((field) => field.objectId) ?? [];\n\n flashloanFeeObjects.push(\n ...(await query.cache.queryGetObjects(dynamicFieldObjectIds))\n );\n }\n\n return flashloanFeeObjects.reduce(\n (prev, curr) => {\n if (curr.content?.dataType === 'moveObject') {\n const objectFields = curr.content.fields as any;\n const assetType = (curr.content.fields as any).name.fields.name;\n const feeNumerator = +objectFields.value;\n prev[assetTypeMap[assetType]] = feeNumerator / FEE_RATE;\n }\n return prev;\n },\n {} as Record<SupportPoolCoins, number>\n );\n};\n","import { ScallopUtils } from 'src/models';\nimport { SupportPoolCoins } from 'src/types';\nimport { z as zod } from 'zod';\n\nconst supplyLimitZod = zod.object({\n dataType: zod.string(),\n type: zod.string(),\n hasPublicTransfer: zod.boolean(),\n fields: zod.object({\n id: zod.object({\n id: zod.string(),\n }),\n name: zod.object({\n type: zod.string(),\n }),\n value: zod.string(),\n }),\n});\n\nconst supplyLimitKeyType = `0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey`; // prod\n// const supplyLimitKeyType = `0x6c23585e940a989588432509107e98bae06dbca4e333f26d0635d401b3c7c76d::market_dynamic_keys::SupplyLimitKey`;\n/**\n * Return supply limit of a pool (including the decimals)\n * @param utils\n * @param poolName\n * @returns supply limit (decimals included)\n */\nexport const getSupplyLimit = async (\n utils: ScallopUtils,\n poolName: SupportPoolCoins\n) => {\n try {\n const poolCoinType = utils.parseCoinType(poolName).slice(2);\n const marketObject = utils.address.get('core.market');\n if (!marketObject) return null;\n\n const object = await utils.cache.queryGetDynamicFieldObject({\n parentId: marketObject,\n name: {\n type: supplyLimitKeyType,\n value: poolCoinType,\n },\n });\n\n const parsedData = supplyLimitZod.safeParse(object?.data?.content);\n if (!parsedData.success) return null;\n return parsedData.data.fields.value;\n } catch (e: any) {\n console.error(`Error in getSupplyLimit for ${poolName}: ${e.message}`);\n return '0';\n }\n};\n","import { DynamicFieldInfo, DynamicFieldName } from '@mysten/sui/client';\nimport { ScallopQuery, ScallopUtils } from '../models';\nimport { SupportPoolCoins } from '../types';\nimport { z as zod } from 'zod';\nimport { POOL_ADDRESSES, SUPPORT_POOLS } from 'src/constants';\n\nconst isolatedAssetZod = zod.object({\n dataType: zod.string(),\n type: zod.string(),\n hasPublicTransfer: zod.boolean(),\n fields: zod.object({\n id: zod.object({\n id: zod.string(),\n }),\n name: zod.object({\n type: zod.string(),\n }),\n value: zod.boolean(),\n }),\n});\n\nconst isolatedAssetKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey`; // prod\n// const isolatedAssetKeyType = `0x6c23585e940a989588432509107e98bae06dbca4e333f26d0635d401b3c7c76d::market_dynamic_keys::IsolatedAssetKey`;\n\n/**\n * Return list of isolated assets coin types\n * @param utils ScallopUtils\n * @returns list of isolated assets coin types\n */\nexport const getIsolatedAssets = async (\n query: ScallopQuery\n): Promise<string[]> => {\n if (SUPPORT_POOLS.every((t) => !!POOL_ADDRESSES[t])) {\n return SUPPORT_POOLS.filter(\n (t): t is typeof t & { coinType: string; isolatedAssetKey: string } =>\n !!POOL_ADDRESSES[t]?.isolatedAssetKey && !!POOL_ADDRESSES[t]?.coinType\n ).map((t) => POOL_ADDRESSES[t as SupportPoolCoins]?.coinType!);\n }\n try {\n const marketObject = query.address.get('core.market');\n const isolatedAssets: string[] = [];\n if (!marketObject) return isolatedAssets;\n\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n\n const isIsolatedDynamicField = (\n dynamicField: DynamicFieldInfo\n ): dynamicField is DynamicFieldInfo & {\n name: DynamicFieldName & { value: { type: { name: string } } };\n } => {\n return dynamicField.name.type === isolatedAssetKeyType;\n };\n\n do {\n const response = await query.cache.queryGetDynamicFields({\n parentId: marketObject,\n cursor: nextCursor,\n limit: 10,\n });\n if (!response) break;\n\n const isolatedAssetCoinTypes = response.data\n .filter(isIsolatedDynamicField)\n .map(({ name }) => `0x${name.value.type.name}`);\n isolatedAssets.push(...isolatedAssetCoinTypes);\n\n if (response && response.hasNextPage && response.nextCursor) {\n hasNextPage = true;\n nextCursor = response.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n return isolatedAssets;\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\n/**\n * Check if the coin type is an isolated asset\n * @param coinName coin name\n * @returns true if the coin type is an isolated asset\n */\nexport const isIsolatedAsset = async (\n utils: ScallopUtils,\n coinName: SupportPoolCoins\n): Promise<boolean> => {\n if (POOL_ADDRESSES[coinName]) {\n return !!POOL_ADDRESSES[coinName].isolatedAssetKey;\n }\n\n const marketObject = utils.address.get('core.market');\n // check if the coin type is in the list\n const cachedData = utils.address.cache.queryClient.getQueryData<string[]>([\n 'getDynamicFields',\n marketObject,\n ]);\n if (cachedData) {\n const coinType = utils.parseCoinType(coinName);\n return cachedData.includes(coinType);\n }\n\n // fetch dynamic field object\n const coinType = utils.parseCoinType(coinName).slice(2);\n\n const object = await utils.cache.queryGetDynamicFieldObject({\n parentId: marketObject,\n name: {\n type: isolatedAssetKeyType,\n value: coinType,\n },\n });\n\n const parsedData = isolatedAssetZod.safeParse(object?.data?.content);\n if (!parsedData.success) return false;\n return parsedData.data.fields.value;\n};\n","import { ScallopUtils } from 'src/models';\nimport { SupportPoolCoins } from 'src/types';\nimport { z as zod } from 'zod';\n\nconst borrowLimitZod = zod.object({\n dataType: zod.string(),\n type: zod.string(),\n hasPublicTransfer: zod.boolean(),\n fields: zod.object({\n id: zod.object({\n id: zod.string(),\n }),\n name: zod.object({\n type: zod.string(),\n }),\n value: zod.string(),\n }),\n});\n\nconst borrowLimitKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey`; // prod\n// const borrowLimitKeyType = `0xb784ea287d944e478a3ceaa071f8885072cce6b7224cf245914dc2f9963f460e::market_dynamic_keys::BorrowLimitKey`;\n\n/**\n * Return supply limit of a pool (including the decimals)\n * @param utils\n * @param poolName\n * @returns supply limit (decimals included)\n */\nexport const getBorrowLimit = async (\n utils: ScallopUtils,\n poolName: SupportPoolCoins\n) => {\n try {\n const poolCoinType = utils.parseCoinType(poolName).slice(2);\n const marketObject = utils.address.get('core.market');\n if (!marketObject) return null;\n\n const object = await utils.cache.queryGetDynamicFieldObject({\n parentId: marketObject,\n name: {\n type: borrowLimitKeyType,\n value: poolCoinType,\n },\n });\n\n const parsedData = borrowLimitZod.safeParse(object?.data?.content);\n if (!parsedData.success) return null;\n return parsedData.data.fields.value;\n } catch (e: any) {\n console.error(`Error in getBorrowLimit for ${poolName}: ${e.message}`);\n return '0';\n }\n};\n","import { ScallopCache } from 'src/models/scallopCache';\nimport { partitionArray } from 'src/utils';\n\nexport const queryMultipleObjects = async (\n cache: ScallopCache,\n rawObjectIds: string[],\n partitionSize = 50\n) => {\n const objectIdsPartition = partitionArray(rawObjectIds, partitionSize);\n\n const objects = [];\n for (const objectIds of objectIdsPartition) {\n const result = await cache.queryGetObjects(objectIds);\n objects.push(...result);\n }\n\n return objects;\n};\n","import { SuiObjectData } from '@mysten/sui/client';\nimport BigNumber from 'bignumber.js';\nimport { ScallopQuery } from 'src/models';\nimport { LoyaltyProgramInfo } from 'src/types';\nimport { z as zod } from 'zod';\n\nconst rewardPoolFieldsZod = zod\n .object({\n balance: zod.string(),\n enable_claim: zod.boolean(),\n })\n .transform((value) => ({\n totalPoolReward: BigNumber(value.balance).shiftedBy(-9).toNumber(),\n isClaimEnabled: value.enable_claim,\n }));\n\nconst userRewardFieldsZod = zod\n .object({\n value: zod.string(),\n })\n .transform((value) => BigNumber(value.value).shiftedBy(-9).toNumber());\n\ntype RewardPoolFields = zod.infer<typeof rewardPoolFieldsZod>;\ntype UserRewardFields = zod.infer<typeof userRewardFieldsZod>;\n\n/**\n * Get user's loyalty program information and pending rewards if exists\n * @param query\n * @param veScaKey\n * @returns\n */\nexport const getLoyaltyProgramInformations = async (\n query: ScallopQuery,\n veScaKey?: string | SuiObjectData\n): Promise<LoyaltyProgramInfo | null> => {\n const rewardPool = query.address.get('loyaltyProgram.rewardPool');\n\n // get fields from rewardPool object\n const rewardPoolObject = await query.cache.queryGetObject(rewardPool);\n\n if (rewardPoolObject?.data?.content?.dataType !== 'moveObject') return null;\n const rewardPoolFields = rewardPoolObject.data.content.fields;\n const { isClaimEnabled, totalPoolReward } = rewardPoolFieldsZod.parse(\n rewardPoolFields\n ) as RewardPoolFields;\n\n const result: LoyaltyProgramInfo = {\n pendingReward: 0,\n totalPoolReward,\n isClaimEnabled,\n };\n\n // query the user pending reward if exist\n veScaKey = veScaKey ?? (await query.getVeScas())[0]?.keyObject;\n if (!veScaKey) return result;\n\n const userRewardTableId = query.address.get(\n 'loyaltyProgram.userRewardTableId'\n );\n\n const userRewardObject = await query.cache.queryGetDynamicFieldObject({\n parentId: userRewardTableId,\n name: {\n type: '0x2::object::ID',\n value: typeof veScaKey === 'string' ? veScaKey : veScaKey.objectId,\n },\n });\n\n if (userRewardObject?.data?.content?.dataType !== 'moveObject') return result;\n const userRewardFields = userRewardObject.data.content.fields;\n result.pendingReward = userRewardFieldsZod.parse(\n userRewardFields\n ) as UserRewardFields;\n return result;\n};\n","import BigNumber from 'bignumber.js';\nimport {\n SUPPORT_COLLATERALS,\n SUPPORT_POOLS,\n SUPPORT_SPOOLS,\n} from '../constants';\nimport { minBigNumber, estimatedFactor } from 'src/utils';\nimport type { ScallopQuery } from '../models';\nimport type {\n Market,\n SupportPoolCoins,\n MarketPool,\n Spool,\n StakeAccount,\n Lendings,\n Lending,\n ObligationAccounts,\n ObligationAccount,\n SupportStakeMarketCoins,\n SupportCollateralCoins,\n CoinAmounts,\n CoinPrices,\n SupportMarketCoins,\n TotalValueLocked,\n SupportBorrowIncentiveCoins,\n ObligationBorrowIcentiveReward,\n SupportBorrowIncentiveRewardCoins,\n SupportAssetCoins,\n MarketPools,\n MarketCollaterals,\n} from '../types';\nimport { SuiObjectRef } from '@mysten/sui/client';\nimport { queryMultipleObjects } from './objectsQuery';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@scallop-io/sui-kit';\n\n/**\n * Get user lending infomation for specific pools.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return User lending infomation for specific pools.\n */\nexport const getLendings = async (\n query: ScallopQuery,\n poolCoinNames: SupportPoolCoins[] = [...SUPPORT_POOLS],\n ownerAddress?: string,\n marketPools?: MarketPools,\n coinPrices?: CoinPrices,\n indexer: boolean = false\n) => {\n const marketCoinNames = poolCoinNames.map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const stakeMarketCoinNames = marketCoinNames.filter((marketCoinName) =>\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ) as SupportStakeMarketCoins[];\n\n coinPrices = coinPrices ?? (await query.utils.getCoinPrices());\n marketPools =\n marketPools ??\n (\n await query.getMarketPools(poolCoinNames, {\n indexer,\n coinPrices,\n })\n ).pools;\n\n const spools = await query.getSpools(stakeMarketCoinNames, {\n indexer,\n marketPools,\n coinPrices,\n });\n const [coinAmounts, marketCoinAmounts, allStakeAccounts] = await Promise.all([\n query.getCoinAmounts(poolCoinNames, ownerAddress),\n query.getMarketCoinAmounts(marketCoinNames, ownerAddress),\n query.getAllStakeAccounts(ownerAddress),\n ]);\n\n const lendings: Lendings = {};\n await Promise.allSettled(\n poolCoinNames.map(async (poolCoinName) => {\n const stakeMarketCoinName = stakeMarketCoinNames.find(\n (marketCoinName) =>\n marketCoinName === query.utils.parseMarketCoinName(poolCoinName)\n );\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n lendings[poolCoinName] = await getLending(\n query,\n poolCoinName,\n ownerAddress,\n indexer,\n marketPools?.[poolCoinName],\n stakeMarketCoinName ? spools[stakeMarketCoinName] : undefined,\n stakeMarketCoinName ? allStakeAccounts[stakeMarketCoinName] : [],\n coinAmounts?.[poolCoinName],\n marketCoinAmounts?.[marketCoinName],\n coinPrices?.[poolCoinName] ?? 0\n );\n })\n );\n\n return lendings;\n};\n\n/**\n * Get user lending infomation for specific pool.\n *\n * @description\n * The lending information includes the spool information extended by it.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinName - Specific support coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @param marketPool - The market pool data.\n * @param spool - The spool data.\n * @param stakeAccounts - The stake accounts data.\n * @param coinAmount - The coin amount.\n * @param marketCoinAmount - The market coin amount.\n * @return User lending infomation for specific pool.\n */\nexport const getLending = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n ownerAddress?: string,\n indexer: boolean = false,\n marketPool?: MarketPool,\n spool?: Spool,\n stakeAccounts?: StakeAccount[],\n coinAmount?: number,\n marketCoinAmount?: number,\n coinPrice?: number,\n sCoinAmount?: number\n) => {\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n coinPrice =\n coinPrice ?? (await query.utils.getCoinPrices())?.[poolCoinName] ?? 0;\n\n marketPool =\n marketPool ??\n (await query.getMarketPool(poolCoinName, {\n indexer,\n coinPrice,\n }));\n\n if (!marketPool)\n throw new Error(`Failed to fetch marketPool for ${poolCoinName}`);\n\n spool =\n (spool ??\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName))\n ? await query.getSpool(marketCoinName as SupportStakeMarketCoins, {\n indexer,\n marketPool,\n coinPrices: {\n [poolCoinName]: coinPrice,\n },\n })\n : undefined;\n // some pool does not have spool\n // if (!spool) throw new Error(`Failed to fetch spool for ${poolCoinName}`);\n\n stakeAccounts =\n stakeAccounts ||\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ? await query.getStakeAccounts(\n marketCoinName as SupportStakeMarketCoins,\n ownerAddress\n )\n : [];\n coinAmount =\n coinAmount || (await query.getCoinAmount(poolCoinName, ownerAddress));\n marketCoinAmount =\n marketCoinAmount ||\n (await query.getMarketCoinAmount(marketCoinName, ownerAddress));\n sCoinAmount =\n sCoinAmount || (await query.getSCoinAmount(marketCoinName, ownerAddress));\n const coinDecimal = query.utils.getCoinDecimal(poolCoinName);\n\n // Handle staked scoin\n let stakedMarketAmount = BigNumber(0);\n let stakedMarketCoin = BigNumber(0);\n let stakedAmount = BigNumber(0);\n let stakedCoin = BigNumber(0);\n let stakedValue = BigNumber(0);\n let availableUnstakeAmount = BigNumber(0);\n let availableUnstakeCoin = BigNumber(0);\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n\n if (spool) {\n for (const stakeAccount of stakeAccounts) {\n const accountStakedMarketCoinAmount = BigNumber(stakeAccount.staked);\n const accountStakedMarketCoin = accountStakedMarketCoinAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedAmount = accountStakedMarketCoinAmount.multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const accountStakedCoin = accountStakedAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedValue = accountStakedCoin.multipliedBy(\n spool.coinPrice\n );\n\n stakedMarketAmount = stakedMarketAmount.plus(\n accountStakedMarketCoinAmount\n );\n stakedMarketCoin = stakedMarketCoin.plus(accountStakedMarketCoin);\n stakedAmount = stakedAmount.plus(accountStakedAmount);\n stakedCoin = stakedCoin.plus(accountStakedCoin);\n stakedValue = stakedValue.plus(accountStakedValue);\n availableUnstakeAmount = availableUnstakeAmount.plus(\n accountStakedMarketCoinAmount\n );\n availableUnstakeCoin = availableUnstakeAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = spool.currentPointIndex\n ? BigNumber(spool.currentPointIndex - stakeAccount.index).dividedBy(\n baseIndexRate\n )\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountStakedMarketCoinAmount\n .multipliedBy(increasedPointRate)\n .plus(stakeAccount.points)\n .multipliedBy(spool.exchangeRateNumerator)\n .dividedBy(spool.exchangeRateDenominator)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * spool.rewardCoinDecimal\n );\n }\n }\n\n // Handle supplied coin\n const suppliedAmount = BigNumber(marketCoinAmount)\n .plus(BigNumber(sCoinAmount))\n .multipliedBy(marketPool?.conversionRate ?? 1);\n const suppliedCoin = suppliedAmount.shiftedBy(-1 * coinDecimal);\n const suppliedValue = suppliedCoin.multipliedBy(coinPrice ?? 0);\n\n const marketCoinPrice = BigNumber(coinPrice ?? 0).multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const unstakedMarketAmount = BigNumber(marketCoinAmount).plus(\n BigNumber(sCoinAmount)\n );\n const unstakedMarketCoin = unstakedMarketAmount.shiftedBy(-1 * coinDecimal);\n\n const availableSupplyAmount = BigNumber(coinAmount);\n const availableSupplyCoin = availableSupplyAmount.shiftedBy(-1 * coinDecimal);\n const availableWithdrawAmount = minBigNumber(\n suppliedAmount,\n marketPool?.supplyAmount ?? Infinity\n ).plus(stakedAmount);\n const availableWithdrawCoin = minBigNumber(\n suppliedCoin,\n marketPool?.supplyCoin ?? Infinity\n ).plus(stakedCoin);\n\n const lending: Lending = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n sCoinType: marketPool?.sCoinType ?? '',\n coinDecimal: coinDecimal,\n coinPrice: coinPrice ?? 0,\n conversionRate: marketPool?.conversionRate ?? 1,\n marketCoinPrice: marketCoinPrice.toNumber(),\n supplyApr: marketPool?.supplyApr ?? 0,\n supplyApy: marketPool?.supplyApy ?? 0,\n rewardApr: spool?.rewardApr ?? 0,\n suppliedAmount: suppliedAmount.plus(stakedAmount).toNumber(),\n suppliedCoin: suppliedCoin.plus(stakedCoin).toNumber(),\n suppliedValue: suppliedValue.plus(stakedValue).toNumber(),\n stakedMarketAmount: stakedMarketAmount.toNumber(),\n stakedMarketCoin: stakedMarketCoin.toNumber(),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n unstakedMarketAmount: unstakedMarketAmount.toNumber(),\n unstakedMarketCoin: unstakedMarketCoin.toNumber(),\n unstakedAmount: suppliedAmount.toNumber(),\n unstakedCoin: suppliedCoin.toNumber(),\n unstakedValue: suppliedValue.toNumber(),\n availableSupplyAmount: availableSupplyAmount.toNumber(),\n availableSupplyCoin: availableSupplyCoin.toNumber(),\n availableWithdrawAmount: availableWithdrawAmount.toNumber(),\n availableWithdrawCoin: availableWithdrawCoin.toNumber(),\n availableStakeAmount: unstakedMarketAmount.toNumber(),\n availableStakeCoin: unstakedMarketCoin.toNumber(),\n availableUnstakeAmount: availableUnstakeAmount.toNumber(),\n availableUnstakeCoin: availableUnstakeCoin.toNumber(),\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n isIsolated: marketPool ? marketPool.isIsolated : false,\n };\n\n return lending;\n};\n\n/**\n * Get all obligation accounts data.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All obligation accounts data.\n */\nexport const getObligationAccounts = async (\n query: ScallopQuery,\n ownerAddress?: string,\n market?: {\n pools: MarketPools;\n collaterals: MarketCollaterals;\n },\n coinPrices?: CoinPrices,\n indexer: boolean = false\n) => {\n market = market ?? (await query.getMarketPools(undefined, { indexer }));\n coinPrices =\n coinPrices ??\n (await query.getAllCoinPrices({\n marketPools: market.pools,\n }));\n const [coinAmounts, obligations] = await Promise.all([\n query.getCoinAmounts(undefined, ownerAddress),\n query.getObligations(ownerAddress),\n ]);\n\n const obligationObjects = await queryMultipleObjects(\n query.cache,\n obligations.map((obligation) => obligation.id)\n );\n const obligationAccounts: ObligationAccounts = {};\n await Promise.allSettled(\n obligations.map(async (obligation, idx) => {\n obligationAccounts[obligation.keyId] = await getObligationAccount(\n query,\n obligationObjects[idx] ?? obligation.id,\n ownerAddress,\n indexer,\n market,\n coinPrices,\n coinAmounts\n );\n })\n );\n\n return obligationAccounts;\n};\n\n/**\n * Get obligation account data.\n *\n * @param query - The Scallop query instance.\n * @param obligation - The obligation id.\n * @param indexer - Whether to use indexer.\n * @return Obligation account data.\n */\nexport const getObligationAccount = async (\n query: ScallopQuery,\n obligation: string | SuiObjectRef,\n ownerAddress?: string,\n indexer: boolean = false,\n market?: Market,\n coinPrices?: CoinPrices,\n coinAmounts?: CoinAmounts\n) => {\n const coinNames: SupportAssetCoins[] = Array.from(\n new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS])\n );\n const collateralAssetCoinNames = [\n ...SUPPORT_COLLATERALS,\n ] as SupportCollateralCoins[];\n\n market = market ?? (await query.getMarketPools(undefined, { indexer }));\n coinPrices =\n coinPrices ?? (await query.getAllCoinPrices({ marketPools: market.pools }));\n coinAmounts =\n coinAmounts ?? (await query.getCoinAmounts(coinNames, ownerAddress));\n\n const [obligationQuery, borrowIncentivePools, borrowIncentiveAccounts] =\n await Promise.all([\n query.queryObligation(obligation),\n query.getBorrowIncentivePools(undefined, {\n coinPrices,\n marketPools: market.pools,\n }),\n query.getBorrowIncentiveAccounts(obligation),\n ]);\n\n const collaterals: ObligationAccount['collaterals'] = {};\n const debts: ObligationAccount['debts'] = {};\n const borrowIncentives: ObligationAccount['borrowIncentives'] = {};\n let totalDepositedPools = 0;\n let totalDepositedValue = BigNumber(0);\n let totalBorrowCapacityValue = BigNumber(0);\n let totalRequiredCollateralValue = BigNumber(0);\n let totalBorrowedPools = 0;\n let totalRewardedPools = 0;\n let totalBorrowedValue = BigNumber(0);\n let totalBorrowedValueWithWeight = BigNumber(0);\n\n for (const assetCoinName of collateralAssetCoinNames) {\n const collateral = obligationQuery?.collaterals.find((collateral) => {\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(\n collateral.type.name\n );\n return assetCoinName === collateralCoinName;\n });\n\n const marketCollateral = market.collaterals[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketCollateral && coinPrice) {\n const depositedAmount = BigNumber(collateral?.amount ?? 0);\n const depositedCoin = depositedAmount.shiftedBy(-1 * coinDecimal);\n const depositedValue = depositedCoin.multipliedBy(coinPrice);\n const borrowCapacityValue = depositedValue.multipliedBy(\n marketCollateral.collateralFactor\n );\n const requiredCollateralValue = depositedValue.multipliedBy(\n marketCollateral.liquidationFactor\n );\n\n const poolSizeAmount = BigNumber(marketCollateral.maxDepositAmount).minus(\n marketCollateral.depositAmount\n );\n const availableDepositAmount = minBigNumber(\n BigNumber(coinAmount),\n poolSizeAmount\n );\n const availableDepositCoin = availableDepositAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n totalDepositedValue = totalDepositedValue.plus(depositedValue);\n totalBorrowCapacityValue =\n totalBorrowCapacityValue.plus(borrowCapacityValue);\n totalRequiredCollateralValue = totalRequiredCollateralValue.plus(\n requiredCollateralValue\n );\n\n if (depositedAmount.isGreaterThan(0)) {\n totalDepositedPools++;\n }\n\n collaterals[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n depositedAmount: depositedAmount.toNumber(),\n depositedCoin: depositedCoin.toNumber(),\n depositedValue: depositedValue.toNumber(),\n borrowCapacityValue: borrowCapacityValue.toNumber(),\n requiredCollateralValue: requiredCollateralValue.toNumber(),\n availableDepositAmount: availableDepositAmount.toNumber(),\n availableDepositCoin: availableDepositCoin.toNumber(),\n availableWithdrawAmount: 0,\n availableWithdrawCoin: 0,\n };\n }\n }\n\n const borrowAssetCoinNames: SupportPoolCoins[] = [\n ...new Set([...Object.values(market.pools).map((pool) => pool.coinName)]),\n ];\n\n for (const assetCoinName of borrowAssetCoinNames) {\n const debt = obligationQuery?.debts.find((debt) => {\n const poolCoinName = query.utils.parseCoinNameFromType<SupportPoolCoins>(\n debt.type.name\n );\n return assetCoinName === poolCoinName;\n });\n\n const marketPool = market.pools[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketPool && coinPrice) {\n const increasedRate = debt?.borrowIndex\n ? marketPool.borrowIndex / Number(debt.borrowIndex) - 1\n : 0;\n const borrowedAmount = BigNumber(debt?.amount ?? 0).multipliedBy(\n increasedRate + 1\n );\n const borrowedCoin = borrowedAmount.shiftedBy(-1 * coinDecimal);\n\n const requiredRepayAmount = borrowedAmount;\n const requiredRepayCoin = requiredRepayAmount.shiftedBy(-1 * coinDecimal);\n\n const availableRepayAmount = BigNumber(coinAmount);\n const availableRepayCoin = availableRepayAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n const borrowedValue = requiredRepayCoin.multipliedBy(coinPrice);\n const borrowedValueWithWeight = borrowedValue.multipliedBy(\n marketPool.borrowWeight\n );\n\n totalBorrowedValue = totalBorrowedValue.plus(borrowedValue);\n totalBorrowedValueWithWeight = totalBorrowedValueWithWeight.plus(\n borrowedValueWithWeight\n );\n\n if (borrowedAmount.isGreaterThan(0)) {\n totalBorrowedPools++;\n }\n\n debts[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n borrowedAmount: borrowedAmount.toNumber(),\n borrowedCoin: borrowedCoin.toNumber(),\n borrowedValue: borrowedValue.toNumber(),\n borrowedValueWithWeight: borrowedValueWithWeight.toNumber(),\n borrowIndex: Number(debt?.borrowIndex ?? 0),\n requiredRepayAmount: requiredRepayAmount.toNumber(),\n requiredRepayCoin: requiredRepayCoin.toNumber(),\n availableBorrowAmount: 0,\n availableBorrowCoin: 0,\n availableRepayAmount: availableRepayAmount.toNumber(),\n availableRepayCoin: availableRepayCoin.toNumber(),\n };\n }\n }\n\n for (const [poolCoinName, borrowIncentiveAccount] of Object.entries(\n borrowIncentiveAccounts\n )) {\n const coinName = poolCoinName as SupportBorrowIncentiveCoins;\n const borrowIncentivePool = borrowIncentivePools[coinName];\n if (borrowIncentivePool) {\n const rewards: ObligationBorrowIcentiveReward[] = [];\n Object.entries(borrowIncentiveAccount.pointList).forEach(\n ([key, accountPoint]) => {\n const poolPoint =\n borrowIncentivePool.points[\n query.utils.parseSCoinTypeNameToMarketCoinName(key)\n ];\n\n if (accountPoint && poolPoint) {\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n const accountBorrowedAmount = BigNumber(\n accountPoint.weightedAmount\n );\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = poolPoint.currentPointIndex\n ? Math.max(\n BigNumber(poolPoint.currentPointIndex - accountPoint.index)\n .dividedBy(baseIndexRate)\n .toNumber(),\n 0\n )\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountBorrowedAmount\n .multipliedBy(increasedPointRate)\n .plus(accountPoint.points)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * poolPoint.coinDecimal\n );\n\n // for veSCA\n const weightScale = BigNumber(1_000_000_000_000);\n const boostValue = BigNumber(accountPoint.weightedAmount)\n .div(\n BigNumber(borrowIncentiveAccount.debtAmount)\n .multipliedBy(poolPoint.baseWeight)\n .dividedBy(weightScale)\n )\n .isFinite()\n ? BigNumber(accountPoint.weightedAmount)\n .div(\n BigNumber(borrowIncentiveAccount.debtAmount)\n .multipliedBy(poolPoint.baseWeight)\n .dividedBy(weightScale)\n )\n .toNumber()\n : 1;\n\n // console.log({\n // availableClaimAmount: availableClaimAmount.toString(),\n // coinName: poolPoint.coinName,\n // coinType: poolPoint.coinType,\n // });\n if (availableClaimAmount.isGreaterThanOrEqualTo(0)) {\n rewards.push({\n coinName: poolPoint.coinName,\n coinType: poolPoint.coinType,\n symbol: poolPoint.symbol,\n coinDecimal: poolPoint.coinDecimal,\n coinPrice: poolPoint.coinPrice,\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n boostValue,\n });\n }\n }\n }\n );\n\n if (\n Object.keys(borrowIncentivePool.points).some((coinName: any) => {\n const rewardApr =\n borrowIncentivePool.points[\n coinName as SupportBorrowIncentiveRewardCoins\n ]?.rewardApr;\n return (\n rewardApr !== Infinity &&\n typeof rewardApr == 'number' &&\n rewardApr > 0\n );\n }) &&\n borrowIncentiveAccount.debtAmount > 0\n ) {\n totalRewardedPools++;\n }\n borrowIncentives[coinName] = {\n coinName: borrowIncentivePool.coinName,\n coinType: borrowIncentivePool.coinType,\n symbol: borrowIncentivePool.symbol,\n coinDecimal: borrowIncentivePool.coinDecimal,\n coinPrice: borrowIncentivePool.coinPrice,\n rewards,\n };\n }\n }\n\n let riskLevel = totalRequiredCollateralValue.isZero()\n ? // Note: when there is no collateral and debt is not zero, then it's a bad-debt situation.\n totalBorrowedValueWithWeight.isGreaterThan(0)\n ? BigNumber(100)\n : BigNumber(0)\n : totalBorrowedValueWithWeight.dividedBy(totalRequiredCollateralValue);\n // Note: 100% represents the safety upper limit. Even if it exceeds 100% before it is liquidated, it will only display 100%.\n riskLevel = riskLevel.isLessThan(1) ? riskLevel : BigNumber(1);\n\n const accountBalanceValue = totalDepositedValue\n .minus(totalBorrowedValue)\n .isGreaterThan(0)\n ? totalDepositedValue.minus(totalBorrowedValue)\n : BigNumber(0);\n const availableCollateralValue = totalBorrowCapacityValue\n .minus(totalBorrowedValueWithWeight)\n .isGreaterThan(0)\n ? totalBorrowCapacityValue.minus(totalBorrowedValueWithWeight)\n : BigNumber(0);\n const requiredCollateralValue = totalBorrowedValueWithWeight.isGreaterThan(0)\n ? totalRequiredCollateralValue\n : BigNumber(0);\n const unhealthyCollateralValue = totalBorrowedValueWithWeight\n .minus(requiredCollateralValue)\n .isGreaterThan(0)\n ? totalBorrowedValueWithWeight.minus(requiredCollateralValue)\n : BigNumber(0);\n\n const obligationAccount: ObligationAccount = {\n obligationId:\n typeof obligation === 'string' ? obligation : obligation.objectId,\n // Deposited collateral value (collateral balance)\n totalDepositedValue: totalDepositedValue.toNumber(),\n // Borrowed debt value (liabilities balance)\n totalBorrowedValue: totalBorrowedValue.toNumber(),\n // The difference between the user’s actual deposit and loan (remaining balance)\n totalBalanceValue: accountBalanceValue.toNumber(),\n // Effective collateral value (the actual collateral value included in the calculation).\n totalBorrowCapacityValue: totalBorrowCapacityValue.toNumber(),\n // Available collateral value (the remaining collateral value that can be borrowed).\n totalAvailableCollateralValue: availableCollateralValue.toNumber(),\n // Available debt value (the actual borrowing value included in the calculation).\n totalBorrowedValueWithWeight: totalBorrowedValueWithWeight.toNumber(),\n // Required collateral value (avoid be liquidated).\n totalRequiredCollateralValue: requiredCollateralValue.toNumber(),\n // Unliquidated collateral value (pending liquidation).\n totalUnhealthyCollateralValue: unhealthyCollateralValue.toNumber(),\n totalRiskLevel: riskLevel.toNumber(),\n totalDepositedPools,\n totalBorrowedPools,\n totalRewardedPools,\n collaterals,\n debts,\n borrowIncentives,\n };\n\n for (const [collateralCoinName, obligationCollateral] of Object.entries(\n obligationAccount.collaterals\n )) {\n const marketCollateral =\n market.collaterals[collateralCoinName as SupportCollateralCoins];\n if (marketCollateral) {\n let estimatedAvailableWithdrawAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketCollateral.collateralFactor)\n .dividedBy(marketCollateral.coinPrice)\n .shiftedBy(marketCollateral.coinDecimal);\n estimatedAvailableWithdrawAmount =\n obligationAccount.totalBorrowedValueWithWeight === 0\n ? // Note: when there is no debt record, there is no need to estimate and the deposited amount is directly used as available withdraw.\n BigNumber(obligationCollateral.depositedAmount)\n : minBigNumber(\n estimatedAvailableWithdrawAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n BigNumber(obligationAccount.totalAvailableCollateralValue)\n .dividedBy(marketCollateral.collateralFactor)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n obligationCollateral.depositedAmount,\n marketCollateral.depositAmount\n );\n obligationCollateral.availableWithdrawAmount =\n estimatedAvailableWithdrawAmount.toNumber();\n obligationCollateral.availableWithdrawCoin =\n estimatedAvailableWithdrawAmount\n .shiftedBy(-1 * obligationCollateral.coinDecimal)\n .toNumber();\n }\n }\n for (const [poolCoinName, obligationDebt] of Object.entries(\n obligationAccount.debts\n )) {\n const marketPool = market.pools[poolCoinName as SupportPoolCoins];\n if (marketPool) {\n const estimatedRequiredRepayAmount = BigNumber(\n obligationDebt.requiredRepayAmount\n )\n // Note: reduced chance of not being able to repay in full when calculations are inaccurate,\n // and the contract will not actually take the excess amount.\n .multipliedBy(\n estimatedFactor(obligationDebt.borrowedValue, 3, 'decrease')\n );\n\n let estimatedAvailableBorrowAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketPool.borrowWeight)\n .shiftedBy(marketPool.coinDecimal)\n .dividedBy(marketPool.coinPrice);\n estimatedAvailableBorrowAmount =\n obligationAccount.totalAvailableCollateralValue !== 0\n ? minBigNumber(\n estimatedAvailableBorrowAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n estimatedAvailableBorrowAmount\n .shiftedBy(-1 * marketPool.coinDecimal)\n .multipliedBy(marketPool.coinPrice)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n marketPool.supplyAmount\n )\n : BigNumber(0);\n\n obligationDebt.availableBorrowAmount =\n estimatedAvailableBorrowAmount.toNumber();\n obligationDebt.availableBorrowCoin = estimatedAvailableBorrowAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n obligationDebt.requiredRepayAmount =\n estimatedRequiredRepayAmount.toNumber();\n obligationDebt.requiredRepayCoin = estimatedRequiredRepayAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n }\n }\n\n return obligationAccount;\n};\n\n/**\n * Get total value locked data.\n *\n * @param query - The Scallop query instance.\n * @param indexer - Whether to use indexer.\n * @return Total value locked data.\n */\nexport const getTotalValueLocked = async (\n query: ScallopQuery,\n indexer: boolean = false\n) => {\n const market = await query.getMarketPools(undefined, { indexer });\n\n let supplyLendingValue = BigNumber(0);\n let supplyCollateralValue = BigNumber(0);\n let borrowValue = BigNumber(0);\n\n if (indexer) {\n const tvlIndexer = await query.indexer.getTotalValueLocked();\n const tvl: TotalValueLocked = {\n supplyValue: tvlIndexer.supplyValue,\n supplyValueChangeRatio: tvlIndexer.supplyValueChangeRatio,\n borrowValue: tvlIndexer.borrowValue,\n borrowValueChangeRatio: tvlIndexer.borrowValueChangeRatio,\n totalValue: tvlIndexer.totalValue,\n totalValueChangeRatio: tvlIndexer.totalValueChangeRatio,\n supplyLendingValue: tvlIndexer.supplyLendingValue,\n supplyLendingValueChangeRatio: tvlIndexer.supplyLendingValueChangeRatio,\n supplyCollateralValue: tvlIndexer.supplyCollateralValue,\n supplyCollateralValueChangeRatio:\n tvlIndexer.supplyCollateralValueChangeRatio,\n };\n return tvl;\n }\n\n for (const pool of Object.values(market.pools)) {\n supplyLendingValue = supplyLendingValue.plus(\n BigNumber(pool.supplyCoin).multipliedBy(pool.coinPrice)\n );\n borrowValue = borrowValue.plus(\n BigNumber(pool.borrowCoin).multipliedBy(pool.coinPrice)\n );\n }\n\n // console.dir(market.collaterals, { depth: null });\n for (const collateral of Object.values(market.collaterals)) {\n supplyCollateralValue = supplyCollateralValue.plus(\n BigNumber(collateral.depositCoin).multipliedBy(collateral.coinPrice)\n );\n }\n\n const tvl: TotalValueLocked = {\n supplyValue: supplyLendingValue.plus(supplyCollateralValue).toNumber(),\n supplyLendingValue: supplyLendingValue.toNumber(),\n supplyCollateralValue: supplyCollateralValue.toNumber(),\n borrowValue: borrowValue.toNumber(),\n totalValue: supplyLendingValue\n .plus(supplyCollateralValue)\n .minus(borrowValue)\n .toNumber(),\n };\n\n return tvl;\n};\n\n/**\n * Get user portfolio by wallet address\n */\nexport const getUserPortfolio = async (\n query: ScallopQuery,\n walletAddress: string,\n indexer: boolean = false\n) => {\n const coinPrices = await query.utils.getCoinPrices();\n const market = await query.getMarketPools(undefined, { indexer, coinPrices });\n\n const [lendings, obligationAccounts, borrowIncentivePools, veScas] =\n await Promise.all([\n query.getLendings(undefined, walletAddress, {\n indexer,\n marketPools: market.pools,\n coinPrices,\n }),\n query.getObligationAccounts(walletAddress, {\n indexer,\n market: market,\n coinPrices,\n }),\n query.getBorrowIncentivePools(undefined, {\n marketPools: market.pools,\n coinPrices,\n }),\n query.getVeScas({ walletAddress, excludeEmpty: true }),\n ]);\n\n // get pending rewards (spool and borrow incentive)\n const parsedLendings = Object.values(lendings)\n .filter((t) => t.availableWithdrawCoin > 0)\n .map((lending) => ({\n suppliedCoin: lending.availableWithdrawCoin,\n suppliedValue: lending.suppliedValue,\n stakedCoin: lending.availableUnstakeCoin,\n coinName: lending.coinName,\n symbol: lending.symbol,\n coinType: lending.coinType,\n coinPrice: lending.coinPrice,\n coinDecimals: lending.coinDecimal,\n supplyApr: lending.supplyApr,\n supplyApy: lending.supplyApy,\n incentiveApr: isFinite(lending.rewardApr) ? lending.rewardApr : 0,\n }));\n\n const parsedObligationAccounts = Object.values(obligationAccounts)\n .filter(\n (t): t is NonNullable<typeof t> =>\n !!t && t.totalBorrowedValueWithWeight > 0\n )\n .map((obligationAccount) => {\n return {\n obligationId: obligationAccount.obligationId,\n totalDebtsInUsd: obligationAccount.totalBorrowedValueWithWeight,\n totalCollateralInUsd: obligationAccount.totalDepositedValue,\n riskLevel: obligationAccount.totalRiskLevel,\n availableCollateralInUsd:\n obligationAccount.totalAvailableCollateralValue,\n totalUnhealthyCollateralInUsd:\n obligationAccount.totalUnhealthyCollateralValue,\n borrowedPools: Object.values(obligationAccount.debts)\n .filter((debt) => debt.borrowedCoin > 0)\n .map((debt) => ({\n coinName: debt.coinName,\n symbol: debt.symbol,\n coinDecimals: debt.coinDecimal,\n coinType: debt.coinType,\n coinPrice: debt.coinPrice,\n borrowedCoin: debt.borrowedCoin,\n borrowedValueInUsd: debt.borrowedValueWithWeight,\n borrowApr: market.pools[debt.coinName]?.borrowApr,\n borrowApy: market.pools[debt.coinName]?.borrowApy,\n incentiveInfos: Object.values(\n borrowIncentivePools[debt.coinName]?.points ?? {}\n )\n .filter((t) => isFinite(t.rewardApr))\n .map((t) => ({\n coinName: t.coinName,\n symbol: t.symbol,\n coinType: t.coinType,\n incentiveApr: t.rewardApr,\n })),\n })),\n };\n });\n\n const pendingLendingRewards = Object.values(lendings).reduce(\n (acc, reward) => {\n if (reward.availableClaimCoin === 0) return acc;\n if (!acc[reward.symbol]) {\n acc[reward.symbol] = {\n symbol: reward.symbol,\n coinType: normalizeStructTag(SUI_TYPE_ARG), // @TODO: for now lending reward is all in SUI\n coinPrice: reward.coinPrice,\n pendingRewardInCoin: reward.availableClaimCoin,\n };\n } else {\n acc[reward.symbol].pendingRewardInCoin += reward.availableClaimCoin;\n }\n return acc;\n },\n {} as Record<\n string,\n {\n coinType: string;\n symbol: string;\n coinPrice: number;\n pendingRewardInCoin: number;\n }\n >\n );\n\n const pendingBorrowIncentiveRewards = Object.values(obligationAccounts)\n .filter((t): t is NonNullable<typeof t> => !!t)\n .reduce(\n (acc, curr) => {\n Object.values(curr.borrowIncentives).forEach((incentive) => {\n incentive.rewards.forEach((reward) => {\n if (reward.availableClaimCoin === 0) return acc;\n if (!acc[reward.coinName]) {\n acc[reward.coinName] = {\n symbol: reward.symbol,\n coinType: reward.coinType,\n coinPrice: reward.coinPrice,\n pendingRewardInCoin: reward.availableClaimCoin,\n };\n } else {\n acc[reward.coinName].pendingRewardInCoin +=\n reward.availableClaimCoin;\n }\n });\n });\n return acc;\n },\n {} as Record<\n string,\n {\n coinType: string;\n symbol: string;\n coinPrice: number;\n pendingRewardInCoin: number;\n }\n >\n );\n\n const parsedVeScas = veScas.map(\n ({ keyId, lockedScaCoin, currentVeScaBalance, unlockAt }) => ({\n veScaKey: keyId,\n coinPrice: coinPrices.sca ?? 0,\n lockedScaInCoin: lockedScaCoin,\n lockedScaInUsd: lockedScaCoin * (coinPrices.sca ?? 0),\n currentVeScaBalance,\n remainingLockPeriodInDays:\n unlockAt - Date.now() > 0 ? (unlockAt - Date.now()) / 86400000 : 0,\n unlockAt,\n })\n );\n\n return {\n totalSupplyValue: parsedLendings.reduce((acc, curr) => {\n acc += curr.suppliedValue;\n return acc;\n }, 0),\n ...parsedObligationAccounts.reduce(\n (acc, curr) => {\n acc.totalDebtValue += curr.totalDebtsInUsd;\n acc.totalCollateralValue += curr.totalCollateralInUsd;\n return acc;\n },\n {\n totalDebtValue: 0,\n totalCollateralValue: 0,\n } as {\n totalDebtValue: number;\n totalCollateralValue: number;\n }\n ),\n totalLockedScaValue: parsedVeScas.reduce((acc, curr) => {\n acc += curr.lockedScaInUsd;\n return acc;\n }, 0),\n lendings: parsedLendings,\n borrowings: parsedObligationAccounts,\n pendingRewards: {\n lendings: Object.entries(pendingLendingRewards).reduce(\n (acc, [key, value]) => {\n acc.push({\n ...value,\n coinName: key,\n pendingRewardInUsd: value.coinPrice * value.pendingRewardInCoin,\n });\n return acc;\n },\n [] as any\n ),\n borrowIncentives: Object.entries(pendingBorrowIncentiveRewards).reduce(\n (acc, [key, value]) => {\n acc.push({\n coinName: key,\n ...value,\n pendingRewardInUsd: value.coinPrice * value.pendingRewardInCoin,\n });\n return acc;\n },\n [] as any\n ),\n },\n veScas: parsedVeScas,\n };\n};\n","import { SuiObjectData } from '@mysten/sui/client';\nimport type { ScallopAddress, ScallopQuery } from '../models';\nimport type {\n CoinPrices,\n MarketPools,\n OptionalKeys,\n SupportAssetCoins,\n SupportSCoin,\n} from '../types';\nimport { SUPPORT_SCOIN } from 'src/constants/common';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Get price from pyth fee object.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\nexport const getPythPrice = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n assetCoinName: SupportAssetCoins,\n priceFeedObject?: SuiObjectData | null\n) => {\n const pythFeedObjectId = address.get(\n `core.coins.${assetCoinName}.oracle.pyth.feedObject`\n );\n priceFeedObject =\n priceFeedObject ||\n (await address.cache.queryGetObject(pythFeedObjectId))?.data;\n\n if (priceFeedObject) {\n const priceFeedPoolObject = priceFeedObject;\n if (\n priceFeedPoolObject.content &&\n 'fields' in priceFeedPoolObject.content\n ) {\n const fields = priceFeedPoolObject.content.fields as any;\n const expoMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .magnitude\n );\n const expoNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .negative\n );\n const priceMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .magnitude\n );\n const priceNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .negative\n );\n\n return (\n priceMagnitude *\n 10 ** ((expoNegative ? -1 : 1) * expoMagnitude) *\n (priceNegative ? -1 : 1)\n );\n }\n }\n\n return 0;\n};\n\nexport const getPythPrices = async (\n {\n address,\n }: {\n address: ScallopAddress;\n },\n assetCoinNames: SupportAssetCoins[]\n) => {\n const pythPriceFeedIds = assetCoinNames.reduce(\n (prev, assetCoinName) => {\n const pythPriceFeed = address.get(\n `core.coins.${assetCoinName}.oracle.pyth.feedObject`\n );\n if (pythPriceFeed) {\n if (!prev[pythPriceFeed]) {\n prev[pythPriceFeed] = [assetCoinName];\n } else {\n prev[pythPriceFeed].push(assetCoinName);\n }\n }\n return prev;\n },\n {} as Record<string, SupportAssetCoins[]>\n );\n\n // Fetch multiple objects at once to save rpc calls\n const priceFeedObjects = await address.cache.queryGetObjects(\n Object.keys(pythPriceFeedIds)\n );\n\n const assetToPriceFeedMapping = priceFeedObjects.reduce(\n (prev, priceFeedObject) => {\n pythPriceFeedIds[priceFeedObject.objectId].forEach((assetCoinName) => {\n prev[assetCoinName] = priceFeedObject;\n });\n return prev;\n },\n {} as Record<SupportAssetCoins, SuiObjectData>\n );\n\n return (\n await Promise.all(\n Object.entries(assetToPriceFeedMapping).map(\n async ([assetCoinName, priceFeedObject]) => ({\n coinName: assetCoinName,\n price: await getPythPrice(\n { address },\n assetCoinName as SupportAssetCoins,\n priceFeedObject\n ),\n })\n )\n )\n ).reduce(\n (prev, curr) => {\n prev[curr.coinName as SupportAssetCoins] = curr.price;\n return prev;\n },\n {} as Record<SupportAssetCoins, number>\n );\n};\n\nexport const getAllCoinPrices = async (\n query: ScallopQuery,\n marketPools?: MarketPools,\n coinPrices?: CoinPrices,\n indexer: boolean = false\n) => {\n coinPrices =\n coinPrices ??\n (indexer\n ? await query.getCoinPricesByIndexer()\n : await query.utils.getCoinPrices());\n\n marketPools =\n marketPools ??\n (await query.getMarketPools(undefined, { coinPrices, indexer })).pools;\n\n if (!marketPools) {\n throw new Error(`Failed to fetch market pool for getAllCoinPrices`);\n }\n\n const sCoinPrices: OptionalKeys<Record<SupportSCoin, number>> = {};\n SUPPORT_SCOIN.forEach((sCoinName) => {\n const coinName = query.utils.parseCoinName(sCoinName);\n sCoinPrices[sCoinName] = BigNumber(coinPrices[coinName] ?? 0)\n .multipliedBy(marketPools[coinName]?.conversionRate ?? 1)\n .toNumber();\n });\n\n return {\n ...coinPrices,\n ...sCoinPrices,\n };\n};\n","import { ScallopAddress } from 'src/models';\n\n/**\n * Query the veScaKeyId from the referral bindings table using the borrower address\n * @param query\n * @returns\n */\nexport const queryVeScaKeyIdFromReferralBindings = async (\n address: ScallopAddress,\n refereeAddress: string\n): Promise<string | null> => {\n const referralBindingTableId = address.get('referral.bindingTableId');\n const referralBindResponse = await address.cache.queryGetDynamicFieldObject({\n parentId: referralBindingTableId,\n name: {\n type: 'address',\n value: refereeAddress,\n },\n });\n\n if (referralBindResponse?.data?.content?.dataType !== 'moveObject')\n return null;\n\n const fields = referralBindResponse.data.content.fields as any;\n return fields.value;\n};\n","import { bcs } from '@mysten/sui/bcs';\nimport assert from 'assert';\nimport BigNumber from 'bignumber.js';\nimport { SUPPORT_SCOIN } from 'src/constants';\nimport { ScallopQuery, ScallopUtils } from 'src/models';\nimport { OptionalKeys, SupportSCoin, sCoinBalance } from 'src/types';\n\n/**\n * Get total supply of sCoin\n * @param query\n * @param sCoinName\n * @returns `number`\n */\nexport const getSCoinTotalSupply = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n sCoinName: SupportSCoin\n): Promise<sCoinBalance> => {\n const sCoinPkgId = utils.address.get('scoin.id');\n // get treasury\n const args = [utils.getSCoinTreasury(sCoinName)];\n const typeArgs = [\n utils.parseSCoinType(sCoinName),\n utils.parseUnderlyingSCoinType(sCoinName),\n ];\n const queryTarget = `${sCoinPkgId}::s_coin_converter::total_supply`;\n const queryResults = await utils.cache.queryInspectTxn({\n queryTarget,\n args,\n typeArgs,\n });\n const results = queryResults?.results;\n if (results && results[0]?.returnValues) {\n const value = Uint8Array.from(results[0].returnValues[0][0]);\n const type = results[0].returnValues[0][1]; // should be u64\n assert(type === 'u64', 'Result type is not u64');\n\n return BigNumber(bcs.u64().parse(value))\n .shiftedBy(utils.getCoinDecimal(utils.parseCoinName(sCoinName)))\n .toNumber();\n }\n\n return 0;\n};\n\n/**\n * Query all owned sCoin amount.\n *\n * @param query - The Scallop query instance.\n * @param sCoinNames - Specific an array of support sCoin name.\n * @param ownerAddress - The owner address.\n * @return All owned sCoins amount.\n */\nexport const getSCoinAmounts = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n sCoinNames: SupportSCoin[] = [...SUPPORT_SCOIN],\n ownerAddress?: string\n) => {\n const owner = ownerAddress || utils.suiKit.currentAddress();\n const sCoins = {} as OptionalKeys<Record<SupportSCoin, number>>;\n\n await Promise.allSettled(\n sCoinNames.map(async (sCoinName) => {\n const sCoin = await getSCoinAmount({ utils }, sCoinName, owner);\n sCoins[sCoinName] = sCoin;\n })\n );\n\n return sCoins;\n};\n\n/**\n * Query owned sCoin amount.\n *\n * @param query - The Scallop query instance.\n * @param sCoinNames - Specific support sCoin name.\n * @param ownerAddress - The owner address.\n * @return Owned sCoin amount.\n */\nexport const getSCoinAmount = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n sCoinName: SupportSCoin,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || utils.suiKit.currentAddress();\n const sCoinType = utils.parseSCoinType(sCoinName);\n const coinBalance = await utils.cache.queryGetCoinBalance({\n owner,\n coinType: sCoinType,\n });\n return BigNumber(coinBalance?.totalBalance ?? '0').toNumber();\n};\n\nconst isSupportStakeCoins = (value: string): value is SupportSCoin => {\n return SUPPORT_SCOIN.includes(value as SupportSCoin);\n};\n\nconst checkAssetParams = (fromSCoin: SupportSCoin, toSCoin: SupportSCoin) => {\n if (fromSCoin === toSCoin)\n throw new Error('fromAsset and toAsset must be different');\n\n if (!isSupportStakeCoins(fromSCoin))\n throw new Error('fromAsset is not supported');\n\n if (!isSupportStakeCoins(toSCoin)) {\n throw new Error('toAsset is not supported');\n }\n};\n\n/* ==================== Get Swap Rate ==================== */\n\n/**\n * Get swap rate from sCoin A to sCoin B.\n * @param fromSCoin\n * @param toSCoin\n * @param underlyingCoinPrice - The price of the underlying coin. For example, if fromSCoin is sSUI and toSCoin is sUSDC, then underlyingCoinPrice represents the price of 1 SUI in USDC.\n * @returns number\n */\nexport const getSCoinSwapRate = async (\n query: ScallopQuery,\n fromSCoin: SupportSCoin,\n toSCoin: SupportSCoin,\n underlyingCoinPrice?: number\n) => {\n checkAssetParams(fromSCoin, toSCoin);\n const fromCoinName = query.utils.parseCoinName(fromSCoin);\n const toCoinName = query.utils.parseCoinName(toSCoin);\n\n // Get lending data for both sCoin A and sCoin B\n const marketPools = await Promise.all([\n query.getMarketPool(fromCoinName),\n query.getMarketPool(toCoinName),\n ]);\n if (marketPools.some((pool) => !pool))\n throw new Error('Failed to fetch the lendings data');\n\n if (marketPools.some((pool) => pool?.conversionRate === 0)) {\n throw new Error('Conversion rate cannot be zero');\n }\n\n const ScoinAToARate = marketPools[0]!.conversionRate;\n const BtoSCoinBRate = 1 / marketPools[1]!.conversionRate;\n\n const calcAtoBRate = async () => {\n const prices = await query.utils.getCoinPrices();\n if (!prices[fromCoinName] || !prices[toCoinName]) {\n throw new Error('Failed to fetch the coin prices');\n }\n if (prices[toCoinName] === 0) {\n throw new Error('Price of toCoin cannot be zero');\n }\n return prices[fromCoinName]! / prices[toCoinName]!;\n };\n\n const AtoBRate = underlyingCoinPrice ?? (await calcAtoBRate());\n return BigNumber(ScoinAToARate)\n .multipliedBy(AtoBRate)\n .multipliedBy(BtoSCoinBRate)\n .toNumber();\n};\n","import { normalizeStructTag } from '@mysten/sui/utils';\nimport { POOL_ADDRESSES, SUPPORT_SPOOLS } from '../constants';\nimport {\n parseOriginSpoolData,\n calculateSpoolData,\n parseOriginSpoolRewardPoolData,\n calculateSpoolRewardPoolData,\n isMarketCoin,\n parseObjectAs,\n} from '../utils';\nimport type { SuiObjectData, SuiObjectResponse } from '@mysten/sui/client';\nimport type { ScallopQuery, ScallopUtils } from '../models';\nimport type {\n Spools,\n Spool,\n StakePool,\n StakeRewardPool,\n StakeAccounts,\n SupportStakeMarketCoins,\n SupportStakeCoins,\n CoinPrices,\n MarketPools,\n OriginSpoolRewardPoolData,\n SpoolData,\n OriginSpoolData,\n} from '../types';\nimport { queryMultipleObjects } from './objectsQuery';\n\nconst queryRequiredSpoolObjects = async (\n query: ScallopQuery,\n stakePoolCoinNames: SupportStakeCoins[]\n) => {\n // Prepare all tasks for querying each object type\n const tasks = stakePoolCoinNames.map((t, idx) => ({\n poolCoinName: stakePoolCoinNames[idx],\n spool: POOL_ADDRESSES[t]?.spool,\n spoolReward: POOL_ADDRESSES[t]?.spoolReward,\n sCoinTreasury: POOL_ADDRESSES[t]?.sCoinTreasury,\n }));\n\n // Query all objects for each key in parallel\n const [spoolObjects, spoolRewardObjects, sCoinTreasuryObjects] =\n await Promise.all([\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.spool).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.spoolReward).filter((t): t is string => !!t)\n ),\n queryMultipleObjects(\n query.cache,\n tasks.map((task) => task.sCoinTreasury).filter((t): t is string => !!t)\n ),\n ]);\n\n // Map the results back to poolCoinNames\n const mapObjects = (\n tasks: { poolCoinName: string; [key: string]: string | undefined }[],\n fetchedObjects: SuiObjectData[],\n keyValue: string\n ) => {\n const resultMap: Record<string, SuiObjectData> = {};\n const fetchedObjectMap = fetchedObjects.reduce(\n (acc, obj) => {\n acc[obj.objectId] = obj;\n return acc;\n },\n {} as Record<string, SuiObjectData>\n );\n\n for (const task of tasks) {\n if (task[keyValue]) {\n resultMap[task.poolCoinName] = fetchedObjectMap[task[keyValue]];\n }\n }\n return resultMap;\n };\n\n const spoolMap = mapObjects(tasks, spoolObjects, 'spool');\n const spoolRewardMap = mapObjects(tasks, spoolRewardObjects, 'spoolReward');\n const sCoinTreasuryMap = mapObjects(\n tasks,\n sCoinTreasuryObjects,\n 'sCoinTreasury'\n );\n\n // Construct the final requiredObjects result\n return stakePoolCoinNames.reduce(\n (acc, name) => {\n acc[name] = {\n spool: spoolMap[name],\n spoolReward: spoolRewardMap[name],\n sCoinTreasury: sCoinTreasuryMap[name],\n };\n return acc;\n },\n {} as Record<\n SupportStakeCoins,\n {\n spool: SuiObjectData;\n spoolReward: SuiObjectData;\n sCoinTreasury: SuiObjectData;\n }\n >\n );\n};\n\nconst parseSpoolObjects = ({\n spool,\n spoolReward,\n}: {\n spool: SuiObjectData;\n spoolReward: SuiObjectData;\n}): OriginSpoolData & OriginSpoolRewardPoolData => {\n const _spool = parseObjectAs<SpoolData>(spool);\n const _spoolReward = parseObjectAs<OriginSpoolRewardPoolData>(spoolReward);\n return {\n stakeType: _spool.stake_type,\n maxDistributedPoint: _spool.max_distributed_point,\n distributedPoint: _spool.distributed_point,\n distributedPointPerPeriod: _spool.distributed_point_per_period,\n pointDistributionTime: _spool.point_distribution_time,\n maxStake: _spool.max_stakes,\n stakes: _spool.stakes,\n index: _spool.index,\n createdAt: _spool.created_at,\n lastUpdate: _spool.last_update,\n ..._spoolReward,\n };\n};\n\n/**\n * Get spools data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spools data.\n */\nexport const getSpools = async (\n query: ScallopQuery,\n stakeMarketCoinNames: SupportStakeMarketCoins[] = [...SUPPORT_SPOOLS],\n indexer: boolean = false,\n marketPools?: MarketPools,\n coinPrices?: CoinPrices\n) => {\n const stakeCoinNames = stakeMarketCoinNames.map((stakeMarketCoinName) =>\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName)\n );\n marketPools =\n marketPools ??\n (await query.getMarketPools(stakeCoinNames, { indexer })).pools;\n\n coinPrices =\n coinPrices ?? (await query.getAllCoinPrices({ marketPools })) ?? {};\n\n if (!marketPools)\n throw new Error(`Fail to fetch marketPools for ${stakeCoinNames}`);\n\n const spools: Spools = {};\n\n if (indexer) {\n const spoolsIndexer = await query.indexer.getSpools();\n const updateSpools = (spool: Spool) => {\n if (!stakeMarketCoinNames.includes(spool.marketCoinName)) return;\n const coinName = query.utils.parseCoinName<SupportStakeCoins>(\n spool.marketCoinName\n );\n const rewardCoinName = query.utils.getSpoolRewardCoinName(\n spool.marketCoinName\n );\n spool.coinPrice = coinPrices[coinName] ?? spool.coinPrice;\n spool.marketCoinPrice =\n coinPrices[spool.marketCoinName] ?? spool.marketCoinPrice;\n spool.rewardCoinPrice =\n coinPrices[rewardCoinName] ?? spool.rewardCoinPrice;\n spools[spool.marketCoinName] = spool;\n };\n Object.values(spoolsIndexer).forEach(updateSpools);\n\n return spools;\n }\n\n const requiredObjects = await queryRequiredSpoolObjects(\n query,\n stakeCoinNames\n );\n\n await Promise.allSettled(\n stakeMarketCoinNames.map(async (stakeMarketCoinName, idx) => {\n try {\n const stakeCoinName = stakeCoinNames[idx];\n const spool = await getSpool(\n query,\n stakeMarketCoinName,\n indexer,\n coinPrices,\n requiredObjects[stakeCoinName]\n );\n\n if (spool) {\n spools[stakeMarketCoinName] = spool;\n }\n } catch (e) {\n console.error(e);\n }\n })\n );\n\n return spools;\n};\n\n/**\n * Get spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @param marketPool - The market pool data.\n * @param coinPrices - The coin prices.\n * @return Spool data.\n */\nexport const getSpool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins,\n indexer: boolean = false,\n coinPrices?: CoinPrices,\n requiredObjects?: {\n spool: SuiObjectData;\n spoolReward: SuiObjectData;\n }\n) => {\n const coinName = query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);\n coinPrices = coinPrices || (await query.getAllCoinPrices());\n\n if (indexer) {\n const spoolIndexer = await query.indexer.getSpool(marketCoinName);\n const coinName =\n query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);\n const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);\n spoolIndexer.coinPrice = coinPrices?.[coinName] ?? spoolIndexer.coinPrice;\n spoolIndexer.marketCoinPrice =\n coinPrices?.[marketCoinName] ?? spoolIndexer.marketCoinPrice;\n spoolIndexer.rewardCoinPrice =\n coinPrices?.[rewardCoinName] ?? spoolIndexer.rewardCoinPrice;\n\n return spoolIndexer;\n }\n\n requiredObjects ??= (await queryRequiredSpoolObjects(query, [coinName]))[\n coinName\n ];\n\n const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);\n coinPrices = coinPrices || (await query.utils.getCoinPrices());\n\n const parsedSpoolObjects = parseSpoolObjects(requiredObjects);\n const parsedSpoolData = parseOriginSpoolData(parsedSpoolObjects);\n\n const marketCoinPrice = coinPrices?.[marketCoinName] ?? 0;\n const marketCoinDecimal = query.utils.getCoinDecimal(marketCoinName);\n const calculatedSpoolData = calculateSpoolData(\n parsedSpoolData,\n marketCoinPrice,\n marketCoinDecimal\n );\n\n const parsedSpoolRewardPoolData =\n parseOriginSpoolRewardPoolData(parsedSpoolObjects);\n\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n\n const calculatedRewardPoolData = calculateSpoolRewardPoolData(\n parsedSpoolData,\n parsedSpoolRewardPoolData,\n calculatedSpoolData,\n rewardCoinPrice,\n rewardCoinDecimal\n );\n\n return {\n marketCoinName: marketCoinName,\n symbol: query.utils.parseSymbol(marketCoinName),\n coinType: query.utils.parseCoinType(coinName),\n marketCoinType: query.utils.parseMarketCoinType(coinName),\n rewardCoinType: isMarketCoin(rewardCoinName)\n ? query.utils.parseMarketCoinType(rewardCoinName)\n : query.utils.parseCoinType(rewardCoinName),\n sCoinType: query.utils.parseSCoinType(marketCoinName),\n coinDecimal: query.utils.getCoinDecimal(coinName),\n rewardCoinDecimal: query.utils.getCoinDecimal(rewardCoinName),\n coinPrice: coinPrices?.[coinName] ?? 0,\n marketCoinPrice: marketCoinPrice,\n rewardCoinPrice: rewardCoinPrice,\n maxPoint: parsedSpoolData.maxPoint,\n distributedPoint: parsedSpoolData.distributedPoint,\n maxStake: parsedSpoolData.maxStake,\n ...calculatedSpoolData,\n exchangeRateNumerator: parsedSpoolRewardPoolData.exchangeRateNumerator,\n exchangeRateDenominator: parsedSpoolRewardPoolData.exchangeRateDenominator,\n ...calculatedRewardPoolData,\n };\n};\n\n/**\n * Get all stake accounts of the owner.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - Owner address.\n * @return Stake accounts.\n */\nexport const getStakeAccounts = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n ownerAddress?: string\n) => {\n const owner = ownerAddress || utils.suiKit.currentAddress();\n const spoolObjectId = utils.address.get('spool.object');\n const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;\n const stakeObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n do {\n const paginatedStakeObjectsResponse =\n await utils.cache.queryGetOwnedObjects({\n owner,\n filter: { StructType: stakeAccountType },\n options: {\n showContent: true,\n showType: true,\n },\n cursor: nextCursor,\n limit: 10,\n });\n if (!paginatedStakeObjectsResponse) continue;\n\n stakeObjectsResponse.push(...paginatedStakeObjectsResponse.data);\n if (\n paginatedStakeObjectsResponse.hasNextPage &&\n paginatedStakeObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedStakeObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const stakeAccounts: StakeAccounts = SUPPORT_SPOOLS.reduce(\n (acc, stakeName) => {\n acc[stakeName] = [];\n return acc;\n },\n {} as StakeAccounts\n );\n\n const stakeMarketCoinTypes: Record<SupportStakeMarketCoins, string> =\n Object.keys(stakeAccounts).reduce(\n (types, stakeMarketCoinName) => {\n const stakeCoinName =\n utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const marketCoinType = utils.parseMarketCoinType(stakeCoinName);\n\n types[stakeMarketCoinName as SupportStakeMarketCoins] =\n `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;\n return types;\n },\n {} as Record<SupportStakeMarketCoins, string>\n );\n\n // Reverse the mapping\n const reversedStakeMarketCoinTypes: Record<string, SupportStakeMarketCoins> =\n Object.entries(stakeMarketCoinTypes).reduce(\n (reversedTypes, [key, value]) => {\n reversedTypes[value] = key as SupportStakeMarketCoins;\n return reversedTypes;\n },\n {} as Record<string, SupportStakeMarketCoins>\n );\n\n for (const stakeObject of stakeObjectsResponse.map((ref) => ref.data)) {\n const id = stakeObject?.objectId;\n const type = stakeObject?.type!;\n if (id && stakeObject?.content && 'fields' in stakeObject.content) {\n const fields = stakeObject.content.fields as any;\n const stakePoolId = String(fields.spool_id);\n const stakeType = String(fields.stake_type.fields.name);\n const staked = Number(fields.stakes);\n const index = Number(fields.index);\n const points = Number(fields.points);\n const totalPoints = Number(fields.total_points);\n\n const stakeMarketCoinTypeMap: Record<\n SupportStakeMarketCoins,\n StakeAccounts[SupportStakeMarketCoins]\n > = {\n sweth: stakeAccounts.sweth,\n ssui: stakeAccounts.ssui,\n swusdc: stakeAccounts.swusdc,\n swusdt: stakeAccounts.swusdt,\n scetus: stakeAccounts.scetus,\n safsui: stakeAccounts.safsui,\n shasui: stakeAccounts.shasui,\n svsui: stakeAccounts.svsui,\n susdc: stakeAccounts.susdc,\n };\n\n const normalizedType = normalizeStructTag(type);\n const stakeAccountArray =\n stakeMarketCoinTypeMap[reversedStakeMarketCoinTypes[normalizedType]];\n\n if (stakeAccountArray) {\n stakeAccountArray.push({\n id,\n type: normalizedType,\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n }\n }\n }\n return stakeAccounts;\n};\n\n/**\n * Get stake pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get stake pool info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\nexport const getStakePool = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n marketCoinName: SupportStakeMarketCoins\n) => {\n const poolId = utils.address.get(`spool.pools.${marketCoinName}.id`);\n let stakePool: StakePool | undefined = undefined;\n const stakePoolObjectResponse = await utils.cache.queryGetObject(poolId);\n if (stakePoolObjectResponse?.data) {\n const stakePoolObject = stakePoolObjectResponse.data;\n const id = stakePoolObject.objectId;\n const type = stakePoolObject.type!;\n if (stakePoolObject.content && 'fields' in stakePoolObject.content) {\n const fields = stakePoolObject.content.fields as any;\n const maxPoint = Number(fields.max_distributed_point);\n const distributedPoint = Number(fields.distributed_point);\n const pointPerPeriod = Number(fields.distributed_point_per_period);\n const period = Number(fields.point_distribution_time);\n const maxStake = Number(fields.max_stakes);\n const stakeType = String(fields.stake_type.fields.name);\n const totalStaked = Number(fields.stakes);\n const index = Number(fields.index);\n const createdAt = Number(fields.created_at);\n const lastUpdate = Number(fields.last_update);\n stakePool = {\n id,\n type: normalizeStructTag(type),\n maxPoint,\n distributedPoint,\n pointPerPeriod,\n period,\n maxStake,\n stakeType: normalizeStructTag(stakeType),\n totalStaked,\n index,\n createdAt,\n lastUpdate,\n };\n }\n }\n return stakePool;\n};\n\n/**\n * Get stake reward pool of the owner.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get reward info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool.\n */\nexport const getStakeRewardPool = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n marketCoinName: SupportStakeMarketCoins\n) => {\n const poolId = utils.address.get(\n `spool.pools.${marketCoinName}.rewardPoolId`\n );\n let stakeRewardPool: StakeRewardPool | undefined = undefined;\n const stakeRewardPoolObjectResponse =\n await utils.cache.queryGetObject(poolId);\n\n if (stakeRewardPoolObjectResponse?.data) {\n const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;\n const id = stakeRewardPoolObject.objectId;\n const type = stakeRewardPoolObject.type!;\n if (\n stakeRewardPoolObject.content &&\n 'fields' in stakeRewardPoolObject.content\n ) {\n const rewardPoolFields = stakeRewardPoolObject.content.fields as any;\n const stakePoolId = String(rewardPoolFields.spool_id);\n const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);\n const ratioDenominator = Number(\n rewardPoolFields.exchange_rate_denominator\n );\n const rewards = Number(rewardPoolFields.rewards);\n const claimedRewards = Number(rewardPoolFields.claimed_rewards);\n\n stakeRewardPool = {\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n ratioNumerator,\n ratioDenominator,\n rewards,\n claimedRewards,\n };\n }\n }\n return stakeRewardPool;\n};\n","import BigNumber from 'bignumber.js';\nimport { VeScaTreasuryFields, VeScaTreasuryInfo, Vesca } from '../types';\nimport {\n type SuiObjectResponse,\n type SuiObjectData,\n DevInspectResults,\n} from '@mysten/sui/client';\nimport type { ScallopUtils } from '../models';\nimport { MAX_LOCK_DURATION } from 'src/constants';\nimport { SUI_CLOCK_OBJECT_ID, SuiTxBlock } from '@scallop-io/sui-kit';\nimport { bcs } from '@mysten/sui/bcs';\nimport { z as zod } from 'zod';\nimport { queryKeys } from 'src/constants';\nimport assert from 'assert';\n/**\n * Query all owned veSca key.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veSca key.\n */\nexport const getVescaKeys = async (\n utils: ScallopUtils,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || utils.suiKit.currentAddress();\n const veScaObjId = utils.address.get('vesca.object');\n const veScaKeyType = `${veScaObjId}::ve_sca::VeScaKey`;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n do {\n const paginatedKeyObjectsResponse = await utils.cache.queryGetOwnedObjects({\n owner,\n filter: {\n StructType: veScaKeyType,\n },\n cursor: nextCursor,\n limit: 10,\n });\n if (!paginatedKeyObjectsResponse) continue;\n\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (\n paginatedKeyObjectsResponse &&\n paginatedKeyObjectsResponse.hasNextPage &&\n paginatedKeyObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjectDatas = keyObjectsResponse\n .map((objResponse) => objResponse.data)\n .filter((data) => !!data) as SuiObjectData[];\n return keyObjectDatas;\n};\n\n/**\n * Query all owned veSca.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veScas.\n */\nexport const getVeScas = async (\n {\n utils,\n }: {\n utils: ScallopUtils;\n },\n ownerAddress: string,\n excludeEmpty?: boolean\n) => {\n const keyObjectDatas = await getVescaKeys(utils, ownerAddress);\n\n const veScas: Vesca[] = Array(keyObjectDatas.length).fill(null);\n const tasks = keyObjectDatas.map(async (veScaKey, idx) => {\n const veSca = await getVeSca(utils, veScaKey);\n if (veSca) {\n veScas[idx] = veSca;\n }\n });\n await Promise.allSettled(tasks);\n\n const result = veScas\n .filter(Boolean)\n .sort((a, b) => b.currentVeScaBalance - a.currentVeScaBalance);\n\n if (excludeEmpty) {\n return result.filter((v) => v.lockedScaAmount !== '0');\n }\n return result;\n};\n\nconst SuiObjectRefZod = zod.object({\n objectId: zod.string(),\n digest: zod.string(),\n version: zod.string(),\n});\n\ntype SuiObjectRefType = zod.infer<typeof SuiObjectRefZod>;\n/**\n * Get veSca data.\n *\n * @param query - The Scallop query instance.\n * @param veScaKey - The vesca key id.\n * @param ownerAddress - The owner address.\n * @returns Vesca data.\n */\nexport const getVeSca = async (\n utils: ScallopUtils,\n veScaKey: string | SuiObjectData\n) => {\n const tableId = utils.address.get(`vesca.tableId`);\n\n if (!veScaKey) return undefined;\n if (typeof veScaKey === 'object') {\n veScaKey = SuiObjectRefZod.parse(veScaKey) as SuiObjectRefType;\n }\n\n let vesca: Vesca | undefined = undefined;\n\n const veScaDynamicFieldObjectResponse =\n await utils.cache.queryGetDynamicFieldObject({\n parentId: tableId,\n name: {\n type: '0x2::object::ID',\n value: typeof veScaKey === 'string' ? veScaKey : veScaKey.objectId,\n },\n });\n if (!veScaDynamicFieldObjectResponse) return undefined;\n\n const veScaDynamicFieldObject = veScaDynamicFieldObjectResponse.data;\n if (\n veScaDynamicFieldObject &&\n veScaDynamicFieldObject.content &&\n veScaDynamicFieldObject.content.dataType === 'moveObject' &&\n 'fields' in veScaDynamicFieldObject.content\n ) {\n const dynamicFields = (veScaDynamicFieldObject.content.fields as any).value\n .fields;\n\n const remainingLockPeriodInMilliseconds = Math.max(\n +dynamicFields.unlock_at * 1000 - Date.now(),\n 0\n );\n const lockedScaAmount = String(dynamicFields.locked_sca_amount);\n const lockedScaCoin = BigNumber(dynamicFields.locked_sca_amount)\n .shiftedBy(-9)\n .toNumber();\n const currentVeScaBalance =\n lockedScaCoin *\n (Math.floor(remainingLockPeriodInMilliseconds / 1000) /\n MAX_LOCK_DURATION);\n\n vesca = {\n id: veScaDynamicFieldObject.objectId,\n keyId: typeof veScaKey === 'string' ? veScaKey : veScaKey.objectId,\n keyObject: typeof veScaKey === 'string' ? undefined : veScaKey,\n object: SuiObjectRefZod.parse(veScaDynamicFieldObjectResponse.data),\n lockedScaAmount,\n lockedScaCoin,\n currentVeScaBalance,\n unlockAt: BigNumber(dynamicFields.unlock_at * 1000).toNumber(),\n };\n }\n\n return vesca;\n};\n\n/**\n * Get current total veSca treasury amount.\n */\nconst getTotalVeScaTreasuryAmount = async (\n utils: ScallopUtils,\n veScaTreasury: SuiObjectData\n): Promise<string> => {\n const veScaPkgId = utils.address.get('vesca.id');\n const veScaConfig = utils.address.get('vesca.config');\n veScaTreasury = veScaTreasury ?? utils.address.get('vesca.treasury');\n\n const txb = new SuiTxBlock();\n const clockObjectRef = txb.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n // refresh query\n const refreshQueryTarget = `${veScaPkgId}::treasury::refresh`;\n const refreshArgs = [veScaConfig, veScaTreasury, clockObjectRef];\n\n // query total veSca amount\n const veScaAmountQueryTarget = `${veScaPkgId}::treasury::total_ve_sca_amount`;\n const veScaAmountArgs = [veScaTreasury, clockObjectRef];\n\n // resolve each args\n const resolvedRefreshArgs = await Promise.all(\n refreshArgs.map(async (arg) => {\n if (typeof arg === 'string') {\n return (await utils.cache.queryGetObject(arg))?.data;\n }\n return arg;\n })\n );\n\n const resolvedVeScaAmountArgs = await Promise.all(\n veScaAmountArgs.map(async (arg) => {\n if (typeof arg === 'string') {\n return (await utils.cache.queryGetObject(arg))?.data;\n }\n return arg;\n })\n );\n\n // refresh first\n txb.moveCall(refreshQueryTarget, resolvedRefreshArgs);\n txb.moveCall(veScaAmountQueryTarget, resolvedVeScaAmountArgs);\n\n const txBytes = await txb.txBlock.build({\n client: utils.suiKit.client(),\n onlyTransactionKind: true,\n });\n\n // return result\n const res = await utils.cache.queryClient.fetchQuery<DevInspectResults>({\n queryKey: queryKeys.rpc.getTotalVeScaTreasuryAmount(\n refreshArgs,\n veScaAmountArgs\n ),\n queryFn: async () => {\n return await utils.suiKit.inspectTxn(txBytes);\n },\n });\n\n const results = res.results;\n if (results && results[1]?.returnValues) {\n const value = Uint8Array.from(results[1].returnValues[0][0]);\n const type = results[1].returnValues[0][1];\n assert(type === 'u64', 'Result type is not u64');\n return bcs.u64().parse(value);\n }\n\n return '0';\n};\n\n/**\n * Get veSCA treasury informations\n * @param query\n * @returns VeScaTreasuryInfo\n */\nexport const getVeScaTreasuryInfo = async (\n utils: ScallopUtils\n): Promise<VeScaTreasuryInfo | null> => {\n const veScaTreasuryId = utils.address.get('vesca.treasury');\n const veScaTreasury = await utils.cache.queryGetObject(veScaTreasuryId);\n\n if (!veScaTreasury || veScaTreasury.data?.content?.dataType !== 'moveObject')\n return null;\n\n const treasuryFields = veScaTreasury.data.content\n .fields as VeScaTreasuryFields;\n\n const totalLockedSca = BigNumber(\n treasuryFields.unlock_schedule.fields.locked_sca_amount\n )\n .shiftedBy(-9)\n .toNumber();\n const totalVeSca = BigNumber(\n (await getTotalVeScaTreasuryAmount(utils, veScaTreasury.data)) ?? 0\n )\n .shiftedBy(-9)\n .toNumber();\n const averageLockingPeriod =\n totalLockedSca > 0 ? (totalVeSca / totalLockedSca) * 4 : 0; // in years\n\n const averageLockingPeriodUnit = 'year';\n return {\n totalLockedSca,\n totalVeSca,\n averageLockingPeriod,\n averageLockingPeriodUnit,\n };\n};\n","import { PYTH_FEED_IDS, SUPPORT_POOLS } from 'src/constants';\nimport { ScallopQuery } from 'src/models';\nimport { OptionalKeys, SupportPoolCoins } from 'src/types';\n\nexport const getAllAddresses = async (\n query: ScallopQuery,\n pools: SupportPoolCoins[] = [...SUPPORT_POOLS]\n) => {\n const results: OptionalKeys<\n Record<\n SupportPoolCoins,\n {\n coinName: string;\n symbol: string;\n lendingPoolAddress?: string;\n collateralPoolAddress?: string; // not all pool has collateral\n borrowDynamic?: string;\n spoolReward?: string;\n spool?: string;\n sCoinType?: string;\n sCoinName?: string;\n sCoinSymbol?: string;\n sCoinTreasury?: string;\n interestModel?: string;\n riskModel?: string;\n borrowFeeKey?: string;\n supplyLimitKey?: string;\n borrowLimitKey?: string;\n isolatedAssetKey?: string;\n coinMetadataId?: string;\n borrowIncentivePoolId?: string;\n coinType?: string;\n sCoinMetadataId?: string;\n spoolName?: string;\n decimals: number;\n pythFeed?: string;\n pythFeedObjectId?: string;\n }\n >\n > = {};\n\n const marketId = query.address.get('core.market');\n const marketObject = (await query.cache.queryGetObject(marketId))?.data;\n\n if (!(marketObject && marketObject.content?.dataType === 'moveObject'))\n throw new Error(`Failed to fetch marketObject`);\n\n const fields = marketObject.content.fields as any;\n\n const coinTypesPairs = pools.reduce(\n (acc, pool) => {\n acc.push([pool, query.utils.parseCoinType(pool).substring(2)]);\n return acc;\n },\n [] as [SupportPoolCoins, string][]\n );\n\n const balanceSheetParentId =\n fields.vault.fields.balance_sheets.fields.table.fields.id.id;\n\n const collateralStatsParentId =\n fields.collateral_stats.fields.table.fields.id.id;\n\n const borrowDynamicsParentid =\n fields.borrow_dynamics.fields.table.fields.id.id;\n\n const interestModelParentId =\n fields.interest_models.fields.table.fields.id.id;\n\n const riskModelParentId = fields.risk_models.fields.table.fields.id.id;\n\n const ADDRESS_TYPE = `0x1::type_name::TypeName`;\n const BORROW_FEE_TYPE = `0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey`;\n const SUPPLY_LIMIT_TYPE = `0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey`;\n const BORROW_LIMIT_TYPE = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey`; // prod\n const ISOLATED_ASSET_KEY = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey`;\n const fetchDynamicObject = async (\n parentId: string,\n type: string,\n value: any\n ) => {\n try {\n return (\n await query.cache.queryGetDynamicFieldObject({\n parentId,\n name: {\n type,\n value,\n },\n })\n )?.data?.objectId;\n } catch (e: any) {\n console.error(e.message);\n return undefined;\n }\n };\n\n await Promise.all(\n coinTypesPairs.map(async ([coinName, coinType]) => {\n const addresses = await Promise.all([\n fetchDynamicObject(balanceSheetParentId, ADDRESS_TYPE, {\n name: coinType,\n }),\n fetchDynamicObject(collateralStatsParentId, ADDRESS_TYPE, {\n name: coinType,\n }),\n fetchDynamicObject(borrowDynamicsParentid, ADDRESS_TYPE, {\n name: coinType,\n }),\n fetchDynamicObject(interestModelParentId, ADDRESS_TYPE, {\n name: coinType,\n }),\n fetchDynamicObject(riskModelParentId, ADDRESS_TYPE, {\n name: coinType,\n }),\n fetchDynamicObject(marketId, BORROW_FEE_TYPE, coinType),\n fetchDynamicObject(marketId, SUPPLY_LIMIT_TYPE, coinType),\n fetchDynamicObject(marketId, BORROW_LIMIT_TYPE, coinType),\n fetchDynamicObject(marketId, ISOLATED_ASSET_KEY, coinType),\n ]);\n\n const spool = query.address.get(\n // @ts-ignore\n `spool.pools.s${coinName}.id`\n );\n const rewardPool = query.address.get(\n // @ts-ignore\n `spool.pools.s${coinName}.rewardPoolId`\n );\n const sCoinType = query.address.get(\n // @ts-ignore\n `scoin.coins.s${coinName}.coinType`\n );\n const sCoinName = sCoinType\n ? query.utils.parseSCoinName(coinName)\n : undefined;\n const sCoinSymbol = sCoinName\n ? query.utils.parseSymbol(sCoinName)\n : undefined;\n const sCoinTreasury = query.address.get(\n // @ts-ignore\n `scoin.coins.s${coinName}.treasury`\n );\n const coinMetadataId = query.address.get(\n `core.coins.${coinName}.metaData`\n );\n const sCoinMetadataId = query.address.get(\n // @ts-ignore\n `scoin.coins.s${coinName}.metaData`\n );\n\n const pythFeed = PYTH_FEED_IDS[coinName];\n const pythFeedObjectId = query.address.get(\n //@ts-ignore\n `core.coins.${coinName}.oracle.pyth.feedObject`\n );\n const decimals = query.utils.getCoinDecimal(coinName);\n const spoolName = spool ? `s${coinName}` : undefined;\n results[coinName as SupportPoolCoins] = {\n coinName,\n symbol: query.utils.parseSymbol(coinName),\n lendingPoolAddress: addresses[0],\n collateralPoolAddress: addresses[1],\n borrowDynamic: addresses[2],\n interestModel: addresses[3],\n riskModel: addresses[4],\n borrowFeeKey: addresses[5],\n supplyLimitKey: addresses[6],\n borrowLimitKey: addresses[7],\n isolatedAssetKey: addresses[8],\n spool,\n spoolReward: rewardPool,\n sCoinTreasury,\n sCoinType,\n sCoinName,\n sCoinSymbol,\n coinMetadataId,\n coinType: `0x${coinType}`,\n sCoinMetadataId,\n spoolName,\n decimals,\n pythFeed,\n pythFeedObjectId,\n };\n\n await new Promise((resolve) => setTimeout(resolve, 500));\n })\n );\n\n return results;\n};\n","import { SuiObjectResponse } from '@mysten/sui/client';\nimport { ScallopAddress, ScallopUtils } from 'src/models';\nimport {\n SupportAssetCoins,\n SupportOracleType,\n xOracleRuleType,\n} from 'src/types';\n\nconst PRIMARY_PRICE_UPDATE_POLICY =\n '0xbcd908d0ee6d63d726e61676f3feeec3d19817f4849bbecf372dd3399f247f6b'; // @TODO: move this constant to api address\nconst SECONDARY_PRICE_UPDDATE_POLICY =\n '0x624a6f120777bb30e718b86e836c205ef4229448052377dc3d78272a6662b2c0'; // @TODO: move this constant to api address\n\n/**\n * Query the price update policy table ids. Usually the value for these table will be constant.\n * @param query\n * @returns\n */\nexport const getPriceUpdatePolicies = async (\n address: ScallopAddress\n): Promise<{\n primary: SuiObjectResponse | null;\n secondary: SuiObjectResponse | null;\n}> => {\n const priceUpdatePolicyRulesKeyType = `${address.get('core.packages.xOracle.object')}::price_update_policy::PriceUpdatePolicyRulesKey`;\n\n const [primaryPriceUpdatePolicyTable, secondaryPriceUpdatePolicyTable] =\n await Promise.all([\n address.cache.queryGetDynamicFieldObject({\n parentId: PRIMARY_PRICE_UPDATE_POLICY,\n name: {\n type: priceUpdatePolicyRulesKeyType,\n value: { dummy_field: false },\n },\n }),\n address.cache.queryGetDynamicFieldObject({\n parentId: SECONDARY_PRICE_UPDDATE_POLICY,\n name: {\n type: priceUpdatePolicyRulesKeyType,\n value: { dummy_field: false },\n },\n }),\n ]);\n\n return {\n primary: primaryPriceUpdatePolicyTable,\n secondary: secondaryPriceUpdatePolicyTable,\n };\n};\n\n// const PRIMARY_PRICE_UPDATE_POLICY_KEY =\n// '0x856d0930acc36780eda9ea47019c979ca6ad34fd36f158b181eb7350195acc00';\n// const SECONDARY_PRICE_UPDATE_POLICY_KEY =\n// '0x304d226734fa5e376423c9ff0f1d49aeb1e2572d4b617d31e11e2f69865b73ed';\nconst PRIMARY_PRICE_UPDATE_POLICY_VECSET_ID =\n '0xfb1330aa028ed6a159b742c71b5a79b3b6824cf71efa40ea82b52486ad209264';\nconst SECONDARY_PRICE_UPDATE_POLICY_VECSET_ID =\n '0x4b827acc73f3f53f808dd73a7ee0a60ae61e84322176bece72b26467030b467c';\n\nexport const getAssetOracles = async (\n utils: ScallopUtils,\n ruleType: xOracleRuleType\n): Promise<Record<SupportAssetCoins, SupportOracleType[]>> => {\n const ruleTypeNameToOracleType: Record<string, SupportOracleType> = {\n [`${utils.address.get('core.packages.pyth.object')}::rule::Rule`]: 'pyth',\n [`${utils.address.get('core.packages.supra.object')}::rule::Rule`]: 'supra',\n [`${utils.address.get('core.packages.switchboard.object')}::rule::Rule`]:\n 'switchboard',\n };\n\n const assetPrimaryOracles = {} as Record<\n SupportAssetCoins,\n SupportOracleType[]\n >;\n let cursor = null;\n do {\n const response = await utils.cache.queryGetDynamicFields({\n parentId:\n ruleType === 'primary'\n ? PRIMARY_PRICE_UPDATE_POLICY_VECSET_ID\n : SECONDARY_PRICE_UPDATE_POLICY_VECSET_ID,\n cursor,\n limit: 10,\n });\n if (!response) break;\n const { data, hasNextPage, nextCursor } = response;\n cursor = nextCursor;\n\n // Group object ids\n const objectIds = data.map((dynamicField) => dynamicField.objectId);\n\n // batch fetch object responses\n const objectResponses = await utils.cache.queryGetObjects(objectIds);\n objectResponses.forEach((object) => {\n if (!object.content || object.content.dataType !== 'moveObject') return;\n const fields = object.content.fields as any;\n const typeName = (\n fields.name as { type: string; fields: { name: string } }\n ).fields.name;\n\n const assetName = utils.parseCoinNameFromType(`0x${typeName}`);\n if (!assetName) throw new Error(`Invalid asset name: ${assetName}`);\n if (!assetPrimaryOracles[assetName]) {\n assetPrimaryOracles[assetName] = [];\n }\n\n const value = fields.value as {\n type: string;\n fields: {\n contents: Array<{ type: string; fields: { name: string } }>;\n };\n };\n\n value.fields.contents.forEach((content) => {\n assetPrimaryOracles[assetName].push(\n ruleTypeNameToOracleType[`0x${content.fields.name}`]\n );\n });\n });\n if (!hasNextPage) break;\n } while (cursor);\n\n return assetPrimaryOracles;\n};\n","import { normalizeSuiAddress } from '@mysten/sui/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID } from '../constants';\nimport { newScallopTxBlock } from '../builders';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { Transaction } from '@mysten/sui/transactions';\nimport type {\n SuiAmountsArg,\n SuiTxBlock as SuiKitTxBlock,\n SuiObjectArg,\n SuiTxArg,\n SuiVecTxArg,\n} from '@scallop-io/sui-kit';\nimport type {\n ScallopBuilderParams,\n ScallopTxBlock,\n SupportMarketCoins,\n SupportAssetCoins,\n SupportSCoin,\n ScallopBuilderInstanceParams,\n SelectCoinReturnType,\n} from '../types';\nimport { ScallopCache } from './scallopCache';\nimport { newSuiKit } from './suiKit';\n\n/**\n * @description\n * It provides methods for operating the transaction block, making it more convenient to organize transaction combinations.\n *\n * @example\n * ```typescript\n * const scallopBuilder = new ScallopBuilder(<parameters>);\n * await scallopBuilder.init();\n * const txBlock = scallopBuilder.<builder functions>();\n * ```\n */\nexport class ScallopBuilder {\n public readonly params: ScallopBuilderParams;\n public readonly isTestnet: boolean;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public walletAddress: string;\n public cache: ScallopCache;\n\n public constructor(\n params: ScallopBuilderParams = {},\n instance?: ScallopBuilderInstanceParams\n ) {\n this.suiKit = instance?.suiKit ?? newSuiKit(params);\n\n this.params = params;\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress ?? this.suiKit.currentAddress()\n );\n\n if (instance?.query) {\n this.query = instance.query;\n this.utils = this.query.utils;\n this.address = this.utils.address;\n this.cache = this.address.cache;\n } else {\n this.cache = new ScallopCache(this.params, {\n suiKit: this.suiKit,\n });\n this.address = new ScallopAddress(\n {\n id: params?.addressesId ?? ADDRESSES_ID,\n network: params?.networkType,\n forceInterface: params?.forceAddressesInterface,\n },\n {\n cache: this.cache,\n }\n );\n this.utils = new ScallopUtils(this.params, {\n address: this.address,\n });\n this.query = new ScallopQuery(\n {\n walletAddress: this.walletAddress,\n },\n {\n utils: this.utils,\n }\n );\n }\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public async init(force: boolean = false, address?: ScallopAddress) {\n if (address && !this.address) this.address = address;\n if (force || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.query.init(force, this.address);\n // await this.utils.init(force, this.address);\n }\n\n /**\n * Create a scallop txBlock instance that enhances transaction block.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop txBlock.\n */\n public createTxBlock(txBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction) {\n return newScallopTxBlock(this, txBlock);\n }\n\n /**\n * Specifying the sender's amount of coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param assetCoinName - Specific support asset coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectCoin<T extends SupportAssetCoins>(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n assetCoinName: T,\n amount: number,\n sender: string = this.walletAddress\n ): Promise<SelectCoinReturnType<T>> {\n if (assetCoinName === 'sui') {\n const [takeCoin] = txBlock.splitSUIFromGas([amount]);\n return { takeCoin } as SelectCoinReturnType<T>;\n } else {\n const coinType = this.utils.parseCoinType(assetCoinName);\n const coins = await this.utils.selectCoins(amount, coinType, sender);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin } as SelectCoinReturnType<T>;\n }\n }\n\n /**\n * Specifying the sender's amount of market coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support market coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectMarketCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n marketCoinName: SupportMarketCoins,\n amount: number,\n sender: string = this.walletAddress\n ) {\n const marketCoinType = this.utils.parseMarketCoinType(marketCoinName);\n const coins = await this.utils.selectCoins(amount, marketCoinType, sender);\n const totalAmount = coins.reduce((prev, coin) => {\n prev += Number(coin.balance);\n return prev;\n }, 0);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n coins,\n Math.min(amount, totalAmount)\n );\n return { takeCoin, leftCoin, totalAmount };\n }\n\n /**\n * Specifying the sender's amount of sCoins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support sCoin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectSCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n sCoinName: SupportSCoin,\n amount: number,\n sender: string = this.walletAddress\n ) {\n const sCoinType = this.utils.parseSCoinType(sCoinName);\n const coins = await this.utils.selectCoins(amount, sCoinType, sender);\n const totalAmount = coins.reduce((prev, coin) => {\n prev += Number(coin.balance);\n return prev;\n }, 0);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n coins,\n Math.min(totalAmount, amount)\n );\n return {\n takeCoin,\n leftCoin,\n totalAmount,\n };\n }\n\n /**\n * Execute Scallop txBlock using the `signAndSendTxn` methods in suikit.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n */\n public async signAndSendTxBlock(\n txBlock: ScallopTxBlock | SuiKitTxBlock | Transaction\n ) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as SuiTransactionBlockResponse;\n }\n\n public moveCall(\n txb: ScallopTxBlock | SuiKitTxBlock,\n target: string,\n args?: (SuiTxArg | SuiVecTxArg | SuiObjectArg | SuiAmountsArg)[],\n typeArgs?: string[]\n ) {\n // Disable for now\n // const resolvedQueryTarget =\n // await this.cache.queryGetNormalizedMoveFunction(target);\n // if (!resolvedQueryTarget) throw new Error('Invalid query target');\n\n // const { parameters } = resolvedQueryTarget;\n // try {\n // // we can try resolve the args first\n // const resolvedArgs = await Promise.all(\n // (args ?? []).map(async (arg, idx) => {\n // if (typeof arg !== 'string') return arg;\n\n // const cachedData = (await this.cache.queryGetObject(arg))?.data;\n // if (!cachedData) return arg;\n\n // const owner = cachedData.owner;\n // if (!owner || typeof owner !== 'object' || !('Shared' in owner))\n // return {\n // objectId: cachedData.objectId,\n // version: cachedData.version,\n // digest: cachedData.digest,\n // };\n\n // const parameter = parameters[idx];\n // if (\n // typeof parameter !== 'object' ||\n // !('MutableReference' in parameter || 'Reference' in parameter)\n // )\n // return arg;\n\n // return {\n // objectId: cachedData.objectId,\n // initialSharedVersion: owner.Shared.initial_shared_version,\n // mutable: 'MutableReference' in parameter,\n // };\n // })\n // );\n // return txb.moveCall(target, resolvedArgs, typeArgs);\n // } catch (e: any) {\n // console.error(e.message);\n // return txb.moveCall(target, args, typeArgs);\n // }\n return txb.moveCall(target, args, typeArgs);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { getObligations } from '../queries';\nimport { updateOracles } from './oracle';\nimport { requireSender } from '../utils';\nimport type { SuiObjectArg, TransactionResult } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n CoreIds,\n GenerateCoreNormalMethod,\n GenerateCoreQuickMethod,\n SuiTxBlockWithCoreNormalMethods,\n CoreTxBlock,\n ScallopTxBlock,\n NestedResult,\n SuiTxBlockWithSpool,\n} from '../types';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, directly return it.\n * If both obligation id and key is provided, directly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiObjectArg,\n obligationKey?: SuiObjectArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (params.length === 3 && obligationId) return { obligationId };\n if (params.length === 4 && obligationId && obligationKey)\n return { obligationId, obligationKey };\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n };\n};\n\n/**\n * Generate core normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core normal methods.\n */\nconst generateCoreNormalMethod: GenerateCoreNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const coreIds: CoreIds = {\n protocolPkg: builder.address.get('core.packages.protocol.id'),\n market: builder.address.get('core.market'),\n version: builder.address.get('core.version'),\n coinDecimalsRegistry: builder.address.get('core.coinDecimalsRegistry'),\n xOracle: builder.address.get('core.oracles.xOracle'),\n };\n\n const referralPkgId = builder.address.get('referral.id');\n const referralWitnessType = `${referralPkgId}::scallop_referral_program::REFERRAL_WITNESS`;\n const clockObjectRef = txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n return {\n openObligation: () => {\n const [obligation, obligationKey, obligationHotPotato] = builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n [coreIds.version]\n );\n return [obligation, obligationKey, obligationHotPotato] as [\n NestedResult,\n NestedResult,\n NestedResult,\n ];\n },\n returnObligation: (obligation, obligationHotPotato) => {\n builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n [coreIds.version, obligation, obligationHotPotato]\n );\n },\n openObligationEntry: () => {\n builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n [coreIds.version]\n );\n },\n addCollateral: (obligation, coin, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n [coreIds.version, obligation, coreIds.market, coin],\n [coinType]\n );\n },\n takeCollateral: (obligation, obligationKey, amount, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n txBlock.pure.u64(amount),\n coreIds.xOracle,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n deposit: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::mint::mint`,\n [coreIds.version, coreIds.market, coin, clockObjectRef],\n [coinType]\n );\n },\n depositEntry: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::mint::mint_entry`,\n [coreIds.version, coreIds.market, coin, clockObjectRef],\n [coinType]\n );\n },\n withdraw: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::redeem::redeem`,\n [coreIds.version, coreIds.market, marketCoin, clockObjectRef],\n [coinType]\n );\n },\n withdrawEntry: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::redeem::redeem_entry`,\n [coreIds.version, coreIds.market, marketCoin, clockObjectRef],\n [coinType]\n );\n },\n borrow: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::borrow::borrow`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n borrowWithReferral: (\n obligation,\n obligationKey,\n borrowReferral,\n amount,\n poolCoinName\n ) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::borrow::borrow_with_referral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n borrowReferral,\n typeof amount === 'number' ? txBlock.pure.u64(amount) : amount,\n coreIds.xOracle,\n clockObjectRef,\n ],\n [coinType, referralWitnessType]\n );\n },\n borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n // return await builder.moveCall(\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::borrow::borrow_entry`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n txBlock.pure.u64(amount),\n coreIds.xOracle,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n repay: (obligation, coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::repay::repay`,\n [coreIds.version, obligation, coreIds.market, coin, clockObjectRef],\n [coinType]\n );\n },\n borrowFlashLoan: (amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n [coreIds.version, coreIds.market, amount],\n [coinType]\n );\n },\n repayFlashLoan: (coin, loan, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n builder.moveCall(\n txBlock,\n `${coreIds.protocolPkg}::flash_loan::repay_flash_loan`,\n [coreIds.version, coreIds.market, coin, loan],\n [coinType]\n );\n },\n };\n};\n\n/**\n * Generate core quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include query obligation info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core quick methods.\n */\nconst generateCoreQuickMethod: GenerateCoreQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n addCollateralQuick: async (amount, collateralCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (collateralCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n await txBlock.addCollateral(obligationArg, suiCoin, collateralCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n collateralCoinName,\n amount,\n sender\n );\n await txBlock.addCollateral(\n obligationArg,\n takeCoin,\n collateralCoinName\n );\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick: async (\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n ) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const updateCoinNames = await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n );\n await updateOracles(builder, txBlock, updateCoinNames);\n return await txBlock.takeCollateral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiObjectArg,\n amount,\n collateralCoinName\n );\n },\n depositQuick: async (amount, poolCoinName, returnSCoin = true) => {\n const sender = requireSender(txBlock);\n let marketCoinDeposit: TransactionResult | undefined;\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n marketCoinDeposit = await txBlock.deposit(suiCoin, poolCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n marketCoinDeposit = await txBlock.deposit(takeCoin, poolCoinName);\n }\n\n // convert to sCoin\n return returnSCoin\n ? await txBlock.mintSCoin(\n builder.utils.parseMarketCoinName(poolCoinName),\n marketCoinDeposit\n )\n : marketCoinDeposit;\n },\n withdrawQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n const marketCoinName = builder.utils.parseMarketCoinName(poolCoinName);\n\n // check if user has sCoin instead of marketCoin\n try {\n const sCoinName = builder.utils.parseSCoinName(poolCoinName);\n if (!sCoinName) throw new Error(`No sCoin for ${poolCoinName}`);\n const {\n leftCoin,\n takeCoin: sCoins,\n totalAmount,\n } = await builder.selectSCoin(txBlock, sCoinName, amount, sender);\n txBlock.transferObjects([leftCoin], sender);\n const marketCoins = await txBlock.burnSCoin(sCoinName, sCoins);\n\n // check amount\n amount -= totalAmount;\n try {\n if (amount > 0) {\n // sCoin is not enough, try market coin\n const { leftCoin, takeCoin: walletMarketCoins } =\n await builder.selectMarketCoin(\n txBlock,\n marketCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n txBlock.mergeCoins(marketCoins, [walletMarketCoins]);\n }\n } catch (_e) {\n // ignore\n }\n return txBlock.withdraw(marketCoins, poolCoinName);\n } catch (_e) {\n // no sCoin found\n const { leftCoin, takeCoin: walletMarketCoins } =\n await builder.selectMarketCoin(\n txBlock,\n marketCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return await txBlock.withdraw(walletMarketCoins, poolCoinName);\n }\n },\n borrowQuick: async (amount, poolCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const obligationCoinNames =\n (await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n )) ?? [];\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.borrow(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiObjectArg,\n amount,\n poolCoinName\n );\n },\n borrowWithReferralQuick: async (\n amount,\n poolCoinName,\n borrowReferral,\n obligationId,\n obligationKey\n ) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const obligationCoinNames =\n (await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n )) ?? [];\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.borrowWithReferral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiObjectArg,\n borrowReferral,\n amount,\n poolCoinName\n );\n },\n repayQuick: async (amount, poolCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return await txBlock.repay(\n obligationInfo.obligationId,\n suiCoin,\n poolCoinName\n );\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return await txBlock.repay(\n obligationInfo.obligationId,\n takeCoin,\n poolCoinName\n );\n }\n },\n updateAssetPricesQuick: async (assetCoinNames) => {\n return await updateOracles(builder, txBlock, assetCoinNames);\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with core modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop core txBlock.\n */\nexport const newCoreTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?:\n | ScallopTxBlock\n | SuiKitTxBlock\n | Transaction\n | SuiTxBlockWithSpool\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateCoreNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithCoreNormalMethods;\n\n const quickMethod = generateCoreQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as CoreTxBlock;\n};\n","import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n SuiPythClient,\n SuiPriceServiceConnection,\n} from '@pythnetwork/pyth-sui-js';\nimport { SUPPORT_COLLATERALS, SUPPORT_POOLS } from '../constants';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n SupportAssetCoins,\n SupportOracleType,\n xOracleRules,\n xOracleRuleType,\n} from '../types';\nimport { PYTH_ENDPOINTS } from 'src/constants/pyth';\nimport { xOracleList } from 'src/constants';\n\n/**\n * Update the price of the oracle for multiple coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param options - The options for update oracles.\n */\nexport const updateOracles = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinNames: SupportAssetCoins[] = [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ],\n options: {\n usePythPullModel: boolean;\n } = { usePythPullModel: true }\n) => {\n const usePythPullModel =\n builder.params.usePythPullModel ?? options.usePythPullModel;\n // const rules: SupportOracleType[] = builder.isTestnet ? ['pyth'] : ['pyth'];\n const flattenedRules: SupportOracleType[] = [\n ...new Set(\n Object.values(xOracleList).flatMap(({ primary, secondary }) => [\n ...primary,\n ...secondary,\n ])\n ),\n ];\n\n if (flattenedRules.includes('pyth') && usePythPullModel) {\n const pythClient = new SuiPythClient(\n builder.suiKit.client(),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get('core.oracles.pyth.wormholeState')\n );\n const priceIds = assetCoinNames.map((assetCoinName) =>\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`)\n );\n\n // iterate through the endpoints\n const endpoints =\n builder.params.pythEndpoints ??\n PYTH_ENDPOINTS[builder.isTestnet ? 'testnet' : 'mainnet'];\n for (const endpoint of endpoints) {\n try {\n const pythConnection = new SuiPriceServiceConnection(endpoint);\n const priceUpdateData =\n await pythConnection.getPriceFeedsUpdateData(priceIds);\n await pythClient.updatePriceFeeds(\n txBlock.txBlock, // convert txBlock to TransactionBlock because pyth sdk not support new @mysten/sui yet\n priceUpdateData,\n priceIds\n );\n\n break;\n } catch (e) {\n console.warn(\n `Failed to update price feeds with endpoint ${endpoint}: ${e}`\n );\n }\n }\n }\n\n // Remove duplicate coin names.\n const updateAssetCoinNames = [...new Set(assetCoinNames)];\n for (const assetCoinName of updateAssetCoinNames) {\n await updateOracle(\n builder,\n txBlock,\n assetCoinName,\n xOracleList[assetCoinName]\n );\n }\n};\n\n/**\n * Update the price of the oracle for specific coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinName - Specific support asset coin name.\n */\nconst updateOracle = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinName: SupportAssetCoins,\n rules: xOracleRules\n) => {\n const coinType = builder.utils.parseCoinType(assetCoinName);\n\n updatePrice(\n txBlock,\n rules,\n builder.address.get('core.packages.xOracle.id'),\n builder.address.get('core.oracles.xOracle'),\n builder.address.get('core.packages.pyth.id'),\n builder.address.get('core.oracles.pyth.registry'),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`),\n builder.address.get('core.packages.switchboard.id'),\n builder.address.get('core.oracles.switchboard.registry'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.switchboard`),\n builder.address.get('core.packages.supra.id'),\n builder.address.get('core.oracles.supra.registry'),\n builder.address.get(`core.oracles.supra.holder`),\n coinType\n );\n};\n\n/**\n * Construct a transaction block for update the price.\n *\n * @param txBlock - The transaction block.\n * @param rules - The oracle rules.\n * @param xOraclePackageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param pythPackageId - The pyth package id.\n * @param pythRegistryId - The registry id from pyth package.\n * @param pythStateId - The price state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param switchboardPackageId - The switchboard package id.\n * @param switchboardRegistryId - The registry id from switchboard package.\n * @param switchboardAggregatorId - The aggregator id from switchboard package.\n * @param supraPackageId - The supra package id.\n * @param supraRegistryId - The registry id from supra package.\n * @param supraHolderId - The holder id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePrice = (\n txBlock: SuiKitTxBlock,\n rules: xOracleRules,\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n switchboardPackageId: string,\n switchboardRegistryId: TransactionArgument | string,\n switchboardAggregatorId: TransactionArgument | string,\n supraPackageId: string,\n supraRegistryId: TransactionArgument | string,\n supraHolderId: TransactionArgument | string,\n coinType: string\n) => {\n const request = priceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n coinType\n );\n Object.entries(rules).forEach(([type, rule]: [any, SupportOracleType[]]) => {\n if (rule.includes('pyth')) {\n updatePythPrice(\n type,\n txBlock,\n pythPackageId,\n request,\n pythStateId,\n pythFeedObjectId,\n pythRegistryId,\n coinType\n );\n }\n if (rule.includes('supra')) {\n updateSupraPrice(\n type,\n txBlock,\n supraPackageId,\n request,\n supraHolderId,\n supraRegistryId,\n coinType\n );\n }\n if (rule.includes('switchboard')) {\n updateSwitchboardPrice(\n type,\n txBlock,\n switchboardPackageId,\n request,\n switchboardAggregatorId,\n switchboardRegistryId,\n coinType\n );\n }\n });\n\n confirmPriceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n request,\n coinType\n );\n return txBlock;\n};\n\n/**\n * Construct a transaction block for request price update.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst priceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::price_update_request`;\n const typeArgs = [coinType];\n return txBlock.moveCall(target, [xOracleId], typeArgs);\n};\n\n/**\n * Construct a transaction block for confirm price update request.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param request - The result of the request.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst confirmPriceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n request: TransactionArgument,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::confirm_price_update_request`;\n const typeArgs = [coinType];\n txBlock.moveCall(\n target,\n [\n xOracleId,\n request,\n txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n }),\n ],\n typeArgs\n );\n return txBlock;\n};\n\n/**\n * Construct a transaction block for update supra price.\n *\n * @param type - The type of price rule.\n * @param txBlock - The transaction block.\n * @param packageId - The supra package id.\n * @param request - The result of the request.\n * @param holderId - The holder id from supra package.\n * @param registryId - The registry id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSupraPrice = (\n type: xOracleRuleType,\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n holderId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price_as_${type}`,\n [\n request,\n holderId,\n registryId,\n txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n initialSharedVersion: '1',\n mutable: false,\n }),\n ],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update switchboard price.\n *\n * @param type - The type of price rule.\n * @param txBlock - The transaction block.\n * @param packageId - The switchboard package id.\n * @param request - The result of the request.\n * @param aggregatorId - The aggregator id from switchboard package.\n * @param registryId - The registry id from switchboard package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSwitchboardPrice = (\n type: xOracleRuleType,\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n aggregatorId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price_as_${type}`,\n [\n request,\n aggregatorId,\n registryId,\n txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n initialSharedVersion: '1',\n mutable: false,\n }),\n ],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update pyth price.\n *\n * @param type - The type of price rule.\n * @param txBlock - The transaction block.\n * @param packageId - The pyth package id.\n * @param request - The result of the request.\n * @param stateId - The price state id from pyth package.\n * @param wormholeStateId - The whormhole state id from pyth package.\n * @param feedObjectId - The feed object id from pyth package.\n * @param vaaFromFeeId - The vaa from pyth api with feed id.\n * @param registryId - The registry id from pyth package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePythPrice = (\n type: xOracleRuleType,\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n stateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price_as_${type}`,\n [\n request,\n stateId,\n feedObjectId,\n registryId,\n txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n initialSharedVersion: '1',\n mutable: false,\n }),\n ],\n [coinType]\n );\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { spoolRewardCoins } from '../constants/enum';\nimport { getStakeAccounts } from '../queries/spoolQuery';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { TransactionResult } from '@mysten/sui/transactions';\nimport type { ScallopBuilder } from '../models';\nimport type {\n SpoolIds,\n GenerateSpoolNormalMethod,\n GenerateSpoolQuickMethod,\n SuiTxBlockWithSpoolNormalMethods,\n SpoolTxBlock,\n SupportStakeMarketCoins,\n ScallopTxBlock,\n SuiTxBlockWithSCoin,\n} from '../types';\n\n/**\n * Check and get stake account id from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return it.\n * Otherwise, automatically get all stake account id from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake account ids.\n */\nconst requireStakeAccountIds = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n if (params.length === 4 && stakeAccountId) return [stakeAccountId];\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account id found for sender ${sender}`);\n }\n return stakeAccounts[stakeMarketCoinName].map((account) => account.id);\n};\n\n/**\n * Check and get stake accounts information from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return its account.\n * Otherwise, automatically get all stake account from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake accounts.\n */\nconst requireStakeAccounts = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account found for sender ${sender}`);\n }\n\n const specificStakeAccounts = stakeAccountId\n ? stakeAccounts[stakeMarketCoinName].filter((account) => {\n return account.id === stakeAccountId;\n })\n : stakeAccounts[stakeMarketCoinName];\n\n return specificStakeAccounts;\n};\n\nconst stakeHelper = async (\n builder: ScallopBuilder,\n txBlock: SuiTxBlockWithSpoolNormalMethods,\n stakeAccount: SuiAddressArg,\n coinName: SupportStakeMarketCoins,\n amount: number,\n sender: string,\n isSCoin: boolean = false\n) => {\n try {\n const { takeCoin, leftCoin, totalAmount } = isSCoin\n ? await builder.selectSCoin(txBlock, coinName, amount, sender)\n : await builder.selectMarketCoin(txBlock, coinName, amount, sender);\n if (isSCoin) {\n const marketCoin = txBlock.burnSCoin(coinName, takeCoin);\n txBlock.stake(stakeAccount, marketCoin, coinName);\n } else {\n txBlock.stake(stakeAccount, takeCoin, coinName);\n }\n txBlock.transferObjects([leftCoin], sender);\n return totalAmount;\n } catch (_e) {\n return 0;\n }\n};\n\n/**\n * Generate spool normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool normal methods.\n */\nconst generateSpoolNormalMethod: GenerateSpoolNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const spoolIds: SpoolIds = {\n spoolPkg: builder.address.get('spool.id'),\n };\n const clockObjectRef = txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n return {\n createStakeAccount: (stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return builder.moveCall(\n txBlock,\n `${spoolIds.spoolPkg}::user::new_spool_account`,\n [stakePoolId, clockObjectRef],\n [marketCoinType]\n );\n },\n stake: (stakeAccount, coin, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n builder.moveCall(\n txBlock,\n `${spoolIds.spoolPkg}::user::stake`,\n [stakePoolId, stakeAccount, coin, clockObjectRef],\n [marketCoinType]\n );\n },\n unstake: (stakeAccount, amount, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return builder.moveCall(\n txBlock,\n `${spoolIds.spoolPkg}::user::unstake`,\n [stakePoolId, stakeAccount, amount, clockObjectRef],\n [marketCoinType]\n );\n },\n claim: (stakeAccount, stakeMarketCoinName) => {\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n ) as string;\n const rewardPoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.rewardPoolId`\n ) as string;\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const rewardCoinName = spoolRewardCoins[stakeMarketCoinName];\n const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);\n return builder.moveCall(\n txBlock,\n `${spoolIds.spoolPkg}::user::redeem_rewards`,\n [stakePoolId, rewardPoolId, stakeAccount, clockObjectRef],\n [marketCoinType, rewardCoinType]\n );\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nconst generateSpoolQuickMethod: GenerateSpoolQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n stakeQuick: async (\n amountOrMarketCoin,\n stakeMarketCoinName,\n stakeAccountId\n ) => {\n const sender = requireSender(txBlock);\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n if (stakeAccountIds.length === 0) {\n throw new Error(`No stakeAccountIds found for user ${sender}`);\n }\n\n if (typeof amountOrMarketCoin === 'number') {\n // try stake market coin\n const stakedMarketCoinAmount = await stakeHelper(\n builder,\n txBlock,\n stakeAccountIds[0],\n stakeMarketCoinName,\n amountOrMarketCoin,\n sender\n );\n\n amountOrMarketCoin -= stakedMarketCoinAmount;\n // no market coin, try sCoin\n if (amountOrMarketCoin > 0) {\n await stakeHelper(\n builder,\n txBlock,\n stakeAccountIds[0],\n stakeMarketCoinName,\n amountOrMarketCoin,\n sender,\n true\n );\n }\n } else {\n txBlock.stake(\n stakeAccountIds[0],\n amountOrMarketCoin,\n stakeMarketCoinName\n );\n }\n },\n unstakeQuick: async (\n amount,\n stakeMarketCoinName,\n stakeAccountId,\n returnSCoin = true\n ) => {\n const stakeAccounts = await requireStakeAccounts(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const toTransfer: TransactionResult[] = [];\n for (const account of stakeAccounts) {\n if (account.staked === 0) continue;\n const amountToUnstake = Math.min(amount, account.staked);\n const marketCoin = await txBlock.unstake(\n account.id,\n amountToUnstake,\n stakeMarketCoinName\n );\n\n // convert to new sCoin\n if (returnSCoin) {\n const sCoin = await txBlock.mintSCoin(\n stakeMarketCoinName,\n marketCoin\n );\n toTransfer.push(sCoin);\n } else {\n toTransfer.push(marketCoin);\n }\n\n amount -= amountToUnstake;\n if (amount <= 0) break;\n }\n\n if (toTransfer.length > 0) {\n const mergedCoin = toTransfer[0];\n\n if (toTransfer.length > 1) {\n txBlock.mergeCoins(mergedCoin, toTransfer.slice(1));\n }\n return mergedCoin;\n }\n },\n claimQuick: async (stakeMarketCoinName, stakeAccountId) => {\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const rewardCoins: TransactionResult[] = [];\n for (const accountId of stakeAccountIds) {\n const rewardCoin = await txBlock.claim(accountId, stakeMarketCoinName);\n rewardCoins.push(rewardCoin);\n }\n return rewardCoins;\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with spool modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop spool txBlock.\n */\nexport const newSpoolTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?:\n | ScallopTxBlock\n | SuiKitTxBlock\n | Transaction\n | SuiTxBlockWithSCoin\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateSpoolNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithSpoolNormalMethods;\n\n const quickMethod = generateSpoolQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SpoolTxBlock;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport {\n SuiTxBlock as SuiKitTxBlock,\n SUI_CLOCK_OBJECT_ID,\n} from '@scallop-io/sui-kit';\nimport { getObligations, getObligationLocked } from '../queries';\nimport { requireSender } from '../utils';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from 'src/models';\nimport type {\n BorrowIncentiveIds,\n GenerateBorrowIncentiveNormalMethod,\n GenerateBorrowIncentiveQuickMethod,\n SuiTxBlockWithBorrowIncentiveNormalMethods,\n BorrowIncentiveTxBlock,\n ScallopTxBlock,\n VescaIds,\n} from '../types';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from 'src/constants';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, directly return it.\n * If both obligation id and key is provided, directly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiObjectArg,\n obligationKey?: SuiObjectArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (\n params.length === 4 &&\n obligationId &&\n obligationKey &&\n typeof obligationId === 'string'\n ) {\n const obligationLocked = await getObligationLocked(\n builder.cache,\n obligationId\n );\n return { obligationId, obligationKey, obligationLocked };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n\n const selectedObligation =\n obligations.find(\n (obligation) =>\n obligation.id === obligationId || obligation.keyId === obligationKey\n ) ?? obligations[0];\n\n return {\n obligationId: selectedObligation.id,\n obligationKey: selectedObligation.keyId,\n obligationLocked: selectedObligation.locked,\n };\n};\n\n/**\n * Generate borrow incentive normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow incentive normal methods.\n */\nconst generateBorrowIncentiveNormalMethod: GenerateBorrowIncentiveNormalMethod =\n ({ builder, txBlock }) => {\n const borrowIncentiveIds: BorrowIncentiveIds = {\n borrowIncentivePkg: builder.address.get('borrowIncentive.id'),\n query: builder.address.get('borrowIncentive.query'),\n config: builder.address.get('borrowIncentive.config'),\n incentivePools: builder.address.get('borrowIncentive.incentivePools'),\n incentiveAccounts: builder.address.get(\n 'borrowIncentive.incentiveAccounts'\n ),\n obligationAccessStore: builder.address.get('core.obligationAccessStore'),\n };\n\n const veScaIds: Omit<VescaIds, 'pkgId'> = {\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n\n const clockObjectRef = txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n return {\n stakeObligation: (obligationId, obligationKey) => {\n builder.moveCall(\n txBlock,\n `${borrowIncentiveIds.borrowIncentivePkg}::user::stake`,\n [\n borrowIncentiveIds.config,\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligationKey,\n obligationId,\n borrowIncentiveIds.obligationAccessStore,\n clockObjectRef,\n ]\n );\n },\n stakeObligationWithVesca: (obligationId, obligationKey, veScaKey) => {\n builder.moveCall(\n txBlock,\n `${borrowIncentiveIds.borrowIncentivePkg}::user::stake_with_ve_sca`,\n [\n borrowIncentiveIds.config,\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligationKey,\n obligationId,\n borrowIncentiveIds.obligationAccessStore,\n veScaIds.config,\n veScaIds.treasury,\n veScaIds.table,\n veScaKey,\n clockObjectRef,\n ],\n []\n );\n },\n unstakeObligation: (obligationId, obligationKey) => {\n builder.moveCall(\n txBlock,\n `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n [\n borrowIncentiveIds.config,\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligationKey,\n obligationId,\n clockObjectRef,\n ]\n );\n },\n claimBorrowIncentive: (obligationId, obligationKey, rewardCoinName) => {\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return builder.moveCall(\n txBlock,\n `${borrowIncentiveIds.borrowIncentivePkg}::user::redeem_rewards`,\n [\n borrowIncentiveIds.config,\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligationKey,\n obligationId,\n clockObjectRef,\n ],\n [rewardType]\n );\n },\n deactivateBoost: (obligation, veScaKey) => {\n builder.moveCall(\n txBlock,\n `${borrowIncentiveIds.borrowIncentivePkg}::user::deactivate_boost`,\n [\n borrowIncentiveIds.config,\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligation,\n veScaKey,\n clockObjectRef,\n ]\n );\n },\n };\n };\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow Incentive quick methods.\n */\nconst generateBorrowIncentiveQuickMethod: GenerateBorrowIncentiveQuickMethod =\n ({ builder, txBlock }) => {\n return {\n stakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n const unstakeObligationBeforeStake =\n !!txBlock.txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n (txn.target ===\n `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` ||\n txn.target ===\n `${builder.address.get('borrowIncentive.id')}::user::unstake`)\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n txBlock.stakeObligation(obligationArg, obligationKeyArg);\n }\n },\n stakeObligationWithVeScaQuick: async (\n obligation,\n obligationKey,\n veScaKey\n ) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n const unstakeObligationBeforeStake =\n !!txBlock.txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n (txn.target ===\n `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` ||\n txn.target ===\n `${builder.address.get('borrowIncentive.id')}::user::unstake`)\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n const bindedVeScaKey =\n await builder.query.getBindedVeScaKey(obligationArg);\n\n const _veScaKey = bindedVeScaKey ?? veScaKey;\n if (!_veScaKey) {\n txBlock.stakeObligation(obligationArg, obligationKeyArg);\n } else {\n txBlock.stakeObligationWithVesca(\n obligationArg,\n obligationKeyArg,\n _veScaKey\n );\n }\n }\n },\n unstakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n if (obligationLocked) {\n txBlock.unstakeObligation(obligationArg, obligationKeyArg);\n }\n },\n claimBorrowIncentiveQuick: async (\n rewardCoinName,\n obligation,\n obligationKey\n ) => {\n // check for available reward coin names\n const { obligationId: obligationArg, obligationKey: obligationKeyArg } =\n await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n // return await txBlock.claimBorrowIncentive(\n return txBlock.claimBorrowIncentive(\n obligationArg,\n obligationKeyArg,\n rewardCoinName\n );\n },\n };\n };\n\n/**\n * Create an enhanced transaction block instance for interaction with borrow incentive modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop borrow incentive txBlock.\n */\nexport const newBorrowIncentiveTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateBorrowIncentiveNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithBorrowIncentiveNormalMethods;\n\n const quickMethod = generateBorrowIncentiveQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as BorrowIncentiveTxBlock;\n};\n","import {\n SUI_CLOCK_OBJECT_ID,\n SuiTxBlock,\n Transaction,\n SuiTxBlock as SuiKitTxBlock,\n} from '@scallop-io/sui-kit';\nimport { SCA_COIN_TYPE } from 'src/constants';\nimport { ScallopBuilder } from '../models';\nimport { getVeSca, getVeScas } from '../queries';\nimport {\n requireSender,\n checkLockSca,\n checkExtendLockPeriod,\n checkExtendLockAmount,\n checkRenewExpiredVeSca,\n checkVesca,\n} from '../utils';\nimport type {\n TransactionObjectArgument,\n SuiObjectArg,\n} from '@scallop-io/sui-kit';\nimport type {\n GenerateVeScaNormalMethod,\n GenerateVeScaQuickMethod,\n RedeemScaQuickReturnType,\n ScallopTxBlock,\n SuiTxBlockWithVeScaNormalMethods,\n VeScaTxBlock,\n VescaIds,\n} from 'src/types';\n\n/**\n * Check and get veSCA data from transaction block.\n *\n * @description\n * If the veScaKey id is provided, directly return it.\n * Otherwise, automatically get veScaKey from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param veScaKey - veSCA key.\n * @return veSCA key, ID, locked amount and unlock at timestamp.\n */\n\nexport const requireVeSca = async (\n ...params: [\n builder: ScallopBuilder,\n SuiTxBlock: SuiTxBlock,\n veScaKey?: SuiObjectArg,\n ]\n) => {\n const [builder, txBlock, veScaKey] = params;\n if (params.length === 3 && veScaKey && typeof veScaKey === 'string') {\n const veSca = await getVeSca(builder.utils, veScaKey);\n\n if (!veSca) {\n return undefined;\n }\n\n return veSca;\n }\n\n const sender = requireSender(txBlock);\n const veScas = await getVeScas(builder, sender);\n if (veScas.length === 0) {\n return undefined;\n }\n\n // return veSCA with the same veScaKey or the highest veSCA balance\n return veScaKey ? veScas.find(({ keyId }) => veScaKey === keyId) : veScas[0];\n};\n\n/**\n * Generate veSCA normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA normal methods.\n */\nconst generateNormalVeScaMethod: GenerateVeScaNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const veScaIds: VescaIds = {\n pkgId: builder.address.get('vesca.id'),\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n const clockObjectRef = txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n return {\n lockSca: (scaCoin, unlockAtInSecondTimestamp) => {\n return builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::mint_ve_sca_key`,\n [\n veScaIds.config,\n veScaIds.table,\n veScaIds.treasury,\n scaCoin,\n unlockAtInSecondTimestamp,\n clockObjectRef,\n ],\n []\n );\n },\n extendLockPeriod: (veScaKey, newUnlockAtInSecondTimestamp) => {\n builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::extend_lock_period`,\n [\n veScaIds.config,\n veScaKey,\n veScaIds.table,\n veScaIds.treasury,\n newUnlockAtInSecondTimestamp,\n clockObjectRef,\n ],\n []\n );\n },\n extendLockAmount: (veScaKey, scaCoin) => {\n builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::lock_more_sca`,\n [\n veScaIds.config,\n veScaKey,\n veScaIds.table,\n veScaIds.treasury,\n scaCoin,\n clockObjectRef,\n ],\n []\n );\n },\n renewExpiredVeSca: (veScaKey, scaCoin, newUnlockAtInSecondTimestamp) => {\n builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::renew_expired_ve_sca`,\n [\n veScaIds.config,\n veScaKey,\n veScaIds.table,\n veScaIds.treasury,\n scaCoin,\n newUnlockAtInSecondTimestamp,\n clockObjectRef,\n ],\n []\n );\n },\n redeemSca: (veScaKey) => {\n return builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::redeem`,\n [\n veScaIds.config,\n veScaKey,\n veScaIds.table,\n veScaIds.treasury,\n clockObjectRef,\n ],\n []\n );\n },\n mintEmptyVeSca: () => {\n return builder.moveCall(\n txBlock,\n `${veScaIds.pkgId}::ve_sca::mint_ve_sca_placeholder_key`,\n [veScaIds.config, veScaIds.table],\n []\n );\n },\n };\n};\n\n/**\n * Generate veSCA quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get veSca info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA quick methods.\n */\nconst generateQuickVeScaMethod: GenerateVeScaQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n lockScaQuick: async (amountOrCoin, lockPeriodInDays, autoCheck = true) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock);\n\n let scaCoin: TransactionObjectArgument | SuiObjectArg | undefined =\n undefined;\n const transferObjects = [];\n if (amountOrCoin !== undefined && typeof amountOrCoin === 'number') {\n const coins = await builder.utils.selectCoins(\n amountOrCoin,\n SCA_COIN_TYPE,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n coins,\n amountOrCoin\n );\n scaCoin = takeCoin;\n transferObjects.push(leftCoin);\n } else {\n // With amountOrCoin is SuiObjectArg, we cannot validate the minimum sca amount for locking and topup\n scaCoin = amountOrCoin;\n }\n\n const newUnlockAt = builder.utils.getUnlockAt(\n lockPeriodInDays,\n veSca?.unlockAt\n );\n\n if (autoCheck)\n checkLockSca(\n amountOrCoin,\n lockPeriodInDays,\n newUnlockAt,\n veSca?.unlockAt\n );\n\n const isInitialLock = !veSca?.unlockAt;\n const isLockExpired =\n !isInitialLock && veSca.unlockAt * 1000 <= new Date().getTime();\n if (isInitialLock || isLockExpired) {\n if (scaCoin) {\n if (isInitialLock) {\n const veScaKey = txBlock.lockSca(scaCoin, newUnlockAt);\n transferObjects.push(veScaKey);\n } else {\n // user must withdraw current unlocked SCA first if any\n if (veSca.lockedScaCoin !== 0) {\n const unlockedSca = txBlock.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n // enforce renew on expired\n txBlock.renewExpiredVeSca(veSca.keyId, scaCoin, newUnlockAt);\n }\n }\n } else {\n if (!!scaCoin && !!lockPeriodInDays) {\n txBlock.extendLockPeriod(veSca.keyId, newUnlockAt);\n txBlock.extendLockAmount(veSca.keyId, scaCoin);\n } else if (lockPeriodInDays) {\n txBlock.extendLockPeriod(veSca.keyId, newUnlockAt);\n } else if (scaCoin) {\n txBlock.extendLockAmount(veSca.keyId, scaCoin);\n }\n }\n\n if (transferObjects.length > 0) {\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n extendLockPeriodQuick: async (\n lockPeriodInDays: number,\n veScaKey?: SuiObjectArg,\n autoCheck = true\n ) => {\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n const newUnlockAt = builder.utils.getUnlockAt(\n lockPeriodInDays,\n veSca?.unlockAt\n );\n\n if (autoCheck)\n checkExtendLockPeriod(lockPeriodInDays, newUnlockAt, veSca?.unlockAt);\n\n if (veSca) {\n txBlock.extendLockPeriod(veSca.keyId, newUnlockAt);\n }\n },\n extendLockAmountQuick: async (\n scaAmount: number,\n veScaKey?: SuiObjectArg,\n autoCheck = true\n ) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n if (autoCheck) checkExtendLockAmount(scaAmount, veSca?.unlockAt);\n\n if (veSca) {\n const scaCoins = await builder.utils.selectCoins(\n scaAmount,\n SCA_COIN_TYPE,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n scaCoins,\n scaAmount\n );\n\n txBlock.extendLockAmount(veSca.keyId, takeCoin);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n renewExpiredVeScaQuick: async (\n scaAmount: number,\n lockPeriodInDays: number,\n veScaKey?: SuiObjectArg,\n autoCheck = true\n ) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n const newUnlockAt = builder.utils.getUnlockAt(\n lockPeriodInDays,\n veSca?.unlockAt\n );\n if (autoCheck)\n checkRenewExpiredVeSca(scaAmount, lockPeriodInDays, veSca?.unlockAt);\n\n if (veSca) {\n const transferObjects = [];\n if (veSca.lockedScaCoin !== 0) {\n const unlockedSca = txBlock.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n const scaCoins = await builder.utils.selectCoins(\n scaAmount,\n SCA_COIN_TYPE,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n scaCoins,\n scaAmount\n );\n transferObjects.push(leftCoin);\n\n txBlock.renewExpiredVeSca(veSca.keyId, takeCoin, newUnlockAt);\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n redeemScaQuick: async <S extends boolean>(\n veScaKey?: SuiObjectArg,\n transferSca: S = true as S\n ) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n checkVesca(veSca?.unlockAt);\n\n if (veSca) {\n const sca = txBlock.redeemSca(veSca.keyId);\n if (transferSca) {\n txBlock.transferObjects([sca], sender);\n return;\n }\n return sca as RedeemScaQuickReturnType<S>;\n }\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with veSCA modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop borrow incentive txBlock.\n */\nexport const newVeScaTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateNormalVeScaMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithVeScaNormalMethods;\n\n const quickMethod = generateQuickVeScaMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as VeScaTxBlock;\n};\n","import { ScallopBuilder } from 'src/models';\nimport { ScallopTxBlock, SupportCoins, SupportPoolCoins } from 'src/types';\nimport {\n SUI_CLOCK_OBJECT_ID,\n SuiTxBlock as SuiKitTxBlock,\n SuiObjectArg,\n Transaction,\n} from '@scallop-io/sui-kit';\nimport {\n GenerateReferralNormalMethod,\n GenerateReferralQuickMethod,\n ReferralIds,\n ReferralTxBlock,\n SuiTxBlockWithReferralNormalMethods,\n} from 'src/types/builder/referral';\nimport { SUPPORT_POOLS } from 'src/constants';\nimport { requireSender } from 'src/utils';\n\nconst generateReferralNormalMethod: GenerateReferralNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const referralIds: ReferralIds = {\n referralPgkId: builder.address.get('referral.id'),\n referralBindings: builder.address.get('referral.referralBindings'),\n referralRevenuePool: builder.address.get('referral.referralRevenuePool'),\n authorizedWitnessList: builder.address.get(\n 'referral.authorizedWitnessList'\n ),\n referralTiers: builder.address.get('referral.referralTiers'),\n version: builder.address.get('referral.version'),\n };\n\n const veScaTable = builder.address.get('vesca.table');\n const clockObjectRef = txBlock.sharedObjectRef({\n objectId: SUI_CLOCK_OBJECT_ID,\n mutable: false,\n initialSharedVersion: '1',\n });\n\n return {\n bindToReferral: (veScaKeyId: string) => {\n builder.moveCall(\n txBlock,\n `${referralIds.referralPgkId}::referral_bindings::bind_ve_sca_referrer`,\n [\n referralIds.referralBindings,\n txBlock.pure.id(veScaKeyId),\n veScaTable,\n clockObjectRef,\n ],\n []\n );\n },\n claimReferralTicket: (poolCoinName: SupportCoins) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return builder.moveCall(\n txBlock,\n `${referralIds.referralPgkId}::scallop_referral_program::claim_ve_sca_referral_ticket`,\n [\n referralIds.version,\n veScaTable,\n referralIds.referralBindings,\n referralIds.authorizedWitnessList,\n referralIds.referralTiers,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n burnReferralTicket: (ticket: SuiObjectArg, poolCoinName: SupportCoins) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n builder.moveCall(\n txBlock,\n `${referralIds.referralPgkId}::scallop_referral_program::burn_ve_sca_referral_ticket`,\n [\n referralIds.version,\n ticket,\n referralIds.referralRevenuePool,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n claimReferralRevenue: (\n veScaKey: SuiObjectArg,\n poolCoinName: SupportCoins\n ) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return builder.moveCall(\n txBlock,\n `${referralIds.referralPgkId}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,\n [\n referralIds.version,\n referralIds.referralRevenuePool,\n veScaKey,\n clockObjectRef,\n ],\n [coinType]\n );\n },\n };\n};\n\nconst generateReferralQuickMethod: GenerateReferralQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n claimReferralRevenueQuick: async (\n veScaKey: SuiObjectArg,\n coinNames: SupportPoolCoins[] = [...SUPPORT_POOLS]\n ) => {\n const sender = requireSender(txBlock);\n const objToTransfer: SuiObjectArg[] = [];\n for (const coinName of coinNames) {\n if (coinName === 'sui') {\n const rewardCoin = await txBlock.claimReferralRevenue(\n veScaKey,\n coinName\n );\n objToTransfer.push(rewardCoin);\n } else {\n const rewardCoin = await txBlock.claimReferralRevenue(\n veScaKey,\n coinName\n );\n try {\n // get the matching user coin if exists\n const coins = await builder.suiKit.suiInteractor.selectCoins(\n sender,\n Infinity,\n builder.utils.parseCoinType(coinName)\n );\n txBlock.mergeCoins(rewardCoin, coins.slice(0, 500));\n } catch (_e) {\n // ignore\n } finally {\n objToTransfer.push(rewardCoin);\n }\n }\n }\n if (objToTransfer.length > 0) {\n txBlock.transferObjects(objToTransfer, sender);\n }\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with borrow incentive modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop referral txBlock.\n */\nexport const newReferralTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateReferralNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithReferralNormalMethods;\n\n const quickMethod = generateReferralQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as ReferralTxBlock;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { coinIds } from 'src/constants';\nimport { ScallopBuilder } from 'src/models';\nimport {\n GenerateLoyaltyProgramNormalMethod,\n GenerateLoyaltyProgramQuickMethod,\n LoyaltyProgramIds,\n LoyaltyProgramTxBlock,\n ScallopTxBlock,\n SuiTxBlockWithLoyaltyProgramNormalMethods,\n} from 'src/types';\nimport { requireSender } from 'src/utils';\n\nconst generateLoyaltyProgramNormalMethod: GenerateLoyaltyProgramNormalMethod =\n ({ builder, txBlock }) => {\n const loyaltyProgramIds: LoyaltyProgramIds = {\n loyaltyProgramPkgId: builder.address.get('loyaltyProgram.id'),\n rewardPool: builder.address.get('loyaltyProgram.rewardPool'),\n userRewardTableId: builder.address.get(\n 'loyaltyProgram.userRewardTableId'\n ),\n };\n\n return {\n claimLoyaltyRevenue: (veScaKey) => {\n return builder.moveCall(\n txBlock,\n `${loyaltyProgramIds.loyaltyProgramPkgId}::reward_pool::redeem_reward`,\n [loyaltyProgramIds.rewardPool, veScaKey]\n );\n },\n };\n };\n\nconst generateLoyaltyProgramQuickMethod: GenerateLoyaltyProgramQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n claimLoyaltyRevenueQuick: async (veScaKey) => {\n veScaKey = veScaKey ?? (await builder.query.getVeScas())[0]?.keyObject;\n const sender = requireSender(txBlock);\n if (!veScaKey) throw new Error(`No veScaKey found for user ${sender}`);\n\n // claim the pending reward\n const rewardCoin = await txBlock.claimLoyaltyRevenue(veScaKey);\n\n // get existing sca coin to merge with\n await builder.utils.mergeSimilarCoins(\n txBlock,\n rewardCoin,\n coinIds.sca,\n requireSender(txBlock)\n );\n txBlock.transferObjects([rewardCoin], sender);\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with loyalty program modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop loyalty program txBlock.\n */\nexport const newLoyaltyProgramTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateLoyaltyProgramNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithLoyaltyProgramNormalMethods;\n\n const quickMethod = generateLoyaltyProgramQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as LoyaltyProgramTxBlock;\n};\n","import { Transaction, SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopBuilder } from 'src/models';\nimport {\n BaseScallopTxBlock,\n GenerateSCoinNormalMethod,\n GenerateSCoinQuickMethod,\n SCoinTxBlock,\n ScallopTxBlock,\n SuiTxBlockWithSCoinNormalMethods,\n sCoinPkgIds,\n} from 'src/types';\nimport { requireSender } from 'src/utils';\n\nconst generateSCoinNormalMethod: GenerateSCoinNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const sCoinPkgIds: sCoinPkgIds = {\n pkgId: builder.address.get('scoin.id'),\n };\n\n return {\n mintSCoin: (marketCoinName, marketCoin) => {\n return builder.moveCall(\n txBlock,\n `${sCoinPkgIds.pkgId}::s_coin_converter::mint_s_coin`,\n [builder.utils.getSCoinTreasury(marketCoinName), marketCoin],\n [\n builder.utils.parseSCoinType(marketCoinName),\n builder.utils.parseUnderlyingSCoinType(marketCoinName),\n ]\n );\n },\n burnSCoin: (sCoinName, sCoin) => {\n return builder.moveCall(\n txBlock,\n `${sCoinPkgIds.pkgId}::s_coin_converter::burn_s_coin`,\n [builder.utils.getSCoinTreasury(sCoinName), sCoin],\n [\n builder.utils.parseSCoinType(sCoinName),\n builder.utils.parseUnderlyingSCoinType(sCoinName),\n ]\n );\n },\n };\n};\n\nconst generateSCoinQuickMethod: GenerateSCoinQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n mintSCoinQuick: async (marketCoinName, amount) => {\n const sender = requireSender(txBlock);\n const { leftCoin, takeCoin } = await builder.selectMarketCoin(\n txBlock,\n marketCoinName,\n amount,\n sender\n );\n\n txBlock.transferObjects([leftCoin], sender);\n return await txBlock.mintSCoin(marketCoinName, takeCoin);\n },\n burnSCoinQuick: async (sCoinName, amount) => {\n const sender = requireSender(txBlock);\n const { leftCoin, takeCoin } = await builder.selectSCoin(\n txBlock,\n sCoinName,\n amount,\n sender\n );\n\n txBlock.transferObjects([leftCoin], sender);\n return await txBlock.burnSCoin(sCoinName, takeCoin);\n },\n };\n};\n\nexport const newSCoinTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?:\n | ScallopTxBlock\n | SuiKitTxBlock\n | Transaction\n | BaseScallopTxBlock\n) => {\n const txBlock =\n initTxBlock instanceof Transaction\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateSCoinNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithSCoinNormalMethods;\n\n const quickMethod = generateSCoinQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n\n return Reflect.get(target, prop);\n },\n }) as SCoinTxBlock;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { newCoreTxBlock } from './coreBuilder';\nimport { newSpoolTxBlock } from './spoolBuilder';\nimport { newBorrowIncentiveTxBlock } from './borrowIncentiveBuilder';\nimport { newVeScaTxBlock } from './vescaBuilder';\nimport type { ScallopBuilder } from '../models';\nimport type { ScallopTxBlock } from '../types';\nimport { newReferralTxBlock } from './referralBuilder';\nimport { newLoyaltyProgramTxBlock } from './loyaltyProgramBuilder';\nimport { newSCoinTxBlock } from './sCoinBuilder';\n\n/**\n * Create a new ScallopTxBlock instance.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return ScallopTxBlock.\n */\nexport const newScallopTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | Transaction\n): ScallopTxBlock => {\n const vescaTxBlock = newVeScaTxBlock(builder, initTxBlock);\n const loyaltyTxBlock = newLoyaltyProgramTxBlock(builder, vescaTxBlock);\n const borrowIncentiveTxBlock = newBorrowIncentiveTxBlock(\n builder,\n loyaltyTxBlock\n );\n const referralTxBlock = newReferralTxBlock(builder, borrowIncentiveTxBlock);\n const sCoinTxBlock = newSCoinTxBlock(builder, referralTxBlock);\n const spoolTxBlock = newSpoolTxBlock(builder, sCoinTxBlock);\n const coreTxBlock = newCoreTxBlock(builder, spoolTxBlock);\n\n return new Proxy(coreTxBlock, {\n get: (target, prop) => {\n if (prop in vescaTxBlock) {\n return Reflect.get(vescaTxBlock, prop);\n } else if (prop in borrowIncentiveTxBlock) {\n return Reflect.get(borrowIncentiveTxBlock, prop);\n } else if (prop in referralTxBlock) {\n return Reflect.get(referralTxBlock, prop);\n } else if (prop in spoolTxBlock) {\n return Reflect.get(spoolTxBlock, prop);\n } else if (prop in loyaltyTxBlock) {\n return Reflect.get(loyaltyTxBlock, prop);\n } else if (prop in sCoinTxBlock) {\n return Reflect.get(sCoinTxBlock, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as ScallopTxBlock;\n};\n","import axios, { AxiosInstance } from 'axios';\nimport { SDK_API_BASE_URL } from '../constants';\nimport type {\n Market,\n MarketPools,\n MarketPool,\n MarketCollaterals,\n MarketCollateral,\n Spools,\n Spool,\n BorrowIncentivePools,\n BorrowIncentivePool,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n TotalValueLocked,\n ScallopQueryParams,\n ScallopParams,\n BorrowIncentivePoolPoints,\n SupportBorrowIncentiveRewardCoins,\n ScallopIndexerInstanceParams,\n} from '../types';\nimport { ScallopCache } from './scallopCache';\nimport { queryKeys } from 'src/constants';\n\n/**\n * @description\n * It provides methods to obtain sdk index data from mainnet.\n *\n *\n * @example\n * ```typescript\n * const scallopIndexer = new scallopIndexer(<parameters>);\n * scallopIndexer.<indexer functions>();\n * await scallopIndexer.<indexer async functions>();\n * ```\n */\nexport class ScallopIndexer {\n private readonly cache: ScallopCache;\n public readonly params: ScallopQueryParams;\n private readonly _requestClient: AxiosInstance;\n\n public constructor(\n params: ScallopParams = {},\n instance?: ScallopIndexerInstanceParams\n ) {\n this.params = params;\n this.cache = instance?.cache ?? new ScallopCache(this.params);\n this._requestClient = axios.create({\n baseURL: SDK_API_BASE_URL,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30000,\n });\n }\n\n /**\n * Get market index data.\n *\n * @return Market data.\n */\n public async getMarket(): Promise<Pick<Market, 'pools' | 'collaterals'>> {\n const response = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.api.getMarket(),\n queryFn: async () => {\n return await this._requestClient.get<{\n pools: MarketPool[];\n collaterals: MarketCollateral[];\n }>(`/api/market/migrate`);\n },\n });\n\n if (response.status === 200) {\n return {\n pools: response.data.pools.reduce((marketPools, marketPool) => {\n marketPools[marketPool.coinName] = marketPool;\n return marketPools;\n }, {} as MarketPools),\n collaterals: response.data.collaterals.reduce(\n (marketCollaterals, marketCollateral) => {\n marketCollaterals[marketCollateral.coinName] = marketCollateral;\n return marketCollaterals;\n },\n {} as MarketCollaterals\n ),\n };\n } else {\n throw Error('Failed to getMarket.');\n }\n }\n\n /**\n * Get market pools index data.\n *\n * @return Market pools data.\n */\n public async getMarketPools(): Promise<Required<MarketPools>> {\n const response = (await this.getMarket()).pools;\n return response as Required<MarketPools>;\n }\n\n /**\n * Get market pool index data.\n *\n * @return Market pool data.\n */\n public async getMarketPool(\n poolCoinName: SupportPoolCoins\n ): Promise<MarketPool> {\n return (await this.getMarketPools())[poolCoinName] as MarketPool;\n }\n\n /**\n * Get market collaterals index data.\n *\n * @return Market collaterals data.\n */\n public async getMarketCollaterals(): Promise<Required<MarketCollaterals>> {\n return (await this.getMarket()).collaterals as Required<MarketCollaterals>;\n }\n\n /**\n * Get market collateral index data.\n *\n * @return Market collateral data.\n */\n public async getMarketCollateral(\n collateralCoinName: SupportCollateralCoins\n ): Promise<MarketCollateral> {\n return (await this.getMarketCollaterals())[\n collateralCoinName\n ] as MarketCollateral;\n }\n\n /**\n * Get spools index data.\n *\n * @return Spools data.\n */\n public async getSpools(): Promise<Required<Spools>> {\n const response = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.api.getSpools(),\n queryFn: async () => {\n return await this._requestClient.get<{\n spools: Spool[];\n }>(`/api/spools/migrate`);\n },\n });\n\n if (response.status === 200) {\n return response.data.spools.reduce((spools, spool) => {\n spools[spool.marketCoinName] = spool;\n return spools;\n }, {} as Spools) as Required<Spools>;\n } else {\n throw Error('Failed to getSpools.');\n }\n }\n\n /**\n * Get spool index data.\n *\n * @return Spool data.\n */\n public async getSpool(\n marketCoinName: SupportStakeMarketCoins\n ): Promise<Spool> {\n return (await this.getSpools())[marketCoinName] as Spool;\n }\n\n /**\n * Get borrow incentive pools index data.\n *\n * @return Borrow incentive pools data.\n */\n public async getBorrowIncentivePools(): Promise<\n Required<BorrowIncentivePools>\n > {\n const response = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.api.getBorrowIncentivePool(),\n queryFn: async () => {\n return await this._requestClient.get<{\n borrowIncentivePools: BorrowIncentivePool[];\n }>(`/api/borrowIncentivePools/migrate`);\n },\n });\n\n if (response.status === 200) {\n return response.data.borrowIncentivePools.reduce(\n (borrowIncentivePools, borrowIncentivePool) => {\n if (Array.isArray(borrowIncentivePool.points)) {\n borrowIncentivePool.points = (\n borrowIncentivePool.points as BorrowIncentivePoolPoints[]\n ).reduce(\n (prev, curr) => {\n prev[curr.coinName] = curr;\n return prev;\n },\n {} as Record<\n SupportBorrowIncentiveRewardCoins,\n BorrowIncentivePoolPoints\n >\n );\n }\n borrowIncentivePools[borrowIncentivePool.coinName] =\n borrowIncentivePool;\n return borrowIncentivePools;\n },\n {} as BorrowIncentivePools\n ) as Required<BorrowIncentivePools>;\n } else {\n throw Error('Failed to getBorrowIncentivePools.');\n }\n }\n\n /**\n * Get borrow incentive pool index data.\n *\n * @return Borrow incentive pool data.\n */\n public async getBorrowIncentivePool(\n borrowIncentiveCoinName: SupportBorrowIncentiveCoins\n ): Promise<BorrowIncentivePool> {\n return (await this.getBorrowIncentivePools())[\n borrowIncentiveCoinName\n ] as BorrowIncentivePool;\n }\n\n /**\n * Get total value locked index data.\n *\n * @return Total value locked.\n */\n public async getTotalValueLocked(): Promise<\n TotalValueLocked & {\n totalValueChangeRatio: number;\n borrowValueChangeRatio: number;\n supplyValueChangeRatio: number;\n }\n > {\n const response = await this.cache.queryClient.fetchQuery({\n queryKey: queryKeys.api.getTotalValueLocked(),\n queryFn: async () => {\n return await this._requestClient.get<\n TotalValueLocked & {\n totalValueChangeRatio: number;\n borrowValueChangeRatio: number;\n supplyValueChangeRatio: number;\n }\n >(`/api/market/tvl`);\n },\n });\n\n if (response.status === 200) {\n return response.data;\n } else {\n throw Error('Failed to getTotalValueLocked.');\n }\n }\n\n /**\n * Get coin price index data.\n *\n * @return price data.\n */\n public async getCoinPrice(poolCoinName: SupportPoolCoins): Promise<number> {\n return (await this.getMarketPool(poolCoinName))?.coinPrice ?? 0;\n }\n\n public async getCoinPrices(): Promise<Record<string, number>> {\n const marketPools = await this.getMarketPools();\n return Object.entries(marketPools).reduce(\n (prev, [coinName, market]) => {\n prev[coinName] = market.coinPrice;\n return prev;\n },\n {} as Record<string, number>\n );\n }\n}\n","import { SuiKit, SuiObjectArg } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID, SUPPORT_POOLS, SUPPORT_SPOOLS } from '../constants';\nimport {\n queryMarket,\n getObligations,\n queryObligation,\n getStakeAccounts,\n getStakePool,\n getStakeRewardPool,\n getPythPrice,\n getMarketPools,\n getMarketCollaterals,\n getMarketCollateral,\n getSpools,\n queryBorrowIncentiveAccounts,\n getCoinAmounts,\n getCoinAmount,\n getMarketCoinAmounts,\n getMarketCoinAmount,\n getLendings,\n getLending,\n getObligationAccounts,\n getTotalValueLocked,\n queryVeScaKeyIdFromReferralBindings,\n getBindedObligationId,\n getBindedVeScaKey,\n getVeScas,\n getPythPrices,\n getVeScaTreasuryInfo,\n getLoyaltyProgramInformations,\n getFlashLoanFees,\n getVeSca,\n getBorrowIncentivePools,\n getBorrowLimit,\n getIsolatedAssets,\n // isIsolatedAsset,\n getSupplyLimit,\n getSCoinAmount,\n getSCoinAmounts,\n getSCoinSwapRate,\n getSCoinTotalSupply,\n getAllCoinPrices,\n getAllAddresses,\n isIsolatedAsset,\n getUserPortfolio,\n getPriceUpdatePolicies,\n getAssetOracles,\n} from '../queries';\nimport {\n ScallopQueryParams,\n SupportStakeMarketCoins,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportMarketCoins,\n StakePools,\n StakeRewardPools,\n SupportBorrowIncentiveCoins,\n SupportSCoin,\n ScallopQueryInstanceParams,\n MarketPool,\n CoinPrices,\n MarketPools,\n MarketCollaterals,\n xOracleRules,\n} from '../types';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ScallopIndexer } from './scallopIndexer';\nimport { ScallopCache } from './scallopCache';\nimport { SuiObjectData } from '@mysten/sui/client';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\nimport { withIndexerFallback } from 'src/utils/indexer';\nimport { newSuiKit } from './suiKit';\nimport { SuiObjectRef } from '@mysten/sui/client';\n/**\n * @description\n * It provides methods for getting on-chain data from the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopQuery = new ScallopQuery(<parameters>);\n * await scallopQuery.init();\n * scallopQuery.<query functions>();\n * await scallopQuery.<query functions>();\n * ```\n */\nexport class ScallopQuery {\n public readonly params: ScallopQueryParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public utils: ScallopUtils;\n public indexer: ScallopIndexer;\n public cache: ScallopCache;\n public walletAddress: string;\n\n public constructor(\n params: ScallopQueryParams = {},\n instance?: ScallopQueryInstanceParams\n ) {\n this.params = params;\n this.suiKit =\n instance?.suiKit ?? instance?.utils?.suiKit ?? newSuiKit(params);\n\n this.walletAddress = normalizeSuiAddress(\n params.walletAddress ?? this.suiKit.currentAddress()\n );\n\n if (instance?.utils) {\n this.utils = instance.utils;\n this.address = instance.utils.address;\n this.cache = this.address.cache;\n } else {\n this.cache = new ScallopCache(this.params, {\n suiKit: this.suiKit,\n });\n this.address = new ScallopAddress(\n {\n id: params?.addressesId ?? ADDRESSES_ID,\n network: params?.networkType,\n forceInterface: params?.forceAddressesInterface,\n },\n {\n cache: this.cache,\n }\n );\n this.utils = new ScallopUtils(this.params, {\n address: this.address,\n });\n }\n this.indexer =\n instance?.indexer ??\n new ScallopIndexer(this.params, { cache: this.cache });\n\n // Wrap any method that has an indexer parameter as the last parameter\n this.queryMarket = withIndexerFallback.call(this, this.queryMarket);\n this.getMarketPools = withIndexerFallback.call(this, this.getMarketPools);\n this.getMarketPool = withIndexerFallback.call(this, this.getMarketPool);\n this.getMarketCollaterals = withIndexerFallback.call(\n this,\n this.getMarketCollaterals\n );\n this.getMarketCollateral = withIndexerFallback.call(\n this,\n this.getMarketCollateral\n );\n this.getSpools = withIndexerFallback.call(this, this.getSpools);\n this.getSpool = withIndexerFallback.call(this, this.getSpool);\n this.getBorrowIncentivePools = withIndexerFallback.call(\n this,\n this.getBorrowIncentivePools\n );\n this.getLendings = withIndexerFallback.call(this, this.getLendings);\n this.getLending = withIndexerFallback.call(this, this.getLending);\n this.getObligationAccounts = withIndexerFallback.call(\n this,\n this.getObligationAccounts\n );\n this.getObligationAccount = withIndexerFallback.call(\n this,\n this.getObligationAccount\n );\n this.getTvl = withIndexerFallback.call(this, this.getTvl);\n }\n\n /* ========================================================== */\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public async init(force: boolean = false, address?: ScallopAddress) {\n if (address && !this.address) {\n this.address = address;\n }\n if (force || !this.address.getAddresses()) {\n await this.address.read();\n }\n\n await this.utils.init(force, this.address);\n }\n\n /* ==================== Core Query Methods ==================== */\n\n /**\n * @deprecated use getMarketPools\n * Query market data.\n * @param indexer - Whether to use indexer.\n * @return Market data.\n */\n public async queryMarket(args?: {\n coinPrices?: CoinPrices;\n indexer?: boolean;\n }) {\n return await queryMarket(this, args?.indexer, args?.coinPrices);\n }\n\n /**\n * Get market pools.\n *\n * @description\n * To obtain all market pools at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pools data.\n */\n public async getMarketPools(\n poolCoinNames: SupportPoolCoins[] = [...SUPPORT_POOLS],\n args?: {\n coinPrices?: CoinPrices;\n indexer?: boolean;\n }\n ) {\n return await getMarketPools(\n this,\n poolCoinNames,\n args?.indexer,\n args?.coinPrices\n );\n }\n\n /**\n * Get market pool\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pool data.\n */\n public async getMarketPool(\n poolCoinName: SupportPoolCoins,\n args?: {\n coinPrice?: number;\n indexer?: boolean;\n }\n ) {\n const marketPools = await this.getMarketPools(undefined, args);\n return marketPools.pools[poolCoinName];\n // return await getMarketPool(\n // this,\n // poolCoinName,\n // args?.indexer,\n // args?.marketObject,\n // args?.coinPrice\n // );\n }\n\n /**\n * Get market collaterals.\n *\n * @description\n * To obtain all market collaterals at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collaterals data.\n */\n public async getMarketCollaterals(\n collateralCoinNames?: SupportCollateralCoins[],\n args?: { indexer?: boolean }\n ) {\n return await getMarketCollaterals(this, collateralCoinNames, args?.indexer);\n }\n\n /**\n * Get market collateral\n *\n * @param collateralCoinName - Specific support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collateral data.\n */\n public async getMarketCollateral(\n collateralCoinName: SupportCollateralCoins,\n args?: { indexer?: boolean }\n ) {\n return await getMarketCollateral(this, collateralCoinName, args?.indexer);\n }\n\n /**\n * Get obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress: string = this.walletAddress) {\n return await getObligations(this, ownerAddress);\n }\n\n /**\n * Query obligation data.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(\n obligationId: SuiObjectArg,\n args?: {\n version: SuiObjectArg;\n market: SuiObjectArg;\n }\n ) {\n return queryObligation(this, obligationId, args?.version, args?.market);\n }\n\n /**\n * Get all asset coin amounts.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All coin amounts.\n */\n public async getCoinAmounts(\n assetCoinNames?: SupportAssetCoins[],\n ownerAddress: string = this.walletAddress\n ) {\n return await getCoinAmounts(this, assetCoinNames, ownerAddress);\n }\n\n /**\n * Get asset coin amount.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Coin amount.\n */\n public async getCoinAmount(\n assetCoinName: SupportAssetCoins,\n ownerAddress: string = this.walletAddress\n ) {\n return await getCoinAmount(this, assetCoinName, ownerAddress);\n }\n\n /**\n * Get all market coin amounts.\n *\n * @param coinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All market market coin amounts.\n */\n public async getMarketCoinAmounts(\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress: string = this.walletAddress\n ) {\n return await getMarketCoinAmounts(this, marketCoinNames, ownerAddress);\n }\n\n /**\n * Get market coin amount.\n *\n * @param coinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Market market coin amount.\n */\n public async getMarketCoinAmount(\n marketCoinName: SupportMarketCoins,\n ownerAddress: string = this.walletAddress\n ) {\n return await getMarketCoinAmount(this, marketCoinName, ownerAddress);\n }\n\n /**\n * Get price from pyth fee object.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\n public async getPriceFromPyth(assetCoinName: SupportAssetCoins) {\n return await getPythPrice(this, assetCoinName);\n }\n\n /**\n * Get prices from pyth fee object.\n *\n * @param assetCoinNames - Array of supported asset coin names.\n * @return Array of asset coin prices.\n */\n public async getPricesFromPyth(assetCoinNames: SupportAssetCoins[]) {\n return await getPythPrices(this, assetCoinNames);\n }\n\n /* ==================== Spool Query Methods ==================== */\n\n /**\n * Get spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spools data.\n */\n public async getSpools(\n stakeMarketCoinNames?: SupportStakeMarketCoins[],\n args?: {\n marketPools?: MarketPools;\n coinPrices?: CoinPrices;\n indexer?: boolean;\n }\n ) {\n return await getSpools(\n this,\n stakeMarketCoinNames,\n args?.indexer,\n args?.marketPools,\n args?.coinPrices\n );\n }\n\n /**\n * Get spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spool data.\n */\n public async getSpool(\n stakeMarketCoinName: SupportStakeMarketCoins,\n args?: {\n marketPool?: MarketPool;\n coinPrices?: CoinPrices;\n indexer?: boolean;\n }\n ) {\n const spools = await this.getSpools(undefined, args);\n return spools[stakeMarketCoinName];\n }\n\n /**\n * Get stake accounts data for all stake pools (spools).\n *\n * @param ownerAddress - The owner address.\n * @return All Stake accounts data.\n */\n public async getAllStakeAccounts(ownerAddress: string = this.walletAddress) {\n return await getStakeAccounts(this, ownerAddress);\n }\n\n /**\n * Get stake accounts data for specific stake pool (spool).\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n public async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress: string = this.walletAddress\n ) {\n const allStakeAccount = await this.getAllStakeAccounts(ownerAddress);\n return allStakeAccount[stakeMarketCoinName] ?? [];\n }\n\n /**\n * Get stake pools (spools) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Stake pools data.\n */\n public async getStakePools(\n stakeMarketCoinNames: SupportStakeMarketCoins[] = [...SUPPORT_SPOOLS]\n ) {\n const stakePools: StakePools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakePool = await getStakePool(this, stakeMarketCoinName);\n\n if (stakePool) {\n stakePools[stakeMarketCoinName] = stakePool;\n }\n }\n\n return stakePools;\n }\n\n /**\n * Get stake pool (spool) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get all spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\n public async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await getStakePool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake reward pools data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of stake market coin name.\n * @return Stake reward pools data.\n */\n public async getStakeRewardPools(\n stakeMarketCoinNames: SupportStakeMarketCoins[] = [...SUPPORT_SPOOLS]\n ) {\n const stakeRewardPools: StakeRewardPools = {};\n await Promise.allSettled(\n stakeMarketCoinNames.map(async (stakeMarketCoinName) => {\n const stakeRewardPool = await getStakeRewardPool(\n this,\n stakeMarketCoinName\n );\n\n if (stakeRewardPool) {\n stakeRewardPools[stakeMarketCoinName] = stakeRewardPool;\n }\n })\n );\n return stakeRewardPools;\n }\n\n /**\n * Get stake reward pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get spool data.\n *\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool data.\n */\n public async getStakeRewardPool(\n stakeMarketCoinName: SupportStakeMarketCoins\n ) {\n return await getStakeRewardPool(this, stakeMarketCoinName);\n }\n\n /**\n * Get borrow incentive pools data.\n *\n * @param coinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\n public async getBorrowIncentivePools(\n coinNames?: SupportBorrowIncentiveCoins[],\n args?: {\n coinPrices?: CoinPrices;\n indexer?: boolean;\n marketPools?: MarketPools;\n }\n ) {\n return await getBorrowIncentivePools(\n this,\n coinNames,\n args?.indexer,\n args?.marketPools,\n args?.coinPrices\n );\n }\n\n /**\n * Get borrow incentive accounts data.\n *\n * @param coinNames - Specific support borrow incentive coin name.\n * @param ownerAddress - The owner address.\n * @return Borrow incentive accounts data.\n */\n public async getBorrowIncentiveAccounts(\n obligationId: string | SuiObjectRef,\n coinNames?: SupportBorrowIncentiveCoins[]\n ) {\n return await queryBorrowIncentiveAccounts(this, obligationId, coinNames);\n }\n\n /**\n * Get user lending and spool infomation for specific pools.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All lending and spool infomation.\n */\n public async getLendings(\n poolCoinNames?: SupportPoolCoins[],\n ownerAddress: string = this.walletAddress,\n args?: {\n indexer?: boolean;\n marketPools?: MarketPools;\n coinPrices?: CoinPrices;\n }\n ) {\n return await getLendings(\n this,\n poolCoinNames,\n ownerAddress,\n args?.marketPools,\n args?.coinPrices,\n args?.indexer\n );\n }\n\n /**\n * Get user lending and spool information for specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return Lending pool data.\n */\n public async getLending(\n poolCoinName: SupportPoolCoins,\n ownerAddress: string = this.walletAddress,\n args?: { indexer?: boolean }\n ) {\n return await getLending(this, poolCoinName, ownerAddress, args?.indexer);\n }\n\n /**\n * Get user all obligation accounts information.\n *\n * @description\n * All collateral and borrowing information in all obligation accounts owned by the user.\n *\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All obligation accounts information.\n */\n public async getObligationAccounts(\n ownerAddress: string = this.walletAddress,\n args?: {\n indexer?: boolean;\n market?: {\n collaterals: MarketCollaterals;\n pools: MarketPools;\n };\n coinPrices?: CoinPrices;\n }\n ) {\n return await getObligationAccounts(\n this,\n ownerAddress,\n args?.market,\n args?.coinPrices,\n args?.indexer\n );\n }\n\n /**\n * Get obligation account information for specific id.\n *\n * @description\n * borrowing and obligation information for specific pool.\n *\n * @param obligationId - The obligation id.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return Borrowing and collateral information.\n */\n public async getObligationAccount(\n obligationId: string,\n ownerAddress: string = this.walletAddress,\n args?: { indexer?: boolean }\n ) {\n const results = await this.getObligationAccounts(ownerAddress, args);\n return Object.values(results).find(\n (obligation) => obligation?.obligationId === obligationId\n );\n }\n\n /**\n * Get total value locked.\n *\n * @param indexer - Whether to use indexer.\n * @description\n * Include total supplied value and total borrowed value.\n *\n * @return Total value locked.\n */\n public async getTvl(args?: { indexer?: boolean }) {\n return await getTotalValueLocked(this, args?.indexer);\n }\n\n /**\n * Get veSca data.\n * @param veScaKey\n * @returns veSca\n */\n public async getVeSca(veScaKey: string | SuiObjectData) {\n return await getVeSca(this.utils, veScaKey);\n }\n\n /**\n * Get all veSca from walletAdddress\n * @param walletAddress\n * @returns array of veSca\n */\n public async getVeScas({\n walletAddress = this.walletAddress,\n excludeEmpty = false,\n }: {\n walletAddress?: string;\n excludeEmpty?: boolean;\n } = {}) {\n return await getVeScas(this, walletAddress, excludeEmpty);\n }\n\n /**\n * Get total vesca treasury with movecall\n * @returns Promise<string | undefined>\n */\n public async getVeScaTreasuryInfo() {\n return await getVeScaTreasuryInfo(this.utils);\n }\n\n /**\n * Return binded referrer veScaKeyId of referee walletAddress if exist\n * @param walletAddress\n * @returns veScaKeyId\n */\n public async getVeScaKeyIdFromReferralBindings(\n walletAddress: string = this.walletAddress\n ) {\n return await queryVeScaKeyIdFromReferralBindings(\n this.address,\n walletAddress\n );\n }\n\n /**\n * Get binded obligationId from a veScaKey if it exists.\n * @param veScaKey\n * @returns obligationId\n */\n public async getBindedObligationId(veScaKey: string) {\n return await getBindedObligationId(this, veScaKey);\n }\n\n /**\n * Get binded veSCA key from a obligationId if it exists.\n * @param obligationId\n * @returns veScaKey\n */\n public async getBindedVeScaKey(obligationId: string) {\n return await getBindedVeScaKey(this, obligationId);\n }\n\n /**\n * Get user's veSCA loyalty program informations\n * @param walletAddress\n * @returns Loyalty program information\n */\n public async getLoyaltyProgramInfos(veScaKey?: string | SuiObjectData) {\n return await getLoyaltyProgramInformations(this, veScaKey);\n }\n\n /**\n * Get total supply of sCoin\n * @param sCoinName - Supported sCoin name\n * @returns Total Supply\n */\n public async getSCoinTotalSupply(sCoinName: SupportSCoin) {\n return await getSCoinTotalSupply(this, sCoinName);\n }\n\n /**\n * Get all sCoin amounts.\n *\n * @param sCoinNames - Specific an array of support sCoin name.\n * @param ownerAddress - The owner address.\n * @return All market sCoin amounts.\n */\n public async getSCoinAmounts(\n sCoinNames?: SupportSCoin[],\n ownerAddress: string = this.walletAddress\n ) {\n return await getSCoinAmounts(this, sCoinNames, ownerAddress);\n }\n\n /**\n * Get sCoin amount.\n *\n * @param coinNames - Specific support sCoin name.\n * @param ownerAddress - The owner address.\n * @return sCoin amount.\n */\n public async getSCoinAmount(\n sCoinName: SupportSCoin | SupportMarketCoins,\n ownerAddress: string = this.walletAddress\n ) {\n const parsedSCoinName = this.utils.parseSCoinName(sCoinName);\n return parsedSCoinName\n ? await getSCoinAmount(this, parsedSCoinName, ownerAddress)\n : 0;\n }\n\n /**\n * Get swap rate from sCoin A to sCoin B\n * @param assetCoinNames\n * @returns\n */\n public async getSCoinSwapRate(\n fromSCoin: SupportSCoin,\n toSCoin: SupportSCoin\n ) {\n return await getSCoinSwapRate(this, fromSCoin, toSCoin);\n }\n\n /*\n * Get flashloan fee for specified assets\n */\n public async getFlashLoanFees(\n assetCoinNames: SupportAssetCoins[] = [...SUPPORT_POOLS]\n ) {\n return await getFlashLoanFees(this, assetCoinNames);\n }\n\n /**\n * Get supply limit of lending pool\n */\n public async getPoolSupplyLimit(poolName: SupportPoolCoins) {\n return await getSupplyLimit(this.utils, poolName);\n }\n\n /**\n * Get borrow limit of borrow pool\n */\n public async getPoolBorrowLimit(poolName: SupportPoolCoins) {\n return await getBorrowLimit(this.utils, poolName);\n }\n\n /**\n * Get list of isolated assets\n */\n public async getIsolatedAssets() {\n return await getIsolatedAssets(this);\n }\n\n /**\n * Check if asset is an isolated asset\n */\n public async isIsolatedAsset(assetCoinName: SupportAssetCoins) {\n return isIsolatedAsset(this.utils, assetCoinName);\n }\n\n /**\n * Get pool coin price from indexer\n * @param coinName\n * @returns price data\n */\n public async getCoinPriceByIndexer(poolName: SupportPoolCoins) {\n return this.indexer.getCoinPrice(poolName);\n }\n\n /**\n * Get all supported pool price from indexer\n * @returns prices data\n */\n public async getCoinPricesByIndexer() {\n return this.indexer.getCoinPrices();\n }\n\n /**\n * Get all coin prices, including sCoin\n * @returns prices data\n */\n public async getAllCoinPrices(args?: {\n marketPools?: MarketPools;\n coinPrices?: CoinPrices;\n indexer?: boolean;\n }) {\n return getAllCoinPrices(\n this,\n args?.marketPools,\n args?.coinPrices,\n args?.indexer\n );\n }\n\n /**\n * Query all address (lending pool, collateral pool, borrow dynamics, interest models, etc.) of all pool\n * @returns\n */\n public async getPoolAddresses(poolNames?: SupportPoolCoins[]) {\n return getAllAddresses(this, poolNames);\n }\n\n /**\n * Get user portfolio\n */\n public async getUserPortfolio(args?: {\n walletAddress?: string;\n indexer?: boolean;\n }) {\n return getUserPortfolio(\n this,\n args?.walletAddress ?? this.walletAddress,\n args?.indexer ?? false\n );\n }\n\n /**\n * Get both primary and secondary price update policy objects\n * @returns price update policies\n */\n public async getPriceUpdatePolicies() {\n return await getPriceUpdatePolicies(this.address);\n }\n\n /**\n * Return the supported primary and secondary oracles for all supported pool assets\n * @returns\n */\n public async getAssetOracles() {\n const [primary, secondary] = await Promise.all([\n getAssetOracles(this.utils, 'primary'),\n getAssetOracles(this.utils, 'secondary'),\n ]);\n\n return SUPPORT_POOLS.reduce(\n (acc, pool) => {\n acc[pool] = {\n primary: primary[pool] ?? [],\n secondary: secondary[pool] ?? [],\n };\n return acc;\n },\n {} as Record<SupportAssetCoins, xOracleRules>\n );\n }\n}\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopClient } from './scallopClient';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID } from '../constants';\nimport type {\n ScallopBuilderParams,\n ScallopClientParams,\n ScallopParams,\n ScallopQueryParams,\n ScallopUtilsParams,\n} from '../types/';\nimport { ScallopIndexer } from './scallopIndexer';\nimport { ScallopCache } from './scallopCache';\nimport { QueryClientConfig } from '@tanstack/query-core';\nimport type { QueryClient } from '@tanstack/query-core';\nimport { newSuiKit } from './suiKit';\n\n/**\n * @argument params - The parameters for the Scallop instance.\n * @argument cacheOptions - The cache options for the QueryClient.\n *\n * @description\n * The main instance that controls interaction with the Scallop contract.\n *\n * @example\n * ```typescript\n * const sdk = new Scallop(<parameters>);\n * const scallopAddress = await sdk.getScallopAddress();\n * const scallopBuilder = await sdk.createScallopBuilder();\n * const scallopClient = await sdk.createScallopClient();\n * const scallopIndexer= await sdk.createScallopIndexer();\n * const scallopUtils= await sdk.createScallopUtils();\n * ```\n */\nexport class Scallop {\n public params: ScallopParams;\n public suiKit: SuiKit;\n public cache: ScallopCache;\n\n private address: ScallopAddress;\n\n public constructor(\n params: ScallopParams,\n cacheOptions?: QueryClientConfig,\n queryClient?: QueryClient\n ) {\n this.params = params;\n this.suiKit = newSuiKit(params);\n this.cache = new ScallopCache(\n {\n ...this.params,\n cacheOptions,\n },\n {\n suiKit: this.suiKit,\n queryClient,\n }\n );\n this.address = new ScallopAddress(\n {\n id: params?.addressesId ?? ADDRESSES_ID,\n network: params?.networkType,\n forceInterface: params?.forceAddressesInterface,\n },\n { cache: this.cache }\n );\n }\n\n /**\n * Get a scallop address instance that already has read addresses.\n *\n * @param id - The API id of the addresses.\n * @return Scallop Address.\n */\n public async getScallopAddress(id?: string) {\n await this.address.read(id);\n\n return this.address;\n }\n\n /**\n * Create a scallop builder instance that already has initial data.\n *\n * @return Scallop Builder.\n */\n public async createScallopBuilder(params?: ScallopBuilderParams) {\n if (!this.address.getAddresses()) await this.address.read();\n const builderParams = {\n ...this.params,\n ...params,\n };\n const scallopBuilder = new ScallopBuilder(builderParams, {\n query: await this.createScallopQuery(builderParams),\n });\n\n return scallopBuilder;\n }\n\n /**\n * Create a scallop client instance that already has initial data.\n *\n * @param walletAddress - When user cannot provide a secret key or mnemonic, the scallop client cannot directly derive the address of the transaction the user wants to sign. This argument specifies the wallet address for signing the transaction.\n * @return Scallop Client.\n */\n public async createScallopClient(params?: ScallopClientParams) {\n if (!this.address.getAddresses()) await this.address.read();\n const clientParams = {\n ...this.params,\n ...params,\n };\n const scallopClient = new ScallopClient(clientParams, {\n builder: await this.createScallopBuilder(clientParams),\n });\n\n return scallopClient;\n }\n\n /**\n * Create a scallop query instance.\n *\n * @return Scallop Query.\n */\n public async createScallopQuery(params?: ScallopQueryParams) {\n if (!this.address.getAddresses()) await this.address.read();\n const queryParams = {\n ...this.params,\n ...params,\n };\n const scallopQuery = new ScallopQuery(queryParams, {\n utils: await this.createScallopUtils(queryParams),\n });\n\n return scallopQuery;\n }\n\n /**\n * Create a scallop indexer instance.\n *\n * @return Scallop Indexer.\n */\n public async createScallopIndexer() {\n const scallopIndexer = new ScallopIndexer(this.params, {\n cache: this.cache,\n });\n\n return scallopIndexer;\n }\n\n /**\n * Create a scallop utils instance.\n *\n * @return Scallop Utils.\n */\n public async createScallopUtils(params?: ScallopUtilsParams) {\n if (!this.address.getAddresses()) await this.address.read();\n const scallopUtils = new ScallopUtils(\n {\n ...this.params,\n ...params,\n },\n {\n address: this.address,\n suiKit: this.suiKit,\n }\n );\n\n return scallopUtils;\n }\n}\n"],"mappings":"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A,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,eACE;AAAA,IACF,gBACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,cACE;AAAA,MACF,gBACE;AAAA,MACF,gBACE;AAAA,MACF,OACE;AAAA,MACF,aACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,iBACE;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,IACA,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,OACE;AAAA,MACF,aACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACH,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,cACE;AAAA,MACF,gBACE;AAAA,MACF,gBACE;AAAA,MACF,OACE;AAAA,MACF,aACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,iBACE;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,IACA,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,OACE;AAAA,MACF,aACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,UACE;AAAA,IACF,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,uBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,OAAO;AAAA,IACP,aACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACH,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,cACE;AAAA,MACF,gBACE;AAAA,MACF,gBACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,iBACE;AAAA,MACF,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,IACA,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,uBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EACA,KAAK;AAAA,IACH,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,cACE;AAAA,MACF,gBACE;AAAA,MACF,gBACE;AAAA,MACF,kBACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,iBACE;AAAA,MACF,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,IACA,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,oBACE;AAAA,IACF,eACE;AAAA,IACF,eACE;AAAA,IACF,cACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,kBACE;AAAA,IACF,eACE;AAAA,IACF,WACE;AAAA,IACF,gBACE;AAAA,IACF,UACE;AAAA,IACF,iBACE;AAAA,IACF,UAAU;AAAA,IACV,UACE;AAAA,IACF,kBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,cACE;AAAA,MACF,gBACE;AAAA,MACF,gBACE;AAAA,MACF,kBACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MACF,UACE;AAAA,MACF,iBACE;AAAA,MACF,UAAU;AAAA,MACV,UACE;AAAA,MACF,kBACE;AAAA,IACJ;AAAA,IACA,GAAG;AAAA,MACD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,oBACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,eACE;AAAA,MACF,WACE;AAAA,MACF,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBACE;AAAA,MA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","names":["network","addresses","normalizeSuiAddress","SUI_TYPE_ARG","normalizeStructTag","normalizeStructTag","normalizeStructTag","parseStructTag","assetCoinName","BigNumber","normalizeStructTag","normalizeStructTag","BigNumber","zod","zod","coinType","zod","normalizeStructTag","tasks","assetCoins","BigNumber","marketCoins","BigNumber","zod","BigNumber","normalizeStructTag","marketCoinName","BigNumber","collateral","requiredCollateralValue","debt","coinName","tvl","BigNumber","BigNumber","BigNumber","sCoins","normalizeStructTag","tasks","coinName","rewardCoinName","normalizeStructTag","BigNumber","SUI_CLOCK_OBJECT_ID","SuiTxBlock","bcs","zod","assert","zod","BigNumber","SuiTxBlock","SUI_CLOCK_OBJECT_ID","bcs","normalizeStructTag","coinName","SUI_TYPE_ARG","_","normalizeSuiAddress","SUI_CLOCK_OBJECT_ID","SUI_CLOCK_OBJECT_ID","SuiPriceServiceConnection","SuiPriceServiceConnection","SUI_CLOCK_OBJECT_ID","SUI_CLOCK_OBJECT_ID","sCoins","marketCoins","leftCoin","Transaction","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","Transaction","SuiKitTxBlock","Transaction","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","requireObligationInfo","SUI_CLOCK_OBJECT_ID","Transaction","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","Transaction","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","Transaction","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","Transaction","SUI_CLOCK_OBJECT_ID","Transaction","SuiKitTxBlock","Transaction","SuiKitTxBlock","Transaction","SuiKitTxBlock","Transaction","SuiKitTxBlock","Transaction","SuiKitTxBlock","axios","axios","normalizeSuiAddress","normalizeSuiAddress","sCoins","marketCoins"]}