OONCHAIN
POAPS
DOCUMENTATION

Using Onchain POAPs

Instructions for event organizers and developers. This deployment uses Base Sepolia and test ETH; it is not Base mainnet.

01

Creating a POAP

Connect a wallet on Base Sepolia and open Create. Add a name and raw SVG file, then choose whether the token is soulbound and whether public minting starts open. Description, location, event date, URL, and allowlist are optional. The name is limited to 128 bytes, the description to 512, and the location and URL to 128 each.

Registration calls registerEvent(name, description, eventDate, location, allowlistRoot, svg, externalUrl, flags). The flags record whether transfers and public minting are enabled. Event details cannot be edited after registration.

02

Metadata & SVG

The contract Base64-encodes the raw SVG and stores it with SSTORE2. Its ERC-1155 uri(id) returns an onchain Base64 JSON document containing the artwork, description, date, location, creator, event ID, CAIP-2 ID, and soulbound status.

Use a square viewBox, avoid remote fonts/images/scripts, convert text to paths when exact typography matters, and optimize with SVGOMG. Smaller SVGs cost less gas.

03

Soulbound vs transferable

Soulbound POAPs cannot move between wallets after minting. Transferable POAPs can be sent to another wallet. This setting cannot be changed after registration.

04

Distribution methods

Public mint

When open, any wallet can call mint. Creators can open or close it during the first 30 days; public minting itself has no automatic expiry.

Allowlist mint

The allowlist tool converts a wallet list into a Merkle root and a proof for each wallet. The creator can save a non-zero root once during the first 30 days. Each attendee uses their proof with allowlistMint. The builder uses keccak256(abi.encodePacked(address)) leaves and sorted pairs, matching the contract's OpenZeppelin verification.

Signed pass

The creator signs the packed hash of (eventId, chainId, recipient). The contract applies Ethereum’s signed-message prefix and recovers the creator. Each pass is valid for one wallet and expires 37 days after registration.

Creator drop

During the first 30 days, creators may mint directly to batches of at most 101 recipients. Already-claimed wallets are skipped.

05

Live-event QR workflow

Collect the attendee's wallet address, generate its signed mint from the event settings page, and show or send the resulting QR code. The QR opens the event page with the signature included. Generate a separate code for each recipient because each signature is bound to one wallet.

To print one QR code that anyone can scan, enable public minting and link directly to the event page. Use allowlist proofs for a pre-registered attendee list.

06

Permissions & deadlines

  • One claim per event per wallet across every mint route.
  • Creator: set allowlist once, toggle public status, and creator-mint during days 0–30.
  • Signed mint: available through day 37.
  • Public and allowlist mint: no contract expiry.
  • Soulbound and all metadata: immutable.

The contract boundary uses createdAt + window < block.timestamp, so actions are allowed exactly at the deadline timestamp.

07

Verify a mint

After the transaction confirms, open it on BaseScan or view the token on OpenSea. Gallery checks balanceOf(wallet, eventId) directly. You can also inspect the verified contract, call uri(id), and decode the Base64 JSON.