eth_sendRawTransaction on X Layer
Everything below was measured on 2026-10-13 by calling eth_sendRawTransaction on X Layer through the same endpoint customers use, and is re-measured weekly.
What eth_sendRawTransaction does
Submits a signed transaction to the network and returns its hash. The node checks the signature, chain ID, nonce and balance first, and returns an error string instead of a hash when any check fails, which is the text your app has to handle.
Errors X Layer returns, word for word
We submitted three transactions that must fail, signed by a new, empty key (nothing was spent). These are the messages your app receives in those situations.
| EIP-1559 transfer from an empty account | insufficient funds for gas * price + value: have 0 want 840000063001 |
|---|---|
| Legacy transaction signed without a chain ID (pre-EIP-155) | only replay-protected (EIP-155) transactions allowed over RPC |
| Truncated bytes ("0x02f8") | rlp: value size exceeds available input length |
How to read them
"insufficient funds" means the balance cannot cover value + gas limit × max fee per gas. The have and want numbers are in wei, so you can show the shortfall exactly.
X Layer's nodes refuse transactions without a chain ID ("only replay-protected (EIP-155) transactions allowed over RPC"), so old signing code that omits it fails here.
Send the same signed bytes again only if you never got a hash back: a second submission of an accepted transaction returns an "already known" style error, not a second transaction, and a transaction with the same nonce but a higher fee replaces it.
Example request
curl -s https://rpc.swiftnodes.io/rpc/xlayer?key=YOUR_API_KEY \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_sendRawTransaction","params":["0x02f8..."]}'import { createPublicClient, http } from "viem";
const client = createPublicClient({
transport: http("https://rpc.swiftnodes.io/rpc/xlayer?key=YOUR_API_KEY"),
});
try {
const hash = await client.sendRawTransaction({ serializedTransaction: signed });
const receipt = await client.waitForTransactionReceipt({ hash });
} catch (e) {
const msg = String(e?.details ?? e?.message);
if (/insufficient funds/i.test(msg)) { /* ask the user to top up */ }
else if (/nonce too low|already known/i.test(msg)) { /* already sent: look up by hash */ }
else throw e;
}Other methods on X Layer
- eth_blockNumberSupported
- eth_chainIdSupported
- eth_getBalanceSupported
- eth_getBlockByNumberSupported
- eth_getTransactionByHashSupported
- eth_getTransactionReceiptSupported
- eth_callSupported
- eth_estimateGasSupported
- eth_gasPriceSupported
- eth_maxPriorityFeePerGasSupported
- eth_getTransactionCountSupported
- eth_getCodeSupported
- eth_subscribeSupported
- eth_getLogsSupported
- eth_getBlockReceiptsSupported
- eth_feeHistorySupported
- eth_getProofSupported
- eth_createAccessListSupported
- debug_traceCallSupported
- trace_blockSupported
- trace_transactionSupported
eth_sendRawTransaction on other chains
- Ethereum
- Base
- Arbitrum
- Optimism
- Polygon
- BNB Smart Chain
- Avalanche
- Sonic
- Linea
- Scroll
- zkSync Era
- Blast
- Mantle
- Gnosis
- Celo
- Berachain
- Monad
- Unichain
- Kaia
- PulseChain
- World Chain
- Ronin
- Abstract
- ApeChain
- MegaETH
- Fantom
- Lisk
- Hemi
- BOB
- Plasma
- Fraxtal
- Zora
- Story
- Soneium
- Sei
- Hyperliquid
- Taiko
- Morph
- Ink
- Katana
- Ethereum Classic
- opBNB
- Mode
- Flare
- Core
- Chiliz
- Telos EVM
- Tempo
- Cronos
- Manta Pacific
- Shibarium
- Boba Network
- Arbitrum Nova
- Immutable zkEVM
Frequently asked questions
Does X Layer support eth_sendRawTransaction?
Yes. eth_sendRawTransaction answered on the SwiftNodes X Layer endpoint when our weekly probe called it through the customer path (2026-10-13).
Does X Layer accept transactions without a chain ID?
No. It answered "only replay-protected (EIP-155) transactions allowed over RPC".
Why does X Layer return "insufficient funds" from eth_sendRawTransaction?
The sender cannot pay value plus gas limit × maxFeePerGas. Fund the account, lower the value, or lower maxFeePerGas.
X Layer endpoints, live block height and WebSocket status are on the X Layer RPC page.
One key covers every chain we serve, and SwiftNodes has a free tier.