Kerne Logo

Snapshot 2026-08-09. 13 products across 3 protocols. 30 day window.

Solana yield: what it says, and what it paid.

Advertised yield next to realized yield for Solana stablecoin lending products, measured from a share price rather than from a claim. The collector is MIT licensed, has zero runtime dependencies and needs no API key. The interesting result is not a scalp. It is that the number on the page is an instantaneous rate, and most gaps computed from one reading of it are measuring the clock.

The finding, which is not the one we went looking for

This board first ran on August 4, 2026. Its widest row that day was Kamino's PYUSD reserve, advertising 6.92 percent against 4.60 percent realized, a 2.32 point shortfall. That was very nearly published as a finding about Kamino.

Three days later the same code on the same reserve read 3.25 advertised against 4.76 realized. The gap had not narrowed. It had changed sign. On August 8 a single read caught the USDC reserve advertising 18.19 percent, and a read a few minutes later returned 3.91.

Nothing was broken and nobody was lying. A lending reserve's supply APY is an instantaneous rate set by utilisation, and Kamino's rate curve kinks hard above 95 percent utilisation, where the borrow rate runs from about 4.61 to about 30.4 percent. A reserve oscillating in the high eighties therefore prints an advertised number whose 30 day range spans a factor of 18.4, while the realized figure over the same period moves by hundredths of a point.

So a spot reading minus a 30 day realized figure does not measure the product. It measures when the collector ran. Every advertised-versus-realized board that samples a spot rate once has this problem, including ours, and it is invisible unless you look at the distribution the reading came from.

The board

Read as of 2026-08-09T18:18:42.103Z. The last column is the one to quote: the same subtraction done against the median of the advertised figure's own published history rather than against one reading of it.

ProductAdvertised, at readRealized, 30dAdvertised range, 30dGap vs median
Kamino Lend USDC (Main market)3.994.103.21 to 24.35 (7.6x)-0.25
Kamino Lend USDG (Main market)2.602.841.90 to 11.74 (6.2x)-0.36
Kamino Lend PYUSD (Main market)4.124.741.32 to 24.34 (18.4x)-0.69
Kamino Lend USDT (Main market)2.693.632.21 to 4.27 (1.9x)0.14
Kamino Lend USDS (Main market)3.954.303.34 to 4.79 (1.4x)-0.02
Save USDC (Main pool)2.522.37not publishedn/a
Save USDT (Main pool)1.431.39not publishedn/a
Jupiter Lend Earn USDC5.113.99not publishedn/a
Jupiter Lend Earn JupUSD3.833.76not publishedn/a
Jupiter Lend Earn USDT3.123.27not publishedn/a
Jupiter Lend Earn USDS3.513.72not publishedn/a
Jupiter Lend Earn USDG4.384.36not publishedn/a
Jupiter Lend Earn EURC3.003.47not publishedn/a

Measured that way, Kamino delivers what it advertises on all 5 of the reserves this board can measure that way, the largest miss in either direction being 0.69 points on Kamino Lend PYUSD (Main market). That is a duller headline than the first draft and it is the correct one.

2 of the rows in this snapshot were captured outside the middle half of their own recent range (kamino-lend-usdt, kamino-lend-usds). The dataset flags those rows itself rather than leaving a reader to notice.

Save and Jupiter publish a current rate but no history of that rate, so 8 of the 13 rows show not published in the range column and nothing at all in the last one. They carry the absence rather than a substitute borrowed from a third party.

Do not subtract the first two columns on those rows. That subtraction is the exact mistake described at the top of this page, and on a row with no known distribution there is no way to tell whether the answer describes the product or the minute we read it. The dataset refuses to rank those rows for that reason, and so does this page. The collector now records the advertised figure on every run, so those rows build a distribution from our own series and become readable over time.

Why the realized column is empty everywhere else

ERC-4626 gives every EVM vault the same call, so a share price is one line of code and advertised-versus-realized boards exist for EVM stablecoins. Solana has no equivalent standard, and the obvious escape hatch is closed: none of USDY, PYUSD, BUIDL, syrupUSDC, sUSDe, USDC or USDG carries the Token-2022 interest bearing or scaled amount extension, so there is no protocol agnostic on chain rate to read either. Realized yield on Solana has to be assembled per protocol from raw account data, which is why nobody publishes the column.

For Save, the collector decodes the 619 byte reserve account itself over a public RPC and agrees with Save's own published exchange rate to fifteen decimal places. No SDK, no key, no trust. Run node bin/solhonesty.mjs verify --key save-usdc from a clean clone and you get that comparison printed.

Take the data, not our word for it

This page is a dated snapshot. The two live artifacts are:

  • The open dataset, CC BY 4.0, rebuilt and republished every day by the collector itself. Browsable in place, or one CSV download.
  • The collector, MIT, zero runtime dependencies, no API key, no wallet. It builds from a clean clone in one command and its test suite runs offline.

If the dataset and this page ever disagree, the dataset is newer and the dataset wins.

The part where this applies to us

There is no Kerne row on this board, and that should be the first thing you are suspicious of. The reason is scope rather than convenience: this board measures Solana products and Kerne's are on Base, so any Kerne row here would have to be invented. If we ever ship a Solana product it goes on this board, measured by this code, with no exemption.

We do publish ourselves, by the same method, against EVM synthetic dollars at the Honesty Index, which measures more than a dozen synthetic dollars including this one. Our own row is the worst on that board, by our own engine's own rules, and the board says so on the row itself rather than in a footnote. We are not in a position to be smug about anyone's advertised rate, which is precisely why this page leads with the conclusion that Kamino comes out fine.

The methodological error described at the top of this page was ours, was found by using our own tool, and is now a regression test in it. Things we measured and then got wrong go in the refusal log.