guides16 min read

Why the Ethereum Blockchain Is Not an Accounting Ledger

Why Ethereum data is not an accounting ledger: internal transfers, traces, validator records, finality, ownership evidence and a six-layer separation.

M

Maksym Buhai

Accounting Engineer

July 27, 2026 · 16 min read

Cover reading "The balance rose. No transaction named the entity", beside a solid charcoal bar above a grid of twenty-four small charcoal blocks and an empty panel of the same width drawn in a dashed violet outline

Ethereum is an excellent cryptographic record of Ethereum state. It is not a general ledger for the entity that uses it. Treat the two as one Ethereum blockchain accounting ledger and the books inherit gaps the chain cannot fill, so the accountant needs a model that separates what the protocol proves from what the books must conclude.

That distinction is easy to miss because block explorers display balances, incoming and outgoing activity, timestamps, labels, token values, and even "internal transactions" in a format that looks like bookkeeping. But the chain does not know who legally owns an address, why a transfer happened, what invoice it settled, which units belong to which accounting lot, whether a custodian holds assets for the entity, or what financial-reporting policy the entity applies.

For native ETH, the evidence problem behind an Ethereum blockchain accounting ledger is harder than simply downloading a transaction list. ETH can move through contract execution without an ERC-20-style transfer log. Validator withdrawals can credit an address without an ordinary user transaction. Consensus rewards and penalties alter a validator balance on another protocol layer. Traces reconstruct execution rather than reading a standardised list of committed ETH transfers.

The six-layer separation: why there is no Ethereum blockchain accounting ledger

GroupLayerQuestion
What the protocol recordsL1 Protocol stateWhat balance, nonce, validator record, or other state exists?
L2 Execution-layer records and eventsWhat transaction, receipt, log, trace-derived movement, withdrawal entry, or execution-layer state change exists?
L3 Consensus eventsWhat attestation, proposal, reward, penalty, exit, or validator-state change occurred?
What the law saysL4 Legal positionWho owns or controls the position, what claim exists, and what restricts it?
What the books sayL5 Economic eventWhat happened economically to the entity?
L6 Recognition and accounting lotWhen is the event recognised, at what amount, and against which book lot?

The layers are intentionally separate. A cryptographically valid transfer can be an own-wallet movement with no economic disposal. A legally owned position can be temporarily unavailable. An economic event can occur without any ordinary transaction. An accounting lot can change even though Ethereum itself has no lot concept.

The framework is a reasoning tool, not an Ethereum protocol taxonomy. Every layer of it is exercised, on one set of facts, in Ethereum Journal Entries: A Complete Worked Example.

The centerpiece problem: native ETH can move without a transfer log

A wallet application shows a list of transactions and calls it the account history. It is not. There are five ways ETH moves on the execution layer, and only the first appears in a block's transaction list as an instruction from the sender:

  1. the value field of a transaction the holder signed
  2. an internal transfer, a contract moving ETH while executing somebody's transaction
  3. a SELFDESTRUCT sweeping a contract's balance to a target address
  4. a beacon-chain withdrawal, which is not a transaction at all, and
  5. priority fees credited to the block's fee recipient, which under MEV-Boost is normally the builder rather than the validator.

A validator balance moves four more ways again, none of them on this layer: reward accrual, ordinary penalties, the inactivity leak and slashing.

The second deserves emphasis because it defeats a reasonable assumption. Tokens built on Ethereum, of the ERC-20 kind, emit an event log whenever they move, and indexing software reads those logs. Native ETH does not. EIP-7708, a proposal by core developers to fix exactly this, currently at Review status and not deployed, states the problem in its own words: "Logs work for ERC-20 tokens, but they do not work for ETH", and "ETH transfers from EOAs can be read from the transaction list in the block, but ETH transfers from smart contract wallets are not automatically logged anywhere." The same document notes the consequence has already bitten: "This has already led to problems in the past, eg. early exchanges would often not properly support deposits from smart contract wallets".

The scale of what a transaction list can hide is easy to demonstrate. Transaction 0xad3d5ab3ed472910f4455db68b5bc48d98903d8d77e26a44e96a06e586e8c9ab sent 14.97 ETH into a contract, which distributed it as 157 internal transfers to 157 distinct addresses, summing exactly to 14,970,000,000,000,000,000 wei. Its receipt records logs: []. If one of those 157 addresses is the entity's, the ETH arrived, the balance rose, and no transaction anywhere on the chain names the entity as a recipient.

