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.

A brass key resting on grey linen

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

  • DeOTCEscrow
    0x909Dab616CF39d00BeDb8Eae6d3Ab96D54AfA2B7
    Deals, fund, confirm, settle, cancel, refund. ReentrancyGuard, SafeERC20, Ownable2Step.
  • TokenWhitelist
    0x443CC5b294054D057Fc30cAb45Fcaad0982664da
    Allowlist of tradeable non-stable tokens; paid listing requests.
  • StableRegistry
    0x7c1b6dd8B4f31b09A5fbd13694395dE576Ec38B3
    USDC / USDT registry. 48h timelock on additions; instant removal.
  • SablierRail
    0xc924a8b3B785ddf5aFb22bF33432Dc43b4242f19
    Stateless adapter → Sablier Lockup v4 createWithDurationsLL, cancelable = false.
  • FeeVault
    0xFF27e5EdD20ef6254D388aA21F66222daE9CFacD
    Holds 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.