Web3js
使用完整的乙太坊餘額進行代幣交易
我想使用我賬戶中可用的任何乙太坊作為交易費用來發送代幣交易。我知道我需要的氣體,所以理論上我認為下面的公式會起作用:
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),