Recovering internal transfers requires tracing: asking a node to re-execute the transaction and report every internal step. Geth's documentation describes debug_traceTransaction as a method that "will attempt to run the transaction in the exact same manner as it was executed on the network", and its callTracer "tracks all the call frames executed during a transaction, including depth 0", reporting a value field for each. Two consequences follow and both belong in an evidence memo. Tracing is a re-execution, not a stored record: nothing in the block commits to a list of internal transfers. And the output format is deliberately not standardised. The official JSON-RPC specification says "Defining the output schemas of named tracers is outside the scope of this specification." Different providers can legitimately hand an accountant differently shaped answers to the same question.

Committed evidence, reconstructed evidence, and third-party assertions

Each block commits to a defined set of records: the transactions, one receipt per transaction (carrying status, gasUsed, effectiveGasPrice and any logs), the resulting account states, header fields including baseFeePerGas, gasUsed, gasLimit and timestamp, the block's fee recipient, and, since April 2023, a separate list of withdrawals.

A node is a computer running Ethereum's software that holds the chain and can answer questions about it. A block explorer is a website that queries a node and presents the answers, adding a great deal of its own. Everything else that appears on a block-explorer page is somebody's work product. Address labels and entity names are not in the account state. There is no name field. US dollar values are a third party's valuation at that third party's chosen timestamp. "Internal transactions" are a reconstruction by re-execution. Token balances are read out of another contract's storage. ethereum.org's own description of block explorers illustrates the risk: it describes the "Transaction fee" a user sees as "The amount paid to the validator to process the transaction (calculated by gas price*gas used)", a description that is wrong for the burned portion, which no validator receives.

Three tiers of evidence follow, and they should be labelled differently in a working paper:

  1. Self-proving. Committed to a block hash and reproducible from any full node: balances, transactions, receipts, logs, header fields, withdrawals.
  2. Reproducible but privileged. Traces of internal transfers are reproducible in principle, but only from a node that has kept the relevant state, in a format nobody has standardised. The specification even defines an error for the common case: 4444 Pruned history unavailable. Public endpoints frequently refuse: one returns "Archive requests require a personal token."
  3. Third-party assertion. Labels, entity groupings, fiat values, annualised yields. Useful, not evidence.

An explorer screenshot mixes all three with no visual distinction between them, and an Ethereum blockchain accounting ledger has to keep them apart.

Timestamps are protocol time, not business-purpose evidence

Under proof of stake nobody chooses a block's timestamp. Through the Fulu upgrade, the consensus specification requires that the execution payload's timestamp equal the time computed for its slot:

# Verify timestamp
assert payload.timestamp == compute_time_at_slot(state, state.slot)

and compute_time_at_slot is arithmetic: genesis time plus slot number times 12 seconds. The block timestamp is therefore a slot clock reading, accurate to the protocol's own schedule and useless as a business clock. Three limits matter for cut-off:

  • Granularity. Every transaction in a block shares one timestamp. Hundreds of transactions can carry the same instant, and their order within the block is the choice of whoever assembled it, often a specialist builder (a firm that constructs blocks and sells them to validators), and that choice is economic, not chronological.
  • It is not the event time. The gap between signing a transaction and its inclusion is invisible on-chain. A payment authorised before a period end can land after it.
  • Slots can be empty. ethereum.org notes that "occasionally validators might be offline when called to propose a block, meaning slots can sometimes go empty", so consecutive block timestamps differ by a multiple of 12 seconds, not always 12.

Canonical is not the same as finalized

Ethereum finalises in two stages. The first block of each epoch is a checkpoint. A checkpoint becomes justified when validators holding two-thirds of the ETH staked on the network vote for it, and finalised when a later checkpoint is justified on top of it. Finalisation is processed at every epoch boundary (every 6.4 minutes), and what gets finalised there is the checkpoint from two epochs earlier. A live query on 25 August 2026, at head slot 15,067,723 in epoch 470,866, returned a finalized checkpoint at epoch 470,864, exactly two epochs behind.

An ordinary transaction is not a checkpoint, so it waits slightly longer: it becomes final when the next checkpoint descending from its block is finalised, which is two to three epochs, 12.8 to 19.2 minutes. The Ethereum Foundation's own current wording rounds this to "It takes about 15 minutes for an Ethereum block to finalize." The "12.8 minutes" figure that circulates is the lower end of that checkpoint arithmetic and is the best case only, available to a transaction that lands in the first slot of an epoch. Quoted as the typical wait for a transaction, it is too fast.

