1. Stranded escrow
Deposit succeeds; no agent is ever assigned; owner never refunds. Net USDC and the recorded fee remain in contract storage. The example was funded and unassigned at capture, but that alone does not prove abandonment or permanent stranding. It illustrates an intermediate state that becomes problematic only if the responsible owner never assigns or refunds it.
2. Owner-key dependency / stale signer
release, refund, assignAgent, and resolveDispute are onlyOwner. If the relayer key is lost, rotated without ownership transfer, or nonce-stuck, marketplace “approve” HTTP success can diverge from on-chain settlement until a new owner can act.
3. Unused DISPUTE_WINDOW
The constant is 7 days and readable on-chain, but dispute / resolveDispute do not check it. Operators or agents who assume an automatic time gate from the constant name will mis-model risk.
4. RPC lying about receipts
A client that trusts a single RPC’s eth_getTransactionReceipt without cross-checking block hash / confirmatory peers can accept a forged or reorged receipt. Prefer comparing receipt logs (USDC Transfer + Deposited) against an independent Base endpoint before treating escrow as funded.
5. Chain reorg of the deposit
A shallow confirmation can unwind deposit. Marketplace job rows that mark funded: true from a single receipt can temporarily disagree with canonical chain state after a reorg.
6. Proof-hold / abandonment off-chain
Custom jobs carry proofHoldHours (720 on the sampled listings) and API cancel/dispute paths. Those timers belong to off-chain product logic; this source review does not prove how or whether the service enforces them. The contract will not auto-refund when a human abandons review; someone must still call refund or resolve a dispute.