Kerne Logo

Comparison, as of June 19, 2026

Resolv vs Kerne.

Two delta-neutral synthetic dollars, two different mint-path gating models. After the March 22, 2026 USR exploit, the question worth asking is not which yield is higher. It is how each protocol gates the function that mints supply, and what an attacker would need to compromise to mint unbacked tokens.

The short version.

On March 22, 2026, an attacker compromised one off-chain signing key inside Resolv's infrastructure, deposited about $100,000 of USDC, and used the signing privilege to mint approximately 80 million unbacked USR against those deposits. The attacker extracted approximately $24.5 million in ETH before the team could pause the contracts. USR depegged from $1 to a low of roughly $0.025 on Curve before partial recovery. The Resolv team paused contracts and published a remediation; operations resumed. These figures are drawn from Resolv's own post-mortem and the public analyses by Halborn and QuillAudits, all linked below; reported numbers vary across sources.

The architectural class of failure was: a single off-chain key was the sole gate on an unbounded on-chain mint. The on-chain function accepted the mint amount as a caller-supplied parameter rather than deriving it from on-chain deposit balance, and there was no per-call or per-block ceiling on mint quantity.

Kerne kUSD's mint path is gated differently. MINTER_ROLE is held only by two on-chain contracts, the mint amount is derived from the contract's own USDC balance via the PSM, and role administration is gated by a 2-of-3 Gnosis Safe multisig with Trezor-first signing. The commands that verify each property against Base mainnet are below.

What happened to Resolv on March 22, 2026.

Resolv's normal USR mint flow ran like this. A user sent USDC to a contract entry point. An off-chain Resolv backend observed the deposit, computed the USR amount, signed an instruction with a backend-held key (the SERVICE_ROLE in their AWS KMS configuration), and called completeSwap on the on-chain contract. completeSwap accepted the instruction if the signature matched the configured SERVICE_ROLE address, and minted the requested amount of USR to the user.

The exploit. An attacker compromised the SERVICE_ROLE signing key. They sent about $100,000 of USDC into the deposit entry, the first of several such deposits (roughly $300,000 in total across three transactions, per QuillAudits). They then signed and submitted completeSwap instructions calling for 80 million USR in total, minted as 50 million and then 30 million, far in excess of the collateral provided. The on-chain contract verified the signature, observed it matched the configured SERVICE_ROLE, and minted. There was no on-chain check that the requested mint amount was bounded by the deposit. There was no per-block, per-day, or per-call cap. There was no second signer requirement. The off-chain key was sufficient.

How the attacker obtained that key is documented in Resolv's own post-mortem: a GitHub credential belonging to a contractor, reused without that person's knowledge from a prior third-party engagement, let a malicious CI/CD build workflow exfiltrate the SERVICE_ROLE signing key, and Resolv reported no evidence of insider involvement, so the contractor was an unwitting credential-reuse vector rather than a culpable party.

That is the entire exploit, end to end. The approximately $24.5 million extracted afterward was the attacker swapping the unbacked USR through secondary market liquidity across decentralized exchanges, before the team could pause the contracts. For the full forensic walkthrough, see the dated post-mortems linked at the bottom of this page.

The class of failure, not the specific bug.

The architectural class of failure here is not "Resolv had a bad key-management process." Plenty of protocols have had keys compromised. The class of failure is: a single off-chain key was the sole gate on an unbounded on-chain state change.

Three properties combined to make the Resolv vector exploitable.

  1. The on-chain mint amount was set by the off-chain caller, not derived from on-chain state. The contract did not verify the relationship between USDC deposited and USR minted; it took the requested amount as authoritative.
  2. There was no per-call or per-block ceiling on the mint quantity. A single transaction could mint any number, including amounts orders of magnitude larger than the protocol's total backing.
  3. The privileged role required exactly one signature, and the signer was an automated off-chain process whose key lived in a cloud KMS rather than in cold-stored multisig hardware.

Any one of these three would have been recoverable. Two of them combined would have been damaging but bounded. All three together made the protocol's entire collateral pool extractable in a single uninterrupted run by anyone who got the one key.

This is not a Resolv-specific failure mode. Several active synthetic-dollar protocols ship with at least one of the three properties present. Two of them is more common than the public discourse suggests. The longer companion essay at /insights/resolv-exploit-synthetic-dollar-mint-paths walks the three questions you can ask of any synthetic dollar before depositing.

How Kerne's mint path differs.

