Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitchesA wallet-history reconciliation tool is supposed to answer a simple question: does the balance reconstructed from a wallet’s transaction history match what the chain reports at the same block? In his account of building onchain-tieout, Am0MuK says the first live mismatch did not expose a wallet problem. It exposed defects in the tool: incomplete pagination, misclassified provider failures, and output that could look plausible while being wrong.
What the tool was meant to check
Am0MuK’s September 27, 2026 DEV Community article describes onchain-tieout, an open-source Python tool intended to reconstruct a wallet’s balance from transaction history and compare it with the balance reported on-chain at the same block. The point of that comparison is not merely to find discrepancies in a wallet ledger. It can also test whether the software collecting and interpreting the history is complete and trustworthy.
As an Amazon Associate I earn from qualifying purchases.
The author reports that an initial live mismatch was caused by the reconciliation pipeline itself. Offline tests had passed, but their mocked API behavior repeated the same mistaken assumption as the implementation.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →How pagination silently dropped history
The assumed page size
Am0MuK says the client expected a result window of 10,000 rows and treated a shorter response as the end of the history. In the live run described, Etherscan V2 returned 1,000 rows. The client stopped there, leaving part of the transaction history out of the reconstructed balance.
Because the mocks encoded the same 10,000-row assumption, the offline tests did not reveal the mismatch. This is a practical limit of mock-based testing: a mock can verify that code behaves as modeled, but it cannot establish that the model matches the external service. As the author puts it, “A mock can only confirm what you already believe about the system behind it.”
When a single block fills a page
The author also describes a boundary problem in pagination by block. Advancing the block cursor can work until a single block contains more transfers than fit in one page. In that case, the cursor cannot move past the block without risking omitted records.
The reported fix handles that edge case separately: fetch the oversized block by page number, up to the API’s stated 10,000-row window, and stop with an explicit failure if the limit is exceeded. That is safer than quietly inferring that the returned records are complete. The general lesson from these two bugs is to define what the client does at a page boundary and at its configured limit, then make incompleteness visible rather than returning a convincing partial result.
Free tools Windows power users keep installed
One-click scans. No signup required.
Why a provider outage looked like unreadable token data
Am0MuK reports that about 9,700 tokens were initially marked as having unreadable balances. Sampling showed that most of those failures were HTTP 429 responses from the RPC provider: rate limiting, not evidence that the token itself could not return a balance.
The described correction separates transport failures from contract-call outcomes. The tool retries problems such as 429 responses, 5xx responses, and timeouts with backoff, then aborts if they persist. It reserves an unreadable-balance result for an actual call revert or empty result. This distinction matters because a busy provider and an unreadable contract imply different things and call for different next steps.
Other ways plausible output concealed defects
A malformed response became an empty history
During code review, the author found a path where a response with status: "1" but a non-list result was converted into an empty history. That is not the same as confirming that the account has no records: it is an unexpected response shape. Treating it as valid emptiness can make a broken request appear successful.
Rank #4
Decimal formatting lost useful precision
The author says Python’s default Decimal context rounded very large spam-token amounts and displayed tiny values in scientific notation. The reported change used integer arithmetic for formatting. That avoids relying on default decimal precision for values whose exact token-unit representation matters in a reconciliation report.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
What the corrected run did—and did not—show
For a fixed run on the wallet identified as vitalik.eth, Am0MuK reports 10,476 balance rows, of which 8,281 tied out exactly. The author says ETH, DAI, USDC, and USDT matched to the last unit in that run. These are figures from the author’s reported execution, not an independently reproduced benchmark or a guarantee for other wallets, blocks, or assets.
Best Value
The remaining differences were not all evidence of a faulty history fetch. The author says many involved spam airdrops and token contracts whose Transfer events disagreed with their own balanceOf results. The account also identifies two specific asset behaviors:
- stETH: the reported balance differed because it rebases without transfers.
- WETH: the difference matched the wallet’s own deposit-minus-withdraw activity, which, according to the author, did not emit a
Transferevent.
These examples show why “history does not tie out” is a diagnostic result, not a complete explanation. A mismatch can arise from a defect in fetching or interpreting data, or from token behavior that makes a simple event-based reconstruction differ from the contract’s reported balance.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.What this debugging account suggests for reconciliation tools
The failures point to a few concrete design checks for anyone building or evaluating a similar pipeline:
- Validate the external contract, not just the mock. Compare assumptions about page sizes, response shapes, and limits with observed provider behavior.
- Handle dense boundaries explicitly. A block-based cursor needs a strategy when one block alone exceeds a page.
- Fail visibly at limits. If the client cannot establish completeness within the API window, report that rather than presenting a partial history as complete.
- Keep transport errors separate from data outcomes. Retry transient provider failures; do not label them as token properties.
- Preserve exact values in output. Formatting must not round large balances or obscure small ones.
Am0MuK summarizes the testing distinction this way: “Offline tests prove the code matches your assumptions. Only a run against the real system tests the assumptions.” The article identifies onchain-tieout as open-source Python software under the MIT license and links to its GitHub repository. The implementation details and results above are the author’s account; the repository and claims have not been independently verified here.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




