Back to Home

MetaPunk(MP)

Unclassified
0x0144b7e66993...f96bfe50c9df
ByzantiumSource VerifiedEdit this contract
Deployed June 23, 2018 (8 years ago)Block 5,837,813

A June 2018 ERC-721 built to represent CryptoPunks, holding none. It has minted 9,640 tokens while the punks contract it points at is not the real one.

Byzantium EraVerified Source

Historical Significance

Wrapping only means anything if the wrapper actually holds what it claims, and this contract is a compact demonstration of how that guarantee can be absent while every outward sign of it is present. The custody check is written into the source, is visible to anyone reading it, and is verified on Sourcify, yet it is satisfied by an address the owner supplies rather than by the CryptoPunks contract. For an archive that links wrappers to the originals they represent, this is the case that shows why the link has to be established from custody read on chain and not from a contract's name, its stated interface or the presence of a require statement.

Context

Deployed 23 June 2018 at block 5,837,813 by 0x5bb35c9576ef6e42d4447adcb3272f0b8582e82e, compiled with solc 0.4.23 and verified on Sourcify as ERC721PUNK. Ownership has since moved to 0x67401149E3e88B10DD92821EB6302F4DeE8191bC, which holds the Existing, makeToken, seturi and transfer functions. Token metadata is served from an IPFS CID set per token by the owner through seturi, so the collection presented under this contract can differ from the MetaPunk name stored on chain. No wrapper_of link is set here, deliberately: the archive links a wrapper to an original only where custody can be read on chain, and here the punk balance is zero.

Token Information
Token Name
MetaPunk
Symbol
MP
Key Facts
Deployment Block
5,837,813
Deployment Date
Jun 23, 2018, 03:23 AM
Code Size
10.5 KB
Gas at Deploy
2,988,783
Transactions by Year
201810
20203
20226,364
20231,233
2024378
2025399
202657

Description

The contract is verified as ERC721PUNK and issues a token called MetaPunk, symbol MP. Its design is a custody wrapper: it keeps punkToTokenId and tokenIdToPunk mappings, and makeToken refuses to mint unless the punk is already held, through require(indexToAddress(_punkId) == address(this), "Punk not owned by this Contract"). The address it asks is set after deployment by an owner only function called Existing, and on this deployment that pointer does not resolve to the real CryptoPunksMarket. indexToAddress returns this contract's own address for every id tried, from 0 through 9639, so the custody requirement is satisfied by every call and mints nothing back. Read against the real CryptoPunksMarket at 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB, this contract's punk balance is zero, while its own totalSupply is 9,640.

Heuristic Analysis

The following characteristics were detected through bytecode analysis and may not be accurate.

Detected Type: Unclassified

Bytecode Overview

Opcodes10,753
Unique Opcodes245
Jump Instructions397
Storage Operations114

External Links