Ticketing contracts that escrow a resale and check tickets at the gate
Simplr Events is our own ticketing product. We built its contracts on Arbitrum One, Base and QIE. First came a resale market that holds the buyer's payment until they confirm the ticket. Then came signed QR codes, so a ticket can't be used twice.
- Client
- Chain Labs' own product, supported by an Arbitrum grant
- Service
- Blockchain
- When
- July 2024 to December 2025
- Team
- Mihir, Pratham Chudasama, Angel Lakra
- Status
- Live
The problem
An NFT ticket on chain settles who holds the ticket. Resale is still unsafe to buy, because three questions stay open. A buyer needs to know the ticket is real before paying. The seller needs to be paid without the buyer having to trust them. The person at the gate needs to turn away a ticket that has already been used.
What we built
We designed the contracts, wired them into the apps and built the indexer. The indexer turns what happens on chain into the records the apps read. This case covers the last two generations of the product's contracts. The first is a resale market on Arbitrum One and Base. The second is a full ticketing protocol on the QIE blockchain.
The first contracts were a resale market for tickets bought elsewhere. A seller mints a digital twin of their ticket: an NFT holding a hash of the ticket's serial number and the seat. Each event plugs in its own check that the seller holds the original. For an event whose tickets are already NFTs, the check confirms the seller's signature and that the seller's wallet owns the original ticket.
Sellers list by signing the price off chain, so listing costs them no gas. A purchase never pays the seller directly. The marketplace takes the buyer's USDC and pays the organizer's fee. It then moves the ticket and the seller's share into an escrow. The buyer releases the escrow once the ticket checks out. Either side can raise a dispute instead, and an admin settles the dispute to one of them.
That admin is the tradeoff. Whether a real-world ticket was valid is a judgment no contract can make. We gave that call to a person and kept both the money and the ticket locked until the admin makes it. The cost is that buyers and sellers rely on Simplr's admin to settle a dispute fairly.
In December 2025 we rewrote the contracts for QIE and widened them from resale to the whole ticket. An event now sells tiers on chain, each with its own price and supply.
Because the event itself issues the tickets, a resale no longer has to prove anything. We dropped the escrow from this marketplace. The marketplace pays the seller directly and pays the organizer a royalty on every resale.
Admission became its own protocol. The holder's app signs a redemption message with a deadline and a nonce, a number the contract accepts once per holder. The app shows the message as a QR code. A gatekeeper's scanner checks the deadline, reads the holder's balance and the tier in one batched call, and submits the message. The contract uses up the nonce, burns one ticket and mints an access pass. The access pass contract blocks any transfer for 24 hours after mint, so the pass stays with the person who walked in. At the gate, a signed QR code can't be used twice. A copy of an already scanned QR code fails, because its nonce is spent.
What was hard
We also built encryption for the twin's private ticket data with Lit Protocol, so only the holder could read the data. Encrypting each ticket was slow and cost too much per ticket. We made encryption an add-on that an event organizer can switch on. The apps leave the add-on off by default.
The factory deploys a separate contract for each event, so the apps can't work from a fixed list of addresses. Our Ponder indexer registers each new event contract as the factory announces it. From then on, the indexer keeps the records the apps query, from each ticket and listing to running totals of sales and disputes.
A listing carries a deadline, and nothing happens on chain when the deadline passes. The indexer runs on a block interval and marks expired listings itself. The apps then stop showing tickets that can no longer be bought.
The result
The contracts are deployed on Arbitrum One, Base and QIE mainnet. The Devcon deployment ran on Arbitrum One. Arbitrum awarded Simplr Events a $25k grant to build the product.
Built with
| Contracts | Solidity and OpenZeppelin, tested with Foundry |
|---|---|
| Resale tickets | ERC-721 behind upgradeable UUPS proxies |
| QIE tickets | ERC-1155 tiers with ERC-2981 royalties, deployed as EIP-1167 clones |
| Listings and redemption | EIP-712 signatures |
| Ticket encryption add-on | Lit Protocol |
| Payments | USDC on Arbitrum One and Base, QIE on QIE |
| Indexing | Ponder |
| Apps | Next.js with wagmi and viem |