x/feeburn burns every transaction fee the chain collects. At the start of each block it takes the whole fee_collector balance, which holds the fees paid in the previous block, and destroys it. This covers the full fee of EVM and Cosmos SDK transactions: the EIP-1559 base fee and the priority fee (tip) alike. Validators and delegators receive no fee revenue; validators are paid through Validator Rewards instead.

Core logic

  • Fees are collected into the standard fee_collector module account during the block. For EVM transactions, unused gas is refunded from fee_collector before the block ends, so what remains is the fee actually charged (see Gas on c8ntinuum).
  • In BeginBlock of the next block, x/feeburn reads all balances held by fee_collector, moves them to the feeburn module account, and burns them from there. The feeburn module account holds the Burner permission.
  • Every denom held by fee_collector is burned in one pass. On mainnet, fees can only be paid in CTM, so in practice this is the CTM fee total.
  • If fee_collector is empty, the module does nothing for that block.
  • The burn runs after the x/feemarket and x/vm begin blockers and before x/distribution, so x/distribution always finds an empty fee pot and allocates nothing to validators or the community pool.
  • The priority fee still sets transaction priority in the mempool, but it is burned together with the base fee rather than paid to the block proposer.
Because the burn happens at the start of the following block, querying fee_collector at the latest height can show a nonzero balance: those are the fees of the latest block, which are burned when the next block begins.

Parameters and genesis

x/feeburn is stateless. It has no parameters, no store, no transactions, and no queries, so there is no setting that governance can change.
Mainnet genesis contains this empty app_state.feeburn object.

Module accounts

Verify on mainnet

Query the fee pot and the total CTM supply through the public REST endpoint:
Mainnet inflation is 0, so no CTM is minted, and the total supply falls by the amount of fees burned. The feeburn module account balance is always empty between blocks.

Test commands

Run the test from the root of the c8ntinuum source repository (see Build the Node for prerequisites). The tests live in the evmd Go module and link against the Rust SP1 verifier library, so run them through the top-level Makefile:
The test seeds fee_collector with CTM and a second denom, advances one block, and checks that fee_collector is empty, that the second denom’s total supply is back to zero, and that x/distribution outstanding rewards and the community pool did not grow.