A decentralized event ticketing and competition management platform built on Sui blockchain with Walrus storage integration.
- NFT Ticketing: Mint tickets as NFTs stored in Sui Kiosk with dynamic metadata
- Competition Mode: Organize competitions with prize pool distribution and ranking system
- QR Check-in: Secure check-in system using Walrus-encrypted QR codes with wallet signatures
- Real-time Updates: Auto-updating UI with React Query for ticket sales and event status
- Dynamic NFTs: Tickets evolve based on status (Pending → Verified → Certified with medals)
- Prize Distribution: Automated prize pool management with on-chain verification
- Anti-Fraud: Wallet signature verification + one ticket per address restriction
- Node.js 18+ and pnpm
- Sui Wallet (Enoki or Sui Wallet extension)
- Walrus CLI (optional, for testing storage)
# Clone the repository
git clone https://github.com/CHAAIISE/eventum.git
cd eventum
# Install dependencies
pnpm install
# Set up environment variables
cp .env.example .env.local
# Edit .env.local with your API keys (see Configuration section)
# Run the development server
pnpm devOpen http://localhost:3000 to see the application.
Create a .env.local file with:
# Enoki Authentication (for Sui wallet integration)
NEXT_PUBLIC_ENOKI_API_KEY=your_enoki_api_key
NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id
# Sui Network Configuration
NEXT_PUBLIC_SUI_NETWORK=testnet
# Contract Addresses (auto-configured in src/lib/contracts.ts)
NEXT_PUBLIC_PACKAGE_ID=0x446b40a4f7b4c9869b9a6879e775da55c030da8f040daa140261bc83f301dce6eventum/
├── move/ # Sui Move smart contracts
│ └── sources/
│ └── eventum.move # Main contract with Event, Ticket, and Prize logic
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── event/[id]/ # Event detail page with ticket purchase
│ │ ├── my-events/ # User's tickets dashboard
│ │ ├── manage/ # Organizer dashboard (create events)
│ │ └── scan/ # QR code scanner for check-in
│ ├── components/
│ │ └── event/
│ │ └── BuyTicketButton.tsx # Ticket purchase with Kiosk integration
│ ├── features/
│ │ └── ticket-qr/ # QR code generation and signing
│ ├── lib/
│ │ ├── contracts.ts # Contract addresses and constants
│ │ └── walrusClient.ts # Walrus SDK configuration
│ └── app/qr-utils/ # QR code utilities (sign, scan, verify)
└── README.md
- Browse Events: Visit homepage to see featured events
- Buy Ticket: Click on an event → "Mint Ticket" → Confirm wallet transaction
- View Tickets: Go to "My Events" to see all your tickets
- Check-in: Present QR code at event entrance for verification
- Claim Certification: After event ends, claim your participation NFT (or medal if ranked)
-
Create Event:
- Go to
/manage - Fill event details (title, description, date, price, supply)
- Set prize distribution if it's a competition
- Upload asset URLs for badges/medals
- Go to
-
Manage Event:
- Enable check-in when event starts
- Add tickets to whitelist for check-in authorization
- Set rankings for competitions
- Distribute prizes to winners
- End event and allow certification claims
-
Withdraw Funds:
- After prizes are distributed (or if no prizes)
- Withdraw ticket sales revenue
- Go to
/scanpage - Grant camera permission
- Scan attendee QR codes
- System verifies wallet signature + ticket ownership
- Auto check-in if valid
buy_ticket_into_kiosk()- Purchase ticket and store in Kioskself_checkin()- Check-in with whitelisted ticketclaim_certification()- Claim participation NFT after event endsdeposit_prize_pool()- Anyone can contribute to prize pool
create_event()- Create new event with Publisheradd_to_whitelist()- Authorize tickets for check-intoggle_checkin()- Enable/disable check-inset_final_rankings()- Assign ranks to participantsdistribute_prizes()- Lock prize distribution and allocate fundsend_event_without_prizes()- End non-competition eventswithdraw_funds()- Withdraw ticket sales after event
- Frontend: Next.js 14 (App Router), TypeScript, TailwindCSS
- Blockchain: Sui Move, @mysten/dapp-kit, @mysten/kiosk
- Storage: Walrus (decentralized blob storage)
- State Management: React Query (@tanstack/react-query)
- Authentication: Enoki (zkLogin)
- QR Codes: html5-qrcode, qrcode library
cd move
sui client publish --gas-budget 100000000Update PACKAGE_ID in src/lib/contracts.ts with deployed address.
# Move contract tests
cd move
sui move test
# Frontend tests
pnpm testpnpm build
pnpm startTickets are stored in Sui Kiosk (marketplace-ready NFT container) instead of direct transfer. This enables:
- Future secondary market trading
- Royalty enforcement on resales
- Better NFT management
Tickets have evolving metadata:
- Status 0: Pending (after purchase)
- Status 1: Verified (after check-in)
- Status 2: Certified (after event, with medal if ranked)
QR codes contain encrypted proofs stored on Walrus:
{
"w": "blob_id_on_walrus",
"t": "ticket_nft_id"
}The proof includes wallet signature + timestamp for anti-replay protection.
- Walrus Sync Delay: After QR generation, wait 30s before scanning (aggregator sync time)
- Multiple Kiosks: Users with 8+ Kiosks may experience slower ticket loading
- Testnet Stability: Walrus testnet may have downtime affecting QR verification
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Test thoroughly (especially smart contract changes)
- Submit a pull request
MIT License - see LICENSE file for details
For issues or questions:
- Open a GitHub issue
- Join our Discord (coming soon)
Built with care for the Sui ecosystem