how it works
Every deal lives in its own smart contract. We never hold your funds. The on-chain state machine has six terminal states (Released, Refunded, Resolved, Expired) plus the working states (None, Funded, Disputed).
1. Create
Buyer signs in, links their Tron wallet, and creates a deal: counterparty address, amount, inspection period (1–30 days), description. The backend stores the deal record and returns the arguments for a single on-chain call: factory.createEscrow. Buyer signs that → a new escrow clone is deployed (~5 TRX of bandwidth/energy).
2. Fund
Buyer signs two transactions: USDT.approve(escrow, amount) and escrow.fund(). The USDT moves from buyer to escrow. The inspection timer starts. The seller is emailed (if they provided an address).
3a. Happy path: buyer releases
Seller delivers (off-chain). Buyer clicks Approve Release. Contract transfers amount − 1% fee to seller, 1% to fee recipient. Status: Released.
3b. Seller refunds
If the seller can't deliver, they click Refund Buyer. Contract returns the full amount to the buyer (no fee). Status: Refunded.
3c. Inspection elapses without action
If the inspection period ends and the buyer hasn't released OR disputed, the seller can click Claim After Inspection. Same payout as Released. Status: Expired.
4. Dispute
Either party can dispute BEFORE the inspection ends. Both parties write up their case in the app; the on-chain contract is just frozen at Disputed.
5. Arbitration → 24h appeal window
The operator reviews and publishes a decision: who gets paid, and how much. This kicks off a 24-hour window during which:
- Either party can click Accept Decision. If both accept, the on-chain release fires immediately.
- Either party can Appeal the decision (max 2 appeals per dispute). Operator reviews and either corrects the decision (new payee/amount) or confirms it. In both cases a fresh 24h window starts.
- If the window expires with no appeal, the on-chain release fires automatically.
The on-chain call is escrow.resolve(payee, toPayee) signed by the operator/arbitrator key. The fee is deducted from the payee's portion; the remainder (if any) goes to the other party with no fee.
Status after execution: Resolved.
What we don't control
Once a deal is funded, the smart contract owns the USDT. We can't move it. Even the arbitrator can only call resolve() after a dispute is open — the call is gated by the contract's state machine.
Tether freezes: Tether (the issuer of USDT-TRC20) can freeze any address at any time, including escrow contracts. This is outside our control. Read the Terms of Service for the risk allocation.