★ Deploy to testnet
Once the local deploy works, the same spec goes to the public testnet with one command. The difference is fees: testnet has no prefunded accounts, so real Fee Juice has to come from L1 (Sepolia).
Point an L1 funder key at the script and deploy. The deployer pays from its own Fee Juice, bridging from L1 when its balance runs low:
export L1_FUNDER_KEY=0x... # a funded Sepolia key
npm run deploy:testnetThe framework's fee policy auto-tops-up the deployer from L1, then deploys the voting contract and registers a fully-private PrivateFeeJuice FPC — the contract that pays for visitors' votes. Its address and deterministic salt are written to packages/app/src/deployments/testnet.json, so the frontend can rebuild and register the private instance itself (there's nothing published on-chain to fetch).
Set L1_FUNDER_KEY to a funded Sepolia key and run npm run deploy:testnet. Explain how this differs from the local deploy: why Fee Juice must be bridged from L1, what the fee policy's threshold and top-up amounts do, and what the fully-private PrivateFeeJuice FPC is for — open scripts/deploy.ts at the fpc step to show me.
Funding a vote from L1#
Unlike local (where the SponsoredFPC just pays), a testnet visitor's first vote needs Fee Juice bridged to the FPC. The app's bridge widget does this: it discovers an L1 wallet (EIP-6963), switches it to Sepolia, and runs the portal's mint → approve → deposit, then waits for the L1→L2 message before casting the vote.