Skip to Content
THULI

FAQ

Short answers to what a project founder or a judge would ask about Thuli.

Does Thuli prove a wallet belongs to a real person?

No. Thuli reads on-chain behaviour and finds wallets that move together, such as a shared funder or a sweep to one collector. A farmer who funds each wallet from a separate exchange withdrawal, waits, and never sweeps will pass. Thuli makes farming more expensive and explains each call with a rule and cited transactions.

What happens to a held wallet?

A hold means a person looks at the wallet. It is not paid and not excluded, its reason names the facts and cites the transactions, and it gets no entry in the claim list. A held wallet can appeal with a signed message, one appeal per wallet per campaign. See the appeals entry below.

Can I appeal a decision?

Yes, in a campaign, if your wallet was held, excluded or cut to a partial reward, or if its screening could not finish. A full approval cannot be appealed. You file one appeal per campaign. It is one line of plain words, at most 1,000 characters at the route and 280 in the form, with no link and no markup, and your wallet signs a five-line message that holds the hash of your text.

Your words go to the campaign's owner only. They are shown on no public page and sent to no model. Separately, an outside judge, Reppo, checks Thuli's decision. It is sent the wallet's facts as words and counts, the outcome and the reason, with every address, transaction hash, date, amount and rule code removed, and never your words. Its answer is a route: ship, review or block, meaning the judges agreed with Thuli, were split, or disagreed. That is advice. The owner makes the call, today through an operator's command: upheld, or reversed to a partial or full approval. A reversal takes the next free slot if one is left. At most 2 appeals an hour from one visitor, 10 a day for one campaign and 20 a day across all campaigns are taken. Two appeals have been run live: Reppo's judges were split on one and agreed with Thuli on the other. The full steps, and that run, are in the appeals part of Live campaign.

Why was my new wallet held?

Because Thuli found nothing to read about it. A campaign reads a wallet's history on Ethereum or on Base, whichever the wallet was active on first. A wallet with no incoming transfer of value has no first funder, and a fact that cannot be read means hold, under rule A1, so a person can look. A wallet that has some history but is young or quiet is not held for that. By default one that is under 30 days old or has sent fewer than 5 transactions gets a partial reward, under rule A8. A wallet used mostly on a third chain looks new, because only Ethereum and Base are read, and only native ETH counts. The board shows the rule and the reason for every decision. More on Live campaign.

Why is a brand-new wallet turned away at the door?

A wallet that has sent no transaction and holds no balance on Ethereum, and none on Base either, gets the answer {"neverUsed": true} when it asks. Nothing is stored or queued: it takes no slot, no place in the queue and no part of the campaign's cap on asks. It costs nothing to make a wallet like that, so Thuli will not spend a screening on it, and a free supply of new keys cannot fill a campaign's queue or run up the model bill. Signing the ask cost nothing, and the attempt only counts toward the visitor's 5 signed asks an hour. Ask with a wallet you have used for a while. The worker keeps the same rule as a second check: a wallet that reaches it with nothing to read is held by code under rule A1 with the reason "A1: This wallet has never been used on Ethereum or Base, so there is nothing to screen.", and no model is called.

What if two of my wallets share a funder?

Wallets that both asked and were first funded by the same ordinary wallet are linked. Linked wallets are held only above a line. By default a linked group of 5 or more asking wallets is held under rule A4, and a funder that first funded 10 or more asking wallets is held under rule A5. Two of your wallets are below both lines, so being linked alone does not hold them, and each is still judged on its own age and activity. The group counts every asking wallet connected through shared funders, so other people's wallets that share your funder count too. A funder that is an exchange, a bridge or a contract links nobody, because those pay strangers all day. A project can change the lines for its campaign.

Can a project override a decision?

Yes. The project owns its campaign and has the last word. The outside check on an appeal is advice and never changes a decision; only the owner's settlement does, and only toward an approval. Owner sign-in is not built yet, so an operator settles an appeal with the appeal:settle command on the owner's word. A reversal gives the wallet a slot if one is left, and the next list the worker posts carries it. A decision made without an appeal is never changed that way.

Can the model be talked into paying a farm?

Code sets a ceiling for every wallet before the model runs, and the final decision is never more generous. The model's input holds only numbers, booleans, fixed words, addresses and hashes, with no text a stranger wrote. Its one permitted raise, rule B2, is bounded by the ceiling too, and across 35,323 wallets it never used it. In a campaign no stranger's words reach a model: an appellant's text is read only by the person who settles the appeal. Only the appeal:demo script, a demonstration, sends appeal text to a model, with Prompt Guard declared, and only to produce advice.

What if SERV is down?

