An indexer that returns hashes, timestamps and log topics is a weekend of work, and half a dozen public APIs will hand you one for free. The fetching was never the part that cost us anything.
Open an active address in an explorer and look at what comes back. Forty rows. A method called execute or multicall. Three token transfers inside one transaction, two of them routing hops that never belonged to the wallet. Nothing there tells you whether the address opened a position, closed one, rotated between tokens, or deposited into a pool for an LP token.
So you reconstruct it. You open the transaction, read the internal transfers, work out which leg the wallet owns, then write the answer into a spreadsheet because the explorer will not remember it. One wallet, forty rows, one morning.
The sorting is the work:
- one token out and another in, same transaction, is a single swap, and counting it as two transfers doubles the apparent activity
- a transfer out can be the same owner moving to a second address, indistinguishable from a sell until you know where it went
- you cannot call a close a close until the entries behind it have been classified correctly
With the rows arriving in order, a year of history is legible in one scroll: a slow build, a rotation into two names, a quarter of silence, then the exit.
Watchlists, folders and alerts in Trace sit on that classifier and are only as good as it is: an alert on a new position means little if a routing hop fires it.
We built the sorting first because we were doing it by hand every morning. The case on our desk this week is the aggregator that splits one order across four pools: four fills, four prices, one intention, and the grouping rule today is still same block, same sender, which breaks the moment two orders land in one block