Skip to content

Flag reference

Flag bit assignments are defined once, in SentinelFlags.sol, and vendored byte-identically by integrators. Bits 0–7 are per-token; bits 8–15 are global and apply to every token via statusOf. Assignments are append-only: a bit, once assigned, is never reused.

A status word of 0 means fully operational.

Per-token flags (bits 0–7)

BitHexFlagClassSource signalCleared by
00x01TOKEN_PAUSEDlevelpaused() / tokenPaused() on the Stock token; Paused() / Unpaused() eventswatcher, when the pause lifts
10x02ORACLE_PAUSEDleveloraclePaused() — issuer pauses pricing during corporate-action processing. Advisory per official docs: the feed may still return values, so staleness checks stay primarywatcher, when unpause is observed
20x04FEED_STALElevelChainlink latestRoundData().updatedAt older than the session-aware threshold (26h default in session — push feeds update on deviation or ~24h heartbeat; grows across weekends)watcher, on the next fresh update
30x08MULTIPLIER_PENDINGlevelnewUIMultiplier() scheduled with a future effectiveAt() — a split or dividend reinvestment is queuedwatcher, once effective or cancelled
40x10ADMIN_ACTIONlatchingany burn Transfer whose outer tx is contract-mediated (multisig, relayer, multicall) or carries the adminBurn(address,uint256) selector; UIMultiplierUpdated events; pause blips between polls; unfetchable burn txs flag anyway — fail toward reviewoperator CLI, after review
50x20NOT_MONITOREDsynthesizedtoken absent from the owner-managed monitored set (setMonitored). The registry synthesizes this bit in statusOf; updaters cannot write it, and no recommended tolerated mask includes it — unknown tokens fail closedowner, by registering the token via setMonitored(address[], true)

Global flags (bits 8–15)

BitHexFlagClassSource signalCleared by
80x0100REGISTRY_PAUSEDlevelpaused() on the AccessControlsRegistry — halts all stock-token transfers at oncewatcher, when the pause lifts
90x0200IMPLEMENTATION_UPGRADEDlatchingUpgraded event on the shared beacon, or implementation() differing from the known-good address (belt and suspenders) — every stock token's code just changedoperator CLI, after the new code is reviewed
100x0400BLOCKLIST_EVENTlatchingBlocked / Unblocked events on the registry blocklistoperator CLI, after exposure review
110x0800ROLE_CHANGEDlatchingRoleGranted / RoleRevoked / RoleAdminChanged on the registryoperator CLI, after review
120x1000MARKET_CLOSEDlevel24/5 session calendar: weekends and full-day US market holidays (ET)watcher, at the next session open
130x2000SEQUENCER_DOWNlevelRobinhood Chain block production lagging wall clock by > 120swatcher, when production resumes

Masks

ConstantValueMeaning
ALL_TOKEN_FLAGS0x3Fevery defined per-token bit, including the synthesized NOT_MONITORED
WRITABLE_TOKEN_FLAGS0x1Fper-token bits an updater may write — excludes NOT_MONITORED
ALL_GLOBAL_FLAGS0x3F00every defined global bit

The registry rejects writes that set undefined bits — or the registry-synthesized NOT_MONITORED bit — on both raise and clear paths: a watcher bug that confuses token and global words, or tries to fake coverage, reverts instead of silently no-oping.

Choosing a tolerated mask

Tolerating a flag means "my risk model already prices this condition":

  • MARKET_CLOSED — tolerate it if your parameters (e.g. a lending market's LLTV) already account for weekend/holiday gap risk; that's the entire point of sizing LLTVs from gap statistics. Pair it with a staleness allowance that stretches across the closure.
  • MULTIPLIER_PENDING — tolerable when your price source already reflects scheduled multipliers; the official Chainlink feeds do (the feed price includes the multiplier).
  • Everything else says the issuer or the data layer is doing something unusual right now — tolerate at your peril.

See Integrating for how the mask is enforced.

Unaudited, day-one software. MIT licensed.