chainwork:~$escrow --status funded
The money is
alreadylocked
Freelance work where the client funds every milestone in USDC before you start, into a contract neither side controls. Each approval releases one milestone. If the client goes quiet, the timeout pays you anyway.
- held by
- the contract
- currency
- usdc on base
- release unit
- one milestone
Three transactions, and nobody has to trust anybody
The sequence is fixed by the contract, so the same rules apply to every job on the marketplace.
createJob()client funds the whole job
Every milestone amount moves into the escrow contract at creation. An open job here is proof of funds, not an intention.
submitMilestone()freelancer delivers a chunk
The deliverable is hashed on-chain and linked off-chain. Submitting starts the client's approval window.
approveMilestone()approval releases payment
The freelancer is credited, the fee splits to the treasury, and the money waits in a balance only they can withdraw.
Open orders
in escrow0usdcacross 0 jobs
No jobs posted yet. Be the first — the escrow is waiting.
Both sides give up the same thing: the ability to cheat
freelancer terms
- funds verified before line oneThe locked figure on a job is the contract's balance. Anyone can read it.
- a deadline on the client's silenceAfter the approval window, claimTimeout releases the milestone to you.
- payment you pull yourselfReleased funds sit in your balance until you withdraw. No payout schedule.
client terms
- released in chunks, never up frontEach milestone is approved on its own. Unreleased amounts stay in escrow.
- a dispute path with a decisionDispute before the window closes; an arbiter releases or refunds that milestone.
- a clean exit while openCancel before assigning anyone and the contract refunds the full amount.
The questions that decide whether you trust this
Post a job, or take one that is already funded
Connect a wallet to start. Posting takes two transactions: approve the USDC, then create the job.