Отправить точный пользовательский токен ERC 20

У меня есть одна проблема: я не могу отправить точный пользовательский токен ERC 20 на эфирный адрес.

Вот мой пользовательский токен.

Баланс : 0.0000000000000000324

Десятичные: 18

Я отправил 44 токена на эфирный адрес, но он показывает 0.000000000000000068 Tokens Transfered .

Мой вопрос в том, как я могу отправить токены точно, пожалуйста, нужен ваш лучший совет и опыт.

Некоторый код:

var web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/xyz'));

module.exports.sendTokensTest = function(req, res){

    var toAddress = req.body.toAddress;
    var coins  = req.body.quantity;
    coins = "0x"+coins;
    var fromAddress  = req.body.fromAddress;
    var privateKey  = req.body.fromAddressPvtKey;

    try{

        var contractAddress = contractConfigTest.contractAddress;
        var contractAbi = contractConfigTest.abiArray;

        //res.send({contractAddress:contractAddress, contractAbi:contractAbi});

        var myContract = new web3.eth.Contract(contractAbi, contractAddress);

        myContract.options.from = fromAddress;

        var transactionObject = {
            from: fromAddress,
            to: contractAddress,
            value: '0x00', 
            data: myContract.methods.transfer(toAddress, coins).encodeABI(),
            chainId: 3
        };

        web3.eth.estimateGas(transactionObject, function(err1, estimateGas){
            transactionObject.gasLimit = estimateGas;

            if(err1){
                res.send({error:true, errorMsg:err1.message, errorFunction:'estimateGas' });
            }

            web3.eth.accounts.signTransaction(transactionObject, privateKey , function(err2, signed){

                if(err2){
                    res.send({error:true, errorMsg:err2.message, errorFunction:'signTransaction'});
                }

                web3.eth.sendSignedTransaction(signed.rawTransaction, function(err3, txHash){

                    if(err3){
                        res.send({error:true, errorMsg:err3.message, errorFunction:'sendSignedTransaction'});
                    }

                    res.send({txHash:txHash});
                });

            });

        });

    }catch(err){
        res.send({error:true, errorMsg:err.message, errorFunction:'sendTokens' });
    }

}

Спасибо

Ответы (1)

0x44составляет 68 в десятичных дробях. Более того, ваш токен имеет 18 знаков после запятой. Это означает, что для отправки одной единицы токена необходимо отправить 1 * 10^18. Помните, что в Эфириуме нет десятичных знаков, и все обрабатывается в наименьших возможных единицах.

Попробуйте отправить 1000000000000000000единицы (нет 0xперед этим, это преобразует его в базу 16, вы хотите преобразовать число в базу 16 напрямую, а не просто добавить 0x) для отправки 1 token.

спасибо, так что если я хочу отправить 44 токена, мне нужно умножить что-то вроде этого (44 * 100000000000000000) = 4400000000000000000;?
Да, вам нужно умножить наn * 10^decimals
Когда я отправил 4 монеты, это работает, но когда я попытался отправить 10 монет, мне отображается эта ошибка Error: [number-to-bn] while converting number "1.0E 19" to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported. Given value: "1.0E 19"echo (10 * pow(10, 18)); // 1.0E+19
Используйте библиотеку bignum для JS
Вы знаете, как преобразовать 1.0E+19в целое число, я использую phpecho (10 * pow(10, 18)); // 1.0E+19
Вам нужно будет использовать любые библиотеки Bignum, которые есть в PHP, числа ethereum часто могут превышать ограничения на типы данных для большинства языков.
Привет, я хочу прояснить еще один вопрос о том, как отображать токены в десятичной форме, как 516.000000000000000344это отображается на ropsten, но когда я показываю эти токены на своей веб-странице, они отображаются 516000000000000000344, здесь нет десятичного числа.
Делаешь наоборот, делишь на10^decimals
Я уже сделал это, и теперь это работает. Я очень ценю ваш ответ, насколько вы хороши (Y). Спасибо.