Before finality, history can change. ethereum.org's description of the consensus mechanism says so directly: "Justified blocks are unlikely to be reverted, but they can be under certain conditions." That reversion is a reorganisation: a transaction an explorer showed as confirmed can end up in no block at all, leaving an entry booked from provisional evidence with nothing behind it.

The control implication is concrete. Software that reads the chain at head reads a state that may be revised. Software that reads at finalized does not. For a period-end balance that will be audited, the query should be pinned to a finalized block, and the block number retained: not "the balance on 31 December", but "the balance at block n, which was finalized".

Replaced transactions are another evidence trap

A pending transaction can be replaced by sending another with the same nonce and a higher fee, the familiar "speed up" and "cancel" buttons. Only one can ever execute, because only one transaction per nonce is valid for an account. The replaced transaction is not recorded anywhere on the chain. It existed only in nodes' pending-transaction pools, which are local and not part of consensus.

Two consequences follow. Only one fee was ever paid, so a ledger built from a wallet interface that lists both the original and the replacement will double-count. And a "cancel" is a real expense, 21,000 gas for a transaction that deliberately does nothing.

What Ethereum can prove, and what it cannot

How does value accrue here? None while ETH sits in an account: the price can move while the quantity is unchanged to the wei. Quantity while ETH is staked natively in the holder's own validator: the validator balance grows at every epoch boundary, roughly 225 times a day, with no transaction and no counterparty.

That split is the reason an ETH ledger needs two reconciliations rather than one, and the reason a staking entity's lot ledger grows even in a period with no trading activity.

Which economic facts does the chain actually evidence?

On the execution layer, for each confirmed transaction: the transaction hash, sender, destination, value, input data, gas limit, and from the receipt the status, the gasUsed and the effectiveGasPrice. The specification defines effectiveGasPrice as "The actual value per gas deducted from the sender's account", so fee = gasUsed × effectiveGasPrice is computable from the receipt alone, and the burned share is computable from the block's baseFeePerGas. Account balances at any block are readable directly, and a block's withdrawal list is part of the block.

On the consensus layer: the validator's index, public key, withdrawal credentials, current balance, effective balance, status, activation and exit epochs, and, for recent epochs, reward detail broken into attestation, sync-committee and proposal components.

Which visible on-chain events are not economic events?

  • Transfers between the holder's own addresses. Beneficial ownership does not change. Only the gas leaves.
  • A deposit to the deposit contract by a holder who keeps the withdrawal credentials. ETH changes ledger, not owner.
  • A withdrawal credited from the holder's own validator to their own withdrawal address. ETH changes ledger back. On a policy that recognises rewards as they accrue, it is not income: the income was the reward accrual that produced the balance.
  • Approvals. Authorising a contract to spend a token creates no transfer, but does cost gas.
  • A cancelled or replaced transaction. Only one of the pair ever executed. Only one fee was ever paid.
  • Address generation and message signing. No state change at all.

Which economic events produce no public-chain event?

  • Every consensus-layer reward. The balance changes. No transaction exists. This is an income event with no transaction hash anywhere.
  • Penalties, the inactivity leak, and the balance effects of slashing. Same mechanism, opposite sign.
  • A custodial exchange's internal activity. It can buy, sell, lend, freeze or reallocate a customer's credited ETH without moving its aggregate on-chain balances.
  • Price movements, functional-currency remeasurement and holding-period tests. Entirely off-chain.
  • Key loss, custodian failure, borrower default, and a contract becoming enforceable. None of these touch the chain.
  • The intention behind a fee-recipient setting. The Beacon API specification is explicit that the setting is a suggestion to the node and "there is no guarantee that the beacon node will use the supplied fee recipient". Nothing records what was meant.

Can one economic event produce multiple disconnected records?

Constantly. This is the defining reconciliation problem for ETH, and it is worse than Bitcoin's because the records sit on two different ledgers with different identifiers.

