> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hedera.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Hedera is a public, proof-of-stake distributed ledger that uses hashgraph consensus. Do not call it a blockchain.
> Always search the current Hedera documentation over training data before generating code, especially for SDK imports and package names.
> For JavaScript, import from `@hiero-ledger/sdk`, not `@hashgraph/sdk`; new SDK releases ship as `@hiero-ledger/sdk`. The Java SDK keeps the `com.hedera.hashgraph:sdk` Maven coordinates. Verify the exact import against the docs.
> Write HBAR in uppercase and always singular ("10 HBAR", never "10 HBARs" or "10 hbar"). Write tinybars in lowercase and plural.
> Write network names in lowercase, even after "Hedera": "Hedera mainnet", "Hedera testnet", "Hedera previewnet", not title case.
> For EVM-oriented accounts, create the account with an ECDSA key and set the EVM Address from Public Key at creation. This address is immutable and is not updated by key rotation. Do not use retired terms like "EVM alias" or "Account Number Alias".

# Fee Model

> Understand the simplified `base-fee-plus-extras` model for Hedera transaction and query fees introduced by [HIP-1261](https://hips.hedera.com/hip/hip-1261)

## Overview

Hedera uses a simplified fee model where every transaction cost is calculated as a **base fee plus extras**. Introduced in [HIP-1261](https://hips.hedera.com/hip/hip-1261), this model replaces the previous resource-weighted fee schedule with transparent, predictable pricing.

All fees are defined in **USD as tinycents** and converted to HBAR at the current network exchange rate before being charged. The fee schedule is stored as a JSON document in system file `0.0.113` on the network.

<Info>
  **What is a tinycent?** One cent USD = 10⁸ tinycents. One dollar USD = 10¹⁰ tinycents. Tinycents provide high precision for fee calculations without floating-point math.
</Info>

<Accordion title="Key terms">
  | Term | Definition |
  | - | - |
  | **Base Fee** | The fixed minimum fee in tinycents for a transaction or query before any extras are applied. |
  | **Extras** | Additional cost factors on top of the base fee, such as signatures, bytes, keys, or gas. Each has a per-unit fee and an optional included count. |
  | **Included Count** | Units of an extra included for free in the base fee before additional charges apply. |
  | **Tinycent** | The smallest fee unit. 10⁸ tinycents = 1 cent USD. 10¹⁰ tinycents = 1 USD. |
  | **Node Fee** | Fee paid to the submitting node. Same calculation for all transaction types. |
  | **Network Fee** | A multiplier of the node fee covering consensus and storage. |
  | **Service Fee** | Covers execution costs. Varies by transaction type. |
</Accordion>

## Fee Components

Every transaction fee is split into three components:

| Component | What It Covers | How It's Calculated |
| - | - | - |
| **Node** | Compensates the submitting node for pre-checking and forwarding the transaction | `baseFee` + extras (processing bytes, signatures). Identical formula for **all** transaction types. |
| **Network** | Covers gossip, consensus, signature verification, and blockchain storage | A configurable multiplier of the node fee (default: 9×). |
| **Service** | Covers execution costs, state changes, and blockstream output | `baseFee` + transaction-specific extras (keys, token types, gas, etc.). Varies by transaction type. |

```text theme={null}
totalFee = nodeFee + networkFee + serviceFee
```

The node and network fees are uniform across all transaction types — only the service fee varies per transaction.

## Extras

Extras are additional cost factors applied on top of a base fee. Each extra has a **name**, a **per-unit fee** (in tinycents), and an optional **included count** — the number of units included for free before additional charges apply. Hedera transaction and query fees follow a `base fee + extras` [fee model](/learn/core-concepts/fee-model) defined by [HIP-1261 (Simple Fees)](https://hips.hedera.com/hip/hip-1261). For current per-unit fees in USD, see the [mainnet fees page](/networks/fees#extras).

The following extras are defined in the fee schedule:

| Extra | Description |
| - | - |
| `Signatures` | Signature verifications on the transaction. 1 included in base fee. |
| `Keys` | Keys defined when creating or updating an entity. 1 included in base fee. |
| `Accounts` | Accounts loaded during handling. 2 included on `CryptoTransfer`. |
| `TokenTypes` | Distinct token types referenced in a transfer. 1 included in base fee. |
| `Gas` | Gas consumed by hook program execution within transfers and by `ContractCallLocal` queries. |
| `Allowances` | Allowances granted on `ApproveAllowance`, or NFT allowances deleted on `DeleteAllowance`. 1 included in base fee. |
| `Airdrops` | Pending airdrops created — applies only when the recipient hasn't pre-associated the token. |
| `TokenTransferBase` | Applies once per `CryptoTransfer` with one or more token transfers when no token has custom fees. |
| `TokenTransferBaseCustomFees` | Applies once per `CryptoTransfer` with at least one custom-fee token. |
| `TokenCreateWithCustomFee` | Added to `TokenCreate` when custom fees or a `fee_schedule_key` are defined. |
| `TokenMintNft` | NFT serials minted on `TokenMint`. 1 included in base fee. |
| `TokenMintNftBase` | Added once per `TokenMint` operation that mints NFTs (not fungible). |
| `NftUpdate` | NFTs updated on `TokenUpdateNfts`. 1 included in base fee. |
| `TokenAssociate` | Token associations on `TokenAssociate` or auto-associations during a transfer. 1 included in base fee. |
| `ConsensusCreateTopicWithCustomFee` | Added to `ConsensusCreateTopic` when the new topic has custom fees defined. |
| `ConsensusSubmitMessageWithCustomFee` | Per message submitted to a topic with custom fees. |
| `ConsensusSubmitMessageWithCustomFeeBytes` | Per byte of message payload on a custom-fee topic. First 1,024 bytes included in base fee. |
| `ConsensusSubmitMessageWithoutCustomFeeBytes` | Per byte of message payload on a regular topic. First 100 bytes included in base fee. |
| `ScheduleCreateContractCallBase` | Added to `ScheduleCreate` when the scheduled inner operation is a contract call. |
| `Records` | Records returned by `TransactionGetRecord`. 1 included in base fee. |
| `StateBytes` | Bytes persisted to state on `FileCreate`, `FileUpdate`, or `FileAppend`. 1,000 bytes included per transaction. |
| `ProcessingBytes` | Transaction body bytes processed by the node. 1,350 included in the base fee. |
| `EvmDispatchSurcharge` | A 20% premium added to the HAPI fee of any operation invoked from a smart contract via Hedera's system contracts (HTS, HAS, HSS). Does not apply to pure-EVM operations. |

<Note>
  Hedera transaction and query fees follow a `base fee + extras` [fee model](/learn/core-concepts/fee-model) defined by [HIP-1261 (Simple Fees)](https://hips.hedera.com/hip/hip-1261).
</Note>

<Tip>
  The **included count** means you don't pay extra for typical usage. For example, the node fee includes a default allotment of processing bytes and one signature — a small, single-signature transaction pays zero byte and signature extras on the node component.
</Tip>

## Fee Calculation Example

Consider a basic `CryptoCreate` transaction with a single key and 150 bytes:

<Steps>
  <Step title="Calculate the node fee">
    The node fee applies the same formula to all transactions:

    ```text wrap theme={null}
    Node baseFee:           100,000 tinycents
    ProcessingBytes extra:  150 bytes used, 1,024 included → 0 charged → 0
    Signatures extra:       1 signature, 1 included → 0 charged → 0
    ─────────────────────────────────────────────────────────────────────
    Node fee total:         100,000 tinycents
    ```
  </Step>

  <Step title="Calculate the network fee">
    The network fee is a multiplier of the node fee:

    ```text theme={null}
    Network fee = 9 × 100,000 = 900,000 tinycents
    ```
  </Step>

  <Step title="Calculate the service fee">
    The service fee is specific to `CryptoCreate`:

    ```text wrap theme={null}
    Service baseFee:    499,000,000 tinycents
    Keys extra:         1 key used, 1 included → 0 charged → 0
    ──────────────────────────────────────────────────────────
    Service fee total:  499,000,000 tinycents
    ```
  </Step>

  <Step title="Sum the total">
    ```text wrap theme={null}
    Total = 100,000 + 900,000 + 499,000,000 = 500,000,000 tinycents ≈ $0.05 USD
    ```

    This amount is converted to HBAR at the current exchange rate and charged to the payer.
  </Step>
</Steps>

If the same transaction used **two** keys instead of one, the service fee would increase by the per-key extra fee (e.g., 10,000,000 tinycents), because the included count of 1 key is exceeded by 1.

## Transaction Outcomes and Fees

Not all transactions succeed. The fee charged depends on how far the transaction progresses:

| Outcome | Description | Who Pays | Components Charged |
| - | - | - | - |
| **Successful** | Transaction executed normally | Payer | Node + Network + Service |
| **Bad** | Passed due-diligence but failed during execution (e.g., out of gas, semantically wrong, inconsistent with state) | Payer | Node + Network + Service (full) |
| **Unhandled** | Well-formed but not executed (e.g., throttled, duplicate, unexecuted portion of an atomic batch) | Payer | Node + Network |
| **Invalid** | Failed due-diligence checks by the submitting node (e.g., payer can't afford the fee, incompatible fields) | Submitting node | Network only |
| **Unreadable** | Bytes cannot be parsed as a valid protobuf `Transaction` | Submitting node | Punitive flat fee |

<Warning>
  Bad transactions are charged full freight (node + network + service) to protect the network from denial-of-service attacks. This applies even if the transaction fails due to a bug (`FAIL_INVALID`).
</Warning>

## Congestion Pricing

[HIP-1313](https://hips.hedera.com/hip/hip-1313#hip-1313) introduces an optional high-volume lane for entity-creation transactions above the standard throttle. When a transaction opts in with `setHighVolume(true)`, the network may apply a fee multiplier if the high-volume throttle bucket is under load. The multiplier scales with congestion level and is reflected in the `high_volume_multiplier` field of the fee estimate response.

The `high_volume_multiplier` field uses a 1-based scale `(1 = 1×, 4 = 4×)`. `TransactionRecord.highVolumePricingMultiplier` — available after execution — uses a `1000-based scale (1000 = 1×, 4000 = 4×)`. Both represent the same multiplier.

To simulate the fee at a specific congestion level before committing, use `setHighVolumeThrottle()` on `FeeEstimateQuery`. See [Estimating Fees](/native/fees/fee-estimation) with the SDK for code examples.

## Fee Schedule Configuration

The fee schedule is a JSON document stored in system file **`0.0.113`**. It defines:

| Section | Purpose |
| - | - |
| `extras` | All available extra fee definitions (name + per-unit fee) |
| `node` | Node fee configuration (base fee + extras with included counts) |
| `network` | Network fee configuration (multiplier) |
| `services` | Per-service groupings of transaction and query fee definitions |
| `unreadable` | Punitive fee for unparsable transaction bytes |

<Accordion title="Example fee schedule structure (JSON)">
  ```json theme={null}
  {
    "version": 0,
    "extras": [
      { "name": "Signatures", "fee": 100000 },
      { "name": "ProcessingBytes", "fee": 10000 },
      { "name": "Keys", "fee": 10000000 }
    ],
    "node": {
      "baseFee": 100000,
      "extras": [
        { "name": "ProcessingBytes", "includedCount": 1024 },
        { "name": "Signatures", "includedCount": 1 }
      ]
    },
    "network": { "multiplier": 9 },
    "services": [
      {
        "name": "CryptoService",
        "transactions": [
          {
            "name": "CryptoCreate",
            "baseFee": 499000000,
            "extras": [
              { "name": "Keys", "includedCount": 1 }
            ]
          }
        ],
        "queries": []
      }
    ],
    "unreadable": { "fee": 100000000000 }
  }
  ```
</Accordion>

<Note>
  The legacy fee schedule in system file `0.0.111` remains available in its existing format for backward compatibility, but it will not receive further updates.
</Note>

## Fee Estimation

You can estimate transaction fees before submitting them using the Mirror Node REST API:

```bash theme={null}
POST /api/v1/network/fees?mode=intrinsic
Content-Type: application/protobuf

<Transaction protobuf binary>
```

The endpoint supports two modes:

| Mode | Behavior |
| - | - |
| `intrinsic` (default) | Estimates based on the transaction's inherent properties (size, signatures, keys) |
| `state` | Estimates using the mirror node's latest known state (e.g., checks if accounts exist) |

See [Mirror Node REST API Network](/reference/rest-api/network) for the full endpoint specification and response format.

## Queries

Queries follow the same base-fee-plus-extras structure as transactions. Some queries are marked as `free` in the fee schedule (e.g., `CryptoGetAccountBalance`, `TransactionGetReceipt`). For non-free queries, the SDK creates a `CryptoTransfer` payment transaction to pay the node, network, and service fees.

## Fee Schedule Schema (Protobuf)

The fee schedule is defined as a set of protobuf messages. The wire format is JSON, stored in system file `0.0.113`.

### FeeSchedule

Top-level message defining the complete fee configuration.

| Field | Type | Description |
| - | - | - |
| `node` | NodeFeeSchedule | How to compute the node fee component. **Required.** |
| `network` | NetworkFeeSchedule | How to compute the network fee component. **Required.** |
| `unreadable` | UnreadableTransactionFeeSchedule | Fee for unparsable transaction bytes. Optional. |
| `extras` | repeated ExtraFeeDefinition | All available extra fee definitions. No duplicate names. |
| `services` | repeated ServiceFeeSchedule | Fee configs per network service. No duplicate names. |

### ExtraFeeDefinition

Defines a single extra fee — an additional charge for a specific cost factor.

| Field | Type | Description |
| - | - | - |
| `name` | string | Unique name. Must match `[A-Za-z].*[A-Za-z0-9]*`. **Required.** |
| `fee` | uint64 | Fee per unit in tinycents. Must be > 0. **Required.** |

### NodeFeeSchedule

Node fee configuration. Applied identically to **all** transaction types.

| Field | Type | Description |
| - | - | - |
| `base_fee` | uint64 | Base fee in tinycents. Defaults to 0. |
| `extras` | repeated ExtraFeeReference | Extras for computing the node fee. No duplicate references. |

### NetworkFeeSchedule

Network fee configuration. Calculated as a multiplier of the node fee.

| Field | Type | Description |
| - | - | - |
| `multiplier` | uint32 | Multiplied by the node fee. Must be ≥ 1. **Required.** |

### ServiceFeeSchedule

Groups transaction and query fee configs for a single gRPC service.

| Field | Type | Description |
| - | - | - |
| `name` | string | Service name (e.g., `CryptoService`). **Required.** |
| `schedule` | repeated ServiceFeeDefinition | Transaction/query fee configs. Must not be empty. |

### ServiceFeeDefinition

Fee definition for a single transaction or query.

| Field | Type | Description |
| - | - | - |
| `name` | string | Transaction/query name (e.g., `CryptoCreate`). **Required.** |
| `base_fee` | uint64 | Base fee in tinycents. Defaults to 0. |
| `extras` | repeated ExtraFeeReference | Extras for this transaction/query. No duplicate references. |
| `free` | bool | If `true`, `base_fee` and `extras` are ignored — the operation is free. |

### ExtraFeeReference

References an ExtraFeeDefinition with an optional included count.

| Field | Type | Description |
| - | - | - |
| `name` | string | Name of the referenced extra. Must match a defined extra. **Required.** |
| `included_count` | uint32 | Units included for free in the base fee. Defaults to 0. |

### UnreadableTransactionFeeSchedule

Punitive fee for nodes that submit unparsable bytes.

| Field | Type | Description |
| - | - | - |
| `fee` | uint64 | Punitive fee in tinycents. Optional (may be 0). |

### Validation Rules

Before a new fee schedule takes effect, the network validates it. If any rule fails, the schedule is rejected.

<AccordionGroup>
  <Accordion title="Parsing and schema compliance">
    The JSON must parse and conform to the `FeeSchedule` protobuf message. All required fields must be present and types must match. No unrecognized fields.
  </Accordion>

  <Accordion title="Monetary values">
    All `baseFee` and `fee` fields must be non-negative integers. For extras, `fee` must be strictly > 0.
  </Accordion>

  <Accordion title="Multiplier constraint">
    The `multiplier` in `network` must be a positive integer ≥ 1.
  </Accordion>

  <Accordion title="Name uniqueness and format">
    All names must match `[A-Za-z].*[A-Za-z0-9]*`. Extra names, service names, and transaction/query names within each service must be unique.
  </Accordion>

  <Accordion title="Extra references">
    Every extra reference must point to a defined extra. No duplicate references within a single list.
  </Accordion>

  <Accordion title="Free transactions and queries">
    If `free` is `true`, `baseFee` and `extras` are ignored during calculation but must still comply with all validation rules if present.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="HIP-1261: Simple Fees" icon="file-lines" href="https://hips.hedera.com/hip/hip-1261">
    The full Hiero Improvement Proposal specification.
  </Card>

  <Card title="Transaction and Query Fees" icon="dollar-sign" href="/networks/fees">
    Fee tables for all transaction and query types on mainnet.
  </Card>

  <Card title="Gas and Fees" icon="gas-pump" href="/evm/development/gas-fees">
    Gas schedule and fee calculation for smart contracts.
  </Card>

  <Card title="HIP-1259: Fee Collection" icon="vault" href="https://hips.hedera.com/hip/hip-1259">
    The fee collection account model that Simple Fees depends on.
  </Card>
</CardGroup>
