Every pixel of every skull is generated and stored directly on Ethereum — drawn live from a Solidity renderer, encoded as SVG, base64'd into the token URI. If Ethereum exists, your skull exists.
Every trait is derived on-the-fly from keccak256("OSKULL_V1", tokenId) — there is no metadata server to go down, because there is no metadata server.
Minting is permissionless and reads straight from the contract — no allowlist, no Discord roles, no off-chain gatekeeping.
| Collection size | 11,111 |
| First mint, per wallet | FREE |
| Each mint after | 0.0001 ETH |
| Max per transaction | 10 |
| Standard | ERC-721C |
The contract exposes a public burn(tokenId) function. Any owner, or anyone they've approved, can call it. There's no vote, no cooldown, no confirmation screen on Etherscan beyond the one you click past.
ownerOf(tokenId) reverts. The skull leaves your wallet and nobody's, ever again.tokenURI() explicitly checks isBurned[tokenId] and reverts with "Token burned" — the SVG isn't archived anywhere, it simply stops rendering._owners[tokenId] is deleted at the storage level.totalBurned increments and circulatingSupply() drops — a number every other holder is implicitly watching.Every burn is a one-way transfer of scarcity from one holder to everyone who didn't burn. If you're holding three skulls you don't care about and the floor is thin, removing them from circulation forever raises the rarity of every skull left standing — including, possibly, the one you kept.
But that math only works if the burn is real conviction, not a reflex. A skull burned today can never be re-minted, re-listed, or gifted. The 11,111th skull that ever exists is the last one. There is no second mint.
Drag to see what permanent burns would do to the math for everyone who's left.
This calls the real burn(tokenId) function from your connected wallet. It is irreversible the moment the transaction confirms.
Nothing is minted, paid out, or airdropped automatically. burn() has no reward logic written into it — read it yourself. The only on-chain effect is permanent removal from circulatingSupply(), which marginally raises the scarcity of every skull still standing. That part is fact, not a promise.
We intend to treat burning as a signal of conviction. Every Burned event is permanent and public on Ethereum, so we can snapshot who burned and factor that into future plans — an allowlist spot, a claim, whatever shape that takes.
This isn't written into OnchainSkulls today — it would live in a separate contract or snapshot process announced later, not as code you can verify right now. Burning is entirely optional. Nobody who chooses not to burn is penalized, and nobody should burn purely on the expectation of a future reward that isn't guaranteed.
Most NFT collections point to an image pinned on IPFS, or worse, sitting on a centralized server. The art survives only as long as someone keeps paying the bill. Onchain Skulls doesn't depend on anyone.
Every skull's pixels are assembled at the moment you call tokenURI() — rectangles drawn live by the SkullRenderer contract, encoded straight into the response. There is no link that can break. There is no gateway that can go down.
As long as Ethereum is producing blocks, your skull is rendering.
Every interface — ERC-721, ERC-2981, ERC-721C, Base64, Strings — is implemented directly in the contract. No OpenZeppelin import, no proxy, no upgradeable pattern.
Yes. The tokenURI() function calls a dedicated SkullRenderer contract that builds the SVG and trait JSON on the fly, then base64-encodes the result directly in the response. Nothing is fetched from IPFS or any external server.
Each token's traits come from keccak256("OSKULL_V1", tokenId) — a deterministic hash unique to that token ID, sliced into nine trait rolls (background, texture, eyes, head, mouth, marking, earring, aura, crack). The preview above replicates this exact formula client-side.
Your first mint per wallet costs only gas. Any additional skulls in the same or later transactions are 0.0001 ETH each, up to 10 per transaction, until the 11,111 supply is gone.
Yes — the contract exposes a public burn(tokenId) function for owners or approved operators. Burned tokens are tracked and excluded from circulating supply.
OnchainSkulls implements ERC-721 with ERC-721C transfer validation hooks, written from interfaces directly in the contract — no external OpenZeppelin dependency.