How it works
barvalance is a smart-contract escrow with on-chain dispute resolution. One client, one worker, optionally a randomly-drawn jury — all coordinated on Arbitrum Sepolia. Pick your role to see the full flow end-to-end.
Client
You post jobs and pay for delivered work. Funds stay in escrow until you approve, the review window expires, or a dispute resolves.
- 1
Get test tokens
Mint mUSDC at the faucet — payment for your worker comes from there. Sepolia ETH for gas fees comes from any public faucet.
Open faucet → - 2
Create an order
Pick Simple (one delivery) or Milestone (split payment by stages). Add a title, description, attachments — they're stored on IPFS. Set a deadline and review window.
Create order → - 3
Fund the escrow
Approve and deposit the full amount. Funds sit in the escrow contract until the work is approved, ruled on, or cancelled.
- 4
Pick a worker
Workers apply through the Marketplace. In contest mode you choose from the applicant list; in first-come mode the first applicant is auto-assigned.
- 5
Review the deliverable
Worker submits via IPFS. You have a review window to either approve & release funds, or raise a dispute. Doing nothing lets the worker self-approve once the window closes.
- 6
Milestone flow (optional)
Sign an EIP-712 release approval per milestone — the worker claims the funds for that stage on-chain. Both parties can propose changes to the milestone breakdown; both must confirm.
Worker
You apply for jobs, deliver work, and claim payment. The escrow guarantees the client cannot pull out arbitrarily — only via cancel-expired (after the deadline) or via a dispute that you'll have a chance to defend.
- 1
Connect & sign in
Connect a wallet on Arbitrum Sepolia and sign the SIWE message. The session unlocks IPFS uploads — no on-chain effect.
- 2
Find a job
Browse the Marketplace, filter by token / amount / sort, and read the order metadata fetched from IPFS. Open the Applications tab to apply.
Marketplace → - 3
Apply
applyForJob commits you to the current order terms via a metaURI hash. In contest mode you wait for the client to pick. In first-come mode you become the worker immediately.
- 4
Submit work
Upload your deliverable (note + optional file) and call submitWork. The order moves to Under Review. The client has the configured review window to act.
- 5
Milestone claim
For milestone escrows: collect the client's signed release approval and call claimMilestone with the matching nonce. Repeat for each milestone.
- 6
Raise a dispute
If the client stalls past the review window (Simple), or you disagree with milestone changes, you can raise a dispute. You'll pay arbitration cost up-front; the loser pays it in the end.
Juror
You stake JSHARE to be eligible for sortition. When drawn, you vote on the dispute — honestly, because the protocol penalises bad-faith votes via the commit-reveal scheme.
- 1
Get JSHARE
Mint test JSHARE at the faucet. Stake more = higher chance of being drawn for a dispute.
Open faucet → - 2
Stake into a court
Pick the SimpleEscrow court and stake your JSHARE. The pool advances through phases (Staking → Generating → Drawing) before each draw.
Juror dashboard → - 3
Get drawn
When a dispute requests a draw and the pool reaches Drawing phase, the contract picks N jurors from stakers (probability proportional to stake).
- 4
Commit your vote
During the Commit period, send keccak256(choice, salt) on-chain. Save the salt locally — without it you cannot reveal. Missing a commit penalises your stake.
- 5
Reveal during Vote period
Reveal your hidden choice + salt. A mismatch (or no reveal) loses stake. The majority choice across drawn jurors becomes the round ruling.
- 6
Execute & get paid
After the Appeal period anyone can call executeRuling — winning jurors get rewards from the arbitration cost; the escrow settles according to the final ruling.
My draws →
Order lifecycle in one picture
Most orders never need a dispute. Here's the happy path and the appeal-able branches.
- OPENClient funded the escrow. Workers can apply. Client can cancel cheaply.
- IN_PROGRESSWorker assigned. Worker delivers. Client can cancel-expired only after the deadline passes with no submission.
- UNDER_REVIEWWorker submitted. Client must approve, dispute, or do nothing — after the review window the worker can self-approve. (Simple escrow only.)
- DISPUTEDEither side raised a dispute. Dispute moves through Evidence → Commit → Vote → Appeal → Execution. Funds are frozen.
- COMPLETED / RESOLVEDEscrow settled. Either funds were released to the worker, refunded to the client, or distributed by ruling.
- CANCELLEDCancelled while OPEN (small fee) or after deadline expired (no fee). Funds returned to the client.
Briefs & Bids (Open Brief flow)
Use this when you know what you want but not who should do it.
- Post a brief: publish a short description on IPFS with an optional budget range and target deadline. No funds are locked at this step — the brief is a request for quotes, not an escrow.
- Workers bid: proposed amount, deadline, and a cover message. Bids are private to the client (matches Upwork practice) to prevent downward-bidding races. One bid per worker per brief, withdrawable any time.
- Accept & convert: when the client picks a winner we redirect to the standard escrow creation form with all bid terms pre-filled. After the transaction is mined, the brief is archived and the bid is marked accepted.
- Auto-expiry: briefs without action expire after 14 days by default (configurable up to 30). This keeps the marketplace fresh without nagging clients.
- Moderation: brief descriptions and bid cover messages go through the same OpenAI policy check as order metadata; flagged content is bounced at submission.
Reputation
Gasless 1-5★ ratings, censorship-resistant, off-chain signatures.
- How it's built: after an order reaches a terminal state (completed, cancelled, or dispute resolved), both parties can rate each other 1-5★ with an optional public comment. The rating is an EIP-712 signature — no transaction, no gas — bound to that specific escrow.
- Bilateral blind reveal: your rating stays hidden until the counterparty also rates you, OR 14 days pass. This blocks tit-for-tat retaliation. The 14-day window is also when you can revoke your own rating.
- Score: we display a Bayesian-adjusted average (3.5★ prior, weight 10) so a single 5★ rating doesn't make a brand-new account look like a top performer. Both raw and adjusted are visible on the profile page.
- Where you see it: inline ★ chip next to every party address; full breakdown at
/profile/0x…. Worker applicants get a chip in the contest list — useful when picking from many bids. - Trust model: every rating is a verifiable signature, so the backend can hide data but never forge it. Phase 2 will add daily Merkle anchors on Arbitrum so deletions are publicly detectable.
- Jurors: we deliberately do NOT accept party→juror ratings — that would create perverse incentives ("vote my way for 5★"). Juror reputation is rendered from their on-chain coherence rate instead.
Chat
End-to-end encrypted DMs that live entirely off-chain.
- Where it is: a "Chat" tab on the order page. Visible to clients, applicants, and the assigned worker. Hidden from everyone else.
- Identity: uses XMTP, a wallet-to-wallet protocol. You sign a separate message to enable chat — independent from site sign-in. Identity keys live in your browser's IndexedDB and never leave your device.
- Privacy: messages are encrypted end-to-end — not even our servers can read them. They are not published on-chain and are never shown to jurors. If you want something from a chat to count as evidence, you must explicitly submit it through the dedicated evidence form.
- Files: attachments are uploaded to public IPFS; only the link between this conversation and the file stays private. Don't share things in chat that you would not want someone with the link to see.
- Cross-device: historical messages are tied to your local IndexedDB profile. Open the site in a new browser or clear site data and you'll re-enable chat (one signature) but past messages decrypted on the old profile won't be readable.
Open questions or stuck?
Click the small i icons next to fields and stats across the app — they open a glossary popover with a short explanation of the underlying protocol mechanic.