Appearance
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 - penaltyYield 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
| State | Condition | Behavior |
|---|---|---|
| ๐ LOCKED | now < lockup_end | Button disabled. Cannot redeem. Exception: penalty_type = 'NO_EARLY' โ redeem allowed, no penalty. |
| โ ๏ธ EARLY REDEMPTION | lockup_end โค now < maturity | Can redeem with penalty. |
| โ FREE | now โฅ maturity | No penalty. Standard confirm. |
Edge: If
lockup_days = 0, skip Locked. Ifmaturity_days = null, Free after lockup (no early window).
4 Penalty Types โ
| Type | Formula | Description |
|---|---|---|
| NO_EARLY | โ | No penalty. Investor can redeem at any time. |
| FLAT_FEE | penalty = penalty_fee_amount (fixed $) | Fixed dollar amount โ pool reserve. |
| PRINCIPAL_BASED | penalty = nominal_amount ร penalty_rate | % of principal โ pool reserve. |
| YIELD_BASED | penalty = 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 Status | Investor Sees |
|---|---|
| PROCESSING | Processing |
| COMPLETED | Completed |
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.00Full 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.00Investor 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.00Investor 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.25No 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.50Discounted 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).