The incident
Three dollars and forty-four cents. Nine million and fifty thousand dollars. Seven seconds between them.
On 11 July 2026, an attacker submitted a price update to Supra's Hedera pull oracle. The proof it carried used identity and null elements that the on-chain verification path did not rejectPRIMARY-SUPRA
The verifier said yes.
The SAUCE/wHBAR price returned inflated by approximately twelve orders of magnitude — Bonzo reports a real value near 0.2 HBAR against a submitted price field of 1 followed by thirty zerosPRIMARY-BONZO Bonzo Lend consumed that price and issued 6,634,528.202695 USDC and 34,518,389.36109841 WHBAR against 250 SAUCE deposited 11 minutes 47 seconds earlierPRIMARY-BONZO
Bonzo Lend and Bonzo Points were suspended. Bonzo Vaults, Bonzo Bridge, and BONZO/XBONZO staking were unaffectedPRIMARY-BONZO
The eight-second figure describes the first draw, not the exposure. The second draw followed 17.4 seconds after the manipulated write, and the protocol remained priced wrong for approximately forty-four minutes. Section 02 separates the four intervals that coverage of this incident has consistently conflated.
Evidence classes & policies
PRIMARY-BONZO disclosed by Bonzo Finance
PRIMARY-SUPRA disclosed by Supra
ON-CHAIN readable in a transaction record
THIRD-PARTY reported by an external analyst
FC-DERIVED computed by Forensic Capital from stated inputs
UNRESOLVED not closed by any source reviewed
Rounding. Token amounts are reproduced at full published precision. Derived USD figures are computed unrounded and displayed to the cent. Percentages are displayed to two decimals as published by the data source. Durations are given to the tenth of a second when both endpoints carry sub-second precision, otherwise to the minute. Any figure whose rounding changes its interpretation is shown both ways.
Clock. The Hedera consensus timestamp encoded in a transaction identifier is the canonical clock. Where a party's published time diverges from it, both are shown and the divergence is flagged UNRESOLVED. Intervals are computed from the party-reported clock so they remain comparable to the published record.
Terminology. Manipulated write denotes the transaction that placed the fraudulent price on-chain. Draw denotes a borrow against the resulting collateral valuation. These two terms are used throughout to the exclusion of synonyms.
The mechanism
Supra states that an out-of-bounds committee identifier could produce null key material, while its on-chain verifier did not reject identity or null elements. That combination allowed a fraudulent pull-oracle update to pass verification and write a manipulated SAUCE/wHBAR pricePRIMARY-SUPRA
Supra also states that its off-chain computation, aggregation and signing were not compromised, that no valid Supra attestation existed for the fraudulent price, and that the incident was confined to SAUCE/wHBAR, pair 425, on Bonzo Finance. Its push oracle was unaffectedPRIMARY-SUPRA
out-of-bounds committee id → null key material → pairing equality satisfied → verifier returns true → manipulated price written → collateral revalued → draw executed
The verification predicate returned true for an input pair on which it had no defined rejection condition. The precompile evaluated the equation it was given correctly; the verifier supplied it with operands it should have rejected beforehand.
Control failure matrix
| Control expected | Layer | State before | Fix |
|---|---|---|---|
| Committee exists and holds a registered key | Supra verifier0.0.4323006 | Out-of-bounds ID returned null key material | Validation added, 11 JulPRIMARY-SUPRA |
| Identity and zero elements rejected | Supra verifier | Not rejected | Explicit rejection added, 11 JulPRIMARY-SUPRA |
| On-curve and subgroup validation | Supra verifier | Not performed before pairing call | Added before precompile call, 11 JulPRIMARY-SUPRA |
| Price movement bound on thin-liquidity assets | Consuming protocol0.0.7308480 | Not documented | Recommended by Supra; no deployment publishedUNRESOLVED |
What the chain adds
Two facts below were read from the Hedera mirror node directly. Neither appears in either party's disclosure or in any coverage reviewed.
The vulnerable implementation was 102 days old. The verifier at 0.0.4323006 is a proxy, created 19 December 2023ON-CHAIN A proxy's creation date is not its implementation's. The implementation it pointed at when the manipulated write landed was deployed on 31 March 2026 — 102 days before the incidentON-CHAIN
The two-year figure is a reasonable reading. The proxy address genuinely is that old, and explorers surface the proxy first. The distinction between a proxy and the implementation behind it is the kind of thing that gets flattened when an incident is written up at speed. The record was public the whole time. It required asking the chain a second question.
What changes with the correct figure: this was not dormant legacy code that nobody had looked at since 2023. It was a recent deployment. Whatever review process preceded it did not catch a degenerate-operand case in a signature verifier.
The fix landed 6 hours 17 minutes after the exploit. Supra declared the three guards live on 11 July without publishing a time. The upgrade transaction carries a consensus timestamp of 07:08:24 UTC that dayON-CHAIN — 6h 17m after the manipulated write at 00:51:39.646.
The degenerate pairing, formally
A BLS verification checks one equality:
where σ is the signature in G₁, pk the public key in G₂, H(m) the hashed message, and e the bilinear pairing. Bilinearity gives the identity e(O, Q) = 1 for the point at infinity O and any Q — a property of the map, not a defect in its implementation.
Supra's account describes two inputs arriving together: an out-of-bounds committee identifier resolving to null key material, and proof elements at identityPRIMARY-SUPRA Under those two conditions the equality reads 1 ≟ 1. It is satisfied for every message. The predicate is not weak — it is undefined, because no rejection condition was expressed for operands of this shape.
This is why the fix is three guards and not one: committee resolution, identity rejection, and on-curve plus subgroup validation each close a different way of reaching a degenerate operand.
Two distinct failures, one cascade. The verification bypass is the technical cause: without it, no fraudulent price is written. The absence of a plausibility bound on the consuming side is a containment failure: without it, a data anomaly becomes liquidity extraction. Merge them and you misattribute the defect.
No component reverted. No error was raised.
Verification path
Every claim above is checkable without privileged access.
| # | To verify | Method |
|---|---|---|
| 1 | Consensus timestamp of the manipulated write | Query the mirror node and read consensus_timestamp. The timestamp inside the identifier is the valid-start, not the consensus time. |
| 2 | Draw amounts and ordering | Resolve account 0.0.10633526 and read its transaction list for 11 July 2026. |
| 3 | Verifier and adapter identity | Resolve 0.0.4323006 and 0.0.7308480; compare against both parties' reports. |
| 4 | Loss reconciliation | Apply the formula in section 06 to the published draw amounts and reference prices. |
| 5 | Value trajectory | Query the DefiLlama historical series for slug bonzo-lend, 26 June to 22 July 2026. |
We did not decode transaction call traces or examine verifier bytecode. The mechanism above is reconstructed from both parties' technical disclosures and the cryptographic property they describe — not from independent decompilation. Any claim that would require decompilation to establish is marked UNRESOLVED.
Timeline
| Time (UTC) | Event | Evidence |
|---|---|---|
| 00:39:53 | Attacker deposits 250 SAUCE as collateral | PRIMARY-BONZO |
| ~00:40:00 | A valid oracle update is submitted | THIRD-PARTY |
| 00:51:39.646 | Manipulated write — consensus timestamp 1783731099.646109213 | ON-CHAIN |
| ~00:51:47 | First draw — 6,634,528.202695 USDC | PRIMARY-BONZO |
| ~00:51:57 | Second draw — 34,518,389.36109841 WHBAR | PRIMARY-BONZO |
| 01:36 | Legitimate publication restores SAUCE to ~0.1964 HBAR | THIRD-PARTY |
| ~01:41 | Bonzo pauses lending | THIRD-PARTY |
| Interval | Duration |
|---|---|
| Preparation — deposit to manipulated write | 11 min 46.6 s |
| Execution — manipulated write to first draw | 7.4 s |
| Full extraction — manipulated write to second draw | 17.4 s |
| Response — legitimate publication to pause | ~5 min |
| Total exposure | 44 min 20 s |
All intervals FC-DERIVED from the timestamps above. The manipulated write's consensus timestamp was read directly from the Hedera mirror node and matches Bonzo's published time to the millisecond.
Contracts & flows
| Role | Address | Evidence |
|---|---|---|
| Attacker (Hedera) | 0.0.10633526 | PRIMARY-BONZO |
| Attacker (EVM) | 0x9a4966152f6e10b33cb7a37975e8619816d6a494 | PRIMARY-BONZO |
| Supra pull oracle | 0.0.4323024 | PRIMARY-BONZO |
| Supra verifier requireHashVerified_V2 | 0.0.4323006EVM 0x2fa6dbfe4291136cf272e1a3294362b6651e8517created 19 Dec 2023 · admin key present | PRIMARY-BONZO ON-CHAIN |
| Bonzo adapter to Supra | 0.0.7308480 | THIRD-PARTY |
| Hedera pairing precompile | 0.0.8 | PRIMARY-BONZO |
| Target pair | SAUCE/wHBAR — pair ID 425 | PRIMARY-SUPRA |
| Manipulated write (EVM) | 0xd50c55e24eb8483ec55bf74e84fc9853d0f0fe36f64abdb812a2d9afa2a10a60 | ON-CHAIN |
| Manipulated write (Hedera) | 0.0.995584-1783731093-686041919 | ON-CHAIN |
The manipulated write resolves to an ETHEREUMTRANSACTION, result SUCCESS, calling entity 0.0.4323024 — the pull oracle, not the verifier. Charged fee: 40,707,546 tinybars against a 1,815,000,000 maximumON-CHAIN
Every identifier above is public; readers are invited to resolve them on hashscan.io independently.
Post-exploit flows. Third-party on-chain analysis reports that a portion of the funds was bridged to Ethereum via LayerZero and converted, including WBTC to ETH, and that an aggregation address associated with these flows was initially funded with 1 ETH from Tornado CashTHIRD-PARTY No reconciled amount has been publishedUNRESOLVED
This describes reported on-chain movement. It does not identify who controls these addresses, and no inference about that should be drawn from it.
Attribution
Bonzo Finance publicly attributed the failure to a vulnerability in the third-party oracle provider's verification mechanismPRIMARY-BONZO Supra published a technical incident report the same day at 13:55 UTC and located the triggering defect in its own on-chain verifierPRIMARY-SUPRA
Supra also states that Bonzo could have limited the impact through sanity bounds and circuit breakers on a thin-liquidity assetPRIMARY-SUPRA
Supra identifies the triggering defect in its on-chain verifier. This report takes no position on legal responsibility between the two parties.
Value trajectory
| Point | TVL | Change | Evidence |
|---|---|---|---|
| Baseline, J-7 to J-1 mean | $14.18M | — | THIRD-PARTY |
| J0 — 11 July | ~$4.03M | −72.11% vs baseline · −71.57% vs prior day | THIRD-PARTY |
| J+1 — 12 July | ~$2.86M | −29.10% vs prior day | THIRD-PARTY |
| J+7 — 18 July | ~$2.72M | −80.82% vs baseline | THIRD-PARTY |
Dataset: DefiLlama historical TVL series · slug bonzo-lend · 29 daily points · 26 June to 22 July 2026. Absolute values at J0, J+1 and J+7 are FC-DERIVED from the baseline and the published percentages. Scope note: the bonzo-finance aggregate, which includes Vaults and Bridge, shows a decline 2.2 points shallower. Those products were unaffected, so the pool-level series is the correct scope.
Figure 1 · The decline does not stop when the extraction stops.
Figure 2 · The withdrawal outlasted the extraction by a full day.
The second day matters as much as the first. J0 removed 71.57% of pool value. J+1 removed a further 29.10% of what remained. The extraction lasted 17.4 seconds; the withdrawal it triggered lasted two days.
Total value locked is a stock measure in USD. It does not by itself establish a net outflow of assets, and it should not be read as a second loss figure alongside the $9.05M. The decline may combine withdrawals, asset price movement, and the removal of the borrowed principal; these components are not separable from the published seriesUNRESOLVED
Figure 3 · The protocol was mispriced for 153 times longer than it was being drained. Intervals from section 03, plotted on log10(seconds). FC-DERIVED
Loss reconciliation
| Category | Amount | Status at 24 July |
|---|---|---|
| Headline loss | $9,050,000 | Reported by Bonzo FinancePRIMARY-BONZO |
| Second account, white hat intent | ~$1M | Treated by Bonzo as a recovery item, excluded from headline. Restitution not confirmedUNRESOLVED |
| Funds recovered on-chain | Not published | No transaction-level inventory in the public recordUNRESOLVED |
| User compensation | Not published | Program announced by the Bonzo Finance Foundation and the Hedera Foundation. Ongoing, not completedPRIMARY-BONZO |
USDC drawn 6,634,528.202695 × $1.00000 = $6,634,528.20
WHBAR drawn 34,518,389.36109841 × $0.06998 = $2,415,550.23
Computed total $9,050,078.43
Reported headline $9,050,000
Delta $78.43
The headline figure reconciles to within $78.43, consistent with rounding to the nearest $10,000. Prices are Bonzo's stated reference prices at the time of the draws, not marks at any other block.
Collateral value. At the restored rate of 0.1964 HBAR per SAUCE and $0.06998 per HBAR, 250 SAUCE computes to $3.44FC-DERIVED This is an illustrative approximation, not a mark-to-market at the deposit block: the SAUCE reference used is the post-incident restored price, and no price at the deposit block has been publishedUNRESOLVED On that basis the collateral-to-credit ratio is on the order of 2.6 million to one.
What we don't know
- The price of SAUCE at the deposit block. The $3.44 collateral figure uses the post-incident restored rate. No contemporaneous price has been published.
- Whether the valid oracle update at ~00:40:00 was a deliberate execution path test. The sequence is consistent with this reading. It is not established.
- Whether other deployments shared the same verifier implementation. The implementation address is known and its deployment date established. Which other Supra deployments pointed at it, and whether any were preventively upgraded, is not published.
- Whether the fix was audited before deployment. The upgrade transaction is on-chain and timed. No pre-deployment review of the three added guards has been published.
- Reconciled amount of the post-exploit flows to Ethereum. Third-party analysis reports the movement. No reconciled figure has been published.
- Funds recovered, frozen, or returned on-chain. No transaction-level inventory exists in the public record.
- Composition of the TVL decline. Withdrawals, asset price movement and removal of borrowed principal are not separable from the published series.
- Blast radius beyond pair 425. Supra states the incident was confined to SAUCE/wHBAR on Bonzo Finance. Which other deployments shared the same verification pattern is not published.
- Who controls the attacker addresses. On-chain flows are reported. Attribution to any person or entity is not.
No public source reviewed at the time of publication closed any of these questions.
Position in the corpus
FC-046 is classified FC-CLASS-003 — oracle price manipulation — on the criterion that the exploit path runs through a price value consumed by the protocol. It is one of 7 cases in that family, spanning 2019 to 2026.
Seven cases is enough to stop calling this a category of accident and start calling it a mechanism. Every case in the family asks the same question: what did the protocol do when the number it was handed made no sense?
Here, nothing. Because no one had written down what an impossible number looks like.
The oldest case in this family is from 2019. The failure mode has not changed since. What has changed is the size of the positions standing on top of it.
Two conditions hold across all seven, without a single exception: the protocol consumed an external price it did not control, and that value was corrupted before consumption. What differs is the how — six distinct defect types across seven cases. The largest is 32 times the smallest with a recorded loss. This one is the only instance where the corruption passed through a signature verifier rather than through the market or the feed itself. By loss, it sits fourth.
Three of the four charts this report could have drawn are drawn above. The fourth is the one that needs the other six cases: where a given loss sits in the family's distribution, and which guard was missing in how many of them. That one is not a chart about Bonzo.
Because the pattern across the seven is not that the oracle broke. It is which control was absent on the consuming side when it did — and that recurs with a regularity that a single case cannot show and cannot prove.
Which leaves the question this report does not answer. Not how Bonzo failed — that is above, in full. But whether the same missing control sits in your own dependency chain, and what it has cost the seven protocols that found out the hard way.
What you have just read is one case, reconstructed in full. The comparative layer is the same discipline applied across all seven, 2019 to 2026 — where the value is not in any single reconstruction but in what the seven have in common.
Refreshed as each new case enters the corpus: every addition re-prices the other six. Built for underwriters pricing oracle exposure, treasuries sizing a single-feed dependency, and counsel documenting a loss.
Method. This reconstruction is assembled from primary disclosures by both parties, third-party on-chain analysis, and public explorer records. Every identifier is published so that any claim here can be checked against the chain by the reader. Every claim carries its evidence class. Contract metadata, the consensus timestamp of the manipulated write, the implementation deployment date, the fix upgrade timestamp, the transaction result and its fees were read directly from the Hedera mirror node by us. We did not decode transaction call data or examine verifier bytecode, and we make no claim to have done so.
Coverage at time of publication. Bonzo Finance and Supra published incident reports on 11 July. Rekt News published on 13 July, BlockSec on 14 July, QuillAudits on 19 July. No exhaustive reconciliation of outbound flows, freezes, recoveries, restitutions and compensation has been identified in the sources reviewed.
Sources. Bonzo Finance, Bonzo Lend Incident Report — Oracle Provider Exploit · Supra, Security Incident Report: Hedera Pull Oracle Verifier · @SUPRA_Labs · HashScan (Hedera mainnet) · DefiLlama · autosec.dev · research.dnzn.dev · rekt.news · BlockSec · QuillAudits
Ω · Forensic Capital
Independent DeFi post-incident reconstruction. Generated from the FC proprietary incident corpus. Independent of both parties: no engagement with Bonzo Finance or Supra Oracles preceded this report.
This document is sealed. The hash above covers the report as published; any alteration changes it.