Skip to main content

SPEC 003 — Cap Table

Confluence sources incorporated: “Allocation Graphs,” “Capitalization V1” — see sections 6a and 6b below

1. Feature Purpose

The cap table is the core product of Equa. It tracks who owns what in an organization — shareholdings, security types, pricing, funding rounds, valuations, and ownership transfers. Every share issuance produces a signed certificate with legends. The cap table powers the fully-diluted ownership view, capital change history, and investor reporting.

2. Current State (Verified)

2.1 Backend

2.2 Frontend


3. Data Model

Shareholdings

SecurityTypes

SecurityDetails

Related metadata for security types (structure follows SecurityTypes context).

SecurityTypeSeniorityTable

Tracks liquidation preference ordering among security types within an organization.

SecurityTypeSharesTable

Aggregated share counts per security type (authorized, outstanding, reserved).

SharePricingTable

Holdings

CapitalChanges

FundingRounds

Valuations

Transfers

TransferOutputs

Legends

LegendMetas

Signatures


4. API Endpoints


5. Frontend Components


6. Business Rules

  1. Numeric precision — Shares, prices, and valuations use numeric type (arbitrary precision) to avoid floating-point errors in financial calculations.
  2. Content-addressed immutability — SecurityTypes, Legends, SharePricing, and Transfers reference content by hash, ensuring historical records cannot be silently altered.
  3. Serial numbers — Each shareholding within an organization receives a sequential serialNumber for certificate identification.
  4. Fractional shares — Allowed only when SecurityTypes.fractionalShares = true for the relevant security type.
  5. Transfer integrity — Transfers use input/output hashes; the sum of output values must equal the input holding value (no shares created or destroyed).
  6. Exercised flag — Options and warrants track exercised = true once converted, preventing double exercise.
  7. Seniority orderingSecurityTypeSeniorityTable determines liquidation preference order among security types.
  8. Fully-diluted calculation — Holdings track outstanding, authorized, and fullyDiluted separately to support both basic and diluted ownership views.
  9. Legends on certificates — Every shareholding references a legend hash; legends are immutable once assigned to issued certificates.
  10. Signatures required — Certificates require at least one Signature record linking a signatory member with name and title.
  11. Legacy flaglegacyShareholding = true marks shareholdings imported from the previous system for migration tracking.

6a. Allocation Graph Model (from Confluence KnowledgeBase)

Source: Confluence KnowledgeBase — Allocation Graphs (by Christopher Johnson)
An entity can be divided into units, which are grouped into pools. Pools can be subdivided into child pools, forming a hierarchy called an allocation graph. An allocation graph is itself an entity. Node properties:
  • value — the amount of units allocated to the node
  • children — zero or more child nodes (sum of children’s values must not exceed parent’s value)
  • parent — every node except the root must have exactly one parent
Partition types — the units of a pool divide into:
  • Outstanding — issued and held by shareholders
  • External Reserved — allocated for external parties (investors, advisors)
  • Treasury (Internal Reserved) — held internally by the organization

6b. Capitalization V1 User Stories (from Confluence KnowledgeBase)

Source: Confluence KnowledgeBase — Capitalization V1 (by Christopher Johnson)
User stories (outstanding holdings only):
  • Transfer shares without affecting capital contributions of the source holding
  • Edit capital contributions of an active holding
  • Cancel a holding and preserve its capital contributions
  • Cancel a holding and its capital contributions
  • Edit capital contributions of a cancelled holding
  • Edit capital contribution of a holding that was transferred (effectively cancelled)
Key requirements:
  • When a holding is cancelled or transferred, capital contributions remain active by default
  • To cancel both a holding and its contributions: set contributions to zero, then cancel the holding
  • Users with cap table edit permission can edit cancelled holdings (known UI bug: “Resource Not Found” error)
  • Capital contribution fields in the Transfer form are deprecated and should not be used

7. Acceptance Criteria

  • Organization owner can create security types with class, pricing, voting, and fractional share settings
  • Shares can be issued to members with correct serial number auto-increment
  • Share pricing (price per share, par value, original issue price, conversion terms) is stored accurately
  • Shareholdings display on the cap table with correct ownership percentages
  • Fully-diluted view includes outstanding, authorized, and fully-diluted counts
  • Share transfers move ownership atomically (inputs → outputs) with value conservation
  • Options/warrants can be marked as exercised; double exercise is prevented
  • Funding rounds track common and preferred totals with round name and end date
  • Valuations are recorded per entity with date, value, and unit
  • Capital changes history logs every issuance, transfer, and cancellation
  • Legends are immutable and content-addressed
  • Certificates include legend text and at least one signature
  • Security type seniority ordering is configurable
  • Fractional shares are rejected when fractionalShares = false
  • Redux state stays in sync with server after cap table mutations

8. Risks