NFT pricing
What a sale cost, when the engine refuses to say, and why it was already reading these logs.
The engine reads NFT transfers out of a log stream it was already fetching, and it prices the sales it can price honestly. The interesting parts are the two gates where it declines.
They were already arriving
ERC721 signs its transfer event Transfer(address,address,uint256). That is
character for character the string ERC20 signs, so the two share a topic0 and
land in the same log query.
They differ only in shape. ERC20 indexes two arguments and puts the amount in the data. ERC721 indexes three and leaves the data empty.
The trade detector filters the four topic form out on entirely correct grounds, because netting a tokenId as though it were an amount is nonsense. Those logs were being discarded. Reading them instead cost no new upstream connection, no new request and no new bandwidth.
What the chain's NFT activity actually looks like
Measured over 1,500 blocks, so nobody has to run it again.
| ERC721 transfers | 989, against 40,965 ERC20 transfers |
| Collections involved | 54 |
| Mints | 648, about two thirds of all activity |
| Wallet to wallet | 296 |
| Burns | 45 |
| Sharing a transaction with money | 455, of which 311 were mints |
| ERC1155 transfers | 1 |
The headline is that this chain's NFT market is mostly minting rather than secondary trading. That single fact shapes what a useful NFT board would need to be, and it is why the current one is honest about being ranked on secondary volume.
ERC1155 is empty enough to ignore for now. One transfer.
A sale is priced at what the buyer gave up
Not at what the seller received. Those two differ by the marketplace's cut, and using the seller's side would report every sale slightly below what it actually cost to buy the thing.
So the price comes from the buyer's netted quote outflow, falling back to the transaction's native value when there is no token leg. That fallback matters here because nearly every mint on this chain is paid for in native ETH, which emits no log at all. Same blind spot Uniswap V4 has, for the same reason.
Two gates where it refuses
Exactly one item, or no price. A sweep that takes six items for one payment cannot say what any single one of them cost. An even split would be a wrong price rather than a missing one, so those are counted as batched and left unpriced.
Mint spend is kept apart from secondary volume. A collection that only ever sold at mint has no secondary market, and merging the two would hide precisely that. The separation is what makes the column meaningful.
Priced mints stay low, and that is structural
The count of priced mints runs well below the count of mints, permanently.
Most mints here are paid in native ETH, which emits no log, so the price has to come from the sequencer feed's raw transaction bytes. Any block read from a backfill rather than watched live will never have it. This is not a bug to be fixed and it is not a warm up artefact. It is the shape of the data.
How the pricing was checked
Against a live sale, with two independent paths that should agree and did.
The engine read 364.72 USDG leaving the buyer. The same transaction moved 0.193796 WETH, which at the ETH price of that moment is 363.95.
Two different routes to the same number, 0.2% apart. That gap is the price difference between the two quote assets at that instant rather than an error in the reading.
What is not built
There is no NFT realized PnL, and it is the most valuable thing missing from the product.
It would be sharper than the token ledger rather than weaker. A tokenId identifies exactly which item was bought and which was sold, so no cost basis has to be averaged across fungible units. The token side has to average. The NFT side would not.
Collection data is not persisted. Unlike the wallet ledger, it describes a window of current activity rather than a fact about the past, so it lives in memory and rebuilds after a restart.
There is no minting board, despite minting being most of what this market does. That needs its own ranked list from the engine and cannot be produced by re sorting the existing one. The Board explains what happened when somebody tried.