every ethereum contract this site reads or writes, with the exact abi surface in use. addresses are mainnet.
■ CryptoPunksMarket
0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBBthe marketplace contract deployed by Larva Labs in june 2017. tracks ownership, listings, bids, and pending balances. all buy / bid / transfer flows on the home page hit this contract.
▸ view functions (11 read · 9 write)
■ read functions
name() → (string)ERC-20-style token name (“CRYPTOPUNKS”).
symbol() → (string)Token symbol (“C”).
imageHash() → (string)SHA-256 of the original 10,000-Punks composite PNG, fixed at deploy.
totalSupply() → (uint256)Total Punks ever minted (10,000).
punksRemainingToAssign() → (uint256)Punks not yet claimed during the original 2017 distribution. Should be 0 today.
nextPunkIndexToAssign() → (uint256)Internal pointer used during initial assignment. Vestigial post-2017.
punkIndexToAddress(uint256) → (address)Current owner of a given Punk index.
balanceOf(address) → (uint256)Number of Punks held by an address.
punksOfferedForSale(uint256) → (bool isForSale, uint256 punkIndex, address seller, uint256 minValue, address onlySellTo)Active sale listing for a Punk (isForSale, seller, minValue, optional onlySellTo).
punkBids(uint256) → (bool hasBid, uint256 punkIndex, address bidder, uint256 value)Top standing bid for a Punk (hasBid, bidder, value).
pendingWithdrawals(address) → (uint256)ETH owed to an address from sales / outbid refunds. Claim with withdraw().
■ write functions
offerPunkForSale(uint256 punkIndex, uint256 minSalePriceInWei)Owner lists a Punk at a minimum sale price in wei.
offerPunkForSaleToAddress(uint256 punkIndex, uint256 minSalePriceInWei, address toAddress)Owner lists a Punk to a specific buyer at a minimum price.
punkNoLongerForSale(uint256 punkIndex)Owner cancels their active sale listing.
buyPunk(uint256 punkIndex) [payable]Anyone can take a Punk that’s for sale by sending ≥ minValue.
enterBidForPunk(uint256 punkIndex) [payable]Place a bid in ETH; previous top bidder is refunded into pendingWithdrawals.
acceptBidForPunk(uint256 punkIndex, uint256 minPrice)Owner accepts the current top bid (must specify a minimum acceptable price).
withdrawBidForPunk(uint256 punkIndex)Bidder cancels their bid and reclaims the locked ETH.
transferPunk(address to, uint256 punkIndex)Owner transfers a Punk to another address. No payment.
withdraw()Pull all ETH owed to msg.sender out of pendingWithdrawals.
■ CryptopunksData
0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2onchain image & attribute data, added by Larva Labs in 2021. returns a punk’s pixel art as an svg and its trait list as a comma-separated string — the source for the rendered punk on the home page.
// interact
▸ view functions (2 read · 0 write)
■ read functions
punkImageSvg(uint16 index) → (string svg)Render a Punk as an inline SVG (24×24 viewBox). Returns a data:image/svg+xml URL.
punkAttributes(uint16 index) → (string text)Comma-separated list of attributes. First entry is the head type (Male, Female, Zombie, Ape, Alien).
■ WrappedPunks (WPUNKS) — legacy
0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6the original third-party erc-721 wrapper. to wrap, call registerProxy() once, transfer the punk to the resulting proxy, then call mint(punkIndex). holders are encouraged to migrate to the newer cryptopunks721 below via migrateLegacyWrappedPunks.
▸ view functions (16 read · 13 write)
■ read functions
name() → (string)ERC-20-style token name (“CRYPTOPUNKS”).
symbol() → (string)Token symbol (“C”).
totalSupply() → (uint256)Total Punks ever minted (10,000).
balanceOf(address owner) → (uint256)Number of Punks held by an address.
ownerOf(uint256 tokenId) → (address)ERC-721 owner of a wrapped Punk token.
tokenURI(uint256 tokenId) → (string)Metadata URI for a wrapped token (concatenates baseURI + id).
baseURI() → (string)Current base for tokenURI(); set by the contract owner.
tokenByIndex(uint256 index) → (uint256)ERC-721 enumerable: token ID at the global index.
tokenOfOwnerByIndex(address owner, uint256 index) → (uint256)ERC-721 enumerable: nth token held by a given owner.
getApproved(uint256 tokenId) → (address)ERC-721 single-token approval target.
isApprovedForAll(address owner, address operator) → (bool)ERC-721 operator approval status.
supportsInterface(bytes4 interfaceId) → (bool)EIP-165 interface check.
proxyInfo(address user) → (address)Returns the UserProxy address for a given user, or 0x0 if not registered.
punkContract() → (address)Address of the underlying CryptoPunksMarket this wrapper is bound to.
owner() → (address)Current contract owner (Ownable).
paused() → (bool)Whether the contract is currently paused.
■ write functions
registerProxy()One-time setup: deploys a UserProxy contract for msg.sender. The Punk must be transferred to this proxy before mint().
mint(uint256 punkIndex)Wrap a Punk: caller's UserProxy must already hold punkIndex. Mints a matching ERC-721 token to the caller.
burn(uint256 punkIndex)Unwrap: burns the WPUNK and returns the underlying Punk to msg.sender.
approve(address to, uint256 tokenId)ERC-721 approve another address to transfer a single token.
setApprovalForAll(address to, bool approved)ERC-721 grant/revoke an operator over all of caller's tokens.
transferFrom(address from, address to, uint256 tokenId)ERC-721 transfer (no receiver-hook check).
safeTransferFrom(address from, address to, uint256 tokenId)ERC-721 transfer with onERC721Received hook on contract recipients.
safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)ERC-721 transfer with onERC721Received hook on contract recipients.
setBaseURI(string baseUri)Owner-only: update the tokenURI base.
pause()Owner-only: halt mint / burn / transfer.
unpause()Owner-only: resume operations.
transferOwnership(address newOwner)Owner-only: hand ownership to another address.
renounceOwnership()Owner-only: drop ownership permanently (sets owner to 0x0).
■ CryptoPunks721
0x000000000000003607fce1aC9e043a86675C5C2Fthe current canonical erc-721 wrapper for cryptopunks. supports single and batch wrap / unwrap, direct migration from the legacy wpunks, and a rescuePunk path for punks sent here by mistake. each user gets a per-address proxy via punkProxyForUser; transfer the punk to that proxy, then call wrapPunk.
▸ view functions (12 read · 11 write)
■ read functions
name() → (string)ERC-20-style token name (“CRYPTOPUNKS”).
symbol() → (string)Token symbol (“C”).
licensingTerms() → (string)Onchain pointer to the CryptoPunks license text.
totalSupply() → (uint256)Total Punks ever minted (10,000).
balanceOf(address owner) → (uint256)Number of Punks held by an address.
ownerOf(uint256 id) → (address)ERC-721 owner of a wrapped Punk token.
tokenURI(uint256 tokenId) → (string)Metadata URI for a wrapped token (concatenates baseURI + id).
tokensOfOwner(address owner) → (uint256[])All token IDs an address currently holds.
punkProxyForUser(address user) → (address)User's per-address proxy that holds Punks before wrapping. CryptoPunks721 deploys these on demand.
getApproved(uint256 id) → (address)ERC-721 single-token approval target.
isApprovedForAll(address owner, address operator) → (bool)ERC-721 operator approval status.
supportsInterface(bytes4 interfaceId) → (bool)EIP-165 interface check.
■ write functions
wrapPunk(uint256 punkIndex)Wrap a single Punk into a CryptoPunks721 token. Caller must have transferred the Punk to their punkProxyForUser first.
wrapPunkBatch(uint256[] punkIndexes)Wrap many Punks in one transaction.
unwrapPunk(uint256 punkIndex)Burn the ERC-721 and return the underlying Punk to the holder.
unwrapPunkBatch(uint256[] punkIndexes)Unwrap many Punks at once.
migrateLegacyWrappedPunks(uint256[] punkIndexes)Bulk-migrate WPUNKS (the 0xb7F7… legacy wrapper) into CryptoPunks721 tokens.
rescuePunk(uint256 punkIndex)Recover a Punk transferred directly to this contract by mistake.
approve(address account, uint256 id) [payable]ERC-721 approve another address to transfer a single token.
setApprovalForAll(address operator, bool isApproved)ERC-721 grant/revoke an operator over all of caller's tokens.
transferFrom(address from, address to, uint256 id) [payable]ERC-721 transfer (no receiver-hook check).
safeTransferFrom(address from, address to, uint256 id) [payable]ERC-721 transfer with onERC721Received hook on contract recipients.
safeTransferFrom(address from, address to, uint256 id, bytes data) [payable]ERC-721 transfer with onERC721Received hook on contract recipients.
■ StashFactory
0x000000000000A6fA31F5fC51c1640aAc76866750factory that deploys per-owner stash contracts at deterministic addresses. users call deployStash to create their stash, then upgradeStash to opt into newer implementations. also maintains a registry of valid stashes (isStash) and an allow-list of auction venues (isAuction).
// interact
▸ view functions (12 read · 12 write)
■ read functions
currentVersion() → (uint256)Index of the latest registered stash implementation.
implementations(uint256 version) → (address implementation)Implementation address for a given version index.
stashAddressFor(address stashOwner) → (address)Deterministic stash address for an owner, whether or not it has been deployed yet.
ownerHasDeployed(address owner) → (bool)Whether an owner has already deployed their Stash via this factory.
isStash(address stashAddress) → (bool)Registry check: was this address deployed by the factory?
isAuction(address auctionAddress) → (bool)Whether an address is on the factory's auction allow-list. Used by stashes to validate counterparties.
stashVerifier() → (address)Address of the off-chain verifier component the factory points stashes at.
owner() → (address result)Current contract owner (Ownable).
ownershipHandoverExpiresAt(address pendingOwner) → (uint256 result)Expiration timestamp of a pending two-step handover request (Solady Ownable).
rolesOf(address user) → (uint256 roles)Bitmask of roles held by a user.
hasAllRoles(address user, uint256 roles) → (bool)Whether a user has every role in the given bitmask.
hasAnyRole(address user, uint256 roles) → (bool)Whether a user has at least one role in the bitmask.
■ write functions
deployStash(address _owner) → (address deployedAddress)Deploy a new Stash for the given owner (CREATE2-style — predictable address via stashAddressFor).
upgradeStash()Caller-initiated: upgrade msg.sender's stash to the latest registered implementation.
addVersion(address implementation)Owner-only: register a new stash implementation as the current version.
setAuction(address auction, bool _isAuction)Owner-only: flip an address on/off the auction allow-list.
transferOwnership(address newOwner) [payable]Owner-only: hand ownership to another address.
renounceOwnership() [payable]Owner-only: drop ownership permanently (sets owner to 0x0).
requestOwnershipHandover() [payable]Caller opts into a two-step ownership handover from the current owner.
completeOwnershipHandover(address pendingOwner) [payable]Owner finalizes a previously requested handover to pendingOwner.
cancelOwnershipHandover() [payable]Caller cancels their own pending handover request.
grantRoles(address user, uint256 roles) [payable]Owner grants a role bitmask to a user (Solady OwnableRoles).
revokeRoles(address user, uint256 roles) [payable]Owner removes a role bitmask from a user.
renounceRoles(uint256 roles) [payable]Caller drops their own roles.
■ Stash
per-owner address — look yours up via the factory panel above.the per-owner contract deployed by the factory above. holds the owner's liquidity and resting orders, and accepts signed processPunkBid calls from allow-listed auctions.
// process a punk bid
signed punk bids are produced off-chain and submitted onchain by the bid's target auction (order.auction). this form helps you shape the call — paste the JSON below and verify the decoded fields before sending.
▸ view functions (7 read · 3 write)
■ read functions
owner() → (address)Current contract owner (Ownable).
version() → (uint256)Implementation version of this stash.
availableLiquidity(address tokenAddress) → (uint256 availableAmount)ETH/ERC-20 currently free for new bids on this stash, after subtracting locked balances.
getOrder(address auction) → (tuple order)Active resting order this stash exposes to a given auction (numberOfUnits, pricePerUnit, auction).
punkAccountNonce() → (uint56)Current account nonce. Bumped to invalidate every outstanding bid in one shot.
punkBidNonceUsesRemaining(uint256 punkBidNonce) → (uint256 usesRemaining)How many fills are still allowed for a given bidNonce before it's exhausted.
usedPunkBidNonces(uint256 punkBidNonce) → (bool isUsed)Whether a specific bidNonce has been fully consumed.
■ write functions
processPunkBid(tuple bid, uint256 punkIndex, bytes signature, bytes32[] proof)Auction-only: present a signed PunkBid + Merkle proof for a punk and have the stash pay for it.
cancelPunkBid(uint256 bidNonce)Owner cancels a single bid by its bidNonce.
cancelAllPunkBids()Owner bumps the account nonce, invalidating every outstanding bid at once.