@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
package/dist/limits.js ADDED
@@ -0,0 +1,174 @@
1
+ import { getAssociatedTokenAddress } from "@solana/spl-token";
2
+ import { SOL_MINT, USDC_MINT } from "./constants";
3
+ import { collateralDecimals, collateralLabel } from "./amountUtils";
4
+ import { getPosition } from "./position";
5
+ /** Protocol input rules, shared by the app, the widget and /api/widget/config. */
6
+ export const LIMITS_CONFIG = {
7
+ /** Users can borrow up to this % of collateral value. */
8
+ maxUserLtvPct: 50,
9
+ /** Minimum deposits in UI units, first-deposit vs top-up. */
10
+ minDepositUi: {
11
+ SOL: { first: 1, topUp: 0.1 },
12
+ cbBTC: { first: 0.001, topUp: 0.0001 },
13
+ },
14
+ /** SOL held back from "Max" for rents + fees (lamports). */
15
+ solReserveLamports: { first: 50000000, topUp: 5000000 },
16
+ /** JupLend deposit rounding shave, base units per collateral. */
17
+ juplendDepositBufferBase: { SOL: 3000000, cbBTC: 1 },
18
+ /**
19
+ * JupLend max-repay dust shave, micro-USDC. JupLend's operate rejects a
20
+ * repay that leaves 0 < debt < its min-debt floor (error 6025
21
+ * VAULT_USER_DEBT_TOO_LOW): a 0.002 USDC residual was observed failing on
22
+ * staging while ~0.01 passed, so leave 0.02 to clear the floor plus the
23
+ * interest accrued between quote and execution.
24
+ */
25
+ juplendRepayShaveMicro: 20000,
26
+ /**
27
+ * klend balance-for-accrued-debt drift divisor applied to max withdraw
28
+ * (observed refresh-time BFAD drift up to ~0.43% on SOL).
29
+ */
30
+ kaminoWithdrawDriftFactor: 1.006,
31
+ /**
32
+ * JupLend max-withdraw margin. Hobba's 50% user-LTV cap is client-side
33
+ * policy (JupLend's on-chain ceiling is its 75-80% liquidation LTV), so
34
+ * only a hair of headroom is needed for interest accrued between quote
35
+ * and execution — lands ~49.99% instead of stranding 0.6% of the
36
+ * withdrawable amount like the klend factor would.
37
+ */
38
+ juplendWithdrawDriftFactor: 1.0005,
39
+ /**
40
+ * Collateral reserve for the post-unwind residual on max withdraw when the
41
+ * operator has capital deployed. prepare_withdraw redeems vault shares to
42
+ * repay the operator debt as collateral leaves, but redemption rounding,
43
+ * vault fees and the repay dust leave a small residual — withdrawing ALL
44
+ * collateral against it is infinite LTV and the lender rejects the tx
45
+ * (observed: JupLend 6011 VAULT_POSITION_ABOVE_CF). Reserve enough
46
+ * collateral to hold the residual at ≤ 50% LTV: residual is estimated as
47
+ * max(floorUsd, fracOfOperatorDebt × operator debt).
48
+ */
49
+ unwindResidualReserve: { floorUsd: 0.1, fracOfOperatorDebt: 0.002 },
50
+ /** Fallback liquidation LTVs (%) when /api/rates is unavailable. */
51
+ fallbackLiquidationLtvPct: {
52
+ kamino: { SOL: 75, cbBTC: 80 },
53
+ juplend: { SOL: 75, cbBTC: 80 },
54
+ },
55
+ };
56
+ async function fetchCollateralPriceUsd(base, label) {
57
+ const route = label === "SOL" ? "sol-price" : "btc-price";
58
+ const res = await fetch(`${base}/api/${route}`);
59
+ if (!res.ok)
60
+ throw new Error(`${route} fetch failed: ${res.status}`);
61
+ const data = await res.json();
62
+ const price = Number(data.price);
63
+ if (!Number.isFinite(price) || price <= 0)
64
+ throw new Error(`${route} returned no price`);
65
+ return price;
66
+ }
67
+ async function fetchLiquidationLtvPct(base, lender, label) {
68
+ try {
69
+ const res = await fetch(`${base}/api/rates`);
70
+ if (!res.ok)
71
+ throw new Error(String(res.status));
72
+ const data = await res.json();
73
+ const table = lender === "juplend" ? data.juplendCollateralLtvs : data.collateralLtvs;
74
+ const pct = Number(table?.[label]?.liquidationThresholdPct);
75
+ if (Number.isFinite(pct) && pct > 0)
76
+ return pct;
77
+ }
78
+ catch {
79
+ /* fall through to constants */
80
+ }
81
+ return LIMITS_CONFIG.fallbackLiquidationLtvPct[lender][label] ?? 80;
82
+ }
83
+ async function fetchTokenBalanceBase(connection, owner, mint) {
84
+ try {
85
+ const ata = await getAssociatedTokenAddress(mint, owner);
86
+ const bal = await connection.getTokenAccountBalance(ata);
87
+ return Number(bal.value.amount);
88
+ }
89
+ catch {
90
+ return 0;
91
+ }
92
+ }
93
+ /**
94
+ * Single quote for input bounds so integrator math can't drift from protocol
95
+ * rules (SOL rent reserves, JupLend rounding shaves, klend accrual drift).
96
+ * Mirrors the app's CalculatorSection / ActionModal / max-withdraw logic.
97
+ */
98
+ export async function getLimits(params) {
99
+ const { connection, owner, collateralMint } = params;
100
+ const base = (params.apiBaseUrl ?? "").replace(/\/+$/, "");
101
+ const label = collateralLabel(collateralMint);
102
+ const decimals = collateralDecimals(collateralMint);
103
+ const isSol = collateralMint.equals(SOL_MINT);
104
+ const position = await getPosition({ connection, owner, collateralMint, apiBaseUrl: base });
105
+ const [price, liquidationLtvPct] = await Promise.all([
106
+ fetchCollateralPriceUsd(base, label),
107
+ fetchLiquidationLtvPct(base, position.lender, label),
108
+ ]);
109
+ const collateralBase = Number(position.collateral);
110
+ const userDebtMicro = Number(position.userDebtUsdc);
111
+ const collateralUsd = (collateralBase / 10 ** decimals) * price;
112
+ const maxLtv = LIMITS_CONFIG.maxUserLtvPct / 100;
113
+ // Max borrow: 50% of collateral value minus current user debt.
114
+ const maxBorrowMicro = Math.max(0, Math.floor(collateralUsd * maxLtv * 1e6 - userDebtMicro));
115
+ // Max withdraw: keep post-withdraw LTV ≤ 50%. With debt, shave a per-lender
116
+ // drift margin so the quote survives until submission: klend needs real
117
+ // headroom for refresh-time BFAD drift, JupLend only accrual dust. When the
118
+ // operator has capital deployed, additionally reserve collateral for the
119
+ // post-unwind residual (see LIMITS_CONFIG.unwindResidualReserve) so a max
120
+ // withdraw can't strand residual debt against ~zero collateral.
121
+ const operatorDebtUsd = Number(position.depositedToVault) / 1e6;
122
+ const unwindResidualUsd = operatorDebtUsd > 0
123
+ ? Math.max(LIMITS_CONFIG.unwindResidualReserve.floorUsd, operatorDebtUsd * LIMITS_CONFIG.unwindResidualReserve.fracOfOperatorDebt)
124
+ : 0;
125
+ const effectiveDebtUsd = userDebtMicro / 1e6 + unwindResidualUsd;
126
+ let maxWithdrawBase;
127
+ if (effectiveDebtUsd > 0 && price > 0) {
128
+ const driftFactor = position.lender === "juplend"
129
+ ? LIMITS_CONFIG.juplendWithdrawDriftFactor
130
+ : LIMITS_CONFIG.kaminoWithdrawDriftFactor;
131
+ const minCollateralUsd = effectiveDebtUsd / maxLtv;
132
+ const maxWithdrawUsd = Math.max(0, collateralUsd - minCollateralUsd);
133
+ maxWithdrawBase = Math.floor(((maxWithdrawUsd / price) * 10 ** decimals) / driftFactor);
134
+ maxWithdrawBase = Math.min(maxWithdrawBase, collateralBase);
135
+ }
136
+ else {
137
+ maxWithdrawBase = collateralBase;
138
+ }
139
+ // Max repay: wallet USDC capped at debt; JupLend leaves rounding dust.
140
+ const walletUsdcMicro = await fetchTokenBalanceBase(connection, owner, USDC_MINT);
141
+ let maxRepayMicro;
142
+ if (position.lender === "juplend") {
143
+ // Cap at debt - shave so the residual clears JupLend's min-debt floor
144
+ // (VAULT_USER_DEBT_TOO_LOW) whether the wallet or the debt is the binding
145
+ // limit; the extra micro off the wallet cap guards balance rounding.
146
+ const targetMicro = Math.max(0, userDebtMicro - LIMITS_CONFIG.juplendRepayShaveMicro);
147
+ maxRepayMicro = Math.max(0, Math.min(walletUsdcMicro - 1, targetMicro));
148
+ }
149
+ else {
150
+ maxRepayMicro = Math.min(walletUsdcMicro, userDebtMicro);
151
+ }
152
+ const minDepositUi = position.exists
153
+ ? LIMITS_CONFIG.minDepositUi[label]?.topUp
154
+ : LIMITS_CONFIG.minDepositUi[label]?.first;
155
+ const minDepositBase = Math.round((minDepositUi ?? 0) * 10 ** decimals);
156
+ const solReserveLamports = isSol
157
+ ? position.exists
158
+ ? LIMITS_CONFIG.solReserveLamports.topUp
159
+ : LIMITS_CONFIG.solReserveLamports.first
160
+ : 0;
161
+ const depositBufferBase = position.lender === "juplend" ? (LIMITS_CONFIG.juplendDepositBufferBase[label] ?? 0) : 0;
162
+ return {
163
+ lender: position.lender,
164
+ maxBorrowUsdc: String(maxBorrowMicro),
165
+ maxWithdraw: String(maxWithdrawBase),
166
+ maxRepayUsdc: String(maxRepayMicro),
167
+ minDeposit: String(minDepositBase),
168
+ solReserve: String(solReserveLamports),
169
+ depositBuffer: String(depositBufferBase),
170
+ maxUserLtvPct: LIMITS_CONFIG.maxUserLtvPct,
171
+ liquidationLtvPct,
172
+ };
173
+ }
174
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ export interface KaminoMarketConfig {
3
+ collateralMint: PublicKey;
4
+ market: PublicKey;
5
+ marketAuthority: PublicKey;
6
+ collateralReserve: PublicKey;
7
+ collateralLiquiditySupply: PublicKey;
8
+ collateralCTokenMint: PublicKey;
9
+ collateralCTokenSupply: PublicKey;
10
+ collateralFarmState: PublicKey | null;
11
+ usdcReserve: PublicKey;
12
+ usdcLiquiditySupply: PublicKey;
13
+ usdcFeeVault: PublicKey;
14
+ usdcReserveFarmDebt: PublicKey | null;
15
+ scopePrices: PublicKey;
16
+ }
17
+ export declare const MAIN_MARKET_CONFIG: KaminoMarketConfig;
18
+ export declare const SOL_MAIN_MARKET_CONFIG: KaminoMarketConfig;
19
+ export declare const XSTOCKS_MARKET_CONFIG: KaminoMarketConfig;
20
+ export declare function resolveXStocksConfig(): Promise<KaminoMarketConfig>;
21
+ /**
22
+ * Resolve market config for a given market address.
23
+ * Main Market uses hardcoded addresses; XStocks fetches from mainnet.
24
+ */
25
+ export declare function resolveMarketConfig(market: PublicKey): Promise<KaminoMarketConfig | null>;
26
+ /**
27
+ * Resolve market config for a given collateral mint on Main Market.
28
+ */
29
+ export declare function resolveMainMarketConfigByMint(collateralMint: PublicKey): KaminoMarketConfig;
30
+ /**
31
+ * Resolve the best Kamino market config based on the rates API response.
32
+ * Returns the config for whichever Kamino market has the lowest borrow APY.
33
+ */
34
+ export declare function resolveBestKaminoConfig(bestMarketName: string | null): Promise<KaminoMarketConfig>;
35
+ //# sourceMappingURL=marketConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketConfig.d.ts","sourceRoot":"","sources":["../src/marketConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA+B5C,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,SAAS,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,SAAS,CAAC;IAC3B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,yBAAyB,EAAE,SAAS,CAAC;IACrC,oBAAoB,EAAE,SAAS,CAAC;IAChC,sBAAsB,EAAE,SAAS,CAAC;IAClC,mBAAmB,EAAE,SAAS,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,SAAS,CAAC;IACvB,mBAAmB,EAAE,SAAS,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC;IACxB,mBAAmB,EAAE,SAAS,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,SAAS,CAAC;CACxB;AAID,eAAO,MAAM,kBAAkB,EAAE,kBAchC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,kBAcpC,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,kBAcnC,CAAC;AAEF,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAExE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAIpC;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,SAAS,GACxB,kBAAkB,CAGpB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAO7B"}
@@ -0,0 +1,85 @@
1
+ import { MAIN_MARKET, XSTOCKS_MARKET, CBBTC_MINT, SOL_MINT, CBBTC_RESERVE, CBBTC_LIQUIDITY_SUPPLY, CBBTC_COLLATERAL_MINT, CBBTC_COLLATERAL_SUPPLY, CBBTC_RESERVE_FARM_COLLATERAL, SOL_RESERVE, SOL_LIQUIDITY_SUPPLY, SOL_COLLATERAL_MINT, SOL_COLLATERAL_SUPPLY, SOL_RESERVE_FARM_COLLATERAL, USDC_RESERVE, USDC_LIQUIDITY_SUPPLY, USDC_FEE_VAULT, SCOPE_PRICES, XSTOCKS_CBBTC_RESERVE, XSTOCKS_USDC_RESERVE, XSTOCKS_CBBTC_LIQUIDITY_SUPPLY, XSTOCKS_CBBTC_COLLATERAL_MINT, XSTOCKS_CBBTC_COLLATERAL_SUPPLY, XSTOCKS_USDC_LIQUIDITY_SUPPLY, XSTOCKS_USDC_FEE_VAULT, XSTOCKS_USDC_RESERVE_FARM_DEBT, } from "./constants";
2
+ import { deriveMarketAuthority } from "./pdas";
3
+ const [mainMarketAuthority] = deriveMarketAuthority(MAIN_MARKET);
4
+ export const MAIN_MARKET_CONFIG = {
5
+ collateralMint: CBBTC_MINT,
6
+ market: MAIN_MARKET,
7
+ marketAuthority: mainMarketAuthority,
8
+ collateralReserve: CBBTC_RESERVE,
9
+ collateralLiquiditySupply: CBBTC_LIQUIDITY_SUPPLY,
10
+ collateralCTokenMint: CBBTC_COLLATERAL_MINT,
11
+ collateralCTokenSupply: CBBTC_COLLATERAL_SUPPLY,
12
+ collateralFarmState: CBBTC_RESERVE_FARM_COLLATERAL,
13
+ usdcReserve: USDC_RESERVE,
14
+ usdcLiquiditySupply: USDC_LIQUIDITY_SUPPLY,
15
+ usdcFeeVault: USDC_FEE_VAULT,
16
+ usdcReserveFarmDebt: null,
17
+ scopePrices: SCOPE_PRICES,
18
+ };
19
+ export const SOL_MAIN_MARKET_CONFIG = {
20
+ collateralMint: SOL_MINT,
21
+ market: MAIN_MARKET,
22
+ marketAuthority: mainMarketAuthority,
23
+ collateralReserve: SOL_RESERVE,
24
+ collateralLiquiditySupply: SOL_LIQUIDITY_SUPPLY,
25
+ collateralCTokenMint: SOL_COLLATERAL_MINT,
26
+ collateralCTokenSupply: SOL_COLLATERAL_SUPPLY,
27
+ collateralFarmState: SOL_RESERVE_FARM_COLLATERAL,
28
+ usdcReserve: USDC_RESERVE,
29
+ usdcLiquiditySupply: USDC_LIQUIDITY_SUPPLY,
30
+ usdcFeeVault: USDC_FEE_VAULT,
31
+ usdcReserveFarmDebt: null,
32
+ scopePrices: SCOPE_PRICES,
33
+ };
34
+ const [xstocksMarketAuthority] = deriveMarketAuthority(XSTOCKS_MARKET);
35
+ export const XSTOCKS_MARKET_CONFIG = {
36
+ collateralMint: CBBTC_MINT,
37
+ market: XSTOCKS_MARKET,
38
+ marketAuthority: xstocksMarketAuthority,
39
+ collateralReserve: XSTOCKS_CBBTC_RESERVE,
40
+ collateralLiquiditySupply: XSTOCKS_CBBTC_LIQUIDITY_SUPPLY,
41
+ collateralCTokenMint: XSTOCKS_CBBTC_COLLATERAL_MINT,
42
+ collateralCTokenSupply: XSTOCKS_CBBTC_COLLATERAL_SUPPLY,
43
+ collateralFarmState: null,
44
+ usdcReserve: XSTOCKS_USDC_RESERVE,
45
+ usdcLiquiditySupply: XSTOCKS_USDC_LIQUIDITY_SUPPLY,
46
+ usdcFeeVault: XSTOCKS_USDC_FEE_VAULT,
47
+ usdcReserveFarmDebt: XSTOCKS_USDC_RESERVE_FARM_DEBT,
48
+ scopePrices: SCOPE_PRICES,
49
+ };
50
+ export async function resolveXStocksConfig() {
51
+ return XSTOCKS_MARKET_CONFIG;
52
+ }
53
+ /**
54
+ * Resolve market config for a given market address.
55
+ * Main Market uses hardcoded addresses; XStocks fetches from mainnet.
56
+ */
57
+ export async function resolveMarketConfig(market) {
58
+ if (market.equals(MAIN_MARKET))
59
+ return MAIN_MARKET_CONFIG;
60
+ if (market.equals(XSTOCKS_MARKET))
61
+ return resolveXStocksConfig();
62
+ return null;
63
+ }
64
+ /**
65
+ * Resolve market config for a given collateral mint on Main Market.
66
+ */
67
+ export function resolveMainMarketConfigByMint(collateralMint) {
68
+ if (collateralMint.equals(SOL_MINT))
69
+ return SOL_MAIN_MARKET_CONFIG;
70
+ return MAIN_MARKET_CONFIG;
71
+ }
72
+ /**
73
+ * Resolve the best Kamino market config based on the rates API response.
74
+ * Returns the config for whichever Kamino market has the lowest borrow APY.
75
+ */
76
+ export async function resolveBestKaminoConfig(bestMarketName) {
77
+ if (bestMarketName === "Kamino xStocks") {
78
+ const xstocks = await resolveXStocksConfig();
79
+ if (xstocks)
80
+ return xstocks;
81
+ }
82
+ // Default to Main Market
83
+ return MAIN_MARKET_CONFIG;
84
+ }
85
+ //# sourceMappingURL=marketConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketConfig.js","sourceRoot":"","sources":["../src/marketConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const SCOPE_PRICES_OFFSET = 40;
2
+ export declare const SCOPE_ENTRY_SIZE = 56;
3
+ /** Scope price-chain token indices configured on a klend reserve. */
4
+ export declare function getReservePriceChain(reserveData: Buffer): number[];
5
+ /** Walk the price chain through the Scope prices account, multiplying hops. */
6
+ export declare function readScopePrice(scopeData: Buffer, priceChain: number[]): number;
7
+ //# sourceMappingURL=scopePrice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopePrice.d.ts","sourceRoot":"","sources":["../../src/oracle/scopePrice.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlE;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAW9E"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Kamino Scope oracle price decoding, shared by /api/btc-price and
3
+ * /api/sol-price (and any script needing a Scope-chain USD price).
4
+ * Server-leaning (decodeReserve lazy-requires klend-sdk) — import via the
5
+ * subpath `@hobba/core/oracle/scopePrice`, not core's index.
6
+ */
7
+ import { decodeReserve } from "../rates/borrowRates";
8
+ // Scope oracle layout: 8 disc + 32 oracleMappings + 512×56 prices
9
+ export const SCOPE_PRICES_OFFSET = 40; // 8 + 32
10
+ export const SCOPE_ENTRY_SIZE = 56; // DatedPrice: 8 value + 8 exp + ...
11
+ /** Scope price-chain token indices configured on a klend reserve. */
12
+ export function getReservePriceChain(reserveData) {
13
+ const reserve = decodeReserve(reserveData);
14
+ return reserve.config.tokenInfo.scopeConfiguration.priceChain.map((x) => Number(x));
15
+ }
16
+ /** Walk the price chain through the Scope prices account, multiplying hops. */
17
+ export function readScopePrice(scopeData, priceChain) {
18
+ let price = 1.0;
19
+ for (const tokenIndex of priceChain) {
20
+ if (tokenIndex === 65535)
21
+ break;
22
+ const entryOffset = SCOPE_PRICES_OFFSET + tokenIndex * SCOPE_ENTRY_SIZE;
23
+ if (entryOffset + 16 > scopeData.length)
24
+ break;
25
+ const value = Number(scopeData.readBigUInt64LE(entryOffset));
26
+ const exp = Number(scopeData.readBigUInt64LE(entryOffset + 8));
27
+ price *= value * Math.pow(10, -exp);
28
+ }
29
+ return price;
30
+ }
31
+ //# sourceMappingURL=scopePrice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopePrice.js","sourceRoot":"","sources":["../../src/oracle/scopePrice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC,CAAC,SAAS;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAI,oCAAoC;AAE3E,qEAAqE;AACrE,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAoB;IACpE,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,UAAU,KAAK,KAAK;YAAE,MAAM;QAChC,MAAM,WAAW,GAAG,mBAAmB,GAAG,UAAU,GAAG,gBAAgB,CAAC;QACxE,IAAI,WAAW,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM;YAAE,MAAM;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/pdas.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ export declare function deriveUserStatePda(owner: PublicKey, collateralMint: PublicKey): [PublicKey, number];
3
+ export declare function deriveAllowlistEntryPda(owner: PublicKey): [PublicKey, number];
4
+ export declare function deriveProgramConfigPda(): [PublicKey, number];
5
+ export declare function deriveDepositConfigPda(collateralMint: PublicKey): [PublicKey, number];
6
+ export declare function deriveOriginConfigPda(origin: number): [PublicKey, number];
7
+ export declare function deriveUserOriginPda(owner: PublicKey): [PublicKey, number];
8
+ export declare function deriveObligationPda(userStatePda: PublicKey, market: PublicKey): [PublicKey, number];
9
+ export declare function deriveUserMetadataPda(userStatePda: PublicKey): [PublicKey, number];
10
+ export declare function deriveMarketAuthority(market: PublicKey): [PublicKey, number];
11
+ export declare function deriveFarmUserStatePda(farmState: PublicKey, obligation: PublicKey): [PublicKey, number];
12
+ export declare function deriveKvaultEventAuthority(): [PublicKey, number];
13
+ export declare function deriveKvaultGlobalConfig(): [PublicKey, number];
14
+ export declare function deriveJuplendPositionPda(vaultId: number, positionId: number): [PublicKey, number];
15
+ export declare function deriveJuplendPositionMintPda(vaultId: number, positionId: number): [PublicKey, number];
16
+ export declare function deriveJuplendTickPda(vaultId: number, tick: number): PublicKey;
17
+ export declare function deriveJuplendTickIdLiquidationPda(vaultId: number, tick: number, totalIds?: number): PublicKey;
18
+ export declare function derivePositionMetadataPda(positionMint: PublicKey): [PublicKey, number];
19
+ export declare function deriveUserTokenAccounts(owner: PublicKey, userStatePda: PublicKey, collateralMint: PublicKey): Promise<{
20
+ userCollateralAta: PublicKey;
21
+ pdaCollateralAta: PublicKey;
22
+ userUsdcAta: PublicKey;
23
+ pdaUsdcAta: PublicKey;
24
+ pdaSharesAta: PublicKey;
25
+ pdaPrimeSharesAta: PublicKey;
26
+ pdaRockawaySharesAta: PublicKey;
27
+ pdaPerenaSharesAta: PublicKey;
28
+ }>;
29
+ export declare function deriveFarmPdas(obligationPda: PublicKey, collateralFarmState: PublicKey | null, usdcReserveFarmDebt: PublicKey | null): {
30
+ obligationFarmUserStatePda: PublicKey;
31
+ obligationFarmDebtUserStatePda: PublicKey;
32
+ };
33
+ //# sourceMappingURL=pdas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdas.d.ts","sourceRoot":"","sources":["../src/pdas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAkB5C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKnG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAK7E;AAED,wBAAgB,sBAAsB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAK5D;AAED,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKzE;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,SAAS,GAChB,CAAC,SAAS,EAAE,MAAM,CAAC,CAYrB;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKlF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAK5E;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,GACpB,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,0BAA0B,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAKhE;AAED,wBAAgB,wBAAwB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAK9D;AAGD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,CAAC,SAAS,EAAE,MAAM,CAAC,CASrB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,CAAC,SAAS,EAAE,MAAM,CAAC,CASrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAU7E;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAU,GACnB,SAAS,CAWX;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAKtF;AAGD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,SAAS,EACvB,cAAc,EAAE,SAAS;;;;;;;;;GAwB1B;AAGD,wBAAgB,cAAc,CAC5B,aAAa,EAAE,SAAS,EACxB,mBAAmB,EAAE,SAAS,GAAG,IAAI,EACrC,mBAAmB,EAAE,SAAS,GAAG,IAAI;;;EAWtC"}
package/dist/pdas.js ADDED
@@ -0,0 +1,116 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { getAssociatedTokenAddress } from "@solana/spl-token";
3
+ import BN from "bn.js";
4
+ import { PROGRAM_ID, KAMINO_LENDING_PROGRAM_ID, KVAULT_PROGRAM_ID, FARMS_PROGRAM, JUPLEND_PROGRAM, METAPLEX_PROGRAM, USDC_MINT, ALLEZ_USDC_SHARES_MINT, USDC_PRIME_SHARES_MINT, ROCKAWAY_RWA_SHARES_MINT, STAR_USDC_MINT, JUPLEND_MAX_TICK, } from "./constants";
5
+ export function deriveUserStatePda(owner, collateralMint) {
6
+ return PublicKey.findProgramAddressSync([Buffer.from("user_state"), owner.toBuffer(), collateralMint.toBuffer()], PROGRAM_ID);
7
+ }
8
+ export function deriveAllowlistEntryPda(owner) {
9
+ return PublicKey.findProgramAddressSync([Buffer.from("allowlist"), owner.toBuffer()], PROGRAM_ID);
10
+ }
11
+ export function deriveProgramConfigPda() {
12
+ return PublicKey.findProgramAddressSync([Buffer.from("program_config")], PROGRAM_ID);
13
+ }
14
+ export function deriveDepositConfigPda(collateralMint) {
15
+ return PublicKey.findProgramAddressSync([Buffer.from("deposit_config"), collateralMint.toBuffer()], PROGRAM_ID);
16
+ }
17
+ export function deriveOriginConfigPda(origin) {
18
+ return PublicKey.findProgramAddressSync([Buffer.from("origin_config"), Buffer.from([origin])], PROGRAM_ID);
19
+ }
20
+ export function deriveUserOriginPda(owner) {
21
+ return PublicKey.findProgramAddressSync([Buffer.from("user_origin"), owner.toBuffer()], PROGRAM_ID);
22
+ }
23
+ export function deriveObligationPda(userStatePda, market) {
24
+ return PublicKey.findProgramAddressSync([
25
+ Buffer.from([0]),
26
+ Buffer.from([0]),
27
+ userStatePda.toBuffer(),
28
+ market.toBuffer(),
29
+ PublicKey.default.toBuffer(),
30
+ PublicKey.default.toBuffer(),
31
+ ], KAMINO_LENDING_PROGRAM_ID);
32
+ }
33
+ export function deriveUserMetadataPda(userStatePda) {
34
+ return PublicKey.findProgramAddressSync([Buffer.from("user_meta"), userStatePda.toBuffer()], KAMINO_LENDING_PROGRAM_ID);
35
+ }
36
+ export function deriveMarketAuthority(market) {
37
+ return PublicKey.findProgramAddressSync([Buffer.from("lma"), market.toBuffer()], KAMINO_LENDING_PROGRAM_ID);
38
+ }
39
+ export function deriveFarmUserStatePda(farmState, obligation) {
40
+ return PublicKey.findProgramAddressSync([Buffer.from("user"), farmState.toBuffer(), obligation.toBuffer()], FARMS_PROGRAM);
41
+ }
42
+ export function deriveKvaultEventAuthority() {
43
+ return PublicKey.findProgramAddressSync([Buffer.from("__event_authority")], KVAULT_PROGRAM_ID);
44
+ }
45
+ export function deriveKvaultGlobalConfig() {
46
+ return PublicKey.findProgramAddressSync([Buffer.from("global_config")], KVAULT_PROGRAM_ID);
47
+ }
48
+ // JupLend PDAs
49
+ export function deriveJuplendPositionPda(vaultId, positionId) {
50
+ const vaultIdBytes = Buffer.alloc(2);
51
+ vaultIdBytes.writeUInt16LE(vaultId);
52
+ const positionIdBytes = Buffer.alloc(4);
53
+ positionIdBytes.writeUInt32LE(positionId);
54
+ return PublicKey.findProgramAddressSync([Buffer.from("position"), vaultIdBytes, positionIdBytes], JUPLEND_PROGRAM);
55
+ }
56
+ export function deriveJuplendPositionMintPda(vaultId, positionId) {
57
+ const vaultIdBytes = Buffer.alloc(2);
58
+ vaultIdBytes.writeUInt16LE(vaultId);
59
+ const positionIdBytes = Buffer.alloc(4);
60
+ positionIdBytes.writeUInt32LE(positionId);
61
+ return PublicKey.findProgramAddressSync([Buffer.from("position_mint"), vaultIdBytes, positionIdBytes], JUPLEND_PROGRAM);
62
+ }
63
+ export function deriveJuplendTickPda(vaultId, tick) {
64
+ const [pda] = PublicKey.findProgramAddressSync([
65
+ Buffer.from("tick"),
66
+ new BN(vaultId).toArrayLike(Buffer, "le", 2),
67
+ new BN(tick + JUPLEND_MAX_TICK).toArrayLike(Buffer, "le", 4),
68
+ ], JUPLEND_PROGRAM);
69
+ return pda;
70
+ }
71
+ export function deriveJuplendTickIdLiquidationPda(vaultId, tick, totalIds = 0) {
72
+ const [pda] = PublicKey.findProgramAddressSync([
73
+ Buffer.from("tick_id_liquidation"),
74
+ new BN(vaultId).toArrayLike(Buffer, "le", 2),
75
+ new BN(tick + JUPLEND_MAX_TICK).toArrayLike(Buffer, "le", 4),
76
+ new BN(Math.floor((totalIds + 2) / 3)).toArrayLike(Buffer, "le", 4),
77
+ ], JUPLEND_PROGRAM);
78
+ return pda;
79
+ }
80
+ export function derivePositionMetadataPda(positionMint) {
81
+ return PublicKey.findProgramAddressSync([Buffer.from("metadata"), METAPLEX_PROGRAM.toBuffer(), positionMint.toBuffer()], METAPLEX_PROGRAM);
82
+ }
83
+ // Derive all PDA token accounts for a user
84
+ export async function deriveUserTokenAccounts(owner, userStatePda, collateralMint) {
85
+ const [userCollateralAta, pdaCollateralAta, userUsdcAta, pdaUsdcAta, pdaSharesAta, pdaPrimeSharesAta, pdaRockawaySharesAta, pdaPerenaSharesAta] = await Promise.all([
86
+ getAssociatedTokenAddress(collateralMint, owner),
87
+ getAssociatedTokenAddress(collateralMint, userStatePda, true),
88
+ getAssociatedTokenAddress(USDC_MINT, owner),
89
+ getAssociatedTokenAddress(USDC_MINT, userStatePda, true),
90
+ getAssociatedTokenAddress(ALLEZ_USDC_SHARES_MINT, userStatePda, true),
91
+ getAssociatedTokenAddress(USDC_PRIME_SHARES_MINT, userStatePda, true),
92
+ getAssociatedTokenAddress(ROCKAWAY_RWA_SHARES_MINT, userStatePda, true),
93
+ getAssociatedTokenAddress(STAR_USDC_MINT, userStatePda, true),
94
+ ]);
95
+ return {
96
+ userCollateralAta,
97
+ pdaCollateralAta,
98
+ userUsdcAta,
99
+ pdaUsdcAta,
100
+ pdaSharesAta,
101
+ pdaPrimeSharesAta,
102
+ pdaRockawaySharesAta,
103
+ pdaPerenaSharesAta,
104
+ };
105
+ }
106
+ // Derive farm PDAs for any market, given its farm addresses
107
+ export function deriveFarmPdas(obligationPda, collateralFarmState, usdcReserveFarmDebt) {
108
+ const obligationFarmUserStatePda = collateralFarmState
109
+ ? deriveFarmUserStatePda(collateralFarmState, obligationPda)[0]
110
+ : KAMINO_LENDING_PROGRAM_ID;
111
+ const obligationFarmDebtUserStatePda = usdcReserveFarmDebt
112
+ ? deriveFarmUserStatePda(usdcReserveFarmDebt, obligationPda)[0]
113
+ : KAMINO_LENDING_PROGRAM_ID;
114
+ return { obligationFarmUserStatePda, obligationFarmDebtUserStatePda };
115
+ }
116
+ //# sourceMappingURL=pdas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdas.js","sourceRoot":"","sources":["../src/pdas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
+ import { type KaminoMarketConfig } from "./marketConfig";
3
+ import { type CurrentVaultType } from "./userState";
4
+ export type Lender = "juplend" | "kamino";
5
+ /**
6
+ * A user's Hobba position for one collateral asset, in base units
7
+ * (collateral in lamports/satoshis, debt in micro-USDC). Amounts are decimal
8
+ * strings so they survive JSON and avoid float drift at the integration
9
+ * boundary.
10
+ */
11
+ export interface HobbaPosition {
12
+ /** false → no UserState exists for this (owner, collateral). */
13
+ exists: boolean;
14
+ /** Active lender; for new users this is the default lender init() would pick. */
15
+ lender: Lender;
16
+ /** Kamino lending market pubkey (distinguishes Main vs xStocks). */
17
+ lendingMarket?: string;
18
+ /** Deposited collateral, base units. */
19
+ collateral: string;
20
+ /** Total obligation debt, micro-USDC (user + operator-deployed). */
21
+ debtUsdc: string;
22
+ /** Operator-deployed capital, micro-USDC. */
23
+ depositedToVault: string;
24
+ /** max(0, debtUsdc - depositedToVault) — what UIs show as the user's loan. */
25
+ userDebtUsdc: string;
26
+ currentVault: CurrentVaultType;
27
+ /** Obligation (Kamino) / position (JupLend) address. */
28
+ obligation?: string;
29
+ }
30
+ export declare function resolveKaminoMarketConfig(lendingMarket: PublicKey, collateralMint: PublicKey): KaminoMarketConfig;
31
+ export interface GetPositionParams {
32
+ connection: Connection;
33
+ owner: PublicKey;
34
+ collateralMint: PublicKey;
35
+ /** Hobba backend base URL serving /api/juplend-position. "" = same-origin. */
36
+ apiBaseUrl?: string;
37
+ }
38
+ /**
39
+ * Headless position read: UserState → lender routing → obligation (Kamino,
40
+ * parsed client-side) or JupLend position (via the backend, which handles the
41
+ * tick-based debt computation). Mirrors the app's useUserState +
42
+ * useObligationData hooks.
43
+ */
44
+ export declare function getPosition(params: GetPositionParams): Promise<HobbaPosition>;
45
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../src/position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWxD,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,SAAS,EACxB,cAAc,EAAE,SAAS,GACxB,kBAAkB,CAIpB;AAYD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmDnF"}