Skip to content

Redemption โ€‹

How investors exit positions. Payout is locked at NAV-at-request time. Yield is claimed separately (not included in redemption payout). Single-stage: Admin approve โ†’ reserve check โ†’ payout. For how NAV changes are calculated and applied, see Writedown & NAV. ๐ŸŸก BD3 ๐ŸŸก BD2 ๐ŸŸก BD6

Payout Formula (Yield claimed separately) โ€‹

Token value       tokens_minted ร— nav_at_request
Early penalty     calculated per penalty_type (if applicable)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Total redemption  token_value - penalty

Yield is claimed separately via claimYield() โ€” not included in redemption.

3-State Redemption Model (R16) โ€‹

โš ๏ธ Deposit โ†’ Lockup End โ†’ Maturity โ†’ โˆž

lockup_end = invested_at + pool.lockup_daysmaturity_date = invested_at + pool.maturity_days

StateConditionBehavior
๐Ÿ”’ LOCKEDnow < lockup_endButton disabled. Cannot redeem. Exception: penalty_type = 'NO_EARLY' โ†’ redeem allowed, no penalty.
โš ๏ธ EARLY REDEMPTIONlockup_end โ‰ค now < maturityCan redeem with penalty.
โœ… FREEnow โ‰ฅ maturityNo penalty. Standard confirm.

Edge: If lockup_days = 0, skip Locked. If maturity_days = null, Free after lockup (no early window).

4 Penalty Types โ€‹

TypeFormulaDescription
NO_EARLYโ€”No penalty. Investor can redeem at any time.
FLAT_FEEpenalty = penalty_fee_amount (fixed $)Fixed dollar amount โ†’ pool reserve.
PRINCIPAL_BASEDpenalty = nominal_amount ร— penalty_rate% of principal โ†’ pool reserve.
YIELD_BASEDpenalty = accrued_yield ร— penalty_rate% of accrued yield forfeited โ†’ pool reserve. (e.g., 0.50 = 50%)

YIELD_BASED edge case (yield already claimed): from_unclaimed = min(unclaimed_yield, penalty), from_principal = penalty - from_unclaimed. If fully claimed โ†’ penalty from principal.

All penalties โ†’ pool reserve. Admin cannot waive.

Investor-Facing Status Labels โ€‹

Internal StatusInvestor Sees
PROCESSINGProcessing
COMPLETEDCompleted

Redemption by NAV Scenario โ€‹

Category A: Standard Entry (invested at $1.00) โ€‹

โœ… A1 โ€” Normal Redemption

NAV at investment: $1.00 ยท NAV at redemption: $1.00

Deposit           $10,000 at NAV $1.00 โ†’ 10,000 tokens
Token Value       10,000 ร— $1.00 = $10,000.00
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $10,000.00

Full principal returned. Yield is claimed separately via claimYield().

โš ๏ธ A2 โ€” Redemption During Writedown

NAV at investment: $1.00 ยท NAV at redemption: $0.85

Deposit           $10,000 at NAV $1.00 โ†’ 10,000 tokens
Token Value       10,000 ร— $0.85 = $8,500.00
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $8,500.00

Investor absorbs 15% NAV loss on token value. Yield is claimed separately via claimYield() โ€” still accrues on nominal $10,000. NAV is locked at request time โ€” if NAV drops further after request, investor keeps $0.85.

Category B: Discounted Entry (invested below $1.00 โ€” "Fair Entry") โ€” 3 scenarios

๐Ÿ“ˆ B1 โ€” Invested Low, NAV Recovered

NAV at investment: $0.80 ยท NAV at redemption: $0.95

Deposit           $10,000 at NAV $0.80 โ†’ 12,500 tokens
Token Value       12,500 ร— $0.95 = $11,875.00
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $11,875.00

Investor gained from NAV recovery ($0.80 โ†’ $0.95). Got 12,500 tokens instead of 10,000 โ€” the "fair entry" principle with upside.

โžก๏ธ B2 โ€” NAV Unchanged, Yield Only

NAV at investment: $0.85 ยท NAV at redemption: $0.85

Deposit           $10,000 at NAV $0.85 โ†’ 11,765 tokens
Token Value       11,765 ร— $0.85 = $10,000.25
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $10,000.25

No NAV movement โ€” investor gets principal back. Yield claimed separately.

๐Ÿ”ป B3 โ€” Invested Low, NAV Dropped Further

