Human Faucet
A Sybil-resistant, gasless testnet faucet powered by World ID and Chainlink CRE that guarantees one drip of ETH per verified human across multiple chains
What it is
What it is?
The multi-chain Human Faucet is a Sybil-resistant, gasless testnet faucet that guarantees one drip of ETH per verified human across multiple blockchain networks.
What problem it solves?
Testnet faucets are fundamentally broken. They are either quickly drained by Sybil bots, or they force legitimate developers to jump through high-friction, invasive hoops (like authenticating with Twitter or Discord) just to claim a fraction of a token. This system punishes real humans and rewards automated bot nets. The multi-chain Human Faucet solves this by ensuring fair, privacy-preserving distribution of testnet funds, completely eliminating bot drainage while removing social authentication friction.
How it works
The system seamlessly bridges decentralized identity with cross-chain orchestration:
- Proof of Personhood: Users connect via a Next.js frontend and verify their humanity using the World ID app.
- Off-Chain Orchestration: Verifying ZKPs on-chain is incredibly gas-intensive. Instead, the frontend sends the proof payload to a Chainlink CRE (Custom Runtime Environment) workflow. This off-chain decentralized oracle network securely queries the Worldcoin v2 Cloud API to validate the proof. With CRE, we can bring World ID Proofs on blockchains where it is not natively supported.
- Rate Limiting: The CRE workflow uses the user's unique, privacy-preserving nullifier_hash to enforce a strict "One Claim Per Human Per 24 Hours" rule. As a secondary failsafe, the smart contracts also enforce a 1-day cooldown on-chain.
- Gasless Multi-Chain Execution: If the human is verified and eligible, Chainlink CRE utilizes its EVM Write capability to trigger the HumanFaucet smart contract on the target network (e.g., Sepolia or Arbitrum Sepolia). The smart contract delivers the ETH directly to the user's wallet.
- Community Sustainability: Anyone to instantly donate ETH directly to the faucet smart contracts via their browser wallet to keep the community resource alive.
How it Works
We architected the multi-chain Human Faucet across three distinct layers: Frontend, Off-Chain Orchestration, and On-Chain Smart Contracts.
- Frontend (Next.js & viem): We built the client-side interface using Next.js and Tailwind CSS. We integrated the World ID IDKit (v2.0) to allow users to generate Zero-Knowledge Proofs (ZKPs) of their humanity. We heavily utilized viem to create lightweight public clients that pre-validate the user's cooldown status on-chain before they even attempt to claim, and to handle direct Web3 wallet interactions for the community funding feature.
- Off-Chain Orchestration (Chainlink CRE): Instead of building a centralized Node.js backend to verify the proofs, we leveraged CRE to run our logic on a Decentralized Oracle Network (DON). We wrote a custom TypeScript workflow that acts as a secure, serverless bridge. When triggered by the frontend, the CRE workflow uses its HTTPClient capability to hit the Worldcoin v2 Cloud API and validate the ZKP. Once verified, it enforces our Sybil-resistant rate limit based on the user's nullifier_hash. With CRE, we can bring World ID Proofs on blockchains where it is not natively supported.
- Smart Contracts (Solidity): We wrote the HumanFaucet.sol smart contract and deployed it across multiple networks (Sepolia and Arbitrum Sepolia). The contract inherits from Chainlink CRE's ReceiverTemplate, allowing it to securely accept cryptographically signed reports from the DON. Once the CRE workflow verifies the human off-chain, it uses its EVMClient capability to construct a payload, sponsor the gas via the CRE Forwarder, and execute the _processReport function on our destination contract. The contract does a final timestamp check and drips the ETH to the user.
Links
Created by
- Pham Ngoc Bao Anh