@1delta/margin-fetcher 0.0.154 → 0.0.155

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 (264) hide show
  1. package/dist/ccip-GIMPTIO7.js +5 -0
  2. package/dist/{ccip-ZCD57SLY.js.map → ccip-GIMPTIO7.js.map} +1 -1
  3. package/dist/{chunk-ODBGQEBG.js → chunk-2TBRXA5J.js} +20 -4
  4. package/dist/chunk-2TBRXA5J.js.map +1 -0
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1844 -1214
  8. package/dist/index.js.map +1 -1
  9. package/dist/lending/index.d.ts +5 -6
  10. package/dist/lending/index.d.ts.map +1 -1
  11. package/dist/lending/public-data/aave-v2-type/misc.d.ts.map +1 -0
  12. package/dist/lending/public-data/aave-v2-type/publicCallBuild.d.ts.map +1 -0
  13. package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/publicCallParse.d.ts +3 -3
  14. package/dist/lending/public-data/aave-v2-type/publicCallParse.d.ts.map +1 -0
  15. package/dist/lending/{aave-v3-type → public-data/aave-v3-type}/publicCallBuild.d.ts +1 -1
  16. package/dist/lending/public-data/aave-v3-type/publicCallBuild.d.ts.map +1 -0
  17. package/dist/lending/{aave-v3-type → public-data/aave-v3-type}/publicCallParse.d.ts +3 -3
  18. package/dist/lending/public-data/aave-v3-type/publicCallParse.d.ts.map +1 -0
  19. package/dist/lending/public-data/addresses/aave.d.ts.map +1 -0
  20. package/dist/lending/public-data/addresses/aaveV2.d.ts.map +1 -0
  21. package/dist/lending/public-data/addresses/aurelius.d.ts.map +1 -0
  22. package/dist/lending/public-data/addresses/compoundV2.d.ts.map +1 -0
  23. package/dist/lending/public-data/addresses/compoundV3.d.ts.map +1 -0
  24. package/dist/lending/public-data/addresses/hana.d.ts.map +1 -0
  25. package/dist/lending/public-data/addresses/init.d.ts.map +1 -0
  26. package/dist/lending/public-data/addresses/lendle.d.ts.map +1 -0
  27. package/dist/lending/public-data/addresses/meridian.d.ts.map +1 -0
  28. package/dist/lending/public-data/addresses/takotako.d.ts.map +1 -0
  29. package/dist/lending/public-data/compound-v2/getters/moonwell.d.ts.map +1 -0
  30. package/dist/lending/public-data/compound-v2/getters/types.d.ts.map +1 -0
  31. package/dist/lending/public-data/compound-v2/getters/venus.d.ts.map +1 -0
  32. package/dist/lending/public-data/compound-v2/publicCallBuild.d.ts +2 -0
  33. package/dist/lending/public-data/compound-v2/publicCallBuild.d.ts.map +1 -0
  34. package/dist/lending/{compound-v2 → public-data/compound-v2}/publicCallParse.d.ts +2 -2
  35. package/dist/lending/public-data/compound-v2/publicCallParse.d.ts.map +1 -0
  36. package/dist/lending/public-data/compound-v3/publicCallBuild.d.ts +2 -0
  37. package/dist/lending/public-data/compound-v3/publicCallBuild.d.ts.map +1 -0
  38. package/dist/lending/{compound-v3 → public-data/compound-v3}/publicCallParse.d.ts +3 -3
  39. package/dist/lending/public-data/compound-v3/publicCallParse.d.ts.map +1 -0
  40. package/dist/lending/{fetchLender.d.ts → public-data/fetchLender.d.ts} +2 -2
  41. package/dist/lending/public-data/fetchLender.d.ts.map +1 -0
  42. package/dist/lending/{fetchLenderAll.d.ts → public-data/fetchLenderAll.d.ts} +2 -2
  43. package/dist/lending/public-data/fetchLenderAll.d.ts.map +1 -0
  44. package/dist/lending/{fetchLenderExt.d.ts → public-data/fetchLenderExt.d.ts} +2 -2
  45. package/dist/lending/public-data/fetchLenderExt.d.ts.map +1 -0
  46. package/dist/lending/{init → public-data/init}/publicCallBuild.d.ts +1 -1
  47. package/dist/lending/public-data/init/publicCallBuild.d.ts.map +1 -0
  48. package/dist/lending/{init → public-data/init}/publicCallParse.d.ts +3 -3
  49. package/dist/lending/public-data/init/publicCallParse.d.ts.map +1 -0
  50. package/dist/lending/{lista → public-data/lista}/getMarketsFromChain.d.ts +2 -2
  51. package/dist/lending/public-data/lista/getMarketsFromChain.d.ts.map +1 -0
  52. package/dist/lending/public-data/lista/getMarketsOnChain.d.ts.map +1 -0
  53. package/dist/lending/{lista → public-data/lista}/publicCallBuild.d.ts +2 -2
  54. package/dist/lending/public-data/lista/publicCallBuild.d.ts.map +1 -0
  55. package/dist/lending/{morpho → public-data/morpho}/convertPublic.d.ts +3 -3
  56. package/dist/lending/public-data/morpho/convertPublic.d.ts.map +1 -0
  57. package/dist/lending/public-data/morpho/fetchPublic.d.ts.map +1 -0
  58. package/dist/lending/{morpho → public-data/morpho}/getMarketsFromChain.d.ts +2 -2
  59. package/dist/lending/public-data/morpho/getMarketsFromChain.d.ts.map +1 -0
  60. package/dist/lending/public-data/morpho/index.d.ts.map +1 -0
  61. package/dist/lending/{morpho → public-data/morpho}/publicCallBuild.d.ts +3 -2
  62. package/dist/lending/public-data/morpho/publicCallBuild.d.ts.map +1 -0
  63. package/dist/lending/public-data/morpho/utils/evmParser.d.ts.map +1 -0
  64. package/dist/lending/public-data/morpho/utils/mathLib.d.ts.map +1 -0
  65. package/dist/lending/public-data/morpho/utils/parsers.d.ts.map +1 -0
  66. package/dist/lending/user-data/compound-v3/userCallParse.d.ts.map +1 -1
  67. package/dist/lending/user-data/fetchUserData.d.ts +2 -2
  68. package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
  69. package/dist/lending/user-data/index.d.ts +1 -0
  70. package/dist/lending/user-data/index.d.ts.map +1 -1
  71. package/dist/lending/user-data/init/userCallParse.d.ts.map +1 -1
  72. package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
  73. package/dist/lending/user-data/summary/buildPortfolioTotals.d.ts +19 -0
  74. package/dist/lending/user-data/summary/buildPortfolioTotals.d.ts.map +1 -0
  75. package/dist/lending/user-data/summary/buildSummaries.d.ts +28 -0
  76. package/dist/lending/user-data/summary/buildSummaries.d.ts.map +1 -0
  77. package/dist/lending/user-data/summary/index.d.ts +5 -0
  78. package/dist/lending/user-data/summary/index.d.ts.map +1 -0
  79. package/dist/lending/user-data/summary/types.d.ts +96 -0
  80. package/dist/lending/user-data/summary/types.d.ts.map +1 -0
  81. package/dist/lending/user-data/summary/utils.d.ts +24 -0
  82. package/dist/lending/user-data/summary/utils.d.ts.map +1 -0
  83. package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
  84. package/dist/lending/user-data/utils/createMultiAccountStyleUserState.d.ts.map +1 -1
  85. package/dist/lending/user-data/utils/types.d.ts +3 -0
  86. package/dist/lending/user-data/utils/types.d.ts.map +1 -1
  87. package/dist/prices/oracle-prices/fetchOraclePrices.d.ts.map +1 -1
  88. package/dist/prices/oracle-prices/fetchers/aave.d.ts.map +1 -1
  89. package/dist/prices/oracle-prices/fetchers/compoundV2.d.ts.map +1 -1
  90. package/dist/prices/oracle-prices/fetchers/compoundV3.d.ts.map +1 -1
  91. package/dist/prices/oracle-prices/fetchers/lista.d.ts +30 -5
  92. package/dist/prices/oracle-prices/fetchers/lista.d.ts.map +1 -1
  93. package/dist/prices/oracle-prices/fetchers/morpho.d.ts +15 -5
  94. package/dist/prices/oracle-prices/fetchers/morpho.d.ts.map +1 -1
  95. package/dist/prices/oracle-prices/types.d.ts +6 -0
  96. package/dist/prices/oracle-prices/types.d.ts.map +1 -1
  97. package/dist/token/fetchTokenBalance.d.ts +47 -0
  98. package/dist/token/fetchTokenBalance.d.ts.map +1 -0
  99. package/dist/token/fetchTokenMetadata.d.ts +11 -0
  100. package/dist/token/fetchTokenMetadata.d.ts.map +1 -0
  101. package/dist/token/index.d.ts +4 -0
  102. package/dist/token/index.d.ts.map +1 -0
  103. package/dist/token/types.d.ts +32 -0
  104. package/dist/token/types.d.ts.map +1 -0
  105. package/dist/types/lender/aave-v2-types.d.ts +2 -0
  106. package/dist/types/lender/aave-v2-types.d.ts.map +1 -1
  107. package/dist/types/lender/aave-v3-types.d.ts +2 -0
  108. package/dist/types/lender/aave-v3-types.d.ts.map +1 -1
  109. package/dist/types/lender/compound-v2-types.d.ts +1 -0
  110. package/dist/types/lender/compound-v2-types.d.ts.map +1 -1
  111. package/dist/types/lender/compound-v3-types.d.ts +2 -0
  112. package/dist/types/lender/compound-v3-types.d.ts.map +1 -1
  113. package/dist/types/lender/init-types.d.ts +2 -0
  114. package/dist/types/lender/init-types.d.ts.map +1 -1
  115. package/dist/types/lender/morpho-types.d.ts +1 -0
  116. package/dist/types/lender/morpho-types.d.ts.map +1 -1
  117. package/dist/types/lenderTypes.d.ts +15 -9
  118. package/dist/types/lenderTypes.d.ts.map +1 -1
  119. package/dist/utils/marketUid.d.ts +7 -1
  120. package/dist/utils/marketUid.d.ts.map +1 -1
  121. package/dist/yields/fetchGeneralYields.d.ts +3 -0
  122. package/dist/yields/fetchGeneralYields.d.ts.map +1 -0
  123. package/dist/yields/fetchers/angle.d.ts +3 -0
  124. package/dist/yields/fetchers/angle.d.ts.map +1 -0
  125. package/dist/yields/fetchers/coinbase.d.ts +3 -0
  126. package/dist/yields/fetchers/coinbase.d.ts.map +1 -0
  127. package/dist/yields/fetchers/ethena.d.ts +3 -0
  128. package/dist/yields/fetchers/ethena.d.ts.map +1 -0
  129. package/dist/yields/fetchers/etherfi.d.ts +8 -0
  130. package/dist/yields/fetchers/etherfi.d.ts.map +1 -0
  131. package/dist/yields/fetchers/gmx.d.ts +3 -0
  132. package/dist/yields/fetchers/gmx.d.ts.map +1 -0
  133. package/dist/yields/fetchers/hyperbeat.d.ts +4 -0
  134. package/dist/yields/fetchers/hyperbeat.d.ts.map +1 -0
  135. package/dist/yields/fetchers/hyperlend.d.ts +3 -0
  136. package/dist/yields/fetchers/hyperlend.d.ts.map +1 -0
  137. package/dist/yields/fetchers/hyperliquid.d.ts +4 -0
  138. package/dist/yields/fetchers/hyperliquid.d.ts.map +1 -0
  139. package/dist/yields/fetchers/jito.d.ts +3 -0
  140. package/dist/yields/fetchers/jito.d.ts.map +1 -0
  141. package/dist/yields/fetchers/kelp.d.ts +3 -0
  142. package/dist/yields/fetchers/kelp.d.ts.map +1 -0
  143. package/dist/yields/fetchers/lido.d.ts +4 -0
  144. package/dist/yields/fetchers/lido.d.ts.map +1 -0
  145. package/dist/yields/fetchers/mantle.d.ts +3 -0
  146. package/dist/yields/fetchers/mantle.d.ts.map +1 -0
  147. package/dist/yields/fetchers/morphoVaults.d.ts +3 -0
  148. package/dist/yields/fetchers/morphoVaults.d.ts.map +1 -0
  149. package/dist/yields/fetchers/pendle.d.ts +3 -0
  150. package/dist/yields/fetchers/pendle.d.ts.map +1 -0
  151. package/dist/yields/fetchers/puffer.d.ts +3 -0
  152. package/dist/yields/fetchers/puffer.d.ts.map +1 -0
  153. package/dist/yields/fetchers/renzo.d.ts +3 -0
  154. package/dist/yields/fetchers/renzo.d.ts.map +1 -0
  155. package/dist/yields/fetchers/reserve.d.ts +3 -0
  156. package/dist/yields/fetchers/reserve.d.ts.map +1 -0
  157. package/dist/yields/fetchers/reservoir.d.ts +3 -0
  158. package/dist/yields/fetchers/reservoir.d.ts.map +1 -0
  159. package/dist/yields/fetchers/resolv.d.ts +4 -0
  160. package/dist/yields/fetchers/resolv.d.ts.map +1 -0
  161. package/dist/yields/fetchers/rocketpool.d.ts +3 -0
  162. package/dist/yields/fetchers/rocketpool.d.ts.map +1 -0
  163. package/dist/yields/fetchers/savax.d.ts +3 -0
  164. package/dist/yields/fetchers/savax.d.ts.map +1 -0
  165. package/dist/yields/fetchers/sky.d.ts +3 -0
  166. package/dist/yields/fetchers/sky.d.ts.map +1 -0
  167. package/dist/yields/fetchers/stader.d.ts +4 -0
  168. package/dist/yields/fetchers/stader.d.ts.map +1 -0
  169. package/dist/yields/fetchers/stakewise.d.ts +3 -0
  170. package/dist/yields/fetchers/stakewise.d.ts.map +1 -0
  171. package/dist/yields/fetchers/superreturn.d.ts +3 -0
  172. package/dist/yields/fetchers/superreturn.d.ts.map +1 -0
  173. package/dist/yields/fetchers/swell.d.ts +3 -0
  174. package/dist/yields/fetchers/swell.d.ts.map +1 -0
  175. package/dist/yields/fetchers/theo.d.ts +3 -0
  176. package/dist/yields/fetchers/theo.d.ts.map +1 -0
  177. package/dist/yields/fetchers/trufin.d.ts +3 -0
  178. package/dist/yields/fetchers/trufin.d.ts.map +1 -0
  179. package/dist/yields/fetchers/usdai.d.ts +3 -0
  180. package/dist/yields/fetchers/usdai.d.ts.map +1 -0
  181. package/dist/yields/fetchers/usdx.d.ts +3 -0
  182. package/dist/yields/fetchers/usdx.d.ts.map +1 -0
  183. package/dist/yields/fetchers/usual.d.ts +4 -0
  184. package/dist/yields/fetchers/usual.d.ts.map +1 -0
  185. package/dist/yields/fetchers/yearnKatana.d.ts +3 -0
  186. package/dist/yields/fetchers/yearnKatana.d.ts.map +1 -0
  187. package/dist/yields/fetchers/yieldfi.d.ts +3 -0
  188. package/dist/yields/fetchers/yieldfi.d.ts.map +1 -0
  189. package/dist/yields/fetchers/yieldnest.d.ts +3 -0
  190. package/dist/yields/fetchers/yieldnest.d.ts.map +1 -0
  191. package/dist/yields/fetchers/yoProtocol.d.ts +3 -0
  192. package/dist/yields/fetchers/yoProtocol.d.ts.map +1 -0
  193. package/dist/yields/helpers.d.ts +8 -0
  194. package/dist/yields/helpers.d.ts.map +1 -0
  195. package/dist/yields/index.d.ts +2 -20
  196. package/dist/yields/index.d.ts.map +1 -1
  197. package/dist/yields/types.d.ts +32 -0
  198. package/dist/yields/types.d.ts.map +1 -0
  199. package/package.json +4 -3
  200. package/dist/ccip-ZCD57SLY.js +0 -5
  201. package/dist/chunk-ODBGQEBG.js.map +0 -1
  202. package/dist/lending/aave-v2-type/misc.d.ts.map +0 -1
  203. package/dist/lending/aave-v2-type/publicCallBuild.d.ts.map +0 -1
  204. package/dist/lending/aave-v2-type/publicCallParse.d.ts.map +0 -1
  205. package/dist/lending/aave-v3-type/publicCallBuild.d.ts.map +0 -1
  206. package/dist/lending/aave-v3-type/publicCallParse.d.ts.map +0 -1
  207. package/dist/lending/addresses/aave.d.ts.map +0 -1
  208. package/dist/lending/addresses/aaveV2.d.ts.map +0 -1
  209. package/dist/lending/addresses/aurelius.d.ts.map +0 -1
  210. package/dist/lending/addresses/compoundV2.d.ts.map +0 -1
  211. package/dist/lending/addresses/compoundV3.d.ts.map +0 -1
  212. package/dist/lending/addresses/hana.d.ts.map +0 -1
  213. package/dist/lending/addresses/init.d.ts.map +0 -1
  214. package/dist/lending/addresses/lendle.d.ts.map +0 -1
  215. package/dist/lending/addresses/meridian.d.ts.map +0 -1
  216. package/dist/lending/addresses/takotako.d.ts.map +0 -1
  217. package/dist/lending/compound-v2/getters/moonwell.d.ts.map +0 -1
  218. package/dist/lending/compound-v2/getters/types.d.ts.map +0 -1
  219. package/dist/lending/compound-v2/getters/venus.d.ts.map +0 -1
  220. package/dist/lending/compound-v2/publicCallBuild.d.ts +0 -2
  221. package/dist/lending/compound-v2/publicCallBuild.d.ts.map +0 -1
  222. package/dist/lending/compound-v2/publicCallParse.d.ts.map +0 -1
  223. package/dist/lending/compound-v3/publicCallBuild.d.ts +0 -2
  224. package/dist/lending/compound-v3/publicCallBuild.d.ts.map +0 -1
  225. package/dist/lending/compound-v3/publicCallParse.d.ts.map +0 -1
  226. package/dist/lending/fetchLender.d.ts.map +0 -1
  227. package/dist/lending/fetchLenderAll.d.ts.map +0 -1
  228. package/dist/lending/fetchLenderExt.d.ts.map +0 -1
  229. package/dist/lending/init/publicCallBuild.d.ts.map +0 -1
  230. package/dist/lending/init/publicCallParse.d.ts.map +0 -1
  231. package/dist/lending/lista/getMarketsFromChain.d.ts.map +0 -1
  232. package/dist/lending/lista/getMarketsOnChain.d.ts.map +0 -1
  233. package/dist/lending/lista/publicCallBuild.d.ts.map +0 -1
  234. package/dist/lending/meta/index.d.ts +0 -23
  235. package/dist/lending/meta/index.d.ts.map +0 -1
  236. package/dist/lending/morpho/convertPublic.d.ts.map +0 -1
  237. package/dist/lending/morpho/fetchPublic.d.ts.map +0 -1
  238. package/dist/lending/morpho/getMarketsFromChain.d.ts.map +0 -1
  239. package/dist/lending/morpho/index.d.ts.map +0 -1
  240. package/dist/lending/morpho/publicCallBuild.d.ts.map +0 -1
  241. package/dist/lending/morpho/utils/evmParser.d.ts.map +0 -1
  242. package/dist/lending/morpho/utils/mathLib.d.ts.map +0 -1
  243. package/dist/lending/morpho/utils/parsers.d.ts.map +0 -1
  244. /package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/misc.d.ts +0 -0
  245. /package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/publicCallBuild.d.ts +0 -0
  246. /package/dist/lending/{addresses → public-data/addresses}/aave.d.ts +0 -0
  247. /package/dist/lending/{addresses → public-data/addresses}/aaveV2.d.ts +0 -0
  248. /package/dist/lending/{addresses → public-data/addresses}/aurelius.d.ts +0 -0
  249. /package/dist/lending/{addresses → public-data/addresses}/compoundV2.d.ts +0 -0
  250. /package/dist/lending/{addresses → public-data/addresses}/compoundV3.d.ts +0 -0
  251. /package/dist/lending/{addresses → public-data/addresses}/hana.d.ts +0 -0
  252. /package/dist/lending/{addresses → public-data/addresses}/init.d.ts +0 -0
  253. /package/dist/lending/{addresses → public-data/addresses}/lendle.d.ts +0 -0
  254. /package/dist/lending/{addresses → public-data/addresses}/meridian.d.ts +0 -0
  255. /package/dist/lending/{addresses → public-data/addresses}/takotako.d.ts +0 -0
  256. /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/moonwell.d.ts +0 -0
  257. /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/types.d.ts +0 -0
  258. /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/venus.d.ts +0 -0
  259. /package/dist/lending/{lista → public-data/lista}/getMarketsOnChain.d.ts +0 -0
  260. /package/dist/lending/{morpho → public-data/morpho}/fetchPublic.d.ts +0 -0
  261. /package/dist/lending/{morpho → public-data/morpho}/index.d.ts +0 -0
  262. /package/dist/lending/{morpho → public-data/morpho}/utils/evmParser.d.ts +0 -0
  263. /package/dist/lending/{morpho → public-data/morpho}/utils/mathLib.d.ts +0 -0
  264. /package/dist/lending/{morpho → public-data/morpho}/utils/parsers.d.ts +0 -0
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters } from './chunk-ODBGQEBG.js';
1
+ import { formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, isAddress, InvalidAddressError, pad, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-2TBRXA5J.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
4
  import { Lender, AAVE_V3_LENDERS, AAVE_V2_LENDERS, AAVE_V32_LENDERS, COMPOUND_V2_LENDERS, VENUS_LENDERS } from '@1delta/lender-registry';
5
5
  import lodash from 'lodash';
6
- import { getEvmChain, multicallRetry, getEvmClientUniversal } from '@1delta/providers';
6
+ import { getEvmChain, multicallRetry, getEvmClient, getEvmClientUniversal } from '@1delta/providers';
7
7
  import { BALANCER_V2_FORKS, BALANCER_V3_FORKS, UNISWAP_V4_FORKS, FLASH_LOAN_IDS } from '@1delta/dex-registry';
8
8
 
9
9
  // src/abis/aave-v2/ProtocolDataProvider.ts
@@ -6244,9 +6244,6 @@ var IrgetterAbi = [
6244
6244
  // ../data-sdk/dist/index.mjs
6245
6245
  var GLOBAL_CHAIN_DATA_KEY = "__1delta_chain_registry__";
6246
6246
  globalThis[GLOBAL_CHAIN_DATA_KEY] = {};
6247
- function initializeChainData({ chainsOverride }) {
6248
- if (chainsOverride) globalThis[GLOBAL_CHAIN_DATA_KEY] = chainsOverride;
6249
- }
6250
6247
  var GLOBAL_LENDER_DATA_KEY = "__1delta_lender_registry__";
6251
6248
  globalThis[GLOBAL_LENDER_DATA_KEY] = {
6252
6249
  aaveTokens: {},
@@ -6271,46 +6268,6 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6271
6268
  function getGlobalData2() {
6272
6269
  return globalThis[GLOBAL_LENDER_DATA_KEY];
6273
6270
  }
6274
- function initializeLenderData({
6275
- aaveTokensOverride,
6276
- aavePoolsOverride,
6277
- aaveOraclesOverride,
6278
- compoundV2OraclesOverride,
6279
- compoundV3OraclesOverride,
6280
- compoundV3PoolsOverride,
6281
- compoundV3BaseDataOverride,
6282
- morphoPoolsOverride,
6283
- compoundV2TokensOverride,
6284
- compoundV2TokenArrayOverride,
6285
- compoundV2PoolsOverride,
6286
- initConfigOverride,
6287
- aaveReservesOverride,
6288
- compoundV3ReservesOverride,
6289
- compoundV2ReservesOverride,
6290
- morphoOraclesOverride,
6291
- morphoTypeOraclesOverride,
6292
- morphoTypeMarketsOverride
6293
- }) {
6294
- const data = getGlobalData2();
6295
- if (aaveTokensOverride) data.aaveTokens = aaveTokensOverride;
6296
- if (aaveOraclesOverride) data.aaveOracles = aaveOraclesOverride;
6297
- if (compoundV2OraclesOverride) data.compoundV2Oracles = compoundV2OraclesOverride;
6298
- if (compoundV3OraclesOverride) data.compoundV3Oracles = compoundV3OraclesOverride;
6299
- if (aavePoolsOverride) data.aavePools = aavePoolsOverride;
6300
- if (compoundV3PoolsOverride) data.compoundV3Pools = compoundV3PoolsOverride;
6301
- if (morphoPoolsOverride) data.morphoPools = morphoPoolsOverride;
6302
- if (compoundV3BaseDataOverride) data.compoundV3BaseData = compoundV3BaseDataOverride;
6303
- if (compoundV2TokensOverride) data.compoundV2Tokens = compoundV2TokensOverride;
6304
- if (compoundV2TokenArrayOverride) data.compoundV2TokenArray = compoundV2TokenArrayOverride;
6305
- if (compoundV2PoolsOverride) data.compoundV2Pools = compoundV2PoolsOverride;
6306
- if (initConfigOverride) data.initConfig = initConfigOverride;
6307
- if (aaveReservesOverride) data.aaveReserves = aaveReservesOverride;
6308
- if (compoundV3ReservesOverride) data.compoundV3Reserves = compoundV3ReservesOverride;
6309
- if (compoundV2ReservesOverride) data.compoundV2Reserves = compoundV2ReservesOverride;
6310
- if (morphoOraclesOverride) data.morphoOracles = morphoOraclesOverride;
6311
- if (morphoTypeOraclesOverride) data.morphoTypeOracles = morphoTypeOraclesOverride;
6312
- if (morphoTypeMarketsOverride) data.morphoTypeMarkets = morphoTypeMarketsOverride;
6313
- }
6314
6271
  var aaveTokens = () => getGlobalData2()?.aaveTokens;
6315
6272
  var aavePools = () => getGlobalData2()?.aavePools;
6316
6273
  var aaveOracles = () => getGlobalData2()?.aaveOracles;
@@ -6328,9 +6285,28 @@ var compoundV2Pools = () => getGlobalData2()?.compoundV2Pools;
6328
6285
  var compoundV2Tokens = () => getGlobalData2()?.compoundV2Tokens;
6329
6286
  var compoundV2TokenArray = () => getGlobalData2()?.compoundV2TokenArray;
6330
6287
  var initConfig = () => getGlobalData2()?.initConfig;
6288
+ var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
6289
+ async function fetchTokenList(chainId) {
6290
+ const data = await fetch(getListUrl(chainId));
6291
+ if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
6292
+ return (await data.json()).list;
6293
+ }
6294
+ async function fetchTokenLists(chainIds) {
6295
+ const promises = chainIds.map(async (chainId) => {
6296
+ const list = await fetchTokenList(chainId);
6297
+ return [chainId, list];
6298
+ });
6299
+ const results = await Promise.all(promises);
6300
+ return Object.fromEntries(results);
6301
+ }
6331
6302
 
6332
6303
  // src/utils/marketUid.ts
6333
6304
  function createMarketUid(chainId, lender, refAddress) {
6305
+ if (!refAddress || !lender || !chainId) {
6306
+ throw new Error(
6307
+ `Invalid marketUid parameters: lender=${lender}, chainId=${chainId}, refAddress=${refAddress}`
6308
+ );
6309
+ }
6334
6310
  return `${lender}:${chainId}:${refAddress.toLowerCase()}`;
6335
6311
  }
6336
6312
 
@@ -6383,22 +6359,22 @@ var ENABLED_COMPOUNDS = [
6383
6359
  var getLendersForChain = (c) => {
6384
6360
  let lenders = [];
6385
6361
  Object.entries(aavePools() ?? {}).forEach(([l, data]) => {
6386
- const chains2 = Object.keys(data);
6387
- if (chains2.includes(c)) lenders.push(l);
6362
+ const chains = Object.keys(data);
6363
+ if (chains.includes(c)) lenders.push(l);
6388
6364
  });
6389
6365
  if (compoundV3Pools()?.[c])
6390
6366
  lenders = [...lenders, ...Object.keys(compoundV3Pools()?.[c])];
6391
6367
  Object.entries(initConfig() ?? {}).forEach(([l, data]) => {
6392
- const chains2 = Object.keys(data);
6393
- if (chains2.includes(c)) lenders.push(l);
6368
+ const chains = Object.keys(data);
6369
+ if (chains.includes(c)) lenders.push(l);
6394
6370
  });
6395
6371
  Object.entries(morphoPools() ?? {}).forEach(([l, data]) => {
6396
- const chains2 = Object.keys(data);
6397
- if (chains2.includes(c)) lenders.push(l);
6372
+ const chains = Object.keys(data);
6373
+ if (chains.includes(c)) lenders.push(l);
6398
6374
  });
6399
6375
  Object.entries(compoundV2Pools() ?? {}).forEach(([l, data]) => {
6400
- const chains2 = Object.keys(data);
6401
- if (chains2.includes(c) && ENABLED_COMPOUNDS.includes(l)) lenders.push(l);
6376
+ const chains = Object.keys(data);
6377
+ if (chains.includes(c) && ENABLED_COMPOUNDS.includes(l)) lenders.push(l);
6402
6378
  });
6403
6379
  return lenders;
6404
6380
  };
@@ -6462,7 +6438,7 @@ var toGenericPriceKey = (assetAddress, chainId) => {
6462
6438
  return chainId + "-" + assetAddress;
6463
6439
  };
6464
6440
 
6465
- // src/lending/aave-v2-type/publicCallBuild.ts
6441
+ // src/lending/public-data/aave-v2-type/publicCallBuild.ts
6466
6442
  var buildAaveV2StyleLenderReserveCall = (chainId, lender) => {
6467
6443
  const providerAddress = getAaveTypePoolDataProviderAddress(chainId, lender);
6468
6444
  const underlyingTokensArray = getAaveAssets(chainId, lender);
@@ -7581,7 +7557,7 @@ var Chain = /* @__PURE__ */ ((Chain2) => {
7581
7557
  return Chain2;
7582
7558
  })(Chain || {});
7583
7559
 
7584
- // src/lending/aave-v3-type/publicCallBuild.ts
7560
+ // src/lending/public-data/aave-v3-type/publicCallBuild.ts
7585
7561
  function range(n) {
7586
7562
  return Array.from({ length: n + 1 }, (_2, i) => i);
7587
7563
  }
@@ -7732,7 +7708,7 @@ var buildAaveV3StyleLenderReserveCall = (chainId, lender) => {
7732
7708
  }
7733
7709
  };
7734
7710
 
7735
- // src/lending/addresses/init.ts
7711
+ // src/lending/public-data/addresses/init.ts
7736
7712
  function getInitLensAddress(chainId) {
7737
7713
  return addressesInitCore.PublicLens[chainId];
7738
7714
  }
@@ -7771,7 +7747,7 @@ function getInitUnderlyingToPoolMap(chainId, lender) {
7771
7747
  }, /* @__PURE__ */ new Map());
7772
7748
  }
7773
7749
 
7774
- // src/lending/init/publicCallBuild.ts
7750
+ // src/lending/public-data/init/publicCallBuild.ts
7775
7751
  var INIT_MODES = [1, 2, 3, 4, 5, 6];
7776
7752
  var buildInitStyleLenderReserveCall = (chainId, lender) => {
7777
7753
  const lensAddress = getInitLensAddress(chainId);
@@ -7822,7 +7798,7 @@ function getCompoundV3BaseAsset(lender, chainId) {
7822
7798
  return compoundV3BaseData()?.[lender]?.[chainId];
7823
7799
  }
7824
7800
 
7825
- // src/lending/compound-v3/publicCallBuild.ts
7801
+ // src/lending/public-data/compound-v3/publicCallBuild.ts
7826
7802
  var buildCompoundV3StyleLenderReserveCall = (chainId, lender) => {
7827
7803
  const baseAssetData = getCompoundV3BaseAsset(lender, chainId);
7828
7804
  const underlyingArray = getCompoundV3Assets(chainId, lender);
@@ -7889,6 +7865,69 @@ var buildCompoundV3StyleLenderReserveCall = (chainId, lender) => {
7889
7865
  return calls;
7890
7866
  };
7891
7867
 
7868
+ // ../../node_modules/.pnpm/viem@2.45.1_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/viem/_esm/utils/abi/encodePacked.js
7869
+ function encodePacked(types, values) {
7870
+ if (types.length !== values.length)
7871
+ throw new AbiEncodingLengthMismatchError({
7872
+ expectedLength: types.length,
7873
+ givenLength: values.length
7874
+ });
7875
+ const data = [];
7876
+ for (let i = 0; i < types.length; i++) {
7877
+ const type = types[i];
7878
+ const value = values[i];
7879
+ data.push(encode(type, value));
7880
+ }
7881
+ return concatHex(data);
7882
+ }
7883
+ function encode(type, value, isArray2 = false) {
7884
+ if (type === "address") {
7885
+ const address = value;
7886
+ if (!isAddress(address))
7887
+ throw new InvalidAddressError({ address });
7888
+ return pad(address.toLowerCase(), {
7889
+ size: isArray2 ? 32 : null
7890
+ });
7891
+ }
7892
+ if (type === "string")
7893
+ return stringToHex(value);
7894
+ if (type === "bytes")
7895
+ return value;
7896
+ if (type === "bool")
7897
+ return pad(boolToHex(value), { size: isArray2 ? 32 : 1 });
7898
+ const intMatch = type.match(integerRegex);
7899
+ if (intMatch) {
7900
+ const [_type, baseType, bits = "256"] = intMatch;
7901
+ const size = Number.parseInt(bits, 10) / 8;
7902
+ return numberToHex(value, {
7903
+ size: isArray2 ? 32 : size,
7904
+ signed: baseType === "int"
7905
+ });
7906
+ }
7907
+ const bytesMatch = type.match(bytesRegex);
7908
+ if (bytesMatch) {
7909
+ const [_type, size] = bytesMatch;
7910
+ if (Number.parseInt(size, 10) !== (value.length - 2) / 2)
7911
+ throw new BytesSizeMismatchError({
7912
+ expectedSize: Number.parseInt(size, 10),
7913
+ givenSize: (value.length - 2) / 2
7914
+ });
7915
+ return pad(value, { dir: "right", size: isArray2 ? 32 : null });
7916
+ }
7917
+ const arrayMatch = type.match(arrayRegex);
7918
+ if (arrayMatch && Array.isArray(value)) {
7919
+ const [_type, childType] = arrayMatch;
7920
+ const data = [];
7921
+ for (let i = 0; i < value.length; i++) {
7922
+ data.push(encode(childType, value[i], true));
7923
+ }
7924
+ if (data.length === 0)
7925
+ return "0x";
7926
+ return concatHex(data);
7927
+ }
7928
+ throw new UnsupportedPackedAbiType(type);
7929
+ }
7930
+
7892
7931
  // ../../node_modules/.pnpm/viem@2.45.1_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/viem/_esm/errors/unit.js
7893
7932
  var InvalidDecimalNumberError = class extends BaseError {
7894
7933
  constructor({ value }) {
@@ -8009,7 +8048,7 @@ var formatMorphoPrice = (price, collateralDec, debtDec) => {
8009
8048
  }
8010
8049
  };
8011
8050
 
8012
- // src/lending/aave-v2-type/publicCallParse.ts
8051
+ // src/lending/public-data/aave-v2-type/publicCallParse.ts
8013
8052
  var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
8014
8053
  switch (lender) {
8015
8054
  /** AAVE V2 style with rewards from state */
@@ -8050,7 +8089,9 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
8050
8089
  const totalDebtUSD = Number(totalVariableDebt) * price;
8051
8090
  const collateralActive = configData?.[5 /* usageAsCollateralEnabled */];
8052
8091
  const borrowingEnabled = configData?.[6 /* borrowingEnabled */];
8092
+ const marketUid = createMarketUid(chainId, lender, asset);
8053
8093
  resultReserves[asset] = {
8094
+ marketUid,
8054
8095
  poolId: asset,
8055
8096
  underlying: asset,
8056
8097
  asset: assetMeta,
@@ -8111,15 +8152,15 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
8111
8152
  isActive: configData?.[8 /* isActive */],
8112
8153
  isFrozen: configData?.[9 /* isFrozen */]
8113
8154
  };
8114
- const aaveTokens3 = aaveTokenMap[asset];
8115
- if (!!aaveTokens3) {
8155
+ const aaveTokens2 = aaveTokenMap[asset];
8156
+ if (!!aaveTokens2) {
8116
8157
  resultReserves[asset] = {
8117
8158
  ...resultReserves[asset],
8118
8159
  params: {
8119
8160
  metadata: {
8120
- aToken: aaveTokens3.aToken,
8121
- vToken: aaveTokens3.vToken,
8122
- sToken: aaveTokens3.sToken
8161
+ aToken: aaveTokens2.aToken,
8162
+ vToken: aaveTokens2.vToken,
8163
+ sToken: aaveTokens2.sToken
8123
8164
  }
8124
8165
  }
8125
8166
  };
@@ -8208,7 +8249,9 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
8208
8249
  const price = prices[toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId)] ?? 0;
8209
8250
  const usageAsCollateralEnabled = configData?.[5 /* usageAsCollateralEnabled */];
8210
8251
  const borrowingEnabled = configData?.[6 /* borrowingEnabled */];
8252
+ const marketUid = createMarketUid(chainId, lender, asset);
8211
8253
  resultReserves[asset] = {
8254
+ marketUid,
8212
8255
  poolId: asset,
8213
8256
  underlying: asset,
8214
8257
  asset: assetMeta,
@@ -8269,15 +8312,15 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
8269
8312
  )
8270
8313
  )
8271
8314
  };
8272
- const aaveTokens3 = aaveTokenMap[asset];
8273
- if (!!aaveTokens3) {
8315
+ const aaveTokens2 = aaveTokenMap[asset];
8316
+ if (!!aaveTokens2) {
8274
8317
  resultReserves[asset] = {
8275
8318
  ...resultReserves[asset],
8276
8319
  params: {
8277
8320
  metadata: {
8278
- aToken: aaveTokens3.aToken,
8279
- vToken: aaveTokens3.vToken,
8280
- sToken: aaveTokens3.sToken
8321
+ aToken: aaveTokens2.aToken,
8322
+ vToken: aaveTokens2.vToken,
8323
+ sToken: aaveTokens2.sToken
8281
8324
  }
8282
8325
  }
8283
8326
  };
@@ -8463,15 +8506,15 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
8463
8506
  isActive: configData?.[7 /* isActive */],
8464
8507
  isFrozen: configData?.[8 /* isFrozen */]
8465
8508
  };
8466
- const aaveTokens3 = aaveTokenMap[asset];
8467
- if (!!aaveTokens3) {
8509
+ const aaveTokens2 = aaveTokenMap[asset];
8510
+ if (!!aaveTokens2) {
8468
8511
  resultReserves[asset] = {
8469
8512
  ...resultReserves[asset],
8470
8513
  params: {
8471
8514
  metadata: {
8472
- aToken: aaveTokens3.aToken,
8473
- vToken: aaveTokens3.vToken,
8474
- sToken: aaveTokens3.sToken
8515
+ aToken: aaveTokens2.aToken,
8516
+ vToken: aaveTokens2.vToken,
8517
+ sToken: aaveTokens2.sToken
8475
8518
  }
8476
8519
  }
8477
8520
  };
@@ -8610,15 +8653,15 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
8610
8653
  )
8611
8654
  )
8612
8655
  };
8613
- const aaveTokens3 = aaveTokenMap[asset];
8614
- if (!!aaveTokens3) {
8656
+ const aaveTokens2 = aaveTokenMap[asset];
8657
+ if (!!aaveTokens2) {
8615
8658
  resultReserves[asset] = {
8616
8659
  ...resultReserves[asset],
8617
8660
  params: {
8618
8661
  metadata: {
8619
- aToken: aaveTokens3.aToken,
8620
- vToken: aaveTokens3.vToken,
8621
- sToken: aaveTokens3.sToken
8662
+ aToken: aaveTokens2.aToken,
8663
+ vToken: aaveTokens2.vToken,
8664
+ sToken: aaveTokens2.sToken
8622
8665
  }
8623
8666
  }
8624
8667
  };
@@ -8633,7 +8676,7 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
8633
8676
  ];
8634
8677
  }
8635
8678
 
8636
- // src/lending/init/publicCallParse.ts
8679
+ // src/lending/public-data/init/publicCallParse.ts
8637
8680
  var INIT_EMODE_LABELS = {
8638
8681
  [1]: "Default",
8639
8682
  [2]: "Blue Chip Volatile",
@@ -8669,8 +8712,11 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8669
8712
  const liquidity = Number(totalDeposits) - Number(totalDebt);
8670
8713
  const poolId = underlyingToPoolMap.get(asset);
8671
8714
  const params = !!poolId ? { metadata: { poolId } } : void 0;
8715
+ if (!poolId) return;
8716
+ const marketUid = createMarketUid(chainId, lender, poolId);
8672
8717
  return {
8673
8718
  [asset]: {
8719
+ marketUid,
8674
8720
  poolId: asset,
8675
8721
  underlying: asset,
8676
8722
  asset: meta,
@@ -8750,7 +8796,7 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8750
8796
  ];
8751
8797
  };
8752
8798
 
8753
- // src/lending/compound-v3/publicCallParse.ts
8799
+ // src/lending/public-data/compound-v3/publicCallParse.ts
8754
8800
  var COMET_RISK_DECIMALS = 18;
8755
8801
  var SECONDS_PER_DAY = 3600 * 24;
8756
8802
  var DAYS_IN_YEAR = 365;
@@ -8777,7 +8823,9 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8777
8823
  const totals = parseRawAmount(resultsTotals[0], decimals2);
8778
8824
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
8779
8825
  const totalUsd = Number(totals) * (prices[oracleKey] ?? 0);
8826
+ const marketUid = createMarketUid(chainId, lender, asset);
8780
8827
  result[asset] = {
8828
+ marketUid,
8781
8829
  poolId: asset,
8782
8830
  underlying: asset,
8783
8831
  asset: assetMeta,
@@ -8844,8 +8892,10 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8844
8892
  const price = prices[oracleKeyBase] ?? 1;
8845
8893
  const liquidity = Number(resultsSupply) - Number(resultsBorrow);
8846
8894
  const compPrice = prices["COMP"];
8895
+ const baseMarketUid = createMarketUid(chainId, lender, baseAssetData.baseAsset);
8847
8896
  const baseData = {
8848
8897
  [baseAssetData.baseAsset]: {
8898
+ marketUid: baseMarketUid,
8849
8899
  poolId: baseAssetData.baseAsset,
8850
8900
  underlying: baseAssetData.baseAsset,
8851
8901
  asset: baseMeta,
@@ -10736,7 +10786,7 @@ var MORPHO_LENS = {
10736
10786
  [Chain.KATANA]: "0xCe434378adacC51d54312c872113D687Ac19B516",
10737
10787
  [Chain.HYPEREVM]: "0x6Bc6aCB905c1216B0119C87Bf9E178ce298310FA",
10738
10788
  [Chain.SONEIUM]: "0x4b5458BB47dCBC1a41B31b41e1a8773dE312BE9d",
10739
- [Chain.ETHEREUM_MAINNET]: "0xb8F4283733588E8036273F06fB375dF59ee5e258",
10789
+ [Chain.ETHEREUM_MAINNET]: "0x5c4f2eacbdc1eb38f839bddd7620e250a36819d4",
10740
10790
  [Chain.PLASMA_MAINNET]: "0xcB6Eb8df68153cebF60E1872273Ef52075a5C297",
10741
10791
  [Chain.BERACHAIN]: "0x7a59ddbB76521E8982Fa3A08598C9a83b14A6C07",
10742
10792
  [Chain.BNB_SMART_CHAIN_MAINNET]: "0x3375B2EF9C4D2c6434d39BBE5234c5101218500d",
@@ -10876,12 +10926,48 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
10876
10926
  stakingBorrowApr: safeDivide(stakingBorrowAccrual, debt)
10877
10927
  };
10878
10928
  const userConfig = { selectedMode: mode, id: account, isWhitelisted };
10929
+ const creditLine = Math.max(
10930
+ 0,
10931
+ borrowDiscountedCollateral - balanceData2.adjustedDebt
10932
+ );
10933
+ for (let i = 0; i < assetKeys.length; i++) {
10934
+ const marketUid = assetKeys[i];
10935
+ const pos = payload.lendingPositions["0"][marketUid];
10936
+ if (!pos || !lenderData?.[marketUid]) continue;
10937
+ const { configs, flags, price: priceInfo } = lenderData[marketUid];
10938
+ const config = configs?.[mode];
10939
+ const price = priceInfo?.priceUsd ?? 1;
10940
+ const bcf = config?.borrowCollateralFactor ?? 1;
10941
+ const bf = config?.borrowFactor ?? 1;
10942
+ let withdrawable;
10943
+ if (!pos.collateralEnabled || config?.collateralDisabled) {
10944
+ withdrawable = String(pos.deposits);
10945
+ } else if (balanceData2.debt === 0) {
10946
+ withdrawable = String(pos.deposits);
10947
+ } else {
10948
+ const withdrawableUSD = Math.max(creditLine / bcf, 0);
10949
+ withdrawable = String(
10950
+ Math.min(withdrawableUSD / price, Number(pos.deposits))
10951
+ );
10952
+ }
10953
+ let borrowable;
10954
+ if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
10955
+ borrowable = "0";
10956
+ } else {
10957
+ const borrowableUSD = Math.max(creditLine / bf, 0);
10958
+ borrowable = String(borrowableUSD / price);
10959
+ }
10960
+ pos.withdrawable = withdrawable;
10961
+ pos.borrowable = borrowable;
10962
+ }
10879
10963
  return {
10964
+ lender: "",
10880
10965
  account,
10881
10966
  chainId,
10882
10967
  data: [
10883
10968
  {
10884
- health: balanceData2.adjustedDebt === 0 ? null : balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt,
10969
+ health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
10970
+ borrowCapacityUSD: creditLine,
10885
10971
  accountId: "0",
10886
10972
  balanceData: balanceData2,
10887
10973
  aprData: aprData2,
@@ -10900,8 +10986,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
10900
10986
  let data = [];
10901
10987
  for (let j = 0; j < positionKeys.length; j++) {
10902
10988
  const posId = positionKeys[j];
10903
- const position = payload.lendingPositions[posId];
10904
- const { mode: posMode } = position;
10989
+ const posMode = payload.modes?.[posId];
10905
10990
  const mode = posMode ?? LENDER_MODE_NO_MODE;
10906
10991
  const userConfig = {
10907
10992
  id: posId,
@@ -10972,9 +11057,39 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
10972
11057
  stakingBorrowApr: safeDivide(stakingBorrowAccrual, debt),
10973
11058
  rewards: {}
10974
11059
  };
11060
+ const creditLine = Math.max(0, borrowDiscountedCollateral - adjustedDebt);
11061
+ for (let i = 0; i < marketUids.length; i++) {
11062
+ const marketUid = marketUids[i];
11063
+ const pos = payload.lendingPositions[posId]?.[marketUid];
11064
+ if (!pos || !lenderData?.[marketUid]) continue;
11065
+ const { configs, flags, price: priceInfo } = lenderData[marketUid];
11066
+ const config = configs?.[mode];
11067
+ const price = priceInfo?.priceUsd ?? 1;
11068
+ const bcf = config?.borrowCollateralFactor ?? 1;
11069
+ const bf = config?.borrowFactor ?? 1;
11070
+ let withdrawable;
11071
+ if (!pos.collateralEnabled || config?.collateralDisabled) {
11072
+ withdrawable = String(pos.deposits);
11073
+ } else if (balanceData2.debt === 0) {
11074
+ withdrawable = String(pos.deposits);
11075
+ } else {
11076
+ const withdrawableUSD = Math.max(creditLine / bcf, 0);
11077
+ withdrawable = String(Math.min(withdrawableUSD / price, Number(pos.deposits)));
11078
+ }
11079
+ let borrowable;
11080
+ if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
11081
+ borrowable = "0";
11082
+ } else {
11083
+ const borrowableUSD = Math.max(creditLine / bf, 0);
11084
+ borrowable = String(borrowableUSD / price);
11085
+ }
11086
+ pos.withdrawable = withdrawable;
11087
+ pos.borrowable = borrowable;
11088
+ }
10975
11089
  data.push({
10976
11090
  accountId: posId,
10977
- health: balanceData2.adjustedDebt === 0 ? null : balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt,
11091
+ health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
11092
+ borrowCapacityUSD: creditLine,
10978
11093
  userConfig,
10979
11094
  // aggregated balance data
10980
11095
  balanceData: balanceData2,
@@ -10984,6 +11099,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
10984
11099
  });
10985
11100
  }
10986
11101
  return {
11102
+ lender: "",
10987
11103
  account,
10988
11104
  chainId,
10989
11105
  data
@@ -11004,7 +11120,7 @@ function divideAccrualsToAprs(aprs, nav, deposits, debt) {
11004
11120
  return d;
11005
11121
  }
11006
11122
 
11007
- // src/lending/morpho/utils/parsers.ts
11123
+ // src/lending/public-data/morpho/utils/parsers.ts
11008
11124
  var SECONDS_PER_YEAR3 = 31556952n;
11009
11125
  var toFixed = (x, decimals) => new Intl.NumberFormat("en-US", {
11010
11126
  style: "decimal",
@@ -11040,7 +11156,7 @@ function formatNr(n, d) {
11040
11156
  return Number(formatUnits(BigInt(n ?? 0), d));
11041
11157
  }
11042
11158
 
11043
- // src/lending/morpho/convertPublic.ts
11159
+ // src/lending/public-data/morpho/convertPublic.ts
11044
11160
  function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
11045
11161
  intrinsicYields: {},
11046
11162
  lenderRewards: {},
@@ -11066,6 +11182,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
11066
11182
  const totalDeposits = formatNr(state.supplyAssets, loanAsset.decimals);
11067
11183
  const totalDebt = formatNr(state.borrowAssets, loanAsset.decimals);
11068
11184
  data[m].data[loanAssetAddress] = {
11185
+ marketUid: createMarketUid(chainId, m, loanAssetAddress),
11069
11186
  poolId: loanAssetAddress,
11070
11187
  underlying: loanAssetAddress,
11071
11188
  asset: meta,
@@ -11103,6 +11220,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
11103
11220
  const collateralAssetAddress = collateralAsset.address.toLowerCase();
11104
11221
  const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
11105
11222
  data[m].data[collateralAssetAddress] = {
11223
+ marketUid: createMarketUid(chainId, m, collateralAssetAddress),
11106
11224
  poolId: collateralAssetAddress,
11107
11225
  underlying: collateralAssetAddress,
11108
11226
  asset: metaCollateral,
@@ -11161,7 +11279,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
11161
11279
  return data;
11162
11280
  }
11163
11281
 
11164
- // src/lending/morpho/fetchPublic.ts
11282
+ // src/lending/public-data/morpho/fetchPublic.ts
11165
11283
  var query = (first, skip, chainId) => `
11166
11284
  query GetMarkets {
11167
11285
  markets(first: ${first}, skip: ${skip}, where: {
@@ -11268,7 +11386,7 @@ async function fetchMorphoMarkets(chainId) {
11268
11386
  };
11269
11387
  }
11270
11388
 
11271
- // src/lending/morpho/utils/evmParser.ts
11389
+ // src/lending/public-data/morpho/utils/evmParser.ts
11272
11390
  var FIELD_SIZES = {
11273
11391
  addr: 20,
11274
11392
  u128: 16,
@@ -11458,33 +11576,31 @@ function toHex(arr) {
11458
11576
  }
11459
11577
  return s;
11460
11578
  }
11461
-
11462
- // src/lending/lista/publicCallBuild.ts
11579
+ var { chunk: chunk2 } = lodash;
11580
+ var MARKET_CHUNK_SIZE = 100;
11463
11581
  function buildListaCall(chainId, marketsOverride) {
11464
11582
  const markets = marketsOverride ?? morphoTypeMarkets().LISTA_DAO?.[chainId] ?? [];
11465
11583
  const mb = morphoPools()?.LISTA_DAO?.[chainId];
11466
11584
  if (!mb || markets.length === 0) return [];
11467
- return [
11468
- {
11469
- address: MORPHO_LENS[chainId],
11470
- name: "getListaMarketDataCompact",
11471
- params: [mb, markets]
11472
- }
11473
- ];
11585
+ const marketChunks = chunk2(markets, MARKET_CHUNK_SIZE);
11586
+ return marketChunks.map((marketGroup) => ({
11587
+ address: MORPHO_LENS[chainId],
11588
+ name: "getListaMarketDataCompact",
11589
+ params: [mb, marketGroup]
11590
+ }));
11474
11591
  }
11475
-
11476
- // src/lending/morpho/publicCallBuild.ts
11592
+ var { chunk: chunk3 } = lodash;
11593
+ var MARKET_CHUNK_SIZE2 = 50;
11477
11594
  function buildMorphoCall(chainId, marketsOverride) {
11478
11595
  const markets = marketsOverride ?? morphoTypeMarkets()?.MORPHO_BLUE?.[chainId] ?? [];
11479
11596
  const mb = morphoPools()?.MORPHO_BLUE?.[chainId];
11480
11597
  if (!mb || markets.length === 0) return [];
11481
- return [
11482
- {
11483
- address: MORPHO_LENS[chainId],
11484
- name: "getMarketDataCompact",
11485
- params: [mb, markets]
11486
- }
11487
- ];
11598
+ const marketChunks = chunk3(markets, MARKET_CHUNK_SIZE2);
11599
+ return marketChunks.map((marketGroup) => ({
11600
+ address: MORPHO_LENS[chainId],
11601
+ name: "getMarketDataCompact",
11602
+ params: [mb, marketGroup]
11603
+ }));
11488
11604
  }
11489
11605
  function buildMorphoTypeCall(chainId, lender, marketsOVerride) {
11490
11606
  if (lender.startsWith("LISTA_DAO"))
@@ -11492,7 +11608,7 @@ function buildMorphoTypeCall(chainId, lender, marketsOVerride) {
11492
11608
  return buildMorphoCall(chainId, marketsOVerride);
11493
11609
  }
11494
11610
 
11495
- // src/lending/morpho/utils/mathLib.ts
11611
+ // src/lending/public-data/morpho/utils/mathLib.ts
11496
11612
  var MathLib;
11497
11613
  ((MathLib2) => {
11498
11614
  MathLib2.WAD = 1000000000000000000n;
@@ -11706,7 +11822,7 @@ var MathLib;
11706
11822
  MathLib2._getBorrowRate = _getBorrowRate;
11707
11823
  })(MathLib || (MathLib = {}));
11708
11824
 
11709
- // src/lending/morpho/getMarketsFromChain.ts
11825
+ // src/lending/public-data/morpho/getMarketsFromChain.ts
11710
11826
  function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields = {
11711
11827
  intrinsicYields: {},
11712
11828
  lenderRewards: {},
@@ -11715,7 +11831,11 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11715
11831
  const markets = marketsOverride ?? morphoTypeMarkets()?.MORPHO_BLUE?.[chainId] ?? [];
11716
11832
  return [
11717
11833
  (rData) => {
11718
- const decoded = decodeMarkets(rData[0] ?? "0x");
11834
+ let decoded = [];
11835
+ for (let j = 0; j < rData.length; j++) {
11836
+ const chunkDecoded = decodeMarkets(rData[j] ?? "0x");
11837
+ decoded.push(...chunkDecoded);
11838
+ }
11719
11839
  const data = {};
11720
11840
  decoded.forEach((market, i) => {
11721
11841
  const uniqueKey = markets[i];
@@ -11726,30 +11846,29 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11726
11846
  const loanRewards = {};
11727
11847
  const loanAsset = tokens[loanToken.toLowerCase()];
11728
11848
  const collateralAsset = tokens[collateralToken.toLowerCase()];
11729
- const loanKey = toOracleKey(loanAsset?.assetGroup) ?? toGenericPriceKey(loanAsset?.address, chainId);
11849
+ const loanDecimals = loanAsset?.decimals ?? 18;
11850
+ const collateralDecimals = collateralAsset?.decimals ?? 18;
11851
+ const loanKey = toOracleKey(loanAsset?.assetGroup) ?? toGenericPriceKey(loanAsset?.address ?? loanToken, chainId);
11730
11852
  let loanPrice = prices[loanKey];
11731
11853
  if (!loanPrice) {
11732
- const collateralKey = toOracleKey(collateralAsset?.assetGroup) ?? toGenericPriceKey(collateralAsset?.address, chainId);
11854
+ const collateralKey = toOracleKey(collateralAsset?.assetGroup) ?? toGenericPriceKey(
11855
+ collateralAsset?.address ?? collateralToken,
11856
+ chainId
11857
+ );
11733
11858
  const collateralPrice = prices[collateralKey];
11734
11859
  if (collateralPrice) {
11735
11860
  const priceDebtToCollateral = formatMorphoPrice(
11736
11861
  state.price.toString(),
11737
- loanAsset.decimals,
11738
- collateralAsset.decimals
11862
+ loanDecimals,
11863
+ collateralDecimals
11739
11864
  );
11740
11865
  loanPrice = collateralPrice / priceDebtToCollateral;
11741
11866
  }
11742
11867
  }
11743
- const loanTokenAddress = loanAsset?.address.toLowerCase();
11868
+ const loanTokenAddress = (loanAsset?.address ?? loanToken).toLowerCase();
11744
11869
  const meta = tokens[loanTokenAddress] ?? loanAsset;
11745
- const totalDeposits = formatNr(
11746
- state.totalSupplyAssets,
11747
- loanAsset.decimals
11748
- );
11749
- const totalDebt = formatNr(
11750
- state.totalBorrowAssets,
11751
- loanAsset.decimals
11752
- );
11870
+ const totalDeposits = formatNr(state.totalSupplyAssets, loanDecimals);
11871
+ const totalDebt = formatNr(state.totalBorrowAssets, loanDecimals);
11753
11872
  const utilization = MathLib.getUtilization({
11754
11873
  totalBorrowAssets: state.totalBorrowAssets,
11755
11874
  totalSupplyAssets: state.totalSupplyAssets
@@ -11769,6 +11888,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11769
11888
  const borrowApr = apyToApr2(Number(formatEther(borrowApy))) * 100;
11770
11889
  const depositApr = apyToApr2(Number(formatEther(supplyApy))) * 100;
11771
11890
  data[m].data[loanTokenAddress] = {
11891
+ marketUid: createMarketUid(chainId, m, loanTokenAddress),
11772
11892
  poolId: loanTokenAddress,
11773
11893
  underlying: loanTokenAddress,
11774
11894
  asset: meta,
@@ -11785,7 +11905,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11785
11905
  stableBorrowRate: 0,
11786
11906
  stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
11787
11907
  rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
11788
- decimals: loanAsset.decimals,
11908
+ decimals: loanDecimals,
11789
11909
  config: {
11790
11910
  0: {
11791
11911
  category: 0,
@@ -11803,9 +11923,10 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11803
11923
  isFrozen: false
11804
11924
  };
11805
11925
  const ltv = parseLtv(lltv);
11806
- const collateralAssetAddress = collateralAsset?.address.toLowerCase();
11926
+ const collateralAssetAddress = (collateralAsset?.address ?? collateralToken).toLowerCase();
11807
11927
  const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
11808
11928
  data[m].data[collateralAssetAddress] = {
11929
+ marketUid: createMarketUid(chainId, m, collateralAssetAddress),
11809
11930
  poolId: collateralAssetAddress,
11810
11931
  underlying: collateralAssetAddress,
11811
11932
  asset: metaCollateral,
@@ -11823,7 +11944,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11823
11944
  stableBorrowRate: 0,
11824
11945
  stakingYield: additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
11825
11946
  rewards: void 0,
11826
- decimals: collateralAsset.decimals,
11947
+ decimals: collateralDecimals,
11827
11948
  config: {
11828
11949
  0: {
11829
11950
  category: 0,
@@ -11843,8 +11964,8 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11843
11964
  data[m].params = {
11844
11965
  market: {
11845
11966
  lender: m,
11846
- collateralDecimals: collateralAsset.decimals,
11847
- loanDecimals: loanAsset.decimals,
11967
+ collateralDecimals,
11968
+ loanDecimals,
11848
11969
  id: uniqueKey,
11849
11970
  lltv: lltv.toString(),
11850
11971
  oracle,
@@ -11858,11 +11979,11 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
11858
11979
  });
11859
11980
  return data;
11860
11981
  },
11861
- markets.length > 0 ? 1 : 0
11982
+ markets.length > 0 ? Math.ceil(markets.length / MARKET_CHUNK_SIZE2) : 0
11862
11983
  ];
11863
11984
  }
11864
11985
 
11865
- // src/lending/lista/getMarketsFromChain.ts
11986
+ // src/lending/public-data/lista/getMarketsFromChain.ts
11866
11987
  function getListaMarketDataConverter(lender, chainId, prices, additionalYields = {
11867
11988
  intrinsicYields: {},
11868
11989
  lenderRewards: {},
@@ -11871,7 +11992,11 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
11871
11992
  const markets = marketsOverride ?? morphoTypeMarkets()?.LISTA_DAO?.[chainId] ?? [];
11872
11993
  return [
11873
11994
  (rData) => {
11874
- const decoded = decodeMarkets(rData[0] ?? "0x");
11995
+ let decoded = [];
11996
+ for (let j = 0; j < rData.length; j++) {
11997
+ const chunkDecoded = decodeMarkets(rData[j] ?? "0x");
11998
+ decoded.push(...chunkDecoded);
11999
+ }
11875
12000
  const data = {};
11876
12001
  decoded.forEach((market, i) => {
11877
12002
  const uniqueKey = markets[i];
@@ -11934,6 +12059,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
11934
12059
  const borrowApr = apyToApr2(Number(formatEther(borrowApy))) * 100;
11935
12060
  const depositApr = apyToApr2(Number(formatEther(supplyApy))) * 100;
11936
12061
  data[m].data[loanTokenAddress] = {
12062
+ marketUid: createMarketUid(chainId, m, loanTokenAddress),
11937
12063
  poolId: loanTokenAddress,
11938
12064
  underlying: loanTokenAddress,
11939
12065
  asset: meta,
@@ -11950,7 +12076,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
11950
12076
  stableBorrowRate: 0,
11951
12077
  stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
11952
12078
  rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
11953
- decimals: loanAsset.decimals,
12079
+ decimals: loanDecimals,
11954
12080
  config: {
11955
12081
  0: {
11956
12082
  category: 0,
@@ -11970,6 +12096,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
11970
12096
  const ltv = parseLtv(lltv);
11971
12097
  const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
11972
12098
  data[m].data[collateralAssetAddress] = {
12099
+ marketUid: createMarketUid(chainId, m, collateralAssetAddress),
11973
12100
  poolId: collateralAssetAddress,
11974
12101
  underlying: collateralAssetAddress,
11975
12102
  asset: metaCollateral,
@@ -12027,7 +12154,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
12027
12154
  });
12028
12155
  return data;
12029
12156
  },
12030
- markets.length > 0 ? 1 : 0
12157
+ markets.length > 0 ? Math.ceil(markets.length / MARKET_CHUNK_SIZE2) : 0
12031
12158
  ];
12032
12159
  }
12033
12160
 
@@ -12340,7 +12467,7 @@ var VenusLensLegacyAbi = [
12340
12467
  }
12341
12468
  ];
12342
12469
 
12343
- // src/lending/compound-v2/publicCallBuild.ts
12470
+ // src/lending/public-data/compound-v2/publicCallBuild.ts
12344
12471
  var buildCompoundV2StyleLenderReserveCall = (chainId, lender) => {
12345
12472
  const collateralTokens = getCompoundV2CollateralTokens(chainId, lender);
12346
12473
  const getCTokenCall = getCall(lender, chainId);
@@ -12375,7 +12502,7 @@ function getCall(lender, chainId) {
12375
12502
  });
12376
12503
  }
12377
12504
 
12378
- // src/lending/compound-v2/getters/types.ts
12505
+ // src/lending/public-data/compound-v2/getters/types.ts
12379
12506
  var CAction = /* @__PURE__ */ ((CAction2) => {
12380
12507
  CAction2[CAction2["MINT"] = 0] = "MINT";
12381
12508
  CAction2[CAction2["REDEEM"] = 1] = "REDEEM";
@@ -12389,7 +12516,7 @@ var CAction = /* @__PURE__ */ ((CAction2) => {
12389
12516
  return CAction2;
12390
12517
  })(CAction || {});
12391
12518
 
12392
- // src/lending/compound-v2/getters/venus.ts
12519
+ // src/lending/public-data/compound-v2/getters/venus.ts
12393
12520
  function readVTokenMetadata(meta, token) {
12394
12521
  const pick = (...values) => values.find((v) => v !== void 0);
12395
12522
  return {
@@ -12452,7 +12579,7 @@ function decodePausedActions(bitmap) {
12452
12579
  return result;
12453
12580
  }
12454
12581
 
12455
- // src/lending/compound-v2/getters/moonwell.ts
12582
+ // src/lending/public-data/compound-v2/getters/moonwell.ts
12456
12583
  function toBigInt(value) {
12457
12584
  if (typeof value === "bigint") return value;
12458
12585
  if (typeof value === "number") return BigInt(value);
@@ -12545,7 +12672,7 @@ function parseMoonwellMarket(input, token) {
12545
12672
  };
12546
12673
  }
12547
12674
 
12548
- // src/lending/compound-v2/publicCallParse.ts
12675
+ // src/lending/public-data/compound-v2/publicCallParse.ts
12549
12676
  var PRICE_DECIMALS = 18;
12550
12677
  var RESERVE_MANTISSA_DECIMALS = 18;
12551
12678
  function convertSingleEntry(opts) {
@@ -12553,6 +12680,8 @@ function convertSingleEntry(opts) {
12553
12680
  entryRaw,
12554
12681
  reader,
12555
12682
  asset,
12683
+ chainId,
12684
+ lender,
12556
12685
  prices,
12557
12686
  additionalYields,
12558
12687
  cToken
@@ -12579,7 +12708,9 @@ function convertSingleEntry(opts) {
12579
12708
  const poolId = asset.address;
12580
12709
  const collateralActive = Boolean(currentEntry?.isListed);
12581
12710
  const borrowingEnabled = Boolean(currentEntry?.isBorrowAllowed) && !pausedActions[2 /* BORROW */];
12711
+ const marketUid = createMarketUid(chainId, lender, cToken);
12582
12712
  return {
12713
+ marketUid,
12583
12714
  poolId,
12584
12715
  asset,
12585
12716
  // interest rates (use lender passed-in, not hardcoded)
@@ -12637,6 +12768,7 @@ var getCompoundV2DataConverter = (lender, chainId, prices, additionalYields, tok
12637
12768
  const out = { data: {}, chainId };
12638
12769
  for (let i = 0; i < compoundV2Tokens2.length; i++) {
12639
12770
  const { underlying, cToken } = compoundV2Tokens2[i];
12771
+ if (!cToken || !underlying) continue;
12640
12772
  const poolId = underlying;
12641
12773
  const asset = tokenList[poolId];
12642
12774
  const entryRaw = data[i];
@@ -12644,6 +12776,8 @@ var getCompoundV2DataConverter = (lender, chainId, prices, additionalYields, tok
12644
12776
  entryRaw,
12645
12777
  reader,
12646
12778
  asset,
12779
+ chainId,
12780
+ lender,
12647
12781
  prices,
12648
12782
  additionalYields,
12649
12783
  cToken
@@ -13476,7 +13610,7 @@ var VenusLensAbi = [
13476
13610
  }
13477
13611
  ];
13478
13612
 
13479
- // src/lending/fetchLender.ts
13613
+ // src/lending/public-data/fetchLender.ts
13480
13614
  function getMorphoTypeMarketConverter(lender, chainId, prices, additionalYields, tokenList = {}, marketsOverride) {
13481
13615
  if (lender.startsWith("LISTA_DAO"))
13482
13616
  return getListaMarketDataConverter(
@@ -13641,7 +13775,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
13641
13775
  return lenderData;
13642
13776
  };
13643
13777
 
13644
- // src/lending/fetchLenderExt.ts
13778
+ // src/lending/public-data/fetchLenderExt.ts
13645
13779
  async function getLenderDataFromApi(lender, chainId, prices, additionalYields) {
13646
13780
  if (isMorphoType(lender)) return await fetchMorphoMarkets(chainId);
13647
13781
  return {};
@@ -13806,9 +13940,9 @@ var MULTICALL_ADDRESS = {
13806
13940
  // src/utils/multicall.ts
13807
13941
  var { isArray } = lodash;
13808
13942
  var maxRetries = 3;
13809
- var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient2, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
13943
+ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient3, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
13810
13944
  try {
13811
- const provider = getEvmClient2(chainId, providerId);
13945
+ const provider = getEvmClient3(chainId, providerId);
13812
13946
  const abiIsArray = isArray(abi[0]);
13813
13947
  const returnData = await provider.multicall({
13814
13948
  allowFailure,
@@ -13834,7 +13968,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient2, retry = t
13834
13968
  chainId,
13835
13969
  abi,
13836
13970
  calls,
13837
- getEvmClient2,
13971
+ getEvmClient3,
13838
13972
  retry,
13839
13973
  providerId,
13840
13974
  retries,
@@ -18533,27 +18667,20 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
18533
18667
  }
18534
18668
  const assetMeta = meta.asset;
18535
18669
  const decimals = assetMeta?.decimals ?? 18;
18536
- const currentATokenBalance = Number(
18537
- parseRawAmount(currentATokenBalanceRaw, decimals)
18538
- );
18539
- const currentStableDebt = Number(
18540
- parseRawAmount(currentStableDebtRaw, decimals)
18541
- );
18542
- const currentVariableDebt = Number(
18543
- parseRawAmount(currentVariableDebtRaw, decimals)
18544
- );
18670
+ const currentATokenBalance = parseRawAmount(currentATokenBalanceRaw, decimals);
18671
+ const currentStableDebt = parseRawAmount(currentStableDebtRaw, decimals);
18672
+ const currentVariableDebt = parseRawAmount(currentVariableDebtRaw, decimals);
18545
18673
  const price = meta?.price?.priceUsd ?? 1;
18546
18674
  const priceHist = meta?.price?.priceUsd24h ?? price;
18547
18675
  const dataForAsset = {
18548
- poolId: key,
18676
+ marketUid: key,
18549
18677
  underlying: assetMeta.address,
18550
18678
  deposits: currentATokenBalance,
18551
- depositsRaw: currentATokenBalanceRaw,
18552
18679
  debtStable: currentStableDebt,
18553
18680
  debt: currentVariableDebt,
18554
- depositsUSD: currentATokenBalance * price,
18555
- debtStableUSD: currentStableDebt * price,
18556
- debtUSD: currentVariableDebt * price,
18681
+ depositsUSD: Number(currentATokenBalance) * price,
18682
+ debtStableUSD: Number(currentStableDebt) * price,
18683
+ debtUSD: Number(currentVariableDebt) * price,
18557
18684
  stableBorrowRate: reserveData[5 /* stableBorrowRate */]?.toString(),
18558
18685
  collateralEnabled: Boolean(
18559
18686
  reserveData[8 /* usageAsCollateralEnabled */]
@@ -18562,8 +18689,8 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
18562
18689
  };
18563
18690
  return {
18564
18691
  dataForAsset,
18565
- addedDeposits: currentATokenBalance * priceHist,
18566
- addedDebt: (currentVariableDebt + currentStableDebt) * priceHist
18692
+ addedDeposits: Number(currentATokenBalance) * priceHist,
18693
+ addedDebt: (Number(currentVariableDebt) + Number(currentStableDebt)) * priceHist
18567
18694
  };
18568
18695
  }
18569
18696
 
@@ -18635,10 +18762,9 @@ function createAaveV3Entry(i, data, key, meta) {
18635
18762
  const price = meta?.price?.priceUsd ?? 1;
18636
18763
  const priceHist = meta?.price?.priceUsd24h ?? price;
18637
18764
  const dataForAsset = {
18638
- poolId: key,
18765
+ marketUid: key,
18639
18766
  underlying: assetMeta.address,
18640
18767
  deposits: currentATokenBalance,
18641
- depositsRaw: currentATokenBalanceRaw,
18642
18768
  debtStable: currentStableDebt,
18643
18769
  debt: currentVariableDebt,
18644
18770
  depositsUSD: Number(currentATokenBalance) * price,
@@ -18672,6 +18798,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
18672
18798
  return { e, i };
18673
18799
  }).filter((a) => a.e.owner.toLowerCase() === validOwner).map((a) => a.i);
18674
18800
  let histData = {};
18801
+ const modes = {};
18675
18802
  let allPools = {};
18676
18803
  const result = Object.assign(
18677
18804
  {},
@@ -18679,6 +18806,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
18679
18806
  const entry = data[0 /* posMeta */][index];
18680
18807
  const mode = entry.mode;
18681
18808
  const id = entry.posId.toString();
18809
+ modes[id] = mode;
18682
18810
  const collatData = Object.assign(
18683
18811
  {},
18684
18812
  ...data[1 /* collaterals */][index].map(
@@ -18691,8 +18819,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
18691
18819
  const depositsRaw = c.amount.toString();
18692
18820
  return {
18693
18821
  [pool]: {
18694
- deposits: parseRawAmount(depositsRaw, decimals),
18695
- depositsRaw
18822
+ deposits: parseRawAmount(depositsRaw, decimals)
18696
18823
  }
18697
18824
  };
18698
18825
  }
@@ -18716,51 +18843,47 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
18716
18843
  )
18717
18844
  );
18718
18845
  return {
18719
- [id]: {
18720
- mode,
18721
- ...Object.assign(
18722
- {},
18723
- ...Object.entries(allPools).map(
18724
- ([pool, underlying]) => {
18725
- const key = createMarketUid(chainId, lender, pool);
18726
- const metaEntity = metaMap?.[key];
18727
- const price = metaEntity?.price?.priceUsd ?? 1;
18728
- const priceHist = metaEntity?.price?.priceUsd24h ?? price;
18729
- if (!histData[id])
18730
- histData[id] = {
18731
- totalDebt24h: 0,
18732
- totalDeposits24h: 0
18733
- };
18734
- const debt = debtData[pool]?.debt ?? 0;
18735
- const deposits = collatData[pool]?.deposits ?? 0;
18736
- const depositsRaw = collatData[pool]?.depositsRaw ?? "0";
18737
- histData[id].totalDebt24h += Number(debt) * priceHist;
18738
- histData[id].totalDeposits24h += Number(deposits) * priceHist;
18739
- return {
18740
- [key]: {
18741
- poolId: key,
18742
- underlying,
18743
- deposits,
18744
- depositsRaw,
18745
- debt,
18746
- debtStable: "0",
18747
- debtStableUSD: 0,
18748
- depositsUSD: price * Number(deposits),
18749
- debtUSD: price * Number(debt),
18750
- collateralEnabled: true,
18751
- isAllowed: entry.approved.toLowerCase() === brokerAddress.toLowerCase()
18752
- }
18846
+ [id]: Object.assign(
18847
+ {},
18848
+ ...Object.entries(allPools).map(
18849
+ ([pool, underlying]) => {
18850
+ const key = createMarketUid(chainId, lender, pool);
18851
+ const metaEntity = metaMap?.[key];
18852
+ const price = metaEntity?.price?.priceUsd ?? 1;
18853
+ const priceHist = metaEntity?.price?.priceUsd24h ?? price;
18854
+ if (!histData[id])
18855
+ histData[id] = {
18856
+ totalDebt24h: 0,
18857
+ totalDeposits24h: 0
18753
18858
  };
18754
- }
18755
- )
18859
+ const debt = debtData[pool]?.debt ?? 0;
18860
+ const deposits = collatData[pool]?.deposits ?? 0;
18861
+ histData[id].totalDebt24h += Number(debt) * priceHist;
18862
+ histData[id].totalDeposits24h += Number(deposits) * priceHist;
18863
+ return {
18864
+ [key]: {
18865
+ marketUid: key,
18866
+ underlying,
18867
+ deposits,
18868
+ debt,
18869
+ debtStable: "0",
18870
+ debtStableUSD: 0,
18871
+ depositsUSD: price * Number(deposits),
18872
+ debtUSD: price * Number(debt),
18873
+ collateralEnabled: true,
18874
+ isAllowed: entry.approved.toLowerCase() === brokerAddress.toLowerCase()
18875
+ }
18876
+ };
18877
+ }
18756
18878
  )
18757
- }
18879
+ )
18758
18880
  };
18759
18881
  })
18760
18882
  );
18761
18883
  const payload = {
18762
18884
  chainId,
18763
18885
  lendingPositions: result,
18886
+ modes,
18764
18887
  account
18765
18888
  };
18766
18889
  const userState = createMultiAccountTypeUserState(
@@ -18803,7 +18926,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
18803
18926
  const priceHist2 = metaEntity2?.price?.priceUsd24h ?? price2;
18804
18927
  totalDeposits24h += Number(deposits2) * priceHist2;
18805
18928
  result[key2] = {
18806
- poolId: key2,
18929
+ marketUid: key2,
18807
18930
  underlying: asset,
18808
18931
  deposits: deposits2,
18809
18932
  depositsUSD: Number(deposits2) * price2,
@@ -18811,10 +18934,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
18811
18934
  debt: "0",
18812
18935
  debtStable: "0",
18813
18936
  debtUSD: 0,
18814
- collateralEnabled: true,
18815
- // user depos raw
18816
- depositsRaw: depositsRaw2
18817
- // flag for allowance
18937
+ collateralEnabled: true
18818
18938
  };
18819
18939
  }
18820
18940
  const depositsRaw = data[assetsNoBase.length]?.toString();
@@ -18831,7 +18951,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
18831
18951
  totalDeposits24h += Number(deposits) * priceHist;
18832
18952
  const resultBase = depositsRaw === "0" && debtRaw === "0" ? {} : {
18833
18953
  [key]: {
18834
- poolId: key,
18954
+ marketUid: key,
18835
18955
  underlying: baseAsset,
18836
18956
  deposits,
18837
18957
  debt,
@@ -18840,10 +18960,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
18840
18960
  // populate values for totals
18841
18961
  debtStable: "0",
18842
18962
  debtStableUSD: 0,
18843
- collateralEnabled: false,
18844
- // user depos raw
18845
- depositsRaw
18846
- // flag for allowance
18963
+ collateralEnabled: false
18847
18964
  }
18848
18965
  };
18849
18966
  const earnedBalances = data[expectedNumberOfCalls - 1];
@@ -18938,10 +19055,9 @@ function createAaveV3Entry2(i, data, key, meta) {
18938
19055
  const price = meta?.price?.priceUsd ?? 1;
18939
19056
  const priceHist = meta?.price?.priceUsd24h ?? price;
18940
19057
  const dataForAsset = {
18941
- poolId: key,
19058
+ marketUid: key,
18942
19059
  underlying: assetMeta.address,
18943
19060
  deposits: currentATokenBalance,
18944
- depositsRaw: currentATokenBalanceRaw,
18945
19061
  debtStable: "0",
18946
19062
  debt: currentVariableDebt,
18947
19063
  depositsUSD: Number(currentATokenBalance) * price,
@@ -19122,7 +19238,9 @@ var getMorphoUserDataConverterWithlens = (lender, chainId, account, markets, met
19122
19238
  const lenderKey = createLenderKey(lender, marketId);
19123
19239
  const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(
19124
19240
  balanceData2,
19125
- metaMap?.[lenderKey]
19241
+ metaMap?.[lenderKey],
19242
+ chainId,
19243
+ lenderKey
19126
19244
  );
19127
19245
  const payload = {
19128
19246
  chainId,
@@ -19177,7 +19295,9 @@ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, meta
19177
19295
  const lenderKey = createLenderKey(lender, marketId);
19178
19296
  const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(
19179
19297
  balanceData2,
19180
- metaMap?.[lenderKey]
19298
+ metaMap?.[lenderKey],
19299
+ chainId,
19300
+ lenderKey
19181
19301
  );
19182
19302
  const payload = {
19183
19303
  chainId,
@@ -19214,13 +19334,22 @@ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, meta
19214
19334
  expectedNumberOfCalls
19215
19335
  ];
19216
19336
  };
19217
- function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
19337
+ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lenderKey) {
19218
19338
  const morphoPair = metaMap;
19219
19339
  const _assets = Object.entries(
19220
19340
  morphoPair ?? {}
19221
19341
  );
19222
- const [loanKey, loanAssetMeta] = _assets[0][1].flags?.borrowingEnabled ? _assets[0] : _assets[1];
19223
- const [collateralKey, collateralAssetMeta] = !_assets[0][1].flags?.borrowingEnabled ? _assets[0] : _assets[1];
19342
+ const loanEntry = _assets.find(([, meta]) => meta?.flags?.borrowingEnabled);
19343
+ const collateralEntry = _assets.find(([, meta]) => !meta?.flags?.borrowingEnabled);
19344
+ if (!loanEntry || !collateralEntry) {
19345
+ return {
19346
+ dataForMarket: {},
19347
+ addedDeposits: 0,
19348
+ addedDebt: 0
19349
+ };
19350
+ }
19351
+ const [loanKey, loanAssetMeta] = loanEntry;
19352
+ const [collateralKey, collateralAssetMeta] = collateralEntry;
19224
19353
  const loanAddress = loanAssetMeta?.asset?.address?.toLowerCase();
19225
19354
  const loanAsset = loanAssetMeta?.asset;
19226
19355
  const priceLoan = loanAssetMeta?.price?.priceUsd ?? 1;
@@ -19244,10 +19373,9 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
19244
19373
  const collateralDec = parseRawAmount(collateral.toString(), decimals);
19245
19374
  const borrowDec = parseRawAmount(borrow.toString(), loanAsset?.decimals ?? 18);
19246
19375
  const dataForLoanAsset = {
19247
- poolId: loanAddress,
19376
+ marketUid: createMarketUid(chainId, lenderKey, loanAddress),
19248
19377
  underlying: loanAddress,
19249
19378
  deposits: loanDepositNumber,
19250
- depositsRaw: deposits.toString(),
19251
19379
  debtStable: "0",
19252
19380
  debt: borrowDec,
19253
19381
  depositsUSD: Number(loanDepositNumber) * priceLoan,
@@ -19260,10 +19388,9 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
19260
19388
  const price = collateralAssetMeta?.price.priceUsd ?? 1;
19261
19389
  const priceHist = collateralAssetMeta?.price.priceUsd24h ?? price;
19262
19390
  const dataForCollateralAsset = {
19263
- poolId: collateralAddress,
19391
+ marketUid: createMarketUid(chainId, lenderKey, collateralAddress),
19264
19392
  underlying: collateralAddress,
19265
19393
  deposits: collateralDec,
19266
- depositsRaw: balanceInfo.collateral.toString(),
19267
19394
  debtStable: "0",
19268
19395
  debt: "0",
19269
19396
  depositsUSD: Number(collateralDec) * price,
@@ -19378,27 +19505,26 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
19378
19505
  }
19379
19506
  const assetMeta = meta.asset;
19380
19507
  const decimals = assetMeta?.decimals ?? 18;
19381
- const currentATokenBalance = Number(parseRawAmount(depositsRaw, decimals));
19382
- const currentVariableDebt = Number(parseRawAmount(borrowsRaw, decimals));
19508
+ const currentATokenBalance = parseRawAmount(depositsRaw, decimals);
19509
+ const currentVariableDebt = parseRawAmount(borrowsRaw, decimals);
19383
19510
  const price = meta?.price?.priceUsd ?? 1;
19384
19511
  const priceHist = meta?.price?.priceUsd24h ?? price;
19385
19512
  const dataForAsset = {
19386
- poolId: key,
19513
+ marketUid: key,
19387
19514
  underlying: assetMeta.address,
19388
19515
  deposits: currentATokenBalance,
19389
- depositsRaw,
19390
- debtStable: 0,
19516
+ debtStable: "0",
19391
19517
  debt: currentVariableDebt,
19392
- depositsUSD: currentATokenBalance * price,
19518
+ depositsUSD: Number(currentATokenBalance) * price,
19393
19519
  debtStableUSD: 0,
19394
- debtUSD: currentVariableDebt * price,
19520
+ debtUSD: Number(currentVariableDebt) * price,
19395
19521
  collateralEnabled,
19396
19522
  claimableRewards
19397
19523
  };
19398
19524
  return {
19399
19525
  dataForAsset,
19400
- addedDeposits: currentATokenBalance * priceHist,
19401
- addedDebt: currentVariableDebt * priceHist
19526
+ addedDeposits: Number(currentATokenBalance) * priceHist,
19527
+ addedDebt: Number(currentVariableDebt) * priceHist
19402
19528
  };
19403
19529
  }
19404
19530
 
@@ -19544,7 +19670,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
19544
19670
  meta?.[lender]
19545
19671
  );
19546
19672
  }
19547
- var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient2, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, meta) => {
19673
+ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false) => {
19548
19674
  let calls = [];
19549
19675
  const queries = organizeUserQueries(queriesRaw);
19550
19676
  for (const query2 of queries) {
@@ -19562,7 +19688,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient2, allowFa
19562
19688
  chainId,
19563
19689
  calls.map((call) => call.abi),
19564
19690
  calls.map((call) => call.call),
19565
- getEvmClient2,
19691
+ getEvmClient3,
19566
19692
  true,
19567
19693
  0,
19568
19694
  retries,
@@ -19605,6 +19731,16 @@ var prepareLenderUserDataRpcCalls = (chainId, queriesRaw, batchSize = MULTICALL_
19605
19731
  rpcCalls
19606
19732
  };
19607
19733
  };
19734
+ var hasBalanceOrPositions = (entry) => {
19735
+ const hasBalance = entry.balanceData.deposits > 0 || entry.balanceData.debt > 0;
19736
+ const hasPositions = entry.positions && entry.positions.length > 0;
19737
+ return hasBalance || hasPositions;
19738
+ };
19739
+ var filterEmptyUserData = (userData) => {
19740
+ const filteredData = userData.data.filter(hasBalanceOrPositions);
19741
+ if (filteredData.length === 0) return null;
19742
+ return { ...userData, data: filteredData };
19743
+ };
19608
19744
  var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState) => {
19609
19745
  const queries = organizeUserQueries(queriesRaw);
19610
19746
  const lenderData = {};
@@ -19623,10 +19759,18 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState)
19623
19759
  if (convertedData) {
19624
19760
  if (isMultiMarket(query2.lender)) {
19625
19761
  Object.keys(convertedData).forEach((market) => {
19626
- lenderData[market] = convertedData[market];
19762
+ const filtered = filterEmptyUserData(convertedData[market]);
19763
+ if (filtered) {
19764
+ filtered.lender = market;
19765
+ lenderData[market] = filtered;
19766
+ }
19627
19767
  });
19628
19768
  } else {
19629
- lenderData[query2.lender] = convertedData;
19769
+ const filtered = filterEmptyUserData(convertedData);
19770
+ if (filtered) {
19771
+ filtered.lender = query2.lender;
19772
+ lenderData[query2.lender] = filtered;
19773
+ }
19630
19774
  }
19631
19775
  }
19632
19776
  } catch (e) {
@@ -19695,140 +19839,277 @@ async function getLenderUserDataMulti(account, chainQueries, lenderState) {
19695
19839
  return returndata;
19696
19840
  }
19697
19841
 
19698
- // src/lending/meta/index.ts
19699
- var baseUrl = "https://raw.githubusercontent.com/1delta-DAO/lender-metadata/main";
19700
- var aavePools2 = baseUrl + "/config/aave-pools.json";
19701
- var aaveOracles2 = baseUrl + "/data/aave-oracles.json";
19702
- var morphoTypeOracles2 = baseUrl + "/data/morpho-type-oracles.json";
19703
- var compoundV2Pools2 = baseUrl + "/config/compound-v2-pools.json";
19704
- var compoundV2Oracles2 = baseUrl + "/data/compound-v2-oracles.json";
19705
- var compoundV3Pools2 = baseUrl + "/config/compound-v3-pools.json";
19706
- var compoundV3Oracles2 = baseUrl + "/data/compound-v3-oracles.json";
19707
- var morphoPools2 = baseUrl + "/config/morpho-pools.json";
19708
- var morphoTypeMarkets2 = baseUrl + "/config/morpho-type-markets.json";
19709
- var aaveReserves2 = baseUrl + "/data/aave-reserves.json";
19710
- var compoundV2Reserves2 = baseUrl + "/data/compound-v2-reserves.json";
19711
- var compoundV3Reserves2 = baseUrl + "/data/compound-v3-reserves.json";
19712
- var initConfig2 = baseUrl + "/data/init-config.json";
19713
- var aaveTokens2 = baseUrl + "/data/aave-tokens.json";
19714
- var compoundV2CTokens = baseUrl + "/data/compound-v2-c-tokens.json";
19715
- var compoundV2TokenArray2 = baseUrl + "/data/compound-v2-tokens.json";
19716
- var compoundV3Base = baseUrl + "/data/compound-v3-base-data.json";
19717
- var baseUrlChains = "https://raw.githubusercontent.com/1delta-DAO/chains/main";
19718
- var chains = baseUrlChains + "/data.json";
19719
- function inititalizeAllData(params) {
19720
- const { chainsOverride, ...lenderOverrides } = params;
19721
- initializeLenderData(lenderOverrides);
19722
- initializeChainData({ chainsOverride });
19842
+ // src/lending/user-data/summary/utils.ts
19843
+ function calculateWeightedAverage(items) {
19844
+ const totalWeight = items.reduce((sum, item) => sum + item.weight, 0);
19845
+ if (totalWeight === 0) return 0;
19846
+ const weightedSum = items.reduce(
19847
+ (sum, item) => sum + item.value * item.weight,
19848
+ 0
19849
+ );
19850
+ return weightedSum / totalWeight;
19723
19851
  }
19724
- async function fetchLenderMetaFromDirAndInitialize() {
19725
- const {
19726
- aavePoolsOverride,
19727
- compoundV2PoolsOverride,
19728
- compoundV3PoolsOverride,
19729
- // initPoolsOverride,
19730
- morphoPoolsOverride,
19731
- aaveReservesOverride,
19732
- compoundV2ReservesOverride,
19733
- compoundV3ReservesOverride,
19734
- initConfigOverride,
19735
- aaveTokensOverride,
19736
- compoundV2TokensOverride,
19737
- compoundV2TokenArrayOverride,
19738
- compoundV3BaseDataOverride,
19739
- aaveOraclesOverride,
19740
- compoundV2OraclesOverride,
19741
- compoundV3OraclesOverride,
19742
- morphoTypeOraclesOverride,
19743
- morphoTypeMarketsOverride,
19744
- chainsOverride
19745
- } = await fetchLenderMetaFromDir();
19746
- initializeLenderData({
19747
- aaveTokensOverride,
19748
- aavePoolsOverride,
19749
- compoundV3PoolsOverride,
19750
- compoundV3BaseDataOverride,
19751
- morphoPoolsOverride,
19752
- compoundV2TokensOverride,
19753
- compoundV2TokenArrayOverride,
19754
- compoundV2PoolsOverride,
19755
- initConfigOverride,
19756
- aaveReservesOverride,
19757
- compoundV3ReservesOverride,
19758
- compoundV2ReservesOverride,
19759
- aaveOraclesOverride,
19760
- compoundV2OraclesOverride,
19761
- compoundV3OraclesOverride,
19762
- morphoTypeOraclesOverride,
19763
- morphoTypeMarketsOverride
19764
- });
19765
- initializeChainData({ chainsOverride });
19852
+ function calculateNetApr(aprData2, balanceData2) {
19853
+ const deposits = balanceData2.deposits;
19854
+ const debt = balanceData2.debt;
19855
+ const nav = deposits - debt;
19856
+ if (nav === 0) return 0;
19857
+ const depositIncome = deposits * (aprData2.depositApr / 100);
19858
+ const borrowCost = debt * (aprData2.borrowApr / 100);
19859
+ const rewardIncome = deposits * (aprData2.rewardDepositApr / 100) + debt * (aprData2.rewardBorrowApr / 100);
19860
+ const netIncome = depositIncome - borrowCost + rewardIncome;
19861
+ return netIncome / nav * 100;
19862
+ }
19863
+ function calculateLeverage(deposits, netWorth) {
19864
+ return netWorth > 0 ? deposits / netWorth : 0;
19865
+ }
19866
+ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, avgBorrowApr) {
19867
+ const totalNetWorth = totalDepositsUSD - totalDebtUSD;
19868
+ if (totalNetWorth === 0) return 0;
19869
+ return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
19870
+ }
19871
+
19872
+ // src/lending/user-data/summary/buildPortfolioTotals.ts
19873
+ function buildPortfolioTotals(userDataResult) {
19874
+ let totalDepositsUSD = 0;
19875
+ let totalDebtUSD = 0;
19876
+ let totalRewardApr = 0;
19877
+ let totalNav24h = 0;
19878
+ let lenderCount = 0;
19879
+ const aprItems = [];
19880
+ const activeChains = /* @__PURE__ */ new Set();
19881
+ for (const [chainId, lenders] of Object.entries(userDataResult)) {
19882
+ activeChains.add(chainId);
19883
+ for (const [, userData] of Object.entries(lenders)) {
19884
+ lenderCount++;
19885
+ let lenderDeposits = 0;
19886
+ let lenderDebt = 0;
19887
+ let lenderDepositAprSum = 0;
19888
+ let lenderBorrowAprSum = 0;
19889
+ let lenderDepositWeight = 0;
19890
+ let lenderDebtWeight = 0;
19891
+ for (const subAccount of userData.data) {
19892
+ const { balanceData: balanceData2, aprData: aprData2 } = subAccount;
19893
+ lenderDeposits += balanceData2.deposits;
19894
+ lenderDebt += balanceData2.debt;
19895
+ if (balanceData2.deposits > 0) {
19896
+ lenderDepositAprSum += aprData2.depositApr * balanceData2.deposits;
19897
+ lenderDepositWeight += balanceData2.deposits;
19898
+ }
19899
+ if (balanceData2.debt > 0) {
19900
+ lenderBorrowAprSum += aprData2.borrowApr * balanceData2.debt;
19901
+ lenderDebtWeight += balanceData2.debt;
19902
+ }
19903
+ totalNav24h += balanceData2.nav24h ?? 0;
19904
+ totalRewardApr += aprData2.rewardApr + aprData2.rewardDepositApr + aprData2.rewardBorrowApr + aprData2.stakingApr;
19905
+ }
19906
+ totalDepositsUSD += lenderDeposits;
19907
+ totalDebtUSD += lenderDebt;
19908
+ if (lenderDepositWeight > 0) {
19909
+ aprItems.push({
19910
+ depositApr: lenderDepositAprSum / lenderDepositWeight,
19911
+ borrowApr: lenderDebtWeight > 0 ? lenderBorrowAprSum / lenderDebtWeight : 0,
19912
+ deposits: lenderDeposits,
19913
+ debt: lenderDebt
19914
+ });
19915
+ }
19916
+ }
19917
+ }
19918
+ const totalNetWorth = totalDepositsUSD - totalDebtUSD;
19919
+ const totalDepositWeight = aprItems.reduce((sum, a) => sum + a.deposits, 0);
19920
+ const avgDepositApr = totalDepositWeight > 0 ? aprItems.reduce((sum, a) => sum + a.depositApr * a.deposits, 0) / totalDepositWeight : 0;
19921
+ const totalDebtWeight = aprItems.reduce((sum, a) => sum + a.debt, 0);
19922
+ const avgBorrowApr = totalDebtWeight > 0 ? aprItems.filter((a) => a.debt > 0).reduce((sum, a) => sum + a.borrowApr * a.debt, 0) / totalDebtWeight : 0;
19923
+ const avgNetApr = calculateOverallNetApr(
19924
+ totalDepositsUSD,
19925
+ totalDebtUSD,
19926
+ avgDepositApr,
19927
+ avgBorrowApr
19928
+ );
19929
+ const overallLeverage = calculateLeverage(totalDepositsUSD, totalNetWorth);
19930
+ return {
19931
+ totalDepositsUSD,
19932
+ totalDebtUSD,
19933
+ totalNetWorth,
19934
+ totalNetWorth24h: totalNav24h,
19935
+ avgDepositApr,
19936
+ avgBorrowApr,
19937
+ avgNetApr,
19938
+ totalRewardApr,
19939
+ overallLeverage,
19940
+ activeLenders: lenderCount,
19941
+ activeChains: activeChains.size
19942
+ };
19943
+ }
19944
+
19945
+ // src/lending/user-data/summary/buildSummaries.ts
19946
+ function aggregateLenderData(lender, userData) {
19947
+ const { chainId, data } = userData;
19948
+ let totalDepositsUSD = 0;
19949
+ let totalDebtUSD = 0;
19950
+ let totalCollateral = 0;
19951
+ let totalNav24h = 0;
19952
+ const subAccountSummaries = [];
19953
+ const aprItems = [];
19954
+ let totalRewardApr = 0;
19955
+ let healthSum = 0;
19956
+ let healthCount = 0;
19957
+ for (const subAccount of data) {
19958
+ const { balanceData: balanceData2, aprData: aprData2, positions, health, accountId, userConfig } = subAccount;
19959
+ totalDepositsUSD += balanceData2.deposits;
19960
+ totalDebtUSD += balanceData2.debt;
19961
+ totalCollateral += balanceData2.collateral;
19962
+ totalNav24h += balanceData2.nav24h ?? 0;
19963
+ if (balanceData2.deposits > 0) {
19964
+ aprItems.push({
19965
+ depositApr: aprData2.depositApr,
19966
+ borrowApr: aprData2.borrowApr,
19967
+ weight: balanceData2.deposits
19968
+ });
19969
+ }
19970
+ totalRewardApr += aprData2.rewardApr + aprData2.rewardDepositApr + aprData2.rewardBorrowApr + aprData2.stakingApr;
19971
+ if (health !== null && health > 0) {
19972
+ healthSum += health;
19973
+ healthCount++;
19974
+ }
19975
+ subAccountSummaries.push({
19976
+ accountId,
19977
+ health,
19978
+ balanceData: balanceData2,
19979
+ aprData: aprData2,
19980
+ userConfig,
19981
+ positionCount: positions.length
19982
+ });
19983
+ }
19984
+ const netWorth = totalDepositsUSD - totalDebtUSD;
19985
+ const depositApr = calculateWeightedAverage(
19986
+ aprItems.map((a) => ({ value: a.depositApr, weight: a.weight }))
19987
+ );
19988
+ const borrowApr = calculateWeightedAverage(
19989
+ aprItems.map((a) => ({
19990
+ value: a.borrowApr,
19991
+ weight: a.weight * (a.borrowApr > 0 ? 1 : 0)
19992
+ }))
19993
+ );
19994
+ const netApr = netWorth !== 0 ? (totalDepositsUSD * depositApr - totalDebtUSD * borrowApr) / netWorth * (netWorth > 0 ? 1 : -1) : 0;
19995
+ const leverage = calculateLeverage(totalDepositsUSD, netWorth);
19996
+ const healthFactor = healthCount > 0 ? healthSum / healthCount : totalDebtUSD > 0 ? null : null;
19997
+ return {
19998
+ lender,
19999
+ chainId,
20000
+ totalDepositsUSD,
20001
+ totalDebtUSD,
20002
+ netWorth,
20003
+ netWorth24h: totalNav24h,
20004
+ depositApr,
20005
+ borrowApr,
20006
+ netApr,
20007
+ rewardApr: totalRewardApr,
20008
+ healthFactor,
20009
+ leverage,
20010
+ collateral: totalCollateral,
20011
+ subAccounts: subAccountSummaries
20012
+ };
20013
+ }
20014
+ function buildSummaries(userDataResult) {
20015
+ const lenderSummaries = [];
20016
+ const chainMap = {};
20017
+ let totalDepositsUSD = 0;
20018
+ let totalDebtUSD = 0;
20019
+ let totalRewardApr = 0;
20020
+ let totalNav24h = 0;
20021
+ const aprItems = [];
20022
+ const activeChains = /* @__PURE__ */ new Set();
20023
+ for (const [chainId, lenders] of Object.entries(userDataResult)) {
20024
+ activeChains.add(chainId);
20025
+ if (!chainMap[chainId]) {
20026
+ chainMap[chainId] = {
20027
+ chainId,
20028
+ totalDepositsUSD: 0,
20029
+ totalDebtUSD: 0,
20030
+ netWorth: 0,
20031
+ lenderCount: 0
20032
+ };
20033
+ }
20034
+ for (const [lender, userData] of Object.entries(lenders)) {
20035
+ const summary = aggregateLenderData(lender, userData);
20036
+ lenderSummaries.push(summary);
20037
+ totalDepositsUSD += summary.totalDepositsUSD;
20038
+ totalDebtUSD += summary.totalDebtUSD;
20039
+ totalRewardApr += summary.rewardApr;
20040
+ totalNav24h += summary.netWorth24h;
20041
+ if (summary.totalDepositsUSD > 0) {
20042
+ aprItems.push({
20043
+ depositApr: summary.depositApr,
20044
+ borrowApr: summary.borrowApr,
20045
+ deposits: summary.totalDepositsUSD,
20046
+ debt: summary.totalDebtUSD
20047
+ });
20048
+ }
20049
+ chainMap[chainId].totalDepositsUSD += summary.totalDepositsUSD;
20050
+ chainMap[chainId].totalDebtUSD += summary.totalDebtUSD;
20051
+ chainMap[chainId].lenderCount++;
20052
+ }
20053
+ chainMap[chainId].netWorth = chainMap[chainId].totalDepositsUSD - chainMap[chainId].totalDebtUSD;
20054
+ }
20055
+ const totalNetWorth = totalDepositsUSD - totalDebtUSD;
20056
+ const avgDepositApr = calculateWeightedAverage(
20057
+ aprItems.map((a) => ({ value: a.depositApr, weight: a.deposits }))
20058
+ );
20059
+ const avgBorrowApr = calculateWeightedAverage(
20060
+ aprItems.filter((a) => a.debt > 0).map((a) => ({ value: a.borrowApr, weight: a.debt }))
20061
+ );
20062
+ const avgNetApr = calculateOverallNetApr(
20063
+ totalDepositsUSD,
20064
+ totalDebtUSD,
20065
+ avgDepositApr,
20066
+ avgBorrowApr
20067
+ );
20068
+ const overallLeverage = calculateLeverage(totalDepositsUSD, totalNetWorth);
20069
+ lenderSummaries.sort((a, b) => b.netWorth - a.netWorth);
20070
+ return {
20071
+ totalDepositsUSD,
20072
+ totalDebtUSD,
20073
+ totalNetWorth,
20074
+ totalNetWorth24h: totalNav24h,
20075
+ avgDepositApr,
20076
+ avgBorrowApr,
20077
+ avgNetApr,
20078
+ totalRewardApr,
20079
+ overallLeverage,
20080
+ activeLenders: lenderSummaries.length,
20081
+ activeChains: activeChains.size,
20082
+ lenders: lenderSummaries,
20083
+ chains: Object.values(chainMap)
20084
+ };
19766
20085
  }
19767
- async function fetchLenderMetaFromDir() {
19768
- const promises = [
19769
- aavePools2,
19770
- compoundV2Pools2,
19771
- compoundV3Pools2,
19772
- // initPools,
19773
- morphoPools2,
19774
- aaveReserves2,
19775
- compoundV2Reserves2,
19776
- compoundV3Reserves2,
19777
- initConfig2,
19778
- aaveTokens2,
19779
- compoundV2CTokens,
19780
- compoundV2TokenArray2,
19781
- compoundV3Base,
19782
- aaveOracles2,
19783
- compoundV2Oracles2,
19784
- compoundV3Oracles2,
19785
- morphoTypeOracles2,
19786
- morphoTypeMarkets2,
19787
- chains
19788
- ].map(async (a) => fetch(a).then(async (b) => await b.json()));
19789
- const [
19790
- aavePoolsOverride,
19791
- compoundV2PoolsOverride,
19792
- compoundV3PoolsOverride,
19793
- // initPoolsOverride,
19794
- morphoPoolsOverride,
19795
- aaveReservesOverride,
19796
- compoundV2ReservesOverride,
19797
- compoundV3ReservesOverride,
19798
- initConfigOverride,
19799
- aaveTokensOverride,
19800
- compoundV2TokensOverride,
19801
- compoundV2TokenArrayOverride,
19802
- compoundV3BaseDataOverride,
19803
- aaveOraclesOverride,
19804
- compoundV2OraclesOverride,
19805
- compoundV3OraclesOverride,
19806
- morphoTypeOraclesOverride,
19807
- morphoTypeMarketsOverride,
19808
- chainsOverride
19809
- ] = await Promise.all(promises);
20086
+ function filterActiveLenders(summary) {
20087
+ const activeLenders = summary.lenders.filter(
20088
+ (l) => l.totalDepositsUSD > 0 || l.totalDebtUSD > 0
20089
+ );
19810
20090
  return {
19811
- aavePoolsOverride,
19812
- compoundV2PoolsOverride,
19813
- compoundV3PoolsOverride,
19814
- // initPoolsOverride,
19815
- morphoPoolsOverride,
19816
- aaveReservesOverride,
19817
- compoundV2ReservesOverride,
19818
- compoundV3ReservesOverride,
19819
- initConfigOverride,
19820
- aaveTokensOverride,
19821
- compoundV2TokensOverride,
19822
- compoundV2TokenArrayOverride,
19823
- compoundV3BaseDataOverride,
19824
- aaveOraclesOverride,
19825
- compoundV2OraclesOverride,
19826
- compoundV3OraclesOverride,
19827
- morphoTypeOraclesOverride,
19828
- morphoTypeMarketsOverride,
19829
- chainsOverride
20091
+ ...summary,
20092
+ lenders: activeLenders,
20093
+ activeLenders: activeLenders.length
19830
20094
  };
19831
20095
  }
20096
+ function fuseLenderData(userDataResult, summary) {
20097
+ const entries = [];
20098
+ for (const lenderSummary of summary.lenders) {
20099
+ const { lender, chainId, subAccounts: _2, ...summaryFields } = lenderSummary;
20100
+ const userData = userDataResult[chainId]?.[lender];
20101
+ if (!userData) continue;
20102
+ entries.push({
20103
+ ...summaryFields,
20104
+ lender,
20105
+ chainId,
20106
+ account: userData.account,
20107
+ data: userData.data
20108
+ });
20109
+ }
20110
+ entries.sort((a, b) => b.netWorth - a.netWorth);
20111
+ return entries;
20112
+ }
19832
20113
 
19833
20114
  // src/assets/liquidityThresholds.ts
19834
20115
  var DEFAULT_LIQUIDITY_THRESHOLDS = {
@@ -20173,375 +20454,198 @@ function getDistinctPairsByShortAsset(pairs) {
20173
20454
  return result;
20174
20455
  }
20175
20456
 
20176
- // src/prices/pendle/fetchPendlePrices.ts
20177
- var PENDLE_API_BASE = "https://api-v2.pendle.finance/core";
20178
- var MARKETS_ENDPOINT = `${PENDLE_API_BASE}/v1/markets/all`;
20179
- var PRICES_ENDPOINT = (types) => `${PENDLE_API_BASE}/v1/prices/assets${types ? `?type=${types.join(",")}` : ""}`;
20180
- async function fetchPendleMarkets() {
20181
- try {
20182
- const response = await fetch(MARKETS_ENDPOINT);
20183
- if (!response.ok) {
20184
- throw new Error(`Failed to fetch all markets data: ${response.status}`);
20185
- }
20186
- const data = await response.json();
20187
- const marketsByChain = {};
20188
- if (data.markets) {
20189
- for (const market of data.markets) {
20190
- const chainId = market.chainId.toString();
20191
- if (!marketsByChain[chainId]) {
20192
- marketsByChain[chainId] = [];
20193
- }
20194
- marketsByChain[chainId].push(market);
20195
- }
20196
- }
20197
- return marketsByChain;
20198
- } catch (error) {
20199
- console.error("Error fetching all markets data:", error);
20200
- return {};
20201
- }
20457
+ // src/yields/helpers.ts
20458
+ function averageDataLastN(arr, n = 7) {
20459
+ const last = arr.slice(-n);
20460
+ if (last.length === 0) return 0;
20461
+ return last.reduce((sum, x) => sum + x.data, 0) / last.length;
20202
20462
  }
20203
- async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]) {
20463
+ var safeFetch = async (label, fn) => {
20204
20464
  try {
20205
- const data = await fetchPendlePricesRaw(assetType);
20206
- let prices = {};
20207
- Object.entries(data).forEach(([key, val]) => {
20208
- const [chainId, address] = key.split("-");
20209
- const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
20210
- prices[assetKey] = val;
20211
- });
20212
- return prices;
20213
- } catch (error) {
20214
- console.error(`Error fetching prices pendle prices:`, error);
20215
- return {};
20465
+ return await fn();
20466
+ } catch (e) {
20467
+ console.error(`Error fetching ${label}:`, e);
20468
+ return void 0;
20216
20469
  }
20217
- }
20218
- async function fetchPendlePricesRaw(assetType = ["YT", "PT"]) {
20219
- try {
20220
- const response = await fetch(PRICES_ENDPOINT(assetType));
20221
- const data = await response.json();
20222
- return data.prices;
20223
- } catch (error) {
20224
- console.error(`Error fetching prices pendle prices:`, error);
20225
- return {};
20470
+ };
20471
+ async function getListsMulti(chainIds) {
20472
+ const lists = await fetchTokenLists(chainIds);
20473
+ let res = {};
20474
+ for (const chainId of chainIds) {
20475
+ res[chainId] = { list: lists[chainId] };
20226
20476
  }
20477
+ return res;
20227
20478
  }
20228
- async function fetchPendlePrices(lists = {}, assetType = ["YT", "PT"]) {
20229
- try {
20230
- const marketsResponse = await fetchPendleMarkets();
20231
- if (!Object.keys(marketsResponse).length) {
20232
- return {};
20233
- }
20234
- const allPrices = await fetchPendlePricesForAllChain(lists, assetType);
20235
- return Object.fromEntries(
20236
- Object.entries(allPrices).filter(([, price]) => !!price)
20237
- );
20238
- } catch (error) {
20239
- console.error("Error in fetchPendlePrices:", error);
20240
- return {};
20479
+
20480
+ // src/yields/fetchers/lido.ts
20481
+ var WSTETH_URL = "https://eth-api.lido.fi/v1/protocol/steth/apr/sma";
20482
+ var tETH = "Treehouse ETH::TETH";
20483
+ var wstethFetcher = {
20484
+ label: "WSTETH",
20485
+ fetch: async () => {
20486
+ const res = await fetch(WSTETH_URL).then((r) => r.json());
20487
+ const apr = Number(res.data.aprs.at(-1).apr) * 0.9;
20488
+ return {
20489
+ WSTETH: apr,
20490
+ [tETH]: apr
20491
+ };
20241
20492
  }
20242
- }
20243
- async function fetchPendleYields(lists = {}) {
20244
- try {
20245
- const marketsResponse = await fetchPendleMarkets();
20246
- if (!Object.keys(marketsResponse).length) {
20247
- return {};
20248
- }
20249
- const prices = await fetchPendlePricesRaw();
20250
- let yields = {};
20251
- const now = /* @__PURE__ */ new Date();
20252
- Object.entries(marketsResponse).forEach(([chain, dataArr]) => {
20253
- dataArr.forEach((market) => {
20254
- const ptPrice = prices[market.pt];
20255
- const ytPrice = prices[market.yt];
20256
- if (ytPrice && ytPrice > 0) {
20257
- const yearFraction = yearFractionToExpiry(market.expiry, now);
20258
- const apr = ytPrice / ptPrice * 100 / yearFraction;
20259
- const [chainId, address] = market.pt.split("-");
20260
- const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? market.pt;
20261
- yields[assetKey] = apr;
20262
- }
20263
- });
20264
- });
20265
- return yields;
20266
- } catch (error) {
20267
- console.error("Error in fetchPendlePrices:", error);
20268
- return {};
20493
+ };
20494
+ var stmaticFetcher = {
20495
+ label: "STMATIC",
20496
+ fetch: async () => {
20497
+ return { STMATIC: 0 };
20269
20498
  }
20270
- }
20271
- function yearFractionToExpiry(expiryISO, now = /* @__PURE__ */ new Date()) {
20272
- const expiry = new Date(expiryISO);
20273
- const diffMs = expiry.getTime() - now.getTime();
20274
- const yearFraction = diffMs / (1e3 * 60 * 60 * 24 * 365.25);
20275
- return yearFraction;
20276
- }
20277
-
20278
- // src/yields/yieldTypes.ts
20279
- var addressToAssetYearn = {
20280
- "0xe007ca01894c863d7898045ed5a3b4abf0b18f37": "vbETH yVault::yvvbETH",
20281
- "0x80c34bd3a3569e126e7055831036aa7b212cb159": "vbUSDC yVault::yvvbUSDC",
20282
- "0x9a6bd7b6fd5c4f87eb66356441502fc7dcdd185b": "vbUSDT yVault::yvvbUSDT",
20283
- "0xaa0362ecc584b985056e47812931270b99c91f9d": "vbWBTC yVault::yvvbWBTC",
20284
- "0x93fec6639717b6215a48e5a72a162c50dcc40d68": "vbAUSD yVault::yvvbAUSD"
20285
20499
  };
20286
20500
 
20287
- // src/yields/index.ts
20288
- var hyUSD = "High Yield USD Base::HYUSD";
20289
- var bsdETH = "Based ETH::BSDETH";
20290
- var wstHype = "Staked HYPE Shares::WSTHYPE";
20291
- var kHYPE = "Kinetiq Staked HYPE::kHYPE";
20292
- var tETH = "Treehouse ETH::TETH";
20293
- var osETH = "StakeWise Staked ETH::OSETH";
20294
- var ethX = "Stader ETHx::ETHx";
20295
- var pufEth = "PUFETH";
20296
- var stUSD = "Angle Staked USDA::stUSD";
20297
- var stEur = "Angle Staked EURA::stEUR";
20298
- var sUsds = "sUSDS::SUSDS";
20299
- var srUsd = "Reservoir srUSD::SRUSD";
20300
- var wsrusd = "Wrapped Savings rUSD::WSRUSD";
20301
- var yusd = "YieldFi yUSD::yUSD";
20302
- var rlp = "Resolv RLP::RLP";
20303
- var wstusr = "Resolv wstUSR::WSTUSR";
20304
- var ethPlus = "ETHPlus::ETH+";
20305
- var woEth = "Wrapped OETH::WOETH";
20306
- var csusdl = "Coinshift USDL Morpho Vault::CSUSDL";
20307
- var sfrxeth = "Staked Frax Ether::sfrxETH";
20308
- var ceth = "cETH::CETH";
20309
- var sfrax = "Staked FRAX::SFRAX";
20310
- var rsweth = "Restaked Swell ETH::RSWETH";
20311
- var ynethx = "ynETH MAX::YNETHX";
20312
- var usdZeroPlus = "Staked USD0::USD0++";
20313
- var ethZero = "ETH0::ETH0";
20314
- var usdThree = "Web 3 Dollar::USD3";
20315
- var jitoSol = "Jito Staked SOL::JitoSOL";
20316
- var thBill = "Theo Short Duration US Treasury Fund::THBILL";
20317
- var ssuperusd = "SuperReturn sSuperUSD::SSUPERUSD";
20318
- var hbhype = "hyperbeat x ether.fi HYPE::beHYPE";
20319
- var hbuhype = "Hyperbeat Ultra Hype::hbHYPE";
20320
- var hlp = "Wrapped HLP::WHLP";
20321
- var yoeth = "Yield Optimizer ETH::YOETH";
20322
- var yobtc = "Yield Optimizer BTC::YOBTC";
20323
- var yousd = "Yield Optimizer USD::YOUSD";
20324
- var yoeur = "Yield Optimizer EUR::yoEUR";
20325
- var hwhlp = "Hyperwave HLP::hwHLP";
20326
- var weeths = "Super Symbiotic LRT::weETHs";
20327
- var gmx_eth_usd = "GMX Market ETH/USD::GM [WETH-USDC]";
20328
- var gmx_btc_usd = "GMX Market BTC/USD::GM [WBTC-USDC]";
20329
- var glv_wbtc_usdc = "GMX Liquidity Vault [WBTC-USDC]::GLV [WBTC-USDC]";
20330
- var glv_weth_usdc = "GMX Liquidity Vault [WETH-USDC]::GLV [WETH-USDC]";
20331
- var gmx_eth_usd_address = "0x70d95587d40a2caf56bd97485ab3eec10bee6336";
20332
- var gmx_btc_usd_address = "0x47c031236e19d024b42f8ae6780e44a573170703";
20333
- var glv_wbtc_usdc_address = "0xdf03eed325b82bc1d4db8b49c30ecc9e05104b96";
20334
- var glv_weth_usdc_address = "0x528a5bac7e746c9a509a1f4f6df58a03d44279f9";
20335
- var susdx = "SUSDX";
20336
- var FeedData = {
20337
- WSTETH: "https://eth-api.lido.fi/v1/protocol/steth/apr/sma",
20338
- STMATIC: "https://polygon.lido.fi/api/stats",
20339
- CBETH: "https://api.exchange.coinbase.com/wrapped-assets/cbeth",
20340
- MATICX: "https://universe.staderlabs.com/polygon/apy",
20341
- METH: "https://meth.mantle.xyz/api/stats/apy",
20342
- SUSDE: "https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df",
20343
- EZETH: "https://app.renzoprotocol.com/api/stats?chainId=1",
20344
- RETH: "https://api.rocketpool.net/api/mainnet/payload",
20345
- WEETH: "https://www.ether.fi/api/apr",
20346
- WEETHS: "https://api.sevenseas.capital/etherfi/ethereum/performance/0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88",
20347
- SAVAX: "https://api.benqi.fi/liquidstaking/apr",
20348
- RSETH: "https://universe.kelpdao.xyz/rseth/totalApy",
20349
- TRUMATIC: "https://api.trufin.io/staker/apy?staker=MATIC",
20350
- RTOKENS: "https://yields.reserve.org/pools",
20351
- HYPE: "https://api.hyperlend.finance/data/nativeApy",
20352
- ETHX: "https://universe.staderlabs.com/eth/apy",
20353
- OSETH: "https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy",
20354
- PUFETH: "https://api-v2.puffer.fi/backend-for-frontend/tvl/all",
20355
- ANGLE: "https://exporter.angle.money/v2/savingsApr",
20356
- SUSDS: "https://info-sky.blockanalitica.com/api/v1/overall/?format=json",
20357
- SRUSD: "https://app.reservoir.xyz/api/website",
20358
- YUSD: "https://ctrl.yield.fi/t/yusd/apy",
20359
- RLP: "https://api.resolv.xyz/apr/rlp/7d",
20360
- WSTUSR: "https://api.resolv.xyz/apr/staking/7d",
20361
- MORPHO_VAULTS: "https://blue-api.morpho.org/graphql",
20362
- // SDEUSD: 'https://api-deusd-prod-public.elixir.xyz/public/deusd_apy',
20363
- RSWETH: "https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr",
20364
- YNETHX: "https://gateway.yieldnest.finance/api/v1/graphql",
20365
- USDZEROPLUS: "https://app.usual.money/api/rewards/rates/USD0++",
20366
- ETHZERO: "https://app.usual.money/api/rewards/rates/ETH0",
20367
- JITOSOL: "https://www.jito.network/api/getJitoPoolStats/",
20368
- THBILL: "https://thbill-api.theo.xyz/snapshots",
20369
- YEARN_KATANA: "https://katana-apr-service.vercel.app/api/vaults",
20370
- SSUPERUSD: "https://www.superreturn.ai/api/trpc/cmc.getUSDCPrice,rewardBackend.getYield,rewardBackend.getTvlChange?batch=1&input=%7B%220%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%221%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%222%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%7D",
20371
- HBHYPE: "https://api.hyperbeat.org/api/v1/staking?address=0xCeaD893b162D38e714D82d06a7fe0b0dc3c38E0b",
20372
- HBUHYPE: "https://app.hyperbeat.org/api/hyperfolio/vault-infos?vaultAddress=0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB",
20373
- HLP: "https://api-ui.hyperliquid.xyz/info",
20374
- HWHLP: "https://api.hyperwavefi.xyz/stats/latest?asset=hwhlp_999",
20375
- YO: "https://api.yo.xyz/api/v1/vault/stats",
20376
- GMX: "https://arbitrum-api.gmxinfra.io/apy?period=1d",
20377
- SUSDX: "https://app.usdx.money/v1/base/apyInfo"
20378
- };
20379
- function averageDataLastN(arr, n = 7) {
20380
- const last = arr.slice(-n);
20381
- if (last.length === 0) return 0;
20382
- return last.reduce((sum, x) => sum + x.data, 0) / last.length;
20383
- }
20384
- var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
20385
- async function getDeltaTokenList(chain) {
20386
- const data = await fetch(getListUrl(chain));
20387
- const list = (await data.json()).list;
20388
- return list;
20389
- }
20390
- async function getListsMulti(chainIds) {
20391
- const ps = chainIds.map(async (chainId) => await getDeltaTokenList(chainId));
20392
- const lists = await Promise.all(ps);
20393
- let res = {};
20394
- for (let i = 0; i < chainIds.length; i++) {
20395
- const chainId = chainIds[i];
20396
- res[chainId] = { list: lists[i] };
20501
+ // src/yields/fetchers/renzo.ts
20502
+ var EZETH_URL = "https://app.renzoprotocol.com/api/stats?chainId=1";
20503
+ var ezethFetcher = {
20504
+ label: "EZETH",
20505
+ fetch: async () => {
20506
+ const res = await fetch(EZETH_URL).then((r) => r.json());
20507
+ return { EZETH: Number(res.data.apr.data.rate) };
20397
20508
  }
20398
- return res;
20399
- }
20400
- var safeFetch = async (label, fn) => {
20401
- try {
20402
- return await fn();
20403
- } catch (e) {
20404
- console.error(`Error fetching ${label}:`, e);
20405
- return void 0;
20509
+ };
20510
+
20511
+ // src/yields/fetchers/rocketpool.ts
20512
+ var RETH_URL = "https://api.rocketpool.net/api/mainnet/payload";
20513
+ var rethFetcher = {
20514
+ label: "RETH",
20515
+ fetch: async () => {
20516
+ const res = await fetch(RETH_URL).then((r) => r.json());
20517
+ return { RETH: Number(res.rethAPR) };
20406
20518
  }
20407
20519
  };
20408
- var fetchGeneralYields = async () => {
20409
- const wstethPromise = safeFetch("WSTETH", async () => {
20410
- const res = await fetch(FeedData.WSTETH).then((r) => r.json());
20411
- return Number(res.data.aprs.at(-1).apr) * 0.9;
20412
- });
20413
- const ezethPromise = safeFetch("EZETH", async () => {
20414
- const res = await fetch(FeedData.EZETH).then((r) => r.json());
20415
- return Number(res.data.apr.data.rate);
20416
- });
20417
- const rethPromise = safeFetch("RETH", async () => {
20418
- const res = await fetch(FeedData.RETH).then((r) => r.json());
20419
- return Number(res.rethAPR);
20420
- });
20421
- const weethPromise = safeFetch("WEETH", async () => {
20520
+
20521
+ // src/yields/fetchers/etherfi.ts
20522
+ var WEETH_URL = "https://www.ether.fi/api/apr";
20523
+ var WEETHS_URL = "https://api.sevenseas.capital/etherfi/ethereum/performance/0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88";
20524
+ var weeths = "Super Symbiotic LRT::weETHs";
20525
+ var createWeethFetcher = (wstethPromise) => ({
20526
+ label: "WEETH",
20527
+ fetch: async () => {
20422
20528
  const wstethRes = await wstethPromise;
20529
+ const wstethVal = wstethRes?.WSTETH ?? 0;
20423
20530
  let aYield = 0;
20424
20531
  try {
20425
- const weethRes = await fetch(FeedData.WEETH).then((r) => r.json());
20532
+ const weethRes = await fetch(WEETH_URL).then((r) => r.json());
20426
20533
  aYield = Number(weethRes.lrt2Apr);
20427
20534
  } catch (e) {
20428
20535
  aYield = 0.5;
20429
20536
  }
20430
- return aYield + (wstethRes ?? 0);
20431
- });
20432
- const stmaticPromise = safeFetch("STMATIC", async () => {
20433
- return 0;
20434
- });
20435
- const savaxPromise = safeFetch("SAVAX", async () => {
20436
- const res = await fetch(FeedData.SAVAX).then((r) => r.json());
20437
- return Number(res.apr) * 100;
20438
- });
20439
- const weethsPromise = safeFetch("WEETHS", async () => {
20440
- const res = await fetch(FeedData.WEETHS).then((r) => r.json());
20441
- return apyToApr(res.Response.apy) * 100;
20442
- });
20443
- const methPromise = safeFetch("METH", async () => {
20444
- const res = await fetch(FeedData.METH).then((r) => r.json());
20445
- return apyToApr(Number(res.data[0]?.OneDayAPY)) * 100;
20446
- });
20447
- const maticxPromise = safeFetch("MATICX", async () => {
20448
- const res = await fetch(FeedData.MATICX).then((r) => r.json());
20449
- return Number(res.value) * 0.9;
20450
- });
20451
- const susdePromise = safeFetch("SUSDE", async () => {
20452
- try {
20453
- const res = await fetch(FeedData.SUSDE).then((r) => r.json());
20454
- return apyToAprPercent(res?.data[0]?.apy ?? 0);
20455
- } catch (e) {
20456
- return 0;
20457
- }
20458
- });
20459
- const hbhypePromise = safeFetch("HBHYPE", async () => {
20460
- try {
20461
- const response = await fetch(FeedData.HBHYPE);
20462
- if (!response.ok) {
20463
- throw new Error(`HTTP error! Status: ${response.status}`);
20464
- }
20465
- const result = await response.json();
20466
- if (!result.success || !result.data || !Array.isArray(result.data.delegations)) {
20467
- throw new Error("Invalid response structure");
20468
- }
20469
- const delegations = result.data.delegations;
20470
- const totalApr = delegations.reduce(
20471
- (sum, validator) => sum + Number(validator.apr ?? 0),
20472
- 0
20473
- );
20474
- const averageApr = totalApr / delegations.length;
20475
- return averageApr;
20476
- } catch (e) {
20477
- return 0;
20478
- }
20479
- });
20480
- const hbuhypePromise = safeFetch("HBUHYPE", async () => {
20537
+ return { WEETH: aYield + wstethVal };
20538
+ }
20539
+ });
20540
+ var weethsFetcher = {
20541
+ label: "WEETHS",
20542
+ fetch: async () => {
20543
+ const res = await fetch(WEETHS_URL).then((r) => r.json());
20544
+ return { [weeths]: apyToApr(res.Response.apy) * 100 };
20545
+ }
20546
+ };
20547
+
20548
+ // src/yields/fetchers/mantle.ts
20549
+ var METH_URL = "https://meth.mantle.xyz/api/stats/apy";
20550
+ var methFetcher = {
20551
+ label: "METH",
20552
+ fetch: async () => {
20553
+ const res = await fetch(METH_URL).then((r) => r.json());
20554
+ const apr = apyToApr(Number(res.data[0]?.OneDayAPY)) * 100;
20555
+ return { METH: apr, CMETH: apr };
20556
+ }
20557
+ };
20558
+
20559
+ // src/yields/fetchers/ethena.ts
20560
+ var SUSDE_URL = "https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df";
20561
+ var susdeFetcher = {
20562
+ label: "SUSDE",
20563
+ fetch: async () => {
20481
20564
  try {
20482
- const response = await fetch(FeedData.HBUHYPE);
20483
- if (!response.ok) {
20484
- throw new Error(`HTTP error! Status: ${response.status}`);
20485
- }
20486
- const result = await response.json();
20487
- const apy = result.currentAPY?.apy_1d ?? 0;
20488
- return apyToAprPercent(apy);
20565
+ const res = await fetch(SUSDE_URL).then((r) => r.json());
20566
+ return { SUSDE: apyToAprPercent(res?.data[0]?.apy ?? 0) };
20489
20567
  } catch (e) {
20490
- return 0;
20568
+ return { SUSDE: 0 };
20491
20569
  }
20492
- });
20493
- const ssuperusdPromise = safeFetch("SSUPERUSD", async () => {
20570
+ }
20571
+ };
20572
+
20573
+ // src/yields/fetchers/stader.ts
20574
+ var MATICX_URL = "https://universe.staderlabs.com/polygon/apy";
20575
+ var ETHX_URL = "https://universe.staderlabs.com/eth/apy";
20576
+ var ethX = "Stader ETHx::ETHx";
20577
+ var maticxFetcher = {
20578
+ label: "MATICX",
20579
+ fetch: async () => {
20580
+ const res = await fetch(MATICX_URL).then((r) => r.json());
20581
+ return { MATICX: Number(res.value) * 0.9 };
20582
+ }
20583
+ };
20584
+ var ethxFetcher = {
20585
+ label: "ETHX",
20586
+ fetch: async () => {
20587
+ const res = await fetch(ETHX_URL).then((r) => r.json());
20588
+ return { [ethX]: apyToAprPercent(res.value) };
20589
+ }
20590
+ };
20591
+
20592
+ // src/yields/fetchers/savax.ts
20593
+ var SAVAX_URL = "https://api.benqi.fi/liquidstaking/apr";
20594
+ var savaxFetcher = {
20595
+ label: "SAVAX",
20596
+ fetch: async () => {
20597
+ const res = await fetch(SAVAX_URL).then((r) => r.json());
20598
+ return { SAVAX: Number(res.apr) * 100 };
20599
+ }
20600
+ };
20601
+
20602
+ // src/yields/fetchers/coinbase.ts
20603
+ var CBETH_URL = "https://api.exchange.coinbase.com/wrapped-assets/cbeth";
20604
+ var cbethFetcher = {
20605
+ label: "CBETH",
20606
+ fetch: async () => {
20494
20607
  try {
20495
- const res = await fetch(FeedData.SSUPERUSD, {
20496
- method: "GET",
20497
- headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
20608
+ const res = await fetch(CBETH_URL, {
20609
+ headers: {
20610
+ "User-Agent": "1delta/yields",
20611
+ "Content-Type": "application/json"
20612
+ }
20498
20613
  }).then((r) => r.json());
20499
- return apyToAprPercent(res?.[1]?.result.data.json ?? 0);
20614
+ return { CBETH: apyToAprPercent(res.apy) * 100 };
20500
20615
  } catch (e) {
20501
- return 0;
20616
+ console.log("CBETH failed", e);
20617
+ return { CBETH: 0 };
20502
20618
  }
20503
- });
20504
- const rsethPromise = safeFetch("RSETH", async () => {
20505
- const res = await fetch(FeedData.RSETH).then((r) => r.json());
20506
- return apyToAprPercent(res.totalAPY);
20507
- });
20508
- const susdxPromise = safeFetch("SUSDX", async () => {
20509
- const res = await fetch(FeedData.SUSDX).then((r) => r.json());
20510
- return apyToApr(res.result.susdxApy) * 100;
20511
- });
20512
- const trumaticPromise = safeFetch("TRUMATIC", async () => {
20513
- const res = await fetch(FeedData.TRUMATIC).then((r) => r.json());
20514
- return apyToAprPercent(res.apy);
20515
- });
20516
- const thbillPromise = safeFetch("THBILL", async () => {
20517
- const res = await fetch(FeedData.THBILL).then((r) => r.json());
20518
- const entrs = Object.values(res.history[0]?.composition ?? {}).flatMap(
20519
- (a) => Object.entries(a)
20520
- );
20521
- const total = entrs.reduce((acc, b) => acc + Number(b[1]), 0);
20522
- const val = entrs.filter((a) => a[0] === "ULTRA").reduce((acc, b) => acc + Number(b[1]), 0);
20523
- return val / total * 4.5;
20524
- });
20525
- const ethxPromise = safeFetch("ETHX", async () => {
20526
- const res = await fetch(FeedData.ETHX).then((r) => r.json());
20527
- return apyToAprPercent(res.value);
20528
- });
20529
- const yearnKatanaPromise = safeFetch("YEARN_KATANA", async () => {
20530
- const res = await fetch(
20531
- FeedData.YEARN_KATANA
20532
- ).then((r) => r.json());
20533
- let map = {};
20534
- Object.entries(res).forEach(([addr, data2]) => {
20535
- const key = addressToAssetYearn[addr.toLowerCase()];
20536
- if (key) {
20537
- const apr = ((data2.apr.netAPR ?? 0) + (data2.apr.extra.extrinsicYield ?? 0) + (data2.apr.extra.katanaNativeYield ?? 0)) * 100;
20538
- map[key] = apr;
20539
- }
20540
- });
20541
- return map;
20542
- });
20543
- const osEthPromise = safeFetch("OSETH", async () => {
20544
- const res = await fetch(FeedData.OSETH, {
20619
+ }
20620
+ };
20621
+
20622
+ // src/yields/fetchers/kelp.ts
20623
+ var RSETH_URL = "https://universe.kelpdao.xyz/rseth/totalApy";
20624
+ var rsethFetcher = {
20625
+ label: "RSETH",
20626
+ fetch: async () => {
20627
+ const res = await fetch(RSETH_URL).then((r) => r.json());
20628
+ return { RSETH: apyToAprPercent(res.totalAPY) };
20629
+ }
20630
+ };
20631
+
20632
+ // src/yields/fetchers/trufin.ts
20633
+ var TRUMATIC_URL = "https://api.trufin.io/staker/apy?staker=MATIC";
20634
+ var trumaticFetcher = {
20635
+ label: "TRUMATIC",
20636
+ fetch: async () => {
20637
+ const res = await fetch(TRUMATIC_URL).then((r) => r.json());
20638
+ return { TRUMATIC: apyToAprPercent(res.apy) };
20639
+ }
20640
+ };
20641
+
20642
+ // src/yields/fetchers/stakewise.ts
20643
+ var OSETH_URL = "https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy";
20644
+ var osETH = "StakeWise Staked ETH::OSETH";
20645
+ var osethFetcher = {
20646
+ label: "OSETH",
20647
+ fetch: async () => {
20648
+ const res = await fetch(OSETH_URL, {
20545
20649
  method: "POST",
20546
20650
  headers: { Accept: "application/json" },
20547
20651
  body: JSON.stringify({
@@ -20549,10 +20653,17 @@ var fetchGeneralYields = async () => {
20549
20653
  operationName: "osTokenApy"
20550
20654
  })
20551
20655
  }).then((r) => r.json());
20552
- return apyToAprPercent(res.data?.osTokens?.[0]?.apy);
20553
- });
20554
- const ynethxPromise = safeFetch("YNETHX", async () => {
20555
- const res = await fetch(FeedData.YNETHX, {
20656
+ return { [osETH]: apyToAprPercent(res.data?.osTokens?.[0]?.apy) };
20657
+ }
20658
+ };
20659
+
20660
+ // src/yields/fetchers/yieldnest.ts
20661
+ var YNETHX_URL = "https://gateway.yieldnest.finance/api/v1/graphql";
20662
+ var ynethx = "ynETH MAX::YNETHX";
20663
+ var ynethxFetcher = {
20664
+ label: "YNETHX",
20665
+ fetch: async () => {
20666
+ const res = await fetch(YNETHX_URL, {
20556
20667
  method: "POST",
20557
20668
  headers: {
20558
20669
  Accept: "application/json",
@@ -20567,374 +20678,672 @@ var fetchGeneralYields = async () => {
20567
20678
  })
20568
20679
  }).then((r) => r.json());
20569
20680
  const dat = res?.data?.getLRTsData?.tokens.find((x) => x.token === "ynETHx")?.blockchains?.find((b) => b.chainId === 1)?.apr?.apr31d;
20570
- return Number(dat ?? 0);
20571
- });
20572
- const pufEthPromise = safeFetch("PUFETH", async () => {
20573
- const res = await fetch(FeedData.PUFETH, {
20574
- method: "GET",
20575
- headers: { Accept: "application/json" }
20576
- }).then((r) => r.json());
20577
- return apyToAprPercent(res.apy);
20578
- });
20579
- const usdZeroPlusPromise = safeFetch("USDZEROPLUS", async () => {
20580
- const res = await fetch(FeedData.USDZEROPLUS, {
20681
+ return { [ynethx]: Number(dat ?? 0) };
20682
+ }
20683
+ };
20684
+
20685
+ // src/yields/fetchers/puffer.ts
20686
+ var PUFETH_URL = "https://api-v2.puffer.fi/backend-for-frontend/tvl/all";
20687
+ var pufEth = "PUFETH";
20688
+ var pufethFetcher = {
20689
+ label: "PUFETH",
20690
+ fetch: async () => {
20691
+ const res = await fetch(PUFETH_URL, {
20581
20692
  method: "GET",
20582
20693
  headers: { Accept: "application/json" }
20583
20694
  }).then((r) => r.json());
20584
- return Number(res?.rewards[0]?.apr ?? 0) * 100;
20585
- });
20586
- const jitoSolPromise = safeFetch("JITOSOL", async () => {
20587
- const res = await fetch(FeedData.JITOSOL, {
20588
- method: "GET",
20589
- headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
20590
- }).then((r) => r.json());
20591
- const val = averageDataLastN(res?.getStakePoolStats?.apy, 7);
20592
- return apyToApr(val) * 100;
20593
- });
20594
- const ethZeroPromise = safeFetch("ETHZERO", async () => {
20595
- const res = await fetch(FeedData.ETHZERO, {
20695
+ return { [pufEth]: apyToAprPercent(res.apy) };
20696
+ }
20697
+ };
20698
+
20699
+ // src/yields/fetchers/sky.ts
20700
+ var SUSDS_URL = "https://info-sky.blockanalitica.com/api/v1/overall/?format=json";
20701
+ var sUsds = "sUSDS::SUSDS";
20702
+ var susdsFetcher = {
20703
+ label: "SUSDS",
20704
+ fetch: async () => {
20705
+ const res = await fetch(SUSDS_URL, {
20596
20706
  method: "GET",
20597
20707
  headers: { Accept: "application/json" }
20598
20708
  }).then((r) => r.json());
20599
- return Number(res?.rewards[0]?.apr ?? 0) * 100;
20600
- });
20601
- const yoPromise = safeFetch("YO", async () => {
20602
- const res = await fetch(FeedData.YO, {
20709
+ return {
20710
+ [sUsds]: apyToApr(Number(res?.[0]?.sky_savings_rate_apy ?? 0)) * 100
20711
+ };
20712
+ }
20713
+ };
20714
+
20715
+ // src/yields/fetchers/reservoir.ts
20716
+ var SRUSD_URL = "https://app.reservoir.xyz/api/website";
20717
+ var srUsd = "Reservoir srUSD::SRUSD";
20718
+ var wsrusd = "Wrapped Savings rUSD::WSRUSD";
20719
+ var srusdFetcher = {
20720
+ label: "SRUSD",
20721
+ fetch: async () => {
20722
+ const res = await fetch(SRUSD_URL, {
20603
20723
  method: "GET",
20604
20724
  headers: { Accept: "application/json" }
20605
20725
  }).then((r) => r.json());
20606
- const datas = res?.data;
20607
- const yoETH = datas.find((a) => a.id === "yoETH").yield?.["1d"];
20608
- const yoBTC = datas.find((a) => a.id === "yoBTC").yield?.["1d"];
20609
- const yoUSD = datas.find((a) => a.id === "yoUSD").yield?.["1d"];
20610
- const yoEUR = datas.find((a) => a.id === "yoEUR").yield?.["1d"];
20726
+ const apr = apyToAprPercent(Number(res?.srusdApy ?? 0));
20611
20727
  return {
20612
- [yoeth]: apyToAprPercent(yoETH),
20613
- [yobtc]: apyToAprPercent(yoBTC),
20614
- [yousd]: apyToAprPercent(yoUSD),
20615
- [yoeur]: apyToAprPercent(yoEUR)
20728
+ [srUsd]: apr,
20729
+ [wsrusd]: apr
20616
20730
  };
20617
- });
20618
- const gmxPromise = safeFetch("GMX", async () => {
20619
- const res = await fetch(FeedData.GMX, {
20731
+ }
20732
+ };
20733
+
20734
+ // src/yields/fetchers/yieldfi.ts
20735
+ var YUSD_URL = "https://ctrl.yield.fi/t/yusd/apy";
20736
+ var yusd = "YieldFi yUSD::yUSD";
20737
+ var yusdFetcher = {
20738
+ label: "YUSD",
20739
+ fetch: async () => {
20740
+ const res = await fetch(YUSD_URL, {
20620
20741
  method: "GET",
20621
20742
  headers: { Accept: "application/json" }
20622
20743
  }).then((r) => r.json());
20623
- let rData = {};
20624
- const markets = res.markets;
20625
- Object.entries(markets).forEach(([m, d]) => {
20626
- if (m.toLowerCase() === gmx_eth_usd_address)
20627
- rData[gmx_eth_usd] = apyToApr(d.apy) * 100;
20628
- if (m.toLowerCase() === gmx_btc_usd_address)
20629
- rData[gmx_btc_usd] = apyToApr(d.apy) * 100;
20630
- });
20631
- const glvs = res.glvs;
20632
- Object.entries(glvs).forEach(([m, d]) => {
20633
- if (m.toLowerCase() === glv_wbtc_usdc_address)
20634
- rData[glv_wbtc_usdc] = apyToApr(d.apy) * 100;
20635
- if (m.toLowerCase() === glv_weth_usdc_address)
20636
- rData[glv_weth_usdc] = apyToApr(d.apy) * 100;
20637
- });
20638
- return rData;
20639
- });
20640
- const susdsPromise = safeFetch("SUSDS", async () => {
20641
- const res = await fetch(FeedData.SUSDS, {
20642
- method: "GET",
20643
- headers: { Accept: "application/json" }
20644
- }).then((r) => r.json());
20645
- return apyToApr(Number(res?.[0]?.sky_savings_rate_apy ?? 0)) * 100;
20646
- });
20647
- const srusdPromise = safeFetch("SRUSD", async () => {
20648
- const res = await fetch(FeedData.SRUSD, {
20649
- method: "GET",
20650
- headers: { Accept: "application/json" }
20651
- }).then((r) => r.json());
20652
- return apyToAprPercent(Number(res?.srusdApy ?? 0));
20653
- });
20654
- const yusdPromise = safeFetch("YUSD", async () => {
20655
- const res = await fetch(FeedData.YUSD, {
20656
- method: "GET",
20657
- headers: { Accept: "application/json" }
20658
- }).then((r) => r.json());
20659
- return apyToAprPercent(Number(res?.apy ?? 0));
20660
- });
20661
- const rlpPromise = safeFetch("RLP", async () => {
20662
- const res = await fetch(FeedData.RLP, {
20744
+ return { [yusd]: apyToAprPercent(Number(res?.apy ?? 0)) };
20745
+ }
20746
+ };
20747
+
20748
+ // src/yields/fetchers/resolv.ts
20749
+ var RLP_URL = "https://api.resolv.xyz/apr/rlp/7d";
20750
+ var WSTUSR_URL = "https://api.resolv.xyz/apr/staking/7d";
20751
+ var rlp = "Resolv RLP::RLP";
20752
+ var wstusr = "Resolv wstUSR::WSTUSR";
20753
+ var rlpFetcher = {
20754
+ label: "RLP",
20755
+ fetch: async () => {
20756
+ const res = await fetch(RLP_URL, {
20663
20757
  method: "GET",
20664
20758
  headers: {
20665
20759
  Accept: "application/json",
20666
20760
  "User-Agent": "1delta/yields"
20667
20761
  }
20668
20762
  }).then((r) => r.json());
20669
- return Number(res?.value ?? 0) * 100;
20670
- });
20671
- const wstusrPromise = safeFetch("WSTUSR", async () => {
20672
- const res = await fetch(FeedData.WSTUSR, {
20763
+ return { [rlp]: Number(res?.value ?? 0) * 100 };
20764
+ }
20765
+ };
20766
+ var wstusrFetcher = {
20767
+ label: "WSTUSR",
20768
+ fetch: async () => {
20769
+ const res = await fetch(WSTUSR_URL, {
20673
20770
  method: "GET",
20674
20771
  headers: {
20675
20772
  Accept: "application/json",
20676
20773
  "User-Agent": "1delta/yields"
20677
20774
  }
20678
20775
  }).then((r) => r.json());
20679
- return Number(res?.value ?? 0) * 100;
20680
- });
20681
- const rswethPromise = safeFetch("RSWETH", async () => {
20682
- const res = await fetch(FeedData.RSWETH, {
20776
+ return { [wstusr]: Number(res?.value ?? 0) * 100 };
20777
+ }
20778
+ };
20779
+
20780
+ // src/yields/fetchers/morphoVaults.ts
20781
+ var MORPHO_VAULTS_URL = "https://blue-api.morpho.org/graphql";
20782
+ var csusdl = "Coinshift USDL Morpho Vault::CSUSDL";
20783
+ var csusdlFetcher = {
20784
+ label: "CSUSDL",
20785
+ fetch: async () => {
20786
+ const res = await fetch(MORPHO_VAULTS_URL, {
20787
+ method: "POST",
20788
+ headers: { Accept: "application/json" },
20789
+ body: JSON.stringify({
20790
+ query: "query GetAllCurrentAPYFromVault($address: String!) {\n vaultByAddress(address: $address) {\n state {\n apy\n netApy\n }\n asset {\n yield {\n apr\n }\n }\n }\n}",
20791
+ variables: {
20792
+ address: "0xbEeFc011e94f43b8B7b455eBaB290C7Ab4E216f1"
20793
+ }
20794
+ })
20795
+ }).then((r) => r.json());
20796
+ const vba = res?.data?.vaultByAddress;
20797
+ return {
20798
+ [csusdl]: apyToAprPercent(vba.state.apy ?? 0) * 100 + (vba?.asset?.yield.apr ?? 0) * 100
20799
+ };
20800
+ }
20801
+ };
20802
+
20803
+ // src/yields/fetchers/swell.ts
20804
+ var RSWETH_URL = "https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr";
20805
+ var rsweth = "Restaked Swell ETH::RSWETH";
20806
+ var rswethFetcher = {
20807
+ label: "RSWETH",
20808
+ fetch: async () => {
20809
+ const res = await fetch(RSWETH_URL, {
20683
20810
  method: "GET",
20684
20811
  headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
20685
20812
  }).then((r) => r.text());
20686
- return Number(res) ?? 0;
20687
- });
20688
- const hwhlpPromise = safeFetch("HWHLP", async () => {
20689
- const res = await fetch(FeedData.HWHLP, {
20813
+ return { [rsweth]: Number(res) ?? 0 };
20814
+ }
20815
+ };
20816
+
20817
+ // src/yields/fetchers/usual.ts
20818
+ var USDZEROPLUS_URL = "https://app.usual.money/api/rewards/rates/USD0++";
20819
+ var ETHZERO_URL = "https://app.usual.money/api/rewards/rates/ETH0";
20820
+ var usdZeroPlus = "Staked USD0::USD0++";
20821
+ var ethZero = "ETH0::ETH0";
20822
+ var usdZeroPlusFetcher = {
20823
+ label: "USDZEROPLUS",
20824
+ fetch: async () => {
20825
+ const res = await fetch(USDZEROPLUS_URL, {
20690
20826
  method: "GET",
20691
20827
  headers: { Accept: "application/json" }
20692
20828
  }).then((r) => r.json());
20693
- return Number(res.data?.apr_1d ?? 0);
20694
- });
20695
- const csusdlPromise = safeFetch("CSUSDL", async () => {
20696
- const res = await fetch(FeedData.MORPHO_VAULTS, {
20829
+ return { [usdZeroPlus]: Number(res?.rewards[0]?.apr ?? 0) * 100 };
20830
+ }
20831
+ };
20832
+ var ethZeroFetcher = {
20833
+ label: "ETHZERO",
20834
+ fetch: async () => {
20835
+ const res = await fetch(ETHZERO_URL, {
20836
+ method: "GET",
20837
+ headers: { Accept: "application/json" }
20838
+ }).then((r) => r.json());
20839
+ return { [ethZero]: Number(res?.rewards[0]?.apr ?? 0) * 100 };
20840
+ }
20841
+ };
20842
+
20843
+ // src/yields/fetchers/jito.ts
20844
+ var JITOSOL_URL = "https://www.jito.network/api/getJitoPoolStats/";
20845
+ var jitoSol = "Jito Staked SOL::JitoSOL";
20846
+ var jitoSolFetcher = {
20847
+ label: "JITOSOL",
20848
+ fetch: async () => {
20849
+ const res = await fetch(JITOSOL_URL, {
20850
+ method: "GET",
20851
+ headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
20852
+ }).then((r) => r.json());
20853
+ const val = averageDataLastN(res?.getStakePoolStats?.apy, 7);
20854
+ return { [jitoSol]: apyToApr(val) * 100 };
20855
+ }
20856
+ };
20857
+
20858
+ // src/yields/fetchers/theo.ts
20859
+ var THBILL_URL = "https://thbill-api.theo.xyz/snapshots";
20860
+ var thBill = "Theo Short Duration US Treasury Fund::THBILL";
20861
+ var thbillFetcher = {
20862
+ label: "THBILL",
20863
+ fetch: async () => {
20864
+ const res = await fetch(THBILL_URL).then((r) => r.json());
20865
+ const entrs = Object.values(res.history[0]?.composition ?? {}).flatMap(
20866
+ (a) => Object.entries(a)
20867
+ );
20868
+ const total = entrs.reduce((acc, b) => acc + Number(b[1]), 0);
20869
+ const val = entrs.filter((a) => a[0] === "ULTRA").reduce((acc, b) => acc + Number(b[1]), 0);
20870
+ return { [thBill]: val / total * 4.5 };
20871
+ }
20872
+ };
20873
+
20874
+ // src/yields/fetchers/superreturn.ts
20875
+ var SSUPERUSD_URL = "https://www.superreturn.ai/api/trpc/cmc.getUSDCPrice,rewardBackend.getYield,rewardBackend.getTvlChange?batch=1&input=%7B%220%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%221%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%222%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%7D";
20876
+ var ssuperusd = "SuperReturn sSuperUSD::SSUPERUSD";
20877
+ var ssuperusdFetcher = {
20878
+ label: "SSUPERUSD",
20879
+ fetch: async () => {
20880
+ try {
20881
+ const res = await fetch(SSUPERUSD_URL, {
20882
+ method: "GET",
20883
+ headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
20884
+ }).then((r) => r.json());
20885
+ return { [ssuperusd]: apyToAprPercent(res?.[1]?.result.data.json ?? 0) };
20886
+ } catch (e) {
20887
+ return { [ssuperusd]: 0 };
20888
+ }
20889
+ }
20890
+ };
20891
+
20892
+ // src/yields/fetchers/hyperbeat.ts
20893
+ var HBHYPE_URL = "https://api.hyperbeat.org/api/v1/staking?address=0xCeaD893b162D38e714D82d06a7fe0b0dc3c38E0b";
20894
+ var HBUHYPE_URL = "https://app.hyperbeat.org/api/hyperfolio/vault-infos?vaultAddress=0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB";
20895
+ var hbhype = "hyperbeat x ether.fi HYPE::beHYPE";
20896
+ var hbuhype = "Hyperbeat Ultra Hype::hbHYPE";
20897
+ var hbhypeFetcher = {
20898
+ label: "HBHYPE",
20899
+ fetch: async () => {
20900
+ try {
20901
+ const response = await fetch(HBHYPE_URL);
20902
+ if (!response.ok) {
20903
+ throw new Error(`HTTP error! Status: ${response.status}`);
20904
+ }
20905
+ const result = await response.json();
20906
+ if (!result.success || !result.data || !Array.isArray(result.data.delegations)) {
20907
+ throw new Error("Invalid response structure");
20908
+ }
20909
+ const delegations = result.data.delegations;
20910
+ const totalApr = delegations.reduce(
20911
+ (sum, validator) => sum + Number(validator.apr ?? 0),
20912
+ 0
20913
+ );
20914
+ const averageApr = totalApr / delegations.length;
20915
+ return { [hbhype]: averageApr };
20916
+ } catch (e) {
20917
+ return { [hbhype]: 0 };
20918
+ }
20919
+ }
20920
+ };
20921
+ var hbuhypeFetcher = {
20922
+ label: "HBUHYPE",
20923
+ fetch: async () => {
20924
+ try {
20925
+ const response = await fetch(HBUHYPE_URL);
20926
+ if (!response.ok) {
20927
+ throw new Error(`HTTP error! Status: ${response.status}`);
20928
+ }
20929
+ const result = await response.json();
20930
+ const apy = result.currentAPY?.apy_1d ?? 0;
20931
+ return { [hbuhype]: apyToAprPercent(apy) };
20932
+ } catch (e) {
20933
+ return { [hbuhype]: 0 };
20934
+ }
20935
+ }
20936
+ };
20937
+
20938
+ // src/yields/fetchers/hyperliquid.ts
20939
+ var HLP_URL = "https://api-ui.hyperliquid.xyz/info";
20940
+ var HWHLP_URL = "https://api.hyperwavefi.xyz/stats/latest?asset=hwhlp_999";
20941
+ var hlp = "Wrapped HLP::WHLP";
20942
+ var hwhlp = "Hyperwave HLP::hwHLP";
20943
+ var hlpFetcher = {
20944
+ label: "HLP",
20945
+ fetch: async () => {
20946
+ const res = await fetch(HLP_URL, {
20697
20947
  method: "POST",
20698
- headers: { Accept: "application/json" },
20948
+ headers: {
20949
+ Accept: "application/json",
20950
+ "Content-Type": "application/json"
20951
+ },
20699
20952
  body: JSON.stringify({
20700
- query: "query GetAllCurrentAPYFromVault($address: String!) {\n vaultByAddress(address: $address) {\n state {\n apy\n netApy\n }\n asset {\n yield {\n apr\n }\n }\n }\n}",
20701
- variables: {
20702
- address: "0xbEeFc011e94f43b8B7b455eBaB290C7Ab4E216f1"
20953
+ type: "vaultDetails",
20954
+ vaultAddress: "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"
20955
+ })
20956
+ }).then((r) => r.json());
20957
+ let calculated;
20958
+ try {
20959
+ const p = res.portfolio[0][1];
20960
+ const val = p.accountValueHistory[p.accountValueHistory.length - 1][1];
20961
+ const pnl = p.pnlHistory[p.pnlHistory.length - 1][1];
20962
+ calculated = pnl / val * 100;
20963
+ } catch {
20964
+ calculated = (res?.apr ?? 0) * 100;
20965
+ }
20966
+ return { [hlp]: calculated };
20967
+ }
20968
+ };
20969
+ var hwhlpFetcher = {
20970
+ label: "HWHLP",
20971
+ fetch: async () => {
20972
+ const res = await fetch(HWHLP_URL, {
20973
+ method: "GET",
20974
+ headers: { Accept: "application/json" }
20975
+ }).then((r) => r.json());
20976
+ return { [hwhlp]: Number(res.data?.apr_1d ?? 0) };
20977
+ }
20978
+ };
20979
+
20980
+ // src/yields/fetchers/usdx.ts
20981
+ var SUSDX_URL = "https://app.usdx.money/v1/base/apyInfo";
20982
+ var susdx = "SUSDX";
20983
+ var susdxFetcher = {
20984
+ label: "SUSDX",
20985
+ fetch: async () => {
20986
+ const res = await fetch(SUSDX_URL).then((r) => r.json());
20987
+ return { [susdx]: apyToApr(res.result.susdxApy) * 100 };
20988
+ }
20989
+ };
20990
+
20991
+ // src/yields/fetchers/reserve.ts
20992
+ var RTOKENS_URL = "https://yields.reserve.org/pools";
20993
+ var hyUSD = "High Yield USD Base::HYUSD";
20994
+ var bsdETH = "Based ETH::BSDETH";
20995
+ var ethPlus = "ETHPlus::ETH+";
20996
+ var woEth = "Wrapped OETH::WOETH";
20997
+ var sfrxeth = "Staked Frax Ether::sfrxETH";
20998
+ var ceth = "cETH::CETH";
20999
+ var sfrax = "Staked FRAX::SFRAX";
21000
+ var usdThree = "Web 3 Dollar::USD3";
21001
+ var rtokensFetcher = {
21002
+ label: "RTOKENS",
21003
+ fetch: async () => {
21004
+ const res = await fetch(RTOKENS_URL).then((r) => r.json());
21005
+ const data = res.rtokens["8453"];
21006
+ const dataMainnet = res.rtokens["1"];
21007
+ const dataMainnetColalterals = res.collaterals["1"];
21008
+ return {
21009
+ [bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
21010
+ [hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
21011
+ [sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
21012
+ [sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
21013
+ [ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
21014
+ [ethPlus]: apyToAprPercent(dataMainnet["ETH+"] / 100) * 100,
21015
+ [usdThree]: apyToAprPercent(dataMainnet["USD3"] / 100) * 100,
21016
+ [woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100
21017
+ };
21018
+ }
21019
+ };
21020
+
21021
+ // src/yields/fetchers/hyperlend.ts
21022
+ var HYPE_URL = "https://api.hyperlend.finance/data/nativeApy";
21023
+ var wstHype = "Staked HYPE Shares::WSTHYPE";
21024
+ var kHYPE = "Kinetiq Staked HYPE::kHYPE";
21025
+ var hypeFetcher = {
21026
+ label: "HYPE",
21027
+ fetch: async () => {
21028
+ const res = await fetch(HYPE_URL).then((r) => r.json());
21029
+ return {
21030
+ [wstHype]: res.wstHYPE.latestApr,
21031
+ [kHYPE]: res.kHYPE.latestApr
21032
+ };
21033
+ }
21034
+ };
21035
+
21036
+ // src/yields/fetchers/angle.ts
21037
+ var ANGLE_URL = "https://exporter.angle.money/v2/savingsApr";
21038
+ var stUSD = "Angle Staked USDA::stUSD";
21039
+ var stEur = "Angle Staked EURA::stEUR";
21040
+ var angleFetcher = {
21041
+ label: "ANGLE",
21042
+ fetch: async () => {
21043
+ const now = Math.floor(Date.now() / 1e3);
21044
+ const nowMinusWeek = now - 7 * 24 * 3600;
21045
+ const res = await fetch(
21046
+ ANGLE_URL + `?from=${nowMinusWeek}&to=${now}`
21047
+ ).then((r) => r.json());
21048
+ return {
21049
+ [stEur]: apyToAprPercent(res.EURA) * 100,
21050
+ [stUSD]: apyToAprPercent(res.USDA) * 100
21051
+ };
21052
+ }
21053
+ };
21054
+
21055
+ // src/yields/yieldTypes.ts
21056
+ var addressToAssetYearn = {
21057
+ "0xe007ca01894c863d7898045ed5a3b4abf0b18f37": "vbETH yVault::yvvbETH",
21058
+ "0x80c34bd3a3569e126e7055831036aa7b212cb159": "vbUSDC yVault::yvvbUSDC",
21059
+ "0x9a6bd7b6fd5c4f87eb66356441502fc7dcdd185b": "vbUSDT yVault::yvvbUSDT",
21060
+ "0xaa0362ecc584b985056e47812931270b99c91f9d": "vbWBTC yVault::yvvbWBTC",
21061
+ "0x93fec6639717b6215a48e5a72a162c50dcc40d68": "vbAUSD yVault::yvvbAUSD"
21062
+ };
21063
+
21064
+ // src/yields/fetchers/yearnKatana.ts
21065
+ var YEARN_KATANA_URL = "https://katana-apr-service.vercel.app/api/vaults";
21066
+ var yearnKatanaFetcher = {
21067
+ label: "YEARN_KATANA",
21068
+ fetch: async () => {
21069
+ const res = await fetch(
21070
+ YEARN_KATANA_URL
21071
+ ).then((r) => r.json());
21072
+ let map = {};
21073
+ Object.entries(res).forEach(([addr, data]) => {
21074
+ const key = addressToAssetYearn[addr.toLowerCase()];
21075
+ if (key) {
21076
+ const apr = ((data.apr.netAPR ?? 0) + (data.apr.extra.extrinsicYield ?? 0) + (data.apr.extra.katanaNativeYield ?? 0)) * 100;
21077
+ map[key] = apr;
21078
+ }
21079
+ });
21080
+ return map;
21081
+ }
21082
+ };
21083
+
21084
+ // src/yields/fetchers/yoProtocol.ts
21085
+ var YO_URL = "https://api.yo.xyz/api/v1/vault/stats";
21086
+ var yoeth = "Yield Optimizer ETH::YOETH";
21087
+ var yobtc = "Yield Optimizer BTC::YOBTC";
21088
+ var yousd = "Yield Optimizer USD::YOUSD";
21089
+ var yoeur = "Yield Optimizer EUR::yoEUR";
21090
+ var yoFetcher = {
21091
+ label: "YO",
21092
+ fetch: async () => {
21093
+ const res = await fetch(YO_URL, {
21094
+ method: "GET",
21095
+ headers: { Accept: "application/json" }
21096
+ }).then((r) => r.json());
21097
+ const datas = res?.data;
21098
+ const yoETH = datas.find((a) => a.id === "yoETH").yield?.["1d"];
21099
+ const yoBTC = datas.find((a) => a.id === "yoBTC").yield?.["1d"];
21100
+ const yoUSD = datas.find((a) => a.id === "yoUSD").yield?.["1d"];
21101
+ const yoEUR = datas.find((a) => a.id === "yoEUR").yield?.["1d"];
21102
+ return {
21103
+ [yoeth]: apyToAprPercent(yoETH),
21104
+ [yobtc]: apyToAprPercent(yoBTC),
21105
+ [yousd]: apyToAprPercent(yoUSD),
21106
+ [yoeur]: apyToAprPercent(yoEUR)
21107
+ };
21108
+ }
21109
+ };
21110
+
21111
+ // src/yields/fetchers/gmx.ts
21112
+ var GMX_URL = "https://arbitrum-api.gmxinfra.io/apy?period=1d";
21113
+ var gmx_eth_usd = "GMX Market ETH/USD::GM [WETH-USDC]";
21114
+ var gmx_btc_usd = "GMX Market BTC/USD::GM [WBTC-USDC]";
21115
+ var glv_wbtc_usdc = "GMX Liquidity Vault [WBTC-USDC]::GLV [WBTC-USDC]";
21116
+ var glv_weth_usdc = "GMX Liquidity Vault [WETH-USDC]::GLV [WETH-USDC]";
21117
+ var gmx_eth_usd_address = "0x70d95587d40a2caf56bd97485ab3eec10bee6336";
21118
+ var gmx_btc_usd_address = "0x47c031236e19d024b42f8ae6780e44a573170703";
21119
+ var glv_wbtc_usdc_address = "0xdf03eed325b82bc1d4db8b49c30ecc9e05104b96";
21120
+ var glv_weth_usdc_address = "0x528a5bac7e746c9a509a1f4f6df58a03d44279f9";
21121
+ var gmxFetcher = {
21122
+ label: "GMX",
21123
+ fetch: async () => {
21124
+ const res = await fetch(GMX_URL, {
21125
+ method: "GET",
21126
+ headers: { Accept: "application/json" }
21127
+ }).then((r) => r.json());
21128
+ let rData = {};
21129
+ const markets = res.markets;
21130
+ Object.entries(markets).forEach(([m, d]) => {
21131
+ if (m.toLowerCase() === gmx_eth_usd_address)
21132
+ rData[gmx_eth_usd] = apyToApr(d.apy) * 100;
21133
+ if (m.toLowerCase() === gmx_btc_usd_address)
21134
+ rData[gmx_btc_usd] = apyToApr(d.apy) * 100;
21135
+ });
21136
+ const glvs = res.glvs;
21137
+ Object.entries(glvs).forEach(([m, d]) => {
21138
+ if (m.toLowerCase() === glv_wbtc_usdc_address)
21139
+ rData[glv_wbtc_usdc] = apyToApr(d.apy) * 100;
21140
+ if (m.toLowerCase() === glv_weth_usdc_address)
21141
+ rData[glv_weth_usdc] = apyToApr(d.apy) * 100;
21142
+ });
21143
+ return rData;
21144
+ }
21145
+ };
21146
+
21147
+ // src/prices/pendle/fetchPendlePrices.ts
21148
+ var PENDLE_API_BASE = "https://api-v2.pendle.finance/core";
21149
+ var MARKETS_ENDPOINT = `${PENDLE_API_BASE}/v1/markets/all`;
21150
+ var PRICES_ENDPOINT = (types) => `${PENDLE_API_BASE}/v1/prices/assets${types ? `?type=${types.join(",")}` : ""}`;
21151
+ async function fetchPendleMarkets() {
21152
+ try {
21153
+ const response = await fetch(MARKETS_ENDPOINT);
21154
+ if (!response.ok) {
21155
+ throw new Error(`Failed to fetch all markets data: ${response.status}`);
21156
+ }
21157
+ const data = await response.json();
21158
+ const marketsByChain = {};
21159
+ if (data.markets) {
21160
+ for (const market of data.markets) {
21161
+ const chainId = market.chainId.toString();
21162
+ if (!marketsByChain[chainId]) {
21163
+ marketsByChain[chainId] = [];
21164
+ }
21165
+ marketsByChain[chainId].push(market);
21166
+ }
21167
+ }
21168
+ return marketsByChain;
21169
+ } catch (error) {
21170
+ console.error("Error fetching all markets data:", error);
21171
+ return {};
21172
+ }
21173
+ }
21174
+ async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]) {
21175
+ try {
21176
+ const data = await fetchPendlePricesRaw(assetType);
21177
+ let prices = {};
21178
+ Object.entries(data).forEach(([key, val]) => {
21179
+ const [chainId, address] = key.split("-");
21180
+ const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
21181
+ prices[assetKey] = val;
21182
+ });
21183
+ return prices;
21184
+ } catch (error) {
21185
+ console.error(`Error fetching prices pendle prices:`, error);
21186
+ return {};
21187
+ }
21188
+ }
21189
+ async function fetchPendlePricesRaw(assetType = ["YT", "PT"]) {
21190
+ try {
21191
+ const response = await fetch(PRICES_ENDPOINT(assetType));
21192
+ const data = await response.json();
21193
+ return data.prices;
21194
+ } catch (error) {
21195
+ console.error(`Error fetching prices pendle prices:`, error);
21196
+ return {};
21197
+ }
21198
+ }
21199
+ async function fetchPendlePrices(lists = {}, assetType = ["YT", "PT"]) {
21200
+ try {
21201
+ const marketsResponse = await fetchPendleMarkets();
21202
+ if (!Object.keys(marketsResponse).length) {
21203
+ return {};
21204
+ }
21205
+ const allPrices = await fetchPendlePricesForAllChain(lists, assetType);
21206
+ return Object.fromEntries(
21207
+ Object.entries(allPrices).filter(([, price]) => !!price)
21208
+ );
21209
+ } catch (error) {
21210
+ console.error("Error in fetchPendlePrices:", error);
21211
+ return {};
21212
+ }
21213
+ }
21214
+ async function fetchPendleYields(lists = {}) {
21215
+ try {
21216
+ const marketsResponse = await fetchPendleMarkets();
21217
+ if (!Object.keys(marketsResponse).length) {
21218
+ return {};
21219
+ }
21220
+ const prices = await fetchPendlePricesRaw();
21221
+ let yields = {};
21222
+ const now = /* @__PURE__ */ new Date();
21223
+ Object.entries(marketsResponse).forEach(([chain, dataArr]) => {
21224
+ dataArr.forEach((market) => {
21225
+ const ptPrice = prices[market.pt];
21226
+ const ytPrice = prices[market.yt];
21227
+ if (ytPrice && ytPrice > 0) {
21228
+ const yearFraction = yearFractionToExpiry(market.expiry, now);
21229
+ const apr = ytPrice / ptPrice * 100 / yearFraction;
21230
+ const [chainId, address] = market.pt.split("-");
21231
+ const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? market.pt;
21232
+ yields[assetKey] = apr;
20703
21233
  }
20704
- })
20705
- }).then((r) => r.json());
20706
- const vba = res?.data?.vaultByAddress;
20707
- return apyToAprPercent(vba.state.apy ?? 0) * 100 + (vba?.asset?.yield.apr ?? 0) * 100;
20708
- });
20709
- const hlpPromise = safeFetch("HLP", async () => {
20710
- const res = await fetch(FeedData.HLP, {
20711
- method: "POST",
21234
+ });
21235
+ });
21236
+ return yields;
21237
+ } catch (error) {
21238
+ console.error("Error in fetchPendlePrices:", error);
21239
+ return {};
21240
+ }
21241
+ }
21242
+ function yearFractionToExpiry(expiryISO, now = /* @__PURE__ */ new Date()) {
21243
+ const expiry = new Date(expiryISO);
21244
+ const diffMs = expiry.getTime() - now.getTime();
21245
+ const yearFraction = diffMs / (1e3 * 60 * 60 * 24 * 365.25);
21246
+ return yearFraction;
21247
+ }
21248
+
21249
+ // src/yields/fetchers/pendle.ts
21250
+ var pendleFetcher = {
21251
+ label: "PENDLE",
21252
+ fetch: async () => {
21253
+ const lists = await getListsMulti([
21254
+ Chain.PLASMA_MAINNET,
21255
+ Chain.ETHEREUM_MAINNET,
21256
+ Chain.BERACHAIN,
21257
+ Chain.MANTLE,
21258
+ Chain.BASE,
21259
+ Chain.OP_MAINNET,
21260
+ Chain.ARBITRUM_ONE,
21261
+ Chain.SONIC_MAINNET,
21262
+ Chain.HYPEREVM,
21263
+ Chain.BNB_SMART_CHAIN_MAINNET
21264
+ ]);
21265
+ return fetchPendleYields(lists);
21266
+ }
21267
+ };
21268
+
21269
+ // src/yields/fetchers/usdai.ts
21270
+ var USDAI_APY_URL = "https://api.usd.ai/usdai/dashboard/current-apy";
21271
+ var usdai = "sUSDai::SUSDAI";
21272
+ var usdaiFetcher = {
21273
+ label: "USDai",
21274
+ fetch: async () => {
21275
+ const res = await fetch(USDAI_APY_URL, {
20712
21276
  headers: {
20713
- Accept: "application/json",
20714
- "Content-Type": "application/json"
20715
- // <-- required
20716
- },
20717
- body: JSON.stringify({
20718
- type: "vaultDetails",
20719
- vaultAddress: "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"
20720
- })
21277
+ origin: "https://app.usd.ai",
21278
+ referer: "https://app.usd.ai/"
21279
+ }
20721
21280
  }).then((r) => r.json());
20722
- let calculated;
20723
- try {
20724
- const p = res.portfolio[0][1];
20725
- const val = p.accountValueHistory[p.accountValueHistory.length - 1][1];
20726
- const pnl = p.pnlHistory[p.pnlHistory.length - 1][1];
20727
- calculated = pnl / val * 100;
20728
- } catch {
20729
- calculated = (res?.apr ?? 0) * 100;
20730
- }
20731
- return calculated;
20732
- });
20733
- const rtokensPromise = safeFetch("RTOKENS", async () => {
20734
- const res = await fetch(FeedData.RTOKENS).then((r) => r.json());
20735
- const data2 = res.rtokens["8453"];
20736
- const dataMainnet = res.rtokens["1"];
20737
- const dataMainnetColalterals = res.collaterals["1"];
20738
- return {
20739
- [bsdETH]: apyToAprPercent(data2.bsdETH / 100) * 100,
20740
- [hyUSD]: apyToAprPercent(data2.hyUSD / 100) * 100,
20741
- [sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
20742
- [sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
20743
- [ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
20744
- [ethPlus]: apyToAprPercent(dataMainnet["ETH+"] / 100) * 100,
20745
- [usdThree]: apyToAprPercent(dataMainnet["USD3"] / 100) * 100,
20746
- [woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100
20747
- };
20748
- });
20749
- const hypePromise = safeFetch("HYPE", async () => {
20750
- const res = await fetch(FeedData.HYPE).then((r) => r.json());
20751
- return {
20752
- [wstHype]: res.wstHYPE.latestApr,
20753
- [kHYPE]: res.kHYPE.latestApr
20754
- };
20755
- });
20756
- const anglePromise = safeFetch("ANGLE", async () => {
20757
- const now = Math.floor(Date.now() / 1e3);
20758
- const nowMinusWeek = now - 7 * 24 * 3600;
20759
- const res = await fetch(
20760
- FeedData.ANGLE + `?from=${nowMinusWeek}&to=${now}`
20761
- ).then((r) => r.json());
20762
- return {
20763
- [stEur]: apyToAprPercent(res.EURA) * 100,
20764
- [stUSD]: apyToAprPercent(res.USDA) * 100
20765
- };
20766
- });
20767
- const cbethPromise = safeFetch("CBETH", async () => {
20768
- try {
20769
- const res = await fetch(FeedData.CBETH, {
20770
- headers: {
20771
- "User-Agent": "1delta/yields",
20772
- "Content-Type": "application/json"
20773
- }
20774
- }).then((r) => r.json());
20775
- return apyToAprPercent(res.apy) * 100;
20776
- } catch (e) {
20777
- console.log("CBETH failed", e);
20778
- return 0;
20779
- }
20780
- });
20781
- const pendlePromise = getListsMulti([
20782
- Chain.PLASMA_MAINNET,
20783
- Chain.ETHEREUM_MAINNET,
20784
- Chain.BERACHAIN,
20785
- Chain.MANTLE,
20786
- Chain.BASE,
20787
- Chain.OP_MAINNET,
20788
- Chain.ARBITRUM_ONE,
20789
- Chain.SONIC_MAINNET,
20790
- Chain.HYPEREVM,
20791
- Chain.BNB_SMART_CHAIN_MAINNET
20792
- ]).then((x) => fetchPendleYields(x));
20793
- const [
20794
- wstethData,
20795
- ezethData,
20796
- rethData,
20797
- weethData,
20798
- stmaticData,
20799
- methData,
20800
- maticXdata,
20801
- susdeData,
20802
- // meridianData,
20803
- savaxData,
20804
- cbethData,
20805
- rsethData,
20806
- trumaticData,
20807
- rtokensData,
20808
- hypeData,
20809
- osEthData,
20810
- ethXData,
20811
- pufEthData,
20812
- angleData,
20813
- susdsData,
20814
- srUsdData,
20815
- yusdData,
20816
- rlpData,
20817
- wstusrData,
20818
- csusdlData,
20819
- // sdeusdData,
20820
- rswethData,
20821
- ynethxData,
20822
- ethZeroData,
20823
- usdZeroPlusData,
20824
- jitoSolData,
20825
- thBillData,
20826
- yearnKatanaData,
20827
- ssuperusdData,
20828
- hbhypeData,
20829
- pendleData,
20830
- hlpData,
20831
- yoData,
20832
- hwhlpData,
20833
- gmxData,
20834
- weethsData,
20835
- hbuhypeData,
20836
- susdxData
20837
- ] = await Promise.all([
21281
+ return { [usdai]: apyToAprPercent(Number(res.result)) };
21282
+ }
21283
+ };
21284
+
21285
+ // src/yields/fetchGeneralYields.ts
21286
+ var fetchGeneralYields = async () => {
21287
+ const wstethPromise = safeFetch(wstethFetcher.label, wstethFetcher.fetch);
21288
+ const weethFetcher = createWeethFetcher(wstethPromise);
21289
+ const fetchers = [
21290
+ weethFetcher,
21291
+ stmaticFetcher,
21292
+ ezethFetcher,
21293
+ rethFetcher,
21294
+ methFetcher,
21295
+ susdeFetcher,
21296
+ maticxFetcher,
21297
+ ethxFetcher,
21298
+ savaxFetcher,
21299
+ cbethFetcher,
21300
+ rsethFetcher,
21301
+ trumaticFetcher,
21302
+ osethFetcher,
21303
+ ynethxFetcher,
21304
+ pufethFetcher,
21305
+ susdsFetcher,
21306
+ srusdFetcher,
21307
+ yusdFetcher,
21308
+ rlpFetcher,
21309
+ wstusrFetcher,
21310
+ csusdlFetcher,
21311
+ rswethFetcher,
21312
+ usdZeroPlusFetcher,
21313
+ ethZeroFetcher,
21314
+ jitoSolFetcher,
21315
+ thbillFetcher,
21316
+ ssuperusdFetcher,
21317
+ hbhypeFetcher,
21318
+ hbuhypeFetcher,
21319
+ hlpFetcher,
21320
+ hwhlpFetcher,
21321
+ weethsFetcher,
21322
+ susdxFetcher,
21323
+ rtokensFetcher,
21324
+ hypeFetcher,
21325
+ angleFetcher,
21326
+ yearnKatanaFetcher,
21327
+ yoFetcher,
21328
+ gmxFetcher,
21329
+ pendleFetcher,
21330
+ usdaiFetcher
21331
+ ];
21332
+ const [wstethData, ...results] = await Promise.all([
20838
21333
  wstethPromise,
20839
- ezethPromise,
20840
- rethPromise,
20841
- weethPromise,
20842
- stmaticPromise,
20843
- methPromise,
20844
- maticxPromise,
20845
- susdePromise,
20846
- // meridianPromise,
20847
- savaxPromise,
20848
- cbethPromise,
20849
- rsethPromise,
20850
- trumaticPromise,
20851
- rtokensPromise,
20852
- hypePromise,
20853
- osEthPromise,
20854
- ethxPromise,
20855
- pufEthPromise,
20856
- anglePromise,
20857
- susdsPromise,
20858
- srusdPromise,
20859
- yusdPromise,
20860
- rlpPromise,
20861
- wstusrPromise,
20862
- csusdlPromise,
20863
- // sdeusdPromise,
20864
- rswethPromise,
20865
- ynethxPromise,
20866
- ethZeroPromise,
20867
- usdZeroPlusPromise,
20868
- jitoSolPromise,
20869
- thbillPromise,
20870
- yearnKatanaPromise,
20871
- ssuperusdPromise,
20872
- hbhypePromise,
20873
- pendlePromise,
20874
- hlpPromise,
20875
- yoPromise,
20876
- hwhlpPromise,
20877
- gmxPromise,
20878
- weethsPromise,
20879
- hbuhypePromise,
20880
- susdxPromise
21334
+ ...fetchers.map((f) => safeFetch(f.label, f.fetch))
20881
21335
  ]);
20882
- const data = {
20883
- intrinsicYields: {
20884
- MATICX: maticXdata,
20885
- METH: methData,
20886
- CMETH: methData,
20887
- WSTETH: wstethData,
20888
- EZETH: ezethData,
20889
- RETH: rethData,
20890
- WEETH: weethData,
20891
- STMATIC: stmaticData,
20892
- USDY: 4.35,
20893
- SUSDE: susdeData,
20894
- SAVAX: savaxData,
20895
- CBETH: cbethData,
20896
- RSETH: rsethData,
20897
- TRUMATIC: trumaticData,
20898
- [sUsds]: susdsData,
20899
- [ethZero]: ethZeroData,
20900
- [usdZeroPlus]: usdZeroPlusData,
20901
- [csusdl]: csusdlData,
20902
- [srUsd]: srUsdData,
20903
- [wsrusd]: srUsdData,
20904
- // [sdeusd]: sdeusdData,
20905
- [wstusr]: wstusrData,
20906
- [yusd]: yusdData,
20907
- [rlp]: rlpData,
20908
- [rsweth]: rswethData,
20909
- [osETH]: osEthData,
20910
- [ethX]: ethXData,
20911
- [ynethx]: ynethxData,
20912
- [tETH]: wstethData,
20913
- [pufEth]: pufEthData,
20914
- [jitoSol]: jitoSolData,
20915
- [thBill]: thBillData,
20916
- [ssuperusd]: ssuperusdData,
20917
- [hbhype]: hbhypeData,
20918
- [hlp]: hlpData,
20919
- [hwhlp]: hwhlpData,
20920
- [weeths]: weethsData,
20921
- [hbuhype]: hbuhypeData,
20922
- [susdx]: susdxData,
20923
- ...rtokensData,
20924
- ...hypeData,
20925
- ...angleData,
20926
- ...yearnKatanaData,
20927
- ...pendleData,
20928
- ...yoData,
20929
- ...gmxData
20930
- },
20931
- lenderRewards: {
20932
- // '167000': {
20933
- // MERIDIAN: meridianData,
20934
- // },
20935
- }
21336
+ const intrinsicYields = {
21337
+ USDY: 4.35
21338
+ };
21339
+ if (wstethData) Object.assign(intrinsicYields, wstethData);
21340
+ for (const result of results) {
21341
+ if (result) Object.assign(intrinsicYields, result);
21342
+ }
21343
+ return {
21344
+ intrinsicYields,
21345
+ lenderRewards: {}
20936
21346
  };
20937
- return data;
20938
21347
  };
20939
21348
 
20940
21349
  // src/prices/defillama/index.ts
@@ -23695,14 +24104,20 @@ var AAVE_LENDER_OVERRIDES = {
23695
24104
  // BASE_CURRENCY_UNIT call reverts, oracle returns 18 decimals (USD denominated)
23696
24105
  baseCurrencyUnit: 1000000000000000000n
23697
24106
  }
24107
+ },
24108
+ [Lender.MOLEND]: {
24109
+ [Chain.MODE]: {
24110
+ // BASE_CURRENCY_UNIT call reverts, oracle returns 18 decimals (USD denominated)
24111
+ baseCurrencyUnit: 100000000n
24112
+ }
23698
24113
  }
23699
24114
  };
23700
24115
  function getAaveLendersForChain(chainId) {
23701
24116
  const oracles = aaveOracles() ?? {};
23702
24117
  const reserves = aaveReserves() ?? {};
23703
24118
  const lenders = [];
23704
- for (const [lender, chains2] of Object.entries(oracles)) {
23705
- if (chains2[chainId] && reserves[lender]?.[chainId]?.length > 0) {
24119
+ for (const [lender, chains] of Object.entries(oracles)) {
24120
+ if (chains[chainId] && reserves[lender]?.[chainId]?.length > 0) {
23706
24121
  lenders.push(lender);
23707
24122
  }
23708
24123
  }
@@ -23752,13 +24167,9 @@ function parseAaveResults2(data, meta, context) {
23752
24167
  const { chainId, usdPrices, tokenList } = context;
23753
24168
  const entries = [];
23754
24169
  if (data.length === 0) return entries;
23755
- let baseCurrencyUnitValue = data[meta.baseCurrencyUnitIndex];
24170
+ let baseCurrencyUnitValue = meta.baseCurrencyUnitOverride ?? data[meta.baseCurrencyUnitIndex];
23756
24171
  if (!baseCurrencyUnitValue || baseCurrencyUnitValue === "0x") {
23757
- if (meta.baseCurrencyUnitOverride) {
23758
- baseCurrencyUnitValue = meta.baseCurrencyUnitOverride;
23759
- } else {
23760
- return entries;
23761
- }
24172
+ return entries;
23762
24173
  }
23763
24174
  let decimals;
23764
24175
  try {
@@ -23788,7 +24199,8 @@ function parseAaveResults2(data, meta, context) {
23788
24199
  asset: asset.toLowerCase(),
23789
24200
  price: rawPriceNum,
23790
24201
  // Raw price (in base asset terms)
23791
- priceUSD
24202
+ priceUSD,
24203
+ marketUid: createMarketUid(chainId, meta.fork, asset)
23792
24204
  });
23793
24205
  } catch {
23794
24206
  continue;
@@ -23804,59 +24216,45 @@ var aaveFetcher = {
23804
24216
  parse: parseAaveResults2,
23805
24217
  getAbi: getAaveAbi
23806
24218
  };
23807
- function generateMarketId(oracle) {
23808
- return oracle.replace(/^0x/i, "").toUpperCase();
24219
+ function generateMarketId(oracle, loanAsset, collateralAsset) {
24220
+ return `${oracle}${loanAsset}${collateralAsset}`.replace(/0x/gi, "").toUpperCase();
23809
24221
  }
23810
24222
  function generateMorphoLenderKey(marketId) {
23811
24223
  return `${Lender.MORPHO_BLUE}_${marketId}`;
23812
24224
  }
23813
24225
  function getMorphoMarketsForChain(chainId, marketOverrides) {
23814
- const oracles = morphoTypeOracles() ?? {};
23815
- const chainOracles = oracles[chainId] ?? {};
23816
- const queries = [];
23817
- for (const [fork, markets] of Object.entries(chainOracles)) {
23818
- if (fork !== Lender.MORPHO_BLUE) continue;
23819
- for (const market of markets) {
23820
- const marketId = generateMarketId(market.oracle);
23821
- queries.push({
23822
- oracle: market.oracle,
23823
- loanAsset: market.loanAsset,
23824
- collateralAsset: market.collateralAsset,
23825
- loanAssetDecimals: market.loanAssetDecimals,
23826
- collateralAssetDecimals: market.collateralAssetDecimals,
23827
- fork,
23828
- marketId
23829
- });
23830
- }
23831
- }
23832
24226
  const chainOverrides = marketOverrides?.[chainId] ?? [];
23833
- for (const override of chainOverrides) {
23834
- const marketId = override.marketId ?? generateMarketId(override.oracle);
23835
- queries.push({
23836
- oracle: override.oracle,
23837
- loanAsset: override.loanAsset,
23838
- collateralAsset: override.collateralAsset,
23839
- loanAssetDecimals: override.loanAssetDecimals,
23840
- collateralAssetDecimals: override.collateralAssetDecimals,
23841
- fork: Lender.MORPHO_BLUE,
23842
- marketId
23843
- });
23844
- }
23845
- return queries;
24227
+ return chainOverrides.map((override) => ({
24228
+ oracle: override.oracle,
24229
+ loanAsset: override.loanAsset,
24230
+ collateralAsset: override.collateralAsset,
24231
+ loanAssetDecimals: override.loanAssetDecimals,
24232
+ collateralAssetDecimals: override.collateralAssetDecimals,
24233
+ fork: Lender.MORPHO_BLUE,
24234
+ marketId: override.marketId ?? generateMarketId(override.oracle, override.loanAsset, override.collateralAsset)
24235
+ }));
23846
24236
  }
23847
24237
  function getMorphoCalls2(chainId, context) {
23848
24238
  const queries = getMorphoMarketsForChain(chainId, context?.marketOverrides);
23849
24239
  if (queries.length === 0) return [];
23850
- return queries.map((query2) => {
24240
+ const oracleGroups = /* @__PURE__ */ new Map();
24241
+ for (const query2 of queries) {
24242
+ const oracleLc = query2.oracle.toLowerCase();
24243
+ if (!oracleGroups.has(oracleLc)) {
24244
+ oracleGroups.set(oracleLc, []);
24245
+ }
24246
+ oracleGroups.get(oracleLc).push(query2);
24247
+ }
24248
+ return Array.from(oracleGroups.values()).map((markets) => {
23851
24249
  const call = {
23852
- address: query2.oracle,
24250
+ address: markets[0].oracle,
23853
24251
  name: "price",
23854
24252
  params: []
23855
24253
  };
23856
24254
  return {
23857
24255
  calls: [call],
23858
- meta: query2,
23859
- lender: generateMorphoLenderKey(query2.marketId)
24256
+ meta: { markets },
24257
+ lender: generateMorphoLenderKey(markets[0].marketId)
23860
24258
  };
23861
24259
  });
23862
24260
  }
@@ -23865,37 +24263,44 @@ function parseMorphoResults2(data, meta, context) {
23865
24263
  const entries = [];
23866
24264
  const rawPrice = data[0];
23867
24265
  if (!rawPrice || rawPrice === void 0 || rawPrice === "0x") return entries;
23868
- const loanAsset = meta.loanAsset.toLowerCase();
23869
- const collateralAsset = meta.collateralAsset.toLowerCase();
23870
- const loanAssetDecimals = meta.loanAssetDecimals ?? tokenList?.[loanAsset]?.decimals ?? 18;
23871
- const collateralAssetDecimals = meta.collateralAssetDecimals ?? tokenList?.[collateralAsset]?.decimals ?? 18;
23872
- const priceDebtToCollateral = formatMorphoPrice(
23873
- rawPrice.toString(),
23874
- loanAssetDecimals,
23875
- collateralAssetDecimals
23876
- );
23877
- if (isNaN(priceDebtToCollateral) || priceDebtToCollateral === 0) return entries;
23878
- const loanOracleKey = tokenList?.[loanAsset]?.assetGroup ?? `${chainId}-${loanAsset}`;
23879
- const collateralOracleKey = tokenList?.[collateralAsset]?.assetGroup ?? `${chainId}-${collateralAsset}`;
23880
- const loanAssetUSD = usdPrices[loanOracleKey] ?? usdPrices[loanAsset];
23881
- const collateralAssetUSD = usdPrices[collateralOracleKey] ?? usdPrices[collateralAsset];
23882
- if (loanAssetUSD) {
23883
- const collateralPriceUSD = priceDebtToCollateral * loanAssetUSD;
23884
- entries.push({
23885
- asset: collateralAsset,
23886
- price: priceDebtToCollateral,
23887
- // Raw: collateral price in loan asset terms
23888
- priceUSD: collateralPriceUSD
23889
- });
23890
- }
23891
- if (collateralAssetUSD) {
23892
- const loanPriceUSD = collateralAssetUSD / priceDebtToCollateral;
23893
- entries.push({
23894
- asset: loanAsset,
23895
- price: 1 / priceDebtToCollateral,
23896
- // Raw: loan price in collateral terms
23897
- priceUSD: loanPriceUSD
23898
- });
24266
+ for (const market of meta.markets) {
24267
+ const loanAsset = market.loanAsset.toLowerCase();
24268
+ const collateralAsset = market.collateralAsset.toLowerCase();
24269
+ const loanAssetDecimals = market.loanAssetDecimals ?? tokenList?.[loanAsset]?.decimals ?? 18;
24270
+ const collateralAssetDecimals = market.collateralAssetDecimals ?? tokenList?.[collateralAsset]?.decimals ?? 18;
24271
+ const priceDebtToCollateral = formatMorphoPrice(
24272
+ rawPrice.toString(),
24273
+ loanAssetDecimals,
24274
+ collateralAssetDecimals
24275
+ );
24276
+ if (isNaN(priceDebtToCollateral) || priceDebtToCollateral === 0) continue;
24277
+ const loanOracleKey = tokenList?.[loanAsset]?.assetGroup ?? `${chainId}-${loanAsset}`;
24278
+ const collateralOracleKey = tokenList?.[collateralAsset]?.assetGroup ?? `${chainId}-${collateralAsset}`;
24279
+ const loanAssetUSD = usdPrices[loanOracleKey] ?? usdPrices[loanAsset];
24280
+ const collateralAssetUSD = usdPrices[collateralOracleKey] ?? usdPrices[collateralAsset];
24281
+ const lenderKey = generateMorphoLenderKey(market.marketId);
24282
+ if (loanAssetUSD) {
24283
+ const collateralPriceUSD = priceDebtToCollateral * loanAssetUSD;
24284
+ entries.push({
24285
+ asset: collateralAsset,
24286
+ price: priceDebtToCollateral,
24287
+ // Raw: collateral price in loan asset terms
24288
+ priceUSD: collateralPriceUSD,
24289
+ marketUid: createMarketUid(chainId, lenderKey, collateralAsset),
24290
+ targetLender: lenderKey
24291
+ });
24292
+ }
24293
+ if (collateralAssetUSD) {
24294
+ const loanPriceUSD = collateralAssetUSD / priceDebtToCollateral;
24295
+ entries.push({
24296
+ asset: loanAsset,
24297
+ price: 1 / priceDebtToCollateral,
24298
+ // Raw: loan price in collateral terms
24299
+ priceUSD: loanPriceUSD,
24300
+ marketUid: createMarketUid(chainId, lenderKey, loanAsset),
24301
+ targetLender: lenderKey
24302
+ });
24303
+ }
23899
24304
  }
23900
24305
  return entries;
23901
24306
  }
@@ -23907,8 +24312,9 @@ var morphoFetcher = {
23907
24312
  parse: parseMorphoResults2,
23908
24313
  getAbi: getMorphoAbi
23909
24314
  };
23910
-
23911
- // src/prices/oracle-prices/fetchers/compoundV2.ts
24315
+ var SCALING_DECIMALS_OVERRIDES = {
24316
+ [Lender.SUMER]: 18
24317
+ };
23912
24318
  var CompoundV2OracleAbi = [
23913
24319
  {
23914
24320
  inputs: [{ internalType: "address", name: "cToken", type: "address" }],
@@ -23959,14 +24365,15 @@ function parseCompoundV2Results2(data, meta, context) {
23959
24365
  try {
23960
24366
  const underlyingLc = queryMeta.underlying.toLowerCase();
23961
24367
  const underlyingDecimals = tokenList?.[underlyingLc]?.decimals ?? 18;
23962
- const scalingDecimals = 36 - underlyingDecimals;
24368
+ const scalingDecimals = SCALING_DECIMALS_OVERRIDES[queryMeta.lender] ?? 36 - underlyingDecimals;
23963
24369
  const priceUSD = Number(formatUnits(BigInt(rawResult.toString()), scalingDecimals));
23964
24370
  if (isNaN(priceUSD) || priceUSD === 0) return;
23965
24371
  entries.push({
23966
24372
  asset: underlyingLc,
23967
24373
  price: priceUSD,
23968
24374
  // For Compound V2, raw price is already USD denominated
23969
- priceUSD
24375
+ priceUSD,
24376
+ marketUid: createMarketUid(context.chainId, queryMeta.lender, queryMeta.cToken)
23970
24377
  });
23971
24378
  } catch {
23972
24379
  }
@@ -23981,8 +24388,6 @@ var compoundV2Fetcher = {
23981
24388
  parse: parseCompoundV2Results2,
23982
24389
  getAbi: getCompoundV2Abi
23983
24390
  };
23984
-
23985
- // src/prices/oracle-prices/fetchers/compoundV3.ts
23986
24391
  var ChainlinkAggregatorAbi = [
23987
24392
  {
23988
24393
  inputs: [],
@@ -24000,6 +24405,12 @@ var ChainlinkAggregatorAbi = [
24000
24405
  ];
24001
24406
  var ANSWER_INDEX = 1;
24002
24407
  var CHAINLINK_DECIMALS = 8;
24408
+ var USD_PRICED_OVERRIDES = {
24409
+ [Lender.COMPOUND_V3_AERO]: /* @__PURE__ */ new Set(["8453"]),
24410
+ // BASE - prices already in USD
24411
+ [Lender.COMPOUND_V3_USDBC]: /* @__PURE__ */ new Set(["8453"])
24412
+ // BASE - prices already in USD
24413
+ };
24003
24414
  function getCompoundV3Calls(chainId) {
24004
24415
  const oracles = compoundV3Oracles() ?? {};
24005
24416
  const baseData = compoundV3BaseData() ?? {};
@@ -24007,7 +24418,8 @@ function getCompoundV3Calls(chainId) {
24007
24418
  for (const [lender, chainOracles] of Object.entries(oracles)) {
24008
24419
  const assetOracles = chainOracles[chainId];
24009
24420
  if (!assetOracles) continue;
24010
- const baseAsset = baseData[lender]?.[chainId]?.baseAsset?.toLowerCase();
24421
+ const skipBaseScaling = USD_PRICED_OVERRIDES[lender]?.has(chainId);
24422
+ const baseAsset = skipBaseScaling ? void 0 : baseData[lender]?.[chainId]?.baseAsset?.toLowerCase();
24011
24423
  const calls = [];
24012
24424
  const meta = [];
24013
24425
  for (const [asset, oracleAddress] of Object.entries(assetOracles)) {
@@ -24019,7 +24431,8 @@ function getCompoundV3Calls(chainId) {
24019
24431
  meta.push({
24020
24432
  asset,
24021
24433
  oracle: oracleAddress,
24022
- baseAsset
24434
+ baseAsset,
24435
+ lender
24023
24436
  });
24024
24437
  }
24025
24438
  if (calls.length > 0) {
@@ -24041,7 +24454,9 @@ function parseCompoundV3Results(data, meta, context) {
24041
24454
  try {
24042
24455
  const answer = Array.isArray(rawResult) ? rawResult[ANSWER_INDEX] : rawResult;
24043
24456
  if (!answer) return;
24044
- const rawPrice = Number(formatUnits(BigInt(answer.toString()), CHAINLINK_DECIMALS));
24457
+ const rawPrice = Number(
24458
+ formatUnits(BigInt(answer.toString()), CHAINLINK_DECIMALS)
24459
+ );
24045
24460
  if (isNaN(rawPrice) || rawPrice === 0) return;
24046
24461
  const assetLc = queryMeta.asset.toLowerCase();
24047
24462
  let priceUSD = rawPrice;
@@ -24057,7 +24472,8 @@ function parseCompoundV3Results(data, meta, context) {
24057
24472
  asset: assetLc,
24058
24473
  price: rawPrice,
24059
24474
  // Raw price (in base asset terms if applicable)
24060
- priceUSD
24475
+ priceUSD,
24476
+ marketUid: createMarketUid(chainId, queryMeta.lender, queryMeta.asset)
24061
24477
  });
24062
24478
  } catch {
24063
24479
  }
@@ -24073,103 +24489,84 @@ var compoundV3Fetcher = {
24073
24489
  getAbi: getCompoundV3Abi
24074
24490
  };
24075
24491
  var LISTA_DECIMALS = 8;
24076
- function generateMarketId2(oracle) {
24077
- return oracle.replace(/^0x/i, "").toUpperCase();
24492
+ function generateMarketId2(oracle, loanAsset, collateralAsset) {
24493
+ return `${oracle}${loanAsset}${collateralAsset}`.replace(/0x/gi, "").toUpperCase();
24078
24494
  }
24079
24495
  function generateListaLenderKey(marketId) {
24080
24496
  return `${Lender.LISTA_DAO}_${marketId}`;
24081
24497
  }
24082
24498
  function getListaMarketsForChain(chainId, marketOverrides) {
24083
- const oracles = morphoTypeOracles() ?? {};
24084
- const chainOracles = oracles[chainId] ?? {};
24085
- const markets = [];
24086
- const processedMarketIds = /* @__PURE__ */ new Set();
24087
- for (const [fork, marketList] of Object.entries(chainOracles)) {
24088
- if (fork !== Lender.LISTA_DAO) continue;
24089
- for (const market of marketList) {
24090
- const marketId = generateMarketId2(market.oracle);
24091
- if (processedMarketIds.has(marketId)) continue;
24092
- processedMarketIds.add(marketId);
24093
- markets.push({
24094
- oracle: market.oracle,
24095
- collateralAsset: market.collateralAsset,
24096
- loanAsset: market.loanAsset,
24097
- marketId
24098
- });
24099
- }
24100
- }
24101
24499
  const chainOverrides = marketOverrides?.[chainId] ?? [];
24102
- for (const override of chainOverrides) {
24103
- const marketId = override.marketId ?? generateMarketId2(override.oracle);
24104
- if (processedMarketIds.has(marketId)) continue;
24105
- processedMarketIds.add(marketId);
24106
- markets.push({
24107
- oracle: override.oracle,
24108
- collateralAsset: override.collateralAsset,
24109
- loanAsset: override.loanAsset,
24110
- marketId
24111
- });
24112
- }
24113
- return markets;
24500
+ return chainOverrides.map((override) => ({
24501
+ oracle: override.oracle,
24502
+ collateralAsset: override.collateralAsset,
24503
+ loanAsset: override.loanAsset,
24504
+ marketId: override.marketId ?? generateMarketId2(override.oracle, override.loanAsset, override.collateralAsset)
24505
+ }));
24114
24506
  }
24115
24507
  function getListaCalls(chainId, context) {
24116
24508
  const markets = getListaMarketsForChain(chainId, context?.marketOverrides);
24117
24509
  if (markets.length === 0) return [];
24118
- return markets.map((market) => {
24119
- const calls = [
24120
- // Call for collateral asset
24121
- {
24510
+ const calls = [];
24511
+ const callIndexMap = {};
24512
+ for (const market of markets) {
24513
+ const oracleLc = market.oracle.toLowerCase();
24514
+ const collateralKey = `${oracleLc}:${market.collateralAsset.toLowerCase()}`;
24515
+ if (!(collateralKey in callIndexMap)) {
24516
+ callIndexMap[collateralKey] = calls.length;
24517
+ calls.push({
24122
24518
  address: market.oracle,
24123
24519
  name: "peek",
24124
24520
  params: [market.collateralAsset]
24125
- },
24126
- // Call for loan asset
24127
- {
24521
+ });
24522
+ }
24523
+ const loanKey = `${oracleLc}:${market.loanAsset.toLowerCase()}`;
24524
+ if (!(loanKey in callIndexMap)) {
24525
+ callIndexMap[loanKey] = calls.length;
24526
+ calls.push({
24128
24527
  address: market.oracle,
24129
24528
  name: "peek",
24130
24529
  params: [market.loanAsset]
24131
- }
24132
- ];
24133
- const meta = [
24134
- {
24135
- oracle: market.oracle,
24136
- asset: market.collateralAsset,
24137
- marketId: market.marketId
24138
- },
24139
- {
24140
- oracle: market.oracle,
24141
- asset: market.loanAsset,
24142
- marketId: market.marketId
24143
- }
24144
- ];
24145
- return {
24146
- calls,
24147
- meta,
24148
- lender: generateListaLenderKey(market.marketId)
24149
- };
24150
- });
24530
+ });
24531
+ }
24532
+ }
24533
+ return [{
24534
+ calls,
24535
+ meta: { callIndexMap, markets },
24536
+ lender: generateListaLenderKey(markets[0].marketId)
24537
+ }];
24151
24538
  }
24152
- function parseListaResults2(data, meta, _context) {
24539
+ function parseListaResults2(data, meta, context) {
24153
24540
  const entries = [];
24154
- const processedAssets = /* @__PURE__ */ new Set();
24155
- data.forEach((rawPrice, index) => {
24156
- const query2 = meta[index];
24157
- if (!query2 || rawPrice === void 0 || rawPrice === "0x") return;
24158
- const asset = query2.asset.toLowerCase();
24159
- if (processedAssets.has(asset)) return;
24160
- try {
24161
- const priceUSD = Number(formatUnits(BigInt(rawPrice.toString()), LISTA_DECIMALS));
24162
- if (isNaN(priceUSD) || priceUSD === 0) return;
24163
- entries.push({
24164
- asset,
24165
- price: priceUSD,
24166
- // Raw price is already in USD
24167
- priceUSD
24168
- });
24169
- processedAssets.add(asset);
24170
- } catch {
24541
+ for (const market of meta.markets) {
24542
+ const oracleLc = market.oracle.toLowerCase();
24543
+ const lenderKey = generateListaLenderKey(market.marketId);
24544
+ const processedAssets = /* @__PURE__ */ new Set();
24545
+ const assets = [market.collateralAsset, market.loanAsset];
24546
+ for (const assetRaw of assets) {
24547
+ const asset = assetRaw.toLowerCase();
24548
+ if (processedAssets.has(asset)) continue;
24549
+ const callKey = `${oracleLc}:${asset}`;
24550
+ const callIndex = meta.callIndexMap[callKey];
24551
+ if (callIndex === void 0) continue;
24552
+ const rawPrice = data[callIndex];
24553
+ if (rawPrice === void 0 || rawPrice === "0x") continue;
24554
+ try {
24555
+ const priceUSD = Number(formatUnits(BigInt(rawPrice.toString()), LISTA_DECIMALS));
24556
+ if (isNaN(priceUSD) || priceUSD === 0) continue;
24557
+ entries.push({
24558
+ asset,
24559
+ price: priceUSD,
24560
+ // Raw price is already in USD
24561
+ priceUSD,
24562
+ marketUid: createMarketUid(context.chainId, lenderKey, asset),
24563
+ targetLender: lenderKey
24564
+ });
24565
+ processedAssets.add(asset);
24566
+ } catch {
24567
+ }
24171
24568
  }
24172
- });
24569
+ }
24173
24570
  return entries;
24174
24571
  }
24175
24572
  function getListaAbi() {
@@ -24268,7 +24665,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
24268
24665
  rpcOverrides
24269
24666
  );
24270
24667
  const usdPrices = { ...basePrices };
24271
- const parseTracker = (tracker) => {
24668
+ const parseTracker = (tracker, updatePrices = true) => {
24272
24669
  const dataSlice = multicallResult.slice(
24273
24670
  tracker.offset,
24274
24671
  tracker.offset + tracker.count
@@ -24279,14 +24676,17 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
24279
24676
  tokenList
24280
24677
  };
24281
24678
  const entries = tracker.parse(dataSlice, tracker.meta, context);
24282
- if (!chainResult[tracker.lender]) {
24283
- chainResult[tracker.lender] = [];
24284
- }
24285
- chainResult[tracker.lender].push(...entries);
24286
24679
  for (const entry of entries) {
24287
- const oracleKey = tokenList[entry.asset]?.assetGroup ?? `${chainId}-${entry.asset}`;
24288
- usdPrices[oracleKey] = entry.priceUSD;
24289
- usdPrices[entry.asset] = entry.priceUSD;
24680
+ const lender = entry.targetLender ?? tracker.lender;
24681
+ if (!chainResult[lender]) {
24682
+ chainResult[lender] = [];
24683
+ }
24684
+ chainResult[lender].push(entry);
24685
+ if (updatePrices) {
24686
+ const oracleKey = tokenList[entry.asset]?.assetGroup ?? `${chainId}-${entry.asset}`;
24687
+ usdPrices[oracleKey] = entry.priceUSD;
24688
+ usdPrices[entry.asset] = entry.priceUSD;
24689
+ }
24290
24690
  }
24291
24691
  };
24292
24692
  const nonMorphoTrackers = fetcherTracker.filter(
@@ -24314,7 +24714,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
24314
24714
  (t) => t.parse === morphoFetcher.parse
24315
24715
  );
24316
24716
  for (const tracker of morphoTrackers) {
24317
- parseTracker(tracker);
24717
+ parseTracker(tracker, false);
24318
24718
  }
24319
24719
  return { chainId, data: chainResult };
24320
24720
  });
@@ -24834,7 +25234,237 @@ function parseMulticallRpcResponses(responses, batches, allowFailure = true) {
24834
25234
  });
24835
25235
  return allResults;
24836
25236
  }
25237
+ var ERC20MetadataAbi = [
25238
+ {
25239
+ inputs: [],
25240
+ name: "name",
25241
+ outputs: [{ internalType: "string", name: "", type: "string" }],
25242
+ stateMutability: "view",
25243
+ type: "function"
25244
+ },
25245
+ {
25246
+ inputs: [],
25247
+ name: "symbol",
25248
+ outputs: [{ internalType: "string", name: "", type: "string" }],
25249
+ stateMutability: "view",
25250
+ type: "function"
25251
+ },
25252
+ {
25253
+ inputs: [],
25254
+ name: "decimals",
25255
+ outputs: [{ internalType: "uint8", name: "", type: "uint8" }],
25256
+ stateMutability: "view",
25257
+ type: "function"
25258
+ }
25259
+ ];
25260
+ async function fetchTokenMetadata(chain, addrs) {
25261
+ const tokens = {};
25262
+ const client = getEvmClient(chain);
25263
+ const results = await client.multicall({
25264
+ allowFailure: false,
25265
+ batchSize: 300,
25266
+ contracts: addrs.map((addr) => [
25267
+ {
25268
+ abi: ERC20MetadataAbi,
25269
+ functionName: "name",
25270
+ address: addr,
25271
+ args: []
25272
+ },
25273
+ {
25274
+ abi: ERC20MetadataAbi,
25275
+ functionName: "symbol",
25276
+ address: addr,
25277
+ args: []
25278
+ },
25279
+ {
25280
+ abi: ERC20MetadataAbi,
25281
+ functionName: "decimals",
25282
+ address: addr,
25283
+ args: []
25284
+ }
25285
+ ]).flat()
25286
+ });
25287
+ addrs.forEach((addr, i) => {
25288
+ const name = results[i * 3];
25289
+ const symbol = results[i * 3 + 1];
25290
+ const decimals = results[i * 3 + 2];
25291
+ const address = addr.toLowerCase();
25292
+ tokens[address] = {
25293
+ chainId: String(chain),
25294
+ decimals,
25295
+ name,
25296
+ address,
25297
+ symbol,
25298
+ assetGroup: `${symbol}::${name}`,
25299
+ currencyId: `${symbol}::${name}`
25300
+ };
25301
+ });
25302
+ return tokens;
25303
+ }
25304
+ var BALANCE_FETCHER = "0x60134ad7491101c7fcb343ed8c7599e449430766";
25305
+ var BALANCE_FETCHER_SELECTOR = "0x30fb0985";
25306
+ function encodeBalanceFetcherCalldata(accounts, tokens) {
25307
+ if (accounts.length < 1 || tokens.length < 1) {
25308
+ return "0x";
25309
+ }
25310
+ const normalizedAccounts = accounts.map((a) => a.toLowerCase());
25311
+ const normalizedTokens = tokens.map((t) => t.toLowerCase());
25312
+ const header = encodePacked(
25313
+ ["uint16", "uint16"],
25314
+ [normalizedTokens.length, normalizedAccounts.length]
25315
+ );
25316
+ const accountsEncoded = encodePacked(
25317
+ normalizedAccounts.map(() => "address"),
25318
+ normalizedAccounts
25319
+ ).slice(2);
25320
+ const tokensEncoded = encodePacked(
25321
+ normalizedTokens.map(() => "address"),
25322
+ normalizedTokens
25323
+ ).slice(2);
25324
+ return header + accountsEncoded + tokensEncoded;
25325
+ }
25326
+ function decodeAbiEncodedBytes(hexData) {
25327
+ const data = hexData.startsWith("0x") ? hexData.slice(2) : hexData;
25328
+ const lengthHex = data.slice(64, 128);
25329
+ const length = parseInt(lengthHex, 16);
25330
+ const actualData = data.slice(128, 128 + length * 2);
25331
+ return actualData;
25332
+ }
25333
+ function parseBalanceFetcherResult(hexData, users, tokens) {
25334
+ let data = hexData.startsWith("0x") ? hexData.slice(2) : hexData;
25335
+ if (data.length > 128 && data.slice(0, 64) === "0000000000000000000000000000000000000000000000000000000000000020") {
25336
+ data = decodeAbiEncodedBytes(data);
25337
+ }
25338
+ let offset = 0;
25339
+ const blockNumberHex = data.slice(offset, offset + 16);
25340
+ const blockNumber = BigInt("0x" + blockNumberHex);
25341
+ offset += 16;
25342
+ const results = [];
25343
+ while (offset < data.length) {
25344
+ if (offset + 8 > data.length) break;
25345
+ const userIndexHex = data.slice(offset, offset + 4);
25346
+ const userIndex = parseInt(userIndexHex, 16);
25347
+ offset += 4;
25348
+ const countHex = data.slice(offset, offset + 4);
25349
+ const count = parseInt(countHex, 16);
25350
+ offset += 4;
25351
+ const balances = {};
25352
+ for (let i = 0; i < count; i++) {
25353
+ if (offset + 32 > data.length) break;
25354
+ const tokenIndexHex = data.slice(offset, offset + 4);
25355
+ const tokenIndex = parseInt(tokenIndexHex, 16);
25356
+ offset += 4;
25357
+ const balanceHex = data.slice(offset, offset + 28);
25358
+ const balance = balanceHex ? BigInt("0x" + balanceHex) : 0n;
25359
+ offset += 28;
25360
+ const tokenAddress = tokens[tokenIndex];
25361
+ if (tokenAddress) {
25362
+ balances[tokenAddress] = {
25363
+ tokenIndex,
25364
+ tokenAddress,
25365
+ balance
25366
+ };
25367
+ }
25368
+ }
25369
+ results.push({
25370
+ userIndex,
25371
+ userAddress: users[userIndex],
25372
+ balances
25373
+ });
25374
+ }
25375
+ return {
25376
+ balances: results,
25377
+ blockNumber
25378
+ };
25379
+ }
25380
+ function prepareTokenBalanceRpcCalls(chainId, account, tokens, blockTag = "latest") {
25381
+ const normalizedAccount = account.toLowerCase();
25382
+ const normalizedTokens = tokens.map((t) => t.toLowerCase());
25383
+ const tokensWithNative = [zeroAddress, ...normalizedTokens];
25384
+ const encodedCalldata = encodeBalanceFetcherCalldata([normalizedAccount], tokensWithNative);
25385
+ const dataLength = (encodedCalldata.length - 2) / 2;
25386
+ const paddedLength = Math.ceil(dataLength / 32) * 32;
25387
+ const offsetHex = "0000000000000000000000000000000000000000000000000000000000000020";
25388
+ const lengthHex = dataLength.toString(16).padStart(64, "0");
25389
+ const dataHex = encodedCalldata.slice(2).padEnd(paddedLength * 2, "0");
25390
+ const fullCalldata = BALANCE_FETCHER_SELECTOR + offsetHex + lengthHex + dataHex;
25391
+ const call = {
25392
+ jsonrpc: "2.0",
25393
+ id: 1,
25394
+ method: "eth_call",
25395
+ params: [
25396
+ {
25397
+ to: BALANCE_FETCHER,
25398
+ data: fullCalldata
25399
+ },
25400
+ blockTag
25401
+ ]
25402
+ };
25403
+ return {
25404
+ call,
25405
+ query: {
25406
+ chainId,
25407
+ account: normalizedAccount,
25408
+ tokens: tokensWithNative
25409
+ },
25410
+ encodedCalldata
25411
+ };
25412
+ }
25413
+ function parseTokenBalanceResult(rawResult, query2) {
25414
+ if (!rawResult || rawResult === "0x") {
25415
+ return {};
25416
+ }
25417
+ const parsed = parseBalanceFetcherResult(
25418
+ rawResult,
25419
+ [query2.account],
25420
+ query2.tokens
25421
+ );
25422
+ if (parsed.balances.length === 0) {
25423
+ return {};
25424
+ }
25425
+ const result = {};
25426
+ const userBalances = parsed.balances[0].balances;
25427
+ for (const token of query2.tokens) {
25428
+ const balanceEntry = userBalances[token];
25429
+ if (balanceEntry) {
25430
+ result[token] = {
25431
+ balanceRaw: balanceEntry.balance.toString(),
25432
+ balance: balanceEntry.balance
25433
+ };
25434
+ } else {
25435
+ result[token] = {
25436
+ balanceRaw: "0",
25437
+ balance: 0n
25438
+ };
25439
+ }
25440
+ }
25441
+ return result;
25442
+ }
25443
+ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
25444
+ const { blockTag = "latest", rpcUrl } = options;
25445
+ const prepared = prepareTokenBalanceRpcCalls(chainId, account, tokens, blockTag);
25446
+ const chain = getEvmChain(chainId);
25447
+ const url = rpcUrl || chain.rpcUrls?.default?.http?.[0];
25448
+ if (!url) {
25449
+ throw new Error(`No RPC URL available for chain ${chainId}`);
25450
+ }
25451
+ const response = await fetch(url, {
25452
+ method: "POST",
25453
+ headers: {
25454
+ "Content-Type": "application/json"
25455
+ },
25456
+ body: JSON.stringify(prepared.call)
25457
+ });
25458
+ if (!response.ok) {
25459
+ throw new Error(`RPC request failed: ${response.status} ${response.statusText}`);
25460
+ }
25461
+ const result = await response.json();
25462
+ if (result.error) {
25463
+ throw new Error(`RPC error: ${JSON.stringify(result.error)}`);
25464
+ }
25465
+ return parseTokenBalanceResult(result.result || "0x", prepared.query);
25466
+ }
24837
25467
 
24838
- export { MORPHO_LENS, MorphoLensAbi, attachPricesToFlashLiquidity, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, fetchDefillamaData, fetchDefillamaHistData, fetchFlashLiquidityForChain, fetchGeneralYields, fetchLenderMetaFromDir, fetchLenderMetaFromDirAndInitialize, fetchMainPrices, fetchOraclePrices, fetchPendlePrices, filterLendersByProtocol, flattenToUSDPriceMap, generateLendingPairs, generateLendingPools, getAavesForChain, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getMorphoTypeMarketConverter, getTopPairs, inititalizeAllData, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR, multicall3Abi, normalizeToBytes, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, prepareLenderUserDataRpcCalls, prepareMulticallInputs, unflattenLenderData };
25468
+ export { MORPHO_LENS, MorphoLensAbi, attachPricesToFlashLiquidity, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSummaries, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, encodeBalanceFetcherCalldata, fetchDefillamaData, fetchDefillamaHistData, fetchFlashLiquidityForChain, fetchGeneralYields, fetchMainPrices, fetchOraclePrices, fetchPendlePrices, fetchTokenBalances, fetchTokenMetadata, filterActiveLenders, filterLendersByProtocol, flattenToUSDPriceMap, fuseLenderData, generateLendingPairs, generateLendingPools, getAavesForChain, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getMorphoTypeMarketConverter, getTopPairs, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR, multicall3Abi, normalizeToBytes, parseBalanceFetcherResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, prepareLenderUserDataRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, unflattenLenderData };
24839
25469
  //# sourceMappingURL=index.js.map
24840
25470
  //# sourceMappingURL=index.js.map