@hobba-io/core 0.1.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 (190) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +87 -0
  3. package/dist/amountUtils.d.ts +15 -0
  4. package/dist/amountUtils.d.ts.map +1 -0
  5. package/dist/amountUtils.js +59 -0
  6. package/dist/amountUtils.js.map +1 -0
  7. package/dist/constants.d.ts +148 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +231 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +7 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +29 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/executeAction.d.ts +36 -0
  16. package/dist/executeAction.d.ts.map +1 -0
  17. package/dist/executeAction.js +606 -0
  18. package/dist/executeAction.js.map +1 -0
  19. package/dist/executeDepositBorrow.d.ts +49 -0
  20. package/dist/executeDepositBorrow.d.ts.map +1 -0
  21. package/dist/executeDepositBorrow.js +444 -0
  22. package/dist/executeDepositBorrow.js.map +1 -0
  23. package/dist/idl/hobba.json +5072 -0
  24. package/dist/idl.d.ts +783 -0
  25. package/dist/idl.d.ts.map +1 -0
  26. package/dist/idl.js +7 -0
  27. package/dist/idl.js.map +1 -0
  28. package/dist/index.d.ts +17 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +22 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/juplend/accountResolvers.d.ts +106 -0
  33. package/dist/juplend/accountResolvers.d.ts.map +1 -0
  34. package/dist/juplend/accountResolvers.js +148 -0
  35. package/dist/juplend/accountResolvers.js.map +1 -0
  36. package/dist/juplend/operateRemaining.d.ts +11 -0
  37. package/dist/juplend/operateRemaining.d.ts.map +1 -0
  38. package/dist/juplend/operateRemaining.js +46 -0
  39. package/dist/juplend/operateRemaining.js.map +1 -0
  40. package/dist/juplend/positionInit.d.ts +34 -0
  41. package/dist/juplend/positionInit.d.ts.map +1 -0
  42. package/dist/juplend/positionInit.js +56 -0
  43. package/dist/juplend/positionInit.js.map +1 -0
  44. package/dist/juplend/positionParser.d.ts +8 -0
  45. package/dist/juplend/positionParser.d.ts.map +1 -0
  46. package/dist/juplend/positionParser.js +30 -0
  47. package/dist/juplend/positionParser.js.map +1 -0
  48. package/dist/juplend/sdkApi.d.ts +39 -0
  49. package/dist/juplend/sdkApi.d.ts.map +1 -0
  50. package/dist/juplend/sdkApi.js +68 -0
  51. package/dist/juplend/sdkApi.js.map +1 -0
  52. package/dist/juplend/tickMath.d.ts +19 -0
  53. package/dist/juplend/tickMath.d.ts.map +1 -0
  54. package/dist/juplend/tickMath.js +91 -0
  55. package/dist/juplend/tickMath.js.map +1 -0
  56. package/dist/juplend/tickUtils.d.ts +20 -0
  57. package/dist/juplend/tickUtils.d.ts.map +1 -0
  58. package/dist/juplend/tickUtils.js +115 -0
  59. package/dist/juplend/tickUtils.js.map +1 -0
  60. package/dist/juplend/vaultConfigParser.d.ts +25 -0
  61. package/dist/juplend/vaultConfigParser.d.ts.map +1 -0
  62. package/dist/juplend/vaultConfigParser.js +38 -0
  63. package/dist/juplend/vaultConfigParser.js.map +1 -0
  64. package/dist/kamino/accountResolvers.d.ts +110 -0
  65. package/dist/kamino/accountResolvers.d.ts.map +1 -0
  66. package/dist/kamino/accountResolvers.js +220 -0
  67. package/dist/kamino/accountResolvers.js.map +1 -0
  68. package/dist/kamino/obligationParser.d.ts +13 -0
  69. package/dist/kamino/obligationParser.d.ts.map +1 -0
  70. package/dist/kamino/obligationParser.js +92 -0
  71. package/dist/kamino/obligationParser.js.map +1 -0
  72. package/dist/kamino/refreshInstructions.d.ts +4 -0
  73. package/dist/kamino/refreshInstructions.d.ts.map +1 -0
  74. package/dist/kamino/refreshInstructions.js +32 -0
  75. package/dist/kamino/refreshInstructions.js.map +1 -0
  76. package/dist/limits.d.ts +87 -0
  77. package/dist/limits.d.ts.map +1 -0
  78. package/dist/limits.js +174 -0
  79. package/dist/limits.js.map +1 -0
  80. package/dist/marketConfig.d.ts +35 -0
  81. package/dist/marketConfig.d.ts.map +1 -0
  82. package/dist/marketConfig.js +85 -0
  83. package/dist/marketConfig.js.map +1 -0
  84. package/dist/oracle/scopePrice.d.ts +7 -0
  85. package/dist/oracle/scopePrice.d.ts.map +1 -0
  86. package/dist/oracle/scopePrice.js +31 -0
  87. package/dist/oracle/scopePrice.js.map +1 -0
  88. package/dist/pdas.d.ts +33 -0
  89. package/dist/pdas.d.ts.map +1 -0
  90. package/dist/pdas.js +116 -0
  91. package/dist/pdas.js.map +1 -0
  92. package/dist/position.d.ts +45 -0
  93. package/dist/position.d.ts.map +1 -0
  94. package/dist/position.js +68 -0
  95. package/dist/position.js.map +1 -0
  96. package/dist/positionMetrics.d.ts +108 -0
  97. package/dist/positionMetrics.d.ts.map +1 -0
  98. package/dist/positionMetrics.js +238 -0
  99. package/dist/positionMetrics.js.map +1 -0
  100. package/dist/program.d.ts +12 -0
  101. package/dist/program.d.ts.map +1 -0
  102. package/dist/program.js +24 -0
  103. package/dist/program.js.map +1 -0
  104. package/dist/quote.d.ts +90 -0
  105. package/dist/quote.d.ts.map +1 -0
  106. package/dist/quote.js +198 -0
  107. package/dist/quote.js.map +1 -0
  108. package/dist/rates/borrowRates.d.ts +44 -0
  109. package/dist/rates/borrowRates.d.ts.map +1 -0
  110. package/dist/rates/borrowRates.js +229 -0
  111. package/dist/rates/borrowRates.js.map +1 -0
  112. package/dist/rates/collateralInfo.d.ts +21 -0
  113. package/dist/rates/collateralInfo.d.ts.map +1 -0
  114. package/dist/rates/collateralInfo.js +104 -0
  115. package/dist/rates/collateralInfo.js.map +1 -0
  116. package/dist/rates/constants.d.ts +22 -0
  117. package/dist/rates/constants.d.ts.map +1 -0
  118. package/dist/rates/constants.js +70 -0
  119. package/dist/rates/constants.js.map +1 -0
  120. package/dist/rates/index.d.ts +11 -0
  121. package/dist/rates/index.d.ts.map +1 -0
  122. package/dist/rates/index.js +11 -0
  123. package/dist/rates/index.js.map +1 -0
  124. package/dist/rates/kaminoApi.d.ts +24 -0
  125. package/dist/rates/kaminoApi.d.ts.map +1 -0
  126. package/dist/rates/kaminoApi.js +98 -0
  127. package/dist/rates/kaminoApi.js.map +1 -0
  128. package/dist/rates/supplyRates.d.ts +23 -0
  129. package/dist/rates/supplyRates.d.ts.map +1 -0
  130. package/dist/rates/supplyRates.js +67 -0
  131. package/dist/rates/supplyRates.js.map +1 -0
  132. package/dist/transactionBuilder.d.ts +5 -0
  133. package/dist/transactionBuilder.d.ts.map +1 -0
  134. package/dist/transactionBuilder.js +287 -0
  135. package/dist/transactionBuilder.js.map +1 -0
  136. package/dist/txHelpers.d.ts +16 -0
  137. package/dist/txHelpers.d.ts.map +1 -0
  138. package/dist/txHelpers.js +82 -0
  139. package/dist/txHelpers.js.map +1 -0
  140. package/dist/userState.d.ts +21 -0
  141. package/dist/userState.d.ts.map +1 -0
  142. package/dist/userState.js +60 -0
  143. package/dist/userState.js.map +1 -0
  144. package/dist/vault/vaultAccounts.d.ts +82 -0
  145. package/dist/vault/vaultAccounts.d.ts.map +1 -0
  146. package/dist/vault/vaultAccounts.js +275 -0
  147. package/dist/vault/vaultAccounts.js.map +1 -0
  148. package/dist/wallet.d.ts +12 -0
  149. package/dist/wallet.d.ts.map +1 -0
  150. package/dist/wallet.js +2 -0
  151. package/dist/wallet.js.map +1 -0
  152. package/package.json +63 -0
  153. package/src/amountUtils.ts +69 -0
  154. package/src/constants.ts +263 -0
  155. package/src/errors.ts +33 -0
  156. package/src/executeAction.ts +884 -0
  157. package/src/executeDepositBorrow.ts +677 -0
  158. package/src/idl/hobba.json +5072 -0
  159. package/src/idl.ts +7 -0
  160. package/src/index.ts +21 -0
  161. package/src/juplend/accountResolvers.ts +207 -0
  162. package/src/juplend/operateRemaining.ts +81 -0
  163. package/src/juplend/positionInit.ts +86 -0
  164. package/src/juplend/positionParser.ts +41 -0
  165. package/src/juplend/sdkApi.ts +112 -0
  166. package/src/juplend/tickMath.ts +82 -0
  167. package/src/juplend/tickUtils.ts +163 -0
  168. package/src/juplend/vaultConfigParser.ts +45 -0
  169. package/src/kamino/accountResolvers.ts +299 -0
  170. package/src/kamino/obligationParser.ts +123 -0
  171. package/src/kamino/refreshInstructions.ts +45 -0
  172. package/src/limits.ts +222 -0
  173. package/src/marketConfig.ts +139 -0
  174. package/src/oracle/scopePrice.ts +31 -0
  175. package/src/pdas.ts +226 -0
  176. package/src/position.ts +131 -0
  177. package/src/positionMetrics.ts +387 -0
  178. package/src/program.ts +30 -0
  179. package/src/quote.ts +310 -0
  180. package/src/rates/borrowRates.ts +270 -0
  181. package/src/rates/collateralInfo.ts +136 -0
  182. package/src/rates/constants.ts +87 -0
  183. package/src/rates/index.ts +38 -0
  184. package/src/rates/kaminoApi.ts +134 -0
  185. package/src/rates/supplyRates.ts +102 -0
  186. package/src/transactionBuilder.ts +324 -0
  187. package/src/txHelpers.ts +107 -0
  188. package/src/userState.ts +91 -0
  189. package/src/vault/vaultAccounts.ts +365 -0
  190. package/src/wallet.ts +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateralInfo.js","sourceRoot":"","sources":["../../src/rates/collateralInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EACzB,QAAQ,EACR,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,mEAAmE;AACnE,MAAM,mBAAmB,GAA2B;IAClD,KAAK,EAAE,8CAA8C;IACrD,GAAG,EAAE,6CAA6C;CACnD,CAAC;AAUF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAsB,EACtB,oBAA4B;IAE5B,gEAAgE;IAChE,MAAM,oBAAoB,GAA2B,EAAE,CAAC;IACxD,MAAM,cAAc,GAA0C,EAAE,CAAC;IACjE,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE;QACrE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACzE,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;gBACnD,MAAM,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;gBAC7E,oBAAoB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;gBACxC,cAAc,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,2BAA2B,GAA2B,EAAE,CAAC;IAC/D,MAAM,sBAAsB,GAA+B;QACzD,CAAC,KAAK,EAAE,QAAQ,CAAC;QACjB,CAAC,OAAO,EAAE,UAAU,CAAC;KACtB,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,SAAS,CAAC,sBAAsB,CACjD,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EACzC,yBAAyB,CAC1B,CAAC,CAAC,CAAC,CAAC;YACL,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,EAAE,SAAS,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;gBACpE,2BAA2B,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,0EAA0E;IAC1E,MAAM,4BAA4B,GAA2B,EAAE,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;YAC7E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAU,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,eAAe,GAA4B;gBAC/C,CAAC,KAAK,EAAE,oBAAoB,CAAC;gBAC7B,CAAC,OAAO,EAAE,gBAAgB,CAAC;aAC5B,CAAC;YACF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC;gBAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,kDAAkD;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,GAAG,CAAC;gBACxF,IAAI,OAAO,GAAG,CAAC;oBAAE,4BAA4B,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,6EAA6E;IAC7E,MAAM,qBAAqB,GAAiD,EAAE,CAAC;IAC/E,MAAM,mBAAmB,GAA+B;QACtD,CAAC,OAAO,EAAE,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,KAAK,EAAE,2BAA2B,CAAC,oBAAoB,CAAC,CAAC;KAC3D,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,qBAAqB,CAAC,KAAK,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,oBAAoB;QACpB,cAAc;QACd,2BAA2B;QAC3B,4BAA4B;QAC5B,qBAAqB;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared vault-to-reserves mappings and borrow market definitions.
