2

Recently I've been having some trouble with the X-Flashbots-Signature header when sending a request to the flashbots goerli endpoint. My python code looks like this:

import requests
import json
import secrets
from eth_account import Account, messages
from web3 import Web3
from math import ceil

rpcUrl = GOERLI_RPC_NODE_PROVIDER
web3 = Web3(Web3.HTTPProvider(rpcUrl))

publicKey = ETH_PUBLIC_KEY
privateKey = ETH_PRIVATE_KEY
contractAddress = GOERLI_TEST_CONTRACT # Goerli test contract
data = CONTRACT_DATA # Contract data to execute

signed = []
for _ in range(2):
    nonce = web3.eth.getTransactionCount(publicKey, 'pending')
    checksumAddress = Web3.toChecksumAddress(contractAddress)
    checksumPublic = Web3.toChecksumAddress(publicKey)
    tx = {
        'nonce': nonce,
        'to': checksumAddress,
        'from': checksumPublic,
        'value': 0,
        'gasPrice': web3.toWei(200, 'gwei'),
        'data': data
    }
    gas = web3.eth.estimateGas(tx)
    tx['gas'] = ceil(gas + gas * .1)
    signed_tx = web3.eth.account.signTransaction(tx, privateKey)
    signed.append(Web3.toHex(signed_tx.rawTransaction))

dt = {
    'jsonrpc': '2.0',
    'method': 'eth_sendBundle',
    'params': [
        {
            'txs': [
                signed[0], signed[1] # Signed txs with web3.eth.account.signTransaction
            ],
            'blockNumber': web3.eth.block_number + 1,
            'minTimestamp': '0x0',
            'maxTimestamp': '0x0',
            'revertingTxHashes': []
        }
    ],
    'id': 1337
}
pvk = secrets.token_hex(32)
pbk = Account.from_key(pvk).address

body = json.dumps(dt)
message = messages.encode_defunct(text=Web3.keccak(text=body).hex())
signature = pbk + ':' + Account.sign_message(message, pvk).signature.hex()

hd = {
    'Content-Type': 'application/json',
    'X-Flashbots-Signature': signature,
}

res = requests.post('https://relay-goerli.flashbots.net/', headers=hd, data=body)
print(res.text)

This code is a modified version of code taken straight from the flashbots docs: https://docs.flashbots.net/flashbots-auction/searchers/advanced/rpc-endpoint/#authentication Upon running this code I get an internal server error error response. At first, I thought the problem might be fixed by replacing text=Web3.keccak(text=body).hex() to hexstr=Web3.keccak(text=body).hex() or primative=Web3.keccak(text=body), as per the definition of messages.encode_defunct: https://eth-account.readthedocs.io/en/stable/eth_account.html#eth_account.messages.encode_defunct. But after making this replacement, I got the error signer address does not equal expected. This is very confusing, especially because I have resolved the message with the signature myself and the public key does match. But whenever I send it to the flashbots endpoint, I am left with this error. Any ideas would be greatly appreciated.

  • There is a lot of variables missing so it’s hard to run test cases. Are these variables private? – Keegan Murphy Dec 26 '21 at 15:56
  • Some variable definitions were made with api keys. I've edited my code just now to include the most I can without them. I hope it helps. @KeeganM – PatrickCodes Dec 27 '21 at 07:07
  • There is no need to json.dumps your dictionary data since requests does it for you. Also, try adding json=body instead of data=body – Keegan Murphy Dec 27 '21 at 07:15
  • Changing the post parameter to `json=body` works, but I still get the `signer address does not equal expected` error. – PatrickCodes Dec 27 '21 at 08:33

0 Answers0