Используйте полный баланс Ethereum для транзакции токена

Я хочу использовать любой эфириум, доступный в моей учетной записи, в качестве комиссии за транзакцию для отправки токена. Я знаю, какой газ мне нужен, поэтому теоретически я подумал, что сработает следующая формула:

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
Какой кошелек вы используете? Я имею в виду тот, где происходит ошибка.
Я использую web3js, поэтому кошелек не задействован, не уверен, что вы имеете в виду.
Можете ли вы поделиться точным кодом, который вы использовали для совершения транзакции?
конечно @smarx - я обновил вопрос с исходным кодом

Ответы (1)

Ваш код умножает баланс, переданный 10**18, по-видимому, для преобразования из эфира в вей. Но баланс идет от web3.eth.getBalance, который уже возвращает вэй . Таким образом, вы устанавливаете слишком высокую цену на газ (с коэффициентом 10**18). Просто используйте:

var balanceInWei = balance;

(Или использовать balanceнапрямую.)

РЕДАКТИРОВАТЬ

Вам также следует избегать попыток использовать цену на газ с долями wei, поэтому результат деления должен быть равен:

gasPrice = Math.floor(balanceInWei / gas);

РЕДАКТИРОВАТЬ 2

Эта строка пытается отправить такое же количество эфира, сколько вы отправляете токенов. Вы сказали, что не пытаетесь передать эфир, поэтому удалите эту строку:

"value": web3.utils.toHex(tokensToSend),
Когда я вижу вывод баланса после его получения, сумма отображается в eth — я обновил вопрос с примером вывода.
Спасибо за подтверждение правильности формулы. Ошибка должна быть в том, как что-то обрабатывается в коде - возможно, типы var или что-то в этом роде.
Я видел, что людям нравится использовать шестнадцатеричные значения во всех полях транзакции, но не уверен, что это возможно для таких вещей.
web3.eth.getBalanceвозвращает баланс в вэй. Можете ли вы поделиться кодом, который производит вывод, который вы добавили к вопросу? (Текущий код не производит такого вывода.)
это тот же код, я просто удалил журнал. позвольте мне исправить это
Также укажите версию web3.js, которую вы используете.
«Web3js версии 5.6.0» не существует. Текущая производственная версия web3.js — 0.20.4, а текущая бета-версия — 1.0.0-beta.29. Можете ли вы уточнить, что вы используете?
Если я получу результат, он должен быть как минимум больше единицы, чтобы цена газа не равнялась 0. npm -v web3 возвращает 5.6.0 | npm list web3 возвращает web3@1.0.0-beta.29
Доли wei не существуют, поэтому, если ваша цена на газ должна быть меньше 1 wei, у вас нет другого выбора, кроме как установить ее на 0 wei.
Происходит что-то очень странное, если это действительно код, который вы используете. Возможно, это ошибка в узле, к которому вы подключаетесь? Вы связаны с Гетом? Паритет? Инфура? ганаш? Что-то другое?
npm(К вашему сведению, вы используете версию 5.6.0 .)
Это означает, что адрес должен иметь минимум 130091 * 1000000000 Wei = 0,000130091 ETH для совершения транзакции, я прав? Также я подключен к инфуре
Нет, он должен иметь как минимум 130091 wei, что составляет 0,000000000000130091 эфира. (130091 / 130091 == 1)
Хорошо, спасибо большое, я схожу с ума от всех преобразований единиц измерения.
Я с подозрением отношусь к вашему коду, поскольку вставленный вами вывод не соответствует сообщениям журнала. Я повторюсь, что web3.eth.getBalanceдает вам баланс в Вэй. Если вы видите что-то другое, вам придется предоставить некоторые убедительные доказательства (например, минимальное воспроизведение, которое может запустить любой, указывающее на узел основной сети, который возвращает неправильный результат).
Я просто запустил его с математическим полом и получил следующий вывод: comp.st/i70w - код в пасте в основном является кодом, который я использую, я только что удалил console.logs, чтобы удалить шум, но это все
В это трудно поверить, учитывая, что код делает что-то странное, а строки console.logне совпадают с выводом.
Пожалуйста, просто бегиweb3.eth.getBalance('0x<your address here>').then(console.log);
И, пожалуйста, ответьте на мой вопрос, к какому узлу вы подключены.
Я же говорил выше, я в сети инфура. Также оказалось, что я отсталый, я забыл включить следующую строку в исходный код var balance = web3.utils.fromWei(result, 'ether');.
Извините, я как-то пропустил, что вы сказали, что были на Инфуре. Ах, эта строчка объясняет, как вы получили эфир вместо вей. Вот почему я настоял на том, чтобы увидеть настоящий код. :-) См. мое последнее редактирование, чтобы узнать, что я думаю о оставшейся проблеме.
Большое спасибо, это логично, но где указать количество токенов, которое я хочу перевести?
неважно, я только что понял, что идет в части данных
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .