Skip to main content

Booked movements

A token with booked movements moves units only when an administrator books a movement under a register reference, and refuses any other mint, burn or transfer.

Booked movements is a token feature for an instrument whose legal register lives outside the platform, with a transfer agent or a fund administrator. While the feature is attached, the token keeps an on-chain record of every movement of its units, called a line, and refuses any mint, burn, transfer, forced transfer or wallet recovery that is not the booking of a line. The register stays the book of record. Units move on chain only when an administrator, a holder of the token's Supply management role, books a movement and gives its register reference. The platform records the reference but does not check it against your register or for repeats, so uniqueness is yours to enforce.

Reconciliation explains how you compare your register with the platform's ledger for an ordinary token. On a token with booked movements, each movement also carries the register reference it was booked under, so the comparison matches entry to entry when each register entry has its own reference.

What a line records

A line is one movement between two parties. Its kind follows from the parties. A line with no giving party is a subscription and mints units. A line with no receiving party is a redemption and burns units. Any other line is a transfer. The API writes the missing party as the zero address, 0x0000000000000000000000000000000000000000.

Field
What it holds
From and to
The party that gives units and the party that receives them.
Amount
The units the line moves. A line of zero units is refused.
State
requested, booked or cancelled.
Opened by and at
The wallet that opened the line and when.
Decided by and at
The wallet that booked or cancelled the line and when. Empty while it is requested.
Register reference
The reference your register files the movement under. Empty until the line is booked.
Corrects
The booked line this line corrects, if any.

A booked or cancelled line never changes again. To fix a booked line, an administrator books a new line whose corrects value names it, so the history keeps both the mistake and the correction. A correction does not undo the earlier line by itself: the administrator chooses its parties and amount. To fix a subscription of 1,000 units booked to the wrong holder, book a redemption of 1,000 units from that holder that corrects it, then book the subscription to the right holder.

How units move

Units move only when a line is booked, whether a holder requested it or an administrator booked it directly.

A holder requests a line. For a transfer or a redemption the holder must be the giving party, and the platform holds the requested units on the holder's balance through the token's hold feature until the line is booked or cancelled. For a subscription the holder must be the receiving party, nothing is held, and each recipient has at most one subscription request open at a time. The token refuses a request whose kind the token does not allow, a transfer or redemption request from a wallet the identity registry marks as lost, and a transfer or redemption request on a token with no hold feature.

An administrator books a line directly. A holder of the Supply management role on the token opens and books a line in one call, for a subscription, a transfer, a redemption or a correction of an earlier booked line. A correction must name a line that is booked.

Booking a requested line releases the held units first, then records the register reference and moves the units in the same transaction. Only a holder of the Supply management role books, and a booking without a register reference is refused. The move still passes the token's own checks: the receiving wallet must be registered in the identity registry, and any compliance modules the token carries still apply. When any check refuses it, the whole transaction reverts: the line stays requested and its units stay held.

A requested line can also end without moving units. The administrator cancels it as a refusal, or the holder who opened it cancels it as a withdrawal, and the line records who cancelled it. Anyone else is refused. Cancelling releases the held units. On chain, the opener or an administrator can still cancel after the feature is detached, so held units are not stranded. The Platform API acts only on an attached feature.

What the token refuses

Every movement that is not a booking reverts with “This token only moves through a movement the administrator books.” That covers a plain mint, burn and transfer, a forced transfer by the custodian, and a wallet recovery: each of those needs a line too. The refusal holds only while the feature is attached. A holder of the token's Governance role can detach it, and the token then moves units without a line among wallets registered in its identity registry until the feature is attached again.

The feature needs the hold feature on the same token, and it cannot sit beside the management fee, conversion, conversion minter, supply delegate or maturity redemption features, because each of those moves units outside a line. A template or an attach that combines them is refused.

A booking reaches the token as a booked movement, which tells the token's other features that the amount is already on a ledger. A second-generation fee feature does not split it, a second-generation fee ledger does not count it, and an external transaction fee is not charged on it. Token features describes both generations of each fee feature.

Which moves holders may request

A token keeps a set of line kinds open to holder requests: subscription, transfer, redemption or any mix. When the issuance names none, holders may request all three. A holder of the Governance role changes the set. Lines already requested stay open when their kind is switched off, and an administrator can always book any kind directly.

The Share-Class Mirror template issues a token with the historical balances, hold and booked movements features attached and no compliance template, because the register decides who may hold the share class. With no compliance template, a detach leaves the identity registry as the only check on who receives units. The token starts paused. The issuance can ask for it to be unpaused on creation, and an unpaused token is ready for its first booking. Its holders may request all three kinds until governance narrows the set.

Work with lines in the Console

The Booked movements workflow walks through the Console: booking or rejecting a requested movement, booking one directly, correcting a booked movement, and choosing what investors can request. In the Investor portal, a holder requests a movement, withdraws an open request, and sees their own movements and the amount still available to request.

Read and write lines through the Platform API

Six routes under /api/v2/tokens/{assetId}/features/register-lines list and read lines, request a line, book a line, cancel a line and set the requestable kinds. The Platform API reference carries their shapes. A line read returns the indexed record and does not read the chain:

{
  "data": {
    "lineId": "7",
    "tokenAddress": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
    "featureAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
    "kind": "subscription",
    "state": "requested",
    "from": "0x0000000000000000000000000000000000000000",
    "to": "0x2546BcD3c84621e976D8185a91A922aE77ECEc30",
    "amount": "1000000000000000000",
    "registerReference": null,
    "corrects": null,
    "openedBy": "0x2546BcD3c84621e976D8185a91A922aE77ECEc30",
    "decidedBy": null,
    "openedAt": "2026-01-15T10:00:00.000Z",
    "openedTxHash": "0xabababababababababababababababababababababababababababababababab",
    "decidedAt": null,
    "decidedTxHash": null
  },
  "links": {
    "self": "/api/v2/tokens/0x71C7656EC7ab88b098defB751B7401B5f6d8976F/features/register-lines/lines/7"
  }
}

A caller with the Supply management or Governance role on the token lists and reads every line. Any other caller lists and reads only the lines where one of their wallets gives, receives or opened the line, and gets not-found for the rest.

The ordinary token writes keep working on such a token and become lines. A mint books a subscription, a burn books a redemption and a forced transfer books a transfer, each with the Supply management role. These calls take a registerReference, which is required on this token, and an optional corrects line. A call without a reference, or a call that names more than one movement, is refused with “A token with booked movements needs a register reference and one movement per call”. A burn or forced transfer is also refused before anything is sent when the holder's unfrozen balance, less what holds reserve, cannot cover it. A transfer call from a holder opens a transfer request from the calling wallet to the recipient, which the administrator books or rejects as any other request. On a token without the feature, a call that includes registerReference or corrects is refused.

Each webhook event for a booked movement includes registerLine with lineId, registerReference and, for a correction, correctsLineId. When each register entry has its own reference, a reconciliation job can match the movement to its register entry from the event alone.

Read the Booked movements workflow to book movements in the Console, Reconciliation to compare your register with the platform's ledger, Token features for the features a token can carry, and Audit trail to find who changed a token's register line settings.

Was this page helpful?