Introducing the Aztec Faucet

The Nethermind team is releasing an open-source faucet for the Aztec network, providing a single interface for acquiring both L1 ETH and Fee Juice across devnet and testnet environments.

:globe_with_meridians: Live: https://aztec-faucet.nethermind.io
:package: Source: GitHub - NethermindEth/aztec-faucet: Developer faucet for Aztec devnet. Bridges Fee Juice from L1 to L2 and drips Sepolia ETH. Includes keypair generator, balance checker, and claim scripts. · GitHub


Why we built this

Getting started on Aztec requires two distinct assets:

  • ETH (Sepolia) for L1 gas fees
  • Fee Juice, Aztec’s native L2 gas token, which is required for every transaction on the network

Fee Juice is not sent directly to an L2 address. It is bridged from L1 through the Fee Juice Portal contract, picked up by the Aztec sequencer, and included in the next rollup block. This relay step takes approximately 1 to 2 minutes. For developers new to Aztec, this flow is non-obvious and is often the first real blocker to getting started.

The faucet handles both assets, surfaces the bridging mechanics inline, and gets developers to their first transaction without unnecessary detours.


What’s in this release

  • Web UI for requesting ETH or Fee Juice by pasting an Aztec address
  • Devnet and testnet support, with network switching available directly in the UI
  • In-browser keypair generation, allowing developers to create a throwaway devnet account with no CLI required
  • CLI account creation via a one-liner script that generates a secret key and Aztec address entirely locally, with nothing leaving the machine
  • Account balance lookup, allowing developers to check their Fee Juice balance on the network directly from the UI
  • Account deployment status check, to verify whether an account contract has been deployed on the network yet
  • Rate limiting enforced at 1 request per token per 24 hours per address, and 10 keypairs per IP per 24 hours
  • Atomic account deploy and claim, where the first Fee Juice claim deploys the account contract in a single transaction, funded by the Fee Juice itself
  • Open source under the MIT licence, self-hostable for teams, hackathons, or custom network deployments

Getting started

Requesting tokens

Visit https://aztec-faucet.nethermind.io, select your target network (devnet or testnet), paste your Aztec address, choose a token, and submit the request.

ETH is sent directly to your Ethereum address on Sepolia and is available immediately.

Fee Juice is bridged from L1 via the Fee Juice Portal contract. The faucet sends an L1 transaction to the portal, the Aztec sequencer picks up the cross-chain message, and it is included in the next L2 block. Once the relay is complete (roughly 1 to 2 minutes), you receive a claim preimage, which you use to consume the message and receive your Fee Juice on L2.

Generating an Aztec account

If you do not yet have an Aztec address, use the one-liner for your target network. Nothing leaves your machine.

Devnet

curl -fsSL https://raw.githubusercontent.com/NethermindEth/aztec-faucet/main/sh/devnet/create-account.sh | sh

Testnet

curl -fsSL https://raw.githubusercontent.com/NethermindEth/aztec-faucet/main/sh/testnet/create-account.sh | sh

This outputs your secret key and Aztec address. A self-contained Node.js snippet is also available under the Account tab in the faucet UI.

For unlimited local account generation with no rate limits, use Aztec.js directly.


How account deployment works

Generating a keypair produces a deterministic Aztec address, but no contract is deployed on-chain at that point. The account contract is deployed automatically on the first Fee Juice claim. The deployment and the claim are executed as a single atomic transaction, funded by the Fee Juice itself, so no separate setup step or additional funds are required.

Keypairs generated in the browser are produced server-side using cryptographically secure randomness. They are not stored, not logged, and not transmitted to any third party. The address is derived from the secret key using the Schnorr account contract, with no network call to the Aztec node required.


Self-hosting

The faucet is fully open-source under the MIT licence. Everything required to run a private instance is available in the repository, making it suitable for team environments, hackathons, or deployments against custom Aztec networks.

git clone https://github.com/NethermindEth/aztec-faucet

Once cloned, refer to the .env.example file in the repository root. It documents all required environment variables. Copy it to .env and fill in the values for your target network before starting the instance.


Feedback and contributions

This is an early release and we will be iterating on it as the Aztec network evolves. If you encounter an issue, have a feature request, or would like to contribute a fix or improvement, please open an issue or pull request on GitHub.

Happy building. :hammer_and_wrench:

6 Likes

Faucet Update: Testnet-only mode, SDK 4.1.2-rc.1, and infrastructure fixes

Following up on the initial release post.

Live: https://aztec-faucet.nethermind.io
Source: GitHub - NethermindEth/aztec-faucet: Testnet faucet for Aztec Network. Bridges Fee Juice from L1 to L2, drips Sepolia ETH, generates keypairs, and provides claim scripts. · GitHub
PR with full details: feat: testnet-only migration, bb.js native fix, and UI redesign by Giri-Aayush · Pull Request #16 · NethermindEth/aztec-faucet · GitHub

Testnet-only mode

With the Aztec testnet now stable and open for broader use, devnet has been sunset by the Aztec team. The faucet has been migrated to testnet-only mode. This removed ~3,500 lines of dual-network routing, network-switching logic, and duplicated SDK dependency trees. All API routes, shell scripts, UI components, and the claim tracker now target a single network: rpc.testnet.aztec-labs.com.

