Essential session storage is required to sign in. Optional analytics remain off unless you allow them.
Build a complete decentralized app on a testnet: a smart contract with real logic (e.g. a simple escrow, a voting contract, or an on-chain guestbook) plus a frontend that connects a wallet (MetaMask), READS state via a provider/RPC (free calls), and WRITES via signed transactions. Use ethers.js or viem and handle the async tx lifecycle (pending -> confirmed) and errors (rejected signature, reverted tx). Emit and display contract EVENTS. Clearly separate read (call) from write (transaction) in the UI. Tested and deployed to a testnet.
Sound contract logic with require/revert and emitted events; tested; deployed to a testnet.
Wallet connect + signing works; reads are free calls, writes are signed gas txs; the dApp never handles the private key.
Handles the pending->confirmed lifecycle and failure cases (rejected/reverted) gracefully; events surfaced in the UI.
Clean read/write separation; documented setup; testnet-only and no leaked secrets.
Use this README structure to make the work reviewable.
DevPath fetches a read-only, size-capped snapshot. Submitted code is never executed.
# A full dApp: contract + wallet-connected frontend ## Goal Build a complete decentralized app on a testnet: a smart contract with real logic (e.g. a simple escrow, a voting contract, or an on-chain guestbook) plus a frontend that connects a wallet (MetaMask), READS state via a provider/RPC (free calls), and WRITES via signed transactions. Use ethers.js or viem and handle the async tx lifecycle (pending -> confirmed) and errors (rejected signature, reverted tx). Emit and display contract EVENTS. Clearly separate read (call) from write (transaction) in the UI. Tested and deployed to a testnet. ## Acceptance criteria - [ ] Contract + events: Sound contract logic with require/revert and emitted events; tested; deployed to a testnet. - [ ] Wallet integration: Wallet connect + signing works; reads are free calls, writes are signed gas txs; the dApp never handles the private key. - [ ] Tx UX: Handles the pending->confirmed lifecycle and failure cases (rejected/reverted) gracefully; events surfaced in the UI. - [ ] Quality: Clean read/write separation; documented setup; testnet-only and no leaked secrets. ## Verification - [ ] Document installation and run commands. - [ ] Record automated checks and their exact commands. - [ ] Add representative output, screenshots, or a short demo where useful. - [ ] Confirm failure paths and known constraints. ## Decision log ### Decision title - Context: - Choice: - Alternatives considered: - Tradeoffs: ## Evidence - Link each rubric criterion to the file, test, or artifact that demonstrates it. ## Known limitations - List what is intentionally out of scope and what should be improved next.