@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,68 @@
1
+ import { DEFAULT_LENDING_PROVIDER, LENDING_PROVIDER_JUPLEND, XSTOCKS_MARKET, } from "./constants";
2
+ import { parseObligationDebt, parseObligationCTokens, cTokensToUnderlying, } from "./kamino/obligationParser";
3
+ import { XSTOCKS_MARKET_CONFIG, resolveMainMarketConfigByMint, } from "./marketConfig";
4
+ import { fetchUserState } from "./userState";
5
+ export function resolveKaminoMarketConfig(lendingMarket, collateralMint) {
6
+ return lendingMarket.equals(XSTOCKS_MARKET)
7
+ ? XSTOCKS_MARKET_CONFIG
8
+ : resolveMainMarketConfigByMint(collateralMint);
9
+ }
10
+ const EMPTY_POSITION = (lender) => ({
11
+ exists: false,
12
+ lender,
13
+ collateral: "0",
14
+ debtUsdc: "0",
15
+ depositedToVault: "0",
16
+ userDebtUsdc: "0",
17
+ currentVault: "none",
18
+ });
19
+ /**
20
+ * Headless position read: UserState → lender routing → obligation (Kamino,
21
+ * parsed client-side) or JupLend position (via the backend, which handles the
22
+ * tick-based debt computation). Mirrors the app's useUserState +
23
+ * useObligationData hooks.
24
+ */
25
+ export async function getPosition(params) {
26
+ const { connection, owner, collateralMint } = params;
27
+ const base = (params.apiBaseUrl ?? "").replace(/\/+$/, "");
28
+ const userState = await fetchUserState(connection, owner, collateralMint);
29
+ if (!userState) {
30
+ return EMPTY_POSITION(DEFAULT_LENDING_PROVIDER === LENDING_PROVIDER_JUPLEND ? "juplend" : "kamino");
31
+ }
32
+ const isJuplend = userState.lendingProvider === LENDING_PROVIDER_JUPLEND;
33
+ let collateral = "0";
34
+ let debtUsdc = "0";
35
+ if (isJuplend) {
36
+ const res = await fetch(`${base}/api/juplend-position?address=${userState.obligation.toBase58()}`);
37
+ if (!res.ok)
38
+ throw new Error(`juplend-position fetch failed: ${res.status}`);
39
+ const data = await res.json();
40
+ collateral = String(data.collateral ?? "0");
41
+ debtUsdc = String(data.debt ?? "0");
42
+ }
43
+ else {
44
+ const mc = resolveKaminoMarketConfig(userState.lendingMarket, collateralMint);
45
+ const [obligationInfo, reserveInfo] = await Promise.all([
46
+ connection.getAccountInfo(userState.obligation),
47
+ connection.getAccountInfo(mc.collateralReserve),
48
+ ]);
49
+ if (obligationInfo) {
50
+ debtUsdc = String(parseObligationDebt(obligationInfo.data));
51
+ const cTokens = parseObligationCTokens(obligationInfo.data);
52
+ collateral = String(reserveInfo ? cTokensToUnderlying(cTokens, reserveInfo.data) : cTokens);
53
+ }
54
+ }
55
+ const userDebt = Math.max(0, Number(debtUsdc) - userState.depositedToVault);
56
+ return {
57
+ exists: true,
58
+ lender: isJuplend ? "juplend" : "kamino",
59
+ lendingMarket: isJuplend ? undefined : userState.lendingMarket.toBase58(),
60
+ collateral,
61
+ debtUsdc,
62
+ depositedToVault: String(userState.depositedToVault),
63
+ userDebtUsdc: String(userDebt),
64
+ currentVault: userState.currentVaultType,
65
+ obligation: userState.obligation.toBase58(),
66
+ };
67
+ }
68
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../src/position.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
+ import { type HobbaPosition, type Lender } from "./position";
3
+ /**
4
+ * Display-ready dashboard metrics for a Hobba position — the exact values
5
+ * app.hobba.io renders, computed with the same logic (ported verbatim from the
6
+ * app's Dashboard.tsx). Partners render these without knowing Hobba's rate /
7
+ * operator / dust-threshold rules.
8
+ */
9
+ export interface HobbaPositionMetrics {
10
+ position: HobbaPosition;
11
+ lender: Lender;
12
+ /** Collateral price used for every USD figure below. */
13
+ collateralPriceUsd: number;
14
+ collateralUi: number;
15
+ collateralUsd: number;
16
+ /** User-visible loan (total debt minus operator-deployed capital), UI units. */
17
+ loanUsdc: number;
18
+ currentLtvPct: number;
19
+ ltvStatus: "HEALTHY" | "MODERATE" | "NEEDS_ATTENTION";
20
+ liquidationLtvPct: number;
21
+ /** null when the position is effectively just earning (no meaningful debt). */
22
+ liquidationPriceUsd: number | null;
23
+ dropToLiquidationPct: number | null;
24
+ /** Big Supply APY figure (earn APY once the loan is effectively cleared). */
25
+ supplyApyPct: number;
26
+ /** Big Loan APY figure; null renders as "—" (no effective debt). */
27
+ loanApyPct: number | null;
28
+ /** True → "Smart Earning" badge; false → "Reducing Interest". */
29
+ isEarning: boolean;
30
+ /**
31
+ * True when the position renders as effectively debt-free (earn view or
32
+ * dust-offset loan) — the state in which loanApyPct is null and LTV/loan
33
+ * figures display as zero.
34
+ */
35
+ showZeroDebt: boolean;
36
+ /** Operator debt used in the APY math (optimistic target-LTV projection), UI USDC. */
37
+ operatorBorrowedUsdc: number;
38
+ /** Estimated self-repay date (dd/mm/yyyy) when loan APY is negative. */
39
+ selfRepayDate: string | null;
40
+ estimatedEarningsPerYearUsd: number;
41
+ borrowLimitUsd: number;
42
+ borrowLimitUsedUsd: number;
43
+ borrowLimitUsedPct: number;
44
+ lendingSource: string;
45
+ borrowApyPct: number;
46
+ yieldVault: string;
47
+ vaultSupplyApyPct: number;
48
+ capitalEarningYieldUsdc: number;
49
+ dailyBorrowCostUsd: number;
50
+ dailyEngineEarningsUsd: number;
51
+ collateralSupplyApyPct: number;
52
+ collateralRewardsApyPct: number;
53
+ }
54
+ export interface RatesPayload {
55
+ markets: {
56
+ name: string;
57
+ borrowAPY: number;
58
+ error?: string;
59
+ }[];
60
+ collateralSupplyAPYs: Record<string, number>;
61
+ juplendCollateralSupplyAPYs: Record<string, number>;
62
+ juplendCollateralRewardsAPYs: Record<string, number>;
63
+ collateralLtvs: Record<string, {
64
+ loanToValuePct: number;
65
+ liquidationThresholdPct: number;
66
+ }>;
67
+ juplendCollateralLtvs: Record<string, {
68
+ loanToValuePct: number;
69
+ liquidationThresholdPct: number;
70
+ }>;
71
+ }
72
+ export interface SupplyRatesPayload {
73
+ vaults: {
74
+ name: string;
75
+ supplyAPY: number;
76
+ }[];
77
+ }
78
+ export declare function fetchRatesPayload(base: string): Promise<RatesPayload>;
79
+ export declare function fetchSupplyRatesPayload(base: string): Promise<SupplyRatesPayload>;
80
+ export declare function fetchCollateralPrice(base: string, label: string): Promise<number>;
81
+ export declare function bestMarketName(rates: RatesPayload): string | null;
82
+ export interface GetPositionMetricsParams {
83
+ connection: Connection;
84
+ owner: PublicKey;
85
+ collateralMint: PublicKey;
86
+ apiBaseUrl?: string;
87
+ }
88
+ export declare function getPositionMetrics(params: GetPositionMetricsParams): Promise<HobbaPositionMetrics>;
89
+ /**
90
+ * Inputs for the pure metric computation. The app feeds these from its own
91
+ * cached hooks (per-keystroke/optimistic refresh paths); `getPositionMetrics`
92
+ * feeds them from the backend fetches above. Same math either way.
93
+ */
94
+ export interface PositionMetricsInputs {
95
+ position: HobbaPosition;
96
+ rates: RatesPayload;
97
+ supplyRates: SupplyRatesPayload;
98
+ collateralPriceUsd: number;
99
+ collateralMint: PublicKey;
100
+ /**
101
+ * Pending-harvest yield not yet applied on-chain (micro-USDC), netted off
102
+ * the user-visible debt. The headless read passes 0 (projection requires an
103
+ * extra chain read); the app passes its useJuplendHarvestProjection value.
104
+ */
105
+ earnedNotAppliedMicro?: number;
106
+ }
107
+ export declare function computePositionMetrics(inputs: PositionMetricsInputs): HobbaPositionMetrics;
108
+ //# sourceMappingURL=positionMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positionMetrics.d.ts","sourceRoot":"","sources":["../src/positionMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import { collateralDecimals, collateralLabel } from "./amountUtils";
2
+ import { XSTOCKS_MARKET } from "./constants";
3
+ import { getPosition } from "./position";
4
+ const VAULT_NAME_MAP = {
5
+ allez: "Allez USDC",
6
+ prime: "Prime USDC",
7
+ rockawayRWA: "RockawayRWA USDC",
8
+ perena: "Perena USDC",
9
+ };
10
+ const VAULT_DISPLAY_MAP = {
11
+ allez: "Allez USDC",
12
+ prime: "Prime USDC",
13
+ rockawayRWA: "RockawayRWA USDC",
14
+ perena: "Perena USD*",
15
+ };
16
+ export async function fetchRatesPayload(base) {
17
+ const res = await fetch(`${base}/api/rates`);
18
+ if (!res.ok)
19
+ throw new Error(`rates fetch failed: ${res.status}`);
20
+ const data = await res.json();
21
+ return {
22
+ markets: (data.markets ?? []).filter((m) => !m.error),
23
+ collateralSupplyAPYs: data.collateralSupplyAPYs ?? {},
24
+ juplendCollateralSupplyAPYs: data.juplendCollateralSupplyAPYs ?? {},
25
+ juplendCollateralRewardsAPYs: data.juplendCollateralRewardsAPYs ?? {},
26
+ collateralLtvs: data.collateralLtvs ?? {},
27
+ juplendCollateralLtvs: data.juplendCollateralLtvs ?? {},
28
+ };
29
+ }
30
+ export async function fetchSupplyRatesPayload(base) {
31
+ const res = await fetch(`${base}/api/supply-rates`);
32
+ if (!res.ok)
33
+ throw new Error(`supply-rates fetch failed: ${res.status}`);
34
+ const data = await res.json();
35
+ return { vaults: (data.vaults ?? []).filter((v) => !v.error && v.supplyAPY > 0) };
36
+ }
37
+ export async function fetchCollateralPrice(base, label) {
38
+ const route = label === "SOL" ? "sol-price" : "btc-price";
39
+ const res = await fetch(`${base}/api/${route}`);
40
+ if (!res.ok)
41
+ throw new Error(`${route} fetch failed: ${res.status}`);
42
+ const data = await res.json();
43
+ const price = Number(data.price);
44
+ if (!Number.isFinite(price) || price <= 0)
45
+ throw new Error(`${route} returned no price`);
46
+ return price;
47
+ }
48
+ export function bestMarketName(rates) {
49
+ let best = null;
50
+ let bestApy = Infinity;
51
+ for (const m of rates.markets) {
52
+ if (m.borrowAPY < bestApy) {
53
+ bestApy = m.borrowAPY;
54
+ best = m.name;
55
+ }
56
+ }
57
+ return best;
58
+ }
59
+ export async function getPositionMetrics(params) {
60
+ const { connection, owner, collateralMint } = params;
61
+ const base = (params.apiBaseUrl ?? "").replace(/\/+$/, "");
62
+ const label = collateralLabel(collateralMint);
63
+ const [position, rates, supplyRates, collateralPrice] = await Promise.all([
64
+ getPosition({ connection, owner, collateralMint, apiBaseUrl: base }),
65
+ fetchRatesPayload(base),
66
+ fetchSupplyRatesPayload(base),
67
+ fetchCollateralPrice(base, label),
68
+ ]);
69
+ return computePositionMetrics({
70
+ position,
71
+ rates,
72
+ supplyRates,
73
+ collateralPriceUsd: collateralPrice,
74
+ collateralMint,
75
+ });
76
+ }
77
+ export function computePositionMetrics(inputs) {
78
+ const { position, rates, supplyRates, collateralPriceUsd: collateralPrice, collateralMint, earnedNotAppliedMicro = 0, } = inputs;
79
+ const label = collateralLabel(collateralMint);
80
+ const decimals = collateralDecimals(collateralMint);
81
+ // --- Ported verbatim from app Dashboard.tsx ---
82
+ const collateral = Number(position.collateral);
83
+ const totalDebt = Number(position.debtUsdc);
84
+ const depositedToVault = Number(position.depositedToVault);
85
+ // NOTE: earnedNotAppliedMicro is NOT netted here — the app keeps userDebt
86
+ // (and so LTV / loan APY) on the on-chain figure and only uses the pending
87
+ // harvest to decide the earn-view threshold below.
88
+ const userDebt = Math.max(0, totalDebt - depositedToVault);
89
+ const divisor = Math.pow(10, decimals);
90
+ const collateralUsd = (collateral / divisor) * collateralPrice;
91
+ const ltv = collateralUsd > 0 ? (userDebt / 1e6 / collateralUsd) * 100 : 0;
92
+ const isJuplendLender = position.exists
93
+ ? position.lender === "juplend"
94
+ : bestMarketName(rates) === "JupLend";
95
+ const borrowSource = !position.exists
96
+ ? "—"
97
+ : position.lender === "juplend"
98
+ ? "JupLend"
99
+ : position.lendingMarket === XSTOCKS_MARKET.toBase58()
100
+ ? "Kamino XStocks"
101
+ : "Kamino Main";
102
+ const borrowMarketNameForRates = !position.exists
103
+ ? "Kamino Main Market"
104
+ : position.lender === "juplend"
105
+ ? "JupLend"
106
+ : position.lendingMarket === XSTOCKS_MARKET.toBase58()
107
+ ? "Kamino xStocks"
108
+ : "Kamino Main Market";
109
+ const borrowMarket = rates.markets.find((m) => m.name === borrowMarketNameForRates);
110
+ const borrowAPY = borrowMarket?.borrowAPY ?? 0;
111
+ const vaultName = VAULT_NAME_MAP[position.currentVault] ?? "";
112
+ const supplyVault = supplyRates.vaults.find((v) => v.name === vaultName);
113
+ const currentVaultAPY = supplyVault?.supplyAPY ?? 0;
114
+ // Assumed default vault when no position exists yet: Perena USD*.
115
+ const perenaVaultAPY = supplyRates.vaults.find((v) => v.name === "Perena USDC")?.supplyAPY ?? 0;
116
+ const vaultAPY = currentVaultAPY > 0 ? currentVaultAPY : perenaVaultAPY;
117
+ const collateralBaseSupplyAPY = (isJuplendLender
118
+ ? rates.juplendCollateralSupplyAPYs[label]
119
+ : rates.collateralSupplyAPYs[label]) ?? 0;
120
+ const collateralRewardsAPY = isJuplendLender
121
+ ? (rates.juplendCollateralRewardsAPYs[label] ?? 0)
122
+ : 0;
123
+ const collateralSupplyAPY = collateralBaseSupplyAPY + collateralRewardsAPY;
124
+ const collateralLtv = isJuplendLender
125
+ ? rates.juplendCollateralLtvs[label]
126
+ : rates.collateralLtvs[label];
127
+ const liquidationLtvPct = collateralLtv?.liquidationThresholdPct ?? 85;
128
+ const userBorrowed = userDebt / 1e6;
129
+ const actualOperatorBorrowed = depositedToVault / 1e6;
130
+ // Optimistic operator debt: what the operator WOULD borrow to reach the
131
+ // per-asset target LTV (65% cbBTC, 60% SOL).
132
+ const TARGET_LTV = label === "SOL" ? 0.6 : 0.65;
133
+ const optimisticOperatorBorrowed = (() => {
134
+ if (!collateralUsd || collateralUsd <= 0)
135
+ return actualOperatorBorrowed;
136
+ if (vaultAPY <= borrowAPY)
137
+ return 0;
138
+ const targetTotalDebt = collateralUsd * TARGET_LTV;
139
+ const projected = Math.max(0, targetTotalDebt - userBorrowed);
140
+ return Math.max(actualOperatorBorrowed, projected);
141
+ })();
142
+ const operatorBorrowed = optimisticOperatorBorrowed;
143
+ const operatorHasNotBorrowed = depositedToVault === 0;
144
+ const hasDeposit = collateralUsd > 0;
145
+ const willDeployToVault = hasDeposit && operatorHasNotBorrowed && borrowAPY < vaultAPY;
146
+ const capitalEarningYield = willDeployToVault ? operatorBorrowed : depositedToVault / 1e6;
147
+ const displayVaultType = position.currentVault !== "none"
148
+ ? position.currentVault
149
+ : willDeployToVault
150
+ ? "perena"
151
+ : position.currentVault;
152
+ const loanAPY = userBorrowed > 0
153
+ ? ((userBorrowed + operatorBorrowed) * borrowAPY - operatorBorrowed * vaultAPY) /
154
+ userBorrowed
155
+ : null;
156
+ const currentPrice = collateralPrice;
157
+ const liquidationPrice = currentPrice > 0 && ltv > 0 && liquidationLtvPct > 0
158
+ ? currentPrice * (ltv / liquidationLtvPct)
159
+ : 0;
160
+ const buffer = currentPrice > 0 && liquidationPrice > 0
161
+ ? Math.max(0, ((currentPrice - liquidationPrice) / currentPrice) * 100)
162
+ : 100;
163
+ const ltvStatus = ltv > 75 ? "NEEDS_ATTENTION" : ltv > 50 ? "MODERATE" : "HEALTHY";
164
+ // Dust-offset loan: tiny outstanding debt more than covered by net yield.
165
+ const hobbaDailyEarning = (operatorBorrowed * vaultAPY) / 100 / 365;
166
+ const dailyBorrowCost = ((userBorrowed + operatorBorrowed) * borrowAPY) / 100 / 365;
167
+ const netDailyEarning = hobbaDailyEarning - dailyBorrowCost;
168
+ const DUST_DEBT_THRESHOLD_USDC = 0.01;
169
+ const isDustOffsetLoan = userBorrowed < DUST_DEBT_THRESHOLD_USDC && netDailyEarning > userBorrowed;
170
+ // Earn view: once the yield already earned-but-not-yet-applied (pending
171
+ // harvest) brings residual debt under 0.1 USDC, the position is effectively
172
+ // just earning. Matches app Dashboard.tsx: only this threshold test nets the
173
+ // pending harvest; every other figure stays on the on-chain debt.
174
+ const EARN_VIEW_THRESHOLD_USDC = 0.1;
175
+ const residualDebtMicro = Math.max(0, userDebt - earnedNotAppliedMicro);
176
+ const isEarnView = residualDebtMicro < EARN_VIEW_THRESHOLD_USDC * 1e6;
177
+ const showZeroDebt = isEarnView || isDustOffsetLoan;
178
+ const hobbaSupplyContribution = isDustOffsetLoan && collateralUsd > 0 ? ((netDailyEarning * 365) / collateralUsd) * 100 : 0;
179
+ const displaySupplyAPY = collateralSupplyAPY + hobbaSupplyContribution;
180
+ const displayLoanAPY = showZeroDebt ? null : loanAPY;
181
+ const displayUserBorrowed = showZeroDebt ? 0 : userBorrowed;
182
+ const estimatedAnnualEarnings = operatorBorrowed > 0 && vaultAPY > borrowAPY
183
+ ? (operatorBorrowed * (vaultAPY - borrowAPY)) / 100
184
+ : 0;
185
+ const earnApy = collateralSupplyAPY + (collateralUsd > 0 ? (estimatedAnnualEarnings / collateralUsd) * 100 : 0);
186
+ // Self-repay estimate when the net loan APY is negative.
187
+ let selfRepayDate = null;
188
+ if (displayLoanAPY !== null && displayLoanAPY < 0) {
189
+ const yearsToRepay = 1 / Math.abs(displayLoanAPY / 100);
190
+ if (yearsToRepay <= 10) {
191
+ const daysToRepay = yearsToRepay * 365;
192
+ const repayDate = new Date();
193
+ repayDate.setDate(repayDate.getDate() + Math.ceil(daysToRepay));
194
+ selfRepayDate = `${repayDate.getDate().toString().padStart(2, "0")}/${(repayDate.getMonth() + 1)
195
+ .toString()
196
+ .padStart(2, "0")}/${repayDate.getFullYear()}`;
197
+ }
198
+ }
199
+ const borrowLimit = collateralUsd * 0.5;
200
+ const borrowLimitUsed = borrowLimit > 0 ? (displayUserBorrowed / borrowLimit) * 100 : 0;
201
+ return {
202
+ position,
203
+ lender: position.lender,
204
+ collateralPriceUsd: collateralPrice,
205
+ collateralUi: collateral / divisor,
206
+ collateralUsd,
207
+ loanUsdc: displayUserBorrowed,
208
+ currentLtvPct: showZeroDebt ? 0 : ltv,
209
+ ltvStatus,
210
+ liquidationLtvPct,
211
+ liquidationPriceUsd: isEarnView || liquidationPrice <= 0 ? null : liquidationPrice,
212
+ dropToLiquidationPct: isEarnView || liquidationPrice <= 0 ? null : buffer,
213
+ supplyApyPct: showZeroDebt ? earnApy : displaySupplyAPY,
214
+ loanApyPct: displayLoanAPY,
215
+ isEarning: showZeroDebt || (displayLoanAPY !== null && displayLoanAPY <= 0),
216
+ showZeroDebt,
217
+ operatorBorrowedUsdc: operatorBorrowed,
218
+ selfRepayDate,
219
+ estimatedEarningsPerYearUsd: estimatedAnnualEarnings,
220
+ borrowLimitUsd: borrowLimit,
221
+ borrowLimitUsedUsd: displayUserBorrowed,
222
+ borrowLimitUsedPct: borrowLimitUsed,
223
+ lendingSource: borrowSource,
224
+ borrowApyPct: borrowAPY,
225
+ yieldVault: borrowSource === "—"
226
+ ? "—"
227
+ : !displayVaultType || displayVaultType === "none"
228
+ ? "Perena USD*"
229
+ : (VAULT_DISPLAY_MAP[displayVaultType] ?? displayVaultType),
230
+ vaultSupplyApyPct: vaultAPY,
231
+ capitalEarningYieldUsdc: capitalEarningYield,
232
+ dailyBorrowCostUsd: dailyBorrowCost,
233
+ dailyEngineEarningsUsd: hobbaDailyEarning,
234
+ collateralSupplyApyPct: collateralSupplyAPY,
235
+ collateralRewardsApyPct: collateralRewardsAPY,
236
+ };
237
+ }
238
+ //# sourceMappingURL=positionMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positionMetrics.js","sourceRoot":"","sources":["../src/positionMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Program } from "@coral-xyz/anchor";
2
+ import { Connection, PublicKey } from "@solana/web3.js";
3
+ /**
4
+ * Build the Hobba wrapper Anchor `Program` for instruction-building only.
5
+ *
6
+ * `.methods.x().instruction()` never signs, so a no-op signing wallet is enough;
7
+ * real signing happens later in `transactionBuilder` via the caller's HobbaSigner.
8
+ * `PROGRAM_ID` is selected from `NEXT_PUBLIC_MAINNET`/`NEXT_PUBLIC_STAGING` at
9
+ * build/runtime (see constants.ts), matching the app's AnchorProvider.
10
+ */
11
+ export declare function buildHobbaProgram(connection: Connection, owner: PublicKey): Program;
12
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AAIzB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAWnF"}
@@ -0,0 +1,24 @@
1
+ import { AnchorProvider, Program } from "@coral-xyz/anchor";
2
+ import idl from "./idl/hobba.json";
3
+ import { PROGRAM_ID } from "./constants";
4
+ /**
5
+ * Build the Hobba wrapper Anchor `Program` for instruction-building only.
6
+ *
7
+ * `.methods.x().instruction()` never signs, so a no-op signing wallet is enough;
8
+ * real signing happens later in `transactionBuilder` via the caller's HobbaSigner.
9
+ * `PROGRAM_ID` is selected from `NEXT_PUBLIC_MAINNET`/`NEXT_PUBLIC_STAGING` at
10
+ * build/runtime (see constants.ts), matching the app's AnchorProvider.
11
+ */
12
+ export function buildHobbaProgram(connection, owner) {
13
+ const noopWallet = {
14
+ publicKey: owner,
15
+ signTransaction: async (tx) => tx,
16
+ signAllTransactions: async (txs) => txs,
17
+ };
18
+ const provider = new AnchorProvider(connection, noopWallet, {
19
+ commitment: "confirmed",
20
+ });
21
+ const idlWithAddress = { ...idl, address: PROGRAM_ID.toBase58() };
22
+ return new Program(idlWithAddress, provider);
23
+ }
24
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAO5D,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAsB,EAAE,KAAgB;IACxE,MAAM,UAAU,GAAG;QACjB,SAAS,EAAE,KAAK;QAChB,eAAe,EAAE,KAAK,EAAgD,EAAK,EAAE,EAAE,CAAC,EAAE;QAClF,mBAAmB,EAAE,KAAK,EAAgD,GAAQ,EAAE,EAAE,CAAC,GAAG;KAC3F,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,UAAiB,EAAE;QACjE,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,EAAE,GAAI,GAAW,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC3E,OAAO,IAAI,OAAO,CAAC,cAAqB,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
+ import { type HobbaPosition, type Lender } from "./position";
3
+ import { type RatesPayload, type SupplyRatesPayload } from "./positionMetrics";
4
+ export type RiskLevel = "safe" | "moderate" | "risky" | "none";
5
+ /**
6
+ * Projection quote for the borrow calculator and the deposit/manage modals —
7
+ * the same math app.hobba.io runs (CalculatorSection + ActionModal /
8
+ * DepositBorrowModal), computed against live rates so partner UIs never
9
+ * re-implement Hobba's logic. All *Pct values are percent numbers, all *Usd
10
+ * values USD.
11
+ */
12
+ export interface HobbaQuote {
13
+ lender: Lender;
14
+ collateralPriceUsd: number;
15
+ liquidationLtvPct: number;
16
+ maxUserLtvPct: number;
17
+ /** Current position (zeros for new users). UI units. */
18
+ current: {
19
+ collateralUi: number;
20
+ debtUsdc: number;
21
+ ltvPct: number;
22
+ loanApyPct: number | null;
23
+ };
24
+ /** Position after applying the requested deltas. UI units. */
25
+ projected: {
26
+ collateralUi: number;
27
+ debtUsdc: number;
28
+ ltvPct: number;
29
+ loanApyPct: number | null;
30
+ liquidationPriceUsd: number | null;
31
+ dropToLiquidationPct: number | null;
32
+ riskLabel: string;
33
+ riskLevel: RiskLevel;
34
+ };
35
+ /** Calculator figures for the projected position. */
36
+ calculator: {
37
+ depositValueUsd: number;
38
+ borrowValueUsd: number;
39
+ borrowLimitUsd: number;
40
+ loanApyPct: number;
41
+ earnMode: boolean;
42
+ earnApyPct: number;
43
+ borrowCostPerYearUsd: number;
44
+ earningPerYearUsd: number;
45
+ stakingEarnPerYearUsd: number;
46
+ /** dd/mm/yyyy when the projected loan APY is negative, else null. */
47
+ selfRepayDate: string | null;
48
+ };
49
+ }
50
+ export interface GetQuoteParams {
51
+ connection: Connection;
52
+ collateralMint: PublicKey;
53
+ /** Wallet whose existing position the deltas apply to; omit for a fresh calculator quote. */
54
+ owner?: PublicKey;
55
+ /** Deltas in base units (collateral base units / micro-USDC), decimal strings. */
56
+ depositAmount?: string;
57
+ borrowAmount?: string;
58
+ repayAmount?: string;
59
+ withdrawAmount?: string;
60
+ apiBaseUrl?: string;
61
+ }
62
+ export declare function getQuote(params: GetQuoteParams): Promise<HobbaQuote>;
63
+ /**
64
+ * Inputs for the pure quote computation. The app feeds these from its cached
65
+ * hooks so calculator/modal math stays synchronous per keystroke;
66
+ * `getQuote` feeds them from the backend fetches above. Same math either way.
67
+ */
68
+ export interface QuoteInputs {
69
+ position: HobbaPosition | null;
70
+ rates: RatesPayload;
71
+ supplyRates: SupplyRatesPayload;
72
+ collateralPriceUsd: number;
73
+ collateralMint: PublicKey;
74
+ /** Deltas in base units (collateral base units / micro-USDC), decimal strings. */
75
+ depositAmount?: string;
76
+ borrowAmount?: string;
77
+ repayAmount?: string;
78
+ withdrawAmount?: string;
79
+ /**
80
+ * Optional position-rate overrides (percent). When set they replace the
81
+ * internal market/vault lookups for the loan-APY math — the app passes its
82
+ * page-level figures so modal projections match what is already on screen
83
+ * (and xStocks markets, which the internal lookup doesn't resolve, price
84
+ * correctly). Headless callers normally omit them.
85
+ */
86
+ positionBorrowApyPct?: number;
87
+ positionVaultApyPct?: number;
88
+ }
89
+ export declare function computeQuote(inputs: QuoteInputs): HobbaQuote;
90
+ //# sourceMappingURL=quote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAe,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;IACF,8DAA8D;IAC9D,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;IACF,qDAAqD;IACrD,UAAU,EAAE;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qEAAqE;QACrE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AA2BD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,SAAS,CAAC;IAC1B,6FAA6F;IAC7F,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAyB1E;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,SAAS,CAAC;IAC1B,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAsJ5D"}