Skip to Content
THULI

Overview

What Thuli does, the three numbers it has measured, and what is built and not built yet.

Thuli screens an airdrop or reward claim list and holds back the wallets that look like one operator's farm. For every wallet it holds, it gives a reason with the evidence behind it, and rewards pay out from a vault that only approved wallets can claim from.

It is for a project that is about to pay rewards: an airdrop, a quest or testnet reward, free credits. Farmers run many wallets to collect many rewards. Thuli makes that more expensive and explains each call it makes, so a real user who gets held can see why. It does not prove that a wallet belongs to one unique person, and its decisions are assessments of on-chain behaviour, not accusations.

The name is Tamil. Thuli means "a drop": every drop of an airdrop should land in a real hand.

Three numbers, measured

Each number comes from a run on past data. None of them is a promise about your campaign.

99.03% of the farm list held back

11,173 of the 11,282 wallets on Bitquery's farm list for the ROBO airdrop were held, using only chain data from before the first claim. This is a replay of past wallets, not a live campaign. The list is one firm's analysis, and it was built from what the wallets did after the claim. Details: The ROBO replay.

1.00% of a control sample held by mistake

Under the current rulebook, 15 of 1,500 wallets sampled from the list Hop Protocol kept in its 2022 airdrop were held. The 95% interval, the range the true rate probably falls in, is 0.61% to 1.64%. Hop's kept list does not prove a wallet is real, and the rate comes from a sample, so read it as an estimate. Details: Feedback and versions.

$0.0005 of SERV credit per wallet

Realised: $17.51 of SERV credit for 35,323 wallets, about 0.05 cents a wallet. That is the SERV credit for the ROBO run only. It does not include Reppo's evaluation credits or any server costs. The paid screening route charges 5 cents a wallet, see The paid API. Details: The ROBO replay.

What is live today

Live on the site:

  • The ROBO replay at /replay: every wallet that claimed the airdrop, with its decision and reason.
  • The versions scorecard at /versions: two rulebook versions scored on the same stored answers.
  • The wallet check at /check: paste one Ethereum address and read its decision, the rule behind it and the transactions it cites. It is free and needs no sign-in. The page calls POST /api/check, which the site serves itself.
  • The paid screening route, POST /api/x402/screen, also served by the site. It charges 5 cents in USDC per wallet over x402, a standard for paying for a web request. See The paid API.
  • Try to break it: ten live attacks you run from your browser against the vault and the site's own routes, with the answer to each shown beside it.

Live, with test money unless a line says real:

  • The reward vault on Base Sepolia, with a live proof. Realised, with test USDC that has no real value: one approved wallet claimed 1 USDC from the vault, and a wallet left off the list was refused with the error InvalidProof. Anyone with the repository can check that record against the chain with npm run prove:vault -- verify. See The vault and Contracts and addresses.
  • The paid route, with two real payments. Realised, with real USDC: one screening was bought for 5 cents on Base mainnet in a run on one machine and settled in this transaction, and on 14 November 2026 the live site took its first payment, in this transaction. Both came from Thuli's own wallet. Ten more requests with the same payment returned the stored result and were not charged. Before that, the same proof ran on Base Sepolia with test USDC through a local build of the site (transaction). See Check a wallet and the paid API.
  • The live campaign on Base Sepolia with test USDC: any wallet signs an ask, is screened in public, and an approved wallet takes a slot and is paid from the campaign's vault after the vault's delay. The campaign on this site is "Thuli demo drop": 24 slots of 0.5 test USDC, paid from this vault. The site and a worker process on its own host share one hosted Postgres database. A project starts a campaign with two commands, described on Contracts and addresses. See Live campaign.

Not built yet:

  • A campaign on Base mainnet. The vault factory is deployed on Base mainnet and one proof vault there paid 1 real USDC (see Contracts and addresses), but the campaign runs on Base Sepolia with test money.
  • Self-serve campaigns for a project: owner sign-in, an owner dashboard and a route to upload its own claim list. Today a project registers a campaign with two commands, described on Contracts and addresses.
  • Owner sign-in for appeals. A campaign takes a signed appeal and sends Thuli's own decision to Reppo for a check. Two appeals have been checked that way against the real service, with the routes review and ship, and the owner upheld both. The owner's call is made by an operator's command, because owner sign-in is not built. See Live campaign.
  • Worker hosting as code. The worker runs as one process on a host, set up by hand in the host's settings. The repository holds no container file or host configuration for it.
  • Paid data lookups. Nothing calls a paid data provider today.

Start here