--- title: Chain Parameters description: Consensus-critical constants, tokenomics, emission schedule, and hardfork schedule. --- # Chain Parameters All values are sourced from the C++ `currency_config.h.in` and `default.cmake`, implemented in the `config/` package. These are consensus-critical constants. ## Tokenomics | Parameter | Value | Go Constant | |-----------|-------|-------------| | Atomic units per coin | 10^12 | `config.Coin` | | Display decimal places | 12 | `config.DisplayDecimalPoint` | | Block reward | 1.0 LTHN (10^12 atomic) | `config.BlockReward` | | Default tx fee | 0.01 LTHN | `config.DefaultFee` | | Minimum tx fee | 0.01 LTHN | `config.MinimumFee` | | Premine | 10,000,000 LTHN | `config.Premine` | | Dust threshold | 0 | `config.DefaultDustThreshold` | | Ticker | LTHN | `config.CurrencyNameAbbreviation` | ### Supply Model - **Block reward:** Fixed at 1 LTHN per block (no halving, but see HF6 for block time doubling). - **Premine:** 10,000,000 LTHN reserved at genesis (coinswap allocation + initial premine). - **Fee model:** Default and minimum fee of 0.01 LTHN. Pre-HF4, fees go to the miner. Post-HF4, fees are burned. ```go // Genesis block returns the premine; all others return 1 LTHN. func BaseReward(height uint64) uint64 { if height == 0 { return config.Premine } return config.BlockReward } ``` ## Address Prefixes | Type | Prefix | Base58 starts with | Go Constant | |------|--------|-------------------|-------------| | Standard | `0x1eaf7` | `iTHN` | `config.AddressPrefix` | | Integrated | `0xdeaf7` | `iTHn` | `config.IntegratedAddressPrefix` | | Auditable | `0x3ceff7` | `iThN` | `config.AuditableAddressPrefix` | | Auditable integrated | `0x8b077` | `iThn` | `config.AuditableIntegratedAddressPrefix` | Addresses are encoded using CryptoNote base58 with a 4-byte Keccak-256 checksum. The prefix is varint-encoded before the spend and view public keys (32 bytes each). ## Block Timing | Parameter | Value | Go Constant | |-----------|-------|-------------| | PoW block target | 120 seconds | `config.DifficultyPowTarget` | | PoS block target | 120 seconds | `config.DifficultyPosTarget` | | Combined target | 60 seconds | `config.DifficultyTotalTarget` | | Blocks per day | ~1,440 | -- | | PoS active from | Block 0 | `config.PosStartHeight` | ### Post-HF6 Timing (Future) | Parameter | Value | Go Constant | |-----------|-------|-------------| | PoW target | 240 seconds | `config.DifficultyPowTargetHF6` | | PoS target | 240 seconds | `config.DifficultyPosTargetHF6` | | Combined target | 120 seconds | `config.DifficultyTotalTargetHF6` | | Blocks per day | ~720 | -- | ## Difficulty The difficulty adjustment uses the **LWMA** (Linear Weighted Moving Average) algorithm. Each solve-time interval is weighted linearly by recency -- more recent intervals have greater influence. ```go // LWMA formula: next_D = total_work * T * (n+1) / (2 * weighted_solvetimes * n) func NextDifficulty(timestamps []uint64, cumulativeDiffs []*big.Int, target uint64) *big.Int ``` | Parameter | Value | Go Constant | |-----------|-------|-------------| | Window | 720 blocks | `config.DifficultyWindow` | | Lag | 15 blocks | `config.DifficultyLag` | | Cut | 60 timestamps | `config.DifficultyCut` | | Blocks count | 735 (Window + Lag) | `config.DifficultyBlocksCount` | | Initial PoW difficulty | 1 | `config.DifficultyPowStarter` | | Initial PoS difficulty | 1 | `config.DifficultyPosStarter` | | LWMA window (N) | 60 intervals | `difficulty.LWMAWindow` | Solve-times are clamped to [-6T, 6T] to limit timestamp manipulation impact. The algorithm returns `StarterDifficulty` (1) when insufficient data is available. ## Transaction Limits | Parameter | Value | Go Constant | |-----------|-------|-------------| | Max inputs | 256 | `config.TxMaxAllowedInputs` | | Max outputs | 2,000 | `config.TxMaxAllowedOutputs` | | Min outputs (HF4+) | 2 | `config.TxMinAllowedOutputs` | | Ring size (pre-HF4) | 10 | `config.DefaultDecoySetSize` | | Ring size (HF4+) | 15 | `config.HF4MandatoryDecoySetSize` | | Min coinage (HF4+) | 10 blocks | `config.HF4MandatoryMinCoinage` | | Coinbase maturity | 10 blocks | `config.MinedMoneyUnlockWindow` | | Max tx blob size | 374,600 bytes | `config.MaxTransactionBlobSize` | ### Transaction Versions | Version | Go Constant | Description | |---------|-------------|-------------| | 0 | `config.TransactionVersionInitial` | Genesis/coinbase | | 1 | `config.TransactionVersionPreHF4` | Standard transparent | | 2 | `config.TransactionVersionPostHF4` | Zarcanum confidential | | 3 | `config.TransactionVersionPostHF5` | Confidential assets | ## Block Limits | Parameter | Value | Go Constant | |-----------|-------|-------------| | Max block height | 500,000,000 | `config.MaxBlockNumber` | | Full reward zone | 125,000 bytes | `config.BlockGrantedFullRewardZone` | | Coinbase reserved | 1,100 bytes | `config.CoinbaseBlobReservedSize` | | Reward window | 400 blocks | `config.RewardBlocksWindow` | | Free tx max size | 1,024 bytes | `config.FreeTxMaxBlobSize` | ### Block Size Penalty Blocks within the full reward zone (125,000 bytes) receive the full base reward. Larger blocks incur a quadratic penalty: ```go // reward = baseReward * (2*median - size) * size / median^2 // Uses 128-bit arithmetic (math/bits.Mul64) to avoid overflow. func BlockReward(baseReward, blockSize, medianSize uint64) (uint64, error) ``` Blocks exceeding 2x the median size are rejected entirely. ### Block Versions | Major Version | Go Constant | Hardfork | |---------------|-------------|----------| | 0 | `config.BlockMajorVersionInitial` | Pre-HF1 | | 1 | `config.HF1BlockMajorVersion` | HF1 | | 2 | `config.HF3BlockMajorVersion` | HF3 | | 3 | `config.CurrentBlockMajorVersion` | HF4+ | ## Timestamp Validation | Parameter | Value | Go Constant | |-----------|-------|-------------| | PoW future limit | 7,200 seconds (2 hours) | `config.BlockFutureTimeLimit` | | PoS future limit | 1,200 seconds (20 min) | `config.PosBlockFutureTimeLimit` | | Median window | 60 blocks | `config.TimestampCheckWindow` | ## PoS Parameters | Parameter | Value | Go Constant | |-----------|-------|-------------| | Scan window | 600 seconds (10 min) | `config.PosScanWindow` | | Scan step | 15 seconds | `config.PosScanStep` | | Modifier interval | 10 | `config.PosModifierInterval` | | Minimum coinstake age | 10 blocks | `config.PosMinimumCoinstakeAge` | | Max consecutive PoS | 20 blocks | `config.PosStrictSequenceLimit` | ## P2P Network ### Ports | Network | P2P | RPC | Stratum | |---------|-----|-----|---------| | Mainnet | 36942 | 36941 | 36940 | | Testnet | 46942 | 46941 | 46940 | ### Peer Management | Parameter | Value | Go Constant | |-----------|-------|-------------| | White peerlist limit | 1,000 | `config.P2PLocalWhitePeerlistLimit` | | Grey peerlist limit | 5,000 | `config.P2PLocalGrayPeerlistLimit` | | Default connections | 8 | `config.P2PDefaultConnectionsCount` | | Handshake interval | 60 seconds | `config.P2PDefaultHandshakeInterval` | | Max packet size | 50 MB | `config.P2PDefaultPacketMaxSize` | | IP block time | 24 hours | `config.P2PIPBlockTime` | | Failures before block | 10 | `config.P2PIPFailsBeforeBlock` | ## Alias System | Parameter | Value | Go Constant | |-----------|-------|-------------| | Max aliases per block | 1,000 | `config.MaxAliasPerBlock` | | Max name length | 255 | `config.AliasNameMaxLen` | | Min public short name | 6 characters | `config.AliasMinimumPublicShortNameAllowed` | | Valid characters | `0-9a-z-.` | `config.AliasValidChars` | | Max comment size | 400 bytes | `config.AliasCommentMaxSizeBytes` | ## Mempool | Parameter | Value | |-----------|-------| | Transaction lifetime | 345,600 seconds (4 days) | | Alt block lifetime | ~10,080 blocks (~7 days) | | Max alt blocks | 43,200 (~30 days) | | Relay batch size | 5 transactions | ## Hardfork Schedule Seven hardforks (HF0 through HF6) are defined. Heights are "after height" -- the fork activates at height N+1. ```go type HardFork struct { Version uint8 // 0-6 Height uint64 // Activates at heights > this value Mandatory bool // Must support to stay on network Description string } ``` ### Mainnet Schedule | HF | Height | Changes | |----|--------|---------| | HF0 | 0 (genesis) | CryptoNote base protocol. Hybrid PoW/PoS. Classic ring signatures (NLSAG). Transparent amounts. | | HF1 | 10,080 (~7 days) | New transaction types: HTLC, multisig, service attachments. | | HF2 | 10,080 | Block time adjustment. Activates simultaneously with HF1. | | HF3 | 999,999,999 | Block version 2. Preparation for Zarcanum. Future activation. | | HF4 | 999,999,999 | **Zarcanum privacy upgrade.** Confidential transactions, CLSAG ring signatures, Bulletproofs+, mandatory ring size 15, minimum 2 outputs per tx. | | HF5 | 999,999,999 | **Confidential assets.** Asset deployment/emission/burn, BGE surjection proofs, tx version 3. | | HF6 | 999,999,999 | **Block time halving.** PoW/PoS targets double to 240s, effectively halving emission rate. | ### Testnet Schedule | HF | Height | Notes | |----|--------|-------| | HF0 | 0 | Active from genesis | | HF1 | 0 | Active from genesis | | HF2 | 10 | Early activation | | HF3 | 0 | Active from genesis | | HF4 | 100 | Zarcanum active early | | HF5 | 200 | Confidential assets early | | HF6 | 999,999,999 | Future | ### Querying Hardfork State ```go // Highest active version at a given height version := config.VersionAtHeight(config.MainnetForks, 15000) // Returns: HF2 (since HF1 and HF2 activate after 10,080) // Check if a specific fork is active active := config.IsHardForkActive(config.MainnetForks, config.HF4Zarcanum, 15000) // Returns: false (HF4 not yet activated on mainnet) ``` ### Pre-Hardfork Transaction Freeze From HF5 onwards, a freeze period of 60 blocks (`config.PreHardforkTxFreezePeriod`) applies before each hardfork activation. During this window, no new transactions (other than coinbase) are accepted into the mempool, ensuring chain stabilisation before consensus rule changes. ## Genesis Block | Parameter | Value | |-----------|-------| | Timestamp | 2026-02-12 12:00 UTC | | Unix timestamp | `1770897600` | | Genesis nonce | `CURRENCY_FORMATION_VERSION + 101011010121` | | Block major version | 1 | | Block minor version | 0 |