One economic eventRecord 1Record 2What links them
Proposing a blockConsensus-layer proposal reward credited to the validator balanceExecution-layer priority fees, or a builder's payment transaction to the fee recipientNothing on-chain. The slot number and the entity's own records
Requesting a partial withdrawalAn EIP-7002 request transaction, with a hash and a gas costA gasless system-level withdrawal credit days later, with no hashNothing. The validator index and the entity's records
Creating a validatorA deposit transaction on the execution layerThe validator appearing, later, in the consensus-layer registryThe deposit data, matched by hand
Depositing ETH at an exchangeAn on-chain transferA credit on the exchange's private ledgerThe exchange's statement
A batched transaction under EIP-7702One transaction hashSeveral economically distinct transfers inside it, visible only by tracingThe trace

The evidence has a shelf life

One further constraint has no analogue in traditional records and it catches entities out at year-end. Per-epoch reward detail is not retained indefinitely by an ordinary node. A live test on 25 August 2026 requested attestation rewards for epoch 470,860 (six epochs, under 40 minutes, in the past) and received {"code":404,"message":"NOT_FOUND: missing state at slot 15067583"}, while a query four epochs later succeeded.

Under native staking, a validator's balance is a net figure: rewards, penalties and withdrawals collapsed into one number. It cannot be decomposed after the fact. An entity that wants an annual analysis of its native staking income by component must either run an archive node, one that keeps every historical state instead of pruning it away, capture the data contemporaneously, or buy it from a third party. The third party's decomposition is that party's work product, not a protocol record.

Evidence rule. A block explorer is a convenient view, not a subledger and not proof of ownership. For ETH, retain execution-layer node or explorer data and consensus-layer validator records, together with wallet descriptors and control evidence, exchange and custodian statements, contracts, invoices, and the valuation record. Balances must be proved by roll-forward against the account balance at a finalized block, never by adding up a transaction list.

Why this changes accounting

The account balance is not a lot ledger, and never can be

Bitcoin at least gives an accountant pieces to argue about. Ethereum gives one integer. Cost basis, acquisition dates and lot identity exist nowhere on the chain and cannot be derived from it. The entity's records are the only source, which means the lot method is a policy decision made in advance, not a fact discovered later. If the records are lost, nothing on the chain will reconstruct them, so an Ethereum blockchain accounting ledger has to carry that history itself.

The symptom is a familiar one: the wallet balance agrees to the wei and the lot ledger does not reconcile to anything, because the lot ledger was never anchored to something the chain can confirm.

Gas is a disposal, it happens constantly, and part of it has no payee

Every transaction disposes of ETH as gas. Individually the amounts can be trivial. In the complete Ethereum journal-entry example, four gas payments total 0.000704498368 ETH, about $2.03. Collectively they are a real ledger problem for three reasons:

  • They are numerous. An active entity generates hundreds of them a year, each technically a separate disposal with its own date, price and lot consumption.
  • They split into two economically different components. The burned base fee is destroyed and reaches no counterparty. The priority fee is credited to the block's fee recipient, which under MEV-Boost is normally the builder rather than the validator. The split cannot be inferred from the total, and Ethereum Tax in the United States shows that US rules describe paying a fee in digital assets as "a disposition of the digital assets for services", which presupposes a service provider the burn does not have - though, as that article also sets out, the definitional provision alongside it carries no such qualifier, and the two pull in opposite directions.
  • They are charged on failures. A transaction with status 0 transfers nothing and still costs ETH. A ledger that only imports successful transactions understates cost and misstates the ETH quantity. Ethereum Gas Fee Accounting.

One holding, two ledgers, two reconciliations

For an entity that stakes natively the quantity of ETH is the sum of an execution-layer balance in wei and a consensus-layer balance in gwei, retrieved from different systems by different tools. Neither is visible from the other. A reconciliation that proves the wallet balance proves nothing about the 32 ETH in the entity's own validator, and vice versa.

Quantity accrual builds a lot ledger nobody planned

Native staking rewards are recognised for the same reason interest is: the entity became entitled to something it did not have before. But the protocol delivers them roughly every 6.4 minutes. Left alone, a single validator generates around 225 accrual events a day and over 80,000 a year, each of which is arguably a separate acquisition at a separate price.

No framework requires that. Every framework requires a policy. The entity must decide, document and consistently apply an aggregation convention (daily, monthly, or otherwise) and must be able to explain why it faithfully represents the accrual. The complete Ethereum journal-entry example shows a monthly convention and its consequences. What Accounting Standards Still Do Not Answer About Ethereum records the choice as a judgement area with no prescribed answer.

The events that look like what they are not

