Withdrawing
How to withdraw ETH privately from Shinobi Cash.
Overview
Withdrawing uses a zero-knowledge proof to verify you own a deposit without revealing which one. The recipient can be any address on any supported chain.
Withdrawal Steps
- Navigate to Withdraw — Select the Withdraw tab
- Select a Note — Choose a note with available balance
- Enter Amount — Up to the note's full balance
- Enter Recipient — Any valid Ethereum address
- Select Destination Chain — Where funds should arrive
- Review Fees — Relay fee + solver fee (if cross-chain)
- Confirm — Proof generates in your browser, then submits
Proof Generation
When you confirm a withdrawal, your browser generates a Groth16 SNARK proof:
Generating proof... (~5-15 seconds)This proof verifies:
- You know the secret for a valid commitment
- The commitment is in the state tree
- The commitment is in the ASP tree (compliant)
- The nullifier hasn't been spent
Keep the tab active — Proof generation uses your browser's compute resources.
No Wallet Gas Required
Shinobi Cash uses ERC-4337 Account Abstraction to relay withdrawals:
- You don't need ETH in your wallet for gas
- Transaction is relayed via standard ERC-4337 bundlers (no custom relayer)
- A paymaster sponsors the gas upfront
- Gas cost is deducted from your withdrawal amount (relay fee)
This means you can withdraw to a fresh address without needing to fund it with gas first.
Same-Chain Withdrawal
When withdrawing on the pool chain (Arbitrum Sepolia):
- Proof validates in the pool contract
- Funds transfer directly to recipient
- Paymaster sponsors gas
Fees: Relay fee only (covers gas)
Cross-Chain Withdrawal
When withdrawing to another chain (e.g., Base Sepolia):
- Proof validates on pool chain
- Intent created with escrowed funds
- Solver fills on destination chain
- Recipient receives funds
- Solver claims escrow after proving fill
Fees: Relay fee + 5% solver fee
What Happens Behind the Scenes
Your browser generates ZK proof
│
▼
Entrypoint validates → Pool spends nullifier → InputSettler (escrow)
│
Solver detects ◄────┘
│
▼
WithdrawalOutputSettler → Recipient gets ETH
│
Solver claims escrowChange Notes
If you don't withdraw the full balance, a change note is created:
Original Note: 1.0 ETH
Withdrawal: 0.3 ETH
Change Note: 0.7 ETH (minus fees)This mirrors how cash transactions work — you get change back.
Fee Structure
| Fee | Amount | When |
|---|---|---|
| Relay Fee | Up to 15% | Always (covers gas) |
| Solver Fee | 5% | Cross-chain only |
The relay fee is dynamic based on gas prices. Maximum 15%.
Withdrawal States
| Status | Meaning |
|---|---|
| Preparing | Generating ZK proof |
| Submitting | Transaction being sent |
| Confirming | Waiting for block confirmation |
| Confirmed | On-chain, waiting for indexer |
| Indexed | Complete |
Tips
Troubleshooting
Proof generation is slow
- Keep the browser tab active and focused
- Close other resource-heavy tabs
- Normal time: 5-15 seconds
Transaction failed
- Check the note is still available (not spent elsewhere)
- Verify recipient address is valid
- Ensure ASP approval is complete
Cross-chain withdrawal stuck
- Solvers usually fill within minutes
- If expired, funds return as a refund commitment
- Refund can be withdrawn normally
What Can Go Wrong?
| Issue | Impact | Recovery |
|---|---|---|
| Browser crash during proof gen | Proof not generated | Retry; no funds lost |
| Transaction reverts | Withdrawal fails | Check error; retry with valid note |
| Solver doesn't fill (cross-chain) | Withdrawal delayed | Intent expires → refund commitment created |
| Wrong recipient address | Funds sent to wrong address | Unrecoverable — double-check before confirming |
| Note already spent | Transaction fails | Note was used in another session/device |
Next Steps
- Privacy Pools — Understand the cryptography
- Cross-Chain Architecture — How OIF works
- FAQ — Common questions