Rising Tide Developers
Reference

Status Machines

All protocol status enums with valid state transitions, triggers, and domain applicability.

Every major protocol entity has a status field that follows a defined state machine. This page documents all valid states, transitions, and the conditions that trigger each transition. Terminal states have no outgoing transitions.


ProductStatus

The lifecycle state of a SmartProduct. Stored as the status column on the SmartProduct table.

States

StatusMeaningTerminal?
DRAFTContract not yet deployed. Product is being configured off-chain.No
PUBLISHEDContract deployed on-chain. Accepting ProductInstance mints.No
LOCKEDMinting window closed. Finalization phase in progress.No
SETTLEDResults finalized. Prizes are claimable by winners.No
FAILEDContract deployment or critical execution failed.No
ARCHIVEDProduct removed from active listing. No further changes.Yes

Valid transitions

FromToTrigger
DRAFTPUBLISHEDContract deploy transaction confirmed on-chain (chainhook event)
DRAFTFAILEDDeploy transaction fails or times out
DRAFTARCHIVEDCreator or admin archives a draft
PUBLISHEDLOCKEDThe tournament is locked on chain (PREDICTION domain only)
PUBLISHEDFAILEDCritical execution failure (PREDICTION domain only)
PUBLISHEDARCHIVEDCreator or admin archives the product
LOCKEDPUBLISHEDThe tournament is unlocked on chain (PREDICTION domain only)
LOCKEDSETTLEDSettlement transaction confirmed - results written on-chain
LOCKEDARCHIVEDAdmin archives a locked product (dispute or abandonment)
SETTLEDARCHIVEDCreator or admin archives after settlement period
FAILEDARCHIVEDCleanup - failed products are archived

Domain applicability

Not all status values apply to all domains:

StatusPAGEEVENTPREDICTIONGAME
DRAFTYesYesYesYes
PUBLISHEDYesYesYesYes
LOCKEDNoNoYesNo
SETTLEDNoNoYesNo
FAILEDYesYesYesYes
ARCHIVEDYesYesYesYes

Every domain except PREDICTION follows the path: DRAFT - PUBLISHED - ARCHIVED (or FAILED - ARCHIVED).

PREDICTION products can also pass through LOCKED and SETTLED before archival.


GameMatchStatus

A GAME lobby stays PUBLISHED while it hosts matches; each match carries a status of its own.

StatusMeaning
IN_PROGRESSBoth seats bought in and the match started. Moves land here
WONA line was made. The winner has not claimed the kitty yet
DRAWNA full board with no line, or a stalled match closed as a draw. Seats have not all claimed yet
SETTLEDPaid out: the winner claimed (and holds the trophy), or every seat of a draw claimed its half
OPENIn the enum and never written; a match is created IN_PROGRESS when it starts

IN_PROGRESS -> WON or DRAWN -> SETTLED. A settled match is final.


InviteStatus

The lifecycle state of an Invite. Stored as the status column on the Invite table.

States

StatusMeaningTerminal?
DRAFTInvite is being composed. Code exists but has not been distributed.No
SENTThe holder has sent it - the app yields a claim link and the person delivers it themselves; there is no email dispatch.No
CLAIMEDRecipient redeemed the invite code. Role-on-claim (if set) was granted.Yes
REVOKEDThe creator (or an Admin) cancelled the invite. Code is no longer valid.Yes
EXPIREDTTL exceeded without claim. Automatically set by background process.Yes

Valid transitions

FromToTrigger
DRAFTSENTThe creator or the assigned holder sends the invite, optionally binding it to an email, X handle or address
DRAFTEXPIREDAutomatic - the daily reaper silently expires an assigned draft whose date passed unsent
SENTCLAIMEDRecipient presents a valid code at the claim endpoint
SENTREVOKEDThe creator (or an Admin) revokes after sending (code immediately invalidated)
SENTEXPIREDAutomatic - the daily reaper sweeps invites whose TTL passed without a claim

Notes

  • Only a SENT invite can be revoked. A DRAFT has reached nobody, so it is discarded with a hard delete (rtClient.invites.remove) rather than a status.
  • Assigning an invite to a holder is not a status: an assigned invite is still DRAFT until someone sends it.
  • Role-on-claim (optional field) is granted via grantRoleToUser at the CLAIMED transition, creating an audit trail via UserRole.grantedViaInviteId.
  • The claim endpoint returns a generic { valid: false } for EXPIRED, REVOKED, or nonexistent codes to prevent status enumeration.
  • Daily mint quotas gate invite creation, not claiming: Member, Open Beta and Early Adopter = 0/day during the alpha, Admin = unlimited. Claiming a valid code is never quota-limited.

FundingGroupStatus

