- 683,130,969.66 ZILProven theft
- 6,772 accountsKnown to have been exposed
- 51 accountsDrained
- 73.9% of attributable legacy addressesSafe by construction
Both figures are floors, established by proof rather than estimate, and annex D explains precisely why neither is a ceiling.
1. Summary
Zilliqa's legacy, non-EVM transactions are authenticated with EC-Schnorr signatures over the secp256k1 curve. Every such signature consumes a fresh secret number, the nonce, which must be drawn uniformly at random across its full 256-bit range. The Zilliqa Ledger application generated that nonce correctly and then copied it into the signing buffer incorrectly, retaining eight bytes of zero padding and discarding eight bytes of entropy. The result: every nonce it produced was smaller than 2^192, with its top 64 bits fixed at zero.
That regularity is enough to break the signature scheme. Each affected signature leaks roughly 64 bits of information about the private key, and from four or more of them the key can be reconstructed in seconds on ordinary hardware, using only data that is public on the blockchain. No device is touched, no recovery phrase is stolen, no user is tricked. The exposure is created by the act of signing, and it is permanent: signatures already written to the chain cannot be withdrawn, so a corrected application protects new keys and does nothing for keys that have already signed.
The defect was present in every released version of the application. Exploitation was first reported to us by KuCoin on 19 July 2026, after it saw anomalous outgoing transactions from one of its own cold wallets. Forensic reconstruction later established that theft had in fact begun on 4 March 2026, roughly four and a half months earlier, and had run undetected until the attacker moved from occasional single drains to an automated sweep. Legacy transactions were disabled the following day, 20 July, ending any possibility of further exploitation.
Proven theft is 683,130,969.66 ZIL across 66 transactions. 6,772 accounts are known to have been exposed. Both figures are floors, established by proof rather than estimate, and annex D explains precisely why neither is a ceiling.
2. Root cause
In plain language
When the application signed a legacy Zilliqa transaction, it was supposed to pick a fresh, entirely random secret number each time. It generated 40 bytes of randomness and reduced them correctly to a value in the valid range. Then, when copying that value into the buffer it actually signs with, it copied the wrong 32 of those 40 bytes: it kept eight leading zero bytes that were only padding, and threw away eight bytes of real randomness.
The consequence is that the secret number was never fully random. Its first quarter was always zero. That is a small enough regularity to be invisible to anyone looking at a single transaction, and a large enough one that a handful of transactions from the same account give away the key entirely.
Precisely
In what follows, G is the fixed generator point of the secp256k1 curve, n is the order of the group it generates, and a private key d has public key P = d·G.
Zilliqa's native scheme computes, for a private key d with public key P, a nonce k and its commitment Q = k·G:
r = SHA256( compress(Q) || compress(P) || message ) mod n
s = k - r*d mod nThe defect fixes the high 64 bits of k at zero, so k < 2^192 for every signature the application produced. Rearranged, each signature is an instance of the Hidden Number Problem: a linear relation in the unknown d whose error term is known to be small. Four or more such relations, assembled into a lattice and reduced, recover d exactly.
Two properties of the scheme made this far more dangerous than the equivalent flaw in ECDSA:
- The challenge value is a hash, not a point coordinate. In ECDSA the challenge derives from the nonce, so nonce reuse produces a duplicate value and is trivially caught by scanners that many chains run as a matter of course. Here it derives from the message instead, so nonce reuse and nonce bias are invisible to duplicate-value scanning. Nothing routine would have caught it.
- The published signature value is indistinguishable from random. Because
r*d mod nis uniform, the valueswritten to the chain carries no visible trace of the bias. There is no per-transaction test for this defect. The only way to determine whether an account is affected is to attempt the key recovery: the detector is the attack. This shaped the entire response, and it is why an address checker had to be built rather than a filter applied.
The fix
The correction is a single line restoring full-width nonce generation. It was written by a Zilliqa engineer and opened as a pull request against Ledger's repository for the application on 24 July 2026; a Ledger engineer merged it on 27 July, and Ledger carried it into a subsequent release. It prevents new weak signatures. It does not restore the safety of any key that has already signed. Those keys are permanently exposed and must be retired, which is why the response is a migration rather than a patch.
For the corrected build and its availability, refer to Ledger's own release communications. We do not announce another vendor's version numbers, and naming the fixed build would also name every build still carrying the defect.
3. Who was affected, and who was not
Exposed
accounts that signed legacy, non-EVM Zilliqa transactions through the Zilliqa Ledger application. Every released version of the application is affected, so exposure does not depend on which version was used. It also does not depend on the kind of transaction: sending native ZIL, moving ZRC-2 tokens, transferring NFTs, and staking or unstaking all produce the same signature.
Not exposed
- Zilliqa EVM transactions, entirely outside the affected signing path.
- The software SDKs.
zilliqa-js,gozilliqa-sdk,pyzil, LaksaJ andzilliqa-rsall generate nonces correctly. - Software wallets that sign through those SDKs.
- Staking through the official Zilliqa staking portal.
- Anyone who never signed a legacy Zilliqa transaction with the affected application.
The recovery phrase was never exposed. The leak is confined to the individual account key, reconstructed from that account's own public signatures. The device as a whole is not compromised, and assets held on other blockchains through the same device are not at risk. The defect reaches one signing path and no further.
The un-attackable majority
Below four signatures the published data simply does not contain enough information to reconstruct the key, so no key can be recovered by anyone, regardless of computing power. That is a mathematical floor, not an assumption about attacker capability, and it means a large majority of legacy accounts were never reachable:
| Legacy native transactions signed | Addresses |
|---|---|
| Exactly one | 520,615 |
| Exactly two | 210,010 |
| Exactly three | 116,098 |
| Three or fewer | 846,723 |
| All attributable addresses | 1,145,464 |
73.9% of attributable legacy addresses signed three or fewer native transactions in total and are safe by construction. Not one of the accounts whose key was recovered falls in that group.
Public guidance on the status page draws its line at four, which is where the mathematics draws it too. At exactly four signatures, recovery sits at the information limit: it is possible in principle, and a particular search may still fail to find the key, which is why an account with four signatures is treated as compromised rather than cleared. The lowest signature count in the recovered population is five, but that reflects the bulk scan's own candidate rule rather than the floor, and annex D explains what it costs.
4. Timeline
All times UTC. Theft dates are established from the transaction record, not from when the activity was noticed.
- 2019 to 2026The defect is present in every released version of the Zilliqa Ledger application
- 23 June 2025Zilliqa 1 to Zilliqa 2 migration, block 4,770,088. Legacy transaction history is frozen at this boundary and later becomes the archive the investigation depends on
- 4 March 2026First proven theft. Two transactions. Exploitation begins here
- 28 May 2026One further theft transaction. Activity remains sporadic and unnoticed
- 16 July 2026Three transactions. The first large drain campaign opens; the receiving venue also sends value back out to attacker-side wallets the same day
- 17 July 2026Three transactions
- 19 July 2026Nine transactions totalling 362,375,406.91 ZIL, more than half the entire proven theft in a single day, including the three largest individual drains (108.4M, 101.9M and 101.9M ZIL). KuCoin reports the incident to us the same morning, at 07:20 CEST, having seen anomalous outgoing transactions from one of its cold wallets
- 20 July 2026, 07:09:37 to 07:27:0746 accounts swept in an eighteen-minute automated burst. 48 theft transactions occur on this day. The last theft transaction of the entire incident is at 09:19:09
- 20 July 2026, around 12:59Legacy transactions disabled. A client hotfix is released, validators are instructed to upgrade, and the accompanying hard fork removes all remaining legacy transaction functionality. Exploiting this defect becomes impossible from here
- 21 July 2026The investigation isolates the root cause and reproduces it against on-chain signatures
- 22 July 2026The exposed-account population is identified from public chain data, giving the basis for both the deny-list and the address checker
- 24 July 2026The corrective patch is opened as a pull request against Ledger's repository by a Zilliqa engineer. Public status page published: what happened, who is and is not affected, and a guided self-check
- 27 July 2026A Ledger engineer merges the patch. Corrected builds produce full-width nonces from this point; keys that had already signed remain exposed
- 30 July 2026Recovery and transition plan published: recovery runs through a universal migration to Zilliqa EVM
- 11 August 2026Address checker published. Any holder can now establish an address's status from public chain data alone, rather than from their own recollection of how often they signed
Two things about 20 July are worth stating precisely, because blurring the sequence would flatter us. The attacker's last transaction, successful or failed, is at 09:19:09. The fork that disabled legacy transactions activated roughly three and a half hours later. The fork made further exploitation impossible; it did not interrupt the campaign, which had already stopped. Containment also preceded understanding: the network was closed on 20 July, and the root cause was isolated on 21 July.
The most important line in this document
Exploitation ran for roughly four and a half months before it was detected, and it was detected by an external party rather than by us. Our own acute-phase record dated the start of exploitation to 19 July; that was the day it became visible, not the day it began. The reason is section 2: this defect produces no observable signal in any individual transaction, so there was nothing routine to notice. That is an explanation, not an excuse.
5. Impact
Proven theft
683,130,969.66 ZILacross 66 transactions
The figure rests on a single deterministic rule rather than on inference. The affected application only ever produced biased nonces; so a transaction from a compromised account carrying a full-width nonce was not signed by that application, and therefore not by the account's legitimate owner. It was signed by whoever else held the key. Every such transaction is a theft transaction, identified cryptographically rather than by behaviour, value or timing.
Applying that rule across the complete transaction history of every compromised account yields 88 candidate transactions. The published figure is the 66 of them that succeeded and fall within the 2026 attack window:
| Group | Transactions | ZIL | Counted |
|---|---|---|---|
| Successful, 2026 attack window | 66 | 683,130,969.66 | Yes: the published figure |
| Successful, 2019 to 2025 | 10 | 31,530.48 | No: pre-date this attacker by up to seven years, mostly zero-value dust |
| Failed attempts | 12 | 0 moved | No: reverted. Evidence of intent, not of loss |
The failed attempts are worth understanding: the attacker repeatedly tried to sweep each account's entire balance, had those transactions revert, and then succeeded in smaller amounts. They moved nothing.
Where it went
The 66 transactions reach six destinations, which are six recipient addresses rather than six actors. Three are consolidation wallets that received drains from many victims; three are onward hops from a single already-drained account.
| Destination | Transactions | ZIL | Role |
|---|---|---|---|
| 0x9d98189aa8dd606776a4922cbca7b2d5b5b8771c | 10 | 457,280,855.05 | Consolidation wallet, campaign A |
| 0x28d21333deca030503d82396e579b9a370373f8d | 47 | 159,015,284.77 | Consolidation wallet, campaign B |
| 0xa43659a6055bd87c730579feb67354ade03f5461 | 4 | 62,913,733.00 | Consolidation wallet, campaign C |
| 0x5c00439557a070006c5606571a604fb2b48b2cdb | 2 | 3,556,996.85 | Onward hop; still holds these funds |
| 0x9bfa996642cf01c9ec17a1fae219f8019f2f2fc3 | 2 | 364,000.00 | Onward hop, the 4 March route |
| 0x7d13ae6dba8bf57bb77492977ca77a1bd2f5150a | 1 | 100.00 | Probe transfer |
679,209,872.81 ZIL went straight into the three consolidation wallets, drawn from 51 distinct victim accounts; the remaining 3,921,096.85 ZIL is onward movement by the attacker.
Exposed accounts
6,772 accounts are known to have been exposed. For 6,763 of them the private key was independently reconstructed from public chain data and verified to regenerate the account's on-chain public key, which is a proof rather than a classification: 6,760 found by the bulk scan, and 3 more recovered afterwards by regrouping a drained account's signatures around the account that actually signed them. The remaining 9 were drained on-chain, which proves they were compromised, but gaps in the historical archive leave too few of their signatures retrievable to reconstruct the key. Those 3 late recoveries matter beyond their own accounts: they establish that the drained-but-unreconstructed group are biased-nonce victims like the rest, rather than a separate case.
Exposure is not the same as loss. Of the 6,772 exposed accounts, 51 were drained. An account is exposed when its private key can be reconstructed by anyone willing to do the work; that is a serious condition in itself, and it is not the same as funds having been taken. The attacker was selective rather than exhaustive, and the suspension of legacy transactions ended the campaign before it went further. The two figures should never be used interchangeably: they differ by two orders of magnitude.
This population is not a survey. Every entry is a demonstrated exposure, and the count can only move upward as detection improves. Annex D sets out the four known reasons it is a floor.
What is not quantified
- Number of people affected. Every count above counts keys, one per public key. Some belong to services and exchanges that operate many addresses on behalf of many users; others belong to a single holder. There is no defensible mapping from exposed keys to individuals, and we will not publish an invented one.
- Value in fiat. All figures are in ZIL, deliberately. Losses span 4 March to 20 July 2026 and any single conversion rate would misstate them.
- The split between exchange-held and self-custodied losses. Chain data shows which accounts were drained, not who controlled them. Classifying each affected account as exchange-controlled or individually held needs confirmation from the custodians themselves. This is the figure we are asked for most often, and we will not produce a guess in place of it.
- Amounts recovered. Nothing has been recovered. Section 7 sets out what is under way, and why the prospects are poor.
6. Response
| Action | Status | Effect |
|---|---|---|
| Legacy transactions disabled | Done, 20 July | A client hotfix plus a hard fork removing all remaining legacy transaction functionality. Makes further exploitation of the defect impossible |
| Root cause isolated and reproduced | Done, 21 July | Confirmed against on-chain signatures rather than by code reading alone |
| Exposed accounts identified from public chain data | Done, 22 July | The basis for both the deny-list and the address checker |
| Corrected application build | Done, 27 July | Patch written by a Zilliqa engineer and opened as a pull request against Ledger's repository on 24 July; merged by a Ledger engineer on 27 July and carried into a subsequent Ledger release. Stops new weak signatures; does nothing for keys already exposed |
| Address checker | Done, published 11 August | Answers the question from an address alone, rather than from what the holder remembers doing |
| Fund tracing and exchange coordination | In progress | Annex C. Handled privately with the venues and the relevant authorities |
| Migration and recovery framework | In progress | Section 7 |
On the pause
Suspending legacy transactions froze the funds of every legacy holder, including the large majority who were never exposed and the exchanges that had not yet migrated. That cost was accepted deliberately, for a reason specific to this defect: once a key is recovered from published signatures, the attacker can sign for that account at will. Advising holders to move their funds would have been worse than useless, because moving funds requires a signature from the exposed key, and an attacker watching the chain can front-run the transfer. Under those conditions the only measure that protects an exposed account is one that stops all movement, including the attacker's. The pause is that measure, and it is why it cannot be lifted before the deny-list and the migration are ready.
7. The path forward
Recovery runs through migration rather than repair. The legacy signing scheme is being retired instead of patched, because a patch cannot restore a key that has already signed, and any account that continues to use the legacy scheme carries that history with it.
Complete the move to Zilliqa EVM. Zilliqa EVM becomes the sole production side. This transition was already under way; the incident brought it forward.
Open migration to every legacy holder, affected or not. Migrating everyone removes the need for each holder to work out where they stand, and gives the whole ecosystem the same clean starting point.
Migrate the ecosystem, not only wallets. Exchanges, custodians, wallet providers and infrastructure partners are being supported through deposits, withdrawals and integrations, with engineering help throughout.
Retire legacy addresses at the fork. Balances are reassigned at the protocol state level; legacy addresses are deny-listed so that funds cannot be sent to a deprecated address afterwards.
Build a recovery framework for affected holders, designed to verify ownership while collecting as little personal data as possible. The zero-knowledge tool at its centre will undergo an independent security audit by Hacken before launch, covering the key-derivation circuit, the address-derivation logic and the proof-binding mechanism. The report will be published. Security comes before speed here: the launch timeline depends on what the audit finds.
Continue pursuing the stolen assets. The exchange account used to liquidate part of the funds has been identified and frozen. We are working with the Singapore Police, and a law firm has been mandated to structure and oversee the effort. We would rather be plain than encouraging: recovery is unlikely. The attacker moved quickly and exited through a centralised exchange, and whatever proves recoverable will come only through a lengthy legal process.
None of this carries a date. Dates will be published when the coordinated plan is final, on the incident status page, with what changed.
8. What we would tell another chain
This defect class is not specific to Zilliqa, and three findings generalise.
A hash-based challenge hides nonce failures that a coordinate-based one exposes. Schemes where
rderives from the message rather than from the nonce commitment give up the duplicate-rcanary that many chains rely on as a free integrity check. If your scheme has that property, you have no passive detector and should assume you will not notice this class of defect from the outside.Never mix biased and unbiased signatures in one lattice. During the original reproduction, an attempt that combined an account's biased signatures with two later full-width ones recovered nothing, and produced a confident, wrong conclusion that the account was not vulnerable. Anyone verifying an exposure claim should separate signatures by signer era before testing, or they will clear accounts that are in fact compromised.
Signature-generation code deserves the scrutiny reserved for consensus code, including in components maintained by a vendor rather than by the protocol team. The failure here was not in the cryptography, which was correct; it was eight bytes of a buffer copy. Nor was it someone else's code: Zilliqa wrote the original implementation of the affected application, and the defect was in it from the beginning. It then survived years of maintenance under Ledger without either party finding it. Authorship and stewardship were split, and the defect fell through the gap between them.
9. If you hold ZIL
- There is nothing you need to do right now. No legacy funds can move while transactions are paused, including an attacker's.
- You can check an address. The address checker is live on the incident page. It establishes an address's status from public chain data alone, so you do not need to remember how often you signed, or with what.
- Paused is not affected. Everyone on the legacy side is paused, including holders who never used a Ledger device. Most of them were never exposed.
- Your recovery phrase is safe. It was not exposed by this defect. Assets on other blockchains on the same device are not at risk.
- The Zilliqa team will never contact you first, and will never ask for your recovery phrase, seed phrase or private key, for any reason, ever. Treat any recovery tool, form or link sent to you privately as hostile, however official it looks and whoever appears to be sending it.
- Use only the official channels. www.zilliqa.com/ledger-incident is the record for this incident: every update is logged there, newest first, with the date it was published and what changed. If it is not written there, it did not come from us. The only accounts that speak for Zilliqa on this are:
- X: @zilliqa
- LinkedIn: Zilliqa
- Instagram: @zilliqa_official
- Discord: discord.gg/zilliqa
- Telegram: @zilliqachat
- If you hold ZIL on an exchange, those funds are held by the exchange and were not signed by you; your point of contact is the exchange's own support. Exchanges themselves should start from the exchanges FAQ, which covers the migration process in detail.
- How to reach us. enquiry@zilliqa.com is open to anyone: holders, exchanges and partners alike. Exchanges and partners can raise matters specific to their own exposure there, and those are handled privately rather than on the public page.
Technical annex
ADetermining who was affected
Because no passive indicator exists, exposure had to be established constructively: an account is affected if and only if its signatures yield a candidate private key d satisfying d*G == P against its on-chain public key. That test is exact, so the resulting population contains no false positives by construction: a listed key regenerates its own public key, and the probability of a spurious match is negligible. During the original reproduction, the probability that the observed nonce bit-length alignment could arise under an incorrect d was approximately 2^-832.
The scan ran across both eras of chain history:
| Era | Candidate accounts | Scanned | Exposed |
|---|---|---|---|
| Zilliqa 1, early and mid | 281,420 | 220,601 | 3,959 |
| Zilliqa 1, late era (recovered separately, annex E) | 60,819 | 60,819 | 4,308, of which 2,150 were new |
| Zilliqa 2, post-migration | 7,375 | 7,375 | 1,275 |
| Merged, deduplicated by public key | 6,760 with recovered keys | ||
| Plus drained accounts recovered afterwards by regrouping their signatures | 3 | ||
| Plus drained accounts whose keys could not be reproduced | 9 | ||
| Total known exposed | 6,772 |
The bulk scan treated as a candidate any account with at least five native signatures in a single era. Four is the true floor, so accounts with exactly four were never tested; annex D records what that costs. Recovered keys were held in memory only, checked against the public key, and discarded. None was ever written to disk.
Assurance. The method was validated against a negative control and against a known-compromised account before any population figure was produced. The strongest independent check came from the late-era recovery described in annex E: of the accounts it identified, 2,158 reproduced keys that had already been recovered by a completely different route, from different columns of different data, which is a stringent confirmation that both the method and the data interpretation are correct.
BEstablishing what was stolen
The theft figure follows from one property of the compromised accounts: the affected application produced only biased nonces. A recovered key makes the nonce of every one of that account's transactions computable, and therefore classifiable as biased or full-width. A full-width nonce from such an account means a different signer, and the only other party holding the key is the attacker.
This is a cryptographic identification rather than a behavioural one. It does not depend on transaction value, timing, destination or clustering, which means it neither misses a quiet theft nor sweeps in a legitimate transfer that happens to look suspicious.
Every transaction of every compromised account was classified this way, across both eras and including failed transactions, producing a 99,121-row dataset from which the 88 non-biased transactions were extracted. Of those, the 66 successful transactions in the 2026 window constitute the published figure.
One figure only. The consolidation wallets also received value from senders proven not to be biased-nonce victims, so their total inflow is larger than the theft. Only the 683,130,969.66 ZIL is proven theft attributable to this defect, and no larger number should be quoted as such.
CFund tracing
| Route | ZIL | Share |
|---|---|---|
| Campaign A, direct to an exchange receiving wallet | 457,280,855.05 | 66.9% |
| Campaign C, through a second exchange-attributed wallet and back to the campaign A collector | 62,913,733.00 | 9.2% |
| Campaign B, via a relay to the same receiving wallet | 29,999,999.60 | 4.4% |
| The 4 March drain | 364,000.00 | 0.1% |
Campaign B, into 0x2e1b265998671d099cd6d30da6cfcd39a3df0885: trail ends | 128,999,998.66 | 18.9% |
Held at 0x5c00439557a070006c5606571a604fb2b48b2cdb | 3,556,996.85 | 0.5% |
| Retained in the campaign B collector, one probe transfer, fees | 15,386.50 | under 0.1% |
| Total | 683,130,969.66 | 100% |
550,558,587.25 ZIL, about 80.6% of the proven theft, is traced to a single exchange receiving wallet. All 21 cash-out transactions were verified directly against a Zilliqa 2 archive node: every one present, successful and on the canonical chain.
128,999,998.66 ZIL, about 18.9%, cannot be followed. It entered an address with more than 1,400 distinct senders and more than 800 destinations on 20 July. In an account-based ledger, value entering an address with that many contributors becomes indistinguishable from the rest of its balance. This is a limit of the account model, not of effort, and no amount of further analysis will resolve it.
Two points of method, because they change how the figures should be read:
- The wallets that received the funds are exchange infrastructure, not attacker storage. This was tested rather than assumed: the receiving wallet has years of pre-incident history, tens of thousands of distinct counterparties, and depositor and withdrawer sets that barely overlap. Attacker control of it is excluded.
- We are not naming venues in this document. Attribution of specific wallets to specific exchanges is being handled directly with those exchanges, where it can be confirmed or disclaimed by the only parties with the records to do so. Every attribution available to us rests on a single report whose basis has not been disclosed, or on an explorer's label. Publishing either as fact would not meet the standard the rest of this document is held to.
What no chain analysis can produce is the attacker's identity. The account credited inside an exchange is off-chain, exists only in that exchange's ledger, and is resolvable only by the exchange, from the specific transfers we have supplied.
DWhy every figure here is a floor
Four limits are known. Each can only cause the investigation to understate the incident, never to overstate it.
- The signature floor, and the scan's candidate rule. An account with three or fewer biased signatures cannot be attacked, and equally cannot be tested: it is absent from the count for the same reason it is safe. But the bulk scan only considered accounts with five or more signatures in a single era, while the true floor is four. Accounts with exactly four biased signatures were therefore never candidates and are missing from the population figure, even though their keys are recoverable. The per-address checker reports them correctly; the bulk scan never saw them.
- A finer search finds more. The per-address checker, which uses tighter signature windows and no scan cap, recovered a key that the bulk scan had missed. The population figure of 6,760 is therefore understated by an unknown amount, and re-running the bulk scan under the checker's parameters is outstanding work.
- The historical archive is incomplete. Some early-era transactions that are visible in public explorers were never ingested into the archive the scan reads. This still blocks key recovery for nine of the twelve accounts that were provably drained.
- The chain-wide search for further collection wallets is open. It has not been closed out. What has been done is an adversarial check of the existing conclusion: 7,173 inflows to known attacker addresses, 742 candidate collection wallets, and 2,162 accounts never previously scanned were all re-examined, and found zero missed theft transactions and no fourth collection wallet. That is strong evidence the picture is complete; it is not proof.
Against these, one figure is not a floor but an exact accounting: the 683,130,969.66 ZIL is the complete set of attacker-signed transactions from the accounts we know to be compromised. If the compromised population grows, the theft figure can grow with it.
We would rather publish a number that can only move upward than an estimate that could move either way.
EData defects found during the investigation
Two independent defects in Zilliqa's own historical data archive materially slowed the identification of affected accounts. Both are being reported for repair, and both are worth publishing, because between them they are the reason the exposed population grew from 4,610 accounts to 6,760.
Corrupted signature columns in the late Zilliqa 1 era. About 40% of legacy signature history was ingested through a path that mangled the signature, public key and sender-address columns: none of the stored public keys even carried a valid compressed-point prefix. No parser can read a valid signature out of corrupted bytes, so 60,819 candidate accounts were silently unscannable, and the gap was initially misread as a coverage limitation of the scanning tool. The genuine signature values survived intact in two different columns of the same table. Recovering from those columns identified 4,308 further biased accounts, of which 2,150 were new and 2,158 confirmed keys already known.
Incomplete ingestion of the early era. Separately, some early transactions visible in public explorers are absent from the archive entirely. Where an account's history is split across both problems, too few of its signatures are retrievable for the lattice to run. This is what blocks nine of the twelve provably-drained accounts. It is a data-availability gap, not a limitation of the method: a complete archive would recover all twelve.
The practical lesson is that an incident response can be bounded by the integrity of your own historical data long before it is bounded by cryptography, and that the failure mode is quiet. Both defects presented as "the scan does not cover this", which is exactly what a tooling limitation looks like.
FReproducibility
Every figure in this document derives from public chain data and is reproducible from the incident datasets held in the private forensic workspace. The theft figure and its breakdown are regenerated by a single command against the transaction proof list. The exposed-account population is regenerated by re-running detection against the two chain archives.
Published 20 August 2026. Corrections and additions are logged in Updates on the incident status page.