Protocol Parameters
All numeric values reflect the v10.x Foundry deployment. Values marked as default may be adjusted by governance within Rpp constraints; values without that annotation are immutable constants.
Time Constants
| Parameter | Symbol | Value | Seconds | Location | Description |
|---|---|---|---|---|---|
| Century | CENTURY | 36,525 days | 3,155,760,000 | Constant.sol:8 | Reward formula denominator; normalizes annual rates to per-second accrual |
| Year | YEAR | 365.25 days | 31,557,600 | Constant.sol:12 | Defined as CENTURY / 100; used in APB year accounting |
| Month | MONTH | ~30.44 days | 2,629,800 | Constant.sol:16 | Minimum interval between Rpp-governed parameter changes |
| Week | WEEK | 7 days | 604,800 | Constant.sol:20 | Emigration window duration for reverse NFT migration |
| Day | DAY | 24 hours | 86,400 | Constant.sol:24 | Calendar day in seconds |
| Hour | HOUR | 60 minutes | 3,600 | Constant.sol:28 | Block hash validity window for PoW mining |
| Minute | MIN | 60 | 60 | Constant.sol:30 | Base unit; target APOW minting rate is ~1 token/min |
| Second | SEC | 1 | 1 | Constant.sol:36 | Reference unit for all time calculations |
Mining Parameters
| Parameter | Value | Location | Description |
|---|---|---|---|
| Max block hash age | 1 hour (3,600 s) | XPower.sol:118 | Block hashes expire 1 hour after init(); solutions must be submitted within the same interval |
| Mining interval | 1 hour | XPower.sol:112 | Block hashes are bucketed into 1-hour intervals via block.timestamp / 3600 |
| Treasury split | 50% | XPower.sol:96-98 | Half of each mint to miner's beneficiary, half to MoeTreasury (contract owner) |
| Reward formula | XPower.sol:139+ | Exponential reward curve based on leading zero nibbles | |
| Hash function | Keccak-256 | XPower.sol:126 | EVM-native SHA3 opcode; applied over (address XOR beneficiary) \parallel blockHash \parallel data |
| Minimum difficulty | XPower.sol:90 | At least one leading zero nibble required; empty nonce hash reverts | |
| Pair index dedup | Nonce-hash XOR block-hash | XPower.sol:127 | One-to-one mapping per (beneficiary, blockHash) tuple; replays revert |
NFT Parameters
| Parameter | Value | Location | Description |
|---|---|---|---|
| Level step | 3 | Nft.sol:58 | Valid levels are multiples of 3: |
| Max level | 99 | Nft.sol:56 | Levels 100+ revert with InvalidLevel |
| Number of levels | 34 | — | 0 through 99 inclusive, step 3 |
| Upgrade ratio | 1,000:1 | XPowerNft.sol | 1,000 NFTs at level |
| Denomination | Nft.sol:50 | Per-NFT XPOW value at a given level | |
| NFT ID encoding | Nft.sol:54 | Collision-free encoding of year and level into uint256 | |
| Maturity offset | Nft.sol:62 | Years from mint year until NFT can be redeemed | |
| Min mint year | 2021 | Nft.sol:55 | Years 2020 and earlier revert with InvalidYear |
| Royalty | 0.5% (price / 200) | NftRoyalty.sol:27 | ERC-2981 royalty on secondary NFT sales; beneficiary set by NFT_ROYAL_ROLE |
Reward Parameters
| Parameter | Symbol | Default | Location | Description |
|---|---|---|---|---|
| APR add | array[0] | 0 | MoeTreasury.sol | Additive constant in eval3 polynomial; also carries dynamic scalar |
| APR div | array[1] | 3 | MoeTreasury.sol | Divisor in eval3; must be non-zero |
| APR mul | array[2] | 3,375,000 | MoeTreasury.sol | Multiplier in eval3; must be non-zero |
| APR exp | array[3] | 256 | MoeTreasury.sol | Exponent numerator (root fixed at 256); range 128–512 |
| APB add | array[0] | 0 | MoeTreasury.sol | Additive constant for age-based bonus polynomial |
| APB div | array[1] | 1 | MoeTreasury.sol | Divisor for APB polynomial |
| APB mul | array[2] | 100,000 | MoeTreasury.sol | Multiplier yielding 0.1% APB per year at default |
| APB exp | array[3] | 256 | MoeTreasury.sol | Exponent numerator for APB polynomial |
| Exponent root | — | 256 | Power.sol:10 | Root for all exponentiation; exponent is numerator/256 |
| Reward denominator | 3,155,760,000 × 10^6 | MoeTreasury.sol:212 | Converts PPM rate to per-second fraction over a century | |
| PPM unit | 1,000,000 | MoeTreasury.sol | Parts per million; 10^6 PPM = 100% annual rate |
Anti-Gaming Parameters
| Parameter | Value | Location | Description |
|---|---|---|---|
| MIN_NET2RIP | 100 | Banq.sol:128 | Minimum ratio of net balance increase to excess (rip) supply; lower ratios revert |
| APOW supply cap | 43,830 tokens | Banq.sol (constructor) | Hard cap on total APOW supply; derived from 1 token/min × 20 years |
| Cap enforcement | Atomic per-claim | Banq.sol:37-38 | totalSupply() > _free_supply reverts entire transaction; no partial minting |
| Migration cap bypass | _free_supply = 0 | SovMigratable.sol | Migration mirrors existing supply; original cap was already enforced |
Rpp Parameters (Rug Pull Protection)
| Parameter | Value | Location | Description |
|---|---|---|---|
| Multiplier upper bound | 2.0× | Rpp.sol:30 | New parameter value cannot exceed 2× the previous value |
| Multiplier lower bound | 0.5× | Rpp.sol:25 | New parameter value cannot be less than 0.5× the previous value |
| Minimum change interval | 1 month (2,629,800 s) | Rpp.sol:41 | Timestamp of next change must be at least MONTH after last change |
| Array length | 4 | Rpp.sol:14 | APR and APB parameter arrays must contain exactly 4 elements |
| Array div validation | array[1] > 0 | Rpp.sol:15 | Divisor must be non-zero to prevent division-by-zero |
| Array mul validation | array[2] > 0 | Rpp.sol:16 | Multiplier must be non-zero to prevent zero-rate pathologies |
| Initial value cap | next ≤ unit when last == 0 | Rpp.sol:34 | First parameterization bounded by unit (1e6 for rates, APR_MUL for means) |
Migration Parameters
| Parameter | Value | Location | Description |
|---|---|---|---|
| Migration deadline | ~4 years (126,230,400 s) | Migratable.sol:44-45 | Relative deadline from contract deployment; auto-seals after expiry |
| Emigration window | 7 days (604,800 s) | NftMigratable.sol | Reverse direction open window (new → old); admin-gated |
| Token migration ratio | 1:1 | MoeMigratable.sol | Old XPOW burns, new XPOW mints at identical amount |
| Sealing | One-way, irreversible | Migratable.sol:172-173 | seal() sets flag that cannot be unset; no reverse migration after sealing |