Centrifuge accounting: from holdings to share prices
Last updated:Centrifuge can calculate a single-class fund’s share price by dividing net asset value by outstanding shares through its configured onchain accounting components. Holdings contribute quantities and valuations, while the ledger tracks changes in financial value. Funds using externally calculated NAV can publish their share prices separately.
On this page
Bottom line: A fund’s share price reflects its valuation inputs and outstanding issuance; the published value alone does not establish available redemption liquidity.
Does the holdings total equal a fund’s NAV?
A holdings total can differ from NAV because the published fund valuation may include assets and obligations beyond the recorded onchain positions. The Holdings view lists each position’s quantity, price, and value per network. Those rows describe the pool’s recorded balance sheet. Net asset value, or NAV, expresses net financial value under the product’s valuation methodology. A list of asset quantities alone cannot supply that value without prices and the relevant accounting adjustments.
A portfolio held with a custodian can supply an externally calculated NAV. The manager publishes the resulting share price as the fund’s onchain reference price. In an automated configuration, valuation contracts and accounting balances supply the calculation directly. Both approaches need a defined valuation basis. Comparing a holdings total with a published valuation requires matching the portfolio scope, denomination, and relevant accounting state.
Balanced journal entries preserve the accounting relationship
Every financial change needs matching entries for the ledger to remain balanced. The Accounting contract records debits and credits against pool-specific accounts. It requires equal debit and credit totals when it locks the journal. Accounts also have a normal balance direction: debit-normal accounts derive their value from debits minus credits, while credit-normal accounts reverse that relationship. This keeps the same journal entry meaningful across different account types. In the standard investment accounting arrangement, a processed investment increases the asset account and the corresponding equity account.
Balanced entries establish arithmetic consistency. Their economic accuracy still depends on the asset valuation and account assignments supplying those entries.
Valuation contracts translate quantities into pool currency
A holding needs a valuation contract because its token quantity does not, by itself, describe its financial value. The IValuation interface exposes a price and a quote for a specified holding amount. Both relate the holding to the pool’s denomination. This makes differently denominated positions comparable within the ledger. The price describes value per unit; the quote expresses the value of the requested quantity. Registered decimal precision governs conversion between raw token amounts and the denomination used for accounting.
IdentityValuation always returns a unit price of 1.0 in the pool’s denomination. Its quote calculation adjusts decimal precision without applying a market-price change. That makes it appropriate only where the chosen valuation method supports a one-to-one relationship. OracleValuation instead accepts prices from authorized feeders. A custom implementation can supply another holding-specific valuation method through the same interface.
A changing input affects recorded NAV when the protocol revalues the holding and journals the difference. Reading a newer valuation quote alone does not replace the stored holding value.
A fixed unit valuation does not detect a broken peg. The accounting system continues using the contract’s defined pricing rule.
NAVManager applies gains, losses, and liabilities
When a pool configures NAVManager, its account balances determine the net value it passes to the pricing hook. NAVManager computes each network’s NAV as equity plus gains minus losses and liabilities, respecting the signs of those account balances. Gains and losses capture valuation changes without requiring a change in token quantity. Liabilities reduce the value remaining after obligations. The implementation returns zero when the negative contributions meet or exceed the positive contributions. Its standard account arrangement assumes the pool shares assets across its share classes, rather than segregating portfolios by class. Different economic allocation rules therefore need compatible accounting and pricing logic. An onchain calculation makes the arithmetic inspectable; it still reflects only the balances and valuations entering that calculation.
Outstanding shares turn NAV into a unit price
Positive outstanding issuance provides the denominator needed to express fund value per share. For positive issuance, SimplePriceManager divides its tracked net asset value by its tracked outstanding shares. ShareClassManager records issuance and revocations per network and across networks. Outstanding issuance represents issued shares less revoked shares, rather than cumulative minting alone. The NAV amount and share count need compatible decimal scaling for a meaningful quotient. Changing the denominator can change the price even when the numerator stays constant.
SimplePriceManager implements pricing for a single-share-class pool and accepts the pool’s first share class. A pool supporting multiple classes needs pricing logic appropriate to their economic allocations. The broader protocol can store a separate price for each class. A rising share price also leaves an existing holder’s token count unchanged, unless issuance, redemption, or transfer changes that balance.
Synchronized snapshots keep the ratio meaningful
Asset balances and share issuance must represent compatible states before their ratio can describe a share price. Holdings tracks whether assets and shares have synchronized for a given network. A configured snapshot hook can then trigger NAV recomputation. QueueManager helps submit queued asset and share changes to the hub, subject to its configured delay. A local asset movement and the hub’s consolidated accounting update therefore describe different points in cross-chain processing.
Version 3.1 introduced automated NAV and share pricing through these configurable components. Version 3.3 changed the balance-sheet implementation: Spoke absorbed the standalone BalanceSheet operations, and holdings valuation moved entirely to the hub. Reservations determine how much an escrow balance contributes to the hub-accounted holding. In that release, pending deposits remain net-zero in those holdings through paired deposit accounting and reservation. Escrow custody alone therefore does not mean a pending subscription has increased the accounting numerator.
Pricing configurations require different inputs
The Management app accepts either a total NAV or a NAV per share. Those input choices concern publication of a product valuation. Holding valuation and automated pricing use additional contracts, with their own prerequisites. The choices below operate at different layers and can work together within the fund’s configured methodology.
| Valuation or pricing option | Required input or configuration |
|---|---|
| Total NAV entry | An established total product valuation; the app previews resulting token prices. |
| NAV per share entry | An established per-share valuation for the intended product. |
| IdentityValuation | A valuation method supporting a one-to-one relationship with the pool denomination. |
| OracleValuation | Authorized price feeders, a price for the holding, and required manager permissions. |
| Custom IValuation implementation | Contract logic returning prices and amount-specific quotes in the pool denomination. |
| SimplePriceManager | A single-share-class pool, initialized NAV accounting, and a linked pricing hook with manager authority. |
| Custom NAV hook | An INAVHook implementation linked to NAVManager and suited to the fund’s pricing rules. |
How do updated share prices reach other networks?
An updated share price reaches another network when the hub sends a price notification and that network processes the message. Updating the hub’s price record supplies the central value. Propagating that value makes it available where the share token operates. Contract-level integrations can notify individual networks, while the SDK can batch a share-price update with notifications for active deployments. Conceptually separate operations therefore do not always require separate user transactions.
The Management app previews current and proposed token prices across deployments and shows publication status for each network. A deployment awaiting an update has not yet confirmed receipt of the new reference price. Messaging costs and successful destination execution remain dependencies even when an interface groups the work. A configured pricing hook can supply the new hub value; notification logic determines its distribution.
Reference prices and execution prices answer different questions
The reference share price describes the fund token’s published value in the pool denomination. Execution prices determine the actual conversion applied to investment or redemption processing. The BatchRequestManager sets batch execution share prices separately from the published reference. Investment-asset prices also matter: vaults value the incoming asset in the pool denomination before converting that value into shares. Redemptions apply the reverse conversion. For request-based operations, fulfillment can use prices different from those displayed when the request entered the queue. A NAV update alone therefore does not determine a request’s final asset amount.
An accounting valuation also does not promise immediately available redemption liquidity. The product’s fulfillment process and available assets govern settlement.
Accounting visibility ends at the valuation inputs
Accounting records expose amounts, valuations, and share issuance, making the origin of a calculated price easier to inspect. The public read-only API provides holdings, token prices, issuance data, and historical token snapshots. The Management app can also export holdings for reporting. Such records describe the state the protocol tracks; they do not independently establish the recoverable value of an offchain asset. An authorized feeder can supply a price the contracts accept even when its economic assumptions prove wrong. Custom valuation logic can likewise misprice a holding while producing balanced journal entries. The underlying product determines how those inputs relate to realizable value.
Centrifuge - common questions
What price does SimplePriceManager return before any shares exist?
SimplePriceManager returns a unit price of 1.0 when its tracked issuance is zero. This is the implementation’s zero-issuance case, before its NAV-to-issuance division applies. The value describes a pricing rule; it does not establish the fund’s asset quality or a promised investor return.
Do I need pool-manager permissions to read accounting data?
The public read-only API does not require authentication to query indexed accounting data. Holdings, token prices, and issuance records can support interpretation without granting control over a pool. Updating accounting configuration or publishing a price involves separate permissions; access to data does not supply that authority.
Which decimal precision does the valuation interface use?
IValuation expresses its unit price as a fixed-point value with 18 decimal places. Amount quotes use the asset and pool denomination precision registered in the protocol. Raw balances therefore need their applicable decimal scaling before financial comparisons; equal-looking integers can represent different quantities.
Can moving shares between networks increase a fund’s global share supply?
A cross-chain share transfer relocates existing shares without creating an additional economic position. SimplePriceManager tracks transferred-in and transferred-out amounts separately when reconciling network issuance changes. That adjustment prevents it from counting the transfer again as a new global issuance change during subsequent synchronization.
What happens if OracleValuation has no price for a holding?
OracleValuation rejects a price read when no valid price has been set for that pool, share class, and asset. A quote requiring that price cannot proceed. An authorized feeder must supply the price, and the contract needs the relevant permission to update the holding’s accounting value.
Does OracleValuation average prices from multiple feeders?
OracleValuation uses a single authorized feeder submission to set the stored price, without averaging submissions or requiring several feeders to agree. Authorizing multiple feeders alone does not add an independent consensus check or change the holding’s pricing method.
Is a share price’s computed-at timestamp the same as its publication time?
A computed-at timestamp identifies when the valuation was calculated, which can precede its onchain publication. ShareClassManager rejects a supplied computation time in the future. The computation timestamp, publishing transaction, and arrival of a cross-chain update describe different events, even when an interface presents them together.