zSMB Redeem Tab States
Every state an investor with a connected wallet can land in on the Redeem tab, what they see, and what is happening behind it. Loading and refreshing states are left out on purpose.
Source of truth: apps/dapp/src/app/(dashboard)/vaults/[slug]/deposit/redeem-flow.tsx on main as of 2026-09-09. Examples use zSMB / USDC; the same rules apply to any vault and deposit asset.
1. The four zones of the tab
Position strips
Zero to four strips describing money already in motion for this wallet on the selected chain. Each strip appears only when its on-chain bucket is non-zero, always in this order: Returned zSMB → Claimable USDC → Unfunded USDC → Processing (redemption or cancellation). Claimable and Unfunded never show together.
Request form
Amount of zSMB to redeem, MAX, the chain selector, and the read-only Estimated receive row. Editable in almost every state; the three lock cases are in section 4.
Main action
One button whose label is picked by a strict priority ladder (section 5). It is the only way to submit a request. Reads "Request redemption" normally and "Add to redemption" when this wallet already has pending, claimable or unfunded USDC on this chain.
Callouts
The price warning is always shown. A second warning explains the block whenever the wallet is not admitted to the vault (frozen or not whitelisted).
2. What decides the state
Five independent inputs. Every state on this tab is a combination of these.
| Input | Possible values | Where it comes from | Scope |
|---|---|---|---|
| Wallet access | Whitelisted · Not whitelisted (never added, membership expired, or an unexplained refusal) · Frozen | The zSMB share token's transfer hook on-chain (Centrifuge "FullRestrictions"). Three yes/no verdicts are read: may receive shares, may send shares to escrow, may claim proceeds. Freeze is checked before membership, so a frozen wallet is frozen no matter its whitelist status. | Per wallet, per chain. A wallet can be whitelisted on Ethereum and not on Base. |
| Chainalysis risk | Low / Medium (fine) · High / Severe (risky) | Zivoe API calling Chainalysis, cached one hour. Only High and Severe change anything. | Per wallet, all chains. |
| Wallet chain vs selected chain | Match · Mismatch | The chain the wallet is connected to compared with the chain picked in the form's selector. Picking a chain prompts a wallet switch immediately. | Per session. |
| Redemption position | Any combination of: Pending zSMB · Claimable USDC · Unfunded USDC · Returned zSMB · Cancellation processing flag | Centrifuge SDK investment read plus a direct read of the request manager and the chain's pool escrow (the SDK hides an unfunded claim). | Per wallet, per chain. The tab only shows the selected chain's position. |
| Chain supports cancellation | Yes (Ethereum only) · No (Pharos, Base, Arbitrum, Avalanche, Optimism, HyperEVM, X Layer, BNB) | Product flag in the chain catalog. Cancelling needs a hub-side unwind that is only automated where hub and spoke are the same chain. | Per chain. |
3. Wallet status × what each control does
Rows are the wallet's status on the selected chain. Columns are the controls. Strips still only appear when their bucket is non-zero; the cell says what the control does when the strip is there.
| Wallet status | Request form (B) | Main action (C) | Cancel request | Claim zSMB (returned) | Claim USDC | Unfunded USDC strip | Callout (D) |
|---|---|---|---|---|---|---|---|
| Whitelistedall verdicts pass | OPEN | OPENRequest redemption or Add to redemption | OPENEthereum only | OPEN | OPENWaits while Returned zSMB exists: Claim your returned zSMB first. | Amount only, no button1,020.55 USDC approved, awaiting liquidity on Arbitrum | Price warning only |
| Not whitelistednever added / expired / unexplained | LOCKEDInput, MAX disabled. Chain selector stays open so the user can switch to a chain where they are whitelisted. | BLOCKEDWallet Not Whitelisted | BLOCKEDRequires a whitelisted wallet. | BLOCKEDRequires a whitelisted wallet. | OPENProceeds already owed are exempt from the whitelist. Headline still reads ready to claim. Exception: if Returned zSMB also exists the USDC claim is stuck behind it and the hint says Requires a whitelisted wallet. | Amount only, no extra hint | Price warning + You must be whitelisted to interact with this vault. Contact us at inquire@zivoe.com to request access. |
| Frozenoperator suspended wallet on this chain | LOCKEDSame as above; chain selector open. | BLOCKEDWallet Frozen | BLOCKEDThis wallet is frozen. | BLOCKEDThis wallet is frozen. | BLOCKEDHeadline changes to 1,020.55 USDC approved + This wallet is frozen. | Amount + This wallet is frozen.Two things stand between the wallet and its USDC; both are named. | Price warning + This wallet is frozen on this chain and cannot transact in this vault. Contact us at inquire@zivoe.com if you believe this is a mistake. |
| Chainalysis High / Severeany whitelist status | OPENEditable, but there is no way to submit. | SWAPPEDDisconnect | SWAPPEDDisconnect | SWAPPEDDisconnect | SWAPPEDDisconnect | Amount only | Price warning (+ access callout if also not admitted) |
| Wallet on another chainselected Base, wallet on Ethereum | OPENShows the selected chain's balance and position. | SWAPPEDSwitch to Base; wins over every other label. | BLOCKEDNo hint; the main button says what to do. | BLOCKED | BLOCKED | Amount only | Price warning (+ access callout if not admitted on the selected chain) |
Fail-open rule. If the access check itself fails (RPC error), nothing is blocked: the tab shows a toast Error checking wallet access, every control stays open, and a transaction that would revert is caught by the pre-sign simulation instead, with copy such as This redemption request can't be submitted from this wallet right now. A failed read is treated as a fetch problem, never as a verdict.
4. When the request form is locked
Outside of loading and refreshing, the amount input and MAX are disabled in exactly three situations. The chain selector is only locked by the third.
| Situation | What the user sees | Why | How it clears |
|---|---|---|---|
| Wallet not admittednot whitelisted or frozen on this chain | Greyed input and MAX, main button Wallet Not Whitelisted / Wallet Frozen, callout D. Chain selector still works. | The vault would revert the request on-chain; there is no amount worth entering. | Operator whitelists or unfreezes the wallet, or the user selects a chain where they are admitted. |
| Cancellation processing | Greyed input and MAX, strip Cancelling redemption request for 1,000.00 zSMB, main button Cancellation in progress. Cancel control hidden. | A new request reverts on-chain until the hub finishes unwinding the cancellation. | Automatically. The tab polls the position every 10 seconds; when the unwind lands, the zSMB shows up as a Returned zSMB strip. |
| A transaction is in flightrequest, cancel, either claim | Form and chain selector greyed; the active button shows Signing Transaction... then Requesting redemption... / Cancelling... / Claiming USDC... / Claiming zSMB.... Every other button is disabled. | All four writes share one transaction path, so they take turns. | When the transaction confirms or fails. Data refetches, then the form unlocks. |
Not a lock: a failed price estimate. The Estimated receive row shows Unable to estimate USDC. Retry but the request can still be submitted, because the estimate is indicative anyway. The final amount uses the price at processing time.
5. Main action label, in priority order
The first matching rule wins. This is why a wallet on the wrong chain never sees "Wallet Frozen": the switch comes first.
- Connect WalletNo wallet connected (out of scope here, listed for completeness).
- DisconnectChainalysis says High or Severe risk.
- Switch to BaseWallet is on a different chain than the one selected in the form.
- Loading...Prerequisites still loading (excluded from this doc).
- Cancellation in progressA cancellation is being unwound on the hub.
- Wallet Frozen / Wallet Not WhitelistedVault refuses a redemption request from this wallet on this chain.
- Add to redemptionWallet already has pending, claimable or unfunded USDC on this chain.
- Request redemptionEverything else.
6. The position strips, one by one
What each strip means, what the user can do, and what is going on underneath. Rendered top to bottom in the order listed.
| Strip | Shown when | Copy and control | Behind the scenes | Resolves when |
|---|---|---|---|---|
| Returned zSMB | A cancellation has finished unwinding and zSMB sits in the vault waiting to be claimed back. | 250.00 zSMB returned from cancellation + Claim zSMB | Claiming is a share transfer into the wallet, so it needs the whitelist and no freeze. The SDK's claim call empties this bucket before it pays USDC, which is why this strip is first and the USDC claim waits for it. | User claims. zSMB returns to the wallet balance. |
| Claimable USDC | Zivoe has processed (fully or partially) this wallet's request and the chain's escrow holds the USDC. | 1,020.55 USDC ready to claim + Claim USDC. Blocked wallets read approved instead of ready to claim. | One claim pays out every processed portion at once. Whitelist is not required (proceeds already owed), a freeze blocks it. If Returned zSMB exists, the button waits: Claim your returned zSMB first. (a Split Outcome). | User claims. USDC lands in the wallet. |
| Unfunded USDC | The request was processed but this chain's pool escrow holds less than it owes. Only on spoke chains; the SDK reports zero, so the dApp reads the amount directly. | 1,020.55 USDC approved, awaiting liquidity on Arbitrum. No button at all. Frozen wallets get an extra This wallet is frozen. | An operations gap: liquidity has not been moved to that chain. A Sentry error is raised for every read that sees it. This strip does not poll. | Operations fund the escrow. On the next load or transaction refetch it turns into a Claimable USDC strip. |
| Redemption processing | Pending zSMB exists and no cancellation is in progress. | 1,000.00 zSMB processing · ≈ 1,018.20 USDC + Cancel request (Ethereum only; other chains show the text alone). | zSMB is in escrow waiting for Zivoe to process the request on the hub, periodically. Partial processing moves value from this strip into Claimable USDC. The ≈ amount uses the current price; the real amount is fixed at processing. | Zivoe processes the whole request, or the user cancels (Ethereum). |
| Cancellation processing | The user (or someone on their behalf, on any chain) cancelled and the hub has not finished unwinding. | Cancelling redemption request for 1,000.00 zSMB + Your zSMB will be available to claim once the cancellation is processed. Any portion already approved still executes as USDC. Replaces the Redemption processing strip; locks the form. | Polled every 10 seconds. A portion processed before the cancellation landed still pays out as USDC, so this can end in a Split Outcome (Returned zSMB + Claimable USDC). | Hub finishes the unwind. Strip becomes Returned zSMB. |
7. Worked examples
The combinations most likely to generate a support question, read top to bottom as the user sees them.
Happy path, first request
- No strips.
- Form open, estimate live.
- Request redemption.
Waiting on Base
- 1,000.00 zSMB processing · ≈ 1,018.20 USDC, no cancel link.
- Form open.
- Add to redemption.
Partially processed, then cancelled
- 250.00 zSMB returned from cancellation + Claim zSMB.
- 765.40 USDC ready to claim, button disabled, Claim your returned zSMB first.
- Form open, Add to redemption.
Whitelist removed after a request
- 1,020.55 USDC ready to claim + Claim USDC still works.
- Form locked, Wallet Not Whitelisted.
- Whitelist callout at the bottom.
Frozen with money owed
- 1,020.55 USDC approved, button disabled, This wallet is frozen.
- Form locked, Wallet Frozen.
- Frozen callout at the bottom.
Liquidity not on the spoke yet
- 1,020.55 USDC approved, awaiting liquidity on Arbitrum, nothing to press.
- Form open, Add to redemption.
- Ops are alerted through Sentry; the user waits.
Wrong network
- 1,020.55 USDC ready to claim, button disabled, no hint.
- Form open, showing Base balances.
- Switch to Base.
Flagged by Chainalysis
- Strips show amounts; every strip button reads Disconnect.
- Form open but cannot be submitted.
- Main action Disconnect.
Cancellation in flight
- Cancelling redemption request for 1,000.00 zSMB + explainer.
- Form locked.
- Cancellation in progress; clears by itself.
8. Facts worth remembering
- Whitelist never blocks a USDC claim; a freeze always does. Proceeds already owed belong to the investor. Only a freeze, or an unfunded escrow, keeps them from collecting.
- Every verdict is per chain. Access, position, balances and the cancel option all follow the chain in the form's selector, not the wallet's chain. The selector is never locked by a whitelist or freeze verdict so the user can escape to another chain.
- Cancel exists on Ethereum only. On the eight spoke chains a pending request can only wait for processing. A cancellation made elsewhere (for example by Zivoe on the investor's behalf) still shows up here, because the strips are driven by on-chain state.
- Claims are all-or-nothing and ordered. One transaction claims every processed portion. Returned zSMB must be claimed before USDC, an SDK constraint the dApp enforces before signing.
- Blocks are predicted, not enforced, by the dApp. The chain enforces them. The dApp reads the same checks in advance so the user sees a named reason instead of a failed transaction. When those reads fail, the dApp stays open and lets the pre-sign simulation catch the revert.
- Only two things poll. Cancellation processing (every 10 s) and a failed position read (every 30 s). Everything else refreshes after a transaction or a page load, including an unfunded claim.
- Copy that reaches the user for a blocked wallet comes from a single place per restriction: Wallet Frozen / This wallet is frozen. for a freeze, and Wallet Not Whitelisted / Requires a whitelisted wallet. for every other refusal, including a membership that expired or a refusal the hook did not explain. Those last two are also reported to Sentry as unexpected.