Fees
You are looking at an old version of this page: revision #1066 by zoobc.how, 2026-10-27 00:42 UTC. See the current version
Every ZooBC transaction pays a fee in ZBC. Its minimum, the floor, is computed in the same way by every node from the transaction itself and a few network-wide parameters, so a wallet knows it before signing. Anything declared above the floor comes back in the same block, and the fees that are kept go to the lottery that pays the registered nodes. Nothing is burned, and no single node or organisation takes the fees.
The minimum fee
The floor has two parts:
floor = base action fee × fee scale
+ price of the body and message bytes, kept for the minimum window,
× number of registered nodes
- The base action fee is 2,500,000 atomic units (0.025 ZBC). There is no base fee per type: a payment, a token issue and a market order all start from the same base.
- The fee scale is the transfer fee that the registry's seats vote on. It starts at 1.0 and can move once per 30-day cycle (price votes).
- The bytes charge prices the transaction's body and message, kept for a minimum window of 17,280 blocks (3 days) on mainnet, at the storage price of datasets. From version 0.5.8 it is multiplied by the number of registered nodes at the previous block, because every node keeps a copy of those bytes.
A simple payment's floor is therefore just over 0.025 ZBC. The node API's GET /api/v1/blockchain/estimate-fee returns the floor before you sign.
A transaction that declares less than its floor is refused, and a block that carries one is invalid. Type 0, the no-op transaction that moves nothing, must still pay a fee above zero. A node never refuses a fee for being too high. Several actions batched into one transaction pay the sum of what each action would pay alone, with the message charged once (one transaction per account per block, and batches), and every computed charge is rounded up to at least one atomic unit.
Overpay is refunded
You may declare more than the floor. When the block is applied, the whole declared fee leaves your account, and the part above the floor comes straight back in the same block, as a separate refund entry in your account's history. For example, a testnet payment that declared 0.02550004 ZBC was charged 0.02500003 ZBC and refunded 0.00050001 ZBC. Overpaying by mistake therefore costs nothing.
Overpaying buys nothing either. A node's waiting pool ranks transactions by the fee the node will actually keep, per byte, which is the floor, because the overpay is refunded; ties go by arrival, then by transaction id. Declaring ten times the floor ranks the same as declaring the floor: a higher fee buys no earlier place, no protection from eviction when the pool is full, and cannot push other transactions out.
Where fees go
All the fees a block keeps join its reward pool, together with the newly released coins and a slice of the longevity pool, and the coinbase lottery shares that pool among the registered nodes in proportion to their participation score. The node that made the block has no special claim on the fees. They are not burned (ZBC is never burned), and the ZooBC Foundation takes no share.
One separate charge works differently. On the built-in markets, the taker fee of a trade, 0.1 % at the start and taken from what the taker receives, goes to the producer of the block; makers pay none (markets and orders).
Fee-free duties
Some transactions are work a node does for the network rather than for itself. These duties must declare a fee of exactly zero, and they must come from a registered node's own account, the address built from its node key:
- SubmitStorageProof, a node's proof that it keeps its pieces of stored files (decentralised storage pool);
- AttestEvent, a node's attestation of an event, which triggers, the bridge and release vetoes rely on (triggers and attestations);
- SetConsensusParam, FeeVoteCommitment and FeeVoteReveal, the seats' price votes (price votes);
- EquivocationReport, the proof that a producer signed two blocks on one parent (double-signing (equivocation));
- a registered node's liveness attestation, sent as a QueueAttendance with fee 0 (missed turns, suspension and expulsion).
A duty with any other fee, or sent from any other key, is refused. Free does not mean unlimited: a node may have at most one duty pending per duty object (one storage piece in one epoch, one event, one parameter, one vote window), and duties travel in their own lane of a node's waiting pool, so ordinary traffic cannot crowd them out.
Other charges
Some features carry charges of their own beside the fee, and these are never refunded: an escrow's rent (escrow), a longevity deposit that keeps a transaction stored past pruning (paying to keep data (longevity)), and a token's upkeep (token upkeep (persistence)). They end up in the longevity pool, which pays the nodes a slice in every block (pools).