Summary
Arbitrum One is the mainnet chain (chain ID 42161). The testnet that developers usually mean when they say "Arbitrum One testnet" is Arbitrum Sepolia (chain ID 421614), which uses Sepolia ETH for gas. This page explains the chain settings, how to add the network to a wallet, how to request testnet ETH, and how to debug the errors that show up when a testnet endpoint is misconfigured. It also covers when a shared public endpoint is enough and when a dedicated node or managed RPC API is the better fit for CI pipelines, indexers, and staging environments.
If you searched for an "Arbitrum One testnet RPC," the first thing to clear up is naming. Arbitrum One is the mainnet chain (chain ID 42161). There is no separate "Arbitrum One testnet" with that name. The testnet developers almost always mean is Arbitrum Sepolia (chain ID 421614), which runs on Sepolia ETH and mirrors the Arbitrum Nitro execution environment closely enough for contract testing, wallet flows, and CI.
This page gives you the endpoint, the exact chain settings, a wallet config snippet, faucet steps, and a debugging path for the errors that show up when a testnet endpoint is misconfigured. It also helps you decide whether a shared public endpoint is enough or whether your workflow needs a managed RPC API or a dedicated node.
Which endpoint fits your workflow?
Before copying an endpoint, match it to what you are actually doing. Testnet traffic patterns are very different from mainnet: bursts during CI runs, long idle periods, and occasional heavy eth_getLogs scans from indexers.
| Your workflow | What you need | Sensible starting point |
|---|---|---|
| Manual testing in a wallet or Remix | A reachable HTTPS endpoint, no auth friction | Public shared endpoint |
| Local dev with Hardhat/Foundry | Stable endpoint, predictable rate behavior | Managed RPC API key |
| CI pipeline running contract tests | Concurrency headroom, no shared throttling | Managed RPC API or dedicated node |
| Indexer or subgraph-style log scanning | Wide eth_getLogs ranges, archive access | Dedicated node with archive data |
| Staging environment that mimics prod | Same provider and transport as production | Same managed/dedicated setup as mainnet |
If you are just verifying that a contract deploys, a shared public endpoint is fine. If your test suite fans out dozens of parallel requests, or you scan logs across large block ranges, plan for a managed or dedicated setup from the start so you are not debugging rate limits instead of your code.
Arbitrum Sepolia chain settings at a glance
These are the values you paste into a wallet, a framework config, or a .env file. Keep them consistent across your team to avoid "wrong network" confusion.
| Setting | Value |
|---|---|
| Network name | Arbitrum Sepolia |
| Chain ID | 421614 |
| Currency symbol | ETH (Sepolia ETH) |
| Block explorer | https://sepolia.arbiscan.io |
| RPC (HTTPS) | https://arbitrum-sepolia.api.onfinality.io/public |
| Transport | HTTP (WebSocket available on managed/dedicated plans) |
For comparison, Arbitrum One mainnet uses chain ID 42161 and the explorer https://arbiscan.io. Mixing these two up is the single most common source of "transaction failed" confusion during testing.
Adding the network to a wallet
Most wallets accept a custom network. In MetaMask you can add it manually, or trigger the prompt from a dapp with wallet_addEthereumChain:
await window.ethereum.request({
method: "wallet_addEthereumChain",
params: [{
chainId: "0x66eee", // 421614 in hex
chainName: "Arbitrum Sepolia",
nativeCurrency: { name: "Sepolia Ether", symbol: "ETH", decimals: 18 },
rpcUrls: ["https://arbitrum-sepolia.api.onfinality.io/public"],
blockExplorerUrls: ["https://sepolia.arbiscan.io"]
}]
});
Note that chainId must be hex-encoded. 421614 in decimal is 0x66eee. If you pass the decimal string, some wallets silently reject the request.
Verifying the endpoint with curl and viem
Before wiring anything into an app, confirm the endpoint responds and reports the chain you expect.
curl -s https://arbitrum-sepolia.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
A correct response returns "result":"0x66eee". If you get a different chain ID, you are pointed at the wrong network. A quick block-number check confirms the node is synced:
import { createPublicClient, http } from "viem";
import { arbitrumSepolia } from "viem/chains";
const client = createPublicClient({
chain: arbitrumSepolia,
transport: http("https://arbitrum-sepolia.api.onfinality.io/public")
});
const block = await client.getBlockNumber();
console.log("Arbitrum Sepolia head:", block);
If eth_chainId works but getBlockNumber stalls, the node may be behind or the request is being throttled. That distinction matters for the debugging section below.
Getting testnet ETH from a faucet
Arbitrum Sepolia gas is paid in Sepolia ETH. You cannot bridge mainnet ETH to a testnet, so you need a faucet. Typical options:
- The Arbitrum Sepolia faucet linked from the Arbitrum developer docs.
- Alchemy and other infrastructure faucets that dispense Sepolia ETH for Arbitrum Sepolia.
- Bridging Sepolia ETH from Ethereum Sepolia into Arbitrum Sepolia if you already hold some.
Faucets usually require a minimum mainnet balance or a social login to prevent abuse, and they dispense small amounts. If a faucet says your address is not eligible, it is almost always an anti-abuse rule, not a problem with your RPC endpoint.
Debugging the errors you will actually hit
Most "testnet RPC" problems are configuration mistakes, not node outages. Work through these in order.
| Symptom | Likely cause | Fix |
|---|---|---|
chainId mismatch / wrong network prompt | Wallet set to Arbitrum One (42161) instead of Sepolia (421614) | Re-add the network with chain ID 421614 |
insufficient funds for gas | No Sepolia ETH in the test wallet | Request from a faucet |
nonce too low or stuck pending tx | Reused nonce after a dropped tx | Reset the account in the wallet or send a replacement tx |
429 or timeouts under load | Shared endpoint rate limiting | Move to a managed RPC API key or dedicated node |
eth_getLogs returns range error | Block range too wide for the endpoint | Narrow the range or use an archive-capable dedicated node |
| Contract call reverts only on testnet | Different deployed addresses or state | Re-check addresses and constructor args for Sepolia |
A useful habit is to log the chain ID your app resolves at startup. Many "testnet bugs" are actually the app quietly talking to mainnet because an environment variable was not overridden.
When a shared endpoint is not enough
Public endpoints are convenient, but they are shared. On a testnet that is usually fine for a single developer. It becomes a problem when:
- Your CI runs many parallel test jobs and hits rate limits.
- An indexer scans logs across wide ranges and needs archive data.
- You want WebSocket subscriptions for event-driven tests.
- You need the same provider in staging and production so behavior matches.
At that point, a managed RPC API with an API key, or a dedicated node you control, removes the shared-throttling variable. OnFinality provides both: a managed RPC API service across supported networks, and dedicated nodes when you need isolated capacity, archive data, or WebSocket transport. For testnet work, the practical reason to move up is reproducibility: you want test failures to reflect your code, not someone else's traffic.
Testnet versus mainnet: what actually differs
It helps to know what carries over from Arbitrum Sepolia to Arbitrum One, and what does not.
- Execution environment: Nitro-based, so EVM behavior and most opcodes match mainnet closely.
- Gas: Sepolia ETH, not real ETH. Gas prices are usually low and less representative of mainnet conditions.
- State: Completely separate. Contracts must be redeployed; addresses will differ.
- Oracles and bridges: Testnet versions exist but may be rate-limited or have different feeds.
- Sequencer behavior: Similar, but do not assume mainnet latency or throughput characteristics.
Because gas is cheap and state is disposable, testnet is the right place to shake out nonce handling, event subscriptions, and log-scanning logic before you point the same code at mainnet.
Key Takeaways
- "Arbitrum One testnet" almost always means Arbitrum Sepolia, chain ID
421614. - Arbitrum One itself is mainnet, chain ID
42161— do not point test code at it. - The public HTTPS endpoint is
https://arbitrum-sepolia.api.onfinality.io/public; verify it witheth_chainIdbefore use. - You need Sepolia ETH from a faucet; you cannot bridge mainnet ETH to a testnet.
- Most errors are config issues (wrong chain ID, no gas, reused nonce), not node failures.
- Move to a managed RPC API or dedicated node when CI concurrency, log scans, or WebSocket needs outgrow a shared endpoint.
Frequently Asked Questions
Is Arbitrum One a testnet?
No. Arbitrum One is the mainnet chain (chain ID 42161). The testnet is Arbitrum Sepolia (chain ID 421614).
What is the Arbitrum Sepolia RPC URL?
The public HTTPS endpoint is https://arbitrum-sepolia.api.onfinality.io/public. For production-like test setups, use a managed or dedicated endpoint.
What chain ID should I use for Arbitrum testnet?
421614, which is 0x66eee in hex.
How do I get testnet ETH? Use an Arbitrum Sepolia faucet, or bridge Sepolia ETH from Ethereum Sepolia if you already hold some. Mainnet ETH cannot be bridged to a testnet.
Why does my transaction fail with insufficient funds? Your wallet has no Sepolia ETH. Request from a faucet and retry.
Can I use WebSockets on the testnet? WebSocket transport is available on managed and dedicated plans. Check the Arbitrum network page and RPC pricing for current options.
Should I use the same provider for testnet and mainnet? It is a good practice. Matching providers and transports reduces the chance that staging behaves differently from production for reasons unrelated to your code.