La función de transferencia de token Metamask web3js ERC20 arroja un error cuando la cantidad es inferior a 1

Estoy trabajando en una Dapp que permite a los usuarios pagar con un token ERC20. Creé un token ERC20 estándar e implementé el contrato en un nodo testrpc con truffle, y pude obtener una instancia del contrato de token con truffle contract.

Puedo llamar a la función de transferencia de token con una cantidad mayor a 1, y después de firmar la transacción con metamask, todo funciona correctamente, obtengo el recibo de la transacción y se deduce el saldo del token.

tokenContract.deployed().then(async token => {
      token.transfer(toAddress, amount, {
        from: web3.eth.accounts[0],
        gas: 4612388
      });
    });

Sin embargo, cuando el parámetro de cantidad es menor que uno, aparece un error en la consola de Chrome:

errors.js:35 Uncaught (in promise) Error: Error: [ethjs-rpc] rpc error with payload {"id":7447005951567,"jsonrpc":"2.0","params":["0xf8b0178504a817c8008346612494e7194e2016d5454d5791d94d8a6aff6c1ead645780b844a9059cbb00000000000000000000000000d1ae0a6fc13b9ecdefa118b94cf95ac16d4ab000000000000000000000000000000000000000000000000000000000000000008602c0d0e327cba0a30d94d6e74e0e2f602c5fba9ea677f5d81d99e52acde754bbbe65b9dd295d9fa01e5d09addbdcd9f5cd311f06790406b69d92b162386789277bdde2de6d18cb13"],"method ":"eth_sendRawTransaction"} Error: Excepción de máquina virtual al procesar la transacción: revertir

Al principio pensé que no se pueden enviar flotantes a instancias de contratos de trufas porque la solidez no maneja los flotantes, pero llamar a la cantidad con 1.1funciona bien. También traté de convertir el flotante en un BigNumber estableciendo la cantidad en new BigNumber(0.1), y aún persiste el mismo error.

¿Me estoy perdiendo de algo? Ser capaz de enviar menos de 1 token parece ser un caso de uso muy típico.

Respuestas (1)

Solidity no admite números de punto flotante, por lo que cuando se trata de tokens, es por eso que tiene la variable de estado de decimales.

Cuando creó su token, es posible que haya especificado 18 decimales, que es el número más común, pero podría ser incluso 0 (en cuyo caso no serían divisibles).

Entonces, en realidad, una unidad de su token no sería "1", pero sería 1000000000000000000 o 1 * (10 ** 18).

Si quisiera transferir menos de 1 unidad de su token, transferiría 5 * (10 ** 17) -> Eso sería 0.5 (o la mitad) de un token.

Luego, en la parte delantera, tendría que saber cuántos decimales está usando el token y dividir el saldo del usuario entre los decimales, para obtener la cantidad correcta de tokens que tiene alguien.

Por ejemplo, si tengo un saldo de 2400000000000000000000 (240 * 10 ** 18) mi saldo real de fichas sería de 240 fichas.