Parameters Reference
All configurable and immutable parameters that govern the game's behavior.
Game Parameters (NukeGame)
| Parameter | Default Value | Owner-Settable | Description |
|---|---|---|---|
countdownDuration | 4 hours | Yes | Time between rounds |
voteDuration | 5 minutes | Yes | How long the voting window stays open |
winnerBuybackBps | 4,000 (40%) | Yes | Share of nuke ETH that buys winner country tokens |
spreadBuybackBps | 4,000 (40%) | Yes | Share that buys a random country's tokens |
randomBuybackBps | 1,000 (10%) | Yes | Share that buys another random country's tokens |
treasuryBps | 1,000 (10%) | Yes | Share sent to treasury |
Fee split percentages must always sum to exactly 100% (10,000 bps). Changing one requires adjusting others.
Chainlink VRF Parameters (NukeGame)
| Parameter | Default Value | Owner-Settable | Description |
|---|---|---|---|
vrfCallbackGasLimit | 800,000 | Yes | Gas limit for the VRF callback (must cover liquidity removal + 3 swaps) |
vrfRequestConfirmations | 3 | Yes | Block confirmations before VRF fulfillment |
VRF_TIMEOUT | 1 hour | No (constant) | Time after which owner can trigger prevrandao fallback |
VRF Network Addresses
NukeGame uses VRF V2.5 direct funding — only the Wrapper address is consumed by the contract (Coordinator and LINK are informational, not used by the protocol).
| Component | Base Mainnet (8453) | Base Sepolia (84532) |
|---|---|---|
| VRF V2.5 Wrapper | 0xb0407dbe851f8318bd31404A49e658143C982F23 | 0x7a1BaC17Ccc5b313516C5E16fb24f7659aA5ebed |
| VRF Coordinator | see Chainlink docs | 0x5C210eF41CD1a72de73bF76eC39637bB0d3d7BEE |
| LINK Token | see Chainlink docs | 0xE4aB69C077896252FAFBD49EFD26B5D171A32410 |
For canonical Chainlink addresses see docs.chain.link/vrf/v2-5/supported-networks.
The contract pays for VRF in native ETH (not LINK). It must hold an ETH balance to cover VRF fees. The deployment script seeds 0.02 ETH; the owner can replenish via direct transfer or withdraw unused balance via withdrawVrfBalance().
Fee Parameters (NukeGameHook)
Immutable Constants
| Parameter | Value | Description |
|---|---|---|
ABSOLUTE_MAX_FEE_BPS | 500 (5%) | Hard cap on base fee — cannot be changed by admin |
ANTI_SNIPE_MAX_FEE_BPS | 9,000 (90%) | Starting sell fee during anti-snipe |
ANTI_SNIPE_DURATION | 300 seconds (5 min) | Anti-snipe decay window |
NUKE_WINDOW_SELL_FEE_BPS | 2,000 (20%) | Sell fee during voting |
LP_FEE_OVERRIDE | 0 | LP fee set to zero (protocol takes all) |
Admin-Configurable
| Parameter | Default | Setter | Description |
|---|---|---|---|
flatFeeBps | 100 (1%) | setFees() | Base fee on every trade |
maxTotalFeeBps | 500 (5%) | setFees() | Soft cap on base fee (flat + dynamic), bounded by ABSOLUTE_MAX_FEE_BPS |
maxDynamicFeeBps | 400 (4%) | setDynamicFeeParams() | Cap on volatility-based fee component |
feeControlNumerator | 500 | setDynamicFeeParams() | Sensitivity of fee to volatility |
decayPeriod | 60 seconds | setDynamicFeeParams() | How often volatility decays |
decayBps | 5,000 (50%) | setDynamicFeeParams() | How much volatility decays per period |
treasurySplitBps | 3,000 (30%) | setTreasurySplit() | Share of fees sent to Prize Pot (remainder to protocol) |
protocolFeeRecipient | deployer | setProtocolFeeRecipient() | Address receiving protocol's share of fees (70%) |
treasuryRecipient | PrizePot | setTreasuryRecipient() | Address receiving treasury share of fees (30%) |
The flatFeeBps and maxTotalFeeBps can be lowered by the admin but can never exceed the immutable ABSOLUTE_MAX_FEE_BPS (5%). This prevents the protocol from raising fees beyond the hard cap.
Prize Pot Parameters (PrizePot)
| Parameter | Value | Description |
|---|---|---|
game | NukeGame address | Immutable, only address that can call finalize() |
owner | Deployer address | Immutable, only address that can call sweep() |
snapshotPot | Set at finalization | ETH balance frozen when game ends |
snapshotSupply | Set at finalization | Winning token total supply at game end |
Claim formula: ethOut = (tokenAmount * snapshotPot) / snapshotSupply
Token Parameters (CountryToken)
| Parameter | Value | Description |
|---|---|---|
| Total Supply | 1,000,000,000 (1B) | Fixed supply per country |
| Decimals | 18 | Standard ERC20 |
| Initial Distribution | 100% to NukeGame | All tokens go to liquidity |
Liquidity Distribution (Staircase)
| Tier | Tick Lower | Tick Upper | Allocation |
|---|---|---|---|
| 1 | -887,220 | -300,000 | 25.0% |
| 2 | -300,000 | 0 | 20.0% |
| 3 | 0 | 100,020 | 18.0% |
| 4 | 100,020 | 144,000 | 15.0% |
| 5 | 144,000 | 168,000 | 10.0% |
| 6 | 168,000 | 180,000 | 7.0% |
| 7 | 180,000 | 184,200 | 5.0% |
PSA Board Parameters
| Parameter | Value | Description |
|---|---|---|
FLOOR_PRICE | 0.005 ETH | Minimum posting price |
DECAY_DURATION | 6 hours | Time for price to decay from peak to floor |
MAX_MESSAGE_LENGTH | 280 characters | Maximum PSA message length |
| Price Multiplier | 2x | Next price = 2x last price paid |
Governance Parameters (ZK Roundtable)
| Parameter | Value | Description |
|---|---|---|
| Vote Duration | 5 minutes | Voting window length |
| Seats Per Round | One per alive country | Only the top holder of each alive country can vote |
| Votes Per Country | 1 per round | Nullifier Poseidon(2, roundId, countryCode) enforces no double-voting |
| Vote Weight | aliveCount - rank + 1 | #1 market cap = heaviest seat (and immune); last place = weight 1 |
| Immune Country | #1 market cap | Cannot be voted as the nuke target; still gets a seat |
| Merkle Tree Depth | 8 | Supports up to 256 alive countries |
| Leaf Format | Poseidon(countryCode, rank, topHolder) | Included under the per-round rankingRoot |
| Vote Encryption | NaCl box (curve25519-xsalsa20-poly1305) | Encrypted to keeperPublicKey() on-chain |
| Binding Commitment | keccak256(voterCountry, targetCountry, salt) | Posted at vote time; keeper cannot substitute plaintext at reveal |
| ZK Circuit | Noir vote_eligibility | Verified by Barretenberg UltraHonk (HonkVerifier contract) |
| Minimum Countries | 2 | Game requires at least 2 alive countries |
Game Constants
| Constant | Value |
|---|---|
| Total Countries | 177 |
| Tokens Per Country | 1,000,000,000 |
| Liquidity Positions Per Country | 7 |
| Chain | Base Sepolia (84532) |
| Tick Spacing | 60 |
| Initial sqrtPriceX96 | 792281625142643375935439503360000 |
| Randomness Source | Chainlink VRF V2.5 (direct funding, native ETH) |
| VRF Random Words Per Request | 1 (3 values derived via keccak256) |