For the complete documentation index, see llms.txt. This page is also available as Markdown.

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 for miner_fee.

  • Event scanner: Unbalanced::increase_balance() is event-free; MinerVolumeFeePaid is not one of the Balances::{Transfer, Minted, TransferOnHold, ReserveRepatriated} events recorded by WormholeProofRecorderExtension.

  • Later mining rewards: MiningRewards::mint_reward() creates a leaf for exactly the new reward; 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.

1

Generate a valid proof with a full-quantum miner fee

In pallets/wormhole/src/tests.rs, inside fixture_gen::build_test_private_batch_proof, change only:

At 4 bps:

Regenerate the repository's valid private-batch fixture:

2

Add the regression test

Add this inside private_batch_proof_tests:

3

Run the regression test

A passing test proves that settlement of a valid generated Wormhole proof credits a full-quantum miner fee to the miner's real balance without creating corresponding ZK spend capacity. It also proves that a later correctly-recorded reward does not absorb the missing balance.

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?