Draft ERC
Launch Observations
A launchpad says what it did. A detector writes down what it saw, at a block. Both are tied to the same launch, so anyone can compare them.
On this page
Our ERC draft. Discussion: Ethereum Magicians. Draft: pull request #2121 on ethereum/ERCs.
Follows the draft in PR #2121 as of 28 Oct 2026 (commit 7c7f933)
What it is
A launchpad declares facts about a launch under the Token Launch Declarations draft. An independent detector records block-pinned observations about the same launch under this draft, Launch Observations. Both are keyed to the same launch: its ERC-8376 launchId, or the chain id plus the token address.
An observation is never edited or removed. A detector can record a newer one, and both stay readable. An observation proves only that the detector recorded it. It states facts at a block, not a judgment on the launch.
What Toll records
For each coin, Toll records these findings. A value of "not read" is stored as the largest possible number (type(uint256).max), never as 0. Zero means measured, and the answer was zero.
| Kind | Param | Unit | What it means |
|---|---|---|---|
| erc.launch-observations.first-block-share | 0 | basis points | Share of total supply bought in the block of the first trade, by anyone but the pool and the venue. |
| erc.launch-observations.early-buyer-share | N seconds | basis points | Share of total supply bought in the first N seconds after the first trade, by anyone but the pool and the venue. |
| erc.launch-observations.creator-prior-launches | 0 | count | How many tokens the creator launched before this one, on the same chain. If the scan stopped early, so the count is only a floor, it reads "not read". |
| erc.launch-observations.funding-linked-share | H hops | basis points | Share of total supply held at the observed block by wallets that share a funding source, within H transfers, with the creator or with another holder in the set. |
| erc.launch-observations.product-label | 0 | 1, 2 or 3 | Whether a working product was found behind the token, each claim checked against the chain and its public interfaces: 1 found, 2 partly found, 3 not found. |
| xyz.t0ll.dev-sold-share | 0 | basis points | Share of what the dev bought that the dev sold. This kind is Toll's own. |
The first-block and early-buyer shares are fixed once their window has passed. Every other finding is read at the observed block itself, and a finding not read at that block is not recorded as a number.
Each finding also carries a lean: against, careful, clear, none. Toll sets it to none.
A tally of the check's against, careful and clear counts is recorded alongside.
How an agent reads it
An agent holds a token address, not a launch key. One call returns a trusted detector's newest reading of one kind:
latestByToken(chainId, token, detector) -> observationId latestFinding(chainId, token, detector, kind, param) -> (observationId, observedBlock, recordedAt, value, lean) latestFindingFrom(chainId, token, detectors[], kind, param) -> (detector, observationId, observedBlock, recordedAt, value, lean)
- latestByToken: the detector's observation of the token with the highest observed block, or zero.
- latestFinding: that observation's value and lean for one kind and param.
- latestFindingFrom: tries a list of detectors in order and returns the first one that has a value.
No observation, no such finding, or no detector in the list with a value: the value comes back as not read (type(uint256).max) and the lean as none. A missing reading never comes back as a measured zero. These calls never revert.
A reader sets its own bound on how old an observation may be, from the observed block against the chain's current block.
Block numbers
Every block number is the chain's own, the number eth_blockNumber returns. On an Arbitrum chain, such as Robinhood Chain, block.number inside the EVM is the parent chain's. There the current block comes from ArbSys(address(100)).arbBlockNumber(), never from block.number.
A sample
A sample from 2026-10-28: an observation Toll built from its own check of $TOLL. Not written on-chain, and not refreshed by the live site.
The first-block and early-buyer shares count every buy, the dev's included. The dev-sold share reads "not read" because the curve was read at an earlier block than the observed one.
- Token: 0xff9e86E6b21Fd688027981bEE4B64c8b6b804eD3
- Creator: 0x5388872a6bbb5fd94533a4dab2a7a1cab02fa5bc
- Observed at block 100024237
- Tally: 2 against, 2 careful, 6 clear
| Kind | Param | Value | How it was measured |
|---|---|---|---|
| erc.launch-observations.first-block-share | 0 | 2.50% | all buys in the first trade block, share of total supply |
| erc.launch-observations.early-buyer-share | 3 | 2.50% | all buys in the first 3 seconds (30 blocks) after launch, share of total supply |
| erc.launch-observations.creator-prior-launches | 0 | 0 | launches the creator made before this one, from the creator's record on this chain |
| erc.launch-observations.funding-linked-share | 1 | 0.00% | share of total supply held by wallets that share a first funder, among the holders whose funders we read (a floor) |
| erc.launch-observations.product-label | 0 | found | Toll's product check: 1 found, 2 partly found, 3 not found |
| xyz.t0ll.dev-sold-share | 0 | not read | tokens the creator sold, share of the tokens the creator bought |
Report hash: 0x300a59090ad2644248ba46aff982791ca08cbeed4f7470156dcd89c4559c458b
The hash is keccak256 of the exact report bytes below.
{"chainId":4663,"check":"https://t0ll.xyz/check/0xff9e86e6b21fd688027981bee4b64c8b6b804ed3","creator":{"address":"0x5388872a6bbb5fd94533a4dab2a7a1cab02fa5bc","how":"launch record"},"findings":[{"how":"all buys in the first trade block, share of total supply","kind":"0xf1503018582646f41619eefcdeaae1c1b9ad5e71e1a74f59a7c177cd5d8a1b0c","lean":"none","name":"erc.launch-observations.first-block-share","param":0,"value":"250"},{"how":"all buys in the first 3 seconds (30 blocks) after launch, share of total supply","kind":"0xde1880e1c55491741e8806f8091354331ccfae6d260de5624fa7b5131f8ab19a","lean":"none","name":"erc.launch-observations.early-buyer-share","param":3,"value":"250"},{"how":"launches the creator made before this one, from the creator's record on this chain","kind":"0xb559eb50996235dcc907f3c528e2b0bd21669b438572d50973405b9394544c38","lean":"none","name":"erc.launch-observations.creator-prior-launches","param":0,"value":"0"},{"how":"share of total supply held by wallets that share a first funder, among the holders whose funders we read (a floor)","kind":"0xd0f99f8b1f2648a01d4d94c4ac89e81b3f3036b775a02e9d840391fece5b51d0","lean":"none","name":"erc.launch-observations.funding-linked-share","param":1,"value":"0"},{"claims":[{"claim":"Toll's launch wallet is 0x5388...a5Bc, the wallet that launched $TOLL","evidence":"its API at t0ll.xyz/api/check answered with data (fields token, sym, name, supply)","found":"partly","kind":null},{"claim":"Toll reads coins on Robinhood Chain, Arc, BSC and Solana","evidence":"its API at t0ll.xyz/api/check answered with data (fields token, sym, name, supply); its MCP server at t0ll.xyz/mcp answered and listed 7 tools (check_coin, dev_record, wallet_privacy, fresh_launches)","found":"found","kind":null},{"claim":"Toll's own $TOLL coin has a 0.5% trade fee, 0.25% for $TOLL holders","evidence":"no per-trade rate of the coin to check (a split share, a router's fee or no rate in its words); tax 1% a trade (chain)","found":"not read","kind":null},{"claim":"Toll says it never holds user funds; users sign every trade from their own wallet","evidence":"a working part answering does not show this; we could not check it","found":"not found","kind":null}],"how":"Toll's product check: 1 found, 2 partly found, 3 not found","kind":"0x2af827bba451d4ec3e3a25936a27478e62bf16a8046dfec8f9369f5b9f139345","lean":"none","name":"erc.launch-observations.product-label","param":0,"value":"1"},{"how":"tokens the creator sold, share of the tokens the creator bought","kind":"0x0b9baa9f583b056e93eb0a650daaafff3b7aa27fbe9f4243b91f5f4337fbc10a","lean":"none","name":"xyz.t0ll.dev-sold-share","param":0,"value":"not read"}],"kind":"token","launchKey":"0xe85c0bd357dccf2784d61aa261867b1cb947a77d6859b0f583dbfc8b7072bcd8","method":"toll-observe/1","observedBlock":100024237,"tally":{"against":2,"careful":2,"clear":6},"token":"0xff9e86E6b21Fd688027981bEE4B64c8b6b804eD3"}Status
Draft ERC, not yet on-chain.
Toll is ERC-8004 agent #20030 on Robinhood Chain: Toll for agents.
Information only, not financial advice.