3
+ * Single source of truth used by /api/rates, /api/supply-rates, and /api/market-data.
4
+ */
5
+ export interface VaultReserveDef {
6
+ name: string;
7
+ id: string;
8
+ vault: string;
9
+ sharesMint: string;
10
+ reserves: string[];
11
+ }
12
+ export interface BorrowMarketDef {
13
+ name: string;
14
+ provider: "kamino" | "juplend";
15
+ usdcReserve: string;
16
+ cbbtcReserve?: string;
17
+ }
18
+ export declare const VAULT_RESERVE_MAP: VaultReserveDef[];
19
+ export declare const BORROW_MARKET_DEFS: BorrowMarketDef[];
20
+ export declare const JUPLEND_USDC_RESERVE = "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu";
21
+ export declare const JUPLEND_VAULT_STATE_ADDR = "HnSMEmypWgJ1a6JNnBycccsBeQQvqNKphgSMquCaFiy9";
22
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rates/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA2C9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAkB/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,gDAAgD,CAAC;AAClF,eAAO,MAAM,wBAAwB,iDAAiD,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared vault-to-reserves mappings and borrow market definitions.
3
+ * Single source of truth used by /api/rates, /api/supply-rates, and /api/market-data.
4
+ */
5
+ export const VAULT_RESERVE_MAP = [
6
+ {
7
+ name: "Allez USDC",
8
+ id: "allez",
9
+ vault: "A1USdzqDHmw5oz97AkqAGLxEQZfFjASZFuy4T6Qdvnpo",
10
+ sharesMint: "BDh5h1uqhdL3pdCcTB1AEc2dyRsorDx9fF8Y72H1XZu8",
11
+ reserves: [
12
+ "D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59", // Main Market
13
+ "Ga4rZytCpq1unD4DbEJ5bkHeUz9g3oh9AAFEi6vSauXp", // Altcoin
14
+ "9FRZvAsjDJ6WM8BJ2S45h9PoDCLAq8DNY9zZDX7MyGzT", // JLP
15
+ "9TD2TSv4pENb8VwfbVYg25jvym7HN6iuAR6pFNSrKjqQ", // Market 4
16
+ "F22tnLsbv66vEU2GZRc7coaqZsr8UcBbyp9V2kqWAiWK", // Market 5
17
+ "Atj6UREVWa7WxbF2EMKNyfmYUY1U1txughe2gjhcPDCo", // Market 6
18
+ "9GJ9GBRwCp4pHmWrQ43L5xpc9Vykg7jnfwcFGN8FoHYu", // Market 7
19
+ "ALnjBHECcdBsSwgVJ6A8pFEZ15qxE5jJQriCXSKT3Bte", // Market 8
20
+ "4QKFoFDzNFnvfkzVazABbCEfMwd3y1pZqUVzmpnkCphj", // Market 9
21
+ "AYL4LMc4ZCVyq3Z7XPJGWDM4H9PiWjqXAAuuHBEGVR2Z", // Market 10
22
+ "CxvpximovDBSPXhPj4VXechMWEV5G2DtuKwa9v9Hswrc", // Market 11
23
+ ],
24
+ },
25
+ {
26
+ name: "Prime USDC",
27
+ id: "prime",
28
+ vault: "HDsayqAsDWy3QvANGqh2yNraqcD8Fnjgh73Mhb3WRS5E",
29
+ sharesMint: "7D8C5pDFxug58L9zkwK7bCiDg4kD4AygzbcZUmf5usHS",
30
+ reserves: [
31
+ "Ga4rZytCpq1unD4DbEJ5bkHeUz9g3oh9AAFEi6vSauXp", // Altcoin
32
+ "D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59", // Main Market
33
+ "9FRZvAsjDJ6WM8BJ2S45h9PoDCLAq8DNY9zZDX7MyGzT", // JLP
34
+ ],
35
+ },
36
+ {
37
+ name: "RockawayRWA USDC",
38
+ id: "rockawayRWA",
39
+ vault: "DWSXb18xZApz29vnQpgR2m6MynCT7PznaXt7Ut7M7KaP",
40
+ sharesMint: "DgHN3q3dSYAchNX7V3D4aYiTWMx8RHTgHbfPiwiqBkE9",
41
+ reserves: [
42
+ "6XdN3zXeoYKgfSeZb8h1LpiEkUXRJ3CbimE5FJ35XFBP", // RWA
43
+ "4QKFoFDzNFnvfkzVazABbCEfMwd3y1pZqUVzmpnkCphj", // Market 9
44
+ "AYL4LMc4ZCVyq3Z7XPJGWDM4H9PiWjqXAAuuHBEGVR2Z", // Market 10
45
+ "9GJ9GBRwCp4pHmWrQ43L5xpc9Vykg7jnfwcFGN8FoHYu", // Market 7
46
+ ],
47
+ },
48
+ ];
49
+ export const BORROW_MARKET_DEFS = [
50
+ {
51
+ name: "Kamino Main Market",
52
+ provider: "kamino",
53
+ usdcReserve: "D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59",
54
+ cbbtcReserve: "37Jk2zkz23vkAYBT66HM2gaqJuNg2nYLsCreQAVt5MWK",
55
+ },
56
+ {
57
+ name: "Kamino xStocks",
58
+ provider: "kamino",
59
+ usdcReserve: "97zoywd8mPZsGTg8q1wdD2Wgkdrs2tqusp1Qqcxbyj7E",
60
+ cbbtcReserve: "5AWpVYJvNASoUM8toSDQRcVyA9dvoUuFj5qNx9v32bjj",
61
+ },
62
+ {
63
+ name: "JupLend",
64
+ provider: "juplend",
65
+ usdcReserve: "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu",
66
+ },
67
+ ];
68
+ export const JUPLEND_USDC_RESERVE = "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu";
69
+ export const JUPLEND_VAULT_STATE_ADDR = "HnSMEmypWgJ1a6JNnBycccsBeQQvqNKphgSMquCaFiy9";
70
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rates/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,cAAc;YAC9D,8CAA8C,EAAE,UAAU;YAC1D,8CAA8C,EAAE,MAAM;YACtD,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,YAAY;YAC5D,8CAA8C,EAAE,YAAY;SAC7D;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,UAAU;YAC1D,8CAA8C,EAAE,cAAc;YAC9D,8CAA8C,EAAE,MAAM;SACvD;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,MAAM;YACtD,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,YAAY;YAC5D,8CAA8C,EAAE,WAAW;SAC5D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD;QACE,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,8CAA8C;QAC3D,YAAY,EAAE,8CAA8C;KAC7D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,8CAA8C;QAC3D,YAAY,EAAE,8CAA8C;KAC7D;IACD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,6CAA6C;KAC3D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,6CAA6C,CAAC;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,8CAA8C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { decodeReserve, computeKaminoBorrowRate, computeKaminoSupplyRate, computeJuplendBorrowRate, computeJuplendSupplyRate, getCollateralInfo, getCollateralLtvInfo, getJuplendCollateral, getJuplendCollateralLtvInfo, getRecentSlotDurationMs, } from "./borrowRates";
2
+ export type { BorrowRateResult, CollateralInfo, CollateralLtvInfo, CurvePoint } from "./borrowRates";
3
+ export { computeSupplyRate, computeWeightedVaultAPY, } from "./supplyRates";
4
+ export type { SupplyRateResult, VaultAPYResult } from "./supplyRates";
5
+ export { VAULT_RESERVE_MAP, BORROW_MARKET_DEFS, JUPLEND_USDC_RESERVE, JUPLEND_VAULT_STATE_ADDR, } from "./constants";
6
+ export type { VaultReserveDef, BorrowMarketDef } from "./constants";
7
+ export { fetchKaminoVaultAPYs, fetchPerenaVaultAPY } from "./kaminoApi";
8
+ export type { KaminoVaultMetrics } from "./kaminoApi";
9
+ export { computeCollateralRatesInfo } from "./collateralInfo";
10
+ export type { CollateralRatesInfo } from "./collateralInfo";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rates/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Server-leaning rate math shared by the app's API routes, the rebalancer and
2
+ // scripts. Deliberately NOT re-exported from @hobba/core's index: decodeReserve
3
+ // lazy-requires @kamino-finance/klend-sdk (heavy, effectively server-only), so
4
+ // consumers import via the subpath (`@hobba/core/rates`) to keep it out of
5
+ // browser/widget bundles.
6
+ export { decodeReserve, computeKaminoBorrowRate, computeKaminoSupplyRate, computeJuplendBorrowRate, computeJuplendSupplyRate, getCollateralInfo, getCollateralLtvInfo, getJuplendCollateral, getJuplendCollateralLtvInfo, getRecentSlotDurationMs, } from "./borrowRates";
7
+ export { computeSupplyRate, computeWeightedVaultAPY, } from "./supplyRates";
8
+ export { VAULT_RESERVE_MAP, BORROW_MARKET_DEFS, JUPLEND_USDC_RESERVE, JUPLEND_VAULT_STATE_ADDR, } from "./constants";
9
+ export { fetchKaminoVaultAPYs, fetchPerenaVaultAPY } from "./kaminoApi";
10
+ export { computeCollateralRatesInfo } from "./collateralInfo";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rates/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,0BAA0B;AAC1B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Fetch vault APYs from Kamino's public API.
3
+ * This includes base lending yield + farming rewards + incentives,
4
+ * matching what the Kamino UI displays.
5
+ */
6
+ import { Connection } from "@solana/web3.js";
7
+ export interface KaminoVaultMetrics {
8
+ name: string;
9
+ id: string;
10
+ vault: string;
11
+ supplyAPY: number;
12
+ baseAPY: number;
13
+ rewardsAPY: number;
14
+ isDisabled: boolean;
15
+ }
16
+ export declare function fetchKaminoVaultAPYs(): Promise<KaminoVaultMetrics[]>;
17
+ /**
18
+ * Fetch Perena vault APY by reading on-chain state.
19
+ * Share price is a 6-decimal fixed-point u64 (e.g. 1055691 = 1.055691 USDC per star*).
20
+ * APY is annualized from share price appreciation between a known reference point
21
+ * and the current on-chain price.
22
+ */
23
+ export declare function fetchPerenaVaultAPY(connection: Connection): Promise<KaminoVaultMetrics>;
24
+ //# sourceMappingURL=kaminoApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaminoApi.d.ts","sourceRoot":"","sources":["../../src/rates/kaminoApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAKxD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IAGnB,UAAU,EAAE,OAAO,CAAC;CACrB;AASD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAkC1E;AAwBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuC7F"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Fetch vault APYs from Kamino's public API.
3
+ * This includes base lending yield + farming rewards + incentives,
4
+ * matching what the Kamino UI displays.
5
+ */
6
+ import { PublicKey } from "@solana/web3.js";
7
+ import { VAULT_RESERVE_MAP } from "./constants";
8
+ const KAMINO_API = "https://api.kamino.finance";
9
+ export async function fetchKaminoVaultAPYs() {
10
+ const results = await Promise.all(VAULT_RESERVE_MAP.map(async (v) => {
11
+ try {
12
+ const resp = await fetch(`${KAMINO_API}/kvaults/${v.vault}/metrics`, { cache: 'no-store' });
13
+ if (!resp.ok) {
14
+ return fallback(v);
15
+ }
16
+ const data = await resp.json();
17
+ const apy = toNum(data.apy);
18
+ const farmRewards = toNum(data.apyFarmRewards);
19
+ const incentives = toNum(data.apyIncentives);
20
+ const reserveIncentives = toNum(data.apyReservesIncentives);
21
+ const rewardsAPY = farmRewards + incentives + reserveIncentives;
22
+ // Kamino's API `apy` excludes reserveIncentives; the website includes them
23
+ const totalAPY = apy + reserveIncentives;
24
+ return {
25
+ name: v.name,
26
+ id: v.id,
27
+ vault: v.vault,
28
+ supplyAPY: totalAPY * 100,
29
+ baseAPY: apy * 100,
30
+ rewardsAPY: rewardsAPY * 100,
31
+ isDisabled: true,
32
+ };
33
+ }
34
+ catch {
35
+ return fallback(v);
36
+ }
37
+ }));
38
+ return results;
39
+ }
40
+ function toNum(val) {
41
+ if (val === undefined || val === null)
42
+ return 0;
43
+ const n = typeof val === "string" ? parseFloat(val) : val;
44
+ return isNaN(n) ? 0 : n;
45
+ }
46
+ function fallback(v) {
47
+ return { name: v.name, id: v.id, vault: v.vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: true };
48
+ }
49
+ // --- Perena vault ---
50
+ const PERENA_VAULT_STATE_ADDRESS = new PublicKey("sM6P4mh53CnG4faN4Fo3seY7wMSAiHdy8o6gKjwQF7A");
51
+ const PERENA_TOTAL_SHARES_OFFSET = 200;
52
+ const PERENA_PRICE_PER_SHARE_OFFSET = 352;
53
+ // Known reference point from the Perena USD* historical price chart:
54
+ // 2026-06-25 02:00 CEST (UTC+2) = 2026-06-25 00:00:00 UTC, price per share 1.0744.
55
+ // (Verified against on-chain state: offset 352 read 1.07609 on 2026-07-01.)
56
+ const PERENA_REF_PRICE = 1.0744;
57
+ const PERENA_REF_TIMESTAMP_MS = Date.UTC(2026, 5, 25, 0, 0, 0);
58
+ /**
59
+ * Fetch Perena vault APY by reading on-chain state.
60
+ * Share price is a 6-decimal fixed-point u64 (e.g. 1055691 = 1.055691 USDC per star*).
61
+ * APY is annualized from share price appreciation between a known reference point
62
+ * and the current on-chain price.
63
+ */
64
+ export async function fetchPerenaVaultAPY(connection) {
65
+ const id = "perena";
66
+ const name = "Perena USDC";
67
+ const vault = PERENA_VAULT_STATE_ADDRESS.toBase58();
68
+ try {
69
+ const accountInfo = await connection.getAccountInfo(PERENA_VAULT_STATE_ADDRESS);
70
+ if (!accountInfo || !accountInfo.data) {
71
+ return { name, id, vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: false };
72
+ }
73
+ const data = accountInfo.data;
74
+ // Read total shares (u64 LE at offset 200)
75
+ const _totalShares = data.readBigUInt64LE(PERENA_TOTAL_SHARES_OFFSET);
76
+ // Read price per share (u64 LE at offset 352, 6-decimal fixed point)
77
+ const rawPrice = data.readBigUInt64LE(PERENA_PRICE_PER_SHARE_OFFSET);
78
+ const currentPrice = Number(rawPrice) / 1000000;
79
+ // Annualize the share-price appreciation since the reference point.
80
+ const elapsedDays = (Date.now() - PERENA_REF_TIMESTAMP_MS) / (1000 * 60 * 60 * 24);
81
+ const apy = elapsedDays > 0 && currentPrice > PERENA_REF_PRICE
82
+ ? ((currentPrice / PERENA_REF_PRICE - 1) * (365 / elapsedDays)) * 100
83
+ : 0;
84
+ return {
85
+ name,
86
+ id,
87
+ vault,
88
+ supplyAPY: apy,
89
+ baseAPY: apy,
90
+ rewardsAPY: 0,
91
+ isDisabled: false,
92
+ };
93
+ }
94
+ catch {
95
+ return { name, id, vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: false };
96
+ }
97
+ }
98
+ //# sourceMappingURL=kaminoApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaminoApi.js","sourceRoot":"","sources":["../../src/rates/kaminoApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared supply rate computation functions.
3
+ * Extracted from /api/supply-rates/route.ts to be reused by /api/market-data and the rebalancer.
4
+ */
5
+ import { decodeReserve } from "./borrowRates";
6
+ export interface SupplyRateResult {
7
+ totalDeposited: number;
8
+ utilization: number;
9
+ supplyAPY: number;
10
+ }
11
+ export interface VaultAPYResult {
12
+ name: string;
13
+ supplyAPY: number;
14
+ utilization?: number;
15
+ totalDeposited?: number;
16
+ numReserves: number;
17
+ }
18
+ export declare function computeSupplyRate(reserve: any, recentSlotDurationMs?: number): SupplyRateResult;
19
+ export declare function computeWeightedVaultAPY(reserveAddresses: string[], rateMap: Map<string, SupplyRateResult>): VaultAPYResult & {
20
+ supplyAPY: number;
21
+ };
22
+ export { decodeReserve };
23
+ //# sourceMappingURL=supplyRates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplyRates.d.ts","sourceRoot":"","sources":["../../src/rates/supplyRates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAO1D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,oBAAoB,SAA2B,GAAG,gBAAgB,CA0CjH;AAED,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrC,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CA0BxC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Shared supply rate computation functions.
3
+ * Extracted from /api/supply-rates/route.ts to be reused by /api/market-data and the rebalancer.
4
+ */
5
+ import { decodeReserve } from "./borrowRates";
6
+ const SF_SCALE = BigInt("1152921504606846976"); // 2^60
7
+ const SLOTS_PER_YEAR = 63072000;
8
+ const SLOTS_PER_SECOND = 2;
9
+ const DEFAULT_SLOT_DURATION_MS = 400;
10
+ export function computeSupplyRate(reserve, recentSlotDurationMs = DEFAULT_SLOT_DURATION_MS) {
11
+ const availableAmount = Number(reserve.liquidity.availableAmount);
12
+ const borrowedAmount = Number(BigInt(reserve.liquidity.borrowedAmountSf.toString()) / SF_SCALE);
13
+ const protocolFees = Number(BigInt(reserve.liquidity.accumulatedProtocolFeesSf.toString()) / SF_SCALE);
14
+ const referrerFees = Number(BigInt(reserve.liquidity.accumulatedReferrerFeesSf.toString()) / SF_SCALE);
15
+ const pendingFees = Number(BigInt(reserve.liquidity.pendingReferrerFeesSf.toString()) / SF_SCALE);
16
+ const totalSupply = availableAmount + borrowedAmount - protocolFees - referrerFees - pendingFees;
17
+ const utilization = totalSupply > 0 ? borrowedAmount / totalSupply : 0;
18
+ const curve = reserve.config.borrowRateCurve.points;
19
+ const utilBps = utilization * 10000;
20
+ let borrowRateBps = 0;
21
+ for (let i = 1; i < curve.length; i++) {
22
+ if (curve[i].utilizationRateBps === 0 && curve[i].borrowRateBps === 0 && i > 1)
23
+ break;
24
+ if (utilBps <= curve[i].utilizationRateBps) {
25
+ const x0 = curve[i - 1].utilizationRateBps;
26
+ const x1 = curve[i].utilizationRateBps;
27
+ const y0 = curve[i - 1].borrowRateBps;
28
+ const y1 = curve[i].borrowRateBps;
29
+ borrowRateBps = y0 + ((utilBps - x0) * (y1 - y0)) / (x1 - x0);
30
+ break;
31
+ }
32
+ }
33
+ const slotAdjustment = 1000 / SLOTS_PER_SECOND / recentSlotDurationMs;
34
+ const adjustedBorrowRate = (borrowRateBps / 10000) * slotAdjustment;
35
+ const hostFixedRate = (reserve.config.hostFixedInterestRateBps / 10000) * slotAdjustment;
36
+ const borrowAPR = adjustedBorrowRate + hostFixedRate;
37
+ const protocolTakeRate = reserve.config.protocolTakeRatePct / 100;
38
+ const supplyAPR = borrowAPR * utilization * (1 - protocolTakeRate);
39
+ const supplyAPY = Math.pow(1 + supplyAPR / SLOTS_PER_YEAR, SLOTS_PER_YEAR) - 1;
40
+ const mintDecimals = Number(reserve.liquidity.mintDecimals);
41
+ const divisor = Math.pow(10, mintDecimals);
42
+ return {
43
+ totalDeposited: totalSupply / divisor,
44
+ utilization: utilization * 100,
45
+ supplyAPY: supplyAPY * 100,
46
+ };
47
+ }
48
+ export function computeWeightedVaultAPY(reserveAddresses, rateMap) {
49
+ const reserveRates = reserveAddresses
50
+ .map((addr) => rateMap.get(addr))
51
+ .filter((r) => r != null && r.totalDeposited > 0);
52
+ if (reserveRates.length === 0) {
53
+ return { name: "", supplyAPY: 0, totalDeposited: 0, numReserves: 0 };
54
+ }
55
+ const totalWeight = reserveRates.reduce((s, r) => s + r.totalDeposited, 0);
56
+ const weightedAPY = reserveRates.reduce((s, r) => s + r.supplyAPY * (r.totalDeposited / totalWeight), 0);
57
+ const avgUtilization = reserveRates.reduce((s, r) => s + r.utilization * (r.totalDeposited / totalWeight), 0);
58
+ return {
59
+ name: "",
60
+ supplyAPY: weightedAPY,
61
+ utilization: avgUtilization,
62
+ totalDeposited: totalWeight,
63
+ numReserves: reserveRates.length,
64
+ };
65
+ }
66
+ export { decodeReserve };
67
+ //# sourceMappingURL=supplyRates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplyRates.js","sourceRoot":"","sources":["../../src/rates/supplyRates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Connection, TransactionInstruction, PublicKey } from "@solana/web3.js";
2
+ import type { HobbaSigner } from "./wallet";
3
+ export declare function sendLegacyTx(connection: Connection, instructions: TransactionInstruction[], wallet: HobbaSigner, computeUnits?: number): Promise<string>;
4
+ export declare function sendVersionedTx(connection: Connection, instructions: TransactionInstruction[], wallet: HobbaSigner, lutAddresses: PublicKey[], computeUnits?: number, skipSimulation?: boolean, rebuildOnTickError?: () => Promise<TransactionInstruction[] | null>): Promise<string>;
5
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../src/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,sBAAsB,EAKtB,SAAS,EAEV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA2B5C,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,sBAAsB,EAAE,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,sBAAsB,EAAE,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,SAAS,EAAE,EACzB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,OAAO,EAKxB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,GAClE,OAAO,CAAC,MAAM,CAAC,CA+OjB"}