OpaqueApp

Blog

Why notes hold raw units

xStocks fold dividends and splits into a multiplier on the mint. One design choice makes a shielded position keep accruing.

xStocks do not pay dividends in cash and do not change your balance on a split. Dividends are reinvested and splits are applied by changing a multiplier on the mint, Token-2022's scaled UI amount: shares = raw × multiplier, while the raw balance stays unchanged. Every wallet shows you shares by applying the multiplier at read time.

That fact decides the single most important unit in Opaque.

The choice

Notes hold raw units. A note created from 100 shares at a multiplier of 1.0005 holds 99.95 raw, and it holds exactly that until it is spent. The pool never reads the multiplier, never stores it, and never has to be told that a corporate action happened.

What follows

A dividend or split that lands while a position is shielded reaches it exactly as it reaches an open balance. When the position is unshielded, the wallet applies the current multiplier to the raw amount and shows the shares that an open holder of the same raw amount would have, to the last decimal.

Had notes held shares instead, every corporate action would have required the pool to re-denominate every note, or the circuit to read a value that changes under it. Both are places where money goes missing.

What you see

The app shows shares, because that is how you think about a position, and prints the multiplier it used. It converts your input to raw units for the proof and your notes to shares for display. The raw amount is always exact; only the display is rounded.

It is a small decision. It is also the one that makes "your position keeps accruing while it is private" a property of the protocol rather than a promise.

More from the blog

Introducing OpaqueThe key that never exists