Skip to main content
Request testnet tokens directly through Para without relying on external faucets. The useRequestFaucet hook handles the request and returns the transaction details once tokens are sent. Use this guide before running Sepolia examples that send ETH, transfer ERC-20 tokens, or write to contracts. The faucet sends testnet ETH to a Para EVM wallet so your first integration transactions have gas.

Fund the Active Wallet

The simplest usage funds whichever wallet is currently active. This works well right after wallet creation:
import { useRequestFaucet, useCreateWallet } from "@getpara/react-sdk";

function CreateAndFund() {
  const { createWalletAsync } = useCreateWallet();
  const { requestFaucetAsync, isPending } = useRequestFaucet();
  const [txHash, setTxHash] = useState("");

  const handleCreateAndFund = async () => {
    await createWalletAsync({ type: "EVM" });
    const result = await requestFaucetAsync();
    setTxHash(result.transactionHash);
  };

  return (
    <div>
      <button onClick={handleCreateAndFund} disabled={isPending}>
        {isPending ? "Funding..." : "Create & Fund Wallet"}
      </button>
      {txHash && <p>Transaction: {txHash}</p>}
    </div>
  );
}
Calling requestFaucetAsync() without a walletId requires an active wallet. If no active wallet is set and no walletId is passed, the hook throws an error.

Fund a Specific Wallet

Pass an explicit walletId to target a particular wallet:
import { useRequestFaucet } from "@getpara/react-sdk";

function FundWallet({ walletId }: { walletId: string }) {
  const { requestFaucetAsync, isPending, data } = useRequestFaucet();

  return (
    <div>
      <button
        onClick={() => requestFaucetAsync({ walletId })}
        disabled={isPending}
      >
        {isPending ? "Requesting..." : "Get Testnet ETH"}
      </button>
      {data && (
        <p>
          Sent {data.amount} ETH to {data.address}
        </p>
      )}
    </div>
  );
}

Direct SDK Method

For framework-agnostic Web SDK or Server SDK integrations, call requestFaucet after you have the Para wallet ID:
const result = await para.requestFaucet({
  walletId,
  chain: "ETHEREUM_SEPOLIA",
});

console.log(result.transactionHash);
Omit chain to use the default Ethereum Sepolia faucet. Wait for the returned transactionHash to confirm before assuming the funds are spendable. With @getpara/rest-sdk, call client.requestFaucet({ walletId, chain: "ETHEREUM_SEPOLIA" }) with the same request body.

Supported Chains

ChainIdentifierToken
Ethereum SepoliaETHEREUM_SEPOLIAETH
The faucet is rate limited to 10 requests per API key per day. Each wallet has a 24-hour cooldown between faucet requests.

Error Handling

The hook surfaces errors through the standard error field on the mutation result. Common error scenarios:
StatusCause
400Invalid request (missing walletId, unsupported chain, or no address)
403Missing or invalid API key
404Wallet not found (also returned when the wallet belongs to a different API key)
429Rate limit exceeded or wallet cooldown active
500Faucet transaction failed
A 429 response includes a Retry-After header indicating when the next request will be accepted.