Chain Labs

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.

A Simplr Events event page on QIE testnet: three ticket tiers, VIP, GA and Standing, each with its price in QIE, the tickets left and a quantity picker.

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

ContractsSolidity and OpenZeppelin, tested with Foundry
Resale ticketsERC-721 behind upgradeable UUPS proxies
QIE ticketsERC-1155 tiers with ERC-2981 royalties, deployed as EIP-1167 clones
Listings and redemptionEIP-712 signatures
Ticket encryption add-onLit Protocol
PaymentsUSDC on Arbitrum One and Base, QIE on QIE
IndexingPonder
AppsNext.js with wagmi and viem