Cómo convertir BigNumber devuelto por Truffle Console [duplicado]

Tengo un contrato simple Fooque se implementa en una red Ganache.

pragma solidity ^0.4.18;

contract Foo {
    uint storageData;

    function set(uint x) public {
        storageData = x;
    }

    function get() constant public returns (uint) {
        return storageData;
    }
}

Ahora, cuando quiero interactuar con él usando truffle console, primero establezco el valor

truffle(development)> Foo.at("0x4d4337B075a442cF3351Fa11c425C350cE2984F5").set(123)

Pregunta 1: Luego traté de recuperar ese valor, pero está devolviendo un archivo BignNumber. ¿Por qué no es un número entero?

truffle(development)> Foo.at("0x4d4337B075a442cF3351Fa11c425C350cE2984F5").get.call()
BigNumber { s: 1, e: 0, c: [ 123 ] }

Pregunta 2: ¿Cómo puedes convertirlo en un número entero o una cadena?

truffle(development)> Foo.at("0x4d4337B075a442cF3351Fa11c425C350cE2984F5").get.call().toNumber()
TypeError: Foo.at(...).get.call(...).toNumber is not a function

Lo intenté console.logdespués de un .toNumber, imprime el valor correcto 123, pero ¿por qué también imprime un undefined?

truffle(development)> Foo.at("0x4d4337B075a442cF3351Fa11c425C350cE2984F5").get.call().then(a => console.log(a.toNumber()))
123
undefined
función de uso toNumber():count = await app.getCount; count.toNumber()

Respuestas (1)

Algunos consejos:

  • tiene que hacer esto de forma asíncrona. Truffle hace que la función sea viable.
  • no necesita "llamar" explícitamente porque get() está marcado como constante.
  • una vez que tenga el BigNumber, puede convertirlo en algo útil. Recuerde que JavaScript no puede manejar números enteros de 256 bits, por lo que si necesita sumar/restar, etc., use siempre la biblioteca BigNumber y el valor original. Guarde este tipo de conversión para hacer representaciones legibles por humanos.

Intentar

var n;
var foo = Foo.at("0x4d4337B075a442cF3351Fa11c425C350cE2984F5");

foo.get().then(function(response) { 
  n = response.toString(10);
  console.log(n);
}

Solo lo esbocé para ilustrar, así que espero no haber fallado en la sintaxis.

Espero eso ayude.