11,111 SKULLS · 100% ONCHAIN

No IPFS.
No servers.
Forever.

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.

11,111Max Supply
1 FREEPer Wallet
0.0001ΞAfter Free Mint
10Max Per Tx
RENDERING TOKEN #1 — LIVE FROM CONTRACT LOGIC

Nine layers. Thousands of skulls.
Zero duplicates rendered offchain.

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.

06

Background

Void Black · Midnight Blue · Blood Red · Toxic Green · Cursed Purple · Silver Foil
06

Texture

Default · Gold · Obsidian · Bone · Crystal · Ghost
05

Eyes

Empty Void · Glowing White · Cross X · Laser Red · Gold
06

Head

None · Crown · Cowboy Hat · Halo · Beanie · Wizard Hat
06

Mouth

None · Cigarette · Gold Tooth · Bandana · Pipe · Diamond Grill
06

Face Marking

None · War Paint · Stitches · Lightning · Rune · Shattered
05

Earring

None · Gold Stud · Gold Hoop · Diamond · Chain
05

Aura

None · White Glow · Red Aura · Blue Aura · Gold Aura
08

Crack

Center Split · Left Diagonal · Right Slash · Deep Center · Left Zigzag · Top Right · Branching · Double Crack

One free skull per wallet.
The rest, almost free.

Minting is permissionless and reads straight from the contract — no allowlist, no Discord roles, no off-chain gatekeeping.

Collection size11,111
First mint, per walletFREE
Each mint after0.0001 ETH
Max per transaction10
StandardERC-721C
Minted
Remaining
Burned
Mint status
Reading live from the contract via your wallet's RPC.
qty
costfirst one's free
> waiting for wallet connection
By minting you confirm you've read the contract yourself. This page only constructs the same transaction Etherscan would.

You can destroy a skull.
That doesn't mean you should.

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.

What actually happens when you burn

  • The token stops existing. ownerOf(tokenId) reverts. The skull leaves your wallet and nobody's, ever again.
  • The art goes with it. tokenURI() explicitly checks isBurned[tokenId] and reverts with "Token burned" — the SVG isn't archived anywhere, it simply stops rendering.
  • It's permanent. There's no unburn function. No admin override. _owners[tokenId] is deleted at the storage level.
  • It moves the supply, for everyone. totalBurned increments and circulatingSupply() drops — a number every other holder is implicitly watching.

Why someone would actually do this

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.

if 5%
Skulls burned556
Remaining forever10,555
At 5% burned, every surviving skull represents roughly 1 in 10,555 of everything that will ever exist — permanently, since the max supply can never be re-opened.

Burn a skull you own

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.

token
> enter a token id you own

Most "onchain" art isn't.

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.

Image hostingNONE NEEDED
Metadata serverNONE NEEDED
IPFS pinNONE NEEDED
SVG rendererON ETHEREUM
Token metadataON ETHEREUM
Trait generationON ETHEREUM
OwnershipON ETHEREUM

Built from scratch.
No inherited dependencies.

Every interface — ERC-721, ERC-2981, ERC-721C, Base64, Strings — is implemented directly in the contract. No OpenZeppelin import, no proxy, no upgradeable pattern.

ERC-721C

Creator-enforced transfers

Supports an optional transfer validator hook for marketplace-level enforcement, set by the contract owner.
Reentrancy Guard

Mint & withdraw protected

A custom nonReentrant modifier locks state during mint() and withdraw() calls.
Split Renderer

Two-contract architecture

SVG generation lives in a separate SkullRenderer contract, called by the main contract — avoids stack-too-deep limits and keeps art logic upgradeable independent of token state.
Burnable

Real supply reduction

burn(tokenId) is owner/approved-gated and permanently removes a token from circulatingSupply().

Read before you ape.

Is the art really fully onchain?

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.

How is each skull's look decided?

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.

What does the free mint actually cost?

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.

Can I burn a skull?

Yes — the contract exposes a public burn(tokenId) function for owners or approved operators. Burned tokens are tracked and excluded from circulating supply.

What token standard is this?

OnchainSkulls implements ERC-721 with ERC-721C transfer validation hooks, written from interfaces directly in the contract — no external OpenZeppelin dependency.