VOID and Volta
VOID for technical readers: its launch on Volta and its Uniswap v4 pool against native HYPE, Volta's 1% swap fee and its buyback, the fee collector's buy-and-burn with its limits, VOID as the vault's first listed token, how the burned total is computed, and the keeper.
VOID is an ordinary ERC-20 token, launched on Volta (https://volta.family), a launchpad on Elysium built on
Flaunch's contracts. It trades on a Uniswap v4 pool against native HYPE. VOID gives no claim on the vault's HYPE and is
not needed to use voidcash: gas is always paid in HYPE.
VOID meets voidcash in two places:
- The burn. Half of the HYPE that reaches the fee collector (HYPE exit fees and gas that operations overpaid) buys VOID on its pool and burns it. Volta's own buyback burns VOID too, out of VOID's swap fee.
- The vault. VOID is the vault's first listed token: it can be shielded, sent privately and unshielded like HYPE. See VOID in the vault. The app moves VOID but does not trade it; buying and selling happen on Volta.
Addresses
| What | Address |
|---|---|
| VOID | 0xD31B21Cb80E431AC996269deC31A40fCf048B77f |
| Uniswap v4 PoolManager on Elysium | 0xE2e105d3F7209A9DA11f83cCf3E7398a753823F1 |
| Volta's PositionManager, the pool's hook | 0x3aB88DDc3CF2A012af88B60828edb4553697E5dC |
| Volta's creator NFT contract | 0xac466Ee5CEdD012eB750DBDA0B935F8B997402c7 |
| Volta's FeeEscrow (the creator's and Volta's shares) | 0x3D36Beb546E451584736957F97E7EE9D2aCbD9a5 |
| Volta's FeeVault (the buyback share) | 0xB074897161E8b00d97d3F4163f73de12f7B8f4Ba |
| VOID's pool ID | 0xe488e93cba1cbbb1493d898a4f352571d0d96ddc4902f5449d07ad33ee34ee08 |
| voidcash's fee collector | 0x145618DF0662dCd38a2Cf2AC4d24Dfe1FC8A4991 |
VOID's page on Volta is https://volta.family/token/ followed by VOID's address.
The launch
VOID was launched with Volta's PositionManager.flaunch, from contracts/script/Deploy.s.sol, with these parameters:
| Parameter | Value |
|---|---|
name, symbol | voidcash, VOID (18 decimals) |
swapFee | 100 bps (1%), Volta's minimum, fixed for the life of the pool |
creatorSplit | creator 5,000, buyback 5,000, holders 0: shares of what is left after Volta's share |
antiSnipe | none |
flaunchAt | 0: trading opens at launch |
initialPriceParams | empty: Volta's default starting market cap, 40 HYPE |
pairedToken | address(0): native HYPE |
creator | the launching wallet, which receives VOID's creator NFT |
VOID is a 44-byte clone of Volta's token implementation, so its code cannot change. The deploy refuses to launch if
the code of Volta's PositionManager, creator NFT contract, fee escrow or token implementation, or of the PoolManager,
differs from the code the fork tests ran against (contracts/test/VoltaFork.t.sol), if those contracts point at each
other differently, if Volta's share of the fee is above 30%, or if a 1% fee is outside Volta's range. Its check
step then verifies the clone, the creator NFT, the pool key, the fee and its split, and that no anti-snipe fee is set.
The pool
Volta has no bonding curve: VOID trades on its Uniswap v4 pool from its first block.
PoolKey({
currency0: Currency.wrap(address(0)), // native HYPE
currency1: Currency.wrap(VOID),
fee: 0, // the hook takes the swap fee instead
tickSpacing: 60,
hooks: IHooks(PositionManager) // Volta's
})
// poolId = keccak256(abi.encode(key))The whole supply, 10⁹ VOID, is minted at launch (block 520921) and goes into the pool as a single position running from a market cap of 40 HYPE to the top of Uniswap's price range, except 1 VOID that the same transaction sends to the launching wallet. Until the first buy the pool has no active liquidity.
Volta's swap fee
Every swap on the pool, buy or sale, pays the pool's swap fee of 1%:
- On a sale the fee is taken in HYPE.
- On a buy the fee is taken in VOID. The PositionManager keeps that VOID and sells it to later buyers, before their swaps reach the pool, for HYPE. That HYPE is then split like any other fee.
Each fee is split three ways:
| Share | Of each fee | Of each trade | Where it goes |
|---|---|---|---|
| Volta | 30% | 0.3% | Volta's balance in the FeeEscrow |
| Creator | 35% | 0.35% | The FeeEscrow, to whoever holds VOID's creator NFT when the fee is taken: the team |
| Buyback | 35% | 0.35% | The FeeVault, until Volta's executor spends it on VOID and burns it |
| Holders | 0% | 0% | Not used by VOID |
The creator's share moves with the NFT: transferring it sends every later fee to the new holder, and what was owed
before stays with the previous one. Only the holder can withdraw its own balance
(withdrawFees([address(0)], recipient, false)).
Volta's buyback
The buyback share waits in the FeeVault, readable as balanceOf(poolId, 0). Volta's FeeExecutor spends it on VOID and
destroys what it buys, which lowers VOID's totalSupply; nothing is sent to 0x…dEaD. Only Volta's operators can run
the executor. Volta's documentation says it runs once a pool has collected 0.01 HYPE, and at most every 10 minutes.
voidcash's keeper does not run it and cannot.
The fee collector
FeeCollector (0x145618DF0662dCd38a2Cf2AC4d24Dfe1FC8A4991) receives HYPE from the vault's sweepFees: the HYPE exit fees and what private
operations overpaid for gas. Anyone may call collect(), which splits what has arrived, pays the team, and buys and
burns VOID within the limits below.
function collect() external returns (uint256 tokensBurned);
function payTeam() external;The split
arrived = balance(collector) - teamOwed - toBurn HYPE that came in since the last split
teamOwed += arrived * 5_000 / 10_000 TEAM_SHARE_BPS
toBurn += the restEvery collect and payTeam splits first and emits Collected(amount, teamShare, burnShare). The team's half is
paid to teamRecipient at the end of the call (TeamPaid); if the recipient is zero or refuses the HYPE, it stays in
teamOwed and is paid later. It is never spent on VOID. toBurn is never paid out: the only HYPE that leaves it buys
VOID or refunds the caller of a buy. An exit of u HYPE therefore sets aside 0.5% × u for the burn.
The buys
hype = toBurn * (10_000 - 50) / 10_000 0.5% held back for the caller's refund
if hype != 0 and block.timestamp >= lastBuyAt + 12 s:
spot = VOID per HYPE at the pool's current price
X = liquidity * 2^96 / sqrtPriceX96 the HYPE side of the pool's active liquidity
spend = min(hype, X * 50 / 20_000) moves the price by about 0.5%
feeBps = hook.poolFees(poolId).swapFee
repeat up to 8 times:
minOut = spend * spot * (10_000 - feeBps) / (1e18 * 10_000) * (10_000 - 25) / 10_000
if quote(spend) >= minOut:
buy spend with minOut; send the VOID to 0x…dEaD
lastBuyAt = block.timestamp; toBurn -= spend; totalBurned += VOID bought
stop
spend /= 2| Limit | Value |
|---|---|
| Buys | At most one per BUY_INTERVAL, 12 seconds. Elysium's blocks follow HyperEVM's, about one a second, so the pace is set in time |
| Price impact | Each buy is sized to move the price by no more than MAX_IMPACT_BPS, 0.5%. A buy of a share x of the HYPE side moves the price by about 2x, so the cap is 0.25% of X |
| Minimum out | The VOID the spot price gives after the swap fee, less 0.25% |
| Sizes tried | Up to 8, halving each time |
| No market | No buy while the pool has no price or no active liquidity, or while the swap fee is 100% or more |
Each buy is a swap on the PoolManager directly (unlock, swap, settle, take), not through a router. The quote is
the same swap, run and undone in the same call, so it includes the 1% fee and any part of the buy Volta fills from the
VOID it holds. What does not fit waits in toBurn for the next call. Each buy emits Burned(hypeSpent, tokensBurned).
The collector's constructor accepts a pool only if Volta's PositionManager names this PoolManager, its creator NFT contract names the PositionManager back, the token is a launch that contract created, and the key above hashes to the pool the PositionManager records for the token. A decoy token or pool never enters its pricing or trading.
The caller's refund
The caller is refunded only the gas of a call that bought and burned:
price = min(tx.gasprice, 2 * block.basefee)
refund = (gas the call measured + 25_000) * price GAS_OVERHEAD = 25,000
refund = min(refund, spent * 50 / 9_950, toBurn) CALLER_TIP_BPS = 50: about 0.5% of what it spentA call that does not buy earns nothing, so calling collect in a loop pays nobody. The refund emits CallerTipped.
Why the buys are small
A buy that small is not worth sandwiching. With the swap fee τ = 1% and the impact cap δ = 0.5%, the whitepaper shows that an attacker who buys just before one of the collector's buys and sells right after loses at least 0.75% of the capital used, at any size, and 1.5% when the front-run is small next to the pool. A single buy would break even for the attacker only at an impact of about 2.02%, four times the cap.
The cap limits the pace of buying, not the total. The backlog is public and anyone can trigger each buy, so an
attacker who buys first and holds through several buys can come out ahead: from the fifth buy, about 48 seconds after
the first, once the backlog exceeds about 1% of X. Volta's buyback is exposed the same way whenever one buyback
spends more than about 1% of X. These are mechanics; they say nothing about VOID's price.
Owner
| Function | Effect |
|---|---|
setTeamRecipient(newRecipient) | Sets who receives the team's half from now on, and pays it what is owed (TeamRecipientChanged) |
transferOwnership(newOwner) | Hands ownership on; address(0) renounces it, and then the team's recipient can never change again (OwnershipTransferred) |
The owner can do nothing else. Nobody can take the HYPE set aside for burning. At deployment the same key owns the collector and receives the team's half.
VOID in the vault
Since the vault's v2 upgrade on 5 November 2026, VOID is the first token the vault lists (VOLTA, Volta's own token, followed on 6 November 2026, BLOB on 7 November and YIELDEX on 8 November). It was listed by the same script that upgraded the vault, with these terms:
| Term | Value |
|---|---|
| Large-exit threshold | 5,000,000 VOID (0.5% of the supply): a VOID exit paying out more waits 24 hours, and the guardian can stop it |
| Window cap | 25,000,000 VOID of exits paid at once per 24-hour window: an exit that would go above it waits 24 hours too |
| Exit fee | 1% of the VOID leaving, kept in VOID |
| Exit fee recipient | The team: the vault's tokenFeeRecipient, set to the same address the fee collector pays the team's half to |
| Shield and private send | No fee |
| Gas | HYPE, from a private HYPE note spent in the same proof |
A VOID note is hashed as H(3, stub, amount, uint160(VOID)), apart from HYPE notes but in the same tree, so VOID
notes and HYPE notes share one privacy set. See Notes and
The vault.
The 1% exit fee on VOID goes to the team, in VOID, through sweepTokenFees. It does not reach the fee collector and
does not feed the burn. The burn is fed by HYPE exit fees and gas overpaid, through the collector, and by Volta's
buyback.
The burned total
VOID is burned two ways, and each leaves a different mark:
- The fee collector sends what it buys to
0x000000000000000000000000000000000000dEaD, where nobody can spend it.FeeCollector.totalBurnedcounts it. - Volta's buyback destroys what it buys, which lowers
totalSupply.
So the total burned by every route is:
burned = (10^9 VOID - VOID.totalSupply()) + VOID.balanceOf(0x…dEaD)The app's analytics page computes it this way (packages/sdk/src/analytics.ts), and shows the collector's part
(totalBurned), the rest (Volta's buyback, and anyone else's burns), the HYPE waiting in the collector (toBurn) and
the buyback share waiting in Volta's FeeVault.
The keeper
Every call that moves fees and burns VOID is permissionless. voidcash runs a keeper (services/keeper) so that they
happen on time, and so that someone hears at once about an exit that could hurt the pool.
| Task | When |
|---|---|
vault.sweepFees() | When the HYPE exit fees plus the vault's EntryPoint deposit reach 0.1 HYPE, at most every 10 minutes |
vault.sweepTokenFees(token) | For each listed token, VOID included, when it has any fees (or more than a minimum set per token), at most every 10 minutes per token. The fees go to the team in the token |
collector.collect() | When more than 0.01 HYPE waits to be burned, at most every minute and never within the collector's 12 seconds. It simulates the call first and sends it only if the simulation buys and burns |
| Alerts | An exit taking more than 5% of the pool, a token exit taking more than 5% of the token's backing, every held exit (the guardian can still stop it), a guardian stopping or resuming an exit, the admin listing a token, changing its limits or the token fee recipient, the guardian closing or opening a token, a failed simulation, and the keeper's own balance running low |
The keeper checks for exits every 5 seconds and runs its fee tick every 30 seconds. It does not run Volta's buyback: only Volta's operators can. Anyone else can make the same calls.
Trust
- The vault does not depend on Volta. Shielding, private sends and exits work whatever happens to VOID's market. If Volta's contracts stopped working, only the collector's buys and Volta's buyback would stop, and the HYPE meant for burning would wait in the collector. VOID notes in the vault depend on VOID's own token contract, a clone whose code cannot change.
- Volta does not publish its Solidity source. What these pages say about it comes from the ABI its site ships, its documentation, its bytecode and the fork tests. None of its contracts is a proxy.
- Volta's owner is a single externally owned account. It can name a keeper of the FeeVault, and a keeper can withdraw VOID's pending buyback share to any address, so that share is in Volta's hands until its executor spends it. The owner also names the executor's operators and can repoint the contracts that new launches use. It cannot reach the creator's share in the FeeEscrow or anything held by voidcash's contracts.
- Two public functions of Volta's PositionManager could not be identified.
- The PoolManager runs Uniswap v4's code. Its owner can name a protocol fee controller, which could add up to 0.1% to each swap; the collector's quotes come from the swap itself, so it would pay that fee and lose nothing beyond it.
See the trust model for the rest.
The note tree
The append-only Poseidon2 Merkle tree that holds every note commitment - depth, pair insertion, root history, rollover and how wallets rebuild it.
Deployments
The network, every voidcash contract address on Elysium, the listed tokens and their limits, the Volta contracts VOID trades on, the public bundler and indexer, and how to check all of it on-chain.