voidcashdocs

Fees

The pool's shield and exit fees, the relayer fee on sends and unshields, the network fee of a shield, and where the pool's fees go.

Voidcash has two pool fees, one on the way in and one on the way out, and none on private sends. Sends and unshields also pay the relayer that submits them. Every rate is read live from the pool program, and the app shows each fee in SOL before you confirm.

MovePool fee at launchRelayer feeNetwork fee
ShieldNone (shield fee 0%), charged on top when setNonePaid by your wallet
SendNone, by designYes, from your notesPaid by the relayer, inside its fee
Unshield0.5% of the amount (exit fee), taken from itYes, from your notesPaid by the relayer, inside its fee
Combining notesNoneYes, one per mergePaid by the relayer, inside its fee

Pool fees

ParameterAt launchApplies toHow it is charged
Shield fee0%Every shieldOn top: the note holds the amount you shield, and your wallet pays the fee besides
Exit fee0.5%Every unshieldFrom the amount: the recipient receives the amount less the fee

Both fees are a percentage of the amount, rounded down to the lamport. At 0.5%, unshielding 1 SOL costs 0.005 SOL in exit fee.

Private sends have no pool fee, by design. The program cannot see a send's amount, and it charges a zero rate to every transaction that moves no SOL in or out of the pool. Combining notes is a send to yourself, so it pays no pool fee either.

Who sets them

The shield fee and the exit fee are parameters of the pool, which the pool's admin can change. The program refuses either one above 1%; a higher fee would take a new version of the program. The rate in force is in the pool's config account, and the app reads it at every sync.

The rate the app shows you is bound in the proof. If the admin changes a fee after you confirm, the program refuses the transaction instead of charging the new rate: no pool fee is charged and no note is spent. The app picks up the new rate at its next sync, and the next review shows it.

Relayer fee

Sends, unshields and merges are submitted by a relayer, which pays the Solana fees and is paid back in SOL from your notes. Its fee is a quote, computed by the relayer as:

relayer fee = rent of two nullifier accounts
            + the transaction's network fee (base fee and priority fee)
            + a margin
  • Nullifier accounts. Every transaction creates two small accounts that mark the notes it spends as spent. They stay on the chain for good, so their rent is never returned.
  • Network fee. The Solana base fee plus a priority fee for the compute the transaction reserves.
  • Margin. A fixed amount the relayer adds to every quote.

The app reads the quote from the relayer when you unlock the vault, and the review shows it in SOL. The landing page shows the current quote too. The quote does not depend on the amount you move.

The fee is bound in the proof together with the relayer's address, so the relayer cannot raise it after you confirm. It refuses a request that pays less than its current quote, and it simulates every transaction before sending it: a request it refuses costs you nothing.

Network fee of a shield

A shield is a normal transaction from your wallet, so your wallet pays the Solana fee and the rent of the two nullifier accounts it creates. That is why the app keeps 0.01 SOL in the wallet when you press Max.

Where the pool fees go

Every pool fee is split in the same transaction that collects it:

ShareAt launchGoes to
Buyback50% of each feeThe buyback account, which buys $VOID and burns it
TreasuryThe rest, 50%The treasury account, which the pool's admin can withdraw

At launch the shield fee is zero, so the buyback receives 0.25% of every unshield and the treasury the other 0.25%. Rounding goes to the treasury, by at most a lamport. The buyback's share is also a parameter of the pool, from 0% to 100% of each fee.

The buyback

The buyback spends its SOL over time, in chunks, on the $VOID/SOL pool on Meteora (DAMM v2) that the admin pins it to, and burns every $VOID it buys in the same instruction. Anyone can trigger a buy, and the program pays the caller nothing; the relayer runs a crank that does it. The landing page shows the SOL waiting to buy $VOID and the total $VOID burned, both read from the program.

Relayer fees are not pool fees: they go to the relayer, for the costs above.

On this page