Non-liquid native SOL · delegated stake accounts
SOL goes in / out via on-chain delegation. Stake accounts are owned-by-user, deactivated per-epoch. Crosses into the liquid domain via Convert to PSOL only.
A — Stake-in SOL → delegated stake account
SOL detail → More → Stake SOL → Native Staking card.
SOL Detail
→ More menu
testID: unifiedFungibleDetail-stakeSol-cta
→
StakingMethodSelection
picker
→
ValidatorList
picker
→
StakeAmount
money-mover · this PR
→
StakeReview
real broadcast
→
CreateAndDelegateStatus
status
D — Native unstake kill candidate
From a delegated stake account. Deactivates the whole account (no amount picker). Withdraw is a separate return trip after the epoch boundary.
StakeAccountsList
picker
→
StakeAccountDetail
Unstake btnConvert btn ↘
→
StakeAccountDeactivateStatus
broadcasts deactivate ix · no PR #23967 screenshot
native unstake
⤳
StakeAccountWithdrawStatus
return trip after epoch · withdraw raw SOL
status
Kill tradeoff for the PM. Convert (bridge below) already absorbs the deactivate step for active accounts, so removing the standalone Unstake + Withdraw buttons is functionally covered — but a user who wants raw SOL back goes from one epoch wait (deactivate → withdraw) to two epoch waits (Convert deactivate → wait → Convert mint PSOL → liquid unstake → wait).
Bridge — Convert to PSOL non-liquid → liquid
The only way for SOL inside a native delegated stake account to enter the liquid domain. Same Convert review page branches on the source account's activation state — see useConvertStakeAccountReviewPageProps.ts.
StakeAccountDetail → Convert
entry from non-liquid
→
ConvertToPSOLInfo
info · first run
→
ConvertStakeAccountList
picker
→
ConvertStakeAccountReview (branches)
real broadcasttwo-mode
Source = active / activating
Broadcasts deactivate ix only. User waits until the next epoch boundary (~1–2 days), then re-enters Convert to finish. Same on-chain effect as Journey D's standalone Unstake — this is why Convert can subsume Journey D.
ConvertStakeAccountStatus
deactivate only
⤳
Re-enter Convert
after epoch ends
deep link supported
Source = inactive (already deactivated)
Broadcasts the stake-pool depositStake ix. The deactivated SOL is consumed by the pool and PSOL is minted to the user's wallet immediately. The user now sits in the liquid domain below.
ConvertStakeAccountStatus
mints PSOL
→
PSOL in wallet
crosses into liquid domain
Deep link entry:
DeepLinkDestination.ConvertStakeAccount →
ConvertStakeAccountDeepLinkPage:
DeepLinkPage
deep link
DeepLinkPage · error
deep link · error
Liquid PSOL · Phantom LST pool
Tokenized stake position — PSOL is a fungible token in the wallet. Entry is direct (Mint PSOL from SOL detail) or via the Bridge above. Exit back to raw SOL goes through liquid unstake.
B — Mint PSOL SOL → PSOL
SOL detail → Mint PSOL CTA, or Stake SOL → Liquid Staking card. Stakes SOL with the Phantom LST pool; mints PSOL in return.
SOL Detail
→ Mint PSOL
testID: unifiedFungibleDetail-mintLST-cta
→
MintPSOLInfo
info · first run
→
MintLiquidStakeAmount
money-mover · this PR
→
MintLiquidStakeReview
real broadcast
→
MintLiquidStakeStatus
status
Info-page variants by region / pool — MintPSOLInfoPage shown; alternates are MintPSOLUKInfoPage, MintJitoSOLInfoPage, PSOLMarketingPage. All funnel into MintLiquidStakeAmountPage.
C — Liquid unstake PSOL → SOL
PSOL detail → More → Unstake. Burns PSOL, queues SOL withdrawal. Only path back to raw SOL from the liquid domain.
PSOL Detail
→ More menu
→ Unstake
testID: unifiedFungibleDetail-unstake-cta
→
UnstakeLiquidStakeAmount
money-mover · this PR
→
UnstakeLiquidStakeReview
real broadcast
→
UnstakeLiquidStakeStatus
status
Money-mover review disclaimer: "Your unstaked PSOL can take up to 2 days to become available in your wallet" (commit 46e30f8).