
ProofFlow is a milestone escrow for freelance work on Monad Testnet. A freelancer creates an agreement naming a client, an amount and a target date. The client funds it with native MON. The freelancer submits a delivery reference; the client either requests a revision (an uncapped loop) or approves, which releases payment in the same transaction. Unfunded agreements can be cancelled. Testnet only. Contract: Solidity 0.8.28 + OpenZeppelin, source verified: https://monadvision.com/address/0x9213960773664CE0C9916B2600a9d05638Ac9852 Frontend: Next.js 16, TypeScript, Tailwind 4, wagmi 3, viem 2. HOW IT WORKS Six on-chain states, every transition an event, so both parties read the same history and neither can rewrite it afterward. Nothing in the UI is hardcoded — refresh the page and state rebuilds from contract reads and event logs, never from React state. Approval pushes payment to the freelancer; if the push fails the amount is credited for withdrawal rather than reverting the approval. WHAT I LEARNED The hardest bug was infrastructure, not Solidity. Monad's public RPC caps eth_getLogs at a 100-block range. My timeline scanner floored its chunks at 500, so every query failed the range check and every agreement silently fell back to a degraded timeline. The fix scans newest-first in <=100-block windows, exits once the creation event appears, and caps total lookback. Green checks are also not proof of shipping. Clean build, 134 passing tests, and the deploy still served a 404 — Vercel was publishing the wrong directory. Later the live header read "Connect Injected", because server rendering runs before EIP-6963 wallet discovery names anything. Neither reproduced locally; both were caught only by inspecting what was actually deployed. Mostly, though: building this made me realise how much friction I had just accepted as normal. If I'd had something like this when I started freelancing, a lot of awkward conversations would have been a link instead.
讨论
还没有评论,快来分享你的看法吧。