Web3js

使用完整的乙太坊餘額進行代幣交易

  • February 11, 2018

我想使用我賬戶中可用的任何乙太坊作為交易費用來發送代幣交易。我知道我需要的氣體,所以理論上我認為下面的公式會起作用:

gasPrice = balanceInWei / gas

所以我嘗試了 0.001 ETH:

gasPrice = 1000000000000000 Wei / 130091

這導致每個氣體單位 0.000000007686926843 ETH

但我得到了

錯誤:返回錯誤:gas資金不足*價格+價值

我沒有發送任何價值,所以理論上gas *價格確實與資金匹配。

我錯過了什麼?我必須使用至少 1 gwei 作為氣體嗎?

我正在使用 Web3js 版本 5.6.0。這是程式碼:

function main() {
   console.log('Transferring from address 0x8..');
   web3.eth.getTransactionCount(SOURCE_WALLET_ADDRESS).then(function (nonce) {
       console.log('The nonce is ' + nonce);
       web3.eth.getBalance(SOURCE_WALLET_ADDRESS).then(function (balance) { 

           console.log('Balance ' + balance); 
           sendTransaction(nonce, balance);
       });
   });
}

function sendTransaction (nonce, balance) {
   var tokensToSend = '1000';
   var contract = new web3.eth.Contract(abiArray, CONTRACT_ADDRESS, { from: SOURCE_WALLET_ADDRESS });
   var balanceInWei = balance * 1000000000000000000;
   var gas = 130091;

   // Find out gas price to use full eth balance
   gasPrice = balanceInWei / gas;

   console.log('\r\nStarting transaction. with nonce ' + nonce);
   console.log('Gas price : ' + gasPrice + '\r\n');

   let details = {
       "to": CONTRACT_ADDRESS,
       "from": SOURCE_WALLET_ADDRESS,
       "data": contract.methods.transfer(DESTINATION_WALLET_ADDRESS, tokensToSend).encodeABI(),
       "value": web3.utils.toHex(tokensToSend),
       "nonce": nonce,
       "gas": gas, // tx fee (gas * gasPrice)
       "gasPrice": gasPrice, // has to be in Wei
       "chainId": 1 // EIP 155 chainId - mainnet: 1, rinkeby: 4
   }

   const transaction = new EthereumTx(details);
   transaction.sign(Buffer.from(WALLET_PRIVATE_KEY, 'hex'));
   const serializedTransaction = transaction.serialize();

   web3.eth.sendSignedTransaction('0x' + serializedTransaction.toString('hex')).then(function (transId) {
       console.log('My job here is done. ' + transId.transactionHash);
   });
}

main();

範例輸出:

*** PROGRAM START ***

Transferring from address 0x8Df3..
The nonce is 71
Balance: 0.003703316

Starting transaction. with nonce 71
Gas price : 28467119170.426853

您的程式碼將傳入的餘額乘以10**18,大概是為了從 ether 轉換為 wei。但餘額來自web3.eth.getBalance,這已經返回了wei。因此,您將 gas 價格設置得太高(以 0 倍10**18)。只需使用:

var balanceInWei = balance;

(或balance直接使用。)

編輯

您還應該避免嘗試使用帶有小數 wei 的 gas 價格,因此請降低除法的結果:

gasPrice = Math.floor(balanceInWei / gas);

編輯 2

此行嘗試發送與您發送令牌相同數量的乙太幣。你說你沒有嘗試轉移任何乙太,所以刪除這一行:

"value": web3.utils.toHex(tokensToSend),

引用自:https://ethereum.stackexchange.com/questions/39135