@kamino-finance/klend-sdk 3.2.25 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) hide show
  1. package/dist/classes/action.d.ts +1 -0
  2. package/dist/classes/action.d.ts.map +1 -0
  3. package/dist/classes/action.js +1130 -1186
  4. package/dist/classes/action.js.map +1 -1
  5. package/dist/classes/curve.d.ts +1 -0
  6. package/dist/classes/curve.d.ts.map +1 -0
  7. package/dist/classes/curve.js +1 -1
  8. package/dist/classes/curve.js.map +1 -1
  9. package/dist/classes/fraction.d.ts +1 -0
  10. package/dist/classes/fraction.d.ts.map +1 -0
  11. package/dist/classes/fraction.js +7 -6
  12. package/dist/classes/fraction.js.map +1 -1
  13. package/dist/classes/index.d.ts +1 -0
  14. package/dist/classes/index.d.ts.map +1 -0
  15. package/dist/classes/index.js.map +1 -1
  16. package/dist/classes/jupiterPerps.d.ts +1 -0
  17. package/dist/classes/jupiterPerps.d.ts.map +1 -0
  18. package/dist/classes/jupiterPerps.js +7 -18
  19. package/dist/classes/jupiterPerps.js.map +1 -1
  20. package/dist/classes/manager.d.ts +1 -0
  21. package/dist/classes/manager.d.ts.map +1 -0
  22. package/dist/classes/manager.js +131 -158
  23. package/dist/classes/manager.js.map +1 -1
  24. package/dist/classes/market.d.ts +1 -0
  25. package/dist/classes/market.d.ts.map +1 -0
  26. package/dist/classes/market.js +620 -714
  27. package/dist/classes/market.js.map +1 -1
  28. package/dist/classes/obligation.d.ts +1 -0
  29. package/dist/classes/obligation.d.ts.map +1 -0
  30. package/dist/classes/obligation.js +60 -62
  31. package/dist/classes/obligation.js.map +1 -1
  32. package/dist/classes/reserve.d.ts +1 -0
  33. package/dist/classes/reserve.d.ts.map +1 -0
  34. package/dist/classes/reserve.js +135 -138
  35. package/dist/classes/reserve.js.map +1 -1
  36. package/dist/classes/shared.d.ts +1 -0
  37. package/dist/classes/shared.d.ts.map +1 -0
  38. package/dist/classes/shared.js.map +1 -1
  39. package/dist/classes/utils.d.ts +1 -0
  40. package/dist/classes/utils.d.ts.map +1 -0
  41. package/dist/classes/utils.js +3 -3
  42. package/dist/classes/utils.js.map +1 -1
  43. package/dist/classes/vault.d.ts +1 -0
  44. package/dist/classes/vault.d.ts.map +1 -0
  45. package/dist/classes/vault.js +334 -354
  46. package/dist/classes/vault.js.map +1 -1
  47. package/dist/client_kamino_manager.d.ts +1 -0
  48. package/dist/client_kamino_manager.d.ts.map +1 -0
  49. package/dist/client_kamino_manager.js +323 -326
  50. package/dist/client_kamino_manager.js.map +1 -1
  51. package/dist/idl_codegen/accounts/LendingMarket.d.ts +1 -0
  52. package/dist/idl_codegen/accounts/LendingMarket.d.ts.map +1 -0
  53. package/dist/idl_codegen/accounts/LendingMarket.js +89 -55
  54. package/dist/idl_codegen/accounts/LendingMarket.js.map +1 -1
  55. package/dist/idl_codegen/accounts/Obligation.d.ts +1 -0
  56. package/dist/idl_codegen/accounts/Obligation.d.ts.map +1 -0
  57. package/dist/idl_codegen/accounts/Obligation.js +87 -56
  58. package/dist/idl_codegen/accounts/Obligation.js.map +1 -1
  59. package/dist/idl_codegen/accounts/ReferrerState.d.ts +1 -0
  60. package/dist/idl_codegen/accounts/ReferrerState.d.ts.map +1 -0
  61. package/dist/idl_codegen/accounts/ReferrerState.js +22 -33
  62. package/dist/idl_codegen/accounts/ReferrerState.js.map +1 -1
  63. package/dist/idl_codegen/accounts/ReferrerTokenState.d.ts +1 -0
  64. package/dist/idl_codegen/accounts/ReferrerTokenState.d.ts.map +1 -0
  65. package/dist/idl_codegen/accounts/ReferrerTokenState.js +35 -37
  66. package/dist/idl_codegen/accounts/ReferrerTokenState.js.map +1 -1
  67. package/dist/idl_codegen/accounts/Reserve.d.ts +1 -0
  68. package/dist/idl_codegen/accounts/Reserve.d.ts.map +1 -0
  69. package/dist/idl_codegen/accounts/Reserve.js +60 -49
  70. package/dist/idl_codegen/accounts/Reserve.js.map +1 -1
  71. package/dist/idl_codegen/accounts/ShortUrl.d.ts +1 -0
  72. package/dist/idl_codegen/accounts/ShortUrl.d.ts.map +1 -0
  73. package/dist/idl_codegen/accounts/ShortUrl.js +22 -33
  74. package/dist/idl_codegen/accounts/ShortUrl.js.map +1 -1
  75. package/dist/idl_codegen/accounts/UserMetadata.d.ts +1 -0
  76. package/dist/idl_codegen/accounts/UserMetadata.d.ts.map +1 -0
  77. package/dist/idl_codegen/accounts/UserMetadata.js +34 -37
  78. package/dist/idl_codegen/accounts/UserMetadata.js.map +1 -1
  79. package/dist/idl_codegen/accounts/UserState.d.ts +1 -0
  80. package/dist/idl_codegen/accounts/UserState.d.ts.map +1 -0
  81. package/dist/idl_codegen/accounts/UserState.js +77 -48
  82. package/dist/idl_codegen/accounts/UserState.js.map +1 -1
  83. package/dist/idl_codegen/accounts/index.d.ts +1 -0
  84. package/dist/idl_codegen/accounts/index.d.ts.map +1 -0
  85. package/dist/idl_codegen/accounts/index.js.map +1 -1
  86. package/dist/idl_codegen/errors/anchor.d.ts +1 -0
  87. package/dist/idl_codegen/errors/anchor.d.ts.map +1 -0
  88. package/dist/idl_codegen/errors/anchor.js +270 -216
  89. package/dist/idl_codegen/errors/anchor.js.map +1 -1
  90. package/dist/idl_codegen/errors/custom.d.ts +1 -0
  91. package/dist/idl_codegen/errors/custom.d.ts.map +1 -0
  92. package/dist/idl_codegen/errors/custom.js +560 -448
  93. package/dist/idl_codegen/errors/custom.js.map +1 -1
  94. package/dist/idl_codegen/errors/index.d.ts +1 -0
  95. package/dist/idl_codegen/errors/index.d.ts.map +1 -0
  96. package/dist/idl_codegen/errors/index.js.map +1 -1
  97. package/dist/idl_codegen/instructions/borrowObligationLiquidity.d.ts +1 -0
  98. package/dist/idl_codegen/instructions/borrowObligationLiquidity.d.ts.map +1 -0
  99. package/dist/idl_codegen/instructions/borrowObligationLiquidity.js.map +1 -1
  100. package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.d.ts +1 -0
  101. package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.d.ts.map +1 -0
  102. package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.js.map +1 -1
  103. package/dist/idl_codegen/instructions/depositObligationCollateral.d.ts +1 -0
  104. package/dist/idl_codegen/instructions/depositObligationCollateral.d.ts.map +1 -0
  105. package/dist/idl_codegen/instructions/depositObligationCollateral.js.map +1 -1
  106. package/dist/idl_codegen/instructions/depositReserveLiquidity.d.ts +1 -0
  107. package/dist/idl_codegen/instructions/depositReserveLiquidity.d.ts.map +1 -0
  108. package/dist/idl_codegen/instructions/depositReserveLiquidity.js.map +1 -1
  109. package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.d.ts +1 -0
  110. package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.d.ts.map +1 -0
  111. package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.js.map +1 -1
  112. package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.d.ts +1 -0
  113. package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.d.ts.map +1 -0
  114. package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.js.map +1 -1
  115. package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.d.ts +1 -0
  116. package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.d.ts.map +1 -0
  117. package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.js.map +1 -1
  118. package/dist/idl_codegen/instructions/idlMissingTypes.d.ts +1 -0
  119. package/dist/idl_codegen/instructions/idlMissingTypes.d.ts.map +1 -0
  120. package/dist/idl_codegen/instructions/idlMissingTypes.js.map +1 -1
  121. package/dist/idl_codegen/instructions/index.d.ts +1 -0
  122. package/dist/idl_codegen/instructions/index.d.ts.map +1 -0
  123. package/dist/idl_codegen/instructions/index.js.map +1 -1
  124. package/dist/idl_codegen/instructions/initFarmsForReserve.d.ts +1 -0
  125. package/dist/idl_codegen/instructions/initFarmsForReserve.d.ts.map +1 -0
  126. package/dist/idl_codegen/instructions/initFarmsForReserve.js.map +1 -1
  127. package/dist/idl_codegen/instructions/initLendingMarket.d.ts +1 -0
  128. package/dist/idl_codegen/instructions/initLendingMarket.d.ts.map +1 -0
  129. package/dist/idl_codegen/instructions/initLendingMarket.js.map +1 -1
  130. package/dist/idl_codegen/instructions/initObligation.d.ts +1 -0
  131. package/dist/idl_codegen/instructions/initObligation.d.ts.map +1 -0
  132. package/dist/idl_codegen/instructions/initObligation.js.map +1 -1
  133. package/dist/idl_codegen/instructions/initObligationFarmsForReserve.d.ts +1 -0
  134. package/dist/idl_codegen/instructions/initObligationFarmsForReserve.d.ts.map +1 -0
  135. package/dist/idl_codegen/instructions/initObligationFarmsForReserve.js.map +1 -1
  136. package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.d.ts +1 -0
  137. package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.d.ts.map +1 -0
  138. package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.js.map +1 -1
  139. package/dist/idl_codegen/instructions/initReferrerTokenState.d.ts +1 -0
  140. package/dist/idl_codegen/instructions/initReferrerTokenState.d.ts.map +1 -0
  141. package/dist/idl_codegen/instructions/initReferrerTokenState.js.map +1 -1
  142. package/dist/idl_codegen/instructions/initReserve.d.ts +1 -0
  143. package/dist/idl_codegen/instructions/initReserve.d.ts.map +1 -0
  144. package/dist/idl_codegen/instructions/initReserve.js.map +1 -1
  145. package/dist/idl_codegen/instructions/initUserMetadata.d.ts +1 -0
  146. package/dist/idl_codegen/instructions/initUserMetadata.d.ts.map +1 -0
  147. package/dist/idl_codegen/instructions/initUserMetadata.js.map +1 -1
  148. package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.d.ts +1 -0
  149. package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.d.ts.map +1 -0
  150. package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.js.map +1 -1
  151. package/dist/idl_codegen/instructions/redeemFees.d.ts +1 -0
  152. package/dist/idl_codegen/instructions/redeemFees.d.ts.map +1 -0
  153. package/dist/idl_codegen/instructions/redeemFees.js.map +1 -1
  154. package/dist/idl_codegen/instructions/redeemReserveCollateral.d.ts +1 -0
  155. package/dist/idl_codegen/instructions/redeemReserveCollateral.d.ts.map +1 -0
  156. package/dist/idl_codegen/instructions/redeemReserveCollateral.js.map +1 -1
  157. package/dist/idl_codegen/instructions/refreshObligation.d.ts +1 -0
  158. package/dist/idl_codegen/instructions/refreshObligation.d.ts.map +1 -0
  159. package/dist/idl_codegen/instructions/refreshObligation.js.map +1 -1
  160. package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.d.ts +1 -0
  161. package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.d.ts.map +1 -0
  162. package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.js.map +1 -1
  163. package/dist/idl_codegen/instructions/refreshReserve.d.ts +1 -0
  164. package/dist/idl_codegen/instructions/refreshReserve.d.ts.map +1 -0
  165. package/dist/idl_codegen/instructions/refreshReserve.js.map +1 -1
  166. package/dist/idl_codegen/instructions/refreshReservesBatch.d.ts +1 -0
  167. package/dist/idl_codegen/instructions/refreshReservesBatch.d.ts.map +1 -0
  168. package/dist/idl_codegen/instructions/refreshReservesBatch.js.map +1 -1
  169. package/dist/idl_codegen/instructions/repayObligationLiquidity.d.ts +1 -0
  170. package/dist/idl_codegen/instructions/repayObligationLiquidity.d.ts.map +1 -0
  171. package/dist/idl_codegen/instructions/repayObligationLiquidity.js.map +1 -1
  172. package/dist/idl_codegen/instructions/requestElevationGroup.d.ts +1 -0
  173. package/dist/idl_codegen/instructions/requestElevationGroup.d.ts.map +1 -0
  174. package/dist/idl_codegen/instructions/requestElevationGroup.js.map +1 -1
  175. package/dist/idl_codegen/instructions/socializeLoss.d.ts +1 -0
  176. package/dist/idl_codegen/instructions/socializeLoss.d.ts.map +1 -0
  177. package/dist/idl_codegen/instructions/socializeLoss.js.map +1 -1
  178. package/dist/idl_codegen/instructions/updateEntireReserveConfig.d.ts +1 -0
  179. package/dist/idl_codegen/instructions/updateEntireReserveConfig.d.ts.map +1 -0
  180. package/dist/idl_codegen/instructions/updateEntireReserveConfig.js.map +1 -1
  181. package/dist/idl_codegen/instructions/updateLendingMarket.d.ts +1 -0
  182. package/dist/idl_codegen/instructions/updateLendingMarket.d.ts.map +1 -0
  183. package/dist/idl_codegen/instructions/updateLendingMarket.js.map +1 -1
  184. package/dist/idl_codegen/instructions/updateLendingMarketOwner.d.ts +1 -0
  185. package/dist/idl_codegen/instructions/updateLendingMarketOwner.d.ts.map +1 -0
  186. package/dist/idl_codegen/instructions/updateLendingMarketOwner.js.map +1 -1
  187. package/dist/idl_codegen/instructions/updateReserveConfig.d.ts +1 -0
  188. package/dist/idl_codegen/instructions/updateReserveConfig.d.ts.map +1 -0
  189. package/dist/idl_codegen/instructions/updateReserveConfig.js.map +1 -1
  190. package/dist/idl_codegen/instructions/updateSingleReserveConfig.d.ts +1 -0
  191. package/dist/idl_codegen/instructions/updateSingleReserveConfig.d.ts.map +1 -0
  192. package/dist/idl_codegen/instructions/updateSingleReserveConfig.js.map +1 -1
  193. package/dist/idl_codegen/instructions/withdrawObligationCollateral.d.ts +1 -0
  194. package/dist/idl_codegen/instructions/withdrawObligationCollateral.d.ts.map +1 -0
  195. package/dist/idl_codegen/instructions/withdrawObligationCollateral.js.map +1 -1
  196. package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.d.ts +1 -0
  197. package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.d.ts.map +1 -0
  198. package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.js.map +1 -1
  199. package/dist/idl_codegen/instructions/withdrawProtocolFee.d.ts +1 -0
  200. package/dist/idl_codegen/instructions/withdrawProtocolFee.d.ts.map +1 -0
  201. package/dist/idl_codegen/instructions/withdrawProtocolFee.js.map +1 -1
  202. package/dist/idl_codegen/instructions/withdrawReferrerFees.d.ts +1 -0
  203. package/dist/idl_codegen/instructions/withdrawReferrerFees.d.ts.map +1 -0
  204. package/dist/idl_codegen/instructions/withdrawReferrerFees.js.map +1 -1
  205. package/dist/idl_codegen/programId.d.ts +1 -0
  206. package/dist/idl_codegen/programId.d.ts.map +1 -0
  207. package/dist/idl_codegen/programId.js.map +1 -1
  208. package/dist/idl_codegen/types/AssetTier.d.ts +1 -0
  209. package/dist/idl_codegen/types/AssetTier.d.ts.map +1 -0
  210. package/dist/idl_codegen/types/AssetTier.js +12 -18
  211. package/dist/idl_codegen/types/AssetTier.js.map +1 -1
  212. package/dist/idl_codegen/types/BigFractionBytes.d.ts +1 -0
  213. package/dist/idl_codegen/types/BigFractionBytes.d.ts.map +1 -0
  214. package/dist/idl_codegen/types/BigFractionBytes.js +2 -0
  215. package/dist/idl_codegen/types/BigFractionBytes.js.map +1 -1
  216. package/dist/idl_codegen/types/BorrowRateCurve.d.ts +1 -0
  217. package/dist/idl_codegen/types/BorrowRateCurve.d.ts.map +1 -0
  218. package/dist/idl_codegen/types/BorrowRateCurve.js +2 -1
  219. package/dist/idl_codegen/types/BorrowRateCurve.js.map +1 -1
  220. package/dist/idl_codegen/types/CurvePoint.d.ts +1 -0
  221. package/dist/idl_codegen/types/CurvePoint.d.ts.map +1 -0
  222. package/dist/idl_codegen/types/CurvePoint.js +2 -0
  223. package/dist/idl_codegen/types/CurvePoint.js.map +1 -1
  224. package/dist/idl_codegen/types/ElevationGroup.d.ts +1 -0
  225. package/dist/idl_codegen/types/ElevationGroup.d.ts.map +1 -0
  226. package/dist/idl_codegen/types/ElevationGroup.js +10 -0
  227. package/dist/idl_codegen/types/ElevationGroup.js.map +1 -1
  228. package/dist/idl_codegen/types/FeeCalculation.d.ts +1 -0
  229. package/dist/idl_codegen/types/FeeCalculation.d.ts.map +1 -0
  230. package/dist/idl_codegen/types/FeeCalculation.js +8 -12
  231. package/dist/idl_codegen/types/FeeCalculation.js.map +1 -1
  232. package/dist/idl_codegen/types/InitObligationArgs.d.ts +1 -0
  233. package/dist/idl_codegen/types/InitObligationArgs.d.ts.map +1 -0
  234. package/dist/idl_codegen/types/InitObligationArgs.js +2 -0
  235. package/dist/idl_codegen/types/InitObligationArgs.js.map +1 -1
  236. package/dist/idl_codegen/types/LastUpdate.d.ts +1 -0
  237. package/dist/idl_codegen/types/LastUpdate.d.ts.map +1 -0
  238. package/dist/idl_codegen/types/LastUpdate.js +7 -0
  239. package/dist/idl_codegen/types/LastUpdate.js.map +1 -1
  240. package/dist/idl_codegen/types/ObligationCollateral.d.ts +1 -0
  241. package/dist/idl_codegen/types/ObligationCollateral.d.ts.map +1 -0
  242. package/dist/idl_codegen/types/ObligationCollateral.js +14 -0
  243. package/dist/idl_codegen/types/ObligationCollateral.js.map +1 -1
  244. package/dist/idl_codegen/types/ObligationLiquidity.d.ts +1 -0
  245. package/dist/idl_codegen/types/ObligationLiquidity.d.ts.map +1 -0
  246. package/dist/idl_codegen/types/ObligationLiquidity.js +17 -1
  247. package/dist/idl_codegen/types/ObligationLiquidity.js.map +1 -1
  248. package/dist/idl_codegen/types/PriceHeuristic.d.ts +1 -0
  249. package/dist/idl_codegen/types/PriceHeuristic.d.ts.map +1 -0
  250. package/dist/idl_codegen/types/PriceHeuristic.js +6 -0
  251. package/dist/idl_codegen/types/PriceHeuristic.js.map +1 -1
  252. package/dist/idl_codegen/types/PythConfiguration.d.ts +1 -0
  253. package/dist/idl_codegen/types/PythConfiguration.d.ts.map +1 -0
  254. package/dist/idl_codegen/types/PythConfiguration.js +2 -0
  255. package/dist/idl_codegen/types/PythConfiguration.js.map +1 -1
  256. package/dist/idl_codegen/types/ReserveCollateral.d.ts +1 -0
  257. package/dist/idl_codegen/types/ReserveCollateral.d.ts.map +1 -0
  258. package/dist/idl_codegen/types/ReserveCollateral.js +8 -0
  259. package/dist/idl_codegen/types/ReserveCollateral.js.map +1 -1
  260. package/dist/idl_codegen/types/ReserveConfig.d.ts +1 -0
  261. package/dist/idl_codegen/types/ReserveConfig.d.ts.map +1 -0
  262. package/dist/idl_codegen/types/ReserveConfig.js +78 -5
  263. package/dist/idl_codegen/types/ReserveConfig.js.map +1 -1
  264. package/dist/idl_codegen/types/ReserveFarmKind.d.ts +1 -0
  265. package/dist/idl_codegen/types/ReserveFarmKind.d.ts.map +1 -0
  266. package/dist/idl_codegen/types/ReserveFarmKind.js +8 -12
  267. package/dist/idl_codegen/types/ReserveFarmKind.js.map +1 -1
  268. package/dist/idl_codegen/types/ReserveFees.d.ts +1 -0
  269. package/dist/idl_codegen/types/ReserveFees.d.ts.map +1 -0
  270. package/dist/idl_codegen/types/ReserveFees.js +16 -0
  271. package/dist/idl_codegen/types/ReserveFees.js.map +1 -1
  272. package/dist/idl_codegen/types/ReserveLiquidity.d.ts +1 -0
  273. package/dist/idl_codegen/types/ReserveLiquidity.d.ts.map +1 -0
  274. package/dist/idl_codegen/types/ReserveLiquidity.js +43 -1
  275. package/dist/idl_codegen/types/ReserveLiquidity.js.map +1 -1
  276. package/dist/idl_codegen/types/ReserveStatus.d.ts +1 -0
  277. package/dist/idl_codegen/types/ReserveStatus.d.ts.map +1 -0
  278. package/dist/idl_codegen/types/ReserveStatus.js +12 -18
  279. package/dist/idl_codegen/types/ReserveStatus.js.map +1 -1
  280. package/dist/idl_codegen/types/ScopeConfiguration.d.ts +1 -0
  281. package/dist/idl_codegen/types/ScopeConfiguration.d.ts.map +1 -0
  282. package/dist/idl_codegen/types/ScopeConfiguration.js +6 -0
  283. package/dist/idl_codegen/types/ScopeConfiguration.js.map +1 -1
  284. package/dist/idl_codegen/types/SwitchboardConfiguration.d.ts +1 -0
  285. package/dist/idl_codegen/types/SwitchboardConfiguration.d.ts.map +1 -0
  286. package/dist/idl_codegen/types/SwitchboardConfiguration.js +3 -0
  287. package/dist/idl_codegen/types/SwitchboardConfiguration.js.map +1 -1
  288. package/dist/idl_codegen/types/TokenInfo.d.ts +1 -0
  289. package/dist/idl_codegen/types/TokenInfo.d.ts.map +1 -0
  290. package/dist/idl_codegen/types/TokenInfo.js +27 -4
  291. package/dist/idl_codegen/types/TokenInfo.js.map +1 -1
  292. package/dist/idl_codegen/types/UpdateConfigMode.d.ts +1 -0
  293. package/dist/idl_codegen/types/UpdateConfigMode.d.ts.map +1 -0
  294. package/dist/idl_codegen/types/UpdateConfigMode.js +188 -282
  295. package/dist/idl_codegen/types/UpdateConfigMode.js.map +1 -1
  296. package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.d.ts +1 -0
  297. package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.d.ts.map +1 -0
  298. package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.js +41 -33
  299. package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.js.map +1 -1
  300. package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts +1 -0
  301. package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts.map +1 -0
  302. package/dist/idl_codegen/types/UpdateLendingMarketMode.js +72 -108
  303. package/dist/idl_codegen/types/UpdateLendingMarketMode.js.map +1 -1
  304. package/dist/idl_codegen/types/WithdrawalCaps.d.ts +1 -0
  305. package/dist/idl_codegen/types/WithdrawalCaps.d.ts.map +1 -0
  306. package/dist/idl_codegen/types/WithdrawalCaps.js +4 -0
  307. package/dist/idl_codegen/types/WithdrawalCaps.js.map +1 -1
  308. package/dist/idl_codegen/types/index.d.ts +1 -0
  309. package/dist/idl_codegen/types/index.d.ts.map +1 -0
  310. package/dist/idl_codegen/types/index.js.map +1 -1
  311. package/dist/idl_codegen/zero_padding/ObligationZP.d.ts +1 -0
  312. package/dist/idl_codegen/zero_padding/ObligationZP.d.ts.map +1 -0
  313. package/dist/idl_codegen/zero_padding/ObligationZP.js +83 -54
  314. package/dist/idl_codegen/zero_padding/ObligationZP.js.map +1 -1
  315. package/dist/idl_codegen/zero_padding/index.d.ts +1 -0
  316. package/dist/idl_codegen/zero_padding/index.d.ts.map +1 -0
  317. package/dist/idl_codegen/zero_padding/index.js.map +1 -1
  318. package/dist/idl_codegen_jupiter_perps/accounts/Pool.d.ts +1 -0
  319. package/dist/idl_codegen_jupiter_perps/accounts/Pool.d.ts.map +1 -0
  320. package/dist/idl_codegen_jupiter_perps/accounts/Pool.js +39 -42
  321. package/dist/idl_codegen_jupiter_perps/accounts/Pool.js.map +1 -1
  322. package/dist/idl_codegen_jupiter_perps/accounts/index.d.ts +1 -0
  323. package/dist/idl_codegen_jupiter_perps/accounts/index.d.ts.map +1 -0
  324. package/dist/idl_codegen_jupiter_perps/accounts/index.js.map +1 -1
  325. package/dist/idl_codegen_jupiter_perps/programId.d.ts +1 -0
  326. package/dist/idl_codegen_jupiter_perps/programId.d.ts.map +1 -0
  327. package/dist/idl_codegen_jupiter_perps/programId.js.map +1 -1
  328. package/dist/idl_codegen_jupiter_perps/types/Fees.d.ts +1 -0
  329. package/dist/idl_codegen_jupiter_perps/types/Fees.d.ts.map +1 -0
  330. package/dist/idl_codegen_jupiter_perps/types/Fees.js +9 -0
  331. package/dist/idl_codegen_jupiter_perps/types/Fees.js.map +1 -1
  332. package/dist/idl_codegen_jupiter_perps/types/Limit.d.ts +1 -0
  333. package/dist/idl_codegen_jupiter_perps/types/Limit.d.ts.map +1 -0
  334. package/dist/idl_codegen_jupiter_perps/types/Limit.js +3 -0
  335. package/dist/idl_codegen_jupiter_perps/types/Limit.js.map +1 -1
  336. package/dist/idl_codegen_jupiter_perps/types/PoolApr.d.ts +1 -0
  337. package/dist/idl_codegen_jupiter_perps/types/PoolApr.d.ts.map +1 -0
  338. package/dist/idl_codegen_jupiter_perps/types/PoolApr.js +3 -0
  339. package/dist/idl_codegen_jupiter_perps/types/PoolApr.js.map +1 -1
  340. package/dist/idl_codegen_jupiter_perps/types/index.d.ts +1 -0
  341. package/dist/idl_codegen_jupiter_perps/types/index.d.ts.map +1 -0
  342. package/dist/idl_codegen_jupiter_perps/types/index.js.map +1 -1
  343. package/dist/idl_codegen_kamino_vault/accounts/Reserve.d.ts +1 -0
  344. package/dist/idl_codegen_kamino_vault/accounts/Reserve.d.ts.map +1 -0
  345. package/dist/idl_codegen_kamino_vault/accounts/Reserve.js +58 -47
  346. package/dist/idl_codegen_kamino_vault/accounts/Reserve.js.map +1 -1
  347. package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts +1 -0
  348. package/dist/idl_codegen_kamino_vault/accounts/VaultState.d.ts.map +1 -0
  349. package/dist/idl_codegen_kamino_vault/accounts/VaultState.js +51 -47
  350. package/dist/idl_codegen_kamino_vault/accounts/VaultState.js.map +1 -1
  351. package/dist/idl_codegen_kamino_vault/accounts/index.d.ts +1 -0
  352. package/dist/idl_codegen_kamino_vault/accounts/index.d.ts.map +1 -0
  353. package/dist/idl_codegen_kamino_vault/accounts/index.js.map +1 -1
  354. package/dist/idl_codegen_kamino_vault/errors/anchor.d.ts +1 -0
  355. package/dist/idl_codegen_kamino_vault/errors/anchor.d.ts.map +1 -0
  356. package/dist/idl_codegen_kamino_vault/errors/anchor.js +270 -216
  357. package/dist/idl_codegen_kamino_vault/errors/anchor.js.map +1 -1
  358. package/dist/idl_codegen_kamino_vault/errors/custom.d.ts +1 -0
  359. package/dist/idl_codegen_kamino_vault/errors/custom.d.ts.map +1 -0
  360. package/dist/idl_codegen_kamino_vault/errors/custom.js +120 -96
  361. package/dist/idl_codegen_kamino_vault/errors/custom.js.map +1 -1
  362. package/dist/idl_codegen_kamino_vault/errors/index.d.ts +1 -0
  363. package/dist/idl_codegen_kamino_vault/errors/index.d.ts.map +1 -0
  364. package/dist/idl_codegen_kamino_vault/errors/index.js.map +1 -1
  365. package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts +1 -0
  366. package/dist/idl_codegen_kamino_vault/instructions/deposit.d.ts.map +1 -0
  367. package/dist/idl_codegen_kamino_vault/instructions/deposit.js.map +1 -1
  368. package/dist/idl_codegen_kamino_vault/instructions/index.d.ts +1 -0
  369. package/dist/idl_codegen_kamino_vault/instructions/index.d.ts.map +1 -0
  370. package/dist/idl_codegen_kamino_vault/instructions/index.js.map +1 -1
  371. package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts +1 -0
  372. package/dist/idl_codegen_kamino_vault/instructions/initVault.d.ts.map +1 -0
  373. package/dist/idl_codegen_kamino_vault/instructions/initVault.js.map +1 -1
  374. package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts +1 -0
  375. package/dist/idl_codegen_kamino_vault/instructions/invest.d.ts.map +1 -0
  376. package/dist/idl_codegen_kamino_vault/instructions/invest.js.map +1 -1
  377. package/dist/idl_codegen_kamino_vault/instructions/updateReserveAllocation.d.ts +1 -0
  378. package/dist/idl_codegen_kamino_vault/instructions/updateReserveAllocation.d.ts.map +1 -0
  379. package/dist/idl_codegen_kamino_vault/instructions/updateReserveAllocation.js.map +1 -1
  380. package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts +1 -0
  381. package/dist/idl_codegen_kamino_vault/instructions/withdraw.d.ts.map +1 -0
  382. package/dist/idl_codegen_kamino_vault/instructions/withdraw.js.map +1 -1
  383. package/dist/idl_codegen_kamino_vault/programId.d.ts +1 -0
  384. package/dist/idl_codegen_kamino_vault/programId.d.ts.map +1 -0
  385. package/dist/idl_codegen_kamino_vault/programId.js.map +1 -1
  386. package/dist/idl_codegen_kamino_vault/types/BigFractionBytes.d.ts +1 -0
  387. package/dist/idl_codegen_kamino_vault/types/BigFractionBytes.d.ts.map +1 -0
  388. package/dist/idl_codegen_kamino_vault/types/BigFractionBytes.js +2 -0
  389. package/dist/idl_codegen_kamino_vault/types/BigFractionBytes.js.map +1 -1
  390. package/dist/idl_codegen_kamino_vault/types/BorrowRateCurve.d.ts +1 -0
  391. package/dist/idl_codegen_kamino_vault/types/BorrowRateCurve.d.ts.map +1 -0
  392. package/dist/idl_codegen_kamino_vault/types/BorrowRateCurve.js +2 -1
  393. package/dist/idl_codegen_kamino_vault/types/BorrowRateCurve.js.map +1 -1
  394. package/dist/idl_codegen_kamino_vault/types/CurvePoint.d.ts +1 -0
  395. package/dist/idl_codegen_kamino_vault/types/CurvePoint.d.ts.map +1 -0
  396. package/dist/idl_codegen_kamino_vault/types/CurvePoint.js +2 -0
  397. package/dist/idl_codegen_kamino_vault/types/CurvePoint.js.map +1 -1
  398. package/dist/idl_codegen_kamino_vault/types/LastUpdate.d.ts +1 -0
  399. package/dist/idl_codegen_kamino_vault/types/LastUpdate.d.ts.map +1 -0
  400. package/dist/idl_codegen_kamino_vault/types/LastUpdate.js +7 -0
  401. package/dist/idl_codegen_kamino_vault/types/LastUpdate.js.map +1 -1
  402. package/dist/idl_codegen_kamino_vault/types/PriceHeuristic.d.ts +1 -0
  403. package/dist/idl_codegen_kamino_vault/types/PriceHeuristic.d.ts.map +1 -0
  404. package/dist/idl_codegen_kamino_vault/types/PriceHeuristic.js +6 -0
  405. package/dist/idl_codegen_kamino_vault/types/PriceHeuristic.js.map +1 -1
  406. package/dist/idl_codegen_kamino_vault/types/PythConfiguration.d.ts +1 -0
  407. package/dist/idl_codegen_kamino_vault/types/PythConfiguration.d.ts.map +1 -0
  408. package/dist/idl_codegen_kamino_vault/types/PythConfiguration.js +2 -0
  409. package/dist/idl_codegen_kamino_vault/types/PythConfiguration.js.map +1 -1
  410. package/dist/idl_codegen_kamino_vault/types/ReserveCollateral.d.ts +1 -0
  411. package/dist/idl_codegen_kamino_vault/types/ReserveCollateral.d.ts.map +1 -0
  412. package/dist/idl_codegen_kamino_vault/types/ReserveCollateral.js +8 -0
  413. package/dist/idl_codegen_kamino_vault/types/ReserveCollateral.js.map +1 -1
  414. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts +1 -0
  415. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.d.ts.map +1 -0
  416. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js +77 -5
  417. package/dist/idl_codegen_kamino_vault/types/ReserveConfig.js.map +1 -1
  418. package/dist/idl_codegen_kamino_vault/types/ReserveFees.d.ts +1 -0
  419. package/dist/idl_codegen_kamino_vault/types/ReserveFees.d.ts.map +1 -0
  420. package/dist/idl_codegen_kamino_vault/types/ReserveFees.js +16 -0
  421. package/dist/idl_codegen_kamino_vault/types/ReserveFees.js.map +1 -1
  422. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts +1 -0
  423. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.d.ts.map +1 -0
  424. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js +41 -1
  425. package/dist/idl_codegen_kamino_vault/types/ReserveLiquidity.js.map +1 -1
  426. package/dist/idl_codegen_kamino_vault/types/ScopeConfiguration.d.ts +1 -0
  427. package/dist/idl_codegen_kamino_vault/types/ScopeConfiguration.d.ts.map +1 -0
  428. package/dist/idl_codegen_kamino_vault/types/ScopeConfiguration.js +6 -0
  429. package/dist/idl_codegen_kamino_vault/types/ScopeConfiguration.js.map +1 -1
  430. package/dist/idl_codegen_kamino_vault/types/SwitchboardConfiguration.d.ts +1 -0
  431. package/dist/idl_codegen_kamino_vault/types/SwitchboardConfiguration.d.ts.map +1 -0
  432. package/dist/idl_codegen_kamino_vault/types/SwitchboardConfiguration.js +3 -0
  433. package/dist/idl_codegen_kamino_vault/types/SwitchboardConfiguration.js.map +1 -1
  434. package/dist/idl_codegen_kamino_vault/types/TokenInfo.d.ts +1 -0
  435. package/dist/idl_codegen_kamino_vault/types/TokenInfo.d.ts.map +1 -0
  436. package/dist/idl_codegen_kamino_vault/types/TokenInfo.js +27 -4
  437. package/dist/idl_codegen_kamino_vault/types/TokenInfo.js.map +1 -1
  438. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.d.ts +1 -0
  439. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.d.ts.map +1 -0
  440. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.js +8 -0
  441. package/dist/idl_codegen_kamino_vault/types/VaultAllocation.js.map +1 -1
  442. package/dist/idl_codegen_kamino_vault/types/WithdrawalCaps.d.ts +1 -0
  443. package/dist/idl_codegen_kamino_vault/types/WithdrawalCaps.d.ts.map +1 -0
  444. package/dist/idl_codegen_kamino_vault/types/WithdrawalCaps.js +4 -0
  445. package/dist/idl_codegen_kamino_vault/types/WithdrawalCaps.js.map +1 -1
  446. package/dist/idl_codegen_kamino_vault/types/index.d.ts +1 -0
  447. package/dist/idl_codegen_kamino_vault/types/index.d.ts.map +1 -0
  448. package/dist/idl_codegen_kamino_vault/types/index.js.map +1 -1
  449. package/dist/index.d.ts +1 -0
  450. package/dist/index.d.ts.map +1 -0
  451. package/dist/index.js.map +1 -1
  452. package/dist/lending_operations/index.d.ts +1 -0
  453. package/dist/lending_operations/index.d.ts.map +1 -0
  454. package/dist/lending_operations/index.js.map +1 -1
  455. package/dist/lending_operations/repay_with_collateral_calcs.d.ts +1 -0
  456. package/dist/lending_operations/repay_with_collateral_calcs.d.ts.map +1 -0
  457. package/dist/lending_operations/repay_with_collateral_calcs.js +1 -1
  458. package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -1
  459. package/dist/lending_operations/repay_with_collateral_operations.d.ts +1 -0
  460. package/dist/lending_operations/repay_with_collateral_operations.d.ts.map +1 -0
  461. package/dist/lending_operations/repay_with_collateral_operations.js +15 -24
  462. package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
  463. package/dist/leverage/calcs.d.ts +1 -0
  464. package/dist/leverage/calcs.d.ts.map +1 -0
  465. package/dist/leverage/calcs.js +119 -132
  466. package/dist/leverage/calcs.js.map +1 -1
  467. package/dist/leverage/index.d.ts +1 -0
  468. package/dist/leverage/index.d.ts.map +1 -0
  469. package/dist/leverage/index.js.map +1 -1
  470. package/dist/leverage/instructions.d.ts +1 -0
  471. package/dist/leverage/instructions.d.ts.map +1 -0
  472. package/dist/leverage/instructions.js.map +1 -1
  473. package/dist/leverage/operations.d.ts +1 -0
  474. package/dist/leverage/operations.d.ts.map +1 -0
  475. package/dist/leverage/operations.js +75 -84
  476. package/dist/leverage/operations.js.map +1 -1
  477. package/dist/leverage/utils.d.ts +1 -0
  478. package/dist/leverage/utils.d.ts.map +1 -0
  479. package/dist/leverage/utils.js +73 -88
  480. package/dist/leverage/utils.js.map +1 -1
  481. package/dist/lib.d.ts +1 -0
  482. package/dist/lib.d.ts.map +1 -0
  483. package/dist/lib.js.map +1 -1
  484. package/dist/referrals/index.d.ts +1 -0
  485. package/dist/referrals/index.d.ts.map +1 -0
  486. package/dist/referrals/index.js.map +1 -1
  487. package/dist/referrals/instructions.d.ts +1 -0
  488. package/dist/referrals/instructions.d.ts.map +1 -0
  489. package/dist/referrals/instructions.js +8 -17
  490. package/dist/referrals/instructions.js.map +1 -1
  491. package/dist/referrals/operations.d.ts +2 -1
  492. package/dist/referrals/operations.d.ts.map +1 -0
  493. package/dist/referrals/operations.js +119 -143
  494. package/dist/referrals/operations.js.map +1 -1
  495. package/dist/utils/ObligationType.d.ts +1 -0
  496. package/dist/utils/ObligationType.d.ts.map +1 -0
  497. package/dist/utils/ObligationType.js +16 -7
  498. package/dist/utils/ObligationType.js.map +1 -1
  499. package/dist/utils/api.d.ts +1 -0
  500. package/dist/utils/api.d.ts.map +1 -0
  501. package/dist/utils/api.js +10 -21
  502. package/dist/utils/api.js.map +1 -1
  503. package/dist/utils/ata.d.ts +1 -0
  504. package/dist/utils/ata.d.ts.map +1 -0
  505. package/dist/utils/ata.js +25 -38
  506. package/dist/utils/ata.js.map +1 -1
  507. package/dist/utils/constants.d.ts +1 -0
  508. package/dist/utils/constants.d.ts.map +1 -0
  509. package/dist/utils/constants.js +1 -1
  510. package/dist/utils/constants.js.map +1 -1
  511. package/dist/utils/idl.d.ts +1 -0
  512. package/dist/utils/idl.d.ts.map +1 -0
  513. package/dist/utils/idl.js.map +1 -1
  514. package/dist/utils/index.d.ts +1 -0
  515. package/dist/utils/index.d.ts.map +1 -0
  516. package/dist/utils/index.js.map +1 -1
  517. package/dist/utils/instruction.d.ts +1 -0
  518. package/dist/utils/instruction.d.ts.map +1 -0
  519. package/dist/utils/instruction.js +116 -143
  520. package/dist/utils/instruction.js.map +1 -1
  521. package/dist/utils/kamino.d.ts +1 -0
  522. package/dist/utils/kamino.d.ts.map +1 -0
  523. package/dist/utils/kamino.js +4 -15
  524. package/dist/utils/kamino.js.map +1 -1
  525. package/dist/utils/layout.d.ts +1 -0
  526. package/dist/utils/layout.d.ts.map +1 -0
  527. package/dist/utils/layout.js.map +1 -1
  528. package/dist/utils/lookupTable.d.ts +1 -0
  529. package/dist/utils/lookupTable.d.ts.map +1 -0
  530. package/dist/utils/lookupTable.js +14 -27
  531. package/dist/utils/lookupTable.js.map +1 -1
  532. package/dist/utils/managerTypes.d.ts +1 -0
  533. package/dist/utils/managerTypes.d.ts.map +1 -0
  534. package/dist/utils/managerTypes.js +31 -2
  535. package/dist/utils/managerTypes.js.map +1 -1
  536. package/dist/utils/oracle.d.ts +1 -0
  537. package/dist/utils/oracle.d.ts.map +1 -0
  538. package/dist/utils/oracle.js +70 -83
  539. package/dist/utils/oracle.js.map +1 -1
  540. package/dist/utils/pubkey.d.ts +1 -0
  541. package/dist/utils/pubkey.d.ts.map +1 -0
  542. package/dist/utils/pubkey.js +7 -9
  543. package/dist/utils/pubkey.js.map +1 -1
  544. package/dist/utils/rpc.d.ts +1 -0
  545. package/dist/utils/rpc.d.ts.map +1 -0
  546. package/dist/utils/rpc.js +48 -70
  547. package/dist/utils/rpc.js.map +1 -1
  548. package/dist/utils/seeds.d.ts +1 -0
  549. package/dist/utils/seeds.d.ts.map +1 -0
  550. package/dist/utils/seeds.js.map +1 -1
  551. package/dist/utils/sendTransactionsUtils.d.ts +1 -0
  552. package/dist/utils/sendTransactionsUtils.d.ts.map +1 -0
  553. package/dist/utils/sendTransactionsUtils.js +82 -82
  554. package/dist/utils/sendTransactionsUtils.js.map +1 -1
  555. package/dist/utils/slots.d.ts +1 -0
  556. package/dist/utils/slots.d.ts.map +1 -0
  557. package/dist/utils/slots.js.map +1 -1
  558. package/dist/utils/syncNative.d.ts +1 -0
  559. package/dist/utils/syncNative.d.ts.map +1 -0
  560. package/dist/utils/syncNative.js.map +1 -1
  561. package/dist/utils/userMetadata.d.ts +1 -0
  562. package/dist/utils/userMetadata.d.ts.map +1 -0
  563. package/dist/utils/userMetadata.js +40 -52
  564. package/dist/utils/userMetadata.js.map +1 -1
  565. package/package.json +9 -3
  566. package/src/classes/action.ts +2884 -0
  567. package/src/classes/curve.ts +29 -0
  568. package/src/classes/fraction.ts +65 -0
  569. package/src/classes/index.ts +10 -0
  570. package/src/classes/jupiterPerps.ts +14 -0
  571. package/src/classes/manager.ts +746 -0
  572. package/src/classes/market.ts +1459 -0
  573. package/src/classes/obligation.ts +1315 -0
  574. package/src/classes/reserve.ts +1980 -0
  575. package/src/classes/shared.ts +57 -0
  576. package/src/classes/utils.ts +192 -0
  577. package/src/classes/vault.ts +808 -0
  578. package/src/client.ts +446 -0
  579. package/src/client_kamino_manager.ts +791 -0
  580. package/src/global.d.ts +1 -0
  581. package/src/idl_codegen/accounts/LendingMarket.ts +364 -0
  582. package/src/idl_codegen/accounts/Obligation.ts +349 -0
  583. package/src/idl_codegen/accounts/ReferrerState.ts +97 -0
  584. package/src/idl_codegen/accounts/ReferrerTokenState.ts +145 -0
  585. package/src/idl_codegen/accounts/Reserve.ts +248 -0
  586. package/src/idl_codegen/accounts/ShortUrl.ts +97 -0
  587. package/src/idl_codegen/accounts/UserMetadata.ts +142 -0
  588. package/src/idl_codegen/accounts/UserState.ts +301 -0
  589. package/src/idl_codegen/accounts/index.ts +19 -0
  590. package/src/idl_codegen/errors/anchor.ts +773 -0
  591. package/src/idl_codegen/errors/custom.ts +1633 -0
  592. package/src/idl_codegen/errors/index.ts +62 -0
  593. package/src/idl_codegen/instructions/borrowObligationLiquidity.ts +82 -0
  594. package/src/idl_codegen/instructions/deleteReferrerStateAndShortUrl.ts +30 -0
  595. package/src/idl_codegen/instructions/depositObligationCollateral.ts +62 -0
  596. package/src/idl_codegen/instructions/depositReserveLiquidity.ts +90 -0
  597. package/src/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.ts +98 -0
  598. package/src/idl_codegen/instructions/flashBorrowReserveLiquidity.ts +82 -0
  599. package/src/idl_codegen/instructions/flashRepayReserveLiquidity.ts +83 -0
  600. package/src/idl_codegen/instructions/idlMissingTypes.ts +62 -0
  601. package/src/idl_codegen/instructions/index.ts +138 -0
  602. package/src/idl_codegen/instructions/initFarmsForReserve.ts +62 -0
  603. package/src/idl_codegen/instructions/initLendingMarket.ts +50 -0
  604. package/src/idl_codegen/instructions/initObligation.ts +52 -0
  605. package/src/idl_codegen/instructions/initObligationFarmsForReserve.ts +60 -0
  606. package/src/idl_codegen/instructions/initReferrerStateAndShortUrl.ts +50 -0
  607. package/src/idl_codegen/instructions/initReferrerTokenState.ts +46 -0
  608. package/src/idl_codegen/instructions/initReserve.ts +74 -0
  609. package/src/idl_codegen/instructions/initUserMetadata.ts +50 -0
  610. package/src/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.ts +139 -0
  611. package/src/idl_codegen/instructions/redeemFees.ts +50 -0
  612. package/src/idl_codegen/instructions/redeemReserveCollateral.ts +94 -0
  613. package/src/idl_codegen/instructions/refreshObligation.ts +24 -0
  614. package/src/idl_codegen/instructions/refreshObligationFarmsForReserve.ts +62 -0
  615. package/src/idl_codegen/instructions/refreshReserve.ts +40 -0
  616. package/src/idl_codegen/instructions/refreshReservesBatch.ts +29 -0
  617. package/src/idl_codegen/instructions/repayObligationLiquidity.ts +64 -0
  618. package/src/idl_codegen/instructions/requestElevationGroup.ts +40 -0
  619. package/src/idl_codegen/instructions/socializeLoss.ts +48 -0
  620. package/src/idl_codegen/instructions/updateEntireReserveConfig.ts +45 -0
  621. package/src/idl_codegen/instructions/updateLendingMarket.ts +43 -0
  622. package/src/idl_codegen/instructions/updateLendingMarketOwner.ts +28 -0
  623. package/src/idl_codegen/instructions/updateReserveConfig.ts +52 -0
  624. package/src/idl_codegen/instructions/updateSingleReserveConfig.ts +48 -0
  625. package/src/idl_codegen/instructions/withdrawObligationCollateral.ts +68 -0
  626. package/src/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.ts +102 -0
  627. package/src/idl_codegen/instructions/withdrawProtocolFee.ts +62 -0
  628. package/src/idl_codegen/instructions/withdrawReferrerFees.ts +54 -0
  629. package/src/idl_codegen/programId.ts +13 -0
  630. package/src/idl_codegen/types/AssetTier.ts +118 -0
  631. package/src/idl_codegen/types/BigFractionBytes.ts +67 -0
  632. package/src/idl_codegen/types/BorrowRateCurve.ts +60 -0
  633. package/src/idl_codegen/types/CurvePoint.ts +64 -0
  634. package/src/idl_codegen/types/ElevationGroup.ts +133 -0
  635. package/src/idl_codegen/types/FeeCalculation.ts +90 -0
  636. package/src/idl_codegen/types/InitObligationArgs.ts +61 -0
  637. package/src/idl_codegen/types/LastUpdate.ts +95 -0
  638. package/src/idl_codegen/types/ObligationCollateral.ts +128 -0
  639. package/src/idl_codegen/types/ObligationLiquidity.ts +159 -0
  640. package/src/idl_codegen/types/PriceHeuristic.ts +81 -0
  641. package/src/idl_codegen/types/PythConfiguration.ts +56 -0
  642. package/src/idl_codegen/types/ReserveCollateral.ts +104 -0
  643. package/src/idl_codegen/types/ReserveConfig.ts +467 -0
  644. package/src/idl_codegen/types/ReserveFarmKind.ts +90 -0
  645. package/src/idl_codegen/types/ReserveFees.ts +122 -0
  646. package/src/idl_codegen/types/ReserveLiquidity.ts +286 -0
  647. package/src/idl_codegen/types/ReserveStatus.ts +120 -0
  648. package/src/idl_codegen/types/ScopeConfiguration.ts +85 -0
  649. package/src/idl_codegen/types/SwitchboardConfiguration.ts +67 -0
  650. package/src/idl_codegen/types/TokenInfo.ts +190 -0
  651. package/src/idl_codegen/types/UpdateConfigMode.ts +1440 -0
  652. package/src/idl_codegen/types/UpdateLendingMarketConfigValue.ts +376 -0
  653. package/src/idl_codegen/types/UpdateLendingMarketMode.ts +570 -0
  654. package/src/idl_codegen/types/WithdrawalCaps.ts +86 -0
  655. package/src/idl_codegen/types/index.ts +276 -0
  656. package/src/idl_codegen/zero_padding/ObligationZP.ts +186 -0
  657. package/src/idl_codegen/zero_padding/index.ts +1 -0
  658. package/src/idl_codegen_jupiter_perps/accounts/Pool.ts +155 -0
  659. package/src/idl_codegen_jupiter_perps/accounts/index.ts +2 -0
  660. package/src/idl_codegen_jupiter_perps/programId.ts +7 -0
  661. package/src/idl_codegen_jupiter_perps/types/Fees.ts +130 -0
  662. package/src/idl_codegen_jupiter_perps/types/Limit.ts +72 -0
  663. package/src/idl_codegen_jupiter_perps/types/PoolApr.ts +69 -0
  664. package/src/idl_codegen_jupiter_perps/types/index.ts +6 -0
  665. package/src/idl_codegen_kamino_vault/accounts/Reserve.ts +221 -0
  666. package/src/idl_codegen_kamino_vault/accounts/VaultState.ts +214 -0
  667. package/src/idl_codegen_kamino_vault/accounts/index.ts +4 -0
  668. package/src/idl_codegen_kamino_vault/errors/anchor.ts +764 -0
  669. package/src/idl_codegen_kamino_vault/errors/custom.ts +344 -0
  670. package/src/idl_codegen_kamino_vault/errors/index.ts +49 -0
  671. package/src/idl_codegen_kamino_vault/instructions/deposit.ts +54 -0
  672. package/src/idl_codegen_kamino_vault/instructions/index.ts +10 -0
  673. package/src/idl_codegen_kamino_vault/instructions/initVault.ts +35 -0
  674. package/src/idl_codegen_kamino_vault/instructions/invest.ts +60 -0
  675. package/src/idl_codegen_kamino_vault/instructions/updateReserveAllocation.ts +58 -0
  676. package/src/idl_codegen_kamino_vault/instructions/withdraw.ts +81 -0
  677. package/src/idl_codegen_kamino_vault/programId.ts +7 -0
  678. package/src/idl_codegen_kamino_vault/types/BigFractionBytes.ts +61 -0
  679. package/src/idl_codegen_kamino_vault/types/BorrowRateCurve.ts +55 -0
  680. package/src/idl_codegen_kamino_vault/types/CurvePoint.ts +61 -0
  681. package/src/idl_codegen_kamino_vault/types/LastUpdate.ts +90 -0
  682. package/src/idl_codegen_kamino_vault/types/PriceHeuristic.ts +78 -0
  683. package/src/idl_codegen_kamino_vault/types/PythConfiguration.ts +56 -0
  684. package/src/idl_codegen_kamino_vault/types/ReserveCollateral.ts +104 -0
  685. package/src/idl_codegen_kamino_vault/types/ReserveConfig.ts +426 -0
  686. package/src/idl_codegen_kamino_vault/types/ReserveFees.ts +118 -0
  687. package/src/idl_codegen_kamino_vault/types/ReserveLiquidity.ts +268 -0
  688. package/src/idl_codegen_kamino_vault/types/ScopeConfiguration.ts +85 -0
  689. package/src/idl_codegen_kamino_vault/types/SwitchboardConfiguration.ts +64 -0
  690. package/src/idl_codegen_kamino_vault/types/TokenInfo.ts +172 -0
  691. package/src/idl_codegen_kamino_vault/types/VaultAllocation.ts +115 -0
  692. package/src/idl_codegen_kamino_vault/types/WithdrawalCaps.ts +86 -0
  693. package/src/idl_codegen_kamino_vault/types/index.ts +30 -0
  694. package/src/index.ts +1 -0
  695. package/src/lending_operations/index.ts +2 -0
  696. package/src/lending_operations/repay_with_collateral_calcs.ts +71 -0
  697. package/src/lending_operations/repay_with_collateral_operations.ts +318 -0
  698. package/src/leverage/calcs.ts +465 -0
  699. package/src/leverage/index.ts +4 -0
  700. package/src/leverage/instructions.ts +144 -0
  701. package/src/leverage/operations.ts +1814 -0
  702. package/src/leverage/utils.ts +273 -0
  703. package/src/lib.ts +9 -0
  704. package/src/referrals/index.ts +2 -0
  705. package/src/referrals/instructions.ts +114 -0
  706. package/src/referrals/operations.ts +325 -0
  707. package/src/utils/ObligationType.ts +171 -0
  708. package/src/utils/api.ts +59 -0
  709. package/src/utils/ata.ts +195 -0
  710. package/src/utils/constants.ts +81 -0
  711. package/src/utils/idl.ts +4 -0
  712. package/src/utils/index.ts +16 -0
  713. package/src/utils/instruction.ts +258 -0
  714. package/src/utils/kamino.ts +12 -0
  715. package/src/utils/layout.ts +118 -0
  716. package/src/utils/lookupTable.ts +55 -0
  717. package/src/utils/managerTypes.ts +456 -0
  718. package/src/utils/oracle.ts +338 -0
  719. package/src/utils/pubkey.ts +261 -0
  720. package/src/utils/rpc.ts +108 -0
  721. package/src/utils/seeds.ts +183 -0
  722. package/src/utils/sendTransactionsUtils.ts +207 -0
  723. package/src/utils/slots.ts +28 -0
  724. package/src/utils/syncNative.ts +22 -0
  725. package/src/utils/userMetadata.ts +401 -0
