Back to Projects
Mintix — NFT ticketing on Solana

Mintix — NFT Ticketing

Blockchain / Web3
Context
Final Thesis Project
Chain
Solana + Anchor
Role
Full-stack + Smart Contract

NFT tickets on Solana

Each ticket is minted as an SPL token (decimals 0, supply 1) via an Anchor program — a true, unique on-chain asset.

One-time QR check-in

The use_ticket instruction flips an on-chain used flag, so a scanned ticket can't be reused — verified against the blockchain.

Verifiable ownership

Ownership lives on-chain against the buyer's wallet. A UseTicket constraint enforces that only the ticket owner can redeem it.

Secondary market

Tickets can be listed for resale with full transfer history and previous-owner tracking, guarded by a unique seat-per-concert index.

Project Overview

Mintix is a Web3 concert-ticketing platform built as my final thesis, tackling a real problem in event ticketing: fraud, duplicate tickets, and untraceable resale. Each ticket is minted as an NFT on the Solana blockchain through a custom Anchor smart contract, giving every ticket verifiable, tamper-proof ownership. Attendees connect a Phantom wallet, hold their ticket as a real on-chain asset, and check in via a QR code that can only be redeemed once. Organizers manage concerts through an approval workflow, and a secondary market lets tickets be resold with a full, auditable transfer history.

6
On-chain instructions
SPL NFT
Ticket standard
Solana
Network
Final Thesis
Type

On-chain Program

The concert_nft_tickets Anchor program exposes six instructions. Minting issues an SPL token with decimals 0 and supply 1 — the on-chain definition of a non-fungible ticket. Redemption, authority, and sold-out rules are all enforced on-chain.

initialize_concert()

Create a concert with name, venue, date, and total ticket supply.

initialize_mint()

Set up the SPL mint (decimals 0) and token account for an NFT ticket.

create_ticket()

Mint one NFT ticket, enforce sold-out limits with checked math, and store ticket data.

use_ticket()

Redeem a ticket once — sets the on-chain used flag; owner-only via constraint.

update_concert()

Edit concert details; owner or global admin only, can't shrink below tickets sold.

delete_concert()

Close a concert account and reclaim rent; owner or global admin only.

Technical Implementation

Smart contract. Written in Rust with the Anchor framework (0.28). Uses anchor-spl to mint NFT tickets, checked arithmetic to guard against overflow, and account constraints so only a ticket's owner can redeem it and only a concert's authority (or global admin) can edit or delete it.

Frontend. React with the Solana Wallet Adapter (including mobile wallet adapter) for Phantom connectivity, @solana/web3.js for transactions, qrcode.react for ticket QR codes, and Socket.io for realtime updates.

Backend. Express 5 API backed by MongoDB via Mongoose, with JWT + bcrypt authentication. Models cover the concert approval workflow, ticket lifecycle, and a secondary market — a unique seat-per-concert index prevents duplicate seats, and full transaction history tracks every mint, transfer, and resale.

Technologies Used

smart contract

RustAnchor 0.28anchor-spl (SPL Token)Solana Program

frontend

React 18Solana Wallet Adapter@solana/web3.jsqrcode.reactTailwind CSS

backend

Node.jsExpress 5MongoDB (Mongoose)JWT + bcryptSocket.io

infra

DockerPhantom WalletMobile Wallet Adapternode-cron

Key Features Shipped

NFT ticket minting as SPL tokens (decimals 0, supply 1) on Solana
One-time redemption enforced by an on-chain used flag
Owner-only ticket redemption via Anchor account constraints
Sold-out protection with checked (overflow-safe) arithmetic
Phantom wallet + mobile wallet adapter integration
QR-code tickets generated with qrcode.react
Concert approval workflow (pending / approved / rejected)
Secondary market: resale listing, transfer & previous-owner history
Unique seat-per-concert index to prevent duplicate seats
Realtime updates over Socket.io, JWT + bcrypt auth backend