Why “linear plus cliff” is not enough
A founder grant, a payroll run, a milestone-based grant program, and a pre-paid retainer are all streamed payments. They share almost no schedule shape:- Founder grants have a cliff and a long linear tail.
- Payroll runs on fixed monthly cadence with no early access.
- Milestone grants release in discrete tranches when a deliverable lands.
- Retainers stream a flat amount every period and refill on demand.
The seven shapes
1. Linear vesting
Continuous unlock betweenstartTime and endTime. The recipient can claim any vested portion at any time. Useful for investor schedules and standard contributor vesting once past the cliff.
2. Linear vesting with a cliff
Same shape as linear, with acliffTimestamp before which no claims are valid. The standard founder-grant pattern.
3. Hybrid
Splits into two phases. An upfront unlock athybridUnlockTimestamp releases a configured percentage. The remainder vests linearly through endTime. Right shape for “half on signing, half over the year” arrangements that keep showing up in compensation negotiations.
4. Recurring (fixed cadence)
A set amount unlocks every interval. No interpolation between intervals. Either a payment is due or it is not. Maps cleanly to payroll, subscriptions, and retainers.5. Recurring (refillable)
Open-ended recurring streams without a hardendTime. The sender can refill at any time to extend runway. Useful for ongoing engagements where the end is “until further notice.”
6. Milestone (step)
Discrete steps at fixed intervals. The recipient gets a step’s worth at a time, never a partial step. Used for staged grants and quarterly compensation reviews.7. Bounded tranches
Up to eight named unlock points with explicit(timestamp, cumulativeAmount) pairs. Lets you describe schedules that do not fit any clean curve, without going off-chain to express them.
How shape selection actually works
The FlowGuard frontend asks two questions before it asks you to pick a shape:- Is this a one-time grant or an ongoing payment?
- Does the recipient need partial access between unlock dates, or is it strictly step-by-step?
On-chain enforcement
Every shape compiles to a CashScript covenant with the same skeleton:- Immutable parameters baked into the contract bytecode at deployment.
- Mutable state in a CashToken NFT commitment that the contract advances on each valid action.
- A single rule per action: claim, pause, resume, cancel, transfer, refill, complete.
What we did not ship (yet)
Three shapes we considered and shelved for now:- Curved vesting with non-linear easing. Useful for retention-tilted equity but overkill for the treasury work most teams are actually doing.
- Conditional vesting gated on oracle data. We do not want to import oracle complexity until the demand is unambiguous.
- Reverse-vesting clawbacks. Solvable with our cancel path. The dedicated shape was not pulling its weight.