Authority. AccessControl with two named roles: DEFAULT_ADMIN_ROLE and MINTER_ROLE. DEFAULT_ADMIN_ROLE is held by a 2-of-3 Gnosis Safe multisig at 0x52d3E450bA6c299B1B07298F1E87DD74732D4877. MINTER_ROLE is held by exactly two contracts: KerneVault v2 at 0x8ccc56B5624e2FDB592F6609d81F4c3798e3292B and the live KUSDPSM at 0xaBDE1138aa1Ce88d1dF06422C0c3b05D70569803. Both are on-chain contracts. No off-chain key holds the mint privilege. Two earlier PSM instances no longer hold it. The KUSDPSM at 0xFf3025ec18e301855aB0f36Ec6ECa115a29A5Fbc had MINTER_ROLE revoked in the June 16, 2026 ceremony and now serves only as the kUSD-to-USDC redeem reserve. The KUSDPSM at 0x07eBb486e11BD217e6085eb5ab663e4517595993 had MINTER_ROLE revoked in the July 10, 2026 redeploy and is retained redeem-only, with its USDC reserve still backing the kUSD minted through it until that reserve is migrated. Both revocations are checkable in one cast call each, which is the point: the mint authority was rotated on-chain and the superseded modules read false.

Mint amount. The user-facing mint path is KUSDPSM.swapStableForKUSD. It reads the USDC the user deposited from the contract's own balance, applies a 10 basis point fee defined as a contract constant, and mints the resulting kUSD. There is no caller-supplied mint quantity, no off-chain "this is what you are getting" signal, no SERVICE_ROLE equivalent. The function is a pure on-chain calculation.

Caps. KUSDPSM enforces an on-chain mintingEnabled flag that the multisig can flip in one transaction if anything looks off. The Phase 2 kUSDMinter contract, in source but not yet deployed, additionally caps mint at a configurable per-day amount as a defense-in-depth ceiling. For Genesis Window scale this is intentionally conservative.

These three are checkable against Base mainnet in the commands below.

# 1. Is the mint privilege held only by on-chain contracts?
cast call 0x5C2EfdF0D8D286959b42308966bc2B97f5680AA3 \
  "hasRole(bytes32,address)(bool)" \
  $(cast keccak "MINTER_ROLE") \
  0xaBDE1138aa1Ce88d1dF06422C0c3b05D70569803
# expected: true (the live KUSDPSM holds MINTER_ROLE)
# 1b. Rotation proof: the retired mint PSM no longer holds it
cast call 0x5C2EfdF0D8D286959b42308966bc2B97f5680AA3 \
  "hasRole(bytes32,address)(bool)" \
  $(cast keccak "MINTER_ROLE") \
  0x07eBb486e11BD217e6085eb5ab663e4517595993
# expected: false (revoked in the July 10, 2026 redeploy)
# 2. Is the mint surface currently active?
cast call 0xaBDE1138aa1Ce88d1dF06422C0c3b05D70569803 \
  "mintingEnabled()(bool)"
# expected: true
# 3. Is role administration gated by the multisig?
cast call 0x5C2EfdF0D8D286959b42308966bc2B97f5680AA3 \
  "hasRole(bytes32,address)(bool)" \
  $(cast keccak "DEFAULT_ADMIN_ROLE") \
  0x52d3E450bA6c299B1B07298F1E87DD74732D4877
# expected: true (Safe holds admin role)

The live mint-authority checks run in continuous integration on a schedule via .github/workflows/onchain-role-smoke.yml and are surfaced as JSON at /api/risk-status, with a human-readable rendering at /risk. If any value flips, the workflow fails and the homepage banner reflects it.

Quick comparison.

Snapshot as of June 19, 2026. Both protocols evolve; verify current values at the canonical sites linked in each row.

AttributeKerne Protocol (this site)Resolv Finance (different project)
Canonical sitekerne.firesolv.xyz
ChainBase (chain 8453)Ethereum mainnet (chain 1)
Stable tokenkUSDUSR
Yield-bearing wrapperskUSD (ERC-4626)stRES; risk-bearing layer RLP
Mint-amount sourceDerived from on-chain USDC balance via PSM (pure on-chain calc, 10 bps fee)Set by off-chain caller via SERVICE_ROLE signature (the vector exploited March 22)
Mint privilege held byOn-chain contracts only (Vault + PSM)Off-chain SERVICE_ROLE key (per Halborn post-mortem)
Per-call mint capmintingEnabled flag (multisig-flippable); Phase 2 minter adds per-day cap in sourceNone at time of exploit
Admin model2-of-3 Gnosis Safe with Trezor-first signingMultisig admin with off-chain operational signers; key infrastructure was the failure surface
Live risk surface/risk + /api/risk-status (continuous)Quarterly Proof of Reserves at resolv.xyz
Signed Proof of Reserves cadenceHourly EOA-signed JSON at /api/por/signedQuarterly per published cadence
kUSD / USR contract0x5C2EfdF0D8D286959b42308966bc2B97f5680AA3 (Base)USR on Ethereum mainnet (see resolv.xyz for current canonical address)
Public bug-bounty channelkerne.fi/security; reports to [email protected]See resolv.xyz

