Overview
This section explains how Moment works underneath the app: TBT’s value rules, how yield is counted, how the AMM Book prices and routes trades, and how liquidity fills.Who this is for
- Builders and integrators who read or move TimeBalances from their own contracts or apps.
- Quants and market makers who want the exact pricing and fill rules before they quote.
- Auditors and reviewers who check that the design holds together.
- Curious traders who want to see why a quote comes out the way it does.
Unlike the guides, these pages use formulas. Numbers are illustrative unless a page says otherwise.
Notation used on every page
A period is the window between two maturities.
TBT value invariants
Every TBT obeys four rules: an infinite window equals the asset, windows split and merge, amounts scale linearly, and a later start becomes Now on its own. Every Moment action is built from these rules. A trade rearranges windows of time; it never changes what the rules say a window is worth.Notation
is one unit of TBT over the window from (included) to (excluded). A TimeBalance is a sum of such windows, for example: All TBT is denominated in the vault’s underlying asset (USDS in the example market), not in vault shares.Invariant 1: the anchor
Holding 100 TBT from Now to ∞ is the same as holding 100 USDS of vault exposure. It earns the vault’s yield, and it converts to vault shares at the redemption %, usually 100%. Wrapping and unwrapping carry no Moment fee. This is the only invariant that ties TBT to a price. Every other window is valued relative to it.Invariant 2: split and merge
For any : A window can be cut at any point, and adjacent windows can be joined, with no change in value. This is how Moment cuts the anchor at each maturity into a principal side and an interest side:Invariant 3: linear scaling
For any amounts over the same window: Scaling is linear. That keeps partial closes, transfers and position sizing predictable: half a position is worth exactly half.Invariant 4: time moves the start
When the clock reaches : A window that starts later becomes a “Now → …” window on its own. No transaction is needed and no value changes hands. In particular, becomes the anchor at maturity : a Fixed position simply becomes a flat balance.What trades do with these rules
The market sets the exchange rate between windows. The invariants make sure the pieces always add back up. See Strategy maths for the full walk-throughs.
Value is measured in present value
A window’s worth is its present value in the underlying asset, today. With the market’s discount factor to time (from the book’s rates): So the anchor is worth 1, and the interest side of is worth . For a short window, the value is roughly the yield it earns:Never add raw TBT units across different windows. 2,500 TBT over a 15-day window at a 5% rate is worth about USDS, not 2,500. Units only add within the same window (invariant 3). To total a TimeBalance, or a protocol’s TVL, sum present values.
Yield mechanics
Moment reads the vault’s price throughpreviewRedeem, credits the growth to the windows each position held, and adds it to the base TimeBalance, flat from Now → ∞, at sync.
TBT does not create yield. It measures, attributes and distributes the yield of the underlying ERC-4626 vault. Numbers on this page are illustrative.
Where the price comes from
Moment is oracleless. The only price it reads is the vault’s own exchange rate: That is, how much underlying asset one vault share is worth. There is no external price feed, so there is no oracle to manipulate. The vault’s growth between two times is:Lazy sync accounting
Yield accrues at the vault continuously. Moment does not push it to anyone; it records it lazily:- A position is synced whenever it is touched on-chain: a trade, a close, adding or removing liquidity.
- At sync, Moment computes the yield earned since the position’s last sync and books it.
- Between syncs nothing is lost. The yield simply waits for the next touch.
Attributing yield to windows
A TimeBalance holds different amounts in different periods. Yield over the synced stretch (last sync → Now) is earned only by what the position held at each moment of that stretch. Split the stretch at every maturity it crosses, . If the position held over , the gross yield is: So a Fixed holder, who gave up , earns nothing over that window. A Leverage holder, who holds a large amount in , earns on all of it. This is how a TimeBalance’s shape turns into its yield.Sync adds a flat layer to the base TimeBalance
At sync, the net yield is added to the base TimeBalance as one flat amount over : There is no separate claim and no separate yield token. The yield becomes ordinary balance and earns from then on. In the app, the synced stretch is what was held since the last sync, and its yield lands as a flat blue layer from Now. See Reading the chart.
At sync, the yield of the stretch lands as a flat layer from Now to ∞.
Performance fee
Moment takes a 5% performance fee on yield, for every holder: traders and LPs alike. Example: a flat 10,000 USDS balance and 0.2% vault growth since the last sync gives 20 USDS gross, 19 USDS net, 1 USDS fee. The app always shows the net figure.When the vault’s price falls
Yield only counts above the market’s previous high (a high-water mark). Each market keeps its own high: the highest vault price that market has recorded. A market takes its first reading of the vault when it is deployed, so its high starts at the vault’s price at that moment, not at the vault’s all-time high. Everything above that reading counts as yield, including a recovery from a drawdown the vault suffered before the market existed. If the price falls, no yield is added until it climbs back above that high. For a 100 USDS position, before the fee (each row on its own; yield from earlier rows is not added back):
A TimeBalance is denominated in the underlying asset and tracks the vault. If the vault loses value, your position does too. See Risks and security.
Positions that have never synced
A position that has never synced has no balance yet. It has no last-sync time, so it has no synced stretch and no yield to attribute. Nothing is drawn before a position’s last sync.Liquidity positions
LP tokens and the bin inside them sync together, on their own clock. An LP sync pays two flat amounts: more LP tokens, and base TBT into the TimeBalance. The TimeBalance then adds its own sync on top. See Liquidity mechanics.The AMM Book
The AMM Book is a grid of periods (time) and bins (rate): each period has its own rate, and a trade steps through every period on its path, all or none. It combines two ideas. Like an order book, makers quote explicit rates for a chosen maturity. Like an AMM, liquidity stays on-chain and trades route through it automatically, in one transaction. Numbers on this page are illustrative.Periods: the time axis
A period is the window between two maturities, . Periods sit back to back, with no gaps and no overlap: In the example market, maturities fall on the 2nd and 17th of each month at 08:00 UTC, with up to 8 open at once. When one matures, a new one opens at the far end. Each period carries one rate. That rate prices moving value across that period, and only that period.Bins: the rate axis
Inside each maturity, liquidity sits in bins. A bin is defined by three things: A bin holds the fungible liquidity of every LP who deposited into it. Many bins at different rates make up the depth of one period.Bin anatomy: the two sides of a maturity
Every maturity cuts the anchor into two sides (see TBT value invariants):
Bids hold the interest side and fill Fixed takers. Asks hold the principal side and fill Leverage takers.
- A Fixed taker gives of the principal side and receives of the interest side, from a bid.
- A Leverage taker gives of the interest side and receives of the principal side, from an ask.
Ticks
Rates are quoted on a tick grid where the rate per second is . Ticks are negative for realistic rates (about −218,730 gives roughly 1% a year). The rate can never reach zero. One tick moves the rate by 0.01% of itself, so the grid is multiplicative: 100 ticks is about a 1% relative change, at any rate level. Each market sets a minimum tick step between quotable rates and a minimum and maximum spread for Recursive bins. See Contracts and parameters. Both are chosen when the market is created, so each market can use its own.Simple within a period, compounding across periods
Within one period, interest is simple: Across periods, a trade chains each period’s result into the next. That chaining is where compounding comes from: and in general, to the -th maturity: Example: 100 fixed at 10% for one period gives 110. Extending through a second period at 15% gives . The Term view on Markets shows these chained rates (Now to each date). The Forward view shows each period’s own .Routing
A trade to maturity steps through every period between Now and , taking each period’s rate. A Fixed trade steps outward from Now; a Leverage trade works back from the far period to Now.- In each period, it fills the best-priced bin first, then the next, until that period’s leg is done.
- Each period’s leg is sized from the leg next to it, so the legs chain into one trade.
- Slippage appears only when a bin runs dry and the trade moves to the next rate.
Atomicity
A multi-period trade is atomic: every period fills, or the whole trade reverts. There are no partial fills across periods. Slippage tolerance (default 0.5%) and the deadline apply to the whole route. So a long trade can fail in a thin market where a short one succeeds. The quote’s per-period breakdown shows each leg before you sign.Taker fee: a rate adjustment
The taker fee is multiplicative on the rate, not a cut of the trade size: Example: a maker bid at 5.26% gives a Fixed taker 5.23%. A maker ask at 5.30% costs a Leverage taker 5.33%. Since , the fee is about the same as moving the rate 50 ticks against the taker. Makers keep their full spread. The maker trades at exactly its quoted rate. The fee is taken in kind, from the side the taker hands over:
In both cases the fee’s present value is about:
Why a taker fee, and not a share of the spread. The fee is charged directly to the taker, the same way for Limit and Recursive liquidity. A cut of the spread works for Recursive, which quotes two sides, but not for a one-sided Limit order, which has no spread. One fee rule for both means makers choose on rate and spread alone, not on how each kind is charged.
The app quotes every rate net of fees. See Fees.
Design trade-offs
- Discrete bins. Prices move in steps, not along a smooth curve.
- Fixed maturities. Period boundaries follow the market’s cadence; you cannot pick an arbitrary date.
- All or nothing. Multi-period trades never part-fill.
Shared liquidity
Every trade to a far maturity routes through every earlier period, so liquidity in the near periods serves all later maturities at once instead of being split across them. This is a property of the TimeBalance itself, not a routing add-on. Numbers on this page are illustrative.
A far-maturity trade steps through every earlier period.
Why it works
A TimeBalance is one continuous shape, cut into periods back to back. There is no separate token per maturity. So a trade to is the chain of trades across (see The AMM Book). The consequence:
The first period is on the path of every trade. Its liquidity is reused, not duplicated.
Compared with per-maturity pools
In per-maturity pool designs, each maturity is its own market with its own liquidity:- Depth has to be built separately for each maturity.
- A new maturity starts empty and splits LP capital further.
- Rolling means selling one maturity’s token and buying another’s, paying spread and slippage twice.
Capital efficiency (illustrative)
Illustrative only. Not a measurement of any live market.
Slippage adds up across the path, so a long trade does not get eight times the depth of one period. But every period on its path contributes, and each period’s liquidity serves every trade that passes through it.
There is a second effect. Liquidity is quoted as a rate on a slice of time, not as a full-size principal pool. A period’s leg of a trade only has to move the interest for that period. A Fixed trade of size over a period of length at rate needs about of interest side from the bin. For example, 1,000,000 USDS fixed at 5% across a 15-day period needs about USDS of interest side in that period.
Worked example: 5K USDS of LP serving a 1M USDS trade. An LP puts 5,000 USDS of interest side, , into the first period’s bin at a 6% bid. In a market with monthly maturities, a one-month period at 6% a year is about 0.5%. A Fixed taker hands over principal side and takes 0.5% of it as interest side. So the bin can take up to
of principal side before its interest side runs out. A one-month, 1M USDS Fixed trade needs only 5K USDS of LP. A two-month, 1M USDS Fixed trade needs about the same again in the second period: about 10K USDS in total.
The LP takes the other side. If the bid fills completely, the LP ends up holding about 1,000,000 USDS of principal side for that month: yield exposure on 1M for the period, bought at 6%. If the vault yields less than that, the LP loses part of its 5,000.
In a PT/YT design, an LP holds both the principal token and the underlying in one pool per maturity. A large trade swaps one for the other at full size, so the pool needs reserves of a similar order to the trade. On Moment, the LP only provides the interest for the period, so the liquidity needed scales with size × rate × time, not with size.
This is why TVL in LP need not be high for the market to take large trades. See For investors.
Rolling is incremental
A Fixed position that ends at holds . To extend it to , you only trade across the new periods: Nothing before is touched or repriced. You pay the market’s rates only on the extension, once. There is no sell-old, buy-new step.Limits
- Slippage compounds along the path. A thin period anywhere on the route raises the cost of every trade that crosses it.
- All or nothing. If any period cannot fill within your slippage tolerance, the whole trade reverts.
- Near periods matter most. They carry the most flow, so their depth sets the ceiling for long trades.