Withdraw
You can get funds out of zk.money by providing an Ethereum address. The amount you enter is what arrives at that address on Ethereum. The fees come out of your zk.money balance on top of it, and the sheet shows them before you confirm.
The Withdraw screen offers three destinations:
- An existing address. Any Ethereum address you control. The funds can arrive as DAI, or be swapped on the way out to USDC, USDT or ETH.
- A fresh address. A new address with no history, which zk.money can fund with a little ETH for gas at the same time, so nothing on the public chain connects it back to you. See Withdrawing to a fresh address.
- ether.fi Cash. The deposit address ether.fi Cash gives you, so the funds land in that balance. zk.money checks that the address really came from ether.fi before it continues.
How to get funds out of zk.money
- Choose the destination and enter the address and the amount. Predicate screens the address first, and a blocked address stops the withdrawal here, before anything moves. See Limits for how address screening works. If you withdraw as USDC, USDT or ETH, the sheet shows an estimate of what arrives after the swap.
- Pick a speed. Standard, or Faster for a small tip. See Faster withdrawals.
- Confirm with your passkey. The Oxide enclave co-signs, your device computes a zero-knowledge proof of the withdrawal, and the amount plus the fees leave your balance on the Aztec Network.
- The funds are released to your address on Ethereum. The Aztec Network proves the block on Ethereum, and a relayer sends the transaction that releases the funds and takes the tip. The address you entered is fixed when you confirm, so nobody can send the funds anywhere else.
The sheet shows an estimated time before you confirm. The release to Ethereum usually takes under an hour, and zk.money tells you when a stage is taking longer than that.
Faster withdrawals
A withdrawal waits for the Aztec Network to prove the block that holds it. The Speed row on the withdrawal sheet offers two choices, each with its estimated time:
- Standard. No tip. The withdrawal is proven in its normal turn.
- Faster. You add a prover tip, shown in DAI on the row. The tip goes to the first prover of the checkpoint that holds your withdrawal, which gets it proven sooner. The tip is taken from your balance on top of the amount and the fee.
zk.money quotes the tip live and only offers Faster when it is certain to save you at least a minute. When a withdrawal is already as fast as it can be, the row says so and no tip is charged. Faster is refused if your balance cannot cover the tip, or if the tip would put the withdrawal over the per-withdrawal cap.
The same choice appears when a payment link is claimed straight to an Ethereum address, and on a withdrawal to a fresh address.
Withdrawing to a fresh address
Withdrawing to an address you already use ties that address's history to the withdrawal on the public chain. A fresh address has no history, so nothing connects the funds back to you.
- Make a new address in your Ethereum wallet. The Withdraw screen shows where the option is in MetaMask, Rabby and Rainbow. Copy the new address.
- Paste the address. zk.money checks it on Ethereum and tells you what it finds: whether it has sent transactions, holds ETH or is a contract, whether it funded your zk.money account, and whether you withdrew to it before. These are advice, not a block, except that Predicate's screening still applies. Token transfers are not checked. You can name the address, and zk.money saves it as a contact for next time.
- Choose what the funds arrive as, and a gas share. The funds land as DAI, USDC, USDT or ETH. The gas share is $0, $1, $5, $10 or $15 of your balance that lands as ETH alongside the funds, $5 by default, so the new address can spend without anyone funding it with gas. With no gas share, the address needs ETH from elsewhere before it can move the funds, unless the funds themselves arrive as ETH.
- Pick a speed, review and confirm with your passkey. The whole withdrawal, gas share included, is one withdrawal under the per-withdrawal cap.
The funds and the gas share travel through a swap escrow on Ethereum, which a relayer runs for you. If no relayer runs it after the usual wait, the activity list offers to let you run the swap yourself from an Ethereum wallet you control.
What to watch for:
- Use each fresh address once. A second withdrawal to the same address links the two on the public chain.
- Do not withdraw to a contract address on the ETH route. The gas share arrives as a plain transfer, and a contract that rejects ETH would leave the funds stuck at the swap escrow.
- The address needs ETH to spend. Without a gas share, and without the funds arriving as ETH, the new address holds tokens it cannot move until someone sends it gas, which links it again.
What it costs
The fee is shown on the sheet before you confirm, and is added on top of the amount you enter.
- A direct withdrawal as DAI costs $0.20: $0.10 for the Ethereum transaction that releases your funds on the portal side, and $0.10 to top up the fee-paying contract.
- A withdrawal as USDC, USDT or ETH, and a fresh-address withdrawal with a gas share, adds the swap relayer's tip, priced at the Ethereum gas price at that moment. The sheet says what the tip was priced at, and warns you when Ethereum gas is more than a fifth of the amount.
- Faster adds the prover tip shown on the Speed row.
What to watch for
- Each withdrawal must stay below $2,500, fees included. zk.money checks this before anything is signed and refuses a withdrawal over the cap. MAX on the sheet is your balance less the fee, capped at the limit. Read Limits for more details.
- Withdrawals need a live Oxide enclave to co-sign. zk.money runs one by default, so there is nothing for you to set up. If none is running, withdrawals wait until one is. See Trust model.
Troubleshooting failed withdrawals
If a withdrawal does not arrive, one of these is usually the cause. In every case your funds are still yours.
- Predicate blocked the withdrawal address, or could not answer. zk.money refuses the withdrawal before anything moves. Your funds stay in your zk.money balance.
- The fee cannot be read. The sheet says so and does not let you continue. Check your connection and try again.
- Nobody took the release job. Your funds have left your zk.money balance and are waiting on Ethereum. After the usual wait, zk.money offers to let you send that last transaction yourself, from the activity list, with your own gas, and you keep the tip. On a swap route the same offer lets you run the swap yourself.
If none of these is it, Settings in the web wallet has Report a bug, and a place to send feedback.