Artist credits for the Rodeo.club contracts on Base, cross-referenced from every source that has any, in one file anyone can use.
Rodeo was a platform where artists published 24-hour open editions. The company went under and the site went offline on 10 March 2026. The contracts are still on-chain and always will be, but they never carried artist credits — attribution lived only on Rodeo's front end. When the servers went dark, every artist who published there lost the credit for their own work.
Different public sources hold different pieces of the answer — rodeoart.lol, raster.art, OpenSea, ENS, Basenames, Farcaster — and no single one has all of it. This repository is the cross-reference: one row per artist wallet, every name every source has for it, with the source and the date attached. More sources will turn up, and the format is built to take them.
It is a living document. Blanks stay blank until someone fills them in, and filling one in takes a pull request with one changed line.
| Path | What it is |
|---|---|
data/credits.jsonl |
the dataset. One JSON object per wallet, one line each. |
data/credits.csv |
the same rows flattened to one line per credit, for spreadsheets. Derived — never hand-edit it. |
data/coverage.md |
what each source actually returned, regenerated with the data. |
community/credits.jsonl |
hand-contributed credits. The generator never writes here. |
generated/credits.jsonl |
machine output. The generator overwrites this on every run. |
data/credits.jsonl is generated/ plus community/, merged. That split is
deliberate: it is why re-running the generator does not eat contributed credits.
{"wallet": "0x0000ce08fa224696a819877070bf378e8b131acf",
"slugs": ["@aaronjmars.eth"],
"contracts": ["0xb7e9e023d12e69f484534555e2ccea18079fcf4e"],
"posts": 1,
"first_post": "2025-01-09T11:22:43.000Z",
"last_post": "2025-01-09T11:22:43.000Z",
"credits": [
{"source": "rodeoart.lol", "name": "aaronjmars.eth", "kind": "basename",
"display": "Aaron Elijah Mars", "farcaster": "aaronjmars.eth",
"observed_at": "2026-08-06"},
{"source": "ens", "name": "aaronjmars.eth", "forward_verified": true,
"observed_at": "2026-08-06"},
{"source": "basename", "name": "aaronjmars.base.eth", "observed_at": "2026-08-06"}],
"updated_at": "2026-08-06"}Every source's answer is kept, and none is marked the winner. There is no "best name" field and there will not be one. Which source you trust depends on what you are building, and baking one fall-through order into the data would push our product opinion into everyone else's. It also keeps each upstream source's terms attributable to that source.
Rows are keyed by wallet, because Rodeo deployed one contract per artist (EIP-1167 minimal-proxy clones of a single implementation) and one artist may have deployed several. A contract therefore maps to exactly one artist, and no per-token disambiguation is needed.
credits may contain more than one entry for the same source. That is not a
bug — it is Raster crediting two different artists across a wallet's contracts,
and you should see that rather than have us pick.
A name of null means that source was asked and had nothing, not that no
name exists. A source missing from credits entirely means it was not asked.
A credit marked "placeholder": true is a name that is really just the wallet
address in disguise: an OpenSea username auto-minted from the address
(0x232d1), a Basename registered as the address (0x70b7.base.eth), a
Farcaster id that never resolved to an fname (!23134). They are kept because
they are what the source said, but they attribute nobody and the coverage
numbers do not count them.
14,245 artist wallets, 15,323 contracts, 303,781 posts.
| wallets | |
|---|---|
| carry a name from at least one source | 6,275 (44.1%) |
| rodeoart.lol could already name | 6,169 |
| named here that rodeoart.lol could not name | 106 |
| still unnamed, holding 119,857 posts between them | 7,970 |
Full breakdown per source in data/coverage.md.
The honest read: the remaining gap is hard. The 7,970 unnamed wallets are unnamed because they have no presence on any of these platforms — most of them do not have an OpenSea account at all, and the account endpoint returns a flat 404 rather than an empty profile. Raster names 11.1% of all wallets but only 0.5% of the ones rodeoart.lol could not name, and OpenSea 31.7% against 0.8%. Every automated source is far better at the artists who were already findable. That is not a reason to skip the machine pass — it produced the 44% baseline and it is what makes the gap measurable — but closing the rest is going to be people who know, one credit at a time.
A blank is worth re-asking. People set an OpenSea username, register a
Basename or get credited on Raster long after the work was minted. Re-asking
only the entries that came back empty is cheap, and the first time it was run —
three days after the first full pass — it turned up 28 names that had not been
there before, 23 of them from Raster. scripts/resolve.py --refresh-empty does
exactly that and leaves everything already named alone.
source |
What it is | Extra fields |
|---|---|---|
rodeoart.lol |
A public archive of the Rodeo contracts: every factory-deployed contract, every mint event, and an artist directory built on top. Supplies the wallet and contract list this dataset is keyed on. | kind, display, farcaster |
raster |
raster.art's human-curated art credits, queried per token. | slug, contracts |
opensea |
The OpenSea account profile for the wallet. Generic identity rather than art-specific, so it is broad. | display, ens_name |
ens |
Ethereum mainnet reverse resolution. Rodeo was on Base, but the same wallet exists on Ethereum — that hop is where a lot of the names are. | forward_verified |
basename |
Base L2 reverse resolution against the Basenames resolver. | |
farcaster |
The current fname for the Farcaster id rodeoart.lol tied to the wallet, read from the fname registry. | fid |
community |
Contributed by hand, by a named person or project. | by, note, evidence |
A community credit may also name its own contracts, which is how a Rodeo
contract the archive does not cover gets into the file at all.
Every credit may also carry placeholder: true — see above.
arts.haus appears as a community byline rather than as a source. Its credits
were themselves pulled from OpenSea, Raster and objkt, so asking it asks a
derived copy of what this dataset already queries directly, and its coverage is
shaped by one collector's holdings rather than by Rodeo. Only the credits it
holds that no upstream source has were imported.
kind is rodeoart.lol's own statement about how it got the label, and it is the
most useful field in the file for deciding what to trust:
kind |
Meaning |
|---|---|
handle |
a real Rodeo handle |
basename |
a Basename or ENS name, resolved through Web3.bio |
wallet_placeholder |
no name. The label is a truncated address. |
fid_placeholder |
no name. Only a Farcaster id was found. |
The two placeholder kinds are the gap this dataset exists to close.
ensnames are self-asserted. A reverse record is set by the address owner.forward_verified: truemeans the name resolves back to the same address, which makes it a two-way claim;falsemeans it does not, and you should treat it as weaker.openseausernameis an account name, not necessarily an artist name.rasteris queried by token, never by wallet. Raster'saddress()field resolves a claimed collector profile, which is a much narrower thing and credits roughly four times fewer contracts.- A missing token is not a missing credit. Only contracts with at least one archived post are in this dataset, so every contract here has a real token behind it. rodeoart.lol reports 7,578 contracts deployed but never used; those have nothing to credit and are not here.
- The spine is 98.91% of Rodeo, not all of it. A few contracts have no
folio behind them, so
postsis 0 andslugsis empty even though the contract is real. Those rows exist because someone contributed the credit by hand and named the contract themselves.
Python 3.9+, no third-party packages.
cp .env.example .env # fill in RASTER_API_KEY, OPENSEA_API_KEY, ALCHEMY_API_KEY
python3 scripts/fetch_spine.py # pull the spine from rodeoart.lol
python3 scripts/resolve.py --source all # ask every source about every wallet
python3 scripts/build.py # write data/Every fetch is cached in cache/cache.sqlite, so all three are resumable and
re-running one costs nothing for what it already has. scripts/resolve.py --source raster runs a single source; --retry-failed picks up the ones that
errored. The full run takes a few hours, mostly waiting on rate limits.
To bring an existing build up to date, re-ask only the blanks:
python3 scripts/resolve.py --source all --refresh-empty
python3 scripts/build.pyA refetch that errors keeps whatever was cached, so a re-ask can only add.
The unit of value here is crediting an artist for their work. That is not doxxing anyone. These works were published with credit, under names the artists chose, on a public platform. The credit was lost when a company's servers went dark. Restoring it is the whole point.
If you are an artist and you want your name changed or removed from this file, open an issue or a pull request and it will be done.
Every source is public and is read as published, not re-derived:
- rodeoart.lol — factory-deployed contracts, mint events, and the artist directory. Published methodology and totals at rodeoart.lol/integrity.
- raster.art — per-token art credits, via
api.raster.art. - OpenSea — account profiles, via the v2 API.
- ENS and Basenames — read from Ethereum mainnet and Base directly.
- Farcaster — the fname registry at
fnames.farcaster.xyz.
The list is open by design. More sources will exist, and adding one is a
function in scripts/resolve.py — see CONTRIBUTING.
CC0 1.0 — public domain. Take it, fork it, build on it. Attribution to the upstream sources is recorded per row so you can pass it along, and doing so is the decent thing even though the license does not require it.