I'm trying to replicate a script that I have already running in nodejs in php.

On PHP I'm using "web3p/web3.php": "dev-master", "web3p/ethereum-tx": "^0.4.3" libraries.

When I send the signed transaction I'm always getting a "invalid sender" response. The transaction data is generated using 1inch.exchange API which works perfectly on nodejs.

I'm on PHP7.4 with GMP installed.

Here's a short version of my script

use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;
use Web3p\EthereumTx\Transaction;

$web3 = new Web3(new HttpProvider(new HttpRequestManager($_ENV['API_MORALIS_BSC_URL'], 10)));
$eth = $web3->eth;

$params = [
        "fromAddress" => $_ENV['ADDRESS_1'],
        "fromTokenAddress" => $_ENV['COIN_1'],
        "toTokenAddress" => $_ENV['COIN_2'],
        "slippage" => 1,
        "amount" => "10000000000000000",

$client = new \GuzzleHttp\Client(['http_errors' => false, 'timeout' => 10]);
$response = $client->get($_ENV['API_1INCH_BSC_URL']."swap", [ "query" => $params ]);

$transactionParams = json_decode($response->getBody()->getContents(),true)['tx'];

// Array
// (
//     [from] => 0x3f9E320Fc------0DBA74d43c539a63bf
//     [to] => 0x11111112------e05771c2dccff4faa26
//     [data] => 0x7c025200000000000000000000000000baf90------0000000000000000000000000000000000000000000000000cfee7c08
//     [value] => 0
//     [gas] => 198325
//     [gasPrice] => 15000000000
//     [nonce] => 1d4
//     [chainId] => 38
// )

$transaction = new Transaction($transactionParams);

$signedTransaction = '0x'.$transaction->sign($_ENV['PRIVATE_KEY_1']);

$eth->sendRawTransaction($signedTransaction, function ($err, $tx) { $err->getMessage(); });

I'd tried with and without including nonce, from and chainid on the transaction params.

I'm using a Moralis node, but the same happens with an Ankr node. Both nodes work fine when I run the nodejs version of the script.

I've been struggling whit this for a few days now, any help will be appreciated.


2 Answers 2


Check this issue on github. Check you chainId format. With bsc testnet i found this:

'chainId' => 97 //works
'chainId' => 0x61 //works
'chainId' => '97' //works
'chainId' => '0x61' //invalid sender
  • This didn't work for me. Try all possible combinations and none of them worked.
    – chali
    Commented May 6, 2022 at 13:54

I had the same problem with web3p. Ended making my own approach based on kornrunner tx signer:


I made a working "send eth" example (Example/example.send.php) tested on ethereum (mainnet), ropsten (etherum testnet) and mumbai (polygon testnet).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.