Protocol SpecificationStock Functions

Stock Functions

Every lifecycle write follows the same shape: validate an active security, mutate active positions, encode the transaction, and emit an event for the poller. Partial operations may also create a new balance security.

StockLib is chain/src/lib/Stock.sol. CapTable calls it for stock lifecycle writes.

Library functions

FunctionCalled byChecksChangesTx
createIssuanceissueStockQuantity and price.Adds position; increments issued shares.STOCK_ISSUANCE
createTransfertransferStockBuyer verified; enough stock.Moves shares; may create balance/resulting issuances.STOCK_TRANSFER
createCancellationcancelStockPosition exists; enough quantity.Removes original; may create balance; subtracts issued shares.STOCK_CANCELLATION
createReissuancereissueStockPosition exists.Records reissue; removes original.STOCK_REISSUANCE
createRepurchaserepurchaseStockPosition exists; enough quantity.Records repurchase; may create balance; subtracts issued shares.STOCK_REPURCHASE
createRetractionretractStockIssuancePosition exists.Records retraction; removes original.STOCK_RETRACTION
createAcceptanceacceptStockChecked by CapTable.Records acceptance only.STOCK_ACCEPTANCE

Helpers

HelperPurpose
_updateContextWrite position, track security ID, record issuance, update issued shares.
_safeNowCast block.timestamp to uint40.
_subtractSharesIssuedDecrement issuer and class issued shares.
_transferSingleStockMove one active security.
_checkInvalidQuantityOrPriceReject zero quantity or price.
_checkInsuffientAmountReject insufficient shares.
_checkActivePositionExistsReject zero-quantity position.
_checkBuyerVerifiedReject unverified transfer buyer.

Errors

ErrorTrigger
InsufficientSharesRequested quantity exceeds active shares.
InvalidQuantityOrPriceQuantity or price is zero.
UnverifiedBuyerTransfer buyer is unverified.
ActivePositionNotFoundActive position has no quantity.

Balance securities

ActionBehavior
TransferPartial transfer creates transferor balance issuance.
CancellationPartial cancellation creates balance issuance.
RepurchasePartial repurchase creates balance issuance.
Retraction/reissuanceOriginal position is removed.

Server-side controllers convert UUIDs to bytes16 (convertUUIDToBytes16) and scale quantities/prices (toScaledBigNumber) before calling these functions. Raw onchain values are scaled by 1e10 (10,000,000,000) — divide by 1e10 to get human values. The poller unscales automatically before writing to MongoDB.