Enviar token personalizado ERC 20 preciso

Tengo un problema, no puedo enviar un token ERC 20 personalizado preciso a una dirección ether.

Aquí está mi detalle de token personalizado.

Saldo : 0.0000000000000000324 BucksTec

Decimales: 18

Envié 44 tokens a una dirección ether pero muestra 0.000000000000000068 tokens transferidos .

Mi pregunta es cómo puedo enviar tokens con precisión, necesito su mejor consejo y experiencia.

Algo de código:

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' });
    }

}

Gracias

Respuestas (1)

0x44es 68 en decimales. Además, su token tiene 18 decimales. Esto significa que para enviar una unidad de un token, debe enviar 1 * 10^18. Recuerde, no hay decimales en ethereum, y todo se maneja en las unidades más bajas posibles.

Intente enviar 1000000000000000000unidades (no 0xantes, eso lo convertirá a base 16, desea convertir el número a base 16 directamente, no solo antepuesto 0x) para enviar 1 token.

gracias, entonces, si quiero enviar 44 tokens, ¿necesito multiplicar algo como esto (44 * 100000000000000000) = 4400000000000000000;?
Sí, tendrías que multiplicar porn * 10^decimals
Cuando envié 4 monedas, funcionó, pero cuando intenté enviar 10 monedas, me mostró este error 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
Use una biblioteca bignum para JS
¿sabes cómo convertir 1.0E+19en entero, estoy usando php?echo (10 * pow(10, 18)); // 1.0E+19
Deberá usar cualquier biblioteca Bignum que tenga PHP, los números de ethereum a menudo pueden exceder los límites de tipo de datos en la mayoría de los idiomas
Hola, quiero aclarar un punto más sobre cómo mostrar tokens en formato decimal como 516.000000000000000344este se muestra en ropsten, pero cuando muestro estos tokens en mi página web 516000000000000000344, no muestran decimales aquí.
Haces lo contrario, divides por10^decimals
Ya lo hice y está funcionando ahora. Realmente aprecio tu respuesta que bueno eres (Y). Gracias.