Я хочу использовать любой эфириум, доступный в моей учетной записи, в качестве комиссии за транзакцию для отправки токена. Я знаю, какой газ мне нужен, поэтому теоретически я подумал, что сработает следующая формула:
gasPrice = balanceInWei / gas
поэтому я попробовал с 0,001 ETH:
gasPrice = 1000000000000000 Wei / 130091
что приводит к 0,000000007686926843 ETH за единицу газа.
Но я получил
Ошибка: Возвращается ошибка: недостаточно средств на газ * цена + стоимость
Я не отправляю ничего, поэтому теоретически цена на газ * соответствует средствам.
Что мне не хватает? Должен ли я использовать как минимум 1 гвэй в качестве газа?
Я использую 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
, по-видимому, для преобразования из эфира в вей. Но баланс идет от web3.eth.getBalance
, который уже возвращает вэй . Таким образом, вы устанавливаете слишком высокую цену на газ (с коэффициентом 10**18
). Просто используйте:
var balanceInWei = balance;
(Или использовать balance
напрямую.)
РЕДАКТИРОВАТЬ
Вам также следует избегать попыток использовать цену на газ с долями wei, поэтому результат деления должен быть равен:
gasPrice = Math.floor(balanceInWei / gas);
РЕДАКТИРОВАТЬ 2
Эта строка пытается отправить такое же количество эфира, сколько вы отправляете токенов. Вы сказали, что не пытаетесь передать эфир, поэтому удалите эту строку:
"value": web3.utils.toHex(tokensToSend),
web3.eth.getBalance
возвращает баланс в вэй. Можете ли вы поделиться кодом, который производит вывод, который вы добавили к вопросу? (Текущий код не производит такого вывода.)npm
(К вашему сведению, вы используете
версию 5.6.0 .)web3.eth.getBalance
дает вам баланс в Вэй. Если вы видите что-то другое, вам придется предоставить некоторые убедительные доказательства (например, минимальное воспроизведение, которое может запустить любой, указывающее на узел основной сети, который возвращает неправильный результат).console.log
не совпадают с выводом.web3.eth.getBalance('0x<your address here>').then(console.log);
var balance = web3.utils.fromWei(result, 'ether');
.
Роман Фролов
Виктор
пользователь19510
Виктор