Skip to content

papermoonio/pre-eip155-hardhat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pre-EIP-155 Transaction Sender (Hardhat)

This Hardhat project demonstrates how to send pre-EIP-155 (legacy) transactions to the Revive network.

📋 Overview

Pre-EIP-155 transactions are legacy Ethereum transactions that don't include the chainId in the signature. This project provides:

  1. Standard Hardhat Transaction Script - Modern transaction with EIP-155 protection
  2. Pre-EIP-155 Transaction Script - Legacy transaction format without chainId

Quick Start

1. Install

cd pre-eip155-hardhat
npm install

2. Configure Environment

cp .env.example .env

Edit .env:

PRIVATE_KEY=0xxxx

⚠️ Security Warning: Never commit your real private key! Use test accounts only.

3. Start Revive Node

Make sure your Revive development node is running:

# In your Revive directory
./revive-dev-node --dev
./eth-rpc --dev

4. Run Scripts

npx hardhat run scripts/sendPreEIP155_manual.js --network {network_name}

5. Result

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")) }))

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors