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-native-wallet";

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 (
    <View>
      <Button
        onPress={handleCreateAndFund}
        disabled={isPending}
        title={isPending ? "Funding..." : "Create & Fund Wallet"}
      />
      {txHash && <Text>Transaction: {txHash}</Text>}
    </View>
  );
}
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-native-wallet";

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

  return (
    <View>
      <Button
        onPress={() => requestFaucetAsync({ walletId })}
        disabled={isPending}
        title={isPending ? "Requesting..." : "Get Testnet ETH"}
      />
      {data && (
        <Text>
          Sent {data.amount} ETH to {data.address}
        </Text>
      )}
    </View>
  );
}

Direct SDK Method

For non-hook flows, call requestFaucet on your Para client after you have the 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.

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.