Skip to main content

Fees

Hashi charges no protocol fee. Deposits are free, and every withdrawal pays only the Bitcoin miner fee required to get the transaction confirmed onchain.

Fee parameters at a glance​

ValueDefaultNotes
bitcoin_deposit_minimum30,000 sats (initial)Configurable minimum deposit
bitcoin_withdrawal_minimum30,000 satsSet by governance; Hashi derives worst_case_network_fee from it
worst_case_network_fee29,454 satsDerived: max(bitcoin_withdrawal_minimum, 547) - 546
DUST_RELAY_MIN_VALUE546 satsBitcoin's dust threshold for the user's output
withdrawal_fee_conf_target3 blocksAt most 12
withdrawal_min_fee_rate_sat_vb3 sat/vBFee-rate floor, configurable per node
Mainnet fee-rate cap100 sat/vBApplies to the estimate before the floor
Signet fee-rate cap9 sat/vBApplies to the estimate before the floor

Deposits​

Deposits are free. They must meet the configurable bitcoin_deposit_minimum (initially 30,000 sats).

Withdrawal fees​

The only fee a user pays on withdrawal is the miner fee, the actual Bitcoin transaction fee required for onchain confirmation. This is not a fixed value. It depends on the current network fee rate and the transaction's weight. The user pays this fee through a reduction in their withdrawal output amount. There is no protocol fee.

Why the user pays the miner fee​

The UTXO pool belongs to the protocol. If the pool absorbed miner fees, every withdrawal would shrink the pool by more than the withdrawn amount, effectively socializing costs across all future users. Shifting the miner fee to the withdrawing user keeps the pool whole: the invariant input_total = user_output + change holds, so the change output that returns to the pool is undiminished.

Withdrawal minimum​

The protocol enforces a minimum withdrawal amount to guarantee that every request can produce a valid Bitcoin transaction even under worst-case fee conditions. Governance sets bitcoin_withdrawal_minimum directly (default 30,000 sats), and Hashi derives worst_case_network_fee from it, so the 2 always satisfy:

bitcoin_withdrawal_minimum = worst_case_network_fee + DUST_RELAY_MIN_VALUE
  • worst_case_network_fee is the maximum miner fee the protocol ever charges (see below).
  • DUST_RELAY_MIN_VALUE (546 sats) ensures the user's output remains above Bitcoin's dust threshold after the miner fee deduction.

A user who withdraws exactly the minimum receives, in the worst case, a 546 sats output. In practice, actual miner fees are usually well below the worst case, so the user receives more.

Fee rate estimation​

Hashi obtains the current fee rate from the connected Bitcoin Core node through estimatesmartfee in ECONOMICAL mode, targeting confirmation within withdrawal_fee_conf_target blocks (default 3, around 30 minutes; at most 12). Longer targets would read Core's day- and week-long estimation horizons, which lag the fee market.

If Bitcoin Core has no estimate, for example while its estimator warms up after a restart, the leader doesn't build withdrawal transactions and validators don't sign them. Only regtest, which has no fee market, falls back to 1 sat/vB.

Hashi then floors the estimated fee rate at 3 sat/vB (configurable per node with withdrawal_min_fee_rate_sat_vb). The onchain worst_case_network_fee bounds each user's share of the miner fee: while a batch's share would exceed it, the leader waits for fees to fall or for more requests to share them, rather than broadcasting a transaction that would sit unconfirmed.

On Mainnet Hashi also caps the estimate at 100 sat/vB before the floor applies. That is far above what blocks usually charge, but fee spikes have passed it for days at a time, as in December 2023. Hashi can't replace a signed withdrawal with a higher-fee version, so one priced at the cap during a spike stays unconfirmed until fees fall back.

Signet's cap is lower. Its blocks rarely fill, but Bitcoin Core's estimate there follows the few relayed transactions that pay hundreds of sat/vB, so on Signet Hashi caps the estimate at 9 sat/vB before the floor applies.

Raising that floor on the leader alone only helps so far. Validators derive their ceiling from their own floor and estimate, so they reject a fee more than 3x above what they see; operators must configure a larger rescue across the fleet.

Worst-case network fee​

Every withdrawal must cover not just its own onchain footprint but also a share of UTXO pool maintenance. At minimum, a withdrawal must pay for the fixed transaction overhead, its own recipient output, and a change output back to the pool. The additional headroom allows the coin selector to consolidate many small UTXOs into fewer large ones during normal withdrawal traffic. This opportunistic consolidation (UTXO smashing) keeps the pool healthy without requiring dedicated consolidation transactions.

Hashi derives the worst-case miner fee per withdrawal from the governance-configured bitcoin_withdrawal_minimum parameter:

worst_case_network_fee = bitcoin_withdrawal_minimum - DUST_RELAY_MIN_VALUE

With defaults: 30,000 - 546 = 29,454 sats.

The actual miner fee is usually well below the worst case. Users are charged only for the real transaction weight, not the worst-case budget. The difference stays in the user's output.

Transaction validation fee bounds​

When validators verify a proposed withdrawal transaction, they check the fee against three bounds:

  • Floor: the fee must be at least 1 sat/vB (the minimum relay fee), or the Bitcoin network does not propagate the transaction.
  • Ceiling: the fee must not exceed 3x the validator's own fee estimate for the same transaction weight, including any CPFP deficit its unconfirmed ancestors owe (see Stuck transactions). This prevents a malicious leader from overpaying fees to extract value from users.
  • Per-user cap: the per-user share of the miner fee must not exceed the worst-case network fee computed from the onchain config. This ensures the Move contract's upfront minimum calculation was sufficient.

Stuck transactions​

Hashi does not attempt to replace stuck transactions with higher-fee replacements (Replace-By-Fee, or RBF). Instead, if a transaction is not confirmed within a reasonable time, fee bumping relies on CPFP (Child Pays For Parent):

  • The withdrawal recipient can spend their output with a high-fee child transaction.
  • Hashi can spend the change UTXO that returned to the pool, which also bumps the parent.