1. The input: an ERC-4626 vault
Every Moment market is built on one ERC-4626 vault. In the example market the vault share is sUSDS and the underlying asset is USDS.- TBT is denominated in the underlying asset, not in shares.
- The only price Moment reads is the vault’s
previewRedeem. There is no external oracle. - Your integration should treat the vault as the source of truth for value. If the vault loses value, every TimeBalance on it does too.
2. Reading a TimeBalance
A TimeBalance is a shape, not a number. A read should return the amount held in each period, plus the amount from the last maturity on: Things to handle:- Windows move. When a maturity passes, its window starts at Now (invariant 4). Read against the current block time.
- Units only add within a window. Never sum across windows to get “a balance”.
- The current period is what earns. The amount in is what earns the vault’s yield right now.
- Liquidity is held separately. TBT in limit orders and Recursive bins is not in the free TimeBalance. Value it from the LP position. Filled amounts move into the TimeBalance at the next sync, so count them once.
3. Sync semantics
Balances change at sync, not continuously on-chain. Any interaction with a position syncs it.- Yield since the last sync is added to the base TimeBalance as a flat amount over , net of the 5% performance fee. There is no claim step.
- Limit fills land in the maker’s TimeBalance at the maker’s next sync.
- LP tokens and their bin sync together, separately from the free TimeBalance. An LP sync pays more LP tokens plus base TBT.
4. Measuring value: present value
To show a single number for a position, or to total TVL, use present value: where are the windows held, the amount in each, and is the discount factor from the book’s period rates:Never report raw TBT units added across windows. A short window of 2,500 TBT can be worth a few dollars.