The transaction declared chain ID 5777, but the connected node is on 1337

Question:

I am trying to deploy my SimpleStorage.sol contract to a ganache local chain by making a transaction using python. It seems to have trouble connecting to the chain.

from solcx import compile_standard
from web3 import Web3
import json
import os
from dotenv import load_dotenv

load_dotenv()

with open("./SimpleStorage.sol", "r") as file:
    simple_storage_file = file.read()

compiled_sol = compile_standard(
    {
        "language": "Solidity",
        "sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
        "settings": {
            "outputSelection": {
                "*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}
            }
        },
    },
    solc_version="0.6.0",
)

with open("compiled_code.json", "w") as file:
    json.dump(compiled_sol, file)


# get bytecode
bytecode = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"][
    "bytecode"
]["object"]


# get ABI
abi = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["abi"]

# to connect to ganache blockchain
w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:7545"))
chain_id = 5777
my_address = "0xca1EA31e644F13E3E36631382686fD471c62267A"
private_key = os.getenv("PRIVATE_KEY")


# create the contract in python

SimpleStorage = w3.eth.contract(abi=abi, bytecode=bytecode)

# get the latest transaction
nonce = w3.eth.getTransactionCount(my_address)

# 1. Build a transaction
# 2. Sign a transaction
# 3. Send a transaction


transaction = SimpleStorage.constructor().buildTransaction(
    {"chainId": chain_id, "from": my_address, "nonce": nonce}
)
print(transaction)

It seems to be connected to the ganache chain because it prints the nonce, but when I build and try to print the transaction
here is the entire traceback call I am receiving

Traceback (most recent call last):
File "C:Usersevensdemosweb3_py_simple_storagedeploy.py", line 
52, in <module>
transaction = SimpleStorage.constructor().buildTransaction(
File "C:Python310libsite-packageseth_utilsdecorators.py", line 
18, in _wrapper
return self.method(obj, *args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3contract.py", line 684, in buildTransaction
return fill_transaction_defaults(self.web3, built_transaction)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3_utilstransactions.py", line 114, in 
fill_transaction_defaults
default_val = default_getter(web3, transaction)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3_utilstransactions.py", line 60, in <lambda>
'gas': lambda web3, tx: web3.eth.estimate_gas(tx),
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3eth.py", line 820, in estimate_gas
return self._estimate_gas(transaction, block_identifier)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3module.py", line 57, in caller
result = w3.manager.request_blocking(method_str,
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3manager.py", line 197, in request_blocking
response = self._make_request(method, params)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3manager.py", line 150, in _make_request
return request_func(method, params)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewareformatting.py", line 76, in 
apply_formatters
response = make_request(method, params)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewaregas_price_strategy.py", line 90, in 
middleware
return make_request(method, params)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewareformatting.py", line 74, in 
apply_formatters
response = make_request(method, formatted_params)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewareattrdict.py", line 33, in middleware
response = make_request(method, params)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewareformatting.py", line 74, in 
apply_formatters
response = make_request(method, formatted_params)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewareformatting.py", line 73, in 
apply_formatters
formatted_params = formatter(params)
File "cytoolz/functoolz.pyx", line 503, in 
cytoolz.functoolz.Compose.__call__
ret = PyObject_Call(self.first, args, kwargs)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:Python310libsite-packageseth_utilsdecorators.py", line 
91, in wrapper
return ReturnType(result)  # type: ignore
File "C:Python310libsite-packageseth_utilsapplicators.py", line 
22, in apply_formatter_at_index
yield formatter(item)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:Python310libsite-packageseth_utilsapplicators.py", line 
72, in apply_formatter_if
return formatter(value)
File "cytoolz/functoolz.pyx", line 250, in 
cytoolz.functoolz.curry.__call__
return self.func(*args, **kwargs)
File "C:UsersevensAppDataRoamingPythonPython310site- 
packagesweb3middlewarevalidation.py", line 57, in 
validate_chain_id
raise ValidationError(
web3.exceptions.ValidationError: The transaction declared chain ID 
5777, but the connected node is on 1337
Asked By: E_charles

||

Answers:

Had this issue myself, apparently it’s some sort of Ganache CLI error but the simplest fix I could find was to change the network id in Ganache through settings>server to 1337. It restarts the session so you’d then need to change the address and private key variable.

If it’s the same tutorial I’m doing, you’re likely to come unstuck after this… the code for transaction should be:

transaction = 
 SimpleStorage.constructor().buildTransaction( {
    "gasPrice": w3.eth.gas_price, 
    "chainId": chain_id, 
    "from": my_address, 
    "nonce": nonce, 
})
print(transaction)

Otherwise you get a value error if you don’t set the gasPrice

Answered By: Jamie Di Cataldo

this line of code is wrong

chain_id = 5777

Ganache chain id is not 5777. This is network id. Network id is used by nodes to transfer data between nodes that are on the same network. Network id is not included in blocks and it is not used for signing transactions or mining blocks.

 chain_id = 1377

Chain ID is not included in blocks either, but it is used during the transaction signing and verification process.

Answered By: Yilmaz

Hey it happened to me too, you need to build the constructor like this

 SimpleStorage.constructor().buildTransaction( {
    "gasPrice": w3.eth.gas_price, 
    "chainId": chain_id, 
    "from": my_address, 
    "nonce": nonce, 

You need to add the gas price part.
Worked for me

Answered By: PaulB

It works for me, I get value chain_id from w3.eth.chain_id

transaction = SimpleStorage.constructor().buildTransaction(
{
    "gasPrice": w3.eth.gas_price,
    "chainId": w3.eth.chain_id,
    "from": my_address,
    "nonce": nonce,
}

)

Delegates to eth_chainId RPC Method

Returns an integer value for the currently configured “Chain Id” value introduced in EIP-155. Returns None if no Chain Id is available.

Answered By: Visal SUOS

Perhaps, you are following FreeCodeCamp tutorial.
I have got the same problem

In my case, it is working after adding gas price, "gasPrice": w3.eth.gas_price

transaction = SimpleStorage.constructor().buildTransaction({ "gasPrice": w3.eth.gas_price, "chainId" : chain_id, "from": my_address, "nonce": nonce})
print(transaction)
Answered By: MD SHAYON

I encountered this issue today and after debugging, I am certain that the issue is from the dotenv config variables imported. All the variables are been seen by python as strings, and for some reason, the web3 library swaps the value 5777 if the type of your chain id is not an integer.

The perfect fix is to cast your chain_id into type int before deploying your smart contract.

Hope this saves y’all some pondering time, peace out!

Snippet example below:

transaction = SimpleStorage.constructor().buildTransaction(
{
    "gasPrice": w3.eth.gas_price,
    "chainId": int(chain_id),
    "from": my_address,
    "nonce": nonce,
}

)

Answered By: Femolak