# punks.generated.eth > Generative 24x24 punks on Ethereum. Each one is built from per-pixel statistics of the full 10,000-image CryptoPunks dataset, then rendered deterministically from a 32-byte seed stored on-chain for its token. The art engine and pixel dataset are fully on chain: renderer.tokenURI(id, seedOf(id)) returns JSON plus an HTML page that carries the engine, so anyone can re-render a punk from the chain alone. For marketplace speed, the collection's tokenURI(id) currently returns the Worker URL https://punks-generated-eth.enspiration-eth.workers.dev/token/{id} (metadataBase override), which serves that same renderer output as standard JSON. These are NOT CryptoPunks and have no affiliation with Larva Labs or Yuga Labs. Status: live on Ethereum mainnet. Minting is open (read `mintOpen()`, selector 0x24bbd049; when false, mint/claimFree/claimFid revert with MintClosed). Price 0.002 ETH per punk, up to 10 per transaction, no supply cap. ## Chain - Network: Ethereum mainnet - Chain ID: 1 (hex 0x1) - Public RPC: https://ethereum-rpc.publicnode.com - Explorer: https://etherscan.io ## Contracts - NFT collection (ERC-721, name "punks.generated.eth", symbol PUNKSGEN): 0xdfe2f4b6f2644eb6cf362c8735f789d3a03c5ffa - Renderer: 0x2d586F3a0B592Faf0bf6b1757Bb94025A9DbC857 - ERC-8004 Identity Registry: 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 ## Agent service (easiest for agents) Base URL: https://punks-generated-eth.enspiration-eth.workers.dev - MCP (Streamable HTTP, JSON-RPC, protocol 2025-06-18): https://punks-generated-eth.enspiration-eth.workers.dev/mcp Tools: get_status, quote_mint, mint (returns an unsigned mint(qty) tx you sign yourself; the optional `from` is only copied into the tx, the punks go to whichever wallet sends it), confirm_mint, get_token, erc8004_register_punk, leave_feedback, resolve_subname, list_punk, make_offer, submit_order, get_market, accept, cancel_order. - x402 direct mint: https://punks-generated-eth.enspiration-eth.workers.dev/x402/mint?qty=1 1. GET it. You receive HTTP 402 with a PAYMENT-REQUIRED header (scheme "direct-mint", asset native ETH, payTo the NFT contract). `accepts[0].extra.tx` is the exact mint transaction. 2. Send that transaction from your own wallet. You pay the contract directly; the server never holds keys or funds. 3. Retry the same URL with header PAYMENT-SIGNATURE = base64({x402Version:2, accepted, payload:{txHash}}). The response lists your token ids, their subnames and token URLs. This is a custom x402 scheme ("direct-mint") paid in native ETH on Ethereum mainnet. Standard USDC x402 clients and facilitators are not supported. - ERC-8004: punks.generated.eth is registered as ERC-8004 agent 56084 on Ethereum mainnet (Identity Registry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432, agentRegistry eip155:1:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432). Its registration file is stored on chain (tokenURI 56084). Copy: https://punks-generated-eth.enspiration-eth.workers.dev/.well-known/agent-registration.json - ENS agent records on punks.generated.eth: text "agent-registration[0x000100000101148004a169fb4a3325136eb29fa0ceb6d2e539a432][56084]" = "1" (ENSIP-25, links the name to agent 56084) and text "agent-card" = https://punks-generated-eth.enspiration-eth.workers.dev/.well-known/agent-card.json - Agent card (A2A-style JSON describing the MCP and x402 services; there is no A2A task endpoint yet, so talk to it over MCP): https://punks-generated-eth.enspiration-eth.workers.dev/.well-known/agent-card.json - Token JSON: https://punks-generated-eth.enspiration-eth.workers.dev/token/{tokenId} - Image (PNG) for any seed: https://punks-generated-eth.enspiration-eth.workers.dev/img/{seed} (this is the tokenURI image base) - Discovery copies on the site: https://punks.generated.eth.limo/.well-known/agent-registration.json, https://punks.generated.eth.limo/.well-known/agent-card.json and https://punks.generated.eth.limo/.well-known/llms.txt - Feedback (optional, ERC-8004 Reputation Registry 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63): after a mint, if your wallet owner agrees, MCP leave_feedback {score 0-100, from} returns an unsigned giveFeedback tx (tag1 "starred", tag2 "mint") for agent 56084. You pay gas only. confirm_mint includes a pointer to it. - Your punk as your agent's ERC-8004 identity: https://punks-generated-eth.enspiration-eth.workers.dev/erc8004/punk/{tokenId} returns a registration file (punk image, {tokenId}.punks.generated.eth name) and an unsigned register tx for the owner to send. ## Your punk as your agent's identity (ERC-8004) Every punk can be the face and name of its owner's own agent. GET https://punks-generated-eth.enspiration-eth.workers.dev/erc8004/punk/{tokenId} (or MCP erc8004_register_punk {id, name?, description?, mcp?}). It returns a complete ERC-8004 registration file (image = the punk, ENS = {tokenId}.punks.generated.eth, which already resolves to the owner) and an unsigned register tx to the Identity Registry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432. Send it from the punk owner's wallet; only gas is paid. The punk must be revealed (about one block after mint). ## Trading between agents (Seaport 1.6) Punks trade peer to peer on Seaport 1.6 (0x0000000000000068F116a894984e2DB1123eB395, the same contract OpenSea uses). The service only builds typed data and unsigned transactions and keeps a public book of signed orders. It never holds keys, funds or tokens. Every trade settles atomically in one Seaport transaction. - Approvals go to the OpenSea conduit 0x1E0049783F008A0085193E00003D00cd54003c71 (conduitKey 0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000). - Listings are priced in ETH. Offers are paid in WETH (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2). - Creator fee: 5% (500 bps) of every sale goes to doom.eth (0x85E9233E8681087Ef3e34B30630E7E0D25510fb4). list_punk and make_offer build it in. submit_order rejects orders with a lower fee or a different recipient. On offers the seller pays the fee in WETH when accepting. - Sell: list_punk {id, priceEth} returns typedData plus a one-time setApprovalForAll tx if needed. Sign typedData with eth_signTypedData_v4, then submit_order {order, signature}. - Buy: make_offer {buyer, id, priceEth} for one punk, or omit id for a collection offer on any punk. It returns typedData plus WETH wrap and approve txs if needed. Sign, then submit_order. - Look: get_market {id} (or no id for the collection) returns live listings (cheapest first), offers (highest first), recent sales and the token's traits. REST: https://punks-generated-eth.enspiration-eth.workers.dev/market and /market/{tokenId}. - Fill: accept {orderHash, fulfiller, tokenId?} returns a simulated fulfillAdvancedOrder tx (tokenId is required for a collection offer) plus any approvals still missing. Send it from the fulfiller wallet. - Cancel: cancel_order {orderHash} returns the Seaport cancel tx for the offerer to send. incrementCounter() on Seaport cancels all of your orders. - submit_order checks the signature (EOA or ERC-1271), ownership, conduit approval and WETH balance and allowance. Orders are re-checked on-chain every time they are read, and stale ones are skipped. - submit_order is limited to 10 calls per minute per IP. Over the limit you get HTTP 429 with a JSON-RPC error (code 429) and retry-after: 60. - Only trade when the wallet owner asked you to, and decide the price yourself. Simulate before sending. ## ENS subnames Every minted token N has the name N.punks.generated.eth via a wildcard resolver. It resolves to the current owner of token N (it follows transfers) and its avatar is the punk. Unminted numbers resolve to nothing. The mainnet wildcard resolver is live: punks.generated.eth uses resolver 0x77512B05a2956aFb29E40a7a1d938917D8a612c1, so N.punks.generated.eth resolves to ownerOf(N) for any minted N, with no per-token setup. ## Untyped traits At thumbnail size, punks often show emergent features that are not in the metadata, such as Rotten Flesh, Duck Beak, Fly Swarm, Confetti Head, Pig Snout or Demon. These are the collection's rare untyped traits: nothing records them, so collectors and agents discover and name them. They are a feature, not a defect. Prompt for agents (copy and paste, with the punk's image from tokenURI or https://punks-generated-eth.enspiration-eth.workers.dev/img/{seed}): ``` Show this punk at about 24px, 48px and 240px, scaled with nearest-neighbour (no smoothing). Judge first at the smallest size, the way someone scrolling past a thumbnail would. List everything a casual viewer might see that is not one of its listed traits: creatures, body parts, decay, injuries, objects. Skip the typed traits. For each one give: a short Title Case name, where it is, which pixels or colors create it, and a strength score from 1 (barely there) to 5 (impossible to unsee). If nothing stands out, reply "nothing notable". Optional: reply as JSON, [{"name": "...", "location": "...", "pixels": "...", "strength": 1}]. ``` ## How to mint directly Call on the collection contract: ```solidity function mint(uint256 qty) payable ``` - Selector: 0xa0712d68. Calldata: `0xa0712d68` + uint256(qty). - msg.value must equal price() * qty exactly. Read `price()` (selector 0xa035b1fe) before every mint and simulate with eth_call. Gas is extra. - Recipient: mint(qty) mints to msg.sender, the wallet that sends the tx. There is no recipient argument. - Gas guide: about 111k gas units for mint(1) (measured on mainnet), more for each extra punk; about 175k for a free claim (claimFree / claimFid). Always run estimateGas and add the current gas price. - Fallback price shown by the page: 0.002 ETH = 2000000000000000 wei per punk (always trust price()). - This page lets a person pick 1 to 10 per transaction. Agents should stay at 10 or fewer too. - No supply cap, no end time. ## After minting - Token IDs: `Transfer` events (topic 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef) from 0x0 in the receipt; topics[3] is the token ID. Or MCP confirm_mint. - Total minted: `totalSupply()` (0x18160ddd). Seed: `seedOf(uint256)` (0x82829f74). Metadata: `tokenURI(uint256)` (0xc87b56dd), currently the Worker /token/{id} URL; token names are "punks.generated.eth #{id}". - You cannot pick a punk; it comes from the seed. ## Rules for agents - Only mint when the wallet owner has asked you to. Every mint costs ETH and cannot be refunded. - Check the chain ID before sending. - Re-read price() on-chain and simulate before every transaction. ## Links - Mint page: https://punks.generated.eth.limo - Agent service: https://punks-generated-eth.enspiration-eth.workers.dev