Trustless Escrow
for Web3
Secure milestone-based contracts with decentralized verification, transparent funding, and built-in dispute resolution.
Why Choose ChainSteps?
A decentralized escrow protocol built for trustless collaboration between clients and freelancers.
Non-Custodial Escrow
Funds are locked in the smart contract at 0x7b2D...9021, not held by any intermediary. The contract enforces release rules — no one can freeze or redirect your escrow.
Milestone-Based Payments
Break work into sequential milestones. Each requires explicit approval via approveMilestone(). If the client goes silent, claimMilestone() auto-releases funds after 7 days.
Arbitrated Dispute Resolution
When milestones are contested, a designated arbitrator resolves disputes with an on-chain percentage split via resolveDispute(). Both parties receive their share transparently.
IPFS Evidence Storage
Submit work proofs and deliverables to IPFS for tamper-resistant, decentralized storage linked to each milestone. Evidence persists independent of any single server.
Reentrancy-Protected
All value-transfer functions use OpenZeppelin's ReentrancyGuard. Built on Solidity 0.8.28 with native overflow protection. No unaudited external dependencies.
Role-Based Access Control
Contract-enforced roles: only the client can fund and approve, only the freelancer can submit and claim. State transitions are guarded by inState modifiers.
How It Works
Four simple steps from agreement to payment, secured by smart contracts.
Create & Define
Client calls createEscrow() with the freelancer's address and an arbitrator, then adds milestones via addMilestone() with descriptions and ETH amounts.
Fund & Activate
Client sends ETH to fundEscrow(). The contract verifies the total matches all milestone amounts, then activates the escrow. Funds are locked until milestone rules are met.
Submit Work
Freelancer completes deliverables and calls completeMilestone(). A 7-day approval countdown starts. Evidence can be uploaded to IPFS for verification.
Approve & Release
Client reviews and calls approveMilestone() to release ETH to the freelancer. If the client is unresponsive, the freelancer claims via claimMilestone() after timeout.
Create & Define
Client calls createEscrow() with the freelancer's address and an arbitrator, then adds milestones via addMilestone() with descriptions and ETH amounts.
Fund & Activate
Client sends ETH to fundEscrow(). The contract verifies the total matches all milestone amounts, then activates the escrow. Funds are locked until milestone rules are met.
Submit Work
Freelancer completes deliverables and calls completeMilestone(). A 7-day approval countdown starts. Evidence can be uploaded to IPFS for verification.
Approve & Release
Client reviews and calls approveMilestone() to release ETH to the freelancer. If the client is unresponsive, the freelancer claims via claimMilestone() after timeout.
Trust & Transparency
Real metrics from the ChainSteps protocol on Ethereum Sepolia.
Total Value Locked
Secured across all active escrows on Sepolia
Total Escrows
Escrow contracts deployed since inception
Milestone Completion
Of milestones completed and approved on-chain
Completed Escrows
Fully settled with all milestones released