Paint your mark on Bitcoin. Forever. On-chain.
SatoshiArt is a decentralized shared pixel canvas on Bitcoin Layer 1 via OP_NET.
Users pay satoshis to choose a color and paint one pixel on a global 64Γ64 canvas.
Every pixel, every painter, every block β stored permanently on-chain. No bridges. No EVM.
- 64Γ64 canvas = 4,096 pixels of permanent Bitcoin history
- Pay sats β get color β paint forever
- Color rarity system β Common / Rare / Legendary
- Live leaderboard of top painters
- Activity feed showing real-time canvas evolution
- Zero centralization β all state lives on Bitcoin L1
| Tier | Colors | Cost | Examples |
|---|---|---|---|
| Common | 8 | 1,000 sats | Snow, Void, Crimson, Ocean... |
| Rare | 5 | 5,000 sats | Bullion, Cyan Storm, Hot Pink... |
| Legendary | 3 | 25,000 sats | Satoshi (orange), Neon Pulse, Diamond |
cd SatoshiArt
npm install
npm run dev
# β http://localhost:3001Frontend works in demo mode without a deployed contract.
Canvas state is stored in localStorage during demo.
SatoshiArt/
βββ src/
β βββ App.jsx # Root layout (left/center/right panels)
β βββ main.jsx # React entry point
β βββ index.css # Tailwind + custom utilities
β βββ data/colors.js # 16-color palette + tier definitions
β βββ hooks/
β β βββ useWallet.js # OP_NET wallet connection hook
β β βββ useCanvas.js # Canvas state, paint logic, leaderboard
β βββ services/
β β βββ contractService.js # OP_NET SDK integration (ESM)
β βββ components/
β βββ Header.jsx # Logo, wallet button, stats badge
β βββ Canvas.jsx # HTML5 Canvas with zoom/pan
β βββ ColorPicker.jsx # Tiered color grid + paint button
β βββ StatsBar.jsx # Total paints, treasury, artists
β βββ Leaderboard.jsx # Top painters ranking
β βββ ActivityFeed.jsx # Real-time paint event feed
β βββ Toast.jsx # Notification system
βββ contracts/
β βββ src/art/
β β βββ SatoshiArtContract.ts # AssemblyScript smart contract
β β βββ index.ts # Entry point + abort handler
β βββ asconfig.json # Build config (opnet-transform required)
β βββ package.json # Contract dependencies
β βββ deploy.ts # Deployment script (tsx)
β βββ .env.example # Mnemonic + RPC config template
βββ index.html # App entry + contract address config
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
βββ README.md
Write:
| Method | Args | Cost | Description |
|---|---|---|---|
paintPixel |
pixelIndex: u16, colorId: u8 |
color fee in sats | Paint one pixel |
View:
| Method | Returns | Description |
|---|---|---|
getPixelColor(index) |
colorId: u256 |
Color at pixel (0 = unpainted) |
getPixelPainter(index) |
painter: u256 |
Last painter address |
getPixelBlock(index) |
blockNum: u256 |
Block when painted |
getTotalPaints() |
u256 |
Global paint count |
getTreasury() |
u256 |
Total fees collected (sats) |
getPaintFeeCommon() |
u256 |
1,000 sats |
getPaintFeeRare() |
u256 |
5,000 sats |
getPaintFeeLegendary() |
u256 |
25,000 sats |
SatoshiArt Contract: window.SATOSHI_ART_CONTRACT
To use with a deployed contract, set the contract address in your environment:
window.SATOSHI_ART_CONTRACT = 'your-contract-address-here';Current Status: Demo mode (no contract deployed)
cd SatoshiArt
npm install
npm run dev
# β http://localhost:3001Frontend works in demo mode without a deployed contract.
Canvas state is stored in localStorage during demo.
cd contracts
npm installcp .env.example .env
# Edit .env β set MNEMONIC to your deployer wallet seednpm run build
# β build/SatoshiArt.wasmnpm run deploy:ts
# Outputs: Contract address: opt1xxxxx...In index.html, set:
window.SATOSHI_ART_CONTRACT = 'opt1your-contract-address-here';Connect OP_NET Wallet
β
Browse 16-color palette (Common / Rare / Legendary)
β
Click pixel on 64Γ64 canvas
β
Click "Paint Pixel Β· X sats"
β
OP_NET transaction signed in wallet
β
Pixel color stored forever on Bitcoin L1
β
Canvas updates Β· Leaderboard updates Β· Activity feed logs
- 64Γ64 canvas with color tiers
- OP_NET wallet + demo mode
- Smart contract (paintPixel + view methods)
- Leaderboard + activity feed
- Zoom & pan
- Vault contract for collected fees
- Reward distribution to active painters
- Pixel = NFT-like asset (OP_20 token per coordinate)
- History replay / timeline
- Pixel ownership certificates
- Twitter card preview per pixel
- Mobile-optimized touch canvas
- Integration with BlockForge modules
- Staking rewards for rare color holders
- DAO voting on canvas rules
- Anti-spam: each paint costs real sats (on-chain payment verification)
- Anti-double-spend: OP_NET transaction model prevents replay
- No centralized DB: all pixel state lives in contract storage
- Failed TX: UI detects revert and shows error, canvas not updated
Bitcoin has ~21M coins. SatoshiArt has 4,096 pixels.
Each one is a permanent mark on the world's most secure ledger.
Paint your name in Bitcoin history.
MIT β build on top of it, fork it, remix it.
Built on OP_NET Β· Bitcoin Layer 1 Β· No bridges Β· No EVM