S-Bills: fixed-term staking
S-Bills (fixed-term STANDARD staking) let a holder lock STANDARD into the SBills contract for one term at a rate fixed when they deposit. OneSource reads the deployed contract (0x163b36fd07622486cb889feef97bfbe2c1d7c05b on Robinhood Chain, deployed block 77,727,505, 2026-10-01) and serves the result as the six routes and five MCP tools on this page.
What an S-Bill is
A deposit opens one bill: it locks principal for one term (currently 15 days; see The rate for why that number can change) at the rate in force at deposit time, and escrows the bill's premium from the contract's own budget up front. The premium then vests evenly over the term (see Early exit). Three caps gate deposits: a 30M STANDARD total cap across all open bills, a 1M STANDARD per-wallet cap, and a 1,000 STANDARD minimum deposit. GET /v1/sbills/quote?amount= runs a live quote() call against the contract and reports whether a hypothetical deposit of that size would clear each cap, alongside the rate it would lock and the rate left for the next depositor.
The rate, and why it's per term, not annual
The contract exposes rate() and currentRate() as a fraction per term, not per year, and this API reports that fraction as a WAD integer, not a decimal: a rate_per_term_wad of 14700000000000000 means 1.47% over one term, not 1.47% annualized. The rate drifts upward between deposits (drifting: true) toward a ceiling, and resets downward on a fresh deposit; a configurable impactScale determines how much a single deposit moves it. Floor and ceiling (currently 1% and 7% per term) bound where it can land.
Every rate field in this API carries rate_basis: "per_term" and the term_seconds it was computed against, plus a derived apr_simple_wad: the rate times 365 days divided by the term in seconds (rate_wad * 31536000 / term_seconds), a simple (non-compounding) annualization of the per-term rate at the live term length. This is deliberately not an APY: the term itself is admin-adjustable (setTerm, bounded MIN_TERM/MAX_TERM), and there is no on-chain auto-roll, so nothing compounds automatically. A bill's premium is paid once at maturity, or partly forfeited on early exit (see Early exit for exactly what's forfeited). GET /v1/sbills/rate-history?hours= reports the drift curve and the exact rate any given deposit locked, but it's a Postgres-only read: a union of RateChanged events and 5-minute drift snapshots, not a live chain call. For the live rate right now, use GET /v1/sbills/current's rate_live block, GET /v1/sbills/quote, or a specific bill's exit/redeem quote.
Maturity, settle, redeem, and roll
A bill matures at term_start + term_seconds. After maturity, three things can happen, and only one of them is open to anyone:
settleis permissionless: anyone can call it on a matured bill to release its principal out of the contract's locked-principal total. Settling does not pay the bill out; it only frees the capacity that principal was occupying.redeemis owner-only: the bill's owner claims principal, premium, and any bonus, and the bill closes.rollis owner-only: the owner re-locks the bill for a new term at the then-current rate, compounding the premium into the new principal.
There is no on-chain auto-roll. A bill that matures and is never redeemed or rolled simply sits matured; nothing the contract does on its own moves it forward, a point the team's own stake page agrees with ("will not renew by itself"). GET /v1/sbills/bills/{id} reports a status_effective of matured for exactly this state, derived from comparing maturity_ts against the current time, and distinct from the terminal, event-sourced status (active, exited, redeemed).
Early exit
A bill owner can exit before maturity for a fee, taken from principal. The fee is dynamic: it moves between a floor and a cap (currently 2% and 15% of principal) by this formula, read off the team's own stake page and checked against several live quoteExit calls: fee_bps = floor_bps + (cap_bps - floor_bps) * pressure^2, truncated to an integer and capped at cap_bps, where pressure is the exiting bill's principal plus everything exited over the trailing window (currently 7 days), divided by whichever is larger: that same sum plus the contract's locked principal, or the pressure floor. So far this has only been verified at low pressure (under 0.07); treat it as a checked estimate, not a guaranteed match at every pressure level.
Premium vests linearly over the term (vested = premium * elapsed / term). Exiting early splits three ways: half the fee is burned, the other half plus the premium vested so far goes to remaining stakers through bonusPerPrincipal (a per-principal-unit bonus rate, emitted as BonusDistributed), and the unvested premium returns to the contract's budget rather than being paid to anyone. The observed Exited event reports this as vestedForfeited (the vested premium the leaver gives up) and bonusForfeited (any bonus the bill had accrued but hadn't claimed).
GET /v1/sbills/quote?amount= reports an exit_fee_estimate for a hypothetical bill of that size exiting the instant it opens (fee, payout, the pressure inputs, basis: "derived"), and GET /v1/sbills/current reports the same estimate at four fixed amounts (1,000 / 10,000 / 100,000 / 1,000,000 STANDARD) alongside fee_formula in words, so you can see roughly where a deposit would land before making one. Neither replaces a real quote: GET /v1/sbills/bills/{id} runs a live quoteExit() for an exact fee, payout, and forfeited-bonus figure for a specific existing bill, using that bill's own principal and the exit volume at the moment you ask. Either way, an early exit pays back principal minus the fee; the bill's premium and any stayer bonus are not paid, however long the bill was held. Time held only changes where the forfeited premium goes, not what the leaver receives.
Funding
The contract's premium budget was seeded with 1.5M STANDARD transferred from the protocol's incentives vault via the owner Safe (see Reserves, vaults, POL, and buybacks for what that vault is). That seed arrived as a plain transfer with no accompanying Funded event, which this API's loader distinguishes from a deposit by checking whether a Deposited event fired in the same transaction. No Funded event has been observed on mainnet yet. Any buyback-funded top-ups the team's site describes are likewise unobserved on-chain; this documentation reports what has actually been measured, not what is claimed.
How this changes supply reading
STANDARD locked in S-Bills is still counted in circulating_raw: this API does not redefine what "circulating" means, because every existing backing ratio and historical comparison reads circulating_raw as total supply. Instead, GET /v1/supply/current adds a sbills block (locked principal, total principal, premium budget, escrow, and the contract's own STANDARD balance) alongside a derived circulating_excluding_sbills_raw, so you can see circulating supply either way without anything moving underneath the figures that already existed. The same response adds burned_sbill_exit_cum_raw: the STANDARD burned as the burned half of early-exit fees, a measured subset of burned_cum_raw, the same pattern as the buyback-burn breakdown already on that route.
Not in the address registry
Unlike the other 15 Standard Reserve contracts (see Contracts and addresses), the SBills contract is not registered in the AddressRegistry. Its address is hard-coded in OneSource's indexer rather than resolved through the registry, verified the same way every address on this page is verified: cross-checked as present on-chain with non-zero bytecode at its stated deployment block. The deployed bytecode does embed a registry address and a STANDARD token address of its own, so OneSource's indexer reads those back from the contract on its hourly full pass and compares them against its own configured addresses, reporting the result as registry_matches_config / token_matches_config (booleans) on GET /v1/sbills/current. Both are null until that first hourly check has run. A false would mean the contract was redeployed or that OneSource is pointed at an impostor; treat that field, not the address's mere presence in this documentation, as the live check.
Where to look
| Question | Route | MCP tool |
|---|---|---|
| What are the current S-Bills staking terms: rate, APR, caps, pause state? | GET /v1/sbills/current | 1s_std_sbills_current |
| How has the S-Bill rate moved, and over what term lengths? | GET /v1/sbills/rate-history | 1s_std_sbills_rate_history |
| What would I lock in if I staked N STANDARD right now? | GET /v1/sbills/quote | 1s_std_sbills_quote |
| Show me one bill, or every bill for a wallet or status | GET /v1/sbills/bills, /v1/sbills/bills/{id} | 1s_std_sbills_bills |
| What would exiting or redeeming this bill pay out right now? | GET /v1/sbills/bills/{id} | 1s_std_sbills_bills |
| What has actually happened on the S-Bills contract? | GET /v1/sbills/events | 1s_std_sbills_events |
See Which tool answers: mechanics questions for how this fits alongside the rest of the protocol, and How to read a TSR response for what basis, serving_state, and _raw fields mean on every route above.