Skip to content

Status State Machines

All status fields and their valid transitions across the system.

Deposit Status deposits.status

Deposit flow differs by pool type. Both share the same 5-state enum but trigger different sub-steps.

AS Pool (Pool Smart Contract — non-custodial)

PENDINGPROCESSINGCOMPLETED

PROCESSINGFAILED (transfer or mint error)

🟢 System Flow

USDC enters Pool Contract → LP auto-minted (PLATFORM_ISSUED) → COMPLETED. No receipt token.

Fund Pool (Fund Manager-managed)

PENDINGPROCESSINGCOMPLETED

PENDINGREFUNDED (D+7, LP not issued)

🟣 FM Flow

USDC deposited → FM notified (fm_notified_at) → FM issues LP (FUND_ISSUED) → LP minted (lp_minted_at) → receipt burned (receipt_burned_at) → COMPLETED.

Status Definitions

StatusDescription
PENDINGDeposit received, awaiting LP issuance.
PROCESSINGLP issuance or transfer in progress.
COMPLETEDLP issued, receipt burned, USDC released to pool/fund.
REFUNDEDLP not issued within 7 days (D+7 rule), USDC returned to investor.
FAILEDTransfer, mint, or notification error. failure_type + error_message logged.
KYC Status users.kyc_status

NOT_STARTEDIN_REVIEWAPPROVED

IN_REVIEWREJECTED

Status Definitions

StatusDescription
NOT_STARTEDUser registered, KYC not yet initiated.
IN_REVIEWSumSub verification underway.
APPROVEDKYC passed, SBT minted on-chain.
REJECTEDFailed verification. See reject_type (RETRY / FINAL).
Redemption Request Status redemption_requests.status

Redemption flow differs by pool type and escrow model. All flows start with REQUESTED and end with COMPLETED or FAILED.

Fund Pool

FM acknowledges → sends funds directly

REQUESTEDFM_ACCEPTEDPROCESSINGCOMPLETED

🟣 FM Flow

FM sees request → acknowledges (FM_ACCEPTED) → sends USDC from fund wallet → payout_tx_hash confirmed → COMPLETED. transfer_source = 'FUND'

AS Pool — Smart Contract Escrow

REQUESTEDPROCESSINGCOMPLETED

🟢 System Flow

Contract validates LP burn → auto-releases USDC → PROCESSING → on-chain confirmation → COMPLETED. transfer_source = 'PLATFORM' · Timeline: contract_validated_atauto_released_at

AS Pool — Multi-Sig Escrow Deprecated

REQUESTEDPROCESSINGCOMPLETED

Approval requested to co-signers → M-of-N threshold met → USDC released → COMPLETED. transfer_source = 'PLATFORM' · Timeline: approval_requested_atcosigned_at

Fund Pool — No Escrow Deprecated

REQUESTEDPROCESSINGCOMPLETED

Fund notified → fund sends USDC directly → transfer confirmed on-chain → COMPLETED. transfer_source = 'FUND' · Timeline: fund_notified_atfund_sent_attransfer_confirmed_at

🚨 Failure Path (all flows)

PROCESSINGFAILED (transfer error, timeout, or notification failure)

failure_type + error_message logged. Admin can retry or escalate.

Status Definitions

StatusDescription
REQUESTEDInvestor submitted request. nav_at_request locked. Display as "Pending".
FM_ACCEPTEDFund Manager acknowledged (Fund Pool only).
PROCESSINGFunds being sent (escrow release or direct transfer).
COMPLETEDUSDC received by investor. payout_tx_hash recorded.
REJECTEDLegacy failed status (display as "Failed", kept for backward compat).
FAILEDTransfer or notification error (R15 new, preferred over REJECTED).
Pool Status Flags pools table

Two flags control pool behavior — investment stays open during NAV changes.

