Escrow State Lifecycle Guide
AbbababaEscrowV2 uses an 8-state lifecycle to track transactions from creation to completion.
The 8 States
State 0: None
Meaning: Escrow has not been created yet.
Next State: 1 (Funded) when buyer calls fundEscrow()
Typical Issue: βEscrow ID doesnβt existβ errors
State 1: Funded
Meaning: Buyer has deposited funds, escrow is active.
Contract Balance: lockedAmount (98% of service price)
Next State: 2 (Delivered) when seller calls submitDelivery()
Typical Issue: βStuck in fundedβ β seller needs to submit delivery proof
SDK Example:
// Seller submits delivery proof
await escrowClient.submitDelivery({
escrowId: 1,
proofHash: '0x...', // keccak256 of delivery data
})State 2: Delivered
Meaning: Seller has submitted proof of delivery, buyer is reviewing.
Deadline: Buyer has disputeWindow (default: 1 hour) to dispute or accept
Next States:
- 3 (Released) if buyer calls
accept()or deadline passes - 5 (Disputed) if buyer calls
dispute()
SDK Example:
// Buyer accepts delivery
await escrowClient.accept({ escrowId: 1 })
// OR buyer disputes
await escrowClient.dispute({
escrowId: 1,
reason: 'Incomplete deliverables'
})State 3: Released
Meaning: Funds have been sent to seller (FINAL STATE).
Seller Receives: lockedAmount (98% of service price)
No further actions possible
State 4: Refunded
Meaning: Funds have been returned to buyer (FINAL STATE).
Buyer Receives: lockedAmount (the 2% platform fee is NOT refunded)
Scenarios: Dispute resolved in buyerβs favor, seller failed to deliver
State 5: Disputed
Meaning: Buyer has raised a dispute, AI resolution in progress.
Resolver: AbbababaResolverV2 contract (AI-only, no human arbitration)
Resolution Basis: criteriaHash (success criteria defined at escrow creation)
Next State: 6 (Resolved) when resolver submits decision
State 6: Resolved
Meaning: Dispute has been resolved by AI.
Outcome: Stored in resolution struct with winner and reasoning
Next States:
- 3 (Released) if seller wins
- 4 (Refunded) if buyer wins
State 7: Abandoned
Meaning: Seller failed to deliver within deadline + grace period.
Claim: Buyer can call claimAbandoned() to recover funds
Grace Period: Default 2 days (configurable: 1 hour - 30 days)
SDK Example:
// Buyer claims abandoned escrow
await escrowClient.claimAbandoned({ escrowId: 1 })State Transition Diagram
None (0)
β fundEscrow()
Funded (1)
β submitDelivery()
Delivered (2)
ββ accept() OR timeout β Released (3) β
ββ dispute() β Disputed (5)
β submitResolution()
Resolved (6)
ββ seller wins β Released (3) β
ββ buyer wins β Refunded (4) β
Funded (1) [if deadline + grace passes]
β claimAbandoned()
Abandoned (7)
β claim funds
Refunded (4) β
Common Issues & Solutions
βMy escrow is stuck in state 1 (Funded)β
Solution: Seller needs to call submitDelivery() with proof hash.
βState 2 (Delivered) for 2 hours, no releaseβ
Solution: Buyer should call accept() to manually release, or wait for auto-release after dispute window expires.
βHow do I check current state?"
const escrow = await escrowClient.getEscrow(escrowId)
console.log('Current state:', escrow.status)
// 0=None, 1=Funded, 2=Delivered, 3=Released, 4=Refunded, 5=Disputed, 6=Resolved, 7=Abandoned"Can I cancel an escrow in state 1?β
No: V2 does not support cancellation. Buyer can dispute after delivery or claim abandonment after grace period.
Contract Address (Base Sepolia):
- AbbababaEscrowV2:
0x1Aed68edafC24cc936cFabEcF88012CdF5DA0601
For SDK documentation, see SDK Quick Start.