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_collectormodule account during the block. For EVM transactions, unused gas is refunded fromfee_collectorbefore the block ends, so what remains is the fee actually charged (see Gas on c8ntinuum). - In
BeginBlockof the next block,x/feeburnreads all balances held byfee_collector, moves them to thefeeburnmodule account, and burns them from there. Thefeeburnmodule account holds theBurnerpermission. - Every denom held by
fee_collectoris burned in one pass. On mainnet, fees can only be paid in CTM, so in practice this is the CTM fee total. - If
fee_collectoris empty, the module does nothing for that block. - The burn runs after the
x/feemarketandx/vmbegin blockers and beforex/distribution, sox/distributionalways 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.
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.
app_state.feeburn object.
Module accounts
Verify on mainnet
Query the fee pot and the total CTM supply through the public REST endpoint: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 theevmd Go module and link against the Rust SP1 verifier library, so run them through the top-level Makefile:
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.