Cronos · verification tool
Cronos rewound its own blockchain on 30 August 2026 to undo the Tectonic theft. This page reads the addresses straight from public Cronos nodes as it loads, so you can see the figures for yourself rather than take our word for any of them.
Cronos has no working way to inspect an address. Cronoscan was retired on 6 October 2025 and redirects to explorer.cronos.org, whose address pages return a server error and whose transaction pages say "not indexed yet" while it rebuilds. Public nodes are unaffected, and public nodes are what this page asks.
Works for anything on Cronos, not only the addresses below.
The rewind deleted the theft, so money the attacker had spent went back to sitting where it started. Read live as this page loads.
The contract Cronos left standing is not a spent one-off. Its bytecode carries an entry point that lets whoever controls it make the contract call any address with any payload.
| Selector | Signature |
|---|---|
| 0xb61d27f6 | execute(address,uint256,bytes) |
| 0x2e1a7d4d | withdraw(uint256) |
| 0x38ed1739 | swapExactTokensForTokens(uint256,uint256,address[],address,uint256) |
| 0x095ea7b3 | approve(address,uint256) |
| 0xa9059cbb | transfer(address,uint256) |
| 0x70a08231 | balanceOf(address) |
A general-purpose executor with a swap route and token plumbing, rather than a single-use script. That is what the contract exposes.
The limit of this finding
Six selectors resolve against known signatures. The rest are unidentified, and the contract's source has never been published. We have bytecode and nothing else. This is what the contract exposes, not a description of what it did.
The candidate count depends on how you scan. A disassembler that steps over each pushed value finds more
than forty plausible selectors here; a scan that slides byte by byte finds more again, because
0x63 is both the PUSH4 opcode and the ASCII letter c, so string data reads as selectors. Ours
discarded three candidates whose four bytes were all printable, among them 0x654f7574 and
0x6374702d. Anyone with the bytecode can redo it and should expect a slightly different total.
The six above are what survive either method.
Do not take our word for it
Fetch the bytecode yourself.
curl -s https://evm.cronos.org -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getCode",
"params":["0x085f3115ca368aa262246d22f9476e1e2c87e8be","latest"]}'
Returns 16,569 bytes of hex. Every selector above is in it.
The bridged USDC.e contract holds about forty public functions. Twelve powers that would let an issuer reach into a wallet are absent from its bytecode, checked by selector.
blacklist, isBlacklisted, pause, unpause, paused, seize, burnFrom, destroyBlackFunds, addBlackList, freeze, implementation and upgradeTo. Checked against three selectors known to be in the contract, so the scanner is shown to be working either side of the result.
Worth stating why one of these numbers is exact and the other is not: string data inside a binary can inflate a count of what is present, but it cannot manufacture an absence. The count is approximate. The absence is not.
At one height, the two chains. The canonical side is live and you can check it. The discarded side is our recording, and it is the part nothing else holds.
| Block 90,896,190 | Hash | Timestamp | Txs |
|---|---|---|---|
| Canonical live, checkable |
0x8ea00125a08956b1af662d3eed4a21b31b558d8ce4a171e07e17c5e51a20973b | 23:49:01 UTC | 0 |
| Discarded fork our recording |
0x0a22e4d4… | 12:38:56 UTC | 17 |
The canonical block at that height was produced at 23:49:01, eleven hours after the fork's block at the same height. That gap is the halt.
Read this before you use the fork figures
The discarded row is our capture, recorded on 31 August 2026 from cronos.drpc.org while that endpoint was still serving the discarded chain. It cannot currently be reproduced, by us or by anyone. No public endpoint serves that chain any more, and a Wayback search across every host we know of returned no captures of any exploit-era transaction or address.
We are not presenting it as independently verifiable, because it is not. It is reported as recorded and unverifiable, and that caveat is the reason this section exists at all: without it there would be no public record of what the rewind replaced.
Thirteen public Cronos endpoints, every one we could find, surveyed 31 August 2026 at 17:44:45 UTC. Block 90,896,189 is the discriminator: its hash names which chain an endpoint is on.
evm.cronos.org, 1rpc.io/cro, cronos.rpc.thirdweb.com and rpc.vvs.finance, all returning the identical hash at 90,896,189. That half of the record rests on four independent sources.
cronos.drpc.org was serving it earlier that day at head 90,907,150. It withdrew individual methods first, then went unreachable altogether. No other endpoint ever served it.
Public Cronos nodes serve a rolling window, and it slides forward. These heights will pass out of reach, so they are recorded here with the time each was read.
At least one widely used tracker currently shows the stake wallet holding roughly $60m in a lending position that does not exist. We checked all eighteen Tectonic markets, the VVS token, tVVS and all three TONIC pairs, and found zero in every one. The same tracker omits the 5,000,950.223954 USDC.e that four separate nodes confirm.
Wrong in both directions at once is what an index still holding pre-rewind state looks like. The nodes are the authority here, and the command below is how you ask them.
Do not take our word for it
Run this instead.
curl -s https://evm.cronos.org -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{
"to":"0xc21223249ca28397b4b6541dffaecc539bff0c59",
"data":"0x70a082310000000000000000000000007d4e7e5dcb0ccc66b4f0f8b0f30da5078ad4f2dc"},"latest"]}'
Returns the stake wallet's balance in hex. Divide by 1,000,000 for USDC.e. The address is padded to 32 bytes; swap in any other and it still works.