Raise a dispute
After redemption, if the goods aren't what was promised, the buyer has a dispute window to raise a dispute. The exchange transitions to DISPUTED and the dispute state machine takes over.
await (await sdk.raiseDispute(exchangeId)).wait()Mutual resolution
The simplest path is mutual: buyer and seller agree on a buyerPercent (0–100) of the escrow that goes to the buyer. Both sign an EIP-712 typed-data envelope; whichever submits the tx attaches both sigs.
See Recipes → Mutual dispute resolution for the full flow.
Escalation
If mutual resolution doesn't happen within the resolution window, the buyer can escalate. The dispute resolver then decides binding buyerPercent, takes their fee, and the exchange terminates.
await sdk.escalateDispute(exchangeId)Retracting
The buyer can retract at any time before resolution / escalation. The exchange terminates with the seller getting everything (price + deposit).
await sdk.retractDispute(exchangeId)Common gotchas
- The dispute window starts at redemption. Not at commit. Watch
disputeDurationon the offer. - Mutual sigs require both EIP-712 typed-data signatures to match. Use the SDK / MCP helpers; don't hand-build.
- You can't dispute a non-redeemed exchange. Use cancel instead.