The problem

Freelance work runs on trust, and today that trust is rented from platforms that take a big cut and can freeze funds. If the client pays up front, the client carries the risk. If the freelancer delivers first, the freelancer carries it. When the two disagree, disputes are slow or end up off-chain.

The solution

FairLance is a milestone escrow dapp (testnet only). One smart contract holds the money, milestone by milestone:

  1. Post - the client creates a project with 1-20 milestones.
  2. Fund - the client locks the full payment up front.
  3. Submit - the freelancer submits a work hash and evidence link for each milestone.
  4. Approve - the client approves and that milestone pays out instantly.
  5. Dispute - or the client opens a dispute on that one milestone. The rest of the project keeps going.

What's new: a staked jury

Disputes are settled on-chain, not by a support ticket.

  • Three jurors are picked from a staked juror pool.
  • They review the evidence and vote. The 2-of-3 majority decides the payout.
  • Majority jurors share a 1% fee. The minority juror loses 10% of their stake.
  • So honest voting is the profitable strategy.
  • People on the project can never sit on its jury.

Why it matters

  • Clients only risk the milestone in progress. Money stays in escrow until approval or a verdict.
  • Freelancers get paid as each milestone is approved, not at the very end.
  • Jurors earn for careful, honest judgment.

Demo flow

  1. Client posts a job
  2. Client funds the milestones
  3. Freelancer submits work
  4. Client opens a dispute
  5. Three jurors vote
  6. The contract pays out

Every step is a wallet-signed transaction you can check on the testnet.

How it's built

  • Solidity 0.8.24 contract built and tested with Hardhat (7 passing tests cover funding, submission, approval, dispute, voting, and settlement)
  • Next.js frontend with separate client, freelancer, and juror views plus an on-chain project/milestone inspector
  • Wallet flows set up for Sepolia and Base Sepolia testnets with test ETH

Challenges and what I learned

Juror selection was the hard part. True randomness needs something like Chainlink VRF; for the MVP I used on-chain entropy (prevrandao, timestamp, IDs), which is fine for a testnet demo but not for real funds. Designing the stake, slash, and fee incentives so that honest voting wins took the most iteration.

I learned how escrow state machines behave in adversarial cases, how to keep conflicted jurors out on-chain, and how much clear UX matters when money moves - every role needed its own view of the same contract.

What's next

  • Chainlink VRF or commit-reveal juror selection
  • Deadlines and escape hatches if someone goes inactive
  • Appeal rounds and partial awards
  • Juror reputation scores
  • Stablecoin payments and IPFS evidence uploads
  • A professional audit before any mainnet launch

The current contract is intentionally unaudited and testnet-only.

Built With

Share this project:

Updates

Submission history