> For the complete documentation index, see [llms.txt](https://docs.trover.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.trover.tech/engineering/verify-2026-08-31-mints.md).

# Verify: on-chain mint indexing

## What changed

Mints were never being indexed. Two separate reasons, both confirmed against Robinhood chain rather than assumed:

1. **OpenSea does not report mints as mints on this chain.** codexconsoles token 2792 is `Transfer(0x0 -> 0xf73892…)` in block 50805387 — a mint. The OpenSea events API returns it as `event_type: transfer` with **from and to both set to the minter**, so the "sender is the zero address" rule the normalizer used never fired. A genuine resale (token 1929) does come back with the two addresses correctly distinct, so `from == to` is a reliable mint signal here, and is now treated as one.
2. **Nothing read mints from the chain.** The on-chain scanner only decoded Seaport `OrderFulfilled` (secondary sales). A new scanner reads `Transfer` logs with `from = 0x0` across every tracked contract on robinhood/ink, which is the only unambiguous source for a mint, and attributes price from the transaction value divided by the number of tokens that transaction minted (a free mint reports 0, not "unknown").

Also: minted supply is now derived from the ownership walk's own exactly-once Transfer scan, and OpenSea's `total_supply: 0` — which is what it reports for a collection it has not finished indexing, i.e. every collection mid-mint — no longer overwrites it.

## Deploy

**No migration this round.** api + worker both changed.

```bash
cd ~/trover
git pull --ff-only origin main
docker compose -f docker-compose.yml -f docker-compose.production.yml build api worker
docker compose -f docker-compose.yml -f docker-compose.production.yml up -d --force-recreate api worker
```

## Verify (after deploy)

Give the worker \~2 minutes — the mint scanner starts 3,000 blocks (\~5 min of chain) behind head and walks forward at 12 windows per 15s tick.

```bash
# 1. Mints now flow at all. Was [] before this change.
curl -s "https://api.trover.tech/v1/nft-market/discover?chain=robinhood&limit=10" \
  | python3 -m json.tool | head -60
#    expect: "mints" non-empty, and a "minting" array of collections taking
#    mints in the last hour.

# 2. A collection that is actively minting reports it.
curl -s "https://api.trover.tech/v1/nft-market/collections/codexconsoles?chain=robinhood" \
  | python3 -c 'import json,sys; print(json.load(sys.stdin)["mint"])'
#    expect: active True, a non-null priceNative, mints1h > 0, mintedSupply
#    climbing toward the ~2800+ tokens actually on chain.

# 3. Ground truth to compare against (needs no API key):
curl -s -X POST https://rpc.mainnet.chain.robinhood.com \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
#    then eth_getLogs on 0x922fd5da48db5d65da7804d1bb1271231113e5b5 with
#    topics[0]=0xddf252ad…3b3ef and topics[1]=0x00…00 over the last 400 blocks.

# 4. Nothing regressed on an established collection.
curl -s "https://api.trover.tech/v1/nft-market/collections/originalblokyz?chain=robinhood" \
  | python3 -c 'import json,sys; b=json.load(sys.stdin); print(b["lastSale"]["occurredAt"], b["market"]["sync"])'

# 5. Worker log check.
docker compose logs --tail=200 worker | grep -i "mint scan"
```

## UI

* `/nfts/discover` — a "Minting now" strip above the three panels, and the New Mints feed fills in.
* `/nfts/robinhood/codexconsoles` — a pulsing "minting · " badge in the header, mint progress in the trade panel, and the left feed opens on its Mints tab (until you pick a different tab yourself).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.trover.tech/engineering/verify-2026-08-31-mints.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
