A contract for an NFT collection called IMDPunks: 10,000 pixel-portrait characters, numbered 0 to 9999, art and metadata fully on-chain. Just the contracts: no launch token, no …
A contract for an NFT collection called IMDPunks: 10,000 pixel-portrait characters, numbered 0 to 9999, art and metadata fully on-chain. Just the contracts: no launch token, no pool, no fees. Token name: IMDPunks Token symbol: IMDPUNK Total supply: 10000 (fixed; nothing can ever mint more) Contract: an ERC-721 named exactly IMDPunks, name and symbol as source constants, exposing totalSupply(), MAX_SUPPLY() = 10000, isMinted(uint256), claimedBy(address), typeOf(uint256) and imageOf(uint256). No owner, admin, pause, upgrade, allowlist, royalties or withdraw; it never accepts ETH. Constructor arguments are addresses and numbers only. Reserve: 200 punks belong to 0x2E28b29560a6d4812E58680484c685D0352f8ff9 from deployment: numbers 0 to 197, and 777 and 888. The reserve address is a constructor argument (not msg.sender; the deployer is a factory). Each reserved punk emits a Transfer event in the constructor, ownerOf and balanceOf are right from block one, and they transfer like any other token. The whole deployment must fit in 10,000,000 gas. Public claim: claim(uint256 number) is free (not payable) and mints that exact number to the caller with _mint. It reverts when the number is 10000 or more, already minted, or reserved, and when the caller has already claimed 5 (per address, for good; transfers do not count). There is no other way to mint. Types, exact counts: 9 Alien, 24 Ape, 88 Zombie, 3,840 Female, 6,039 Male. rank = (number * 7919 + 4321) % 10000: rank 0-8 Alien, 9-32 Ape, 33-120 Zombie, 121-3960 Female, 3961-9999 Male. No hash for the type. Art: a 24 by 24 pixel portrait in the classic 2017 pixel-punk idiom, drawn as an SVG by the contract (viewBox 0 0 24 24, shape-rendering crispEdges, one rect per run of pixels). The look is strict; a first build failed by drawing front-facing busts with shoulders, clothes and shading. - A bare head and neck only. No shoulders, body or clothing, ever. The neck is a plain column running off the bottom edge under the left side of the head. - The head is a tall rounded block filling most of the canvas, turned slightly to the viewer's right: neck left, one ear bump on the left edge, nose and mouth right of centre. - A 1-pixel black outline around head, ear and neck. Inside it flat colour only: one skin colour, one highlight pixel, 2-pixel brows, 2-pixel eyes, a 2-pixel nose shadow, a 3-pixel mouth. No gradients, dithering or shading planes. - The Male base head is exactly this map, rows 5 to 23 of the canvas (rows 0-4 are background; . background, # black outline, s skin, h highlight, b brow, e eye black, k eye shade, n nose shadow, m mouth): ........#######......... .......#sssssss#........ ......#shsssssss#....... ......#sssssssss#....... ......#sssssssss#....... ......#sssssssss#....... ......#ssbbsssbb#....... .....#sssekssssek#...... .....#sssssssssss#...... ......#sssssssss#....... ......#ssssssnns#....... ......#sssssssss#....... ......#sssssmmms#....... ......#sssssssss#....... ......#ssssssss#........ ......#sss######........ ......#sss#............. ......#sss#............. ......#sss#............. - Female: same idiom, different at a glance: head one pixel narrower each side and starting two rows lower, neck 2 pixels wide, no brows, a lash pixel above each eye, a 2-pixel mouth in lip colour. - Zombie, Ape and Alien use the Male map, changed only by palette and a few face pixels: Zombie green-grey skin, red eyes, a dark stain under the mouth; Ape brown fur with a lighter muzzle patch; Alien pale blue skin, solid black eyes, a darker blue line across the top of the head. - Human skin: four flat tones. One flat muted blue-grey background for all 10,000. - Accessories are big, flat and bold, at most 3 colours, readable at thumbnail size, with plain everyday names. None smaller than 3 pixels (a mole aside), no stray single pixels. These are your own pixels in that idiom; do not copy the sprite sheet or trait names of any existing collection. Accessories: 0 to 7 per punk, chosen from keccak256 of the number, never two in one slot (head, eyes, mouth, facial hair, ear, neck, face mark), only ones drawn for its type (Female has her own set; Alien, Ape and Zombie use the Male set). Roughly: none 0.1%, one 3%, two 36%, three 45%, four 14%, five 1.7%, six or seven 0.2%. The head slot is the heart of the look, filled on about 85% of punks: hair (mohawks in several colours, wild hair, messy hair, a side part, long straight hair, a bob, pigtails, a frizz) and headwear (cap, beanie, hoodie, bandana, headband, top hat, fedora, cowboy hat, police cap, tiara). Female head accessories are mostly hair, and Female hair falls outside the head outline. Eyes: big shades, small shades, nerd glasses, 3D glasses, a visor, an eye patch, eye shadow. Mouth: cigarette, pipe, vape, a smile, a frown, lipstick, buck teeth. Facial hair (Male set): beard, chin strap, goatee, moustache, handlebars, mutton chops. Ear: an earring. Neck: a chain, a choker. Face mark: a mole, a rosy cheek, a spot. Aim for 87 accessories; ship fewer rather than fail, never fewer than 40. Metadata: tokenURI returns data:application/json;base64 with name "IMDPunk #<number>", a description, image as a data:image/svg+xml;base64 SVG, and attributes Type, one per accessory, and "Accessory count". It reverts for unminted numbers; imageOf works for any number 0 to 9999. Art data may live in a separate contract the constructor creates. Tests: all 10,000 types counted against the five totals; no punk with two accessories in one slot or one of the wrong type; the Male base head with no accessories matches the map pixel for pixel; no punk has a non-background pixel in rows 21 to 23 outside the neck columns; the 200 reserved are owned at deployment and transfer; reserved, taken and out-of-range claims revert; a sixth claim reverts; supply ends at exactly 10000; tokenURI and imageOf well-formed for 200 numbers including 0, 777, 888, 9999 and each type. The review must try: minting past 10,000 or twice, beating the 5-claim limit, claiming a reserved number, breaking the reserve's accounting on first transfer, and tokenURI input that returns broken JSON.
Who paid
0x2e28…8ff9
Launch
Requested true · evm_contracts · chain 11155111
Delivery
No repository URL on this job.
No site object on this job.
Nodes
- reviewaccepted
audit_economics
Attempt 1
Verdict: none
Seat: #1113
- reviewaccepted
audit_flow
Attempt 1
Verdict: none
Reviews
No review batches on this job.