Payment streaming protocol for Canton

Launch recurring payment streams on Canton without rebuilding lifecycle plumbing.

OpenFluid gives builders reusable Daml contracts, a generated TypeScript SDK, and a read layer for stream state, balances, lifecycle actions, and product integration.

Payroll demo · Subscription demo · Daml contracts · Generated TypeScript SDK · Canton JSON API read layer

Lifecycle actions

Create, pause, resume, top up, cancel, and settle one shared stream path.

Generated SDK

Generated from the Daml model into TypeScript types for product code.

Read layer

Direct Canton JSON API reads for balances and live state.

Problem

The missing primitive in Canton payment apps

Canton gives teams a strong base for private, programmable workflows. OpenFluid removes the recurring-payment lifecycle plumbing so builders do not have to rebuild state, actions, and reads for every launch.

What keeps getting rebuilt

Stream contract logic, lifecycle actions, read models, operator permissions, and the glue between ledger state and the product UI.

One reusable layer is easier to ship than five one-off workflows.

Ledger and UI drift

The app says active while the ledger is paused.

Funding gaps

Top-ups land late and the stream runs dry.

Stale cancellations

A cancelled stream still shows up as live.

Manual support

Ops teams check logs, Slack, and spreadsheets for basic state.

Ticket churn

Every edge case becomes a one-off fix.

How it works

Define the stream once, then reuse it everywhere

OpenFluid keeps the recurring-payment lifecycle in one place so Canton builders can ship faster, read cleaner, and avoid duplicate state logic across products.

01
Define the stream

Choose sender, recipient, asset, rate, buffer, and permissions once.

02
Operate the lifecycle

Create, pause, resume, top up, cancel, settle, and monitor from the same contract state.

03
Read live state

Expose balances, accrued value, status, and operator views through the app layer.

04
Reuse the primitive

Apply the same stream model to payroll, billing, grants, vesting, and controlled release.

One stream model, reused across app flows and operator flows.
Stack

What OpenFluid includes

Contracts, SDK, read layer, and reference apps. One reusable stream lifecycle instead of a one-off integration for every product surface.

Contracts

Daml templates for stream agreements, lifecycle actions, distribution pools, conditional streams, and vault-backed release.

SDK

Generated TypeScript integration layer for creating, reading, and operating streams from product code.

Read layer

App-facing routes and read models for balances, status, lifecycle state, and operator views.

Reference apps

Payroll and subscription demos showing the same primitive reused across payout and billing flows.

Protocol primitives

The contract surface behind OpenFluid

StreamToken, StreamAgreement, DistributionPool, ConditionalStream, StreamVault, and policy hooks give Canton builders a reusable recurring-payment layer.

StreamAgreement

Core two-party contract for sender, recipient, asset, rate, buffer, and lifecycle actions.

Create / pause / resumeTop up / settleOperator state

StreamToken

CIP-56-compatible wrapper that makes a Canton asset streamable.

CIP-56 compatibleFlow-rate accountingLazy settlement

DistributionPool

One sender, many recipients for payroll, revenue share, and batch payout.

One-to-many streamingPool membershipBatch distribution

ConditionalStream

Milestone-gated or oracle-conditioned release with programmable triggers.

Oracle thresholdsMilestone gatesManual approval

StreamVault

Escrow-backed release for vesting, grants, and treasury-controlled unlocks.

Vesting periodsCliffsEscrow release

Policy hooks

Optional allowlists, operator controls, and external checks for teams that need them.

AllowlistsOperator controlsExternal checks
Demos

Proof in the stack

The payroll and subscription surfaces use the same primitive, the same lifecycle logic, and the same read layer. That keeps the launch story honest and the implementation surface small.

What the demos show

Payroll and billing do not need separate lifecycle layers. OpenFluid keeps the same stream state visible to the app, the operator, and the read layer.

Use cases

Payment workflows OpenFluid supports

The same primitive covers payroll, subscriptions, grants, vesting, revenue sharing, and treasury-controlled release on one reusable rail.

Workflows

Primary workflows

The first jobs teams ship on OpenFluid.

Payroll and contractor payouts

Distribution pools keep recurring compensation moving from treasury to named recipients.

Subscriptions and recurring billing

Access stays active while the stream is active, and closes cleanly when it is not.

Workflows

Expansion workflows

Same primitive, broader money flows.

Grants

Conditional streams release funds only when milestones are approved.

Vesting

Vault-backed release for cliff or linear unlocks.

Revenue sharing

Split recurring value between multiple recipients.

Treasury-controlled release

Operator-controlled disbursement for schedules, approvals, and payout policy.

Docs

Build against one stream lifecycle

OpenFluid keeps the product surface clear while the implementation details stay visible to builders who need them. Architecture, SDK design, indexer design, and security notes live in the repo for the teams integrating it.

Illustrative SDK shape
Create, pause, and settle a stream
TypeScript
await openfluid.streams.create({
  sender: treasuryParty,
  recipient: contractorParty,
  asset: paymentAsset,
  ratePerSecond: '0.00145',
  bufferAmount: '500',
  operator: opsParty,
})

await openfluid.streams.pause(streamId)
await openfluid.streams.topUp(streamId, '250')
await openfluid.streams.resume(streamId)
await openfluid.streams.settle(streamId)
Security and maturity
OpenFluid is the current implementation for Canton builders evaluating recurring payment workflows.
Available now
  • Daml contract primitives
  • Generated TypeScript SDK path
  • Canton JSON API read layer
  • Payroll demo
  • Subscription demo
Before production use
  • Independent audit
  • Hardened operator controls
  • Production monitoring
  • Release process
  • Expanded policy hook docs
Request pilot access

Request pilot access

Tell us what recurring payment workflow you are building on Canton. We will map it to the right OpenFluid primitive, demo path, and integration surface.

Pilots, product demos, and ecosystem partnerships.

Quick note
Tell us the shape of the workflow

We only use this to respond about OpenFluid.