Gas, fees, and economics¶
Units¶
WAVE is the chain's native asset. The chain internally tracks balances in Bohms — the smallest unit, where:
$$ 1 \text{ WAVE} = 10^{18} \text{ Bohms} $$
(Named after David Bohm. Bohms are to WAVE what wei is to ETH or satoshis are to BTC.)
All on-the-wire amounts in JSON APIs use floats in WAVE units (e.g. 0.001 is 1,000,000,000,000,000 Bohms). The contract VM works in Bohms internally; conversion happens at the engine boundary.
Block reward¶
| Value | |
|---|---|
| Initial subsidy | 5 WAVE / block |
| Halving interval | 2,100,000 blocks (~4 yrs at 60s mainnet block time) |
| Asymptotic max supply | 21,000,000 WAVE |
| Genesis premine | 1,000,000 WAVE (foundation) |
Halving math:
$$ \text{subsidy}(h) = \frac{5}{2^{\lfloor h / 2{,}100{,}000 \rfloor}} \text{ WAVE} $$
The geometric series sums to:
$$ \text{premine} + 2 \cdot \text{INITIAL_REWARD} \cdot \text{HALVING_INTERVAL} = 10^6 + 2 \cdot 5 \cdot 2{,}100{,}000 = 21{,}000{,}000 $$
The chain enforces this cap in validate_received_block — any block whose coinbase would push total_supply past 21M is rejected, even if the rest of it is valid. See Tokenomics for the full emission curve.
Transaction fees¶
Fees are paid in WAVE, set by the sender, collected by the miner of the including block (added to the coinbase).
| Value | Notes | |
|---|---|---|
MEMPOOL_MIN_FEE | 0.0001 WAVE | Floor — txs below are rejected from mempool |
DEFAULT_TRANSACTION_FEE | 0.01 WAVE | What the wallet UI uses by default |
| Contract deploy / call fee | 0.001 WAVE | Charged from sender; gas_limit * gas_price |
| RBF bump | +10% over the existing fee | To replace a same-nonce tx |
Recommended fees are returned by the dashboard's GET /api/fee endpoint (per fee estimation), based on current mempool depth and recent block contents.
Gas¶
Contract execution is metered in gas. Conversion:
| Constant | Value |
|---|---|
DEFAULT_GAS_LIMIT | 1,000,000 |
GAS_PRICE | 1,000,000,000 (1 Gwei-equivalent, in Bohms/gas) |
| Default per-tx fee | 1,000,000 * 1,000,000,000 / 10^18 = 0.001 WAVE |
The default gas limit is what the Playground API sets when you don't specify one. Specific operations have published costs (see Reference: Crypto + gas):
| Op | Gas |
|---|---|
| Base block tx | 21,000 |
| Contract deploy (per byte of bytecode) | 200 |
SLOAD | 800 |
SSTORE (new slot) | 20,000 |
SSTORE (existing slot, non-zero) | 5,000 |
SHA3 (per word) | 6 + 6 per word over input |
CALL / DELEGATECALL / STATICCALL | 700 + cost-of-callee |
| ML-DSA verify precompile | 50,000 |
| ML-KEM decapsulate precompile | 25,000 |
| Memory expansion | Quadratic (anti-DoS) |
Gas left over after execution is not refunded in v1.
Transaction sizing¶
For wallet UX, a "typical" tx fits these envelopes:
| Tx kind | Wire size (est.) | Default fee | Typical gas |
|---|---|---|---|
| Plain transfer | ~5.5 KB | 0.01 WAVE | 21,000 |
| Chat message (memo ≤ 200B) | ~6 KB | 0.001 WAVE | 21,000 |
| Contract deploy (small, ~500B bytecode) | ~7 KB | 0.001 WAVE | 100,000–300,000 |
| Contract call (simple) | ~5.5 KB | 0.001 WAVE | 21,000–50,000 |
Most of the size budget goes to the ML-DSA-87 signature (4,627 bytes) and public key (2,592 bytes if not yet known to the verifier).
Mining economics¶
A block at mainnet's 60s target with 5 WAVE subsidy + occasional fees produces ~7,200 WAVE/day to the global miner set. With one miner, that miner gets all of it; with N miners, each gets ~5 * (their_hashrate / total_hashrate) WAVE per block in expectation.
Fee revenue is currently negligible vs subsidy — the chain has plenty of empty blocks. As usage grows, fees should grow with it.
After the first halving (~4 years), subsidy drops to 2.5 WAVE/block; after the second, 1.25; etc. By halving ~30, subsidy is below the dust limit and fees become the only meaningful miner revenue.