@@ -0,0 +1,1459 @@
1
+ import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';
2
+ import { KaminoObligation } from './obligation';
3
+ import { KaminoReserve } from './reserve';
4
+ import { LendingMarket, Obligation, UserMetadata, ReferrerTokenState, Reserve } from '../idl_codegen/accounts';
5
+ import {
6
+ lendingMarketAuthPda,
7
+ ObligationType,
8
+ referrerTokenStatePda,
9
+ userMetadataPda,
10
+ getTokenOracleData,
11
+ VanillaObligation,
12
+ LendingObligation,
13
+ MultiplyObligation,
14
+ LeverageObligation,
15
+ isNotNullPubkey,
16
+ getAllOracleAccounts,
17
+ PythPrices,
18
+ cacheOrGetScopePrice,
19
+ cacheOrGetPythPrices,
20
+ cacheOrGetSwitchboardPrice,
21
+ PubkeyHashMap,
22
+ CandidatePrice,
23
+ } from '../utils';
24
+ import base58 from 'bs58';
25
+ import { BN } from '@coral-xyz/anchor';
26
+ import Decimal from 'decimal.js';
27
+ import { FarmState } from '@hubbleprotocol/farms-sdk';
28
+ import { PROGRAM_ID } from '../idl_codegen/programId';
29
+ import bs58 from 'bs58';
30
+ import { OraclePrices, Scope } from '@hubbleprotocol/scope-sdk';
31
+ import { Fraction } from './fraction';
32
+ import { chunks, KaminoPrices, MintToPriceMap } from '@kamino-finance/kliquidity-sdk';
33
+ import { parseTokenSymbol } from './utils';
34
+ import SwitchboardProgram from '@switchboard-xyz/sbv2-lite';
35
+ import { ObligationZP } from '../idl_codegen/zero_padding';
36
+
37
+ export interface ReserveRewardInfo {
38
+ rewardsPerSecond: Decimal; // not lamport
39
+ rewardsRemaining: Decimal; // not lamport
40
+ rewardApr: Decimal;
41
+ rewardMint: PublicKey;
42
+ totalInvestmentUsd: Decimal;
43
+ rewardPrice: number;
44
+ }
45
+
46
+ export class KaminoMarket {
47
+ private readonly connection: Connection;
48
+
49
+ readonly address: string;
50
+
51
+ state: LendingMarket;
52
+
53
+ reserves: Map<PublicKey, KaminoReserve>;
54
+
55
+ reservesActive: Map<PublicKey, KaminoReserve>;
56
+
57
+ readonly programId: PublicKey;
58
+
59
+ scope: Scope;
60
+
61
+ private readonly recentSlotDurationMs: number;
62
+
63
+ private constructor(
64
+ connection: Connection,
65
+ state: LendingMarket,
66
+ marketAddress: string,
67
+ reserves: Map<PublicKey, KaminoReserve>,
68
+ scope: Scope,
69
+ recentSlotDurationMs: number,
70
+ programId: PublicKey = PROGRAM_ID
71
+ ) {
72
+ this.address = marketAddress;
73
+ this.connection = connection;
74
+ this.state = state;
75
+ this.reserves = reserves;
76
+ this.reservesActive = getReservesActive(this.reserves);
77
+ this.programId = programId;
78
+ this.scope = scope;
79
+ this.recentSlotDurationMs = recentSlotDurationMs;
80
+ }
81
+
82
+ /**
83
+ * Load a new market with all of its associated reserves
84
+ * @param connection
85
+ * @param marketAddress
86
+ * @param programId
87
+ * @param setupLocalTest
88
+ */
89
+ static async load(
90
+ connection: Connection,
91
+ marketAddress: PublicKey,
92
+ recentSlotDurationMs: number,
93
+ programId: PublicKey = PROGRAM_ID,
94
+ setupLocalTest: boolean = false,
95
+ withReserves: boolean = true
96
+ ) {
97
+ const market = await LendingMarket.fetch(connection, marketAddress, programId);
98
+
99
+ if (market === null) {
100
+ return null;
101
+ }
102
+ let scope: Scope;
103
+ if (!setupLocalTest) {
104
+ scope = new Scope('mainnet-beta', connection);
105
+ } else {
106
+ scope = new Scope('localnet', connection);
107
+ }
108
+
109
+ const reserves = withReserves
110
+ ? await getReservesForMarket(marketAddress, connection, programId, recentSlotDurationMs)
111
+ : new Map<PublicKey, KaminoReserve>();
112
+
113
+ return new KaminoMarket(
114
+ connection,
115
+ market,
116
+ marketAddress.toString(),
117
+ reserves,
118
+ scope,
119
+ recentSlotDurationMs,
120
+ programId
121
+ );
122
+ }
123
+
124
+ async reload(): Promise<void> {
125
+ const market = await LendingMarket.fetch(this.connection, this.getAddress(), this.programId);
126
+ if (market === null) {
127
+ return;
128
+ }
129
+
130
+ this.state = market;
131
+ this.reserves = await getReservesForMarket(
132
+ this.getAddress(),
133
+ this.connection,
134
+ this.programId,
135
+ this.recentSlotDurationMs
136
+ );
137
+ this.reservesActive = getReservesActive(this.reserves);
138
+ }
139
+
140
+ async reloadSingleReserve(reservePk: PublicKey, accountData?: AccountInfo<Buffer>): Promise<void> {
141
+ const reserve = await getSingleReserve(reservePk, this.connection, this.recentSlotDurationMs, accountData);
142
+ this.reserves.set(reservePk, reserve);
143
+ this.reservesActive.set(reservePk, reserve);
144
+ }
145
+
146
+ /**
147
+ * Get the address of this market
148
+ * @return market address public key
149
+ */
150
+ getAddress(): PublicKey {
151
+ return new PublicKey(this.address);
152
+ }
153
+
154
+ /**
155
+ * Get a list of reserves for this market
156
+ */
157
+ getReserves(): Array<KaminoReserve> {
158
+ return [...this.reserves.values()];
159
+ }
160
+
161
+ getElevationGroup(elevationGroup: number) {
162
+ return this.state.elevationGroups[elevationGroup - 1];
163
+ }
164
+
165
+ getMinNetValueObligation(): Decimal {
166
+ return new Fraction(this.state.minNetValueInObligationSf).toDecimal();
167
+ }
168
+
169
+ /**
170
+ * Get the authority PDA of this market
171
+ * @return market authority public key
172
+ */
173
+ getLendingMarketAuthority(): PublicKey {
174
+ return lendingMarketAuthPda(this.getAddress(), this.programId)[0];
175
+ }
176
+
177
+ async getObligationDepositByWallet(
178
+ owner: PublicKey,
179
+ mint: PublicKey,
180
+ obligationType: ObligationType
181
+ ): Promise<Decimal> {
182
+ const obligation = await this.getObligationByWallet(owner, obligationType);
183
+ return obligation?.getDepositByMint(mint)?.amount ?? new Decimal(0);
184
+ }
185
+
186
+ async getObligationBorrowByWallet(
187
+ owner: PublicKey,
188
+ mint: PublicKey,
189
+ obligationType: ObligationType
190
+ ): Promise<Decimal> {
191
+ const obligation = await this.getObligationByWallet(owner, obligationType);
192
+ return obligation?.getBorrowByMint(mint)?.amount ?? new Decimal(0);
193
+ }
194
+
195
+ getTotalDepositTVL(): Decimal {
196
+ let tvl = new Decimal(0);
197
+ for (const reserve of this.reserves.values()) {
198
+ tvl = tvl.add(reserve.getDepositTvl());
199
+ }
200
+ return tvl;
201
+ }
202
+
203
+ getTotalBorrowTVL(): Decimal {
204
+ let tvl = new Decimal(0);
205
+ for (const reserve of this.reserves.values()) {
206
+ tvl = tvl.add(reserve.getBorrowTvl());
207
+ }
208
+ return tvl;
209
+ }
210
+
211
+ getMaxLeverageForPair(collTokenMint: PublicKey, debtTokenMint: PublicKey): number {
212
+ const { maxLtv: maxCollateralLtv, borrowFactor } = this.getMaxAndLiquidationLtvAndBorrowFactorForPair(
213
+ collTokenMint,
214
+ debtTokenMint
215
+ );
216
+
217
+ const maxLeverage =
218
+ // const ltv = (coll * ltv_factor) / (debt * borrow_factor);
219
+ 1 / (1 - (maxCollateralLtv * 100) / (borrowFactor * 100));
220
+
221
+ return maxLeverage;
222
+ }
223
+
224
+ getMaxAndLiquidationLtvAndBorrowFactorForPair(
225
+ collTokenMint: PublicKey,
226
+ debtTokenMint: PublicKey
227
+ ): { maxLtv: number; liquidationLtv: number; borrowFactor: number } {
228
+ const collReserve: KaminoReserve | undefined = this.getReserveByMint(collTokenMint);
229
+ const debtReserve: KaminoReserve | undefined = this.getReserveByMint(debtTokenMint);
230
+
231
+ if (!collReserve || !debtReserve) {
232
+ throw Error('Could not find one of the reserves.');
233
+ }
234
+
235
+ const groupsColl = new Set(collReserve.state.config.elevationGroups);
236
+ const groupsDebt = new Set(debtReserve.state.config.elevationGroups);
237
+ const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.has(item) && item !== 0);
238
+
239
+ // Ltv factor for coll token
240
+ const maxCollateralLtv =
241
+ commonElevationGroups.length === 0
242
+ ? collReserve.state.config.loanToValuePct
243
+ : this.state.elevationGroups
244
+ .filter((e) => commonElevationGroups.includes(e.id))
245
+ .reduce((acc, elem) => Math.max(acc, elem.ltvPct), 0);
246
+
247
+ const liquidationLtv =
248
+ commonElevationGroups.length === 0
249
+ ? collReserve.state.config.liquidationThresholdPct
250
+ : this.state.elevationGroups
251
+ .filter((e) => commonElevationGroups.includes(e.id))
252
+ .reduce((acc, elem) => Math.max(acc, elem.liquidationThresholdPct), 0);
253
+
254
+ const borrowFactor =
255
+ commonElevationGroups.length === 0 ? debtReserve?.state.config.borrowFactorPct.toNumber() / 100 : 1;
256
+
257
+ return { maxLtv: maxCollateralLtv / 100, liquidationLtv: liquidationLtv / 100, borrowFactor };
258
+ }
259
+
260
+ async getTotalProductTvl(
261
+ productType: ObligationType
262
+ ): Promise<{ tvl: Decimal; borrows: Decimal; deposits: Decimal; avgLeverage: Decimal }> {
263
+ let obligations = (await this.getAllObligationsForMarket(productType.toArgs().tag)).filter(
264
+ (obligation) =>
265
+ obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)
266
+ );
267
+
268
+ switch (productType.toArgs().tag) {
269
+ case VanillaObligation.tag: {
270
+ break;
271
+ }
272
+ case LendingObligation.tag: {
273
+ const mint = productType.toArgs().seed1;
274
+ obligations = obligations.filter((obligation) => obligation.getDepositByMint(mint) !== undefined);
275
+ break;
276
+ }
277
+ case MultiplyObligation.tag:
278
+ case LeverageObligation.tag: {
279
+ const collMint = productType.toArgs().seed1;
280
+ const debtMint = productType.toArgs().seed2;
281
+ obligations = obligations.filter(
282
+ (obligation) =>
283
+ obligation.getDepositByMint(collMint) !== undefined && obligation.getBorrowByMint(debtMint) !== undefined
284
+ );
285
+ break;
286
+ }
287
+ default:
288
+ throw new Error('Invalid obligation type');
289
+ }
290
+
291
+ const deposits = obligations.reduce(
292
+ (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalDeposit),
293
+ new Decimal(0)
294
+ );
295
+ const borrows = obligations.reduce(
296
+ (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalBorrow),
297
+ new Decimal(0)
298
+ );
299
+ const avgLeverage = obligations.reduce(
300
+ (acc, obligations) => acc.plus(obligations.refreshedStats.leverage),
301
+ new Decimal(0)
302
+ );
303
+ return { tvl: deposits.sub(borrows), deposits, borrows, avgLeverage: avgLeverage.div(obligations.length) };
304
+ }
305
+
306
+ /**
307
+ *
308
+ * @returns Number of active obligations in the market
309
+ */
310
+ async getNumberOfObligations() {
311
+ return (await this.getAllObligationsForMarket())
312
+ .filter(
313
+ (obligation) =>
314
+ obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)
315
+ )
316
+ .reduce((acc, _obligation) => acc + 1, 0);
317
+ }
318
+
319
+ async getObligationByWallet(publicKey: PublicKey, obligationType: ObligationType): Promise<KaminoObligation | null> {
320
+ const { address } = this;
321
+ if (!address) {
322
+ throw Error('Market must be initialized to call initialize.');
323
+ }
324
+ const obligationAddress = obligationType.toPda(this.getAddress(), publicKey);
325
+ return KaminoObligation.load(this, obligationAddress);
326
+ }
327
+
328
+ /**
329
+ * @returns The max borrowable amount for leverage positions
330
+ */
331
+ async getMaxLeverageBorrowableAmount(
332
+ collReserve: KaminoReserve,
333
+ debtReserve: KaminoReserve,
334
+ slot: number,
335
+ requestElevationGroup: boolean,
336
+ obligation?: KaminoObligation
337
+ ): Promise<Decimal> {
338
+ return obligation
339
+ ? obligation.getMaxBorrowAmount(this, debtReserve.getLiquidityMint(), slot, requestElevationGroup)
340
+ : debtReserve.getMaxBorrowAmountWithCollReserve(this, collReserve, slot);
341
+ }
342
+
343
+ async loadReserves() {
344
+ const addresses = [...this.reserves.keys()];
345
+ const reserveAccounts = await this.connection.getMultipleAccountsInfo(addresses, 'processed');
346
+ const deserializedReserves = reserveAccounts.map((reserve, i) => {
347
+ if (reserve === null) {
348
+ // maybe reuse old here
349
+ throw new Error(`Reserve account ${addresses[i].toBase58()} was not found`);
350
+ }
351
+ const reserveAccount = Reserve.decode(reserve.data);
352
+ if (!reserveAccount) {
353
+ throw Error(`Could not parse reserve ${addresses[i].toBase58()}`);
354
+ }
355
+ return reserveAccount;
356
+ });
357
+ const reservesAndOracles = await getTokenOracleData(this.connection, deserializedReserves);
358
+ const kaminoReserves = new PubkeyHashMap<PublicKey, KaminoReserve>();
359
+ reservesAndOracles.forEach(([reserve, oracle], index) => {
360
+ if (!oracle) {
361
+ throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);
362
+ }
363
+ const kaminoReserve = KaminoReserve.initialize(
364
+ reserveAccounts[index]!,
365
+ addresses[index],
366
+ reserve,
367
+ oracle,
368
+ this.connection,
369
+ this.recentSlotDurationMs
370
+ );
371
+ kaminoReserves.set(kaminoReserve.address, kaminoReserve);
372
+ });
373
+ this.reserves = kaminoReserves;
374
+ this.reservesActive = getReservesActive(this.reserves);
375
+ }
376
+
377
+ async refreshAll() {
378
+ const promises = [this.getReserves().every((reserve) => reserve.stats) ? this.loadReserves() : null].filter(
379
+ (x) => x
380
+ );
381
+
382
+ await Promise.all(promises);
383
+
384
+ this.reservesActive = getReservesActive(this.reserves);
385
+ }
386
+
387
+ getReserveByAddress(address: PublicKey) {
388
+ return this.reserves.get(address);
389
+ }
390
+
391
+ getReserveByMint(address: PublicKey) {
392
+ for (const reserve of this.reserves.values()) {
393
+ if (reserve.getLiquidityMint().equals(address)) {
394
+ return reserve;
395
+ }
396
+ }
397
+ return undefined;
398
+ }
399
+
400
+ getReserveBySymbol(symbol: string) {
401
+ for (const reserve of this.reserves.values()) {
402
+ if (reserve.symbol === symbol) {
403
+ return reserve;
404
+ }
405
+ }
406
+ return undefined;
407
+ }
408
+
409
+ getReserveMintBySymbol(symbol: string) {
410
+ return this.getReserveBySymbol(symbol)?.getLiquidityMint();
411
+ }
412
+
413
+ async getReserveFarmInfo(
414
+ mint: PublicKey,
415
+ getRewardPrice: (mint: PublicKey) => Promise<number>
416
+ ): Promise<{ borrowingRewards: ReserveRewardInfo; depositingRewards: ReserveRewardInfo }> {
417
+ const { address } = this;
418
+ if (!address) {
419
+ throw Error('Market must be initialized to call initialize.');
420
+ }
421
+ if (!this.getReserves().every((reserve) => reserve.stats)) {
422
+ await this.loadReserves();
423
+ }
424
+
425
+ // Find the reserve
426
+ const kaminoReserve = this.getReserveByMint(mint);
427
+
428
+ if (!kaminoReserve) {
429
+ throw Error(`Could not find reserve. ${mint}`);
430
+ }
431
+
432
+ const totalDepositAmount = lamportsToNumberDecimal(
433
+ kaminoReserve.getLiquidityAvailableAmount(),
434
+ kaminoReserve.stats.decimals
435
+ );
436
+ const totalBorrowAmount = lamportsToNumberDecimal(kaminoReserve.getBorrowedAmount(), kaminoReserve.stats.decimals);
437
+
438
+ const collateralFarmAddress = kaminoReserve.state.farmCollateral;
439
+ const debtFarmAddress = kaminoReserve.state.farmDebt;
440
+
441
+ const result = {
442
+ borrowingRewards: {
443
+ rewardsPerSecond: new Decimal(0),
444
+ rewardsRemaining: new Decimal(0),
445
+ rewardApr: new Decimal(0),
446
+ rewardMint: PublicKey.default,
447
+ totalInvestmentUsd: new Decimal(0),
448
+ rewardPrice: 0,
449
+ },
450
+ depositingRewards: {
451
+ rewardsPerSecond: new Decimal(0),
452
+ rewardsRemaining: new Decimal(0),
453
+ rewardApr: new Decimal(0),
454
+ rewardMint: PublicKey.default,
455
+ totalInvestmentUsd: new Decimal(0),
456
+ rewardPrice: 0,
457
+ },
458
+ };
459
+
460
+ if (isNotNullPubkey(collateralFarmAddress)) {
461
+ result.depositingRewards = await this.getRewardInfoForFarm(
462
+ collateralFarmAddress,
463
+ totalDepositAmount,
464
+ getRewardPrice
465
+ );
466
+ }
467
+ if (isNotNullPubkey(debtFarmAddress)) {
468
+ result.depositingRewards = await this.getRewardInfoForFarm(debtFarmAddress, totalBorrowAmount, getRewardPrice);
469
+ }
470
+
471
+ return result;
472
+ }
473
+
474
+ async getRewardInfoForFarm(
475
+ farmAddress: PublicKey,
476
+ totalInvestmentUsd: Decimal,
477
+ getRewardPrice: (mint: PublicKey) => Promise<number>
478
+ ): Promise<ReserveRewardInfo> {
479
+ const farmState = await FarmState.fetch(this.connection, farmAddress);
480
+ if (!farmState) {
481
+ throw Error(`Could not parse farm state. ${farmAddress}`);
482
+ }
483
+ const { token, rewardsAvailable, rewardScheduleCurve } = farmState.rewardInfos[0];
484
+ // TODO: marius fix
485
+ const rewardPerSecondLamports = rewardScheduleCurve.points[0].rewardPerTimeUnit.toNumber();
486
+ const { mint, decimals: rewardDecimals } = token;
487
+ const rewardPriceUsd = await getRewardPrice(mint);
488
+ const rewardApr = this.calculateRewardAPR(
489
+ rewardPerSecondLamports,
490
+ rewardPriceUsd,
491
+ totalInvestmentUsd,
492
+ rewardDecimals.toNumber()
493
+ );
494
+
495
+ return {
496
+ rewardsPerSecond: new Decimal(rewardPerSecondLamports).dividedBy(10 ** rewardDecimals.toNumber()),
497
+ rewardsRemaining: new Decimal(rewardsAvailable.toNumber()).dividedBy(10 ** rewardDecimals.toNumber()),
498
+ rewardApr: rewardsAvailable.toNumber() > 0 ? rewardApr : new Decimal(0),
499
+ rewardMint: mint,
500
+ totalInvestmentUsd,
501
+ rewardPrice: rewardPriceUsd,
502
+ };
503
+ }
504
+
505
+ calculateRewardAPR(
506
+ rewardPerSecondLamports: number,
507
+ rewardPriceUsd: number,
508
+ totalInvestmentUsd: Decimal,
509
+ rewardDecimals: number
510
+ ): Decimal {
511
+ const rewardsPerYear = new Decimal(rewardPerSecondLamports)
512
+ .dividedBy(10 ** rewardDecimals)
513
+ .times(365 * 24 * 60 * 60)
514
+ .times(rewardPriceUsd);
515
+
516
+ return rewardsPerYear.dividedBy(totalInvestmentUsd);
517
+ }
518
+
519
+ /**
520
+ * Get all obligations for lending market, optionally filter by obligation tag
521
+ * This function will likely require an RPC capable of returning more than the default 100k rows in a single scan
522
+ *
523
+ * @param tag
524
+ */
525
+ async getAllObligationsForMarket(tag?: number): Promise<KaminoObligation[]> {
526
+ const { getProgramAccounts } = await import('../utils/rpc');
527
+ const filters = [
528
+ {
529
+ dataSize: Obligation.layout.span + 8,
530
+ },
531
+ {
532
+ memcmp: {
533
+ offset: 32,
534
+ bytes: this.address,
535
+ },
536
+ },
537
+ ];
538
+
539
+ if (tag !== undefined) {
540
+ filters.push({
541
+ memcmp: {
542
+ offset: 8,
543
+ bytes: base58.encode(new BN(tag).toBuffer()),
544
+ },
545
+ });
546
+ }
547
+
548
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
549
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
550
+
551
+ const [slot, obligations] = await Promise.all([
552
+ this.connection.getSlot(),
553
+ getProgramAccounts(this.connection, this.programId, {
554
+ commitment: this.connection.commitment ?? 'processed',
555
+ filters,
556
+ dataSlice: { offset: 0, length: ObligationZP.layout.span + 8 }, // truncate the padding
557
+ }),
558
+ ]);
559
+
560
+ return obligations.map((obligation) => {
561
+ if (obligation.account === null) {
562
+ throw new Error('Invalid account');
563
+ }
564
+
565
+ const obligationAccount = ObligationZP.decode(obligation.account.data);
566
+ if (!obligationAccount) {
567
+ throw Error('Could not parse obligation.');
568
+ }
569
+
570
+ KaminoObligation.addRatesForObligation(
571
+ this,
572
+ obligationAccount,
573
+ collateralExchangeRates,
574
+ cumulativeBorrowRates,
575
+ slot
576
+ );
577
+ return new KaminoObligation(
578
+ this,
579
+ obligation.pubkey,
580
+ obligationAccount,
581
+ collateralExchangeRates,
582
+ cumulativeBorrowRates
583
+ );
584
+ });
585
+ }
586
+
587
+ /**
588
+ * Get all obligations for lending market from an async generator filled with batches of 100 obligations each
589
+ * @param tag
590
+ * @example
591
+ * const obligationsGenerator = market.batchGetAllObligationsForMarket();
592
+ * for await (const obligations of obligationsGenerator) {
593
+ * console.log('got a batch of # obligations:', obligations.length);
594
+ * }
595
+ */
596
+ async *batchGetAllObligationsForMarket(tag?: number): AsyncGenerator<KaminoObligation[], void, unknown> {
597
+ const filters = [
598
+ {
599
+ dataSize: Obligation.layout.span + 8,
600
+ },
601
+ {
602
+ memcmp: {
603
+ offset: 32,
604
+ bytes: this.address,
605
+ },
606
+ },
607
+ ];
608
+
609
+ if (tag !== undefined) {
610
+ filters.push({
611
+ memcmp: {
612
+ offset: 8,
613
+ bytes: base58.encode(new BN(tag).toBuffer()),
614
+ },
615
+ });
616
+ }
617
+
618
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
619
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
620
+
621
+ const [obligationPubkeys, slot] = await Promise.all([
622
+ this.connection.getProgramAccounts(this.programId, {
623
+ filters,
624
+ dataSlice: { offset: 0, length: 0 },
625
+ }),
626
+ this.connection.getSlot(),
627
+ ]);
628
+
629
+ for (const batch of chunks(
630
+ obligationPubkeys.map((x) => x.pubkey),
631
+ 100
632
+ )) {
633
+ const obligationAccounts = await this.connection.getMultipleAccountsInfo(batch);
634
+ const obligationsBatch: KaminoObligation[] = [];
635
+ for (let i = 0; i < obligationAccounts.length; i++) {
636
+ const obligation = obligationAccounts[i];
637
+ const pubkey = batch[i];
638
+ if (obligation === null) {
639
+ continue;
640
+ }
641
+
642
+ const obligationAccount = Obligation.decode(obligation.data);
643
+
644
+ if (!obligationAccount) {
645
+ throw Error(`Could not decode obligation ${pubkey.toString()}`);
646
+ }
647
+
648
+ KaminoObligation.addRatesForObligation(
649
+ this,
650
+ obligationAccount,
651
+ collateralExchangeRates,
652
+ cumulativeBorrowRates,
653
+ slot
654
+ );
655
+ obligationsBatch.push(
656
+ new KaminoObligation(this, pubkey, obligationAccount, collateralExchangeRates, cumulativeBorrowRates)
657
+ );
658
+ }
659
+ yield obligationsBatch;
660
+ }
661
+ }
662
+
663
+ async getAllObligationsByTag(tag: number, market: PublicKey) {
664
+ const [slot, obligations] = await Promise.all([
665
+ this.connection.getSlot(),
666
+ this.connection.getProgramAccounts(this.programId, {
667
+ filters: [
668
+ {
669
+ dataSize: Obligation.layout.span + 8,
670
+ },
671
+ {
672
+ memcmp: {
673
+ offset: 8,
674
+ bytes: base58.encode(new BN(tag).toBuffer()),
675
+ },
676
+ },
677
+ {
678
+ memcmp: {
679
+ offset: 32,
680
+ bytes: market.toBase58(),
681
+ },
682
+ },
683
+ ],
684
+ }),
685
+ ]);
686
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
687
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
688
+
689
+ return obligations.map((obligation) => {
690
+ if (obligation.account === null) {
691
+ throw new Error('Invalid account');
692
+ }
693
+ if (!obligation.account.owner.equals(this.programId)) {
694
+ throw new Error("account doesn't belong to this program");
695
+ }
696
+
697
+ const obligationAccount = Obligation.decode(obligation.account.data);
698
+
699
+ if (!obligationAccount) {
700
+ throw Error('Could not parse obligation.');
701
+ }
702
+
703
+ KaminoObligation.addRatesForObligation(
704
+ this,
705
+ obligationAccount,
706
+ collateralExchangeRates,
707
+ cumulativeBorrowRates,
708
+ slot
709
+ );
710
+
711
+ return new KaminoObligation(
712
+ this,
713
+ obligation.pubkey,
714
+ obligationAccount,
715
+ collateralExchangeRates,
716
+ cumulativeBorrowRates
717
+ );
718
+ });
719
+ }
720
+
721
+ async getAllUserObligations(user: PublicKey) {
722
+ const [currentSlot, obligations] = await Promise.all([
723
+ this.connection.getSlot(),
724
+ this.connection.getProgramAccounts(this.programId, {
725
+ filters: [
726
+ {
727
+ dataSize: Obligation.layout.span + 8,
728
+ },
729
+ {
730
+ memcmp: {
731
+ offset: 0,
732
+ bytes: bs58.encode(Obligation.discriminator),
733
+ },
734
+ },
735
+ {
736
+ memcmp: {
737
+ offset: 64,
738
+ bytes: user.toBase58(),
739
+ },
740
+ },
741
+ {
742
+ memcmp: {
743
+ offset: 32,
744
+ bytes: this.address,
745
+ },
746
+ },
747
+ ],
748
+ }),
749
+ ]);
750
+
751
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
752
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
753
+ return obligations.map((obligation) => {
754
+ if (obligation.account === null) {
755
+ throw new Error('Invalid account');
756
+ }
757
+ if (!obligation.account.owner.equals(this.programId)) {
758
+ throw new Error("account doesn't belong to this program");
759
+ }
760
+
761
+ const obligationAccount = Obligation.decode(obligation.account.data);
762
+
763
+ if (!obligationAccount) {
764
+ throw Error('Could not parse obligation.');
765
+ }
766
+
767
+ KaminoObligation.addRatesForObligation(
768
+ this,
769
+ obligationAccount,
770
+ collateralExchangeRates,
771
+ cumulativeBorrowRates,
772
+ currentSlot
773
+ );
774
+ return new KaminoObligation(
775
+ this,
776
+ obligation.pubkey,
777
+ obligationAccount,
778
+ collateralExchangeRates,
779
+ cumulativeBorrowRates
780
+ );
781
+ });
782
+ }
783
+
784
+ async getAllUserObligationsForReserve(user: PublicKey, reserve: PublicKey): Promise<KaminoObligation[]> {
785
+ const obligationAddresses: PublicKey[] = [];
786
+ obligationAddresses.push(new VanillaObligation(this.programId).toPda(this.getAddress(), user));
787
+ const targetReserve = new PubkeyHashMap<PublicKey, KaminoReserve>(Array.from(this.reserves.entries())).get(reserve);
788
+ if (!targetReserve) {
789
+ throw Error('Could not find reserve.');
790
+ }
791
+ for (const [key, kaminoReserve] of this.reserves) {
792
+ if (targetReserve.address.equals(key)) {
793
+ // skip target reserve
794
+ continue;
795
+ }
796
+ obligationAddresses.push(
797
+ new MultiplyObligation(
798
+ targetReserve.getLiquidityMint(),
799
+ kaminoReserve.getLiquidityMint(),
800
+ this.programId
801
+ ).toPda(this.getAddress(), user)
802
+ );
803
+ obligationAddresses.push(
804
+ new MultiplyObligation(
805
+ kaminoReserve.getLiquidityMint(),
806
+ targetReserve.getLiquidityMint(),
807
+ this.programId
808
+ ).toPda(this.getAddress(), user)
809
+ );
810
+ obligationAddresses.push(
811
+ new LeverageObligation(
812
+ targetReserve.getLiquidityMint(),
813
+ kaminoReserve.getLiquidityMint(),
814
+ this.programId
815
+ ).toPda(this.getAddress(), user)
816
+ );
817
+ obligationAddresses.push(
818
+ new LeverageObligation(
819
+ kaminoReserve.getLiquidityMint(),
820
+ targetReserve.getLiquidityMint(),
821
+ this.programId
822
+ ).toPda(this.getAddress(), user)
823
+ );
824
+ }
825
+ const batchSize = 100;
826
+ const finalObligations: KaminoObligation[] = [];
827
+ for (let batchStart = 0; batchStart < obligationAddresses.length; batchStart += batchSize) {
828
+ const obligations = await this.getMultipleObligationsByAddress(
829
+ obligationAddresses.slice(batchStart, batchStart + batchSize)
830
+ );
831
+ obligations.forEach((obligation) => {
832
+ if (obligation !== null) {
833
+ for (const deposits of obligation.deposits.keys()) {
834
+ if (deposits.equals(reserve)) {
835
+ finalObligations.push(obligation);
836
+ }
837
+ }
838
+ for (const borrows of obligation.borrows.keys()) {
839
+ if (borrows.equals(reserve)) {
840
+ finalObligations.push(obligation);
841
+ }
842
+ }
843
+ }
844
+ });
845
+ }
846
+
847
+ return finalObligations;
848
+ }
849
+
850
+ async getUserVanillaObligation(user: PublicKey): Promise<KaminoObligation> {
851
+ const vanillaObligationAddress = new VanillaObligation(this.programId).toPda(this.getAddress(), user);
852
+
853
+ const obligation = await this.getObligationByAddress(vanillaObligationAddress);
854
+
855
+ if (!obligation) {
856
+ throw new Error('Could not find vanilla obligation.');
857
+ }
858
+
859
+ return obligation;
860
+ }
861
+
862
+ isReserveInObligation(obligation: KaminoObligation, reserve: PublicKey): boolean {
863
+ for (const deposits of obligation.deposits.keys()) {
864
+ if (deposits.equals(reserve)) {
865
+ return true;
866
+ }
867
+ }
868
+ for (const borrows of obligation.borrows.keys()) {
869
+ if (borrows.equals(reserve)) {
870
+ return true;
871
+ }
872
+ }
873
+
874
+ return false;
875
+ }
876
+
877
+ async getUserObligationsByTag(tag: number, user: PublicKey): Promise<KaminoObligation[]> {
878
+ const [currentSlot, obligations] = await Promise.all([
879
+ this.connection.getSlot(),
880
+ this.connection.getProgramAccounts(this.programId, {
881
+ filters: [
882
+ {
883
+ dataSize: Obligation.layout.span + 8,
884
+ },
885
+ {
886
+ memcmp: {
887
+ offset: 8,
888
+ bytes: base58.encode(new BN(tag).toBuffer()),
889
+ },
890
+ },
891
+ {
892
+ memcmp: {
893
+ offset: 32,
894
+ bytes: this.address,
895
+ },
896
+ },
897
+ {
898
+ memcmp: {
899
+ offset: 64,
900
+ bytes: user.toBase58(),
901
+ },
902
+ },
903
+ ],
904
+ }),
905
+ ]);
906
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
907
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
908
+ return obligations.map((obligation) => {
909
+ if (obligation.account === null) {
910
+ throw new Error('Invalid account');
911
+ }
912
+ if (!obligation.account.owner.equals(this.programId)) {
913
+ throw new Error("account doesn't belong to this program");
914
+ }
915
+
916
+ const obligationAccount = Obligation.decode(obligation.account.data);
917
+
918
+ if (!obligationAccount) {
919
+ throw Error('Could not parse obligation.');
920
+ }
921
+ KaminoObligation.addRatesForObligation(
922
+ this,
923
+ obligationAccount,
924
+ collateralExchangeRates,
925
+ cumulativeBorrowRates,
926
+ currentSlot
927
+ );
928
+ return new KaminoObligation(
929
+ this,
930
+ obligation.pubkey,
931
+ obligationAccount,
932
+ collateralExchangeRates,
933
+ cumulativeBorrowRates
934
+ );
935
+ });
936
+ }
937
+
938
+ async getObligationByAddress(address: PublicKey) {
939
+ if (!this.getReserves().every((reserve) => reserve.stats)) {
940
+ await this.loadReserves();
941
+ }
942
+ return KaminoObligation.load(this, address);
943
+ }
944
+
945
+ async getMultipleObligationsByAddress(addresses: PublicKey[]) {
946
+ return KaminoObligation.loadAll(this, addresses);
947
+ }
948
+
949
+ /**
950
+ * Get the user metadata PDA and fetch and return the user metadata state if it exists
951
+ * @return [address, userMetadataState] - The address of the user metadata PDA and the user metadata state, or null if it doesn't exist
952
+ */
953
+ async getUserMetadata(user: PublicKey): Promise<[PublicKey, UserMetadata | null]> {
954
+ const [address, _bump] = userMetadataPda(user, this.programId);
955
+
956
+ const userMetadata = await UserMetadata.fetch(this.connection, address, this.programId);
957
+
958
+ return [address, userMetadata];
959
+ }
960
+
961
+ async getReferrerTokenStateForReserve(
962
+ referrer: PublicKey,
963
+ reserve: PublicKey
964
+ ): Promise<[PublicKey, ReferrerTokenState | null]> {
965
+ const [address, _bump] = referrerTokenStatePda(referrer, reserve, this.programId);
966
+
967
+ const referrerTokenState = await ReferrerTokenState.fetch(this.connection, address, this.programId);
968
+
969
+ return [address, referrerTokenState];
970
+ }
971
+
972
+ async getAllReferrerTokenStates(referrer: PublicKey) {
973
+ const referrerTokenStates = await this.connection.getProgramAccounts(this.programId, {
974
+ filters: [
975
+ {
976
+ dataSize: ReferrerTokenState.layout.span + 8,
977
+ },
978
+ {
979
+ memcmp: {
980
+ offset: 8,
981
+ bytes: referrer.toBase58(),
982
+ },
983
+ },
984
+ ],
985
+ });
986
+
987
+ const referrerTokenStatesForMints = new PubkeyHashMap<PublicKey, ReferrerTokenState>();
988
+
989
+ referrerTokenStates.forEach((referrerTokenState) => {
990
+ if (referrerTokenState.account === null) {
991
+ throw new Error('Invalid account');
992
+ }
993
+ if (!referrerTokenState.account.owner.equals(this.programId)) {
994
+ throw new Error("account doesn't belong to this program");
995
+ }
996
+
997
+ const referrerTokenStateDecoded = ReferrerTokenState.decode(referrerTokenState.account.data);
998
+
999
+ if (!referrerTokenStateDecoded) {
1000
+ throw Error('Could not parse obligation.');
1001
+ }
1002
+
1003
+ referrerTokenStatesForMints.set(referrerTokenStateDecoded.mint, referrerTokenStateDecoded);
1004
+ });
1005
+
1006
+ return referrerTokenStatesForMints;
1007
+ }
1008
+
1009
+ async getAllReferrerFeesUnclaimed(referrer: PublicKey) {
1010
+ const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);
1011
+
1012
+ const referrerFeesUnclaimedForMints = new PubkeyHashMap<PublicKey, Decimal>();
1013
+
1014
+ for (const mint of referrerTokenStatesForMints.keys()) {
1015
+ referrerFeesUnclaimedForMints.set(
1016
+ mint,
1017
+ new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()
1018
+ );
1019
+ }
1020
+
1021
+ return referrerFeesUnclaimedForMints;
1022
+ }
1023
+
1024
+ async getReferrerFeesUnclaimedForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {
1025
+ const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);
1026
+ return referrerTokenState ? new Fraction(referrerTokenState.amountUnclaimedSf).toDecimal() : new Decimal(0);
1027
+ }
1028
+
1029
+ async getReferrerFeesCumulativeForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {
1030
+ const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);
1031
+ return referrerTokenState ? new Fraction(referrerTokenState.amountCumulativeSf).toDecimal() : new Decimal(0);
1032
+ }
1033
+
1034
+ async getAllReferrerFeesCumulative(referrer: PublicKey) {
1035
+ const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);
1036
+
1037
+ const referrerFeesCumulativeForMints = new PubkeyHashMap<PublicKey, Decimal>();
1038
+
1039
+ for (const mint of referrerTokenStatesForMints.keys()) {
1040
+ referrerFeesCumulativeForMints.set(
1041
+ mint,
1042
+ new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()
1043
+ );
1044
+ }
1045
+
1046
+ return referrerFeesCumulativeForMints;
1047
+ }
1048
+
1049
+ async getReferrerUrl(baseUrl: string, referrer: PublicKey) {
1050
+ return baseUrl + this.encodeReferrer(referrer);
1051
+ }
1052
+
1053
+ async getReferrerFromUrl(baseUrl: string, url: string) {
1054
+ return this.decodeReferrer(url.split(baseUrl)[1]);
1055
+ }
1056
+
1057
+ async encodeReferrer(referrer: PublicKey) {
1058
+ return bs58.encode(referrer.toBuffer());
1059
+ }
1060
+
1061
+ async decodeReferrer(encoded_referrer: string) {
1062
+ const referrer_buffer = bs58.decode(encoded_referrer);
1063
+ return new PublicKey(referrer_buffer.toString());
1064
+ }
1065
+
1066
+ /**
1067
+ * Get the underlying connection passed when instantiating this market
1068
+ * @return connection
1069
+ */
1070
+ getConnection() {
1071
+ return this.connection;
1072
+ }
1073
+
1074
+ /**
1075
+ * Get all Scope prices used by all the market reserves
1076
+ */
1077
+ async getAllScopePrices(oraclePrices?: OraclePrices): Promise<KaminoPrices> {
1078
+ if (!oraclePrices) {
1079
+ oraclePrices = await this.scope.getOraclePrices();
1080
+ }
1081
+ const spot: MintToPriceMap = {};
1082
+ const twaps: MintToPriceMap = {};
1083
+ for (const reserve of this.reserves.values()) {
1084
+ const tokenMint = reserve.getLiquidityMint().toString();
1085
+ const tokenName = reserve.getTokenSymbol();
1086
+ const oracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;
1087
+ const chain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;
1088
+ const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);
1089
+ if (oracle && isNotNullPubkey(oracle) && chain && Scope.isScopeChainValid(chain)) {
1090
+ const spotPrice = await this.scope.getPriceFromChain(chain, oraclePrices);
1091
+ spot[tokenMint] = { price: spotPrice.price, name: tokenName };
1092
+ }
1093
+ if (oracle && isNotNullPubkey(oracle) && twapChain && Scope.isScopeChainValid(twapChain)) {
1094
+ const twap = await this.scope.getPriceFromChain(twapChain, oraclePrices);
1095
+ twaps[tokenMint] = { price: twap.price, name: tokenName };
1096
+ }
1097
+ }
1098
+ return { spot, twap: twaps };
1099
+ }
1100
+
1101
+ /**
1102
+ * Get all Scope/Pyth/Switchboard prices used by all the market reserves
1103
+ */
1104
+ async getAllPrices(): Promise<KlendPrices> {
1105
+ const klendPrices: KlendPrices = {
1106
+ scope: { spot: {}, twap: {} },
1107
+ pyth: { spot: {}, twap: {} },
1108
+ switchboard: { spot: {}, twap: {} },
1109
+ };
1110
+ const allOracleAccounts = await getAllOracleAccounts(
1111
+ this.connection,
1112
+ this.getReserves().map((x) => x.state)
1113
+ );
1114
+ const pythCache = new PubkeyHashMap<PublicKey, PythPrices>();
1115
+ const switchboardCache = new PubkeyHashMap<PublicKey, CandidatePrice>();
1116
+ const scopeCache = new PubkeyHashMap<PublicKey, OraclePrices>();
1117
+
1118
+ const switchboardV2 = await SwitchboardProgram.loadMainnet(this.connection);
1119
+
1120
+ for (const reserve of this.reserves.values()) {
1121
+ const tokenMint = reserve.getLiquidityMint().toString();
1122
+ const tokenName = reserve.getTokenSymbol();
1123
+ const scopeOracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;
1124
+ const spotChain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;
1125
+ const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);
1126
+ const pythOracle = reserve.state.config.tokenInfo.pythConfiguration.price;
1127
+ const switchboardSpotOracle = reserve.state.config.tokenInfo.switchboardConfiguration.priceAggregator;
1128
+ const switchboardTwapOracle = reserve.state.config.tokenInfo.switchboardConfiguration.twapAggregator;
1129
+
1130
+ if (isNotNullPubkey(scopeOracle)) {
1131
+ const scopePrices = {
1132
+ spot: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, spotChain),
1133
+ twap: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, twapChain),
1134
+ };
1135
+ this.setPriceIfExist(klendPrices.scope, scopePrices.spot, scopePrices.twap, tokenMint, tokenName);
1136
+ }
1137
+ if (isNotNullPubkey(pythOracle)) {
1138
+ const pythPrices = cacheOrGetPythPrices(pythOracle, pythCache, allOracleAccounts);
1139
+ this.setPriceIfExist(klendPrices.pyth, pythPrices?.spot, pythPrices?.twap, tokenMint, tokenName);
1140
+ }
1141
+ if (isNotNullPubkey(switchboardSpotOracle)) {
1142
+ const switchboardPrices = {
1143
+ spot: cacheOrGetSwitchboardPrice(switchboardSpotOracle, switchboardCache, allOracleAccounts, switchboardV2),
1144
+ twap: isNotNullPubkey(switchboardTwapOracle)
1145
+ ? cacheOrGetSwitchboardPrice(switchboardTwapOracle, switchboardCache, allOracleAccounts, switchboardV2)
1146
+ : null,
1147
+ };
1148
+ this.setPriceIfExist(
1149
+ klendPrices.switchboard,
1150
+ switchboardPrices.spot,
1151
+ switchboardPrices.twap,
1152
+ tokenMint,
1153
+ tokenName
1154
+ );
1155
+ }
1156
+ }
1157
+ return klendPrices;
1158
+ }
1159
+
1160
+ getCumulativeBorrowRatesByReserve(slot: number): Map<PublicKey, Decimal> {
1161
+ const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();
1162
+ for (const reserve of this.reserves.values()) {
1163
+ cumulativeBorrowRates.set(
1164
+ reserve.address,
1165
+ reserve.getEstimatedCumulativeBorrowRate(slot, this.state.referralFeeBps)
1166
+ );
1167
+ }
1168
+ return cumulativeBorrowRates;
1169
+ }
1170
+
1171
+ getCollateralExchangeRatesByReserve(slot: number): Map<PublicKey, Decimal> {
1172
+ const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();
1173
+ for (const reserve of this.reserves.values()) {
1174
+ collateralExchangeRates.set(
1175
+ reserve.address,
1176
+ reserve.getEstimatedCollateralExchangeRate(slot, this.state.referralFeeBps)
1177
+ );
1178
+ }
1179
+ return collateralExchangeRates;
1180
+ }
1181
+
1182
+ private setPriceIfExist(
1183
+ prices: KaminoPrices,
1184
+ spot: CandidatePrice | null | undefined,
1185
+ twap: CandidatePrice | null | undefined,
1186
+ mint: string,
1187
+ tokenName: string
1188
+ ) {
1189
+ if (spot) {
1190
+ prices.spot[mint] = { price: spot.price, name: tokenName };
1191
+ }
1192
+ if (twap) {
1193
+ prices.twap[mint] = { price: twap.price, name: tokenName };
1194
+ }
1195
+ }
1196
+
1197
+ getRecentSlotDurationMs(): number {
1198
+ return this.recentSlotDurationMs;
1199
+ }
1200
+
1201
+ /* Returns all elevation groups except the default one */
1202
+ getMarketElevationGroupDescriptions(): ElevationGroupDescription[] {
1203
+ const elevationGroups: ElevationGroupDescription[] = [];
1204
+
1205
+ // Partially build
1206
+ for (const elevationGroup of this.state.elevationGroups) {
1207
+ if (elevationGroup.id === 0) {
1208
+ continue;
1209
+ }
1210
+ elevationGroups.push({
1211
+ collateralReserves: [],
1212
+ collateralLiquidityMints: [],
1213
+ debtReserve: elevationGroup.debtReserve.toString(),
1214
+ debtLiquidityMint: '',
1215
+ elevationGroup: elevationGroup.id,
1216
+ });
1217
+ }
1218
+
1219
+ // Fill the remaining
1220
+ for (const reserve of this.reserves.values()) {
1221
+ const reserveLiquidityMint = reserve.getLiquidityMint();
1222
+ const reserveAddress = reserve.address.toString();
1223
+ const reserveElevationGroups = reserve.state.config.elevationGroups;
1224
+ for (const elevationGroupId of reserveElevationGroups) {
1225
+ if (elevationGroupId === 0) {
1226
+ continue;
1227
+ }
1228
+
1229
+ const elevationGroupDescription = elevationGroups[elevationGroupId - 1];
1230
+ if (elevationGroupDescription) {
1231
+ if (reserveAddress === elevationGroupDescription.debtReserve) {
1232
+ elevationGroups[elevationGroupId - 1].debtLiquidityMint = reserveLiquidityMint.toString();
1233
+ } else {
1234
+ elevationGroups[elevationGroupId - 1].collateralReserves.push(reserveAddress);
1235
+ elevationGroups[elevationGroupId - 1].collateralLiquidityMints.push(reserveLiquidityMint.toString());
1236
+ }
1237
+ } else {
1238
+ throw new Error(`Invalid elevation group id ${elevationGroupId} at reserve ${reserveAddress}`);
1239
+ }
1240
+ }
1241
+ }
1242
+
1243
+ return elevationGroups;
1244
+ }
1245
+
1246
+ /* Returns all elevation groups for a given combination of liquidity mints, except the default one */
1247
+ getElevationGroupsForMintsCombination(
1248
+ collLiquidityMints: PublicKey[],
1249
+ debtLiquidityMint?: PublicKey
1250
+ ): ElevationGroupDescription[] {
1251
+ const allElevationGroups = this.getMarketElevationGroupDescriptions();
1252
+
1253
+ return allElevationGroups.filter((elevationGroupDescription) => {
1254
+ return (
1255
+ collLiquidityMints.every((mint) =>
1256
+ elevationGroupDescription.collateralLiquidityMints.includes(mint.toString())
1257
+ ) &&
1258
+ (debtLiquidityMint == undefined || debtLiquidityMint.toString() === elevationGroupDescription.debtLiquidityMint)
1259
+ );
1260
+ });
1261
+ }
1262
+
1263
+ /* Returns all elevation groups for a given combination of reserves, except the default one */
1264
+ getElevationGroupsForReservesCombination(
1265
+ collReserves: PublicKey[],
1266
+ debtReserve?: PublicKey
1267
+ ): ElevationGroupDescription[] {
1268
+ const allElevationGroups = this.getMarketElevationGroupDescriptions();
1269
+
1270
+ return allElevationGroups.filter((elevationGroupDescription) => {
1271
+ return (
1272
+ collReserves.every((mint) => elevationGroupDescription.collateralReserves.includes(mint.toString())) &&
1273
+ (debtReserve == undefined || debtReserve.toString() === elevationGroupDescription.debtReserve)
1274
+ );
1275
+ });
1276
+ }
1277
+ }
1278
+
1279
+ export type BorrowCapsAndCounters = {
1280
+ // Utilization cap
1281
+ utilizationCap: Decimal;
1282
+ utilizationCurrentValue: Decimal;
1283
+
1284
+ // Daily borrow cap
1285
+ netWithdrawalCap: Decimal;
1286
+ netWithdrawalCurrentValue: Decimal;
1287
+ netWithdrawalLastUpdateTs: Decimal;
1288
+ netWithdrawalIntervalDurationSeconds: Decimal;
1289
+
1290
+ // Global cap
1291
+ globalDebtCap: Decimal;
1292
+ globalTotalBorrowed: Decimal;
1293
+
1294
+ // Debt outside emode cap
1295
+ debtOutsideEmodeCap: Decimal;
1296
+ borrowedOutsideEmode: Decimal;
1297
+
1298
+ // Debt against collateral caps
1299
+ debtAgainstCollateralReserveCaps: {
1300
+ collateralReserve: PublicKey;
1301
+ elevationGroup: number;
1302
+ maxDebt: Decimal;
1303
+ currentValue: Decimal;
1304
+ }[];
1305
+ };
1306
+
1307
+ export type ElevationGroupDescription = {
1308
+ collateralReserves: string[];
1309
+ collateralLiquidityMints: string[];
1310
+ debtReserve: string;
1311
+ debtLiquidityMint: string;
1312
+ elevationGroup: number;
1313
+ };
1314
+
1315
+ export type KlendPrices = {
1316
+ scope: KaminoPrices;
1317
+ pyth: KaminoPrices;
1318
+ switchboard: KaminoPrices;
1319
+ };
1320
+
1321
+ export async function getReservesForMarket(
1322
+ marketAddress: PublicKey,
1323
+ connection: Connection,
1324
+ programId: PublicKey,
1325
+ recentSlotDurationMs: number
1326
+ ): Promise<Map<PublicKey, KaminoReserve>> {
1327
+ const reserves = await connection.getProgramAccounts(programId, {
1328
+ filters: [
1329
+ {
1330
+ dataSize: Reserve.layout.span + 8,
1331
+ },
1332
+ {
1333
+ memcmp: {
1334
+ offset: 32,
1335
+ bytes: marketAddress.toBase58(),
1336
+ },
1337
+ },
1338
+ ],
1339
+ });
1340
+ const deserializedReserves = reserves.map((reserve) => {
1341
+ if (reserve.account === null) {
1342
+ throw new Error(`Reserve account ${reserve.pubkey.toBase58()} does not exist`);
1343
+ }
1344
+
1345
+ const reserveAccount = Reserve.decode(reserve.account.data);
1346
+
1347
+ if (!reserveAccount) {
1348
+ throw Error(`Could not parse reserve ${reserve.pubkey.toBase58()}`);
1349
+ }
1350
+ return reserveAccount;
1351
+ });
1352
+ const allBuffers = reserves.map((reserve) => reserve.account);
1353
+ const reservesAndOracles = await getTokenOracleData(connection, deserializedReserves);
1354
+ const reservesByAddress = new PubkeyHashMap<PublicKey, KaminoReserve>();
1355
+ reservesAndOracles.forEach(([reserve, oracle], index) => {
1356
+ if (!oracle) {
1357
+ throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);
1358
+ }
1359
+ const kaminoReserve = KaminoReserve.initialize(
1360
+ allBuffers[index],
1361
+ reserves[index].pubkey,
1362
+ reserve,
1363
+ oracle,
1364
+ connection,
1365
+ recentSlotDurationMs
1366
+ );
1367
+ reservesByAddress.set(kaminoReserve.address, kaminoReserve);
1368
+ });
1369
+ return reservesByAddress;
1370
+ }
1371
+
1372
+ export async function getSingleReserve(
1373
+ reservePk: PublicKey,
1374
+ connection: Connection,
1375
+ recentSlotDurationMs: number,
1376
+ accountData?: AccountInfo<Buffer>
1377
+ ): Promise<KaminoReserve> {
1378
+ const reserve = accountData ? accountData : await connection.getAccountInfo(reservePk);
1379
+
1380
+ if (reserve === null) {
1381
+ throw new Error(`Reserve account ${reservePk.toBase58()} does not exist`);
1382
+ }
1383
+
1384
+ const reserveAccount = Reserve.decode(reserve.data);
1385
+
1386
+ if (!reserveAccount) {
1387
+ throw Error(`Could not parse reserve ${reservePk.toBase58()}`);
1388
+ }
1389
+
1390
+ const reservesAndOracles = await getTokenOracleData(connection, [reserveAccount]);
1391
+ const [reserveState, oracle] = reservesAndOracles[0];
1392
+
1393
+ if (!oracle) {
1394
+ throw Error(`Could not find oracle for ${parseTokenSymbol(reserveState.config.tokenInfo.name)} reserve`);
1395
+ }
1396
+ const kaminoReserve = KaminoReserve.initialize(
1397
+ reserve,
1398
+ reservePk,
1399
+ reserveState,
1400
+ oracle,
1401
+ connection,
1402
+ recentSlotDurationMs
1403
+ );
1404
+
1405
+ return kaminoReserve;
1406
+ }
1407
+
1408
+ export function getReservesActive(reserves: Map<PublicKey, KaminoReserve>): Map<PublicKey, KaminoReserve> {
1409
+ const reservesActive = new PubkeyHashMap<PublicKey, KaminoReserve>();
1410
+ for (const [key, reserve] of reserves) {
1411
+ if (reserve.state.config.status === 0) {
1412
+ reservesActive.set(key, reserve);
1413
+ }
1414
+ }
1415
+ return reservesActive;
1416
+ }
1417
+
1418
+ export async function getReserveFromMintAndMarket(
1419
+ connection: Connection,
1420
+ market: KaminoMarket,
1421
+ mint: string,
1422
+ programId: PublicKey = PROGRAM_ID
1423
+ ): Promise<[PublicKey, AccountInfo<Buffer>]> {
1424
+ const reserve = (
1425
+ await connection.getProgramAccounts(programId, {
1426
+ filters: [
1427
+ {
1428
+ dataSize: Reserve.layout.span + 8,
1429
+ },
1430
+ {
1431
+ memcmp: {
1432
+ offset: 32,
1433
+ bytes: market.address,
1434
+ },
1435
+ },
1436
+ {
1437
+ memcmp: {
1438
+ offset: 128,
1439
+ bytes: mint,
1440
+ },
1441
+ },
1442
+ ],
1443
+ })
1444
+ )[0];
1445
+
1446
+ if (reserve.account === null) {
1447
+ throw new Error('Invalid account');
1448
+ }
1449
+ if (!reserve.account.owner.equals(programId)) {
1450
+ throw new Error("Account doesn't belong to this program");
1451
+ }
1452
+
1453
+ return [reserve.pubkey, reserve.account];
1454
+ }
1455
+
1456
+ const lamportsToNumberDecimal = (amount: Decimal.Value, decimals: number): Decimal => {
1457
+ const factor = 10 ** decimals;
1458
+ return new Decimal(amount).div(factor);
1459
+ };