djangosolidityweb3py

Transaction is never mined, using web3.py


I'm developing a website using python 3.6, Django 2.1.1, Solidity and web3.py v4. I want to add the transaction to ropsten testnet but the transactions are never getting confirmed. Here is the code:

amount_in_wei = w3.to_wei(questionEtherValue,'ether')
nonce=w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress))+1

txn_dict = {
     'to': contractAddress,
     'value': amount_in_wei,
     'gas': 2000000,
     'gasPrice': w3.toWei('70', 'gwei'),
     'nonce': nonce,
     'chainId': 3
}
signed_txn = account.signTransaction(txn_dict)
txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)

try:
    txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash, timeout=300)
except Exception:
    return {'status': 'failed', 'error': 'timeout'}
else:
    return {'status': 'success', 'receipt': txn_receipt}

Solution

  • Ah, as @yasaman.h discovered, there is an off-by-one error in the nonce:

    # original:
    nonce = w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress)) + 1
    
    # should be:
    nonce = w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress))
    

    The nonce of a transaction must be equal to the count of previously-sent transactions. So the first transaction sent by a new account would have a nonce of zero.