{
  "$schema": "https://evmnow.github.io/contract-metadata/v1/schema.json",
  "chainId": 1,
  "address": "0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb",
  "meta": {
    "version": 1,
    "lastUpdated": "2026-03-18T00:00:00Z",
    "locale": "en"
  },
  "name": "CryptoPunks",
  "description": "One of the earliest NFT projects, predating ERC-721 — 10,000 24×24 pixel-art punks with randomly generated attributes.",
  "about": "## 10,000 unique collectible characters\n\nHumans have always been collectors, gathering tangible items like gemstones and watches, intangible things like books and art, and abstract concepts like knowledge. CryptoPunks extend this collecting impulse into the digital realm. The project consists of ten thousand 24×24 pixel portraits of punks, each assembled from various individual traits such as hairstyles and jewelry.\n\n## Proof of Ownership on the Ethereum Blockchain\n\nThe blockchain establishes a shared historical log and single source of truth about what happened when. This enables tracking ownership of objects over time. When CryptoPunks launched, they came with code processing ownership changes for each punk. All changes must go through this immutable, unblockable program. Anyone can prove punk ownership at any moment.\n\nThe Ethereum blockchain is validated by hundreds of thousands of distributed computers globally. Anyone can participate in securing the network. No entity can change any part of its state without following blockchain rules and smart contracts. For CryptoPunks, the relevant code is called the \"CryptoPunksMarket\" smart contract.\n\n## Inspired the modern CryptoArt movement\n\nThe world's biggest artists, auction houses and brands agree we live in a digitized world. This is a new medium, like past art forms, and cryptography and blockchain technologies enable collecting, owning, and trading items on a global, borderless market.\n\nCryptoPunks were the seminal art project of its kind, inspiring various technological standards and spearheading an entire movement. The Punks are now exhibited in prestigious museums like Centre Pompidou and LACMA, celebrated by icons from fashion, music, art and technology.\n\nThe CryptoPunksMarket smart contract has processed billions in trading volume. Thousands of accounts have interacted with it, over 6000 have owned punks, and the most traded punk has changed hands 51 times — all handled by code under 200 lines long.\n\n2.5+ billion dollars in secure trading. 200 lines of code. A global community with no middlemen or rent seekers.",
  "risks": [
    "No upgradeability — contract bugs are permanent and cannot be patched",
    "Predates ERC-721 — does not implement the standard NFT interface, requiring wrapper contracts for compatibility with modern marketplaces",
    "No royalty enforcement — the built-in marketplace has no creator fee mechanism",
    "ETH withdrawal pattern — sale proceeds and outbid returns must be manually withdrawn via pendingWithdrawals"
  ],
  "category": "nft",
  "tags": ["nft", "collectible", "pfp", "pixel-art", "og"],
  "links": [
    {
      "label": "Etherscan",
      "url": "https://etherscan.io/address/0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB"
    },
    { "label": "Larva Labs", "url": "https://larvalabs.com/cryptopunks" },
    { "label": "Website", "url": "https://www.cryptopunks.app" }
  ],
  "theme": {
    "accent": "#ff04b4"
  },
  "groups": {
    "info": { "label": "Contract Info", "order": 1 },
    "ownership": { "label": "Ownership", "order": 2 },
    "marketplace": { "label": "Marketplace", "order": 3 },
    "genesis": { "label": "Original Assignment", "order": 4 }
  },
  "actions": {
    "name": {
      "order": 0,
      "title": "Name",
      "description": "The name of the contract (CRYPTOPUNKS).",
      "stateMutability": "view",
      "group": "info"
    },
    "symbol": {
      "order": 1,
      "title": "Symbol",
      "description": "The token symbol (Ͼ).",
      "stateMutability": "view",
      "group": "info"
    },
    "totalSupply": {
      "order": 2,
      "title": "Total Supply",
      "description": "Total number of CryptoPunks (10,000).",
      "stateMutability": "view",
      "group": "info"
    },
    "imageHash": {
      "order": 3,
      "title": "The Punks Image",
      "description": "SHA-256 hash of the composite image containing all 10,000 punks. Used to verify image authenticity.",
      "stateMutability": "view",
      "group": "info",
      "_component": {
        "type": "sha256-content-prover",
        "props": {
          "sourceUrl": "https://raw.githubusercontent.com/larvalabs/cryptopunks/master/punks.png",
          "contentLabel": "Canonical image file",
          "contentType": "image",
          "title": "The 10,000 CryptoPunks",
          "description": "Fetches the canonical CryptoPunks composite image, hashes it in your browser, and compares it to the onchain hash.",
          "explainer": "If the computed hash matches the onchain hash, the image file is byte-for-byte identical to the one the creators committed when deploying the contract. Any modification — even a single pixel — would produce a completely different hash.",
          "links": [
            {
              "label": "View source on GitHub",
              "url": "https://github.com/larvalabs/cryptopunks/blob/master/punks.png"
            },
            {
              "label": "Learn why this hash matters",
              "url": "https://punks.vv.xyz/the-art/the-punk-image"
            }
          ]
        }
      }
    },
    "punkIndexToAddress": {
      "order": 0,
      "title": "Punk Owner",
      "description": "Look up the current owner of a specific punk by its index.",
      "stateMutability": "view",
      "group": "ownership",
      "params": {
        "_0": {
          "label": "punk index",
          "description": "The punk ID (0–9999)",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "returns": { "_0": { "label": "owner", "type": "address" } },
      "examples": [
        { "label": "Check owner of Punk #0", "params": { "_0": "0" } },
        { "label": "Check owner of Punk #7804", "params": { "_0": "7804" } }
      ]
    },
    "balanceOf": {
      "order": 1,
      "title": "Balance",
      "description": "Check how many punks an address owns.",
      "stateMutability": "view",
      "group": "ownership",
      "params": { "_0": { "label": "holder", "type": "address" } }
    },
    "transferPunk": {
      "order": 2,
      "title": "Transfer Punk",
      "description": "Transfer a punk you own to another address. Does not go through the marketplace.",
      "intent": "Transfer Punk #{punkIndex} to {to}",
      "group": "ownership",
      "warning": "This is a direct transfer with no payment involved. Make sure you intend to send the punk for free.",
      "params": {
        "to": { "label": "recipient", "type": "address" },
        "punkIndex": {
          "label": "punk index",
          "description": "The punk ID to transfer (0–9999)",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "related": ["punkIndexToAddress"]
    },
    "punksOfferedForSale": {
      "order": 0,
      "title": "Sale Info",
      "description": "Check if a punk is currently offered for sale and at what price.",
      "stateMutability": "view",
      "group": "marketplace",
      "params": {
        "_0": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "returns": {
        "isForSale": { "label": "for sale", "type": "boolean" },
        "punkIndex": { "label": "punk", "type": "token-id" },
        "seller": { "label": "seller", "type": "address" },
        "minValue": { "label": "min price", "type": "eth" },
        "onlySellTo": { "label": "Only sell to", "type": "address" }
      }
    },
    "punkBids": {
      "order": 1,
      "title": "Bid Info",
      "description": "Check the current bid on a punk.",
      "stateMutability": "view",
      "group": "marketplace",
      "params": {
        "_0": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "returns": {
        "hasBid": { "label": "has bid", "type": "boolean" },
        "punkIndex": { "label": "punk", "type": "token-id" },
        "bidder": { "label": "bidder", "type": "address" },
        "value": { "label": "bid amount", "type": "eth" }
      }
    },
    "buyPunk": {
      "order": 2,
      "title": "Buy Punk",
      "description": "Buy a punk that is currently listed for sale. Send ETH equal to or greater than the asking price.",
      "intent": "Buy Punk #{punkIndex} for {value}",
      "group": "marketplace",
      "value": {
        "label": "payment",
        "description": "Must meet or exceed the asking price. Excess is not refunded."
      },
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "related": ["punksOfferedForSale", "offerPunkForSale"]
    },
    "offerPunkForSale": {
      "order": 3,
      "title": "List Punk for Sale",
      "description": "List a punk you own for sale on the built-in marketplace at a minimum price.",
      "intent": "List Punk #{punkIndex} for sale at {minSalePriceInWei} minimum",
      "group": "marketplace",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        },
        "minSalePriceInWei": {
          "label": "minimum price",
          "description": "Minimum sale price",
          "type": "eth"
        }
      },
      "related": ["punkNoLongerForSale", "buyPunk"]
    },
    "offerPunkForSaleToAddress": {
      "order": 4,
      "title": "List Punk for Sale (Private)",
      "description": "List a punk for sale to a specific address only, at a minimum price.",
      "group": "marketplace",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        },
        "minSalePriceInWei": { "label": "minimum price", "type": "eth" },
        "toAddress": {
          "label": "buyer",
          "description": "Only this address can buy the punk",
          "type": "address"
        }
      },
      "related": ["offerPunkForSale", "buyPunk"]
    },
    "punkNoLongerForSale": {
      "order": 5,
      "title": "Delist Punk",
      "description": "Remove a punk from the marketplace. Cancels the current sale offer.",
      "group": "marketplace",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "related": ["offerPunkForSale"]
    },
    "enterBidForPunk": {
      "order": 6,
      "title": "Place Bid",
      "description": "Place a bid on a punk by sending ETH. Your ETH is held in the contract until the bid is accepted or you withdraw it.",
      "intent": "Bid {value} on Punk #{punkIndex}",
      "group": "marketplace",
      "warning": "Your ETH will be locked in the contract until the bid is accepted or withdrawn.",
      "value": {
        "label": "bid amount",
        "description": "Held by the contract until the bid is accepted or you withdraw it."
      },
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "related": ["withdrawBidForPunk", "acceptBidForPunk", "punkBids"]
    },
    "acceptBidForPunk": {
      "order": 7,
      "title": "Accept Bid",
      "description": "Accept the highest bid on a punk you own; the punk goes to the bidder and the ETH to your pending withdrawals.",
      "group": "marketplace",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        },
        "minPrice": {
          "label": "minimum price",
          "description": "Minimum bid amount you will accept (protects against front-running)",
          "type": "eth"
        }
      },
      "related": ["enterBidForPunk", "punkBids"]
    },
    "withdrawBidForPunk": {
      "order": 8,
      "title": "Withdraw Bid",
      "description": "Withdraw your bid on a punk, returning your locked ETH.",
      "group": "marketplace",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      },
      "related": ["enterBidForPunk", "punkBids"]
    },
    "pendingWithdrawals": {
      "order": 9,
      "title": "Pending Withdrawals",
      "description": "Check the amount of ETH an address can withdraw from sales or returned bids.",
      "stateMutability": "view",
      "group": "marketplace",
      "params": { "_0": { "label": "address", "type": "address" } },
      "returns": { "_0": { "type": "eth" } },
      "related": ["withdraw"]
    },
    "withdraw": {
      "order": 10,
      "title": "Withdraw ETH",
      "description": "Withdraw ETH owed to you from punk sales or outbid returns.",
      "group": "marketplace",
      "related": ["pendingWithdrawals"]
    },
    "getPunk": {
      "order": 0,
      "title": "Claim Punk (Inactive)",
      "description": "Originally used to claim a free punk at launch; all 10,000 are claimed, so this function is no longer usable.",
      "deprecated": "All 10,000 punks have been claimed. This function will revert.",
      "group": "genesis",
      "params": {
        "punkIndex": {
          "label": "punk index",
          "type": "token-id",
          "validation": { "min": "0", "max": "9999" }
        }
      }
    },
    "allPunksAssigned": {
      "order": 1,
      "title": "All Punks Assigned",
      "description": "Whether all 10,000 punks have been claimed. Returns true.",
      "stateMutability": "view",
      "group": "genesis"
    },
    "punksRemainingToAssign": {
      "order": 2,
      "title": "Punks Remaining to Assign",
      "description": "Number of punks still available to claim. Returns 0 (all claimed).",
      "stateMutability": "view",
      "group": "genesis"
    },
    "nextPunkIndexToAssign": {
      "order": 3,
      "title": "Next Punk Index to Assign",
      "description": "The next punk index to be assigned during the initial claim phase. All punks have been claimed, so this is historical.",
      "stateMutability": "view",
      "group": "genesis"
    }
  },
  "events": {
    "PunkTransfer": {
      "description": "Emitted when a punk is transferred between addresses.",
      "params": {
        "from": { "label": "from" },
        "to": { "label": "to" },
        "punkIndex": { "label": "punk index", "type": "token-id" }
      }
    },
    "PunkOffered": {
      "description": "Emitted when a punk is listed for sale.",
      "params": {
        "punkIndex": { "label": "punk index", "type": "token-id" },
        "minValue": { "label": "minimum price", "type": "eth" },
        "toAddress": { "label": "exclusive buyer" }
      }
    },
    "PunkBidEntered": {
      "description": "Emitted when a bid is placed on a punk.",
      "params": {
        "punkIndex": { "label": "punk index", "type": "token-id" },
        "value": { "label": "bid amount", "type": "eth" },
        "fromAddress": { "label": "bidder" }
      }
    },
    "PunkBidWithdrawn": {
      "description": "Emitted when a bid is withdrawn.",
      "params": {
        "punkIndex": { "label": "punk index", "type": "token-id" },
        "value": { "label": "bid amount", "type": "eth" },
        "fromAddress": { "label": "bidder" }
      }
    },
    "PunkBought": {
      "description": "Emitted when a punk is sold.",
      "params": {
        "punkIndex": { "label": "punk index", "type": "token-id" },
        "value": { "label": "sale price", "type": "eth" },
        "fromAddress": { "label": "seller" },
        "toAddress": { "label": "buyer" }
      }
    },
    "PunkNoLongerForSale": {
      "description": "Emitted when a punk is delisted from the marketplace.",
      "params": {
        "punkIndex": { "label": "punk index", "type": "token-id" }
      }
    },
    "Assign": {
      "description": "Emitted during the initial claim phase when a punk was assigned to an address.",
      "params": {
        "to": { "label": "claimer" },
        "punkIndex": { "label": "punk index", "type": "token-id" }
      }
    },
    "Transfer": {
      "description": "Emitted on punk transfer (legacy event, predates ERC-721).",
      "params": {
        "from": { "label": "from" },
        "to": { "label": "to" },
        "value": { "label": "count" }
      }
    }
  }
}
