← back to blog

What Sybil Detection Looks for in Transaction Timing

Most airdrop farmers think about sybil detection as an address problem. Fund enough wallets from different sources, use different RPC endpoints, rotate IPs, and the wallets look separate. That covers part of the picture. The part that trips people up more often is timing. When wallets move together in time, a graph analysis tool doesn’t need to know who controls them. The clock does the work.

This is not a guide to beating detection. It’s an explanation of the mechanics, written from the operator side, because understanding what the analysis is actually measuring is the only way to reason about risk honestly.

Timing is a graph signal, not a rule

Chain analysis platforms like Nansen, Arkham, and Chainalysis build wallet graphs from on-chain data. Addresses are nodes. Shared behavior creates edges. Funding source is one edge. Contract interaction is another. Timing is a third, and it’s often the strongest one because it’s the hardest to fake without also faking the operational reality behind it.

The reason timing works so well as a signal is that legitimate, unrelated users don’t coordinate. Two strangers claiming an airdrop don’t happen to submit their claim transaction in the same block, at the same gas price, thirty seconds apart, in the same order they interacted with a bridge two weeks earlier. When a cluster of wallets does that repeatedly, the graph model treats the correlation as evidence of common control, independent of whether the addresses share a funding source.

Funding bursts and fan-out timing

The most basic timing pattern is the funding burst. A farmer funds twenty wallets from one exchange withdrawal or one hot wallet, and the transfers go out within minutes of each other. Chain analysis tools flag fan-out from a single source as a starting point for clustering, but the timing compounds it. A fan-out spread across three days with irregular amounts is a weaker signal than a fan-out completed inside one block range with near-identical amounts.

This matters because the funding step is usually the first thing an operator automates, since manually sending twenty transfers is tedious. Automation defaults to speed. Speed defaults to a visible burst. The fix isn’t a trick, it’s recognizing that anything scripted to run back to back is producing a timestamp pattern, whether or not the script also randomizes gas or amount.

Interaction cadence across wallets

Beyond funding, the interactions themselves get compared. If wallet A calls a bridge contract, then a DEX, then a lending contract, in that exact sequence, and wallet B does the same three calls in the same order a few blocks later, the sequence itself is a fingerprint. Legitimate users don’t all discover the same three protocols in the same order unless they’re following the same guide, and even then the spacing between actions tends to vary with how long a person actually reads a page or waits for a wallet popup.

Bots don’t have that variance. A script that executes step one, waits a fixed delay, executes step two, produces intervals that are suspiciously consistent across wallets. Chain analysis doesn’t need the exact delay to be identical, just tightly distributed, to treat it as one actor running many wallets rather than many actors behaving similarly by coincidence.

Same-block and near-block clustering

The tightest version of this signal is multiple wallets landing transactions in the same block, or within a handful of blocks, for an action that has no reason to be time-sensitive. Claiming a token from a static allowlist doesn’t require speed. If fifty wallets claim inside the same two-minute window with no other correlation between them except a shared funding source three weeks earlier, that window is doing a lot of the clustering work by itself.

This is why farms that queue every wallet through one script and fire the queue at launch are easier to flag than farms that spread activity across a longer window as part of normal, staggered usage. The difference isn’t about “looking human” as a costume, it’s that a wallet farm run as a batch job produces batch-job timestamps, and a batch-job timestamp pattern is exactly what a sybil model is built to catch.

Gas price synchronization

Gas price is a timing-adjacent signal that’s easy to overlook. Wallets that all set the same gas price, or the same priority fee down to the wei, across many transactions are showing the fingerprint of one wallet manager or one script’s default settings rather than independent users each accepting whatever their wallet client suggested. Combined with block-level clustering, synchronized gas pricing narrows the false-positive rate a lot, because it rules out coincidence in a way that block timing alone can’t.

Time-of-day patterns

Zoomed out further, analysts look at time-of-day distribution across a wallet’s full history. A wallet that only ever transacts inside a narrow four-hour window, every day, for months, is showing a scheduling pattern rather than the organic irregularity of a person with a job, a timezone, and a life that doesn’t run on a cron schedule. This signal is weaker on its own than block-level clustering, but it’s cheap to compute across a whole cluster and it’s often used to confirm a grouping that funding and interaction data already suggested.

Withdrawal timing back to a common point

The other end of the pattern is consolidation. Wallets that sell or bridge a claimed token back to the same destination address, on a similar schedule, close the loop that funding fan-out opened. A model doesn’t need to see the same address on both ends to connect them; a shared destination with correlated timing is enough. This is the step a lot of farmers treat as separate from “airdrop farming” because it happens after the claim, but from a graph analysis standpoint it’s the same cluster, just observed later.

Why fixing one signal doesn’t fix the cluster

None of these signals work in isolation in most detection systems. A single coincidence, like two wallets funded on the same day, means nothing on its own. The models score clusters on the accumulation of correlated signals: shared funding, shared interaction sequence, tight timing, synchronized gas, and shared consolidation destination. Randomizing one variable, like delaying transactions by a random interval, doesn’t remove the correlation on the other four. This is the main reason piecemeal fixes, like “just add a random sleep,” don’t hold up. The timing signal is one layer of a graph model that’s designed to still connect the dots when any single layer is noisy.

What this means operationally

Treat wallet timing the same way you’d treat any other operational variable in a farm: as something that emerges from your process, not something you bolt on afterward. A batch script that queues and fires all at once will always produce batch-shaped timestamps, no matter what else changes. Wallets that are actually used independently, over different windows, for different combinations of protocols, produce a timing distribution that looks like independent activity because it is closer to independent activity. That’s a process design question, not a settings toggle, and it’s worth thinking through before a farm scales past a handful of wallets rather than after a cluster gets flagged.

This isn’t a promise that any particular pattern avoids detection, and it isn’t advice on how to defeat a platform’s terms of service. It’s a description of what the data actually shows when wallets move in sync, because understanding the signal is the only way to make informed decisions about how you structure a farm.

If you’re building out a farm and want to understand this kind of on-chain analysis in more depth, along with tested notes on the tools around it, check out the rest of what we cover on Airdrop Farming.

Get new guides and videos first — join the Telegram channel.

need infra for this today?