FlagDescription
is_pausedManual admin toggle. Paused pools hidden from dashboard (unless user has position). No new deposits allowed. The only way to block investment — NAV changes never auto-block.
nav_per_tokenDecimal (default $1.00, capped at $1.00 max, no floor). Updated by Oracle via updateNAV() with 24h timelock for decreases; increases apply immediately. Drives token minting and redemption payout calculations.
Fund Status funds.status

ACTIVEINACTIVE

Status Definitions

StatusDescription
ACTIVEFund operational, pools visible and accepting investments.
INACTIVEFund suspended. Existing positions remain. Reversible by admin.

R15 Change

Replaced old 3-state issuer status (ACTIVE/PAUSED/OFFBOARDED) with simpler 2-state fund status. "Offboarded" is now handled by setting INACTIVE + closing all associated pools via lifecycle_status = 'CLOSED'.

NAV Update Status nav_history.status

PENDINGAPPLIED

Status Definitions

StatusDescription
PENDINGNAV decrease submitted. 24h timelock active. Admin can cancel during this window.
APPLIEDTimelock expired, new NAV applied to pool. NAV increases skip PENDING and apply immediately.
Yield Distribution Status yield_distributions.status

Yield distribution flow. Applies to both yield_distributions (pool-level) and yield_distribution_investors (per-investor).

DISTRIBUTING Model (auto pro-rata) Deprecated

PENDINGPROCESSINGDISTRIBUTED

Admin creates distribution → system calculates pro-rata shares → tx submitted (tx_submitted_at) → on-chain confirmed → DISTRIBUTED.

MANUAL_CLAIM Model (investor-initiated)

PENDINGPROCESSINGDISTRIBUTED

🔵 Investor Flow

Admin creates distribution → yields available for claim → investor claims (claimed_at) → DISTRIBUTED.

🚨 Failure Path

PROCESSINGFAILED

failure_type: FM_NOTIFICATION_FAILED, DISTRIBUTION_TX_FAILED, CLAIM_PROCESSING_FAILED. Admin can retry.

Status Definitions

StatusDescription
PENDINGDistribution created, awaiting processing.
PROCESSINGTransaction being submitted or claim being processed.
DISTRIBUTEDYield confirmed delivered/claimed.
FAILEDTransaction or notification error. failure_type + error_message logged.
SBT (Soulbound Token) Status users.sbt_status

NOT_MINTEDMINTED

NOT_MINTEDFAILED (mint tx reverted or timed out)

Status Definitions

StatusDescription
NOT_MINTEDKYC not approved or mint not triggered yet.
MINTEDOn-chain confirmed, sbt_tx_hash stored.
FAILEDMint tx reverted or timed out. sbt_error logged. Admin can retry.

R15 Note

MINTING intermediate state removed — near-instant on Base L2. reject_type: RETRY (user can resubmit) vs FINAL (permanently rejected).

Pool Lifecycle Status pools.lifecycle_status

DRAFTUPCOMINGACTIVEMATURED

ACTIVE + writedown (NAV < 1.0) + is_paused toggle replaces former DISTRESSED state

Any state → CLOSED (admin manual close)

Status Definitions

StatusDescription
DRAFTSaved, not published. Editable + deletable.
UPCOMINGPublished, visible to investors, before start_date.
ACTIVEOpen for investment. start_date reached. Writedown scenario: NAV < 1.0 → "Active + Writedown" badge + alert banner. Severe: admin sets is_paused = true → "Paused" banner + invest/redeem blocked.
CLOSEDAdmin manually closed.
MATUREDend_date reached. Auto-redemption triggered.

Auto-Transitions (Scheduler)

TransitionTrigger
DRAFTUPCOMING🔴 Admin clicks "Publish" → published_at set. Requires start_date.
UPCOMINGACTIVE🟢 Scheduler checks daily — when start_date reached, auto-transitions.
ACTIVEMATURED🟢 When end_date reached (if set), auto-transitions. Auto-redemption triggered.
Any → CLOSED🔴 Admin manually closes pool. display_after_close determines visibility.