A project pays a crypto influencer. The post ships. Engagement looks fine. And then nobody can answer the only question that matters: did a single wallet actually buy?
Followers can be bought. Engagement can be farmed. The one thing that cannot be faked is the chain. This is how we built attribution on top of that, and the parts that are still hard.
The core constraint
An anonymous click and an anonymous wallet have no link between them unless the wallet identifies itself somewhere you control. There is no trick around this. Your only options are (a) the wallet signs something on a surface you own, or (b) probabilistic attribution.
What we tried first, and why it was wrong
v1 asked the token project to paste a script on their own site to bind wallet to click at connect time. Two fatal problems:
- It does not scale. We do not control the project's site, and many tokens have no site at all - they live on a DEX or a launchpad.- It requires cooperation. No script, no attribution.We also considered routing buyers through our own swap widget. It captures everything and we rejected it outright: telling a crypto-native user to buy through an unfamiliar swap instead of the real DEX is exactly the shape of a drainer scam. Capturing data is not worth looking like a phishing site. ## The architecture we settled on Layer 1 - gasless signature capture. The creator's link lands on a campaign hub page we own, not a swap. There the visitor connects and signs a SIWE (EIP-4361) message. No transaction, no approval, nothing that can move funds. That binds wallet to creator. Nobody connects for nothing, so the capture sits behind real value funded by the project: allowlist, points, a buyer reward pool. Layer 2 - on-chain matching. The buyer then buys wherever they want. The chain is public and shows the address of every buyer of that token. The indexer scans ERC-20 Transfer logs for the token, and for each buyer address looks it up against the Layer 1 bindings. Match found, credit the creator, with USD volume priced from a neutral source. The link is not an integration with Uniswap. The link is the wallet address, which is public and identical everywhere. The wallet is a licence plate; the chain is a public camera that records the plate of everyone who bought; we match the plate we saw on our page against the plate that bought on the DEX. Layer 3 - aggregate estimation. For buyers who never touched our page, we index all buys of the token in the campaign window and split the residual volume across creators proportional to click share with time decay. Not exact per wallet, but it is the only way to measure zero-friction launchpad buys. ## The bug that cost us the most: RPCs that lie The indexer silently found nothing on BSC and Base for weeks. Not an error - just zero results, which reads exactly like no on-chain activity. The cause was the public RPC endpoints we had hardcoded:
- bsc-dataseed.binance.org rejects eth_getLogs with a limit-exceeded error- eth.llamarpc.com returns an HTML error page, so JSON parsing fails- Several publicnode.com endpoints serve receipts and eth_call fine, but need a paid archive tier for eth_getLogs on non-recent blocksThe fix was a shared RPC client with a per-chain failover pool: try each endpoint in order, skip transport errors, skip non-JSON bodies, skip JSON error responses, and return the first valid result. Crucially it now logs loudly when every endpoint fails, instead of returning null. A silent null in an indexer is worse than a crash, because it looks like a legitimate empty result. Lesson we paid for: if a data-fetch failure and a genuinely empty dataset produce the same value in your code, you will ship a broken pipeline and believe it works. ## What is honestly not solved
- Solana and launchpads. The EVM indexer does not cover them. That path needs a different data source entirely and is not built yet.- Layer 3 is an estimate. Click-share splitting is defensible but it is not proof, and we label it that way in the product rather than blending it into the exact numbers.- Connection rate caps the exact tier. Only wallets that signed on the hub get deterministic attribution. Everything else is inference.## Takeaway You do not need the token project to integrate anything. You need one surface where the wallet identifies itself voluntarily, and then the public chain does the rest of the work for you. The hard parts are not cryptographic - they are incentive design for that one page, and infrastructure that fails loudly. Happy to go deeper on any layer in the comments.
Top comments (0)