The first native on-chain whitelist management platform on LitVM LiteForge.
- Overview
- Problem Statement
- Solution
- Features
- Architecture
- Smart Contracts
- Technology Stack
- Installation
- Environment Variables
- Usage Guide
- Deployment
- Live Demo
- Repository Structure
- Contributing
- License
LitDucks is the first native whitelist management platform deployed on the LitVM LiteForge testnet (Chain ID: 4441).
The platform allows project creators to launch whitelist campaigns with customizable on-chain verification requirements, while users can register their wallets through a simple interface that automatically checks eligibility based on predefined criteria.
Built for the LiteForge Hackathon 2026 β Open Track.
"No more Google Forms. No more manual spreadsheets. Pure on-chain whitelist management." π¦
NFT projects and token sales on the LitVM testnet currently lack native tools to manage whitelists:
- No wallet verification β Google Forms accept anyone without proof of wallet ownership
- Sybil attacks β No way to prevent bots from filling up whitelist spots
- Manual management β Spreadsheet-based systems are error-prone and time-consuming
- No native tooling β Existing platforms (Premint, Atlas3) don't support LitVM natively
- Fragmented workflow β Creators must juggle multiple tools to run a simple WL campaign
LitDucks provides a decentralized, on-chain whitelist management system where:
- Project creators launch campaigns with configurable on-chain requirements
- Users register directly with their connected wallets
- All registrations are stored on-chain for full transparency
- Verification happens automatically through smart contracts and blockchain data
- Winners are selected on-chain via FCFS or provably fair Raffle
| Feature | Description |
|---|---|
| Campaign Creation | Name, description, banner image, social links |
| Slot Management | Up to 100 slots free, unlimited with Pro tier |
| Selection Modes | FCFS (First-Come-First-Served) or Raffle |
| Requirements | Minimum tx count, wallet age, token/NFT holding |
| Dashboard | Real-time registration monitoring |
| CSV Export | Download all registered wallets as CSV |
| Merkle Root | Generate Merkle root for gas-efficient minting |
| Feature | Description |
|---|---|
| Browse Campaigns | Explore all active WL campaigns |
| Filter & Search | Filter by status, mode, and project name |
| Auto Verification | System checks wallet eligibility automatically |
| One-Click Register | Register via connected wallet |
| Profile Page | Track all whitelist registrations |
| Winner Status | Check raffle results on-chain |
| Feature | Description |
|---|---|
| On-Chain Verification | All checks via blockchain data, no off-chain API |
| Anti-Sybil | Combine multiple requirements for max protection |
| IPFS Support | Decentralized banner image storage |
| Responsive Design | Works on desktop and mobile |
| LiteForge Native | Built specifically for Chain ID 4441 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LitDucksFactory.sol β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β createCampaign() β deploys new LitDucksCampaign β β
β β getAllCampaigns() β registry of all campaigns β β
β β getCreatorCampaigns(address) β per-creator index β β
β β getFeaturedCampaigns() β featured list β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β deploys
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LitDucksCampaign.sol (per campaign) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β register() β on-chain registration β β
β β getRegistrants() β all registered wallets β β
β β runRaffle(bytes32) β random winner selection β β
β β setMerkleRoot(bytes32) β set winner merkle root β β
β β getParams() β campaign configuration β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Creator LitDucks Frontend LiteForge Blockchain
β β β
β βββ Fill campaign form βββββ>β β
β β βββ deploy via Factory βββββββ>β
β <βββ campaign address βββββββββββ’
<βββ campaign live! βββββββββββ£ β
β β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
User β β
β β β
β βββ browse explore βββββββββ>β β
β β βββ read campaigns βββββββββββ>β
β <βββ on-chain data ββββββββββββββ’
<βββ campaign list ββββββββββββ£ β
β βββ click register βββββββββ>β β
β β βββ check requirements βββββββ>β
β <βββ eligible βββββββββββββββββββ’
β βββ confirm tx βββββββββββββ>β β
β β βββ register() βββββββββββββββ>β
β <βββ tx confirmed βββββββββββββββ’
<βββ registered! ββββββββββββββ£ β
User connects wallet
β
βΌ
Check: wallet has min X transactions? ββββ No βββΆ Show requirement not met
β Yes
βΌ
Check: wallet age β₯ X days? ββββββββββββββββ No βββΆ Show requirement not met
β Yes
βΌ
Check: holds required token/NFT? βββββββββββ No βββΆ Show requirement not met
(if set)β Yes / not required
βΌ
Show "Register for Whitelist" button β
Address: 0xdDC8255958463A7BF7dC19657800201a1f8a00B6
Network: LitVM LiteForge Testnet (Chain ID: 4441)
Explorer: View on LiteForge Explorer
Key Functions:
// Deploy a new campaign
function createCampaign(
string memory _name,
string memory _description,
string memory _bannerImage,
string memory _twitter,
string memory _discord,
string memory _website,
uint256 _totalSlots,
uint256 _deadline,
uint8 _selectionMode, // 0 = FCFS, 1 = Raffle
uint256 _minTransactions,
uint256 _minWalletAgeDays,
address _requiredToken,
uint8 _tokenType, // 0 = none, 1 = ERC721, 2 = ERC20
uint256 _minTokenBalance,
uint256 _tokenId,
bool _isPro,
bool _isFeatured
) external payable returns (address campaignAddress)
// View all campaigns
function getAllCampaigns() external view returns (address[] memory)
function getCreatorCampaigns(address creator) external view returns (address[] memory)
function getCampaignsCount() external view returns (uint256)Per-campaign contract deployed by the factory.
Key Functions:
// Register wallet to whitelist
function register() external
// Run raffle (creator only, after deadline)
function runRaffle() external onlyCreator
// View functions
function getParams() external view returns (...)
function getRegistrants() external view returns (address[] memory)
function getWinners() external view returns (address[] memory)
function isRegistered(address user) external view returns (bool)
function isWinner(address user) external view returns (bool)
function isActive() external view returns (bool)
function slotsRemaining() external view returns (uint256)
function registrantCount() external view returns (uint256)CampaignInfo Struct:
struct CampaignInfo {
string name;
string description;
string bannerImage; // IPFS CID or URL
string twitter;
string discord;
string website;
uint256 totalSlots;
uint256 deadline; // Unix timestamp
uint8 selectionMode; // 0 = FCFS, 1 = Raffle
uint256 minTransactions; // min tx count on LiteForge
uint256 minWalletAgeDays; // min wallet age in days
address requiredToken; // 0x0 = none
uint8 tokenType; // 0=none, 1=ERC721, 2=ERC20
uint256 minTokenBalance;
uint256 tokenId;
bool isPro;
bool isFeatured;
address creatorAddress;
uint256 createdAt;
}| Layer | Technology | Version |
|---|---|---|
| Frontend | React | 18.3.1 |
| Language | TypeScript | 5.6.3 |
| Build Tool | Vite | 5.4.10 |
| Styling | TailwindCSS | 3.4.14 |
| Web3 Library | Wagmi + Viem | 2.12.7 + 2.21.0 |
| State Management | Zustand | 4.5.5 |
| Routing | React Router DOM | 6.26.2 |
| Animations | Framer Motion | 11.12.0 |
| Icons | Lucide React | 0.460.0 |
| Date Utils | date-fns | 3.6.0 |
| Smart Contracts | Solidity | 0.8.20 |
| Blockchain | LitVM LiteForge | Chain ID: 4441 |
| Deployment | Vercel | β |
- Node.js v18 or v20 (not v24 β incompatible with Vite 5)
- npm package manager
- MetaMask or any EVM-compatible wallet
- zkLTC from faucet for gas
# Clone repository
git clone https://github.com/ffffffffhugfadil/litducks.git
cd litducks
# Install dependencies
npm install
# Start development server
npm run devOpen http://localhost:5173 in your browser.
npm run build
npm run preview| Field | Value |
|---|---|
| Network Name | LitVM LiteForge |
| RPC URL | https://liteforge.rpc.caldera.xyz/http |
| Chain ID | 4441 |
| Currency Symbol | zkLTC |
| Block Explorer | https://liteforge.explorer.caldera.xyz |
Create a .env file in the root directory:
# LiteForge Testnet (Chain ID: 4441)
VITE_FACTORY_ADDRESS=0xdDC8255958463A7BF7dC19657800201a1f8a00B6
VITE_RPC_URL=https://liteforge.rpc.caldera.xyz/http
# Optional: Pinata IPFS for banner image uploads
VITE_PINATA_JWT=your_pinata_jwt_token_here| Variable | Description | Required |
|---|---|---|
VITE_FACTORY_ADDRESS |
Deployed factory contract address | β |
VITE_RPC_URL |
LiteForge RPC endpoint | β |
VITE_PINATA_JWT |
Pinata JWT for IPFS uploads | Optional |
Step 1 β Connect Wallet
Connect MetaMask β Switch to LiteForge (Chain ID: 4441) β Get zkLTC from faucet
Step 2 β Create Campaign
/create β Fill info β Set requirements β Deploy
Campaign Configuration:
Name : Your project name
Description : What users need to know
Banner Image : IPFS CID or HTTP URL (optional)
Total Slots : β€100 = Free Tier | >100 = Pro Tier
Deadline : Unix timestamp (future date)
Selection Mode : 0 = FCFS | 1 = Raffle
Min Tx Count : Minimum transactions on LiteForge
Min Wallet Age : Minimum wallet age in days
Required Token : Token/NFT contract address (optional)
Step 3 β Share & Monitor
Share campaign link β Monitor via /dashboard β Export CSV/Merkle root
Step 1 β Browse β /explore
Step 2 β Connect Wallet β MetaMask on LiteForge testnet
Step 3 β Check Requirements β System auto-verifies your wallet
Step 4 β Register β Click register β Confirm transaction
Step 5 β Track β View registrations at /profile
# 1. Push to GitHub
git add .
git commit -m "ready for deployment"
git push origin main
# 2. Connect to Vercel at vercel.com/new
# 3. Add environment variables
# 4. DeployVercel Environment Variables:
| Key | Value |
|---|---|
VITE_FACTORY_ADDRESS |
0xdDC8255958463A7BF7dC19657800201a1f8a00B6 |
VITE_RPC_URL |
https://liteforge.rpc.caldera.xyz/http |
vercel.json (already included):
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": "vite",
"installCommand": "npm install"
}.nvmrc (already included):
20.17.0
| Link | URL |
|---|---|
| Live App | https://litducks.xyz |
| Documentation | https://litducks.xyz/docs |
| Explore Campaigns | https://litducks.xyz/explore |
| Create Campaign | https://litducks.xyz/create |
| Factory Contract | https://liteforge.explorer.caldera.xyz/address/0xdDC8255958463A7BF7dC19657800201a1f8a00B6 |
| GitHub | https://github.com/ffffffffhugfadil/litducks |
| https://x.com/litducksnft |
litducks/
βββ public/
β βββ duck-icon.svg # App favicon/logo
β βββ favicon.svg # Website favicon
βββ src/
β βββ components/
β β βββ campaigns/
β β β βββ CampaignCard.tsx
β β β βββ SkeletonCard.tsx # Loading state skeleton for campaigns
β β βββ create/
β β β βββ Step1.tsx # Basic campaign info form
β β β βββ Step2.tsx # WL slots & deadline settings
β β β βββ Step3.tsx # Requirements configuration
β β β βββ Step4.tsx # Campaign review & deployment
β β βββ layout/
β β β βββ Navbar.tsx # Top navigation bar
β β β βββ Footer.tsx # Footer with links
β β βββ ui/
β β β βββ FactoryAddressInput.tsx
β β βββ wallet/
β β βββ ConnectButton.tsx # Wallet connection button
β β βββ NetworkBadge.tsx # Network status indicator
β β βββ NetworkGuard.tsx # Network validation wrapper
β βββ config/
β β βββ contracts.ts # Contract addresses & ABIs
β βββ hooks/
β β βββ useCampaign.ts # Campaign data & operations
β β βββ useCreatorCampaigns.ts # Creator-specific campaigns data
β β βββ useFactory.ts # Factory contract interactions
β β βββ useNetworkGuard.ts # Network validation hook
β β βββ useRequirements.ts # Requirement verification logic
β βββ lib/
β β βββ blockscout.ts # Blockscout explorer integrations
β β βββ chain.ts # Chain configuration
β β βββ merkle.ts # Merkle Tree generation for whitelists
β β βββ wagmi.ts # Wagmi client setup
β βββ pages/
β β βββ Home.tsx # Landing page
β β βββ Create.tsx # Campaign creation wizard
β β βββ Explore.tsx # Browse all campaigns
β β βββ Campaign.tsx # Single campaign detail
β β βββ Dashboard.tsx # Creator management panel
β β βββ Analytics.tsx # Campaign performance analytics data
β β βββ Profile.tsx # User whitelist history
β β βββ docs/
β β βββ Overview.tsx # Documentation Overview & Guide
β βββ store/
β β βββ useCampaignStore.ts # Zustand store for campaign state
β β βββ useWalletStore.ts # Zustand store for wallet state
β βββ types/
β β βββ index.ts # TypeScript type definitions
β βββ utils/
β β βββ ipfs.ts # IPFS gateway helper
β βββ App.tsx # Main app component
β βββ main.tsx # Entry point
β βββ router.tsx # React Router configuration
β βββ index.css # Global styles (Tailwind)
βββ contracts/
β βββ LitDucksFactory.sol # Factory contract
β βββ LitDucksCampaign.sol # Individual campaign contract
βββ dist/ # Production build output (Generated)
βββ node_modules/ # Installed npm packages (Ignored)
βββ vercel.json # Vercel deployment config
βββ package.json # Dependencies & scripts
βββ package-lock.json # Locked dependencies
βββ tsconfig.json # TypeScript configuration
βββ tsconfig.node.json # TypeScript Node config
βββ vite.config.ts # Vite build configuration
βββ tailwind.config.js # Tailwind CSS configuration
βββ postcss.config.js # PostCSS configuration
βββ index.html # HTML entry point
βββ README.md # Project documentation
| Field | Value |
|---|---|
| Event | LiteForge Hackathon 2026 |
| Track | Open Track |
| Team | @litducksnft |
| Live App | https://litducks.xyz |
| GitHub | https://github.com/ffffffffhugfadil/litducks |
Why LitDucks fits "Hard Money Web3 alignment":
- Built natively on LitVM LiteForge testnet
- Serves the ecosystem β every LitVM project needs WL management
- No centralized database β all data lives on-chain
- Contributes real utility to the Litecoin ecosystem
- First of its kind on LitVM β no competing solution exists
This project was built for the LiteForge Hackathon.
For questions, feedback, or bug reports:
- Twitter: @litducksnft
- LVC Discord:
#liteforge-hackathonchannel - GitHub Issues: Open an issue
MIT License β see LICENSE for details.
- LiteForge Hackathon organizers and judges
- LitVM team for building the testnet infrastructure
- @circle_crypto (LitecoinVM Co-founder) for guidance
- @LitecoinVM for supporting builders in the ecosystem
- Dappit for AI-powered no-code development tools
- Caldera for RPC and explorer infrastructure
Built with π¦ for the LiteForge Hackathon 2026
LitVM LiteForge Testnet | Chain ID: 4441 | zkLTC