Protocol / Listing lifecycle

Listing lifecycle

Every state, every transition, every timer.

Every listing is a small on-chain state machine. Transitions are permissioned and each escrow pays out or refunds exactly once. A listing always carries a kind, a platform and a title; the handle is optional — a service or a credit bundle may have none.

StateMeaningWho can act
ActiveListed, buyableanyone buys or boosts / seller edits or delists
InEscrowBuyer paid, awaiting the handoverseller delivers or cancels / buyer refunds after the delivery window
DeliveredAccount handed over, in reviewbuyer confirms or disputes / seller claims after the review window, or cancels
SoldPaid out in USDGbuyer may rate the seller once, with an optional written review
DelistedHidden by the sellerseller may relist

Timers and caps

RuleValueProtects
Delivery window (refund)3 days after paymentthe buyer: refundPurchase() refunds them if the seller never delivers
Review window (auto-release)3 days after deliverythe seller: claimPayment() pays them if the buyer is silent
Dispute freezeuntil the platform resolvesthe buyer: a raised dispute blocks the seller's auto-claim
Fee ceiling10% hard cap in codeeveryone: the owner can never set a fee above it

Disputes

While a listing is Delivered, the buyer can call raiseDispute(id, reason)— wrong credentials, a recovered account, anything broken about the handover. This freezes the seller's auto-claim. The platform then calls resolveDispute(id, releaseToSeller): either the escrow is released to the seller, or the buyer is refunded and the listing returns to the market. The buyer can always end a dispute themselves by confirming receipt.