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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 1

    Get JSHARE

    Mint test JSHARE at the faucet. Stake more = higher chance of being drawn for a dispute.

    Open faucet
  2. 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. 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. 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. 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. 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.

  1. OPENClient funded the escrow. Workers can apply. Client can cancel cheaply.
  2. IN_PROGRESSWorker assigned. Worker delivers. Client can cancel-expired only after the deadline passes with no submission.
  3. UNDER_REVIEWWorker submitted. Client must approve, dispute, or do nothing — after the review window the worker can self-approve. (Simple escrow only.)
  4. DISPUTEDEither side raised a dispute. Dispute moves through Evidence → Commit → Vote → Appeal → Execution. Funds are frozen.
  5. COMPLETED / RESOLVEDEscrow settled. Either funds were released to the worker, refunded to the client, or distributed by ruling.
  6. 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.

barvalance

On-chain escrow with reputation, briefs, and dispute resolution. Currently running on Arbitrum Sepolia testnet.

Network
Arbitrum Sepolia
Testnet build — no real funds at risk.
© 2026 barvalance · PoC build