Where we are, honestly.
Pre-audit · v1 · Use with amounts you can afford to lose
OTCVault is live on Arbitrum One with real funds and has not yet been audited by an external firm. We would rather say that plainly than imply otherwise.

Done
- 97 Foundry tests
Unit, fuzz, invariant and Arbitrum fork tests against the real Sablier Lockup v4. Core invariant: escrow balance ≥ sum of deposits for OPEN and FUNDED deals; settled deals deliver exactly stable − fee and exactly the asset amount.
- Slither static analysis
0 High. 1 Medium (strict-equality sentinel in the registry) triaged as false positive; 1 Low reentrancy note accepted — state is SETTLED before any external call and confirm is nonReentrant.
- Verified source
All five contracts verified on Arbiscan. No proxies.
- Minimal admin surface
Owner can set the fee (≤1%), the rail for future deals, manage whitelist and registry (48h timelock on additions), sweep earned fees. Cannot move escrowed deposits.
- Deposit measurement
Every deposit is measured balanceAfter − balanceBefore and reverts on shortfall, so fee-on-transfer tokens fail loudly.
Not yet
- External audit
Scheduled before the per-deal cap is lifted. Until then, treat the protocol as beta.
- Multisig ownership
The owner is currently a single key. Transfer to a multisig is planned before audit.
- Bug bounty
To follow the audit.
Contracts · Arbitrum One
- DeOTCEscrow0x909Dab616CF39d00BeDb8Eae6d3Ab96D54AfA2B7Deals, fund, confirm, settle, cancel, refund. ReentrancyGuard, SafeERC20, Ownable2Step.
- TokenWhitelist0x443CC5b294054D057Fc30cAb45Fcaad0982664daAllowlist of tradeable non-stable tokens; paid listing requests.
- StableRegistry0x7c1b6dd8B4f31b09A5fbd13694395dE576Ec38B3USDC / USDT registry. 48h timelock on additions; instant removal.
- SablierRail0xc924a8b3B785ddf5aFb22bF33432Dc43b4242f19Stateless adapter → Sablier Lockup v4 createWithDurationsLL, cancelable = false.
- FeeVault0xFF27e5EdD20ef6254D388aA21F66222daE9CFacDHolds protocol + listing fees. Owner sweep only.
What the owner can and cannot do
Can
- Set the fee for future deals — never above 1.00%.
- Set the vesting rail for future deals (existing deals keep theirs).
- Approve / revoke whitelisted tokens.
- Propose (48h) / execute / remove registry stablecoins.
- Sweep earned fees from the FeeVault.
Cannot
- Move, pause or freeze any escrowed deposit.
- Change the terms, fee or schedule of an existing deal.
- Upgrade any contract — there are no proxies.
- Cancel or redirect a Sablier stream once created.
- Recover tokens sent directly to the escrow (by design).
Dependencies
OpenZeppelin Contracts 5 (Ownable2Step, ReentrancyGuard, SafeERC20) · Sablier Lockup v4 (non-upgradeable, audited by multiple firms since 2019). Sablier Lockup v4 on Arbitrum: 0xD103…9C33.
Found something? Email security@playmarket.xyz. A formal bug bounty follows the audit.