Wallet history scoring: using account age and behavior to price sybil risk
Why history is expensive to fake
Anyone can generate a thousand addresses in a second. Giving each one a believable past is another matter: transactions across months, interactions with varied contracts, and balances that move like a person moving them. Time is the one input a farm cannot compress.
That asymmetry is the whole strategy. Defenses based on a single action, one captcha, one small purchase, fall to automation in a weekend. Defenses based on accumulated history force the attacker to spend the resource they are trying to save, at scale, in advance, with no guarantee the campaign they are preparing for ever launches.
The signals that carry real weight
Age alone is weak, because farms age wallets in bulk like wine nobody drinks. Age combined with diversity is strong: transactions in different months, with different protocols, in both directions, funded from sources that are not all the same exchange hot wallet or the same parent address.
Negative signals matter as much as positive ones. Wallets funded in identical amounts from one source, minutes apart, moving in lockstep, are a farm even if each wallet looks busy. Score the neighborhood, not just the wallet: related addresses should raise or lower each other scores.
Scoring without punishing privacy-conscious users
Plenty of legitimate users keep fresh wallets for privacy or security, and a blunt history score locks them out of everything. Tier the response: low-history wallets get smaller claim caps, delayed vesting, or manual review queues instead of a hard rejection.
Publish the broad shape of the criteria. Users who know that activity over time counts can choose to participate from their main wallet. Secret scoring feels arbitrary when it bites, and arbitrary systems lose the community trust that makes any of this work.
How farms adapt, and the counter
Farms respond with history-as-a-service: aged wallets with manufactured pasts, sold ready-made. The tell is that manufactured history is regular in ways real life is not: evenly spaced transactions, round amounts, the same contract set in the same order across hundreds of wallets.
Score for irregularity and independence. Real users share almost no exact patterns with strangers. When two hundred aged wallets show near-identical histories, the manufacturing process itself becomes the fingerprint, and the batch falls together.
Setting thresholds you can defend
Every threshold trades farmers caught against users excluded, and the honest place to set it depends on what is being protected. A governance vote and a small faucet should not share a cutoff. Document the trade-off chosen for each program and the data behind it.
Revisit thresholds after each campaign with the appeal results in hand. Appeals are your labeled data: they show which signals wrongly flagged real users. A scoring system that never updates from its mistakes gets more confident and less accurate at the same time.
Frequently asked questions
Is wallet history scoring a form of identity verification?
No. It assesses the behavior of an address, not the identity of a person, and it collects nothing offchain. It is a risk signal for program design, not a KYC process, and it should not be presented as one.
Can a brand-new user ever qualify for anything?
They should always qualify for something, even if it is a smaller tier. Designs that give new wallets literally nothing push newcomers toward buying aged wallets, which feeds the exact market you are fighting.
How far back should history scoring look?
Months to a couple of years covers most signal. Very old activity adds little beyond the two-year mark for most programs, and overweighting ancient history mostly rewards whoever has been around longest rather than whoever is real.
What is the biggest mistake teams make with scoring?
Treating the score as a verdict instead of a dial. Scores should set caps, tiers, and review priority. Hard cutoffs on a single score create cliff-edge unfairness and a clear target for farms to engineer around.
See your own numbers.
A free bot-traffic audit shows the human-automated split in your live traffic - no code changes, no commitment.
Get a free bot-traffic audit