The first thing a real bookkeeper asks an active DeFi trader is "show me your chart of accounts." Most cannot. This article shows what one looks like.
The five top-level account groups
Every double-entry ledger groups its accounts into five categories: assets, liabilities, equity, income, and expenses. The chart of accounts is the tree of named accounts within those groups.
For a DeFi trader:
- Assets — every wallet, exchange account, and DeFi position. Each is its own account. - Liabilities — borrowed positions on Aave, Compound, etc. Each is its own account. - Equity — the trader's contributed capital and accumulated retained earnings. - Income — staking rewards, LP fees, airdrops, salary received in crypto. - Expenses — gas, scam-token write-offs, realised losses, exchange fees.
A worked example
Consider a trader with a mainnet wallet, a Coinbase account, a Uniswap V3 LP position, a Compound lending position, and a Lido staking position.
The chart of accounts looks like:
Assets 1100 Mainnet Wallet (0x7a2…) 1110 Coinbase USD 1111 Coinbase ETH 1120 Lido stETH (Validator) 1130 Uniswap V3 — ETH/USDC LP 1140 Compound — Supplied USDC Liabilities 2100 Compound — Borrowed DAI Equity 3100 Contributed Capital 3200 Retained Earnings Income 4100 Staking Rewards (Lido) 4200 LP Fee Income (Uniswap) 4300 Airdrops 4400 Salary (USD) Expenses 5100 Gas 5200 Exchange Fees 5300 Realised Losses 5400 Scam Token Write-Offs
Sample postings
Buy 1 ETH for 2,400 USDC on Coinbase:
Debit 1111 Coinbase ETH $2,400 Credit 1110 Coinbase USD $2,400
The asset side balances: USD goes down, ETH goes up. No income, no expense.
Withdraw 1 ETH from Coinbase to Mainnet Wallet, paying $5 in gas:
Debit 1100 Mainnet Wallet $2,400 Debit 5100 Gas $5 Credit 1111 Coinbase ETH $2,405
The withdrawal moves the asset between accounts; the gas is expensed against the wallet (because the gas was paid from the wallet's ETH balance).
Stake 32 ETH on Lido, receive 32 stETH:
Debit 1120 Lido stETH $96,000 Credit 1100 Mainnet Wallet $96,000
A reclassification — ETH becomes stETH at 1:1 (treating stETH as an equivalent asset for accounting purposes; this is the conservative treatment).
Receive 0.5 ETH staking reward (worth $1,500 at receipt):
Debit 1100 Mainnet Wallet $1,500 Credit 4100 Staking Rewards $1,500
Income event. The ETH appears in the wallet at its spot value on the reward date. That value becomes the basis of the new ETH lot.
Sell 0.5 ETH for 1,800 USDC on Coinbase, basis $1,500:
Debit 1110 Coinbase USD $1,800 Credit 1100 Mainnet Wallet $1,500 Credit 3200 Retained Earnings $300
The ETH is disposed of at the basis of the lot ($1,500), and the difference between proceeds ($1,800) and basis ($1,500) flows to retained earnings as a realised gain. This is the realised-gain calculation a tax form expects, but here it is a property of the books, not a separate calculation.
Why this matters
The chart of accounts above is mechanical — every transaction has a structural place in it. A tax calculator that does not produce these postings produces a number on a tax form that cannot be verified, only trusted.
Atlas Ledger generates this chart automatically from the imported wallets, exchanges, and DeFi positions. The user does not assemble it by hand; it is the natural output of the import.
Takeaway: A chart of accounts for DeFi is not exotic — it is just five top-level groups and a sub-account per wallet, exchange, and protocol position. What is exotic is software that produces it automatically. That is the difference between books and a tax form.