Network parameters
All protocol-level constants in one place. Values are from core/constants.py.
Consensus
| Parameter | Mainnet | Testnet | Constant |
| Block time target | 60 s | 5 s | BLOCK_TIME_TARGET / TESTNET_BLOCK_TIME_TARGET |
| Initial difficulty | 4 | 2 | INITIAL_DIFFICULTY / TESTNET_INITIAL_DIFFICULTY |
| Min difficulty | 2 | 2 | MIN_DIFFICULTY |
| Max difficulty | 8 | 4 | MAX_DIFFICULTY / TESTNET_MAX_DIFFICULTY |
| Difficulty adjustment interval | 10 blocks | 10 blocks | DIFFICULTY_ADJUSTMENT_INTERVAL |
| Max reorg depth | 100 blocks | 100 blocks | MAX_REORG_DEPTH |
The PoW target is difficulty leading hex zeros on the SHA3-512 block hash. Adjustment looks at the time spanned by the last 10 blocks and moves difficulty up or down by 1, clamped to [MIN, MAX].
Economics
| Parameter | Value | Constant |
| Max supply | 21,000,000 WAVE | MAX_SUPPLY |
| Initial block reward | 5 WAVE | INITIAL_BLOCK_REWARD |
| Halving interval | 2,100,000 blocks | HALVING_INTERVAL |
| Genesis distribution | 1,000,000 WAVE | GENESIS_DISTRIBUTION |
| Default tx fee | 0.01 WAVE | DEFAULT_TRANSACTION_FEE |
| Min tx amount | 0.01 WAVE | MIN_TRANSACTION_AMOUNT |
| Max tx amount | 1,000,000 WAVE | MAX_TRANSACTION_AMOUNT |
| Max txs per block | 100 | MAX_TRANSACTIONS_PER_BLOCK |
See Tokenomics for the emission curve.
Gas
| Parameter | Value | Constant |
| Initial wallet bohms | 500.0 | INITIAL_WALLET_BOHMS |
| Small tx gas | 10.0 (amount ≤ 1000) | SMALL_TX_GAS |
| Medium tx gas | 15.0 (amount ≤ 10000) | MEDIUM_TX_GAS |
| Large tx gas | 25.0 (amount > 10000) | LARGE_TX_GAS |
| Default contract gas limit | 1,000,000 units | DEFAULT_GAS_LIMIT |
| Gas price | 10^9 bohms / unit | GAS_PRICE |
| Bohms per WAVE | 10^18 | (denomination) |
Mempool
| Parameter | Value | Constant |
| Max size | 5,000 txs | MEMPOOL_MAX_SIZE |
| Min fee | 0.0001 WAVE | MEMPOOL_MIN_FEE |
| TTL | 72 hours (259,200 s) | MEMPOOL_TX_TTL |
| Max pending per address | 25 | MEMPOOL_MAX_PER_ADDRESS |
Eviction policy: when full, lowest-fee txs are dropped first.
RBF (Replace-By-Fee): a tx with the same (sender, nonce) as a pending tx and a fee ≥ 1.1× the existing fee replaces it.
P2P networking
| Parameter | Value | Constant |
| Default port | 8333 (mainnet) / 18333 (testnet) | DEFAULT_PORT / TESTNET_DEFAULT_PORT |
| Max peers | 25 | MAX_PEERS |
| Min peers | 3 | MIN_PEERS |
| Protocol version | 1 | PROTOCOL_VERSION |
| Network magic | b"WAVE" / b"TWAV" | NETWORK_MAGIC / TESTNET_NETWORK_MAGIC |
| Max frame size | 4 MB | MAX_FRAME_SIZE |
| Peer timeout | 60 s | PEER_TIMEOUT |
| Handshake timeout | 10 s | HANDSHAKE_TIMEOUT |
| Ping interval | 30 s | PING_INTERVAL |
| Pong timeout | 60 s | PONG_TIMEOUT |
Frame format: MAGIC(4) + LENGTH(4) + JSON_PAYLOAD. Every message is ML-DSA-87 signed.
Sync
| Parameter | Value | Constant |
| Max blocks per request | 500 | MAX_BLOCKS_PER_REQUEST |
| Max headers per request | 2,000 | MAX_HEADERS_PER_REQUEST |
| Sync timeout | 300 s | SYNC_TIMEOUT |
Headers-first IBD: pull headers in 2,000-batch increments to validate the chain shape, then pull full blocks in 500-batch increments.
Discovery
| Parameter | Value | Constant |
| mDNS service type | _waveledger._tcp.local. | MDNS_SERVICE_TYPE |
| Discovery interval | 60 s | DISCOVERY_INTERVAL |
| External IP check interval | 1 hour | EXTERNAL_IP_CHECK_INTERVAL |
| Max addresses per ADDR msg | 1,000 | MAX_ADDR_PER_MSG |
| INV cache TTL | 10 minutes | INV_CACHE_TTL |
| Max INV entries per msg | 50,000 | MAX_INV_PER_MSG |
Seeds
| Mainnet seed nodes | Mainnet DNS seeds |
seed1.waveledger.net:8333 | seed.waveledger.net |
seed2.waveledger.net:8333 | seed2.waveledger.net |
| Testnet seed nodes | Testnet DNS seeds |
seed1-testnet.waveledger.net:18333 | seed1-testnet.waveledger.net |
seed2-testnet.waveledger.net:18333 | seed2-testnet.waveledger.net |
Service bits
Advertised in the VERSION handshake to signal node capabilities.
| Bit | Value | Meaning |
NODE_NETWORK | 1 | Full node — relays blocks and transactions |
NODE_MINER | 2 | Has a working QRNG attestation source |
NODE_ARCHIVE | 4 | Stores full chain history (no pruning) |
NODE_REACHABLE | 8 | Accepts inbound connections (passed reachability probe) |
Bits are bitmasked; one node may advertise any combination.
QRNG attestation bounds
Per-block health checks applied by every validator before accepting a new block's quantum_signature. See core/constants.py for the live values.
| Test | Bound |
| Monobit ratio (proportion of 1-bits in seed) | 0.40 ≤ p ≤ 0.60 |
| Fano factor (variance/mean of ADC reads) | 0.5 ≤ F ≤ 1.5 |
| Chi-squared p-value | ≥ 0.001 |
A block whose attestation fails any of these is rejected.
Crypto
| Parameter | Value | Constant |
| ML-KEM parameter set | ML-KEM-1024 | MLKEM_PARAMETER_SET |
| ML-KEM private key size | 3,168 bytes | MLKEM_PRIVATE_KEY_SIZE |
| ML-KEM public key size | 1,568 bytes | MLKEM_PUBLIC_KEY_SIZE |
| ML-DSA parameter set | ML-DSA-87 | MLDSA_PARAMETER_SET |
| ML-DSA signature size | ~4,627 bytes | MLDSA_SIGNATURE_SIZE |
| Hash algorithm | SHA-3-512 | HASH_ALGORITHM |
| Hash output | 512 bits / 128 hex chars | HASH_OUTPUT_BITS |
| NIST security level | 5 | NIST_SECURITY_LEVEL |
| Quantum entropy per attestation | 256 bits | QUANTUM_ENTROPY_BITS |
See Crypto primitives for algorithm details.
Auth
| Parameter | Value | Constant |
| PBKDF2 iterations | 100,000 | PBKDF2_ITERATIONS |
| PBKDF2 key length | 32 bytes (AES-256) | PBKDF2_KEY_LENGTH |
| AES mode | GCM | AES_MODE |
| Salt length | 32 bytes | SALT_LENGTH |
| Nonce length | 12 bytes (GCM standard) | NONCE_LENGTH |
The keystore actually uses Argon2id (not PBKDF2) for password derivation; the PBKDF2_* constants are legacy names retained for backwards compatibility with older wallet files. See auth/wallet_encryption.py.
Genesis
| Parameter | Mainnet | Testnet |
| Genesis timestamp | 1700000000.0 | 1800000000.0 |
| Genesis foundation address | 34378b1ba5be9d0999acd60be3a8a1f1 | (same) |