every ethereum contract this site reads or writes, with the exact abi surface in use. addresses are mainnet.

CryptoPunksMarket

0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB

the 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

0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2

onchain 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

0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6

the 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

0x000000000000003607fce1aC9e043a86675C5C2F

the 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

0x000000000000A6fA31F5fC51c1640aAc76866750

factory 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

connect a wallet to deploy your own stash.
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.

connect a wallet to submit the call.
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.