{
  "project": "CryptoPunks",
  "artist": "Larva Labs (Matt Hall and John Watkinson)",
  "chain": "Ethereum mainnet",
  "chainId": 1,
  "contractAddress": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
  "deployBlock": 3914495,
  "deployDate": "2017-06-22T19:40:00Z",
  "creationTransaction": "0x0885b9e5184f497595e1ae2652d63dbdb2785de2e498af837d672f5765f28430",
  "tokenCount": 10000,
  "tokenStandard": "pre-ERC-721 custom contract (modified ERC-20); CryptoPunks predates and helped inspire the ERC-721 NFT standard",
  "imageHash": {
    "algorithm": "SHA-256",
    "value": "ac39af4793119ee46bbff351d8cb6b5f23da60222126add4268e261199a2921b",
    "of": "punks.png — the 2400x2400 composite image of all 10,000 punks",
    "recordedAs": "the contract's public imageHash variable, readable on-chain",
    "note": "verify a downloaded punks.png with: shasum -a 256 punks.png"
  },
  "canonicalImageUrl": "https://files.larvalabs.com/cryptopunks/original/punks.png",
  "imageContract": {
    "name": "CryptopunksData",
    "address": "0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2",
    "purpose": "holds the punk images and attributes on-chain; deployed in 2021, four years after the punks themselves",
    "deployBlock": 13045935,
    "deployDate": "2021-08-18T00:10:24Z",
    "creationTransaction": "0xc82aa34310c310463eb9fe7835471f7317ac4b5008034a78c93b2a8a237be228",
    "sealBlock": 13047090,
    "sealDate": "2021-08-18T04:27:45Z",
    "sealed": true,
    "sealNote": "every write function carries an 'unsealed' modifier and sealContract() has been called, so the stored data can no longer be changed by anyone",
    "stores": {
      "palette": "480 bytes, 120 RGBA colors",
      "assets": "133 run-length-encoded attribute layers, 8205 bytes, with 133 names in a parallel mapping",
      "punks": "100 rows of 800 bytes, one 8-slot asset composition per punk",
      "composites": "alpha-blend lookup table",
      "note": "the contract stores the parts and the composition rules, roughly 90 KB in all, and assembles each image when it is called; it does not store finished pictures"
    },
    "verification": {
      "pixels": {
        "call": "punkImage(uint16)",
        "returns": "2304 bytes of raw RGBA, the punk's 24x24 pixels row by row",
        "matches": "the pixel data of cryptopunks/original/punkNNNN.png, byte for byte",
        "verified": "all 10,000 punks checked against the live contract, 0 differences",
        "note": "verify one punk with: cast call 0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2 \"punkImage(uint16)(bytes)\" NNNN"
      },
      "attributes": {
        "call": "punkAttributes(uint16)",
        "returns": "the punk's type and accessories as a comma-separated list",
        "reconstructFromTraitsCsv": [
          "join the Type row's trait with its skin column ('Female' + '2' -> 'Female 2')",
          "drop 'Normal Mouth', which names the absence of a mouth expression and has no on-chain asset",
          "read 'Goatee' as the contract's 'Goat'"
        ],
        "verified": "all 10,000 attribute strings reconstruct exactly from traits.csv under those rules"
      },
      "svg": {
        "call": "punkImageSvg(uint16)",
        "returns": "the same pixels as an SVG of 1x1 rects on a transparent ground, prefixed 'data:image/svg+xml;utf8,'"
      }
    },
    "compiler": "solc 0.7.6, optimizer disabled, evmVersion istanbul",
    "runtimeBytecode": {
      "bytes": 9587,
      "sha256": "bc2a851ccefa314a6670d00507cf7bd36797e6e94857a9fcd388a109a4d11f11",
      "note": "retrieve and hash it with: cast code 0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2"
    },
    "links": {
      "etherscan": "https://etherscan.io/address/0x16f5a35647d6f03d5d3da7b35409d65ba03af3b2#readContract"
    }
  },
  "links": {
    "etherscan": "https://etherscan.io/address/0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
    "imageHashOnChain": "https://etherscan.io/address/0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB#readContract#F5"
  }
}
