Faucet
The local devnet faucet provides unlimited test ADA for development.
CLI Usage
# Fund an address with default amount (1000 ADA)
npx cardano-devkit topup addr_test1qz...
# Fund with specific amount (in lovelace)
npx cardano-devkit topup addr_test1qz... --amount 5000000000
# Fund multiple addresses
npx cardano-devkit topup addr1... addr2... addr3...
Programmatic Usage
Using DevnetManager
import { createDevnetManager } from 'cardano-devkit';
const devnet = createDevnetManager();
// Fund with specific amount (in lovelace)
const txHash = await devnet.topup(address, 1000_000_000n); // 1000 ADA
console.log('Funded:', txHash);
// Fund multiple addresses
const addresses = [address1, address2, address3];
for (const addr of addresses) {
await devnet.topup(addr, 100_000_000n);
}
Using HTTP API
// Direct API call
const response = await fetch('http://localhost:10080/api/v1/faucet', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: 'addr_test1qz...',
amount: 1000_000_000 // 1000 ADA in lovelace
})
});
const { txHash } = await response.json();
console.log('Transaction:', txHash);
Rate Limiting
The faucet includes rate limiting to prevent abuse (even in local development):
| Setting | Value |
|---|---|
| Requests per address | 10 per minute |
| Maximum amount | 10,000 ADA per request |
| Cooldown | 60 seconds |
Bypassing Rate Limits (Development Only)
// For testing scenarios that need many funds
const devnet = createDevnetManager({
faucetRateLimit: false // Disable rate limiting
});
Pre-funded Addresses
The devnet genesis includes pre-funded addresses for immediate testing:
import { PREFUNDED_WALLETS } from 'cardano-devkit';
// Each wallet has 1,000,000 ADA
const wallet1 = PREFUNDED_WALLETS[0];
console.log('Address:', wallet1.address);
console.log('Seed:', wallet1.seed);
// Use in your app
lucid.selectWallet.fromSeed(wallet1.seed);
Checking Balance
After funding, verify the balance:
const utxos = await lucid.utxosAt(address);
const balance = utxos.reduce(
(sum, utxo) => sum + utxo.assets.lovelace,
0n
);
console.log('Balance:', Number(balance) / 1_000_000, 'ADA');
Common Patterns
Setup Test Accounts
async function setupTestAccounts(count: number): Promise<string[]> {
const devnet = createDevnetManager();
const addresses: string[] = [];
for (let i = 0; i < count; i++) {
const seed = WalletHelper.generateSeed();
lucid.selectWallet.fromSeed(seed);
const address = await lucid.wallet().address();
await devnet.topup(address, 1000_000_000n);
addresses.push(address);
}
return addresses;
}
const testAccounts = await setupTestAccounts(5);
Wait for Funding Confirmation
async function fundAndWait(address: string, amount: bigint) {
const devnet = createDevnetManager();
const txHash = await devnet.topup(address, amount);
// Wait for confirmation
await lucid.awaitTx(txHash);
return txHash;
}
Batch Funding
async function batchFund(
addresses: string[],
amountEach: bigint
): Promise<string[]> {
const devnet = createDevnetManager();
const txHashes: string[] = [];
// Fund in parallel (rate limits permitting)
const promises = addresses.map(addr =>
devnet.topup(addr, amountEach)
);
return Promise.all(promises);
}
Faucet vs Testnet Faucets
| Feature | Local Faucet | Testnet Faucet |
|---|---|---|
| Rate limit | 10/min (configurable) | Very strict |
| Amount limit | 10,000 ADA | ~1,000 ADA |
| Availability | Always | Sometimes down |
| Confirmation | 100ms-1s | ~20 seconds |
| API | REST | Web form |
Troubleshooting
"Rate limit exceeded"
# Wait 60 seconds, or
npx cardano-devkit reset # Reset rate limits
"Invalid address"
# Ensure address starts with addr_test1 for testnet format
# Or addr_ for mainnet format
"Connection refused"
# Check devnet is running
npx cardano-devkit status
# Restart if needed
npx cardano-devkit stop
npx cardano-devkit start