Doubt means hold. A paid request always gets a decision: if SERV gives no answer, the buyer receives a hold on rule A1 with the cause "SERV gave no answer". The free check does the same and keeps that hold for 5 minutes. A screening stops after 120 seconds or 12 SERV calls.

Who holds the reward money?

The vault contract holds it, not Thuli. The project deposits into its own vault, Thuli's agent key can only post a list that waits a delay and can be cancelled, and the owner takes back leftovers only after the end. Every vault so far is on Base Sepolia with test USDC. The factory that makes vaults is also deployed on Base mainnet, where one small proof vault paid 1 real USDC and was then emptied by its owner.

Can Thuli take the money in a vault?

No. The key Thuli's worker uses can do one thing in a vault: post a list. It cannot withdraw, cancel a list, pause, extend the end, replace itself or the owner, or rescue a token. Those belong to the owner, the project that funds the vault. A claim pays only the wallet named in the list, whoever sends it, so the worker cannot redirect one. No wallet can receive more than the per-wallet cap fixed when the vault was made, and the total paid never passes the deposit. What a stolen or misused key can do is post a list that names the wrong wallets. That list waits out the vault's delay and the owner can cancel it. If nobody does, the vault pays it, at most the cap per wallet and never more than the deposit. The full list of who can do what is on the vault page.

Why does the payout take an hour or more?

The vault waits a set time before it pays any new list, so the project that funds it has time to cancel a list that looks wrong. That wait is fixed when the vault is made. The contract's minimum is 1 hour and its maximum is 30 days, and Thuli cannot shorten it. A wallet approved while another list is already waiting goes on the next list, which is posted after the first list's delay ends, so the wait can be up to two delays. After the delay the worker submits one claim at a time, so a long list is paid over several minutes. The steps are on Live campaign.

What does it cost?

The free check costs a visitor nothing, up to 5 new checks an hour per caller. The paid route costs $0.05 per wallet in USDC over x402. The vault contract takes no fee, and the project pays gas. Thuli's own realised cost in the ROBO replay was $17.51 of SERV credit for 35,323 wallets, which is 0.050 cents a wallet.

Can I check one wallet myself?

Yes, at /check, or with the box on the home page. Paste an Ethereum address and read the decision, the rule and the transactions behind it. It is free, with up to 5 new checks an hour for each visitor. One wallet on its own has no list around it, so the check cannot see linked groups, shared deposit addresses, funding bursts or a claim paid elsewhere, and the page says so. Its answer can differ from the replay: a wallet held there as part of a group can come back partial when checked alone.

Which chains does it use?

A campaign reads a wallet's history on Ethereum or on Base mainnet, whichever it was active on first. The free check, the paid API and the replay read Ethereum only. The paid route takes USDC on Base or on Base Sepolia, the test network. Every campaign vault is on Base Sepolia. The vault factory is also deployed on Base mainnet, where one proof vault paid 1 real USDC. Thuli's code knows three chains: Ethereum (1), Base (8453) and Base Sepolia (84532).

Is the rulebook public, and does that help farmers?

It is public, and you can read it on the rulebook page. It is public so the process is fair and appealable. Farmers can read it too, and Thuli lists that as a stated non-goal.

What is not built yet?

As of 13 November 2026: owner sign-in, a general job queue (only campaign asks, claim submissions and appeal checks are queued), paid data lookups, and a campaign on Base mainnet. On Base mainnet the vault factory is deployed, one proof vault paid 1 real USDC and the paid route took one real 5 cent payment, but the campaign runs on Base Sepolia with test money. The campaign routes, the appeal route, the screening worker that posts each list to the vault and submits claims, and the campaign page are built. The worker runs as one process on a host and shares a hosted Postgres database with the site. They are described on Live campaign. The check page at /check and the paid route are built and served by the site. The full list is on limits.

Is it audited?

No outside firm has audited Thuli. It is self-audited: a threat model written before the code, three internal rounds of checking, and fuzz, invariant and fork tests on the vault. See security.

Can I try to break it?

Yes. /break runs ten attacks live from your browser: five against the proof vault on Base Sepolia, as simulated calls that send nothing, four against this site's own routes, and one against how a reason is shown. It does not run a replayed payment, which needs a funded wallet, or a forged appeal. To check the vault's proof record against the chain, run npm run prove:vault -- verify. The steps are on contracts.

Are the dollar figures real money?

The dollar figures on the replay are unrealised. They value ROBO at the claim-day price of $0.0419, and nothing was sold or paid. The money Thuli spent is realised: $17.51 of SERV credit. Vault payments are test USDC, except one proof vault on Base mainnet that paid 1 real USDC, and one screening was bought from the paid check for 5 cents of real USDC.