Demo 03 · Bboard pattern

Move Board · post a dance move

This demo calls an already-deployed Midnight contract. No fresh deploy per visitor — you only pay the (much smaller) callTx DUST cost. Contract pattern mirrors midnightntwrk/example-bboard: post a move as the current occupant with a private-author ZK commitment; only that same author can take() to clear it.

Hitting DustWallet.balance() = 0 even though Lace shows DUST? That's the confirmed Preprod sync bug — see known issues → Lace shows DUST but SDK reports 0. Because this demo skips the deploy fee, it needs less DUST than the ledger demo.
Get testnet DUST ↗
Deployed contract · Midnight Preprod Testnet

Not yet deployed on Midnight Preprod Testnet. From your local checkout:

compact compile contracts/MoveBoard.compact contracts/managed/move-board
cp -r contracts/managed/move-board/keys public/keys/move-board
cp -r contracts/managed/move-board/zkir public/zkir/move-board
MIDNIGHT_CONTRACT=move-board VITE_NETWORK_ID=preprod \
  bun scripts/deploy-midnight.mjs

The script writes the resulting address into src/data/moveboard-contract.preprod.json. From then on, every visitor calls this same contract.

Live board state · read-only via Indexer

Waiting for a pinned deploy on Midnight Preprod Testnet.

Post a move · connect Lace

Connect Lace on Midnight Preprod Testnet, enter a dance move, and submit a post(label) callTx. Proving runs in your local Docker proof server (30–120s); the balance + submit steps come out of your Lace-visible DUST.

The Lace-signed callTx wiring lives in src/lib/use-midnight-wallet.ts (shared with the ledger demo). Because the contract is pinned, only post() and take() callTx paths are exercised here — no deployContract DUST spike.

Lace connect + submit UI: wired via the shared wallet hook · see /showcase/midnight-ledger for the same connect pattern