Autopsy
Paste an address and get its realized PnL, reconstructed from the chain with the cost basis shown.
Autopsy takes one address and rebuilds what it actually did. Not what its bags are worth today. What it closed, at what basis, for what result.
Open it at /autopsy. No connection, no signature, no signup. It
reads public chain data about an address you type.
What it does
It walks the wallet's transfer history, groups the legs by transaction, works out what each transaction was, and then matches sells against buys to produce realized profit with the cost basis it used.
The important part is that it shows its working. The cost basis is stated rather than implied, so you can disagree with the number and see exactly where your disagreement starts.
How a transaction gets classified
Every transaction is a set of legs. Something left the wallet, something arrived, sometimes both. Five patterns cover almost everything.
| Pattern | Read as |
|---|---|
| ETH out, one token in | A buy. The ETH is the cost |
| Token out, ETH back | A sell. The ETH is the proceeds |
| Token out, token in | A swap with no ETH leg. Counted separately and not priced |
| Token in, nothing out | A transfer in. Acquired at zero cost |
| Token out, nothing back | A transfer out. Leaves the position and realizes nothing |
That third row is the one people expect to be handled and it is not, on purpose. A token to token swap has no ETH leg to price it against, so assigning it a value would mean inventing one. It is counted and kept out of the profit figure.
Positions then use weighted average cost. Buy the same token three times at three prices and the basis is the average, weighted by size.
Where the data comes from
Three sources, and the split between them is not arbitrary.
Token transfers in both directions come from Alchemy. The ETH that comes back on a sell comes from Blockscout's internal transactions. The ETH price comes from Blockscout's stats endpoint.
Why two providers for one wallet
Alchemy's asset transfer API does not support the internal category on this
network. That is the exact leg a sell produces, because routers unwrap WETH
and forward native ETH to you, which emits no token transfer at all.
Without a second source the proceeds side of every sell would go unrecorded and every closed trade would look like a token that left for free. Blockscout serves the one thing the primary source cannot, and that is the whole reason it is in the path.
Two things it refuses to do
It will not report a partial history as a complete one. A bot wallet can
hold hundreds of thousands of transfers. The client walks pages up to a ceiling
and carries a truncated flag when it hits one, because silently returning
half a wallet's history produces a confidently wrong PnL rather than an
obviously incomplete one.
It trims both walks to the shorter one. Transfers arrive a thousand to a page and proceeds fifty. Analysing everything the deeper walk returned would price recent sells correctly while booking older ones as free transfers out, which flatters the wallet. So the analysis window is cut to whatever both sources can cover.
That second one is subtle and it is the kind of bug that never announces itself. Every number stays plausible. The wallet just looks better than it was.
What is blank, and why
Three fields are null rather than zero.
Unrealized PnL. Marking an open position to market needs a live price for every token in it, including one minted an hour ago with almost no trading. The number would be a guess wearing a decimal point.
Percentile. Ranking this wallet against the chain needs chain wide comparison data that does not exist yet.
Hours behind smart money. The share of the story where you find out you entered six hours after the wallets that made money. Same reason. It needs the chain wide picture.
Blank means unknown in this app, everywhere, and never zero. Zero is a claim that the answer is none.
How it was checked
By hand, against a real wallet, to the wei.
Wallet 0x9464…A026 bought 736,520.90 SON and sold 736,520.89. The proceeds
summed to 0.0125000689 ETH, and that figure matched the internal transactions
on the chain exactly.
One verified wallet is not a test suite and the pure functions underneath still want proper coverage. It is enough to say the reconstruction is not approximately right by accident.
Autopsy and the board are different tools
They answer the same question at different depths and they do not share a code path.
The terminal's board is fed by the engine, which watches trades as they happen and holds a rolling window in memory. It is fast, it covers thousands of wallets at once, and it only knows what it has been watching.
Autopsy runs on demand against one address and walks its history from the sources above. It is slower, it covers one wallet, and it can see further back than the engine's window.
If the two disagree about a wallet, the usual reason is that the engine did not watch the buy. Its realized figure only ever moves against inventory it saw acquired, so a position opened before it was looking closes as activity rather than profit. That is a deliberate floor rather than a gap, and Realized vs unrealized explains why it is the safer direction to be wrong in.