web3p/web3.php

Failed to Transfer Token Between Wallet

idevlinkcom opened this issue · 3 comments

I need help to send token BSC (BEP20) to others wallet, I've successfully implement send BSC but not the token BEP20

I already created this

public function CreateAndSendTransBEP20($transactionParams) {
        $contractAddress = $transactionParams['contract'];
        $contract = self::EthContract($contractAddress);
        
        $address = isset($transactionParams['address']) ? $transactionParams['address'] : null;
        $addressprivate = isset($transactionParams['addressprivate']) ? $transactionParams['addressprivate'] : null;
        $toaddress = isset($transactionParams['toaddress']) ? $transactionParams['toaddress'] : null;
        $amount = isset($transactionParams['amount']) ? $transactionParams['amount'] : 0;
        $gas_limit = isset($transactionParams['gas_limit']) ? $transactionParams['gas_limit'] : 21001;
        $gas_price = isset($transactionParams['gas_price']) ? $transactionParams['gas_price'] : 5;
        
        $estimatedGas = "0x200b20";

        $contract->estimateGas('transfer', $toaddress, $amount, [
            'from' => $address,
        ], function ($err, $result) use (&$gas_limit) {
            if ($err !== null) {
                throw $err;
            }
            $gas_limit = $result->toString();
        });
        echo '<br>gas_limit:' . $gas_limit . '<br>';

        $web3ChainId = isset($transactionParams['web3ChainId']) ? $transactionParams['web3ChainId'] : "0x0";
        $data = $contract->getData('transfer', $toaddress, $amount);
        
        $nonce = 0;
        $this->Eth()->getTransactionCount($address, function ($err, $result) use (&$nonce) {
            $nonce = gmp_intval($result->value);
        });
        $amount_wei = eth_to_wei($amount);
        $gas_wei = gwei_to_wei($gas_price);
        $gas_limit = $gas_limit*2;
        $transaction_fee = bcmul($gas_wei, $gas_limit);
        $value_wei = bcsub($amount_wei, $transaction_fee);
        
        $transaction = [
            'nonce' => '0x' . dechex($nonce),
            'from' => strtolower($address),
            'to' => strtolower($contractAddress),
            'gas' => '0x' . bcdechex($gas_limit),
            'gasLimit' => '0x' . bcdechex($gas_limit),
            'gasPrice' => '0x' . bcdechex($gas_wei),
            'value' => '0x' . bcdechex($value_wei),
            'chainId' => strval($web3ChainId),
            'data' => '0x' . $data
        ];
        $transaction = new Transaction($transaction);
        $signedTx = $transaction->sign($addressprivate);
        
        $this->Eth()->sendRawTransaction('0x' . $signedTx, function ($err, $tx) use (&$payout_tx) {
            if ($err !== null) {
                echo 'Error: ' . $err->getMessage();
                $payout_tx = 'failed';
            } else {
                $payout_tx = $tx;
            }
        });
		return $payout_tx;
    }

And then i call the function with this code

$transactionparams = array(
         'contract'=>$contractaddress,
         'address' => $address,
         'addressprivate' => $addressprivate,
         'toaddress' => $toaddress,
         'gas_limit' => 21000, // gas price can be set or null
         'amount' => 10,
         'web3ChainId' => 97 // 56 bsc mainnet, 97 bsc testnet
       );
       $gettransactiontxbep20 = $bapi->CreateAndSendTransBEP20($transactionparams);

     echo "<pre>";
     print_r($gettransactiontxbep20);
     echo "</pre>";

What I got is an error showing

gas_limit:36043
Error: transaction underpriced
failed

Already try to double the gas price also give another +1 to nonce and the result is
"Error: insufficient funds for gas * price + value"

Any one can help me with this error?

FOR an update
if the value set to 0 the transaction will success,
this is the example success using 0 value

$transactionparams = array(
         'contract'=>$contractaddress,
         'address' => $address,
         'addressprivate' => $addressprivate,
         'toaddress' => $toaddress,
         'gas_limit' => 21103, // gas price can be set or null
         'amount' => 0,
         'web3ChainId' => 97 // 56 bsc mainnet, 97 bsc testnet
       );
       $gettransactiontxbep20 = $bapi->CreateAndSendTransBEP20($transactionparams);

     echo "<pre>";
     print_r($gettransactiontxbep20);
     echo "</pre>";

https://testnet.bscscan.com/tx/0xc292e30c8a292e1aca1cca575c9f72856b121294346e4c4fe13388df67fdc8c1

here is my address sender 0x5454c66Eaa964D13B7d858D79E85c877Ccbf33Ab which contains 20 USDT Token

also trying this but no luck #251 (comment)

@idevlinkcom how you fixed this? getting the same error