Four of these recur, and each produces a specific wrong number:

  • A withdrawal looks like income. ETH appears in the wallet with no transaction and no obvious source. Recorded as revenue, it double-counts the reward accrual and overstates income by the full amount of the withdrawal.
  • A builder's payment looks like a customer receipt. An unexplained incoming transfer from an unknown address is, for a staking entity, most likely its own block reward. Misclassified, it can end up as revenue from a customer that does not exist, or as an unidentified suspense item.
  • A deposit to the deposit contract looks like a payment out. 32 ETH leaves the wallet and goes to a contract address. For financial reporting it is not a disposal, and treating it as one recognises a fictional gain or loss and derecognises an asset the entity still owns.
  • A failed transaction looks like nothing at all. The ETH is gone all the same, and whether that is an expense, a loss, or nothing is a named guidance gap.

A liability can hide behind a positive balance

A balance shown as "ETH" may be native ETH, segregated custody property, an exchange receivable, borrowed ETH, or ETH pledged as collateral. Portfolio tools normally show all of them as a positive quantity and may net a borrowing against collateral. Presentation must follow rights and obligations, gross unless the framework's offset criteria are actually met.

Precision is not a rounding preference

Balances are integers of wei. A subledger carrying eight decimal places cannot tie to the chain: in the worked example the closing account balance is 529,871,721,631,999,999 wei, and an eight-decimal ledger reports 0.52987172 ETH, dropping 1,631,999,999 wei. The value is negligible. The reconciliation is not: a difference that cannot be explained is a difference that cannot be signed off, and it will recur every period until the subledger stores integers.

Two correct ledgers can disagree by a large number

At 31 December in the complete Ethereum journal-entry example the same 32.726730991631999999 ETH is carried at $79,100.67 under one defensible IFRS policy, $79,511.51 under another - the same figure that example tabulates as book cost and reaches when impairment is tested at holding level - and $97,094.97 under US GAAP. The quantity agrees to the wei in all three. The difference is entirely the measurement model and the unit of account chosen for impairment.

The control symptom. If the wallet balance is wrong, look for internal transfers, withdrawals and gas on failed transactions. If the wallet balance is right but the quantity is wrong, look for the validator. If the quantity is right but the lot ledger is wrong, look at reward aggregation and at which lot the withdrawal took. If the lot ledger is right but the carrying amount is wrong, look at the price convention and the impairment unit of account.

Why an Ethereum account balance can never be an accounting lot

An execution-layer account balance is one integer. It does not contain an acquisition date, acquisition price, tax basis, financial-reporting carrying amount, counterparty, or lot identifier.

That means an accounting lot is not something the accountant discovers inside Ethereum. It is an internal record constructed from recognised economic events. How to Account for Ethereum Transactions works through those events one at a time.

Suppose an entity receives:

  • 4 ETH for services in January;
  • 10 ETH in a treasury purchase in March;
  • 0.3 ETH of recognised staking rewards over several months; and
  • 2 ETH moved back from its own validator.

The wallet may later show one balance. Nothing in that number preserves those origins. If the entity sells 3 ETH, the applicable financial-reporting policy or tax law determines which basis leaves. The blockchain cannot answer it.

The same separation matters for validator balances. A validator balance is a quantity in gwei. It also contains no internal book-lot identity. If 0.30 ETH is withdrawn from a validator, Ethereum tells you the validator index, withdrawal address, and quantity. The entity's lot policy tells you what carrying amount moved with it.

A valid signature proves that a key authorised an action. It does not prove that the signer had legal authority to act for the entity.

The same address could be controlled by:

  • the entity;
  • an employee acting within authority;
  • an employee acting outside authority;
  • several approved signers through a multisig;
  • a custodian;
  • a thief;
  • an insolvency estate; or
  • delegated code under EIP-7702.

That is why L4 exists separately from L1 through L3. Control and legal rights need contracts, governance records, signer evidence, custody terms, and sometimes legal analysis. For a position-by-position treatment, see What Do You Actually Own When You Hold ETH?.

Reconciliation implication

A defensible Ethereum close normally needs more than one data source:

execution-layer state + transactions + receipts + trace-derived movements where needed + withdrawal records + consensus-layer validator records + control evidence + contracts/business records + valuation evidence + the book-lot subledger

The chain is therefore one part of the evidence package, not a substitute for the accounting system: an Ethereum blockchain accounting ledger is assembled from all of these sources rather than downloaded from any one of them.

