88540 bc high wormhole miner volume fees are permanently unclaimable because no zk leaf is created
Submitted on Aug 13th 2026 at 17:50:51 UTC by @CarlosMB for Audit Comp | Quantus
Report ID: #88540
Report Type: Blockchain/DLT
Report severity: High
Target: https://github.com/immunefi-team/audit-comp-quantus-chain
Impacts:
Permanent freezing of unclaimed yield
Description
Summary
QPoW pays the block author to a Wormhole-derived account. Such an account is spent through the Wormhole ZK system: the miner's secret derives the account, but a withdrawal also requires a Merkle leaf committing to (recipient, transfer_count, asset_id, amount).
Normal Wormhole credits explicitly call record_transfer() after crediting balance. Mining rewards similarly call record_transfer_proof(). The miner's share of Wormhole volume fees does neither:
<T::Currency as Unbalanced<_>>::increase_balance(
&author,
miner_fee,
Precision::Exact,
)?;
Self::deposit_event(Event::MinerVolumeFeePaid {
miner: author,
amount: miner_fee,
});Therefore a successful exit increases the miner's real balance without increasing the amount represented by Wormhole leaves. The reward is not claimable by the miner through any normal protocol path.
Why it cannot be recovered by the miner
Normal signed transaction: signed accounts are derived from an ML-DSA public key, whereas the miner reward account is independently derived from the QPoW Wormhole preimage. Knowing the Wormhole secret does not provide a signing key for that
AccountId.Wormhole withdrawal: the circuit requires an actual Merkle leaf for the miner and binds the spend to that leaf's exact quantized
input_amount. No leaf is created forminer_fee.Event scanner:
Unbalanced::increase_balance()is event-free;MinerVolumeFeePaidis not one of theBalances::{Transfer, Minted, TransferOnHold, ReserveRepatriated}events recorded byWormholeProofRecorderExtension.Later mining rewards:
MiningRewards::mint_reward()creates a leaf for exactly the newreward; it never snapshots or merges the account's pre-existing balance. A later reward therefore does not absorb the missing volume fee.Genesis recording: balances are converted into genesis leaves only at block 1; later volume fees are never reconciled from balances.
Recovery/proxy/multisig paths: they require prior signed account setup/control and do not create ownership of an already-derived Wormhole miner account.
Root or a runtime/state migration could repair the state, but that is privileged intervention, not a claim/recovery path available to the miner.
Impact
Production charges a 4 bps Wormhole volume fee and allocates 50% to the block author. For every successful exit with a non-zero miner share:
The miner's protocol reward becomes permanently unclaimable unless privileged state intervention occurs. This maps to BC-H07 — Permanent freezing of unclaimed yield.
The bug is not limited to rounding dust: the recording call is missing for all miner volume fees, including amounts equal to or larger than the Wormhole 0.01 QUAN quantum.
Proof of Concept
This PoC uses a real Plonky2 private-batch proof, the real Wormhole settlement path, real Balances, and the real ZK tree. It deliberately generates a proof whose miner fee is exactly 0.01 QUAN, so the result cannot be dismissed as sub-quantum dust.
Recommended fix
Do not credit miner volume fees directly to the Wormhole account without proof recording. Accumulate them and settle them through a path that creates Wormhole leaves in representable (0.01 QUAN) quanta, or merge them into the normal mining-reward settlement before recording the miner's leaf.
Was this helpful?