eth_signTransaction - Moonbase RPC Method
Sign a transaction without broadcasting it on Moonbase Alpha. 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 Moonbase Alpha without submitting it to the network.
Why Moonbase? Build on the Moonbeam testnet for risk-free EVM dApp development and deployment testing with free testnet tokens, full EVM compatibility, XCM testing capabilities, and identical feature set to Moonbeam mainnet.
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 Moonbeam developers, dApp testers, and teams validating cross-chain integrations 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
Request Parameters
Address of the account to sign with (must be unlocked)
Recipient address (omit for contract creation)
Gas limit for the transaction (default: 90000)
Gas price in wei (legacy transactions)
Value to send in wei
Compiled contract code or encoded method call
Transaction nonce (defaults to eth_getTransactionCount)
Response Body
The RLP-encoded signed transaction, ready for eth_sendRawTransaction
The transaction object including v, r, s signature fields
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
}'// Recommended: client-side signing with ethers.js
import { Wallet, JsonRpcProvider, parseEther } from 'ethers';
const provider = new JsonRpcProvider('https://moonbase-rpc.n.dwellir.com');
const wallet = new Wallet('YOUR_PRIVATE_KEY', provider);
const tx = {
to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b',
value: parseEther('0.1'),
gasLimit: 21000
};
// Sign without sending
const signedTx = await wallet.signTransaction(tx);
console.log('Signed Moonbase tx:', signedTx);
// Send later with eth_sendRawTransaction
const receipt = await provider.broadcastTransaction(signedTx);
console.log('Tx hash:', receipt.hash);from web3 import Web3
from eth_account import Account
w3 = Web3(Web3.HTTPProvider('https://moonbase-rpc.n.dwellir.com'))
# Recommended: client-side signing
account = Account.from_key('YOUR_PRIVATE_KEY')
tx = {
'to': '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b',
'value': w3.to_wei(0.1, 'ether'),
'gas': 21000,
'gasPrice': w3.eth.gas_price,
'nonce': w3.eth.get_transaction_count(account.address),
'chainId': w3.eth.chain_id
}
signed = account.sign_transaction(tx)
print(f'Signed Moonbase tx: {signed.raw_transaction.hex()}')
# Send later
tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
print(f'Tx hash: {tx_hash.hex()}')package main
import (
"context"
"crypto/ecdsa"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("https://moonbase-rpc.n.dwellir.com")
if err != nil {
log.Fatal(err)
}
// Recommended: client-side signing
privateKey, err := crypto.HexToECDSA("YOUR_PRIVATE_KEY_HEX")
if err != nil {
log.Fatal(err)
}
publicKey := privateKey.Public().(*ecdsa.PublicKey)
fromAddress := crypto.PubkeyToAddress(*publicKey)
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
log.Fatal(err)
}
toAddress := common.HexToAddress("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")
tx := types.NewTransaction(nonce, toAddress, big.NewInt(100000000), 21000, big.NewInt(10000000000), nil)
chainID, err := client.ChainID(context.Background())
if err != nil {
log.Fatal(err)
}
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Signed Moonbase tx hash: %s\n", signedTx.Hash().Hex())
}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 Moonbase:
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