The world's first anonymous e-fencing platform for the Louvre Heist hackathon
After the infamous Louvre heist where thieves stole 8 pieces of the French Crown Jewels, selling them becomes the challenge. The Shadow Mint is a creative solution combining:
- Dual Portal System: Separate admin and thief portals with isolated views
- Anonymous Tor-style Auction Platform: Secure, invite-only marketplace
- NFT "Bragging Rights": 3D scan the jewel, destroy the original, mint as NFT
- Crypto Mixer Smart Contract: Untraceable payments through blockchain tumbling
The Shadow Mint now features two separate portals:
- See EVERYTHING - All auctions from all thieves
- Generate invite links for new thieves
- Manage the platform holistically
- Access: http://localhost:3000/admin
- Isolated view - Each thief sees ONLY their own auctions
- Login with username/password (invite-only registration)
- Create and manage their own listings
- Access: http://localhost:3000/thief/login
- NEW: Invite links work across different computers!
- Generate link โ Email to thief โ They register on their computer
- Works on same WiFi network (no extra setup needed)
- See QUICK_EMAIL_SETUP.md for 5-minute setup
- For remote users (different networks), see NETWORK_ACCESS_GUIDE.md
See DUAL_PORTAL_GUIDE.md for complete documentation.
This is a hackathon project for educational purposes only. It demonstrates blockchain technology, encryption, and privacy concepts. No actual illegal activity is endorsed or supported.
- Encryption: AES-256-GCM for sensitive data
- Database: SQLite with encrypted fields
- Anonymous Authentication: Session-based with no PII
- API Routes: Auctions, NFT minting, crypto mixing
- BraggingRightsNFT: ERC-721 NFTs with destruction proofs
- CryptoMixer: Conceptual tumbler with pooling and fee structure
- Network: Ethereum Sepolia Testnet
- Dark Tor-themed UI: Hacker-style interface
- Pages: Home, Auctions, Mint NFT, Crypto Mixer
- Real-time Updates: Auction bidding and mixer tracking
- Node.js 18+
- npm or yarn
# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm install
# Install smart contract dependencies (optional)
cd ../contracts
npm installOption 1: Run everything at once
# From project root
npm install # Install concurrently
npm run devOption 2: Run individually
Terminal 1 - Backend:
cd backend
npm run devTerminal 2 - Frontend:
cd frontend
npm run devAccess the app at: http://localhost:3000
Louvreheist/
โโโ backend/ # Node.js API server
โ โโโ config/ # Database configuration
โ โโโ routes/ # API endpoints
โ โ โโโ auction.js # Auction CRUD
โ โ โโโ mixer.js # Crypto mixing
โ โ โโโ nft.js # NFT minting
โ โ โโโ user.js # Anonymous auth
โ โโโ utils/ # Encryption utilities
โ โโโ server.js # Express app
โโโ contracts/ # Solidity smart contracts
โ โโโ contracts/
โ โ โโโ BraggingRightsNFT.sol
โ โ โโโ CryptoMixer.sol
โ โโโ scripts/ # Deployment scripts
โ โโโ test/ # Contract tests
โโโ frontend/ # React application
โโโ src/
โโโ pages/ # Main pages
โ โโโ Home.jsx
โ โโโ Auctions.jsx
โ โโโ MintNFT.jsx
โ โโโ Mixer.jsx
โโโ styles/ # Dark theme CSS
- Create and browse auction listings
- Place encrypted bids
- Automatic price updates
- Seller anonymity protection
- Mint 1-of-1 NFTs from 3D scans
- Cryptographic destruction proofs
- On-chain metadata storage
- Sepolia testnet deployment
- Bitcoin/Ethereum/Monero support (mock)
- Address encryption (AES-256-GCM)
- Transaction pooling simulation
- 2% mixing fee
- Status tracking
- End-to-end encryption
- Anonymous session IDs
- No personal data collection
- Tor-compatible design
cd contracts
npx hardhat test
npx hardhat compile- Get Sepolia testnet ETH from a faucet
- Update
.envwith your Infura key and private key - Deploy:
cd contracts
npx hardhat run scripts/deploy.js --network sepolia- Copy contract addresses to
backend/.env
The application includes mock data for demonstration:
- Sample crown jewel auctions
- NFT metadata examples
- Mixer transaction simulations
POST /api/user/anonymous- Create anonymous sessionGET /api/user/:anonymousId- Get user info
GET /api/auction/active- List active auctionsPOST /api/auction/create- Create auction
GET /api/escrow/status/:auctionIdโ Poll item/purchase stateGET /api/escrow/pendingโ (hardware) fetch purchase keys waiting to be loadedPOST /api/escrow/device/confirmโ (hardware) confirm a successful token match
The Louvre-Random Arduino sketch now caches both the item redemption key and the later purchase key so it can act as the final arbiter. The web stack orchestrates that process with in-memory escrow records:
- Seller creates auction โ backend generates an
itemKey, stores it off-chain, and the bridge pushesITEM:<auctionId>:<itemKey>to the Arduino until it replies withOK_ITEM:<auctionId>. - Buyer wins & pays โ
/api/transaction/createlogs the payment and issues a 32-bytepurchaseKey. - Hardware bridge calls both
/api/escrow/item-pendingand/api/escrow/pending, pushingITEM:(if required) andADD:<auctionId>:<purchaseKey>commands to the Arduino and waiting forOK_ITEM/OK_ADDacknowledgements. - Arduino match โ once the buyer enters the correct purchase key, the firmware emits
OK_RELEASE:<auctionId>:<purchaseKey>:<itemKey>, the bridge POSTs/api/escrow/device/confirm, and the site surfaces the item key to the buyer/seller dashboards.
cd backend
npm install # also installs serialport/axios if not already present
ESCROW_SERIAL_PORT=COM5 \
ESCROW_API_BASE=http://localhost:5000 \
ESCROW_DEVICE_SECRET=shadow-escrow-dev \
node utils/escrowBridge.jsEnvironment variables:
| Variable | Description | Default |
|---|---|---|
ESCROW_SERIAL_PORT |
Serial device path (e.g., COM5, /dev/ttyACM0) |
/dev/ttyACM0 |
ESCROW_SERIAL_BAUD |
Baud rate for the Arduino | 115200 |
ESCROW_API_BASE |
HTTP URL for the Express backend | http://localhost:5000 |
ESCROW_DEVICE_SECRET |
Shared secret required by the /api/escrow/* device endpoints |
shadow-escrow-dev |
ESCROW_POLL_MS |
Polling cadence for pending purchases | 4000 |
Once the bridge is up, the Buyer portal automatically transitions to a Vault Release screen after payment and displays the redeemable itemKey the moment the hardware reports success.
POST /api/auction/bid- Place bidGET /api/auction/:id- Get auction detailsGET /api/auction/:id/bids- Get bids
POST /api/nft/mint- Mint NFTGET /api/nft/:tokenId- Get NFT metadata
POST /api/mixer/mix- Submit mix transactionGET /api/mixer/status/:txId- Check statusGET /api/mixer/stats- Get mixer statistics
- Backend: Node.js, Express, better-sqlite3
- Frontend: React 18, Vite, React Router
- Blockchain: Solidity, Hardhat, Ethers.js
- Encryption: Node.js crypto (AES-256-GCM)
- Styling: Custom CSS (Tor dark theme)
โ Prevent: Destroy originals, only NFTs remain โ Solve: Blockchain tracking (for demo purposes) โ Commit: Full e-fencing pipeline with anonymity โ Creativity: NFT "Bragging Rights" concept โ Innovation: Crypto mixer smart contract
- Real Tor hidden service deployment
- IPFS integration for 3D scans
- ZK-SNARK privacy proofs
- Multi-signature escrow
- Decentralized identity (DIDs)
MIT License - Educational purposes only
Built for the Louvre Heist Hackathon 2025
Remember: This is a creative hackathon project exploring security and blockchain concepts. Always use technology ethically and legally.