Concepts

Streams

On-chain locked USDC that drips to a recipient under milestone rules.

Streams

A stream is a shared Move object that holds locked USDC for a freelancer (or any recipient). The client funds it up front. Money only flows after milestones are approved, then settles in gasless drips.

Lifecycle

LOCKED → PENDING_REVIEW → DRIPPING → DONE
              ↑               │
              └──── dispute / pause paths ──┘
StateMeaning
lockedFunded; waiting for work / first raise
pending_reviewFreelancer raised a milestone; client (or keeper) must approve
drippingAccruing; keeper (or anyone) can call drip
pausedDispute / mutual pause
doneFully paid or closed

Actors

  • Client (sender) — locks USDC, holds StreamCap, approves milestones, may cancel if revocable.
  • Freelancer (recipient) — raises completions, receives drips.
  • Keeper — permissionless worker that drips when the gasless floor accrues and auto-approves after the review window.

Yield split (v2)

create_stream_v2 accepts yieldBps: a portion of every drip can auto-route into the yield vault. The phone app often uses this; the SDK defaults to 0 (all cash) unless you set yieldBps.

Privacy modes

ModeWhat it is
Private engagement (default)Notes in a shielded pool + lazy vest — hides amount, who↔whom, and drip cadence inside the set. See Private engagements.
Amounts-onlyNamed ConfidentialStream — amounts hidden; parties and milestone timing public.
PublicClassic stream — cleartext amounts; enables borrow / yield splits.

On this page