The previous architecture maintained two parallel SDK installations (@aztec/*@devnet and @aztec/*@rc) with npm aliases, separate shell script directories (sh/devnet/ and sh/testnet/), per-network rate limiting, and UI accent color switching between networks. All of that is gone. One SDK, one config file (src/lib/network-config.ts), one set of scripts.

SDK upgrade and the bb.js GLIBC problem

The SDK was upgraded from 4.0.0-devnet.2-patch.4 to 4.1.2-rc.1. This broke production.

@aztec/bb.js ships a native Barretenberg binary that is compiled against GLIBC 2.39. Our Docker image used node:24-slim, which ships GLIBC 2.36. The keygen endpoint crashed on every request with "Native backend process exited with code 1". Status and drip endpoints also failed when they triggered Barretenberg initialization.

We went through four fix attempts:

  1. Polyfilled globalThis.self to trick the SDK into thinking it was running in a browser, routing through BarretenbergSync instead of the native binary. Partial fix. Status endpoint recovered, keygen still crashed because BarretenbergSync also tries the native binary first before falling back to WASM.
  2. Set HARDWARE_CONCURRENCY=1 to force single-threaded WASM execution. This bypassed the native binary entirely but at the cost of performance. Workaround, not a fix.
  3. Replaced Node.js with Bun as the container runtime, since Bun defines typeof self === 'object' natively. Pod went into CrashLoopBackOff. Bun cannot run the Next.js standalone server output.
  4. Switched the base image to Ubuntu 24.04 and installed Node.js 24 on top. Ubuntu 24.04 ships GLIBC 2.39. The native bb binary runs directly, no polyfills, no WASM fallback, full performance. This is what we shipped.

The diagnostic command that confirmed the requirement: strings node_modules/@aztec/bb.js/build/amd64-linux/bb | grep GLIBC_2. | sort -V | tail -1

Additional SDK change: claim polling was updated from getL1ToL2MessageMembershipWitness to getL1ToL2MessageCheckpoint, matching the 4.1.2-rc.1 API surface.

Infrastructure changes

  • Docker: Ubuntu 24.04 base image, npm 10 (npm 11 breaks npm ci with lockfileVersion 3 and aliased packages), fetch-retries 5 with 5-minute timeout for resilience during large package downloads
  • @aztec/bb.js pinning: explicitly pinned in root package.json to prevent npm from hoisting the wrong version
  • serverExternalPackages: @aztec/bb.js and @aztec/native added to Next.js config to avoid Turbopack panics during development

Claim flow improvements

The claim data panel was reworked. When Fee Juice is ready to claim, the UI shows:

  • Claim amount and message leaf index with copy buttons
  • Curl one-liner (recommended) that pipes directly from GitHub and handles account detection, atomic deploy-and-claim, and SDK installation automatically
  • Self-contained Node.js snippet with verified imports against 4.1.2-rc.1: FeeJuicePaymentMethodWithClaim from @aztec/aztec.js/fee, FeeJuiceContract from @aztec/aztec.js/protocol, Fr from @aztec/aztec.js/fields
  • Etherscan link to the L1 bridge transaction, styled consistently with the ETH drip result

The SDK snippet covers both paths: FeeJuicePaymentMethodWithClaim for new accounts (atomic deploy + claim in one tx), and FeeJuice.claim() for already-deployed accounts.

UI changes

The frontend was rewritten with a material dark theme:

  • Navigation bar with centered tab links and a network status badge showing chain ID, ETH balance, and Fee Juice supply
  • Split-panel faucet layout on desktop (editorial branding left, form right), single column on mobile
  • All six tabs restyled: Faucet, Account, Balance, Network, FAQ, Donate
  • Mobile hamburger menu
  • Walking character animation during bridging. A stick figure walks across the footer from L1 to L2, crossing an elevated suspension bridge. Speech bubbles show the current phase. The character runs faster near the end and celebrates when the claim is ready. Timing calibrated from real test runs (average ~160s, range 139-185s). Desktop only.

CLI scripts

Devnet scripts have been removed. Testnet scripts remain under sh/testnet/:

# Generate keypair (nothing leaves your machine)
curl -fsSL https://raw.githubusercontent.com/NethermindEth/aztec-faucet/main/sh/testnet/create-account.sh | sh

# Claim Fee Juice (values provided by the faucet UI)
curl -fsSL https://raw.githubusercontent.com/NethermindEth/aztec-faucet/main/sh/testnet/claim.sh | sh -s -- \
  --secret <YOUR_SECRET_KEY> \
  --claim-amount <AMOUNT> \
  --claim-secret <SECRET> \
  --message-leaf-index <INDEX>

# Check Fee Juice balance
curl -fsSL https://raw.githubusercontent.com/NethermindEth/aztec-faucet/main/sh/testnet/check-balance.sh | sh -s -- <AZTEC_ADDRESS>

Scripts fetch sh/versions.sh at runtime for SDK version resolution, so version bumps propagate to all users without re-downloading.

Verification

The full workflow was tested end-to-end on the dev deployment before merging to production:

  • Keygen: 200 OK, testnet address generated
  • Fee Juice drip: bridging started, claim ready after ~2-3 minutes
  • ETH drip: Sepolia transaction sent
  • Balance check: returns balance from L2 node
  • Status: healthy, both assets available, SDK 4.1.2-rc.1

Issues and PRs welcome on GitHub.