⚒️Escrow Design
We don’t hold your money—we hold the logic.
Trustless Work escrows are role-based. It is important to understand the roles to be able to correctly configure the escrows. Updates to the contract status have to be signed by addresses, and only the addresses which have a role assigned can perfom the functions that only that role can sign.
Roles
Every escrow includes a roles object. These are the available roles:
Service Provider → Can update milestone status, can raise a dispute.
Approver → validates milestone completion, can raise a dispute.
Platform Address → can make changes before escrow is funded. Is the platform fee receiver (optional configurable %fee)
Release Signer → executes funds release.
Dispute Resolver → arbitrates when things go wrong, can re-route funds if dispute is raised.
Receiver → final destination of funds.
Other roles which play no role:
Issuer: has no powers over the contract.
Depositor: Every incoming transaction to the escrow is indexed. But depositors play no role.
Observer (coming in next version): Addreses that want to be observe a escrow. They play no role, but are indexed as an observer, which facilitates tracking of escrows by role.
Roles in Trustless WorkEscrow structure
But Roles are only the beginning, here are more properties you should know about:
Escrow ID: On-chain identifier of the contract. Deposit Address. We call it like this, but it is we also reference to it as Contract Address.
Engagement ID → configurable string, Is meant to be used to connect the escrow with an invoice number or an external secuencer. Facilitates indexation.
Title → configurable string, Title of the contract.
Roles → who marks, approves, releases, resolves, and receives
Description → why the escrow exists
Milestones → Action that must be completed to unlock funds
Amount & Fees → how much is locked, how much the platform earns
Platform Fee → optional, how much the platform (marketplace, app, etc) earns
Trustline → which asset is used (USDC, or any Stellar-issued token)
Flags → state indicators (disputed, released, resolved)
Two Escrow Types
We currently support two escrow types:
Single-Release Escrow Multiple milestones, one payout. Useful for deposits, one-off jobs, or simple deliveries.
Multi-Release Escrow Multiple milestones, multiple payouts (one per milestone). Perfect for projects, grants, or milestone-based funding.
More iterations are coming as we learn from your requirements! Feel free to reach out!
Escrow TypesLifecycle Integration
We constantly talk about the escrow lifecycle, which follows this path.
Initiation → define schema
Funding → lock assets via trustline
Milestone updates → service provider adds progress
Approvals → approver signs off
Release → release signer triggers transfer
(Optional) Dispute & Resolution
🚀 Next Steps
Define Escrow Properties
Choose Your Escrow Type
Assign Roles
Follow the Lifecycle
Then: Test it in our dApp Integrate Trustless Work into your platform Try out our Vibe-Coding Guide Use our escrow-blocks
Last updated
Was this helpful?