Parameters Reference
All configurable and immutable parameters that govern the game's behavior.
Game Parameters (DelistGame)
| 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 delisting ETH that buys blue-chip index tokens |
spreadBuybackBps | 4,000 (40%) | Yes | Share that buys a random index's tokens |
randomBuybackBps | 1,000 (10%) | Yes | Share that buys another random index'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.
Randomness Provider Parameters
Robinhood Chain has no randomness oracle (no Chainlink VRF, Pyth Entropy, or Gelato VRF), so IndexPVP uses Quiver VRF from the Quiver Foundation — a verifiable two-party commit–reveal randomness coordinator behind the provider-agnostic IRandomnessProvider interface, fulfilled by the QuiverRandomnessProvider adapter. See QuiverRandomnessProvider for the full design.
| Parameter | Value | Owner-Settable | Description |
|---|---|---|---|
RANDOMNESS_TIMEOUT | 1 hour | No (constant) | Time after which the owner can trigger the fallback via cancelPendingDelisting() |
| Randomness provider | QuiverRandomnessProvider | Yes | Swappable via DelistGame.setRandomnessProvider() |
| Quiver coordinator / provider addresses | Chain-selected | Env override | Selected by chain id in Deploy.s.sol; overridable via QUIVER_COORDINATOR / QUIVER_PROVIDER |
| Random word derivation | keccak256(userRandom ‖ providerRevelation) | No | Two-party value: fair as long as either the consumer or Quiver is honest |
| Fallback entropy | keccak256(blockhash(block.number - 1), block.timestamp, ...) | No | Used only by the timeout fallback — never block.prevrandao (constant 1 on Arbitrum-stack chains) |
The game contract pays the provider in native ETH per request and must hold a balance to cover request fees. The owner can replenish via direct transfer or withdraw unused balance via withdrawRandomnessBalance().
Fee Parameters (DelistGameHook)
Immutable Constants
| Parameter | Value | Description |
|---|---|---|
ABSOLUTE_MAX_FEE_BPS | 500 (5%) | Hard cap on base fee — cannot be changed by admin |
CIRCUIT_BREAKER_MAX_FEE_BPS | 9,000 (90%) | Starting sell fee while a circuit breaker is active |
CIRCUIT_BREAKER_DURATION | 300 seconds (5 min) | Circuit-breaker decay window |
HALT_WINDOW_SELL_FEE_BPS | 2,000 (20%) | Sell fee during the voting trading halt |
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 | DelistGame 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 the market closes |
snapshotSupply | Set at finalization | Winning token total supply at market close |
Redemption formula (NAV): ethOut = (tokenAmount * snapshotPot) / snapshotSupply
Token Parameters (IndexToken)
| Parameter | Value | Description |
|---|---|---|
| Total Supply | 1,000,000,000 (1B) | Fixed supply per index |
| Decimals | 18 | Standard ERC20 |
| Initial Distribution | 100% to DelistGame | 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% |
News Wire 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 headline 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 listed index | Only the top holder of each listed index can vote |
| Votes Per Index | 1 per round | Nullifier Poseidon(2, roundId, indexCode) enforces no double-voting |
| Vote Weight | aliveCount - rank + 1 | #1 market cap = heaviest seat (and immune); last place = weight 1 |
| Immune Index | #1 market cap (blue chip) | Cannot be voted as the delisting target; still gets a seat |
| Merkle Tree Depth | 8 | Supports up to 256 listed indexes |
| Leaf Format | Poseidon(indexCode, rank, topHolder) | Included under the per-round rankingRoot |
| Vote Encryption | NaCl box (curve25519-xsalsa20-poly1305) | Encrypted to keeperPublicKey() on-chain |
| Binding Commitment | keccak256(voterIndex, targetIndex, salt) | Posted at vote time; keeper cannot substitute plaintext at reveal |
| ZK Circuit | Noir vote_eligibility | Verified by Barretenberg UltraHonk (HonkVerifier contract) |
| Minimum Indexes | 2 | Game requires at least 2 listed indexes |
Game Constants
| Constant | Value |
|---|---|
| Total Indexes | 117 |
| Tokens Per Index | 1,000,000,000 |
| Liquidity Positions Per Index | 7 |
| Chains | Robinhood Chain (4663, production), Robinhood Chain Testnet (46630, staging) |
| Tick Spacing | 60 |
| Initial sqrtPriceX96 | 792281625142643375935439503360000 |
| Randomness Source | Quiver VRF via QuiverRandomnessProvider (two-party commit–reveal, native ETH) |
| Random Words Per Request | 1 (3 values derived via keccak256) |