What Kerne still owes.

This page is not a claim that Kerne has nothing left to harden. The internal adversarial audit run on May 8, 2026 catalogues 201 findings across the full contract set: 36 rated critical, 51 high, 51 medium, 37 low, 26 informational. The Phase 2 kUSDMinter contract referenced above is in source but not yet deployed. The KerneVerificationNode for cross-chain attestation is also in source and not yet deployed. The live WETH vault is now KerneVault v2 at 0x8ccc56B5624e2FDB592F6609d81F4c3798e3292B, deployed in the June 16, 2026 ceremony and holding kUSD MINTER_ROLE. It holds no user funds and has never issued a share, and public WETH deposits are closed in the app; the on-chain gate for them is written but not yet deployed, which we state rather than imply, alongside the rest of the deployed versus source picture at /security/deployed-vs-source. The retired v1 vault at 0x8005bc7A86AD904C20fd62788ABED7546c1cF2AC remains on-chain in a degraded accounting state, ringfenced and surfaced via the live vaultDegraded field on /api/stats; migrating the deposit UI to v2 and opening public WETH deposits is a deliberate, founder-gated launch step. Several access-control hardening items from the audit's section on default thresholds, role-admin self-loops, and single-key STRATEGIST_ROLE on adapter contracts remain on the remediation queue.

The point of this page is a posture difference, not an immunity claim. Every claim about how Kerne's mint path works is verifiable in a cast call against Base mainnet. Every gap is named with the remediation status visible at /security/audits and /security/findings-tracker. The Resolv exploit was a class of failure that would have been detectable to any reader running the three questions in the companion essay against any synthetic dollar beforehand. The protocols that survive long-term will be the ones whose readers do.

If you were holding USR.

For questions about Resolv's current state, redemption status, or any USR holdings, the canonical source is resolv.xyz and the Resolv team's public communications. This page does not provide guidance on Resolv-side actions.

If after reading the post-mortems and this page you are evaluating Kerne as one of several synthetic-dollar options, the four most useful surfaces are below. Each is a live link, not a marketing claim.

  • /api/risk-status: every wired risk threshold with its current on-chain value and source-file attribution.
  • /api/por/signed: hourly EOA-signed Proof of Reserves JSON with on-chain WETH, off-chain hedge equity, solvency ratio, and signature.
  • /insights/resolv-exploit-synthetic-dollar-mint-paths: the longer companion essay walking the three questions to ask of any synthetic-dollar mint path before depositing.
  • /security/audits: every internal audit finding by severity, with status and commit reference if resolved.

Next steps on Kerne.

You just saw how to verify Kerne from the outside. The next step is to hold the dollar you can check for yourself.

Sources and related disambiguation.

The Resolv exploit recap on this page is drawn from Resolv's own post-mortem (published June 2, 2026) and the public analyses by Halborn and QuillAudits, plus contemporaneous reporting from The Record and follow-up analysis from Chainalysis. Reported figures vary across these sources: the amount extracted is put at roughly $23 million to $25 million (Resolv's own post-mortem says approximately $25 million; QuillAudits itemizes $23.7 million in ETH plus $1.2 million in wstUSR), and the attacker's USDC deposits at roughly $100,000 to $300,000. Where they differ, this page uses hedged figures. The USR price low on Curve is reported at roughly $0.025 (about 2.5 cents) by The Block and CoinDesk; Halborn's post-mortem prints $0.0025 but links that figure to The Block. Resolv's current operational state is best sourced from resolv.xyz directly.

Kerne's claims on this page resolve to live endpoints: /api/risk-status, /api/por/signed, /api/stats, and the three Base mainnet cast commands listed above.

Related reading: /legible (a sourced scorecard of the 2026 synthetic-dollar collapses and how Kerne is built to be checked), and /synthetic-dollar-graveyard (the mortality table of the dollars that went to near zero, USR among them, and what actually killed them). Disambiguation pages on this site: /kernel-vs-kerne (Kernel Protocol kUSD on Ethereum is a different project), /not-kerneldao (KernelDAO on BNB Chain is a different project).

Page last updated: June 19, 2026. Snapshot fields (relative APY, TVL, post-exploit state references) age; the verification commands and contract addresses are evergreen against current deployments.