NAV at investment: $0.85 ยท NAV at redemption: $0.70

Deposit           $10,000 at NAV $0.85 โ†’ 11,765 tokens
Token Value       11,765 ร— $0.70 = $8,235.50
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $8,235.50

Discounted entry does NOT guarantee safety. NAV dropped further $0.85 โ†’ $0.70. Investor loses ~14% on token value.

๐Ÿ“‹ In all 5 scenarios

Redemption payout = token_value - penalty. Yield is claimed separately via claimYield() โ€” not included in redemption. Yield accrues on nominal deposit amount ($10,000), never on NAV-adjusted token value. NAV is locked at the moment of redemption request and cannot be recalculated after submission.

Payout Example โ€‹

Joob EWA Fund ยท NAV $0.92 ยท 10,000 tokens held
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Token Value       10,000 tokens ร— $0.92 = $9,200.00
Penalty           None (FREE state)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Redemption Payout $9,200.00

Formula: redemption = (tokens ร— nav_at_request) - penalty
Yield ($184.93 accrued) is claimed separately via claimYield().

Redemption Flow (By Pool Type) โ€‹

Roles: ๐Ÿ”ต Investor ยท ๐ŸŸฃ Fund Manager ยท ๐ŸŸข System / Smart Contract

Fund Pool โ€‹

Investor requests redemption ๐Ÿ”ต Investor

Confirmation modal: token count, NAV price, token value, accrued yield, penalty (if applicable), total payout.

NAV snapshot locked โ†’ REQUESTED ๐ŸŸข System

nav_at_request captured. Payout = tokens ร— nav_at_request + yield - penalty. FIFO queue.

Fund Manager acknowledges โ†’ FM_ACCEPTED ๐ŸŸฃ Fund Manager

FM reviews request, confirms fund has liquidity โ†’ status = FM_ACCEPTED.

Fund sends USDC directly โ†’ PROCESSING โ†’ COMPLETED ๐ŸŸฃ Fund Manager

transfer_source = 'FUND'. payout_tx_hash confirmed on-chain.

AS Pool โ€” Smart Contract Escrow โ€‹

Investor requests redemption ๐Ÿ”ต Investor

NAV snapshot locked โ†’ status = REQUESTED.

Contract validates LP burn โ†’ auto-releases USDC ๐ŸŸข System

contract_validated_at โ†’ auto_released_at โ†’ PROCESSING โ†’ COMPLETED. transfer_source = 'PLATFORM'

AS Pool โ€” Multi-Sig Escrow (Deprecated) โ€‹

Investor requests redemption ๐Ÿ”ต Investor

NAV snapshot locked โ†’ status = REQUESTED.

Approval requested โ†’ co-signers sign โ†’ USDC released ๐ŸŸข System

approval_requested_at โ†’ cosigned_at โ†’ PROCESSING โ†’ COMPLETED. transfer_source = 'PLATFORM'

Fund Pool โ€” No Escrow (Deprecated) โ€‹

Investor requests redemption ๐Ÿ”ต Investor

NAV snapshot locked โ†’ status = REQUESTED.

Fund notified โ†’ fund sends USDC โ†’ transfer confirmed ๐ŸŸข System

fund_notified_at โ†’ fund_sent_at โ†’ transfer_confirmed_at โ†’ PROCESSING โ†’ COMPLETED. transfer_source = 'FUND'

๐Ÿšจ Failure Path (all flows)

If transfer fails โ†’ status = FAILED. failure_type + error_message logged. Admin can retry. Legacy REJECTED status kept for backward compat but FAILED is preferred for new records.

Key Rules โ€‹

๐Ÿ“ธ NAV Snapshot

nav_at_request is locked at request time from pools.nav_per_token. If NAV drops further after request, investor keeps the higher NAV. If NAV recovers, payout stays at the lower request-time NAV. Redemption payout = tokens ร— nav_at_request - penalty. Yield is claimed separately via claimYield().

๐Ÿ“Š Yield Basis

Accrued yield calculated on nominal balance (not NAV-adjusted token value). Full yield paid to incentivize patience even in writedown pools.

๐Ÿ”’ Early Redemption

If redemption during lockup period โ†’ per-pool penalty applies (e.g., 50% of accrued yield forfeited). Configurable per pool.

๐Ÿ“‹ FIFO (First-In, First-Out) Processing

Oldest requests processed first. Admin checks pool liquidity before approval. Insufficient liquidity โ†’ request stays in queue (not rejected).