Base-fee floors and the prover-gas table: the model (ADOPTED 5 October 2026)
Status: every number below was proposed on the night of 4 October 2026 and ADOPTED by the owner on 5 October 2026,
as proposed (sign-off recorded in docs/plans/release-0.3.6.md). The parameters live in the node fork
(consensus/core/src/fees.rs, FeeParams::CALIBRATED_V1; written on branch testnet-params, merged into
release-0.3.6 on 5 October 2026). Which network runs them: the testnet and the mainnet from genesis
(Params.fees = v1, fees_v1_activation_daa = 0); the devnet and the simnet keep FeeParams::PROTOTYPE until the
override file carries a fees object or the fees_v1_activation_daa height switch (section 4, "the devnet
rollout"), so the live devnet does not change rules between the 0.3.5 and 0.3.6 node builds. Spec 05 section 5.10
carries the summary. Nothing is deployed.
Inputs the model takes from the repository, with their status:
| Input |
Value |
Status, source |
| Block rate |
1 block per second |
Designed (spec 02; BlockrateParams::new::<1>()) |
Execution gas per block B_e |
30,000,000 |
Implemented, devnet v3 value (consensus/core/src/evm.rs, BLOCK_EXECUTION_GAS_LIMIT) |
| Plain transfer, execution gas |
21,000 |
Ethereum's rule |
| Year-one block subsidy |
31.69 IGN (3,168,808,781 sompi per second) |
Implemented (consensus/core/src/igneum.rs) |
| SP1 cycles per EVM gas, modexp-heavy shard |
44 |
Measured (bench-log, "shard proving on the RTX 5090", run-20261004-173115) |
| SP1 cycles per prototype pgas, same shard |
9 |
Measured (same) |
| SP1 cycles per prototype pgas, plain-transfer shard |
1,400 to 1,600 |
Measured (bench-log, 4 October, "proving: devnet v4 shards") |
| Compressed proof of a 60 M-cycle shard, one RTX 5090 |
10.9 s |
Measured (same run) |
| Aggregation of a block's shards |
2.2 to 2.5 s |
Measured (same run) |
| Token price |
$0.10 per IGN |
ASSUMPTION for the arithmetic only; sensitivities at $0.01, $1 and $2 below. Not a forecast, not a claim |
| Electricity |
$0.15 per kWh; RTX 5090 at 575 W while proving |
Approximate (the economy analysis used $0.02 to $0.40; 575 W is the card's rated draw, not measured here) |
1. The prover-gas table, calibrated v1
The unit is unchanged: 1 pgas stands for 1,000 reference SP1 cycles. The prototype table of 3 October charged every
opcode and precompile by shape with magnitudes nobody had measured. Two of its entries are now measured.
| Entry |
Prototype (3 October) |
Measurement |
Calibrated v1 |
| modexp (0x05) |
1,000 + 10 per input byte |
the modexp-dominated shard ran 60.76 M cycles for 6.75 M prototype pgas: 9 cycles per pgas against the unit's 1,000, so the entry is about 111x its cost |
10 + 1 per 10 input bytes (the prototype over 100) |
| Intrinsic per transaction |
200 |
the plain-transfer shard ran 1,400 to 1,600 cycles per prototype pgas: 200 x 1,500 = 300,000 cycles per transaction, which includes the shard's fixed witness check and root computations, so it is an upper bound |
300 |
| Every other opcode and precompile |
prototype shape |
not measured |
prototype shape, unchanged, table version 1 |
What the two constants say about a transaction: the modexp shard metered 1,390,773 EVM gas for 60.76 M cycles, 44
cycles per gas, which is 0.044 pgas per gas at the unit; a plain transfer is 300 pgas for 21,000 gas, 0.014 pgas per
gas. The design expected a pgas / gas band of 0.1 to 10 (execution-layer design 4.3); the measured band is 0.01 to
0.05, so proving gas is cheaper per gas than the design guessed, by 10x, on the two workloads measured. The
remaining entries (ecrecover 3,000 pgas, ecpairing 45,000 per pair, the storage opcodes) are the next calibration;
each is one SP1 run of a fixture that isolates it.
2. The shard and block budgets
| Quantity |
Value |
Arithmetic |
Shard budget S_p |
30,000 pgas |
30 M cycles: half the measured 60 M-cycle shard. One RTX 5090 compresses it in about 5.5 s (linear in cycles from 10.9 s, approximate); a 12 GB card in about 20 s (approximate: the economy simulation's shard shares put a 3060 at 3.7x the 5090's time; unmeasured, the phase 2 gate) |
Block budget B_p |
120,000 pgas |
4 x S_p, the prototype's ratio (spec 7.4) |
Transfers per block at B_p |
400 |
120,000 / 300 |
| Execution gas those use |
8,400,000 |
400 x 21,000, 28% of B_e: the proving dimension binds first for transfers |
| Block proof time, four RTX 5090s |
about 8 s |
5.5 s per shard in parallel plus 2.5 s aggregation (approximate), inside the 20 to 60 s launch target |
| Block proof time, four 12 GB cards |
about 23 s |
20 + 2.5 s (approximate) |
| Cards to keep pace at full blocks |
22 RTX 5090s, or about 80 12 GB cards |
4 shards x 5.5 s = 22 card-seconds per second; x 3.7 for the 12 GB class (approximate) |
The prototype B_p of 30,000,000 pgas was "equal to B_e" and never a throughput number: at 9 cycles per prototype
pgas a full prototype block is 270 M cycles, 49 s on one 5090, and at the plain-transfer rate it is 45 G cycles. The
calibrated B_p is a throughput number: one block per second provable by a fleet the economy simulation already
models. Raising it is a parameter the genesis rules leave to miners (60% signalling, spec 5.5), and the economy
analysis of 4 October recommends tying it to the live proving fleet on the testnet.
3. The base-fee floors
Both base fees are burned in full (spec 5.1) and adjusted by EIP-1559 toward half the limit with a denominator of 8
(1/8 per block at the extremes). The floor is the lowest value either fee can reach. It has three jobs: keep a plain
transfer cheap, make a full block cost real money from the first block, and price proving above the electricity it
burns so spam cannot be cheaper than the work it imposes.
| Floor |
Value |
In IGN |
Execution base fee f_e |
100 gwei per gas |
0.0000001 IGN per gas |
Proving base fee f_p |
10,000 gwei per pgas |
0.00001 IGN per pgas |
| Initial base fees at genesis |
the floors |
|
A plain transfer at the floor
| Term |
Arithmetic |
IGN |
| Execution |
21,000 x 100 gwei |
0.0021 |
| Proving |
300 x 10,000 gwei |
0.0030 |
| Total (tip excluded) |
|
0.0051 |
| Token price (assumption) |
$0.01 |
$0.10 |
$1 |
$2 |
| Transfer at the floor |
$0.000051 |
$0.00051 |
$0.0051 |
$0.0102 |
The target "under $0.01 per simple transfer" holds up to $1.96 per IGN. Under load the fee leaves the floor: after
n consecutive full blocks the base fee is the floor times 1.125^n, which is 3.2x after 10 blocks, 34x after 30 and
about 1,170x after 60 blocks (one minute). The floor prices the quiet chain; the controller prices the busy one.
A full block at the floor, which is what spam costs
| Case |
Arithmetic |
IGN per block |
Per day (86,400 blocks) |
At $0.10 per day |
| Execution dimension full (30 M gas of cheap-to-prove calls) |
30,000,000 x 100 gwei |
3.0 |
259,200 |
$25,920 |
| Proving dimension full with transfers (400 transfers) |
120,000 x 10,000 gwei + 8,400,000 x 100 gwei |
1.2 + 0.84 = 2.04 |
176,256 |
$17,626 |
| Both dimensions full (the worst mix) |
|
up to 4.2 |
362,880 |
$36,288 |
A self-paying spam loop (a miner filling its own blocks, or a contract that calls itself until the gas is gone) pays
the same: the base fee is burned, the tip returns to the miner and nets to zero, so a miner that fills its own block
burns 3.0 IGN against a subsidy of 31.69 IGN, 9.5% of its own reward per filled block, for nothing. And only at the
floor: after one minute of full blocks the controller has multiplied every number above by about 1,170.
Proving priced above its electricity
| Quantity |
Arithmetic |
Value |
| Cycles per second, one RTX 5090 |
60 M cycles / 10.9 s |
5.5 M |
| Energy per pgas (1,000 cycles) |
575 W x 1,000 / 5.5 M |
0.105 J = 2.9 x 10^-8 kWh |
| Electricity per pgas at $0.15 per kWh |
|
$4.4 x 10^-9 |
| Floor per pgas at $0.10 per IGN |
0.00001 IGN |
$1.0 x 10^-6 |
| Floor over electricity |
|
230x at $0.10; 23x at $0.01; 1x at $0.00044 |
The floor covers the physical cost of the proving it buys down to a token price of about $0.0004, which is where
this anchor would bind before the spam anchor does. The execution dimension has no such anchor: native execution of
a full block costs tens of milliseconds of CPU; its floor is set by the spam arithmetic alone, as Ethereum's is.
4. What the table and the floors do not settle
| Item |
State |
| The other opcode and precompile entries |
prototype shapes; calibrate per entry in SP1 with three input sizes (design R1) |
| The intrinsic 300 |
an upper bound that includes the per-shard fixed cost; a shard with many transfers will show the marginal number |
The 12 GB card time for S_p |
approximate, from the simulation's share ratios; the phase 2 gate measures it |
| The prover's mirror of the table |
proving/igneum-prove/core/src/config.rs and pgas.rs carry the prototype values at b7fca5a0; they must change in lockstep with the node (the guest program's id changes, every fixture is re-cut at the new S_p), or the shard statement differs from the node's. Not changed tonight |
| The devnet rollout |
done as a height switch (5 October 2026): Params.fees_v1_activation_daa (override file, default never on devnet and simnet, 0 on testnet and mainnet, in the consensus digest). Chain blocks at or above the switch meter with v1 (every metering site in igneum/exec takes the block's DAA score, fees::fee_params_at); the first such block raises both base fees to the v1 floors. The live devnet keeps its history and its prototype rules until the switch is published with the 0.3.6 update (docs/plans/release-0.3.6.md, section 5). A fresh chain can instead carry fees in the override file (the fast-time profile does) |
| The price assumption |
$0.10 is an arithmetic assumption. The floor is a parameter the genesis rules leave to miners (60% signalling) and can be moved by them |
5. Where the numbers live
| What |
Where |
| The parameter set and its tests |
vendor/igneum-node-testnet/consensus/core/src/fees.rs (branch testnet-params) |
| Per network |
consensus/core/src/config/params.rs, Params.fees and Params.fees_v1_activation_daa (FeeParams::TESTNET and MAINNET = CALIBRATED_V1 with the switch at 0; FeeParams::DEVNET and SIMNET = PROTOTYPE with the switch never, both movable through the override file) |
| The execution layer's readers |
igneum/exec/src/config.rs (block_proving_gas_limit(daa), intrinsic_pgas_per_tx(daa), the floor and initial readers, every one at a DAA score), pgas.rs (the inspector carries the block's table; the modexp entry reads it), executor.rs (execute_segment picks the set by the block's DAA score and raises the carried base fees to its floors; next_base_fee takes the floor and the denominator) |
| Installed at start |
kaspad/src/daemon.rs (install_fee_params: the base set and the switch, printed after the PoW schedule) |
| The specification |
docs/spec/05-fees-and-economics.md section 5.10 |