The lifecycle state of a FundingGroup. Stored as the status column on the FundingGroup table.

States

StatusMeaningTerminal?
PENDINGApplication submitted. Awaiting admin review.No
APPROVEDAdmin approved. Group can receive FUNDING_GROUP revenue splits.No
VERIFIEDOn-chain proof of settlement received.No
REJECTEDAdmin denied the application. Cannot be reversed.Yes
SUSPENDEDTemporarily disabled by admin for policy review.No

Valid transitions

FromToTrigger
PENDINGAPPROVEDAdmin grants approval
PENDINGREJECTEDAdmin denies application
APPROVEDVERIFIEDChainhook confirms on-chain settlement to this group
APPROVEDSUSPENDEDAdmin suspends for policy review
VERIFIEDSUSPENDEDAdmin suspends a verified group
SUSPENDEDAPPROVEDAdmin restores from suspension (was previously APPROVED)
SUSPENDEDVERIFIEDAdmin restores from suspension (was previously VERIFIED)

Notes

  • REJECTED is terminal. A rejected organization must submit a new FundingGroup application.
  • FundingGroups in APPROVED or VERIFIED status can be selected by creators for FUNDING_GROUP splits.
  • SUSPENDED groups cannot receive new allocations and are hidden from the creator picker UI.
  • The SUSPENDED - APPROVED vs SUSPENDED - VERIFIED restoration depends on whether the group had been verified before suspension.

PendingTxStatus

The lifecycle of a broadcast transaction as the protocol tracks it, from broadcast to a terminal outcome. Stored as the status column on the PendingTransaction table and readable through rtClient.pendingTransactions. This machine is why a client can close on broadcast: the server owns confirmation.

States

StatusMeaningTerminal?
BROADCASTRegistered at broadcast; not yet processed. Covers both in-mempool and mined-but-unprocessed - "mined" is a fact carried by the row's block columns, not a status.No
REPLAYINGThe reconciler has asked the ingestion layer to re-deliver a mined transaction whose event never arrived.No
CONFIRMEDThe backend processed the transaction's event - terminal success.Yes
HANDLER_FAILEDThe event arrived but processing threw; the dead-letter queue owns recovery.No
FAILEDThe chain reports the transaction aborted on-chain.Yes
DROPPEDNever mined within the abandonment window, or recovery attempts were exhausted.No*

Valid transitions

FromToTrigger
BROADCASTCONFIRMEDEvent processed - inline by the handler on delivery, or by the reconciler observing the processed record
BROADCASTREPLAYINGReconciler finds the transaction mined but its event undelivered
REPLAYINGCONFIRMEDThe re-delivered event processes
BROADCAST / REPLAYINGHANDLER_FAILEDThe event arrived and the handler threw
HANDLER_FAILEDCONFIRMEDDead-letter replay succeeds
BROADCASTFAILEDChain reports an on-chain abort
BROADCASTDROPPEDAbandonment window elapses un-mined, or attempts exhaust
DROPPEDBROADCAST*Operator reopens a retry-exhausted drop - a transaction the chain accepted is never abandoned silently

AppAccessStatus

Whether a user may act inside a gated app. One row per (user, app) on the AppAccessGrant table; the row flips rather than being deleted, so access history survives.

StatusMeaningTerminal?
GRANTEDThe user may act in this app.No
REVOKEDAccess withdrawn; the row remains as history.No

Transitions are operator- or invite-driven: a claim mints GRANTED, an operator can revoke, and a revoked grant can be re-granted. Enforcement is fail-closed on the acquisition and participation routes; owner-property actions (burn, transfer, detach) are deliberately exempt - ownership never expires.


RenderJobStatus

Out-of-band rendering work (rasterize + store an edition's artwork), enqueued at the event and drained on a schedule.

StatusMeaningTerminal?
PENDINGEnqueued, not yet rendered.No
RUNNINGA worker tick claimed it.No
COMPLETEDThe render and store succeeded.Yes
FAILEDMax attempts exhausted - terminal and operator-owned.Yes

AutoDetachJobStatus (the post-render job that archives an edition on a custodial owner's behalf) follows the same shape, adding SKIPPED for owners whose keys the protocol does not hold - recorded for visibility, no work to do.


ChainhookStatus

The registration lifecycle of a per-contract event subscription.

StatusMeaningTerminal?
PENDINGCreated, registration not yet confirmed upstream.No
ACTIVERegistered and delivering.No
RETRYINGRegistration or delivery is being retried.No
FAILEDRegistration failed; retry budget available.No
ABANDONEDRetry budget exhausted - operator-owned.No

Ingestion does not depend on this machine alone: the chain-sourced floor reads the chain directly as an independent second route, so a subscription outage delays events rather than losing them. See Chainhooks.