eth_signTransaction - Base RPC Method
Sign a transaction without broadcasting it on Base. Public shared RPC endpoints commonly return deprecation, unsupported-method, or account-management errors because they do not keep unlocked signers.
Signs a transaction with the private key of the specified account on Base without submitting it to the network.
Why Base? Build on Coinbase's L2 with 54% of L2 market revenue and direct access to 110M+ Coinbase users with $8B+ TVL, $0.08 gas fees, built-in Coinbase distribution, and seamless fiat rails.
Security Warning: Public Dwellir endpoints do not keep unlocked signers. On shared infrastructure,
eth_signTransactioncommonly returns a deprecation, unsupported-method, or account-management error instead of a signed payload. For production use, sign transactions client-side using libraries like ethers.js or web3.py, then broadcast witheth_sendRawTransaction.
When to Use This Method
eth_signTransaction is relevant for consumer app developers, SocialFi builders, and teams seeking easy fiat onramps in limited scenarios:
- Understanding the Signing Flow — Learn how transaction signing works before implementing client-side signing
- Local Development — Sign transactions on a local dev node (Hardhat, Anvil, Ganache) where accounts are unlocked
- Offline Signing Workflows — Generate signed transaction payloads for later broadcast
Code Examples
# Local dev node only. Public Dwellir endpoints do not expose unlocked-account signing.
curl -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [{
"from": "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
"to": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"nonce": "0x0"
}],
"id": 1
}'Common Use Cases
1. Offline Transaction Signing
Sign transactions on an air-gapped machine for later broadcast:
import { Wallet } from 'ethers';
async function createSignedTransaction(privateKey, to, value, { chainId, nonce, gasLimit }) {
const wallet = new Wallet(privateKey);
const tx = {
to,
value,
gasLimit,
nonce,
chainId,
};
const signedTx = await wallet.signTransaction(tx);
// Store signedTx and broadcast from an online machine
return signedTx;
}2. Batch Transaction Preparation
Pre-sign multiple transactions for sequential submission on Base:
async function prepareBatch(wallet, transactions) {
const signed = [];
for (let i = 0; i < transactions.length; i++) {
const tx = {
...transactions[i],
nonce: baseNonce + i
};
signed.push(await wallet.signTransaction(tx));
}
return signed; // Submit via eth_sendRawTransaction in order
}Error Handling
Common errors and solutions:
| Error Code | Description | Solution |
|---|---|---|
| -32000 | Deprecated, unavailable, or account not unlocked | Use client-side signing instead of node-side signing |
| -32601 | Method not found | Method disabled on this node — use client-side signing |
| -32602 | Invalid params | Verify transaction fields (from, to, gas, etc.) |
| -32603 | Internal error | Check node logs for signing failures |
Related Methods
eth_sendRawTransaction— Broadcast a signed transactioneth_sendTransaction— Sign and send in one step (requires unlocked account)eth_accounts— List accounts available for signing
eth_feeHistory
Get historical gas fee data on Base including base fees and priority fee percentiles. Essential for gas price prediction, fee estimation UIs, and network congestion monitoring.
eth_sendTransaction
Send a transaction from an unlocked account on Base. Requires the node to hold the sender's private key — intended for development and testing only.