Overview
Mining
What the miner hashes
0x01a4e932b23acc64a581486bb8ca1ed538bd3b2a8762013e8eaf8d1a351d9cdaExample inputs. Nothing is submitted to any network.
Grind resistance
Your winning hash commits you at block N. The specimen you receive is chosen with a block that does not exist yet.
seed = pool[ keccak(winningHash, blockhash(N + k)) mod remaining ]
- 01COMMIT
at block N
- 02WAIT
k blocks · blockhash(N+k) not known yet
- 03FINALIZE
at N+k · anyone can call, caller earns a tip
Nobody knows blockhash(N + k) when you submit, including you, so there is nothing to grind toward. After block N + k lands, anyone can call finalize and collect a small tip. A window of about 256 blocks applies before the hash expires. The draw is from the remaining pool, so supply stays exact.
DRAFTk (reveal delay) is a draft parameter.
mine(nonce):
require block.number != lastMintBlock
h = keccak256(msg.sender, nonce, anchor, prevWork)
require h < baseTarget >> extraBits(msg.sender)
collect price
claims[id] = { miner: msg.sender, hash: h, block: block.number }
finalizePending() // the next mint finalizes the previous claim
finalize(id): // permissionless, small tip to caller
c = claims[id]; require block.number >= c.block + 5
bh = arbBlockHash(c.block + 5) // falls back to the latest available hash after ~256 blocks
index = keccak256(c.hash, bh) mod remainingPool
specimen = pool.take(index) // unclaimed indices onlyGrinding stops paying because the acceptable proof is fixed before the reveal block exists. Searching more hashes cannot reveal which remaining index will be selected.
The claim uses a placeholder tokenURI reading “Sequencing…” for about K blocks. Final metadata appears after settlement.
Finalization is permissionless and carries a small caller tip. The miner cannot withhold finalization to ask for another reveal.
- Randomness is only as strong as the sequencer's non-collusion.
- The finalization window is about 256 blocks DRAFT, after which the fallback applies.
Difficulty and field entropy
The contract keeps the last 64 winners and measures how concentrated they are with a Herfindahl index: HHI = Σ sᵢ², where sᵢ is each address's share of those wins. When concentration crosses the gate, addresses with many recent wins pay extra difficulty bits.
extraBits(i) = min(cap, ceil(C · log2(1 + nᵢ)))
Every extra bit doubles the expected work, so a capped 8 bits is 256× the hashes for the address that keeps winning. A newcomer with no recent wins pays the base target.
An operator who splits work across many wallets sidesteps a per-address penalty. The gate does not claim to stop that. It makes the lazy sweep expensive, and leaves the concentration data on chain where anyone can measure it.
HHI = Σ (n_i / N)² C = (HHI − 1/N) / (1 − 1/N) // 0 = evenly spread, 1 = one winner extraBits(i) = min(cap, ⌈ C · log2(1 + n_i) ⌉), cap = 8 target(i) = baseTarget >> extraBits(i) Displayed on the site: Shannon entropy H = −Σ p_i log2 p_i, normalized H / log2(N)
HHI is used on-chain because it needs no logarithms. Shannon entropy is computed off-chain for display.
This does not stop a farm that splits hashrate across many addresses. The solution rate depends on total hashrate, not the number of addresses, so splitting is free. The penalty raises the cost of casual single-wallet sweeping. It is not a sybil defense.
- Retarget windowSET AT LAUNCH
- —
- Minimum per epochSET AT LAUNCH
- —
- Idle-period failsafeSET AT LAUNCH
- —
Economy
| Epoch | Size | Entry price |
|---|---|---|
| E1 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E2 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E3 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E4 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E5 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E6 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E7 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E8 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E9 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E10 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
| E11 | Set at launch SET AT LAUNCH | — SET AT LAUNCH |
The token — $FORMS
- SymbolDECIDED
- $FORMS
- SupplyDECIDED
- 1,000,000,000
- Launch venueDECIDED
- Pons v2
- Team allocationDECIDED
- 0
- ReserveDECIDED
- About 100,000,000 $FORMS
- Mint opensSET AT LAUNCH
- About one day; exact time announced at launch
About 100,000,000 $FORMS is bought on the open market after launch, in tranches, and held in a public vault. This is not a team allocation. It is bought on the open market, like anyone else's.
The vault is intended to release only to the v2 burn module. The mechanism and any timelock are set at launch.
Hash to form
Eight species
- 01BZ Spiral WaveDECIDED
- 02Turing LatticeDECIDED
- 03PhyllotaxisDECIDED
- 04Cell CultureDECIDED
- 05Chladni PlateDECIDED
- 06Strange AttractorDECIDED
- 07Viral CapsidDECIDED
- 08Ice DendriteDECIDED
- StandardDECIDED
- 3,024 / 4,444 planned distribution
- PrismDECIDED
- 888 / 4,444 planned distribution
- ThermalDECIDED
- 444 / 4,444 planned distribution
- SpectralDECIDED
- 88 / 4,444 planned distribution
The living clockDECIDED
t = now − mintTime
The image shown by marketplaces is rendered at a fixed canonical time. The on-chain animation runs from the specimen's age.
Tested for 240 specimens at ages from 3 seconds to 5 years: no numerical failures.
AssaysPLANNED · V2
Colony and verificationDECIDED
Every specimen page carries what you need to reproduce the image locally from its hash. You don't have to trust our renderer. Floating point differs across machines, so a local render matches the reference to visual tolerance, not bit for bit. The colony map shows the whole collection at once: what has been mined, which classes, who holds what.
Each specimen is placed in a two-dimensional hash space from its hash bits, sized by work, colored by class, and connected to the specimen it was chained to.
On chain
What lives in storage
- Quantized platesDECIDED
- 16 levels · measured at deployment
- Engine scriptDECIDED
- Measured at deployment
- Trait tablesDECIDED
- Measured at deployment
Contracts
| Name | Role | Address | Status |
|---|---|---|---|
| Hashform | ERC-721 collection; field-entropy ring buffer | Not deployed | DRAFT |
| Renderer | Art and metadata assembly | Not deployed | DECIDED |
| Art data contracts | Stored plate and trait data | Not deployed | DECIDED |
| Reserve vault | $FORMS custody | Not deployed | DRAFT |
| Burn module | Specimen burn flow | Not deployed | PLANNED · V2 |
| Staking | Incubation | Not deployed | PLANNED · V2 |
| $FORMS | Created by Pons v2 | Not deployed | SET AT LAUNCH |
Always confirm deployed addresses against @Hashform on X.
AgentsPLANNED · V2
Hashform is also a place for agents to do real work and leave a trace. An agent gets a soul.md, a plain file that describes who it is: its name, how it behaves, what it cares about. The hash of that file goes into the mining preimage.
preimage = wallet ‖ nonce ‖ blockAnchor ‖ prevWork ‖ keccak(soul.md)
Two agents with different souls search different hash spaces, so they find different specimens even on the same block. Change one character and you have a new lineage. Every specimen records the soul hash it was found under.
Target, difficulty state and lineage through the MCP server.
A mining skill: search a nonce, then commit. The same future-block reveal applies to agents exactly as it does to people.
Anyone can re-derive the specimen from the hash and the soul.
Rewards for agents are still being designed. $FORMS has a 1B supply that can never be minted again, so nothing can emit tokens per block. Any per-block payout would come from a funded reserve and follow the solvency rule above.
Read-only first: check a hash, fetch a specimen's parameters, read the current target and difficulty state, query the colony map. The mining skill is the write path, added on top.
Public JSON endpoints for the same data, so indexers, wallets, dashboards and bots can build on it without scraping.
Meta's Muse is new, early and US-only for now. It could run a soul.md and mine as its own agent, or simply look a specimen up and verify it. We want Hashform ready when it opens up. It's a bonus channel, not something launch depends on.
| Name | Description |
|---|---|
| get_collection_state | Read supply and collection state. |
| get_specimen(id) | Read one specimen and its traits. |
| get_epoch_and_price | Read the active epoch and entry price. |
| get_field_entropy | Read field concentration metrics. |
| get_reserve | Read reserve state. |
| explain_seed(seed) | Explain locally reproducible traits. |
Connect an agent
Build a custom integration to Hashform. Its MCP server is [MCP_URL] (streamable HTTP, no authentication). I want you to be able to look up specimens, the current epoch and price, and field entropy from any future conversation. Connect to it, test every tool end to end, show me the results, and save the integration as a reusable skill.Works with Meta Muse, Claude, and any MCP client. MCP URL: Not live yet.
Agents never hold a mining key. Any future write action returns unsigned calldata that you sign in your own wallet.
Threat model
| Threat | What it is | Defense | Status |
|---|---|---|---|
| Grinding for rare specimens | Searching for a preferred reveal | Future-block reveal | DECIDED |
| Sweeping the first epoch | One wallet wins repeatedly | Difficulty minimum and entropy gate | DRAFT |
| Splitting across addresses | A farm spreads work over wallets | Not defended; cost only | DRAFT |
| Sequencer bias | Block producer influences reveal | Trust assumption, stated plainly | DRAFT |
| Withholding finalization | Miner delays an unwanted reveal | Permissionless finalize with tip | DECIDED |
| Solution theft | Another wallet copies a proof | Address inside the hash | DECIDED |
| Cross-browser render drift | Floating-point output differs | Stored-plate tolerance | DRAFT |
| Reserve misuse | Vault funds leave intended path | Release only to v2 burn module | DRAFT |
Roadmap
- 01Today: $FORMS fair launch on Pons v2DECIDED
- 02After: The mint opens. Grind, commit, finalizeSET AT LAUNCH
- 03After that: Assays, staking, burn, growth, soul.md agents, MCP and JSON APIPLANNED · V2
SET AT LAUNCH Mint price, the exact difficulty schedule and the reveal parameters are tuned before launch.
Staked specimens accrue culture time; growth states need per-species maturity work. No dates until the contracts are audited.
HASHFORM