A DeFi trader who has been active across mainnet, Arbitrum, Optimism, Base, and Polygon over a year can easily have 1,500 transactions on file. Importing them into a usable accounting record is where most crypto tax tools break down — not because they cannot read the chain data, but because they cannot classify it.
Reading the chain is the easy part
Every EVM chain exposes the same data through some variant of the Etherscan V2 or RPC interface: native transfers, ERC-20 transfers, internal calls, contract events, gas usage, and timestamp. Atlas Ledger ingests this directly through Etherscan V2 (17 chains), Routescan (Avalanche, opBNB, Fraxtal, Boba, Metis, Mode, Zora), Alchemy (Base), Chainstack RPC (BNB), and provider-specific endpoints for the rest.
What the chain does not say is what the transaction means. A transfer of 100 USDC into a Uniswap router is a swap. A transfer of 100 USDC into a Compound contract is a deposit. A transfer of 100 USDC into a personal wallet is a self-send. Without classification, all three are just "USDC out" — and the accounting outputs are wrong.
The four hardest classification cases
1. Swaps masquerading as transfers. A Uniswap V3 swap is a transfer of token A into the router, a transfer of token B out of the router, and a chain of internal calls in between. A naive importer that reads only top-level transfers sees two unrelated transfers; it does not see the swap. Atlas Ledger's importer reads the router contract events and groups the transfers into a single SWAP transaction with the correct cost basis effect.
2. DeFi position lifecycle. A Curve LP position has at least four events that need separate accounting: deposit (asset reclassification, no gain), reward accrual (income), reward claim (no double-count), and withdraw (asset reclassification). A tax calculator that treats the deposit as a disposal and the withdraw as an acquisition produces a wash sale where there is no economic event.
3. Wrapped assets and bridges. Wrapping ETH to WETH is not a disposal; it is a 1:1 wrapper. Bridging USDC from mainnet to Arbitrum via Across is not a disposal; it is a self-send across chains. Tax tools that treat these as disposals report fictitious gains.
4. Failed transactions and gas refunds. A failed transaction still incurs gas. A successful transaction with overestimated gas refunds the surplus. Both events change the ETH balance without an economic counterparty; both must be expensed against the gas account, not classified as disposals.
What a correct DeFi import looks like
For each transaction, the importer produces:
1. The transaction hash, block number, and timestamp. 2. The classification — SWAP, TRANSFER_IN, TRANSFER_OUT, DEFI_DEPOSIT, DEFI_WITHDRAW, DEFI_REWARD, BRIDGE_OUT, BRIDGE_IN, GAS, FAILED, etc. 3. The asset and quantity legs — typically one or two, occasionally three (for triangular swaps or LP add-and-stake events). 4. The basis effect — for each asset leg, whether it creates a new lot (acquisition) or consumes an existing one (disposal), and at what price. 5. The double-entry posting pair that records the event in the books.
Atlas Ledger publishes 35+ transaction types covering every common DeFi event class. Each type carries its own basis effect rules; the user does not enter "this is a swap" — the importer recognises the contract.
Reconciliation: the on-chain truth
After import, the books should match the on-chain balances exactly. Atlas Ledger's reconciliation page fetches the live on-chain balance for every wallet on every chain and compares it against the book balance. A discrepancy is one of:
- A missing transaction (the importer did not see it — most often because it was on a chain that was not selected for scan). - A misclassified transaction (the importer saw it but recorded the wrong basis effect). - A scam token (the wallet received it but the user did not recognise it as a real holding; Atlas's scam-token classifier flags these).
Each discrepancy is surfaced individually with a one-click resolution. Once the reconciliation passes, the books are demonstrably correct against the chain.
Takeaway: Reading EVM chain data is solved. Classifying it correctly is not. The difference between a correct DeFi tax return and a wrong one is whether the import recognises the meaning of each transaction, not whether it can read the chain.