Testnet faucet designed for AI agents — no CAPTCHAs, just rate limits.
Existing faucets block agents with CAPTCHAs and social verification. AgentFaucet is a smart contract any agent can call programmatically.
AI agents need testnet ETH to deploy contracts, run transactions, and test integrations. But every testnet faucet today is designed for humans — CAPTCHAs, Twitter verification, Discord bots. An autonomous agent can't solve a CAPTCHA.
AgentFaucet is a simple onchain faucet that any address can call. Rate limiting is enforced by cooldown periods per address, not by human verification. Anyone can fund it. Any agent can drip from it.
Anyone ──► fund() ──► ┌─────────────────────┐
│ AgentFaucet │
Agent ──► drip() ◄── │ │ ──► testnet ETH
│ dripAmount: 0.1 ETH│
│ cooldown: 1 hour │
│ balance: 10 ETH │
└─────────────────────┘
- Anyone funds the faucet by sending ETH or calling
fund() - Agent calls
drip(recipient)to receive testnet ETH - Cooldown enforced — same address can't drip again until cooldown elapses
- Owner can configure drip amount, cooldown, and withdraw in emergencies
| Function | Caller | Description |
|---|---|---|
drip(recipient) |
Anyone | Send testnet ETH to recipient (rate-limited) |
fund() |
Anyone | Deposit ETH into the faucet |
cooldownRemaining(addr) |
Anyone | Seconds until address can drip again |
balance() |
Anyone | Faucet ETH balance |
setDripAmount(amount) |
Owner | Update drip amount |
setCooldown(seconds) |
Owner | Update cooldown period |
withdraw(to) |
Owner | Emergency withdraw all funds |
transferOwnership(addr) |
Owner | Transfer ownership |
27 tests covering:
- Drip mechanics (success, cooldown, multi-agent, insufficient balance)
- Funding (direct transfer, fund() call)
- View functions (cooldown remaining, balance)
- Owner functions (set drip, set cooldown, ownership, withdraw)
- Edge cases (zero address, zero drip, zero cooldown)
import { AgentFaucetClient } from "agentfaucet-sdk";
const client = new AgentFaucetClient({
contractAddress: "0x...",
publicClient,
walletClient: agentWallet,
});
// Request testnet ETH
await client.dripSelf();
// Check if ready to drip
const ready = await client.canDrip(agentAddress);
// Check cooldown
const remaining = await client.getCooldownRemaining(agentAddress);
console.log(`Wait ${remaining} seconds`);
// Fund the faucet
await client.fund("1.0");projects/agentfaucet/
├── src/
│ └── AgentFaucet.sol # Core contract
├── test/
│ └── AgentFaucet.t.sol # Full test suite (27 tests)
├── script/
│ └── Deploy.s.sol # Deployment script
├── sdk/
│ ├── src/
│ │ ├── abi.ts # Contract ABI
│ │ ├── client.ts # TypeScript client
│ │ └── index.ts # Package exports
│ ├── package.json
│ └── tsconfig.json
├── CONVERSATION_LOG.md
└── foundry.toml
cd projects/agentfaucet
# Install forge-std
forge install foundry-rs/forge-std --no-commit
# Run tests
forge test -vvv
# Deploy to Base Sepolia
forge script script/Deploy.s.sol --rpc-url $BASE_SEPOLIA_RPC --broadcast --private-key $PRIVATE_KEYThis project was built by an AI agent (Claude Opus 4.6) and a human working together at The Synthesis — the first hackathon you can enter without a body.
Agent: Claude Opus Agent (ERC-8004 registered on Base) Harness: Claude Code Chain: Base Sepolia