1 SOL locked, ~€1 borrowed — and all of it works for me
The fixed amounts (collateral and borrowed USDC) are a verified snapshot of the transaction from 8 Jul 2026. Everything else — SOL price, collateral value, LTV and distance to liquidation — is computed live from the current price.
vault_provider=1 · switched twice in AugustUserHarvestPayout event between 14 Apr and 25 Aug 2026 we counted 1,981 harvests, 2,433.72 USDC of gross yield and 1,940.73 USDC of debt repaid out of that yield. For comparison, on 27 Jul the same figures were 1,280.73 and 1,033.01 — almost doubled in 29 days. The engine ran again today. On my position the effect is now measurable rather than projected for the first time: the debt fell from 1.140000 to 1.135197 USDC (25 Aug, right after the first harvest), and at today's rates the net repayment pace is —. How that is computed, and where its limits are — right below.The counter that stood at zero has moved
From the position opening on 8 Jul until mid-August, not a single UserHarvestPayout existed for my wallet. This page said so honestly: the measured repayment counter stood at 0.00. On 14 Aug 2026 at 10:28 UTC that changed — Hobba's contract harvested my position for the first time and emitted an event carrying every number. These are those numbers, decoded from the Program data: log of transaction 3jWzKkgw…U2yVJN ↗.
gross_harvest · crystallised out of the share pricefee_amount · 15.000% of gross, exactlydebt_repaid · 85% of the yield → repaymentuser_amount · all of it went to debt, none to pocket6vCAxJ6m… and 0.266654 in the JupLend pool 7s1da8Dd… that carries the debt. The sums reconcile to the micro-USDC.Why 1 SOL does not earn 8%, but about 1 USDC a year
The most common misreading of this model — I held it myself — goes: “I put in ~$97, savings pay 8%, so I earn ~$8 a year and a 1.14 loan disappears in two months.” It does not work that way, and it is worth understanding why. The SOL does not go into savings. The SOL is only collateral. What goes into the yield vault is borrowed USDC — and borrowed money pays interest. What you earn is the spread between two rates, and only on the borrowed amount.
≈ ${{sol}} · stays yours"]:::own SOL -->|"deposited as security"| JL["Jupiter Lend
collateral itself earns +{{collApy}}% (in SOL)"]:::lend JL -->|"opens borrowing capacity
up to ~60% LTV"| CAP["≈ {{cap}} USDC of borrowing room"]:::cap CAP -->|"you took 1.14"| MY["YOUR LOAN
1.14 USDC → airKUNA treasury"]:::mine CAP -->|"Hobba takes the rest"| WB["WORKING BORROW
{{wb}} USDC · never leaves the protocol"]:::engine WB --> V["{{vaultName}}
+{{vaultApy}}% gross"]:::vault V -->|"harvest ~every hour"| H{"Yield split"}:::split H -->|"15%"| FEE["Hobba fee
−{{fee}} $ / yr"]:::cost H -->|"85%"| PAY["Gross toward debt
+{{payGross}} $ / yr"]:::good JL ==>|"interest {{borrowApy}}% on the WHOLE debt of {{total}}"| INT["Interest
−{{int}} $ / yr"]:::cost PAY --> NET["NET AGAINST YOUR DEBT
+{{net}} $ / yr"]:::net INT --> NET classDef own fill:#fff,stroke:#002F6C,color:#002F6C,font-weight:600; classDef lend fill:#0A3B82,stroke:#001631,color:#fff,font-weight:600; classDef cap fill:#fff,stroke:#5B6B82,color:#14202E,font-weight:600; classDef mine fill:#C8912A,stroke:#9a6f1f,color:#fff,font-weight:600; classDef engine fill:#002F6C,stroke:#001631,color:#fff,font-weight:600; classDef vault fill:#0A3B82,stroke:#001631,color:#fff,font-weight:600; classDef split fill:#fff,stroke:#C8912A,color:#002F6C,font-weight:600; classDef cost fill:#C0181C,stroke:#7d1013,color:#fff,font-weight:600; classDef good fill:#1A7A3C,stroke:#0c3f23,color:#fff,font-weight:600; classDef net fill:#1A7A3C,stroke:#0c3f23,color:#fff,font-weight:700;
The same story in numbers, per year
Rates are pulled live from Hobba's public API, so this table does not go stale. Last reading: —.
So why does the debt read 46.95 USDC when I borrowed 1.14?
Because two borrowings hang on the same obligation. The larger one is not yours — it is money Hobba borrowed and immediately turned into vault shares of equal value. Debt and asset cancel out, leaving only your part. That is exactly how Hobba's own SDK computes it.
{{total}} USDC
(this is what you see on Jupiter Lend)"]:::tot T --> A["Your loan
1.14 USDC"]:::mine T --> B["Hobba's working borrow
{{wb}} USDC"]:::engine B <-->|"equal value —
they cancel out"| C["Vault shares
{{shares}} shares ≈ {{wb}} USDC"]:::vault A --> R["YOUR ACTUAL DEBT
= {{total}} − {{wb}}
= {{mine}} USDC"]:::res C -.->|"nets out"| R classDef tot fill:#fff,stroke:#5B6B82,color:#14202E,font-weight:600; classDef mine fill:#C8912A,stroke:#9a6f1f,color:#fff,font-weight:600; classDef engine fill:#002F6C,stroke:#001631,color:#fff,font-weight:600; classDef vault fill:#0A3B82,stroke:#001631,color:#fff,font-weight:600; classDef res fill:#1A7A3C,stroke:#0c3f23,color:#fff,font-weight:700;
userDebt = total obligation debt − deposited_to_vault. The working borrow nets out because it is covered by the vault position it bought.Two debts on one position — and what is actually measurable about each
This position carries two separate debts, and their counters behave completely differently. The first is the engine's debt — leverage Hobba's operator took against my collateral — and it is measurable on-chain to the last digit. The second is my own 1.14 USDC loan — which is measured not by events but by netting, something this page previously got wrong. Both are broken down below.
OperatorRepaiddebt_repaiddeposited_to_vaultOperatorBorrowed · 8 Jul 2026reading the position account…deposited_to_vault field on the position account today reads 45.814488 USDC — and 55.999670 − 10.185183 gives 45.814487. The difference is 0.000001 USDC, one micro-USDC of rounding on share purchases. The decoded events and the live account state agree to the last digit, and the figure above is re-read every 60 seconds.Debt 2 · my 1.14 USDC — negative interest, measured
Here we have to correct ourselves. This page used to say the counter on my loan stood at zero because no UserRepaid exists for my wallet — still true, but not the right measure. Hobba's own SDK defines the debt as my debt = total obligation debt − deposited_to_vault. The engine's working borrow is therefore netted out. By that definition my debt has gone down — and it can be checked with a number.
UserRepaid)getAccountInfo — it requires tick math, so Hobba's public endpoint computes it. That is the only number on this page that does not come straight from the chain. We cross-check it against our own event arithmetic: with no interest at all the debt would be 46.687833, and the endpoint reports — — the difference is exactly the accrued interest. The event to watch: when the debt hits zero, a transaction releasing the 1 SOL collateral will appear on the position account ↗.What actually happened on my position
Every Hobba event that has ever touched my position account A2Pmj1Ar…oyLEX, with amounts exact to the micro-USDC. Nothing is copied from an interface: every Program data: log is resolved via the Anchor discriminator (sha256("event:<Name>")[0:8]) and decoded against the IDL. The list is populated from the daily snapshot, and the page adds new transactions live as soon as an RPC sees them.
data/daily/), and that snapshot never truncates history already recorded. Before it is written it must pass the reconciliation check ΣOperatorBorrowed − ΣOperatorRepaid = deposited_to_vault; if that fails, the snapshot is discarded rather than publishing wrong numbers.How you can earn passive yield on Solana too — simply
Even as a developer I did not get Hobba straight away (it is not exactly built for the mainstream 🙂) — so here is the simplest possible explanation, using my real example above. In short: you deposit an asset, it earns yield in Solana liquidity protocols, and Hobba runs that for you.
You deposit an asset
You put up SOL (or cbBTC) as collateral. It stays your asset — it just starts working.
Hobba deploys it
The collateral automatically goes into Solana liquidity protocols (Jupiter Lend, Kamino, Perena) that pay yield.
The yield works — on its own
Hobba's engine harvests yield every day (see the cadence below). You do not have to do anything — passive.
(Optional) You borrow
You can take a small USDC loan against the collateral. The yield repays it — "self-repaying".
Everything you can do comes down to 4 buttons (Hobba "Manage") — nothing complicated:
A single Hobba position touches several Solana protocols
Hobba is a router: it directs collateral and borrowed USDC through external lending/yield protocols, harvests yield and uses it to repay debt. Chips that light up green are protocols we have just detected in the latest on-chain transactions of the Hobba program.
1.14 USDC loan
borrows
Hobbakk1…E2i8qGharvests (CPI)
How often does Hobba actually run?
This is an answer you can only reach by watching the chain: how many transactions the Hobba program executes each day. Every bar is one day — the height is the number of on-chain operations (harvest, repay, rebalance…) servicing all positions, including mine.
Hobba's engine right now
The latest transactions of the Hobba program, classified by type (from on-chain logs) and by external protocol. Δ USDC = gross USDC routed in that transaction — a harvest pulls accrued yield out of the reserve and redistributes it (the bulk back into the pool that services debt, a small part to fee/operator). It is not profit and not my personal share; net new USDC in the transaction ≈ 0.
Open it and check for yourself
Pozicija #1 · founder wallet
6bwzpkSKSXbjVMBYMSdazEytkaCZatibRdmExpjSgCyA · Solscan ↗Deposit + borrow tx:
4gKWd9Yp…jchtvq · open tx ↗My position account:
A2Pmj1ArCn3REhAnpbXcqqgHNcrrexLPEA1YdK9oyLEX · Solscan ↗ · checking…First harvest (14 Aug 2026):
3jWzKkgw…U2yVJN · open tx ↗Position vault shares:
star9agSpjiFe3M49B3RniVU4CMBBEK3Qnaqn3RGiFM · Solscan ↗Position token (Hobba):
B7opsVGR2bi8EN18eDZi4QE3hL1fWqX6JdsPbAirYCwBHobba program:
Hobbakk1LmW2DhE4nAKnCeU1iK7V7pKHTq3ihaE2i8qG · Solscan ↗
deposited_to_vault), and that is the hardest number here. My own debt, however, cannot be fully computed from the chain alone: the total debt on Jupiter Lend requires tick math performed by Hobba's public endpoint, so that one number is indirect — we cross-check it against our own event arithmetic and label it as such. No UserRepaid has ever named my wallet; the repayment happens by netting, not by an event.