Skip to main content

An open specification · Stewardship proposed to the Open Cap Table Coalition

GitHub spec@opencaptableprotocol.org
Open Cap Table Protocol

Implementations

One specification, three layers.

The protocol defines the objects and the rules. A runtime enforces them and guarantees atomicity and visibility. The libraries make both usable without re-implementing either.

Structure

What each layer is responsible for

Protocol
The OCF objects and transactions, the rules governing their lifecycle, and the authorization model that decides who may write and who may read. Runtime-agnostic: it describes behaviour, not storage. Versioned as an artifact separate from any implementation of it.
Runtime
An implementation of that protocol on a specific distributed network. Different ledger models require different implementation patterns to satisfy the same specification, which is why conformance is defined behaviourally rather than by a single codebase.
Libraries
The typed interfaces that read and write the protocol. Identity, authentication and disclosure are provided by the underlying network, so OCP defines no identity layer, session layer or replication protocol of its own.

Runtimes

Runtime status and disclosure profiles

OCP is chain-agnostic by construction. The data model, the authorization semantics and the derivation rules are identical across runtimes; what differs is how a given network realizes visibility, signing and atomicity. The runtime follows the disclosure profile of the register it would hold — not the issuer’s listing status.

RuntimeStatusLedger modelVisibility mechanismSuitable for
Canton (DAML)Reference, in productionContract-basedSub-transaction privacy; Observer parties for regulators and auditorsUS securityholder records, listed or not — the default wherever per-holder positions must not be publicly enumerable
Ethereum · Optimism · BaseEarlier versions ran hereAccount-basedPublic by defaultHistorical. Retained as evidence that the semantics port across ledger models
EVM / Solana (account-based)Open — item 1Account-basedDepends on added machineryAn independent conformant implementation here is the single most valuable contribution available
FHE-enabled EVM (fhEVM, Fhenix)Specified profileAccount-based, encrypted fieldsFully homomorphic encryption over quantities, prices and identitiesRecords whose existence is public but whose detail is not
Fully public chainsSpecified profileEitherNone — the log is fully visibleCertain fund structures, and instruments whose per-holder detail carries no confidentiality expectation
Rust implementationStartedAccount-based—Account-based chains generally

A new runtime becomes OCP-conformant by answering yes to every applicable question in the Appendix A coverage map. There is no certifier and nothing to apply for; conformance today is self-attested, and no executable suite is published yet. The conformance questions →

Reference implementation

DAML on the Canton Network

The reference runtime defines four primitives. OcpFactory is one shared contract per network deployment, signed by the system operator, which registers issuer parties. IssuerAuthorization is the proof of that registration, exchangeable by the issuer for the right to create a cap table and withdrawable by the operator. Issuer and CapTable are created together, the latter holding typed index maps, not balances. UpdateCapTable is the single choice through which all subsequent state changes flow.

Every contract in that structure — the cap table and each of the fifty-odd OCF entity templates — carries both the issuer and the system operator as signatories. The transfer agent’s authority is not an assertion made in an accompanying document; it is present cryptographically on every record in the register.

Reference runtime

DAML contracts on Canton. Open source and published.

fairmint/open-captable-protocol-daml →

Reference SDK

@open-captable-protocol/canton returns OCF-shaped data in TypeScript and submits OCF-shaped writes back, validating against the OCF schema before anything reaches the network. Batches are built through a chained create/edit/delete builder; higher-level utilities compose them into named flows — a Series A close, a grant package, a secondary transfer.

Fairmint/ocp-canton-sdk →

Implementation status

The balance-integrity guarantees of chapter 8 are live. Positions of record — the published, reservation-aware position view committed atomically with the write — are specified in chapter 3.4 and are part of the open work.

Operators

Who runs OCP today

OCP is most valuable when many transfer agents run it, each as system operator for the issuers it administers. A transfer agent adopting it runs its own registers under its own accountability and gains interoperability with every other operator implementing the same specification — without a membership, a central operator, or a dependency on any other participant’s continued operation.

Transfer agent · in production

Fairmint

SEC-registered transfer agent. Operates OCP on Canton for the issuers it administers. Employer of both specification authors.

That deployment is evidence that the protocol runs. It is not a definition of the protocol, and nothing in the specification requires an implementer to run Fairmint’s stack.

fairmint.com →

Evaluating adoption?

Two things a transfer agent usually wants to establish first. Adopting OCP is reversible: succession between operators is specified in four steps — extraction as an OCF manifest, verification by recomputation, re-establishment of grants, continuity of the log across the seam. And the statutory functions you already perform — proxy, dividends, splits, escheatment, 17Ad-17 search, statements, 1099 and K-1 — map onto OCF objects and OCP transactions; writing that mapping is open item 9.

Talk to the authors →