> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getpara.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Fund Testnet Wallet

> Request testnet tokens for a Para wallet using the built-in faucet

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:

```tsx theme={null}
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>
  );
}
```

<Note>
  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.
</Note>

## Fund a Specific Wallet

Pass an explicit `walletId` to target a particular wallet:

```tsx theme={null}
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:

```ts theme={null}
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

| Chain            | Identifier         | Token |
| ---------------- | ------------------ | ----- |
| Ethereum Sepolia | `ETHEREUM_SEPOLIA` | ETH   |

<Note>
  The faucet is rate limited to 10 requests per API key per day. Each wallet has a 24-hour cooldown between faucet requests.
</Note>

## Error Handling

The hook surfaces errors through the standard `error` field on the mutation result. Common error scenarios:

| Status | Cause                                                                           |
| ------ | ------------------------------------------------------------------------------- |
| `400`  | Invalid request (missing walletId, unsupported chain, or no address)            |
| `403`  | Missing or invalid API key                                                      |
| `404`  | Wallet not found (also returned when the wallet belongs to a different API key) |
| `429`  | Rate limit exceeded or wallet cooldown active                                   |
| `500`  | Faucet transaction failed                                                       |

<Warning>
  A 429 response includes a `Retry-After` header indicating when the next request will be accepted.
</Warning>
