How We Verify a Swap Without Asking for a Transaction Hash
Why Denshin never asks you to paste a transaction hash, and the checks a swap passes instead, from the start block to smart wallets and one hash per reward.

A lot of quest pages end the same way: do the thing, then paste your transaction hash into a box. We never added that box. On Denshin you press Verify, and the quest finds the swap on its own.
That was a deliberate choice, and it made the checker more work to build. Here is what happens between the click and the tick.
Why we don't take the hash from you#
A hash you paste is a claim. It might be yours. It might be a stranger's swap copied from a block explorer, or one you already used on another quest, or a typo that points at a transaction from three years ago.
Every one of those has to be ruled out anyway, so we went one step further: the hash a quest accepts always comes from our own read of the chain, never from the browser. A client can't nominate a transaction it likes, and you don't have to go hunting for one.
1. Start mission sets the floor#
When you press Start mission, we note the current block on the quest's network. That block is the floor.
Without it, "did you swap on Base" would be answered by any swap your wallet ever made, and the quest would pay you for something you did last spring. With it, the question becomes "did you swap since you took this quest". It's also why the most common failed check is simply acting first and starting second: the swap landed below the floor. Press Start, swap again, verify.
Balance quests don't have a floor, because "hold gas on Base" is a question about right now.
2. We find the candidates, then distrust them#
To find your swap, we ask an indexer one narrow question: which transactions moved the quest's token in or out of your wallet since the floor block?
The indexer's answer is a list of suggestions and nothing more. It never decides whether a quest pays, and any dollar value it attaches is ignored, because a third party shouldn't get to price our rewards. Each suggestion goes on to the next step, where we read the chain directly.
3. We read the receipt ourselves#
For each candidate, the checker pulls the transaction receipt from the network and asks:
- Did it succeed? A reverted transaction proves nothing.
- Was it mined at or after your floor block?
- Is it inside the season window? Time is taken from the block, not from the moment you clicked.
- Has it settled? We wait for 8 blocks on Base and Soneium and 10 on Sonic, roughly sixteen seconds on each. Verify sooner and you'll be asked to try again in a moment.
4. Who actually made the swap#
This is the part that took the longest to get right. There are two obvious ways to tell whose swap a transaction is, and both are wrong.
"The sender of the transaction is the player." Not with a smart wallet. With an ERC-4337 account, the sender is a bundler, a service that submits operations on the wallet's behalf, and the recipient is a shared entry-point contract. Neither address is you. Smart wallets are common on Base, our main network, so a checker built on the sender would quietly reject a big share of real players.
"The pool's Swap event names the trader." It names whoever called the pool, which is almost always a router or an aggregator. On a route with several hops, the "recipient" is the next pool along. Your address reliably shows up in neither place.
So we check the two things that hold every time. Within that one transaction:
- a pool from our approved list executed a swap, and
- your wallet's own balance of the quest's token moved by at least the amount the quest asks for.
That stays true whichever way you route the trade: through an aggregator, a universal router, a multicall, a Safe, a smart-wallet batch or a plain wallet. You can use the app you like. The quest still sees your swap.
5. Approved pools only#
Anyone can deploy a contract that emits an event shaped exactly like a real swap. So the checker matches the pool against a registry of known pools and the factories that created them on each network. A swap through a venue we don't recognise may happen and still not count. When a quest names a venue, like Kyo on Soneium, it's telling you the route it can verify.
6. One transaction, one reward, ever#
When a swap passes, its hash is recorded once, in a table where the hash itself must be unique. From that moment on:
- it can't close a second quest,
- it can't close the same quest twice,
- it can't be used by another account, including a second account of yours.
Every accepted swap burned real gas exactly once. That's what makes on-chain proof expensive to fake, and it's also why the season payout asks for at least one verified transaction: it's the one signal a script can't produce for free.
What it means when you play#
- Start first, then swap. The floor is set at Start.
- Swap from your main wallet, on the network the quest names. Checks read that wallet only.
- Route it any way you like. Aggregator or the exchange's own page, smart wallet or plain one.
- Wait a minute if the check comes back empty. Indexers can trail the chain by a few seconds. Verifying again is free; after an empty check, that quest can be checked again in one minute.
None of this asks you to sign anything extra, approve anything for us or copy a hash from an explorer. The full rules are on the proof and verification page of our docs, and the reasoning behind on-chain quests in general is in why on-chain quests matter.
If you haven't made your first swap of the season yet, First Exchange costs under ten cents. Genesis runs until 31 October: open app.denshin.io, press Start, then swap.


