Prueba de transferencia de tokens con trufa

Tengo un contrato de Token:

pragma solidity ^0.4.24;

import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract MyToken is StandardToken{

    string public name = "MyToken";
    string public symbol = "MYT";
    uint8 public decimals = 10;
    uint public INITIAL_SUPPLY = 100000000000000000;

    constructor() public {
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
    }

}

Y las siguientes pruebas:

pragma solidity ^0.4.0;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MyToken.sol";

contract TestMyToken{
    MyToken mytoken;

    constructor() public{
       mytoken  = MyToken(DeployedAddresses.MyToken());

    }

    // Testing the adopt() function
    function testTotalSupply() public {
      uint returned = mytoken.totalSupply();
      uint expected = 100000000000000000;
      Assert.equal(returned, expected, "Total Supply should be 100000000000000000.");
    }

    function testTransferFrom() public  {
        address _to = 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05;

        bool result = mytoken.transfer( _to, 1);
        Assert.isTrue(result, "Transfer should succeed.");
    }

}

Estoy usando trufa con Ganache. Cuando ejecuto las pruebas me sale:

    truffle test
Using network 'development'.

Compiling ./test/TestMyToken.sol...


  TestMyToken
    ✓ testTotalSupply (58ms)
    1) testTransferFrom
    > No events were emitted


  1 passing (3s)
  1 failing

  1) TestMyToken
       testTransferFrom:
     Error: Returned error: VM Exception while processing transaction: revert
      at Object.ErrorResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3-core-helpers/src/errors.js:29:1)
      at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3-core-requestmanager/src/index.js:140:1
      at /usr/local/lib/node_modules/truffle/build/webpack:/packages/truffle-provider/wrapper.js:101:1
      at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3-providers-http/src/index.js:79:1)
      at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request-event-target.js:34:1)
      at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:208:1)
      at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:318:1)
      at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:289:47)
      at endReadableNT (_stream_readable.js:1092:12)
      at process._tickCallback (internal/process/next_tick.js:63:19

La dirección:

address _to = 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05;

es una de las direcciones de prueba que proporciona Ganache al inicio.

Por lo que he leído, creo que eso "Error: Returned error: VM Exception while processing transaction: revert"indica que la dirección no es válida. ¿Está bien? ¿Es un problema con la dirección _to?

¿Cómo trabajo con las direcciones de prueba proporcionadas por Ganache en mis pruebas?

¿Cuál es la forma correcta de probar la transferencia de tokens MyToken (no ether) de una dirección a otra?

Actualizar:

Modifiqué MyToken para que sea Burnable. Luego agregué esta prueba:

function testBurn() public {
    mytoken.burn(1000);
    uint balance = mytoken.balanceOf(msg.sender);
    uint expected = 100000000000000000 - 1000;
    Assert.equal(balance, expected, "Balance should be reduced.");

}

Esa prueba también falla. Siento que me estoy perdiendo algo aquí. Las lecturas funcionan bien, pero si trato de modificar los datos, se está revirtiendo.

  1) TestMyToken
       testBurn:
     Error: Returned error: VM Exception while processing transaction: revert
      at Object.ErrorResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3-core-helpers/src/errors.js:29:1)
      at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3-core-requestmanager/src/index.js:140:1
      at /usr/local/lib/node_modules/truffle/build/webpack:/packages/truffle-provider/wrapper.js:101:1
      at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3-providers-http/src/index.js:79:1)
      at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request-event-target.js:34:1)
      at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:208:1)
      at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:318:1)
      at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2-cookies/dist/xml-http-request.js:289:47)
      at endReadableNT (_stream_readable.js:1092:12)
      at process._tickCallback (internal/process/next_tick.js:63:19)
cuando lo está implementando con ganache, la primera cuenta se usa para implementar. Si 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05 es la primera dirección, no se transferirá. .así que hágamelo saber después de cambiar la dirección a otra si puede ejecutar casos de prueba.
La cuenta 0 es 0x7D89759dA24D97B1497d5EB7260E33D30b24c040. Estoy usando la segunda cuenta (índice = 1) para transferir. 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05
¿Qué versión de trufa estás usando?
Trufa v5.0.0-beta.1
Actualicé la descripción con otra prueba. Parece que tampoco puedo quemar fichas. Cualquier lectura parece funcionar. Puedo probar balanceOf en msg.sender y pasa. Puedo probar balanceOf the 0x89... dirección y pasa. pero no puede transferir fichas ni quemar fichas,
Uso javascript para probar el contrato inteligente. No uso artefactos como "truffle/DeployedAddresses.sol". Puedo hacer un caso de prueba para usted. funcionará correctamente en eso. Y la versión de solidez que está utilizando es ^ 0.4.0, que es la anterior, cámbiela por la 0.4.24 que está utilizando en el contrato inteligente. Escribir casos de prueba no es la buena manera. y una cosa más que puede intentar es cambiar la versión de su truffle a una versión estable, use el comando "npm install truffle@4.1.4 -g". porque hay algunos problemas en los casos de prueba en la versión beta.
Se cambió a ^ 0.4.24, se instaló Truffle 4.1.4, se volvió a compilar y se implementó todo. Sigue recibiendo un error de reversión.

Respuestas (1)

El problema estaba en el constructor:

constructor() public{
   mytoken  = MyToken(DeployedAddresses.MyToken());

}

Debiera ser:

constructor() public{
   mytoken  = new MyToken();

}

Gracias a @dwarfu en ConsenSys gitter que encontró la solución.