This Hardhat project demonstrates how to send pre-EIP-155 (legacy) transactions to the Revive network.
Pre-EIP-155 transactions are legacy Ethereum transactions that don't include the chainId in the signature. This project provides:
- Standard Hardhat Transaction Script - Modern transaction with EIP-155 protection
- Pre-EIP-155 Transaction Script - Legacy transaction format without chainId
cd pre-eip155-hardhat
npm installcp .env.example .envEdit .env:
PRIVATE_KEY=0xxxxMake sure your Revive development node is running:
# In your Revive directory
./revive-dev-node --dev
./eth-rpc --devnpx hardhat run scripts/sendPreEIP155_manual.js --network {network_name}
Moonbase:
❯ npx hardhat run scripts/sendPreEIP155_manual.js --network moonbase
=== Manual Pre-EIP-155 Transaction: moonbase ===
Network: moonbase, RPC: https://moonbeam-alpha.api.onfinality.io/public, ChainId: undefined
Wallet: 0x907B5c9F7239c12148E3dE780d955aE55f5FE898, Balance: 1.096771230330711629 ETH
STEP 1: Prepare transaction parameters
STEP 2: RLP encode transaction (6 fields, no chainId)
RLP: 0xe781b18459682f0082520894742d35cc6634c0532925a3b844bc454e4438f44e... (40 bytes)
STEP 3: Hash transaction with keccak256
Message Hash: 0x3c4eb05edace809893c9f57327b497e802c555c62fb486bdd3478e6ff0877ad0
STEP 4: Sign transaction hash with private key
Signature: r=0xaac24bebc8f49816..., s=0x2a519108216a3649..., v=27 (pre-EIP-155)
STEP 5: Construct signed raw transaction (9 fields with v,r,s)
Signed TX: 0xf86a81b18459682f0082520894742d35cc6634c0532925a3...c2cb7b890f1469a6cdf2 (108 bytes)
STEP 6: Compute transaction hash from signed raw tx
TX Hash: 0x3f90e96ac22c1448ff711804eb6f80d6621c279f6cac5da91d5aa22878c5019f
STEP 7: Broadcast raw transaction to network
Broadcast success: 0x3f90e96ac22c1448ff711804eb6f80d6621c279f6cac5da91d5aa22878c5019f ✓
STEP 8: Wait for confirmation and verify on-chain
Confirmed in block 14351784, gas used: 21000, status: success
On-chain verification: type=0, chainId=NONE, v=27 ✓ PRE-EIP-155
Balance: 1.096771230330711629 → 1.096639730330711629 ETH (-0.0001315 ETH)
STEP 9: Get raw transaction from chain and parse RLP to verify pre-EIP-155
Raw TX: 0xf86a81b18459682f0082520894742d35cc6634c0532925a3...c2cb7b890f1469a6cdf2 (108 bytes)
RLP decoded: 9 fields
Fields: nonce=177, gasPrice=1500000000, gasLimit=21000, to=0x742d35cc6634c0532925a3b844bc454e4438f44e, value=100000000000000, v=27
✓ Final verification: PRE-EIP-155 CONFIRMED (v=27, 9 fields)
This transaction is TRULY pre-EIP-155: no chainId in signature
✅ SUCCESS: TX 0x3f90e96ac22c1448ff711804eb6f80d6621c279f6cac5da91d5aa22878c5019f confirmed in block 14351784 on moonbase
Final result: ✓ PRE-EIP-155 VERIFIED
Sepolia:
❯ npx hardhat run scripts/sendPreEIP155_manual.js --network sepolia
=== Manual Pre-EIP-155 Transaction: sepolia ===
Network: sepolia, RPC: https://1rpc.io/sepolia, ChainId: undefined
Wallet: 0x907B5c9F7239c12148E3dE780d955aE55f5FE898, Balance: 1.972965399326673592 ETH
STEP 1: Prepare transaction parameters
STEP 2: RLP encode transaction (6 fields, no chainId)
RLP: 0xe781e98459682f0082520894742d35cc6634c0532925a3b844bc454e4438f44e... (40 bytes)
STEP 3: Hash transaction with keccak256
Message Hash: 0xaa67b9db37e8e1d6b2672ded355d8e57a5ca1a9f1afe1f1d060133391814631a
STEP 4: Sign transaction hash with private key
Signature: r=0xef59b7e2eae46a4f..., s=0x16052d527b3868c8..., v=27 (pre-EIP-155)
STEP 5: Construct signed raw transaction (9 fields with v,r,s)
Signed TX: 0xf86a81e98459682f0082520894742d35cc6634c0532925a3...bb95f4e5c81c4e89b37e (108 bytes)
STEP 6: Compute transaction hash from signed raw tx
TX Hash: 0x5792fa74b9c721f28f2310a6342936f7616738586aab8f185cd83eb69e6873d8
STEP 7: Broadcast raw transaction to network
Broadcast success: 0x5792fa74b9c721f28f2310a6342936f7616738586aab8f185cd83eb69e6873d8 ✓
STEP 8: Wait for confirmation and verify on-chain
Confirmed in block 9709933, gas used: 21000, status: success
On-chain verification: type=0, chainId=NONE, v=27 ✓ PRE-EIP-155
Balance: 1.972965399326673592 → 1.972833899326673592 ETH (-0.0001315 ETH)
STEP 9: Get raw transaction from chain and parse RLP to verify pre-EIP-155
Raw TX: 0xf86a81e98459682f0082520894742d35cc6634c0532925a3...bb95f4e5c81c4e89b37e (108 bytes)
RLP decoded: 9 fields
Fields: nonce=233, gasPrice=1500000000, gasLimit=21000, to=0x742d35cc6634c0532925a3b844bc454e4438f44e, value=100000000000000, v=27
✓ Final verification: PRE-EIP-155 CONFIRMED (v=27, 9 fields)
This transaction is TRULY pre-EIP-155: no chainId in signature
✅ SUCCESS: TX 0x5792fa74b9c721f28f2310a6342936f7616738586aab8f185cd83eb69e6873d8 confirmed in block 9709933 on sepolia
Final result: ✓ PRE-EIP-155 VERIFIED
Local:
=== Manual Pre-EIP-155 Transaction: local ===
Network: local, RPC: http://localhost:8545, ChainId: 420420420
Wallet: 0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac, Balance: 1000000000.99 ETH
STEP 1: Prepare transaction parameters
STEP 2: RLP encode transaction (6 fields, no chainId)
RLP: 0xe6808459682f0082520894742d35cc6634c0532925a3b844bc454e4438f44e86... (39 bytes)
STEP 3: Hash transaction with keccak256
Message Hash: 0x982757b46b7b86b419baf6444e549b99caad6c22bcbe5823289a5b174f1f1606
STEP 4: Sign transaction hash with private key
Signature: r=0xbb3f2fd31715a00f..., s=0x5f7682cbb230d9cb..., v=28 (pre-EIP-155)
STEP 5: Construct signed raw transaction (9 fields with v,r,s)
Signed TX: 0xf869808459682f0082520894742d35cc6634c0532925a3b8...b6ee368692d18d6e7f81 (107 bytes)
STEP 6: Compute transaction hash from signed raw tx
TX Hash: 0x12e37518f2a2341356319a76330313bc7f3e1a6e64309234f8ba9f8293254b45
STEP 7: Broadcast raw transaction to network
Broadcast failed: Invalid Transaction
❌ FAILED: Invalid Transaction
ProviderError: Invalid Transaction
at HttpProvider.request (/Users/suvi/Documents/paritytech/papermoon/code/pre-eip155-hardhat/node_modules/hardhat/src/internal/core/providers/http.ts:116:21)
at processTicksAndRejections (node:internal/process/task_queues:105:5)
at async Promise.all (index 0)
at HardhatEthersProvider.broadcastTransaction (/Users/suvi/Documents/paritytech/papermoon/code/pre-eip155-hardhat/node_modules/@nomicfoundation/hardhat-ethers/src/internal/hardhat-ethers-provider.ts:275:33)
at broadcastTransaction (/Users/suvi/Documents/paritytech/papermoon/code/pre-eip155-hardhat/scripts/sendPreEIP155_manual.js:122:24)
at main (/Users/suvi/Documents/paritytech/papermoon/code/pre-eip155-hardhat/scripts/sendPreEIP155_manual.js:241:24)
~/Documents/paritytech/papermoon/code/pre-eip155-hardhat
logs from eth-rpc:
2025-11-26 17:44:13.806 TRACE tokio-runtime-worker eth-rpc: send_raw_transaction ethereum_hash: 0x12e37518f2a2341356319a76330313bc7f3e1a6e64309234f8ba9f8293254b45 failed: RpcError(User(UserError { code: 1010, message: "Invalid Transaction", data: Some(RawValue("Transaction call is not expected")) }))