Six layers between Ethereum and the books

Protocol evidence, legal rights and accounting recognition answer different questions.

  1. L1 Protocol stateBalance, nonce, validator state.
  2. L2 Execution recordsTransactions, receipts, logs, withdrawals, traces.
  3. L3 Consensus eventsRewards, penalties, exits, validator duties.
  4. L4 Legal positionOwnership, control, claims, restrictions.
  5. L5 Economic eventWhat happened to the entity economically?
  6. L6 Recognition and lotWhen, how much, and which book lot?
A block explorer can help with L1 to L3. It cannot prove L4 to L6 by itself.

The operating controls that turn this framework into a period-end process are developed in Ethereum Accounting Records, Controls, and Reconciliation, and our wider crypto accounting guide places them inside the full close.

How Tokenbooks helps with turning chain data into a ledger

Tokenbooks is built on the separation this article describes: the chain supplies the lower layers and nothing above them. Every transaction is assigned an explicit operation type from an enumerated taxonomy, which puts the economic-event answer in a field of its own rather than leaving it to a wallet label or to whichever direction the tokens happened to travel.

The double-entry records above that are constructed, not downloaded. Journal entries post against a hierarchical chart of accounts the user can edit, with a general ledger view, and an inspectable lot ledger records every add, disposal, cut, move, reservation and release, which is the lot identity a balance can never carry. None of that is a black box. The source transaction, its individual transfers, the event logs and the decoded contract call stay available beside the reconstruction, so the ledger can be reviewed against the evidence it was built from.

See what the Ethereum sync collects on the integration page.

More in this series

Accounting Token Anatomy: Native ETH. This article stands alone, but the series builds in order.

Previous (01.2.2): What Do You Actually Own When You Hold ETH?

Next (01.2.4): Ethereum Gas Fee Accounting

All fourteen articles

Sources and authority map

Research status. Protocol mechanics and published guidance were refreshed through 31 August 2026. Where a source is interpretive rather than authoritative, the text says so. This article is educational research, not accounting, tax, legal, valuation, or investment advice.

Frequently Asked Questions

Can ETH arrive in a wallet with no transaction naming the entity?
Yes. ETH moves five ways on the execution layer and only the first, the value field of a transaction the holder signed, appears in a block's transaction list as an instruction from the sender. One transaction cited here sent 14.97 ETH into a contract that distributed it as 157 internal transfers to 157 distinct addresses, and its receipt records an empty log list. If one of those addresses is the entity's, the balance rose and no transaction anywhere on the chain names it as a recipient.
Why do internal ETH transfers have to be recovered by tracing?
Because native ETH emits no transfer log the way an ERC-20 token does. Recovering internal transfers means asking a node to re-execute the transaction and report every internal step, which is a reconstruction rather than a stored record: nothing in the block commits to a list of internal transfers. The output format is also deliberately not standardised, so different providers can legitimately hand an accountant differently shaped answers to the same question.
Is a confirmed Ethereum transaction final?
Not straight away. An ordinary transaction becomes final when the next checkpoint descending from its block is finalised, which is two to three epochs, 12.8 to 19.2 minutes. Before finality, history can change: ethereum.org's description of the consensus mechanism says justified blocks are unlikely to be reverted but can be under certain conditions. For a period-end balance that will be audited, pin the query to a finalized block and retain the block number.
Does an Ethereum account balance tell you cost basis?
No. An execution-layer account balance is one integer, and it contains no acquisition date, acquisition price, tax basis, financial-reporting carrying amount, counterparty or lot identifier. An accounting lot is an internal record constructed from recognised economic events, which makes the lot method a policy decision taken in advance rather than a fact discovered later.
How many staking accrual events does one validator produce?
Around 225 a day and over 80,000 a year, because the protocol delivers native staking rewards roughly every 6.4 minutes, each arguably a separate acquisition at a separate price. No framework requires that they be booked individually, but every framework requires a policy: the entity must decide, document and consistently apply an aggregation convention and be able to explain why it faithfully represents the accrual.

Related articles

This is not tax, legal, or accounting advice.
Tokenbooks builds accounting software; we are not a CPA firm and not a tax adviser. Treatment varies by jurisdiction, by entity, and over time, and the rules described here can change after publication. Confirm any position with your own accountant or tax adviser before you rely on it.