Every hour, Kerne signs a statement of exactly how much USDC sits behind every kUSD, and anyone can run it again from the chain and get the same number. Not once a quarter. Every hour.
Signed every hour
A statement signed every hour.
Every hour our strategist key signs the reserve figures. Recover the signer from the hash and the signature, and it must match the published key.
Base block 51,230,803Hashed
sha256 of the canonical payload gives the attestation hash.
0x8b08dbc2…a049a88aSigned
The key signs that hash with EIP 191 personal_sign.
0x8a11c6cb…fed6351cMatches
The recovered address equals the published signer.
0x09a2…A37eReproduce from chain
Every figure reads back from Base.
Each balance is a public contract call. Run it with cast and the numbers come back to the wei. Redeem kUSD for USDC against a PSM in one transaction, with no lockup and no cooldown.
$ export ETH_RPC_URL=https://mainnet.base.org $ export USDC=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 $ cast call $USDC "balanceOf(address)(uint256)" \ 0xaBDE1138aa1Ce88d1dF06422C0c3b05D70569803 -b 51232415 30000000 $ cast call $USDC "balanceOf(address)(uint256)" \ 0xFf3025ec18e301855aB0f36Ec6ECa115a29A5Fbc -b 51232415 85885006 $ cast call $USDC "balanceOf(address)(uint256)" \ 0x07eBb486e11BD217e6085eb5ab663e4517595993 -b 51232415 995003000 $ cast call 0x5C2EfdF0D8D286959b42308966bc2B97f5680AA3 \ "totalSupply()(uint256)" -b 51232415 1144707154000000000000 # 30.00 + 85.885006 + 995.003 # = 1,110.888006 USDC, to the wei
chain 84530x07eB…5993995.000xFf30…5Fbc85.890xaBDE…980330.00For builders
One call returns all of it.
Plain JSON, public, no key. The signed statement adds the signature, the signer and the snippets to recover it yourself.
GET /api/porLive reserves, read from BaseGET /api/por/signedThe signed statement, with its signature
const por = await (await fetch( "https://kerne.fi/api/por")).json(); // the response on 12 Sep 2026, trimmed { "solvency": { "status": "fully-backed", "psmSolvencyPct": "100.11%" }, "reserves": { "psm": { "usdcHeld": 1110.888006 } }, "liabilities": { "kUSD": { "outstanding": 1109.707154 } }, "redemptionDepth": { "instantSingleTransactionPctOfOutstanding": "89.66%" }, "blockNumber": 51232415 }
import { verifyMessage, getBytes } from "ethers"; const json = await (await fetch( "https://kerne.fi/api/por/signed")).json(); const recovered = verifyMessage( getBytes(json.attestation_hash), json.signature ); console.assert( recovered.toLowerCase() === json.signer.toLowerCase(), "signature mismatch" ); // passes: 0x09a2…A37e
curl -s https://kerne.fi/api/por/signed > por.json HASH=$(jq -r .attestation_hash por.json) SIG=$(jq -r .signature por.json) SIGNER=$(jq -r .signer por.json) cast wallet verify --address $SIGNER $HASH $SIG # Validation succeeded. # Address 0x09a2…A37e signed this message.
Questions, answered.
What does the signed statement prove?
That a named key signed these exact reserve figures at this time, and that the published numbers match what was signed. The backing figures inside it are what you read for solvency.
How fresh is it?
It is signed every hour and carries its own timestamp inside the signed payload. Compare _meta.freshness.expires_at to your own clock rather than trusting a cached flag.
Can I redeem kUSD for USDC in one transaction?
Yes, against one PSM, up to that PSM’s own USDC. At the 12 Sep 2026 read the deepest leg covered 89.66% of outstanding kUSD and the three together covered 100.11%. No lockup, no cooldown.
What fee does the PSM charge?
A ladder by ticket size: 10, 8, 7 or 5 basis points, in and out. Read the fee on chain from the PSM before you send.
Does an oracle set the mint price?
No. USDC goes in and kUSD comes out one for one, less the fee. A Chainlink USDC/USD feed is read only as a depeg gate: if USDC slips off its peg, a mint or redeem on the live PSM reverts.
Who audited the contracts?
Hexens. Its final report of 31 July 2026 closes every finding, eight fixed and two acknowledged, and the source is verified on Sourcify.