Testen der Übertragung von Token mit Trüffel

Ich habe einen Token-Vertrag:

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

}

Und die folgenden Tests:

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.");
    }

}

Ich verwende Trüffel mit Ganache. Wenn ich die Tests ausführe bekomme ich:

    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

Die Adresse:

address _to = 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05;

ist eine der Testadressen, die Ganache beim Start bereitstellt.

Nach dem, was ich gelesen habe, glaube ich, "Error: Returned error: VM Exception while processing transaction: revert"dass die Adresse nicht gültig ist. Ist das richtig? Ist es ein Problem mit der _to-Adresse?

Wie arbeite ich in meinen Tests mit den von Ganache bereitgestellten Testadressen?

Was ist der richtige Weg, um die Übertragung von MyToken-Token (nicht Ether) von einer Adresse zu einer anderen zu testen?

Aktualisieren:

Ich habe MyToken so modifiziert, dass es brennbar ist. Dann habe ich diesen Test hinzugefügt:

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

}

Auch dieser Test schlägt fehl. Ich habe das Gefühl, dass mir hier etwas fehlt. Liest funktioniert ok, aber wenn ich versuche, Daten zu ändern, wird es zurückgesetzt.

  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)
Wenn Sie es mit Ganache bereitstellen, wird das erste Konto für das Deployment verwendet. Wenn 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05 die erste Adresse ist, die nicht übertragen wird. Wie in der Übertragungsfunktion gibt es diese Anweisung require(_to != address(0)); .so lassen Sie mich wissen, nachdem Sie die Adresse in eine andere geändert haben, können Sie Testfälle ausführen.
Konto 0 ist 0x7D89759dA24D97B1497d5EB7260E33D30b24c040. Ich verwende das zweite Konto (Index=1) für die Überweisung. 0x89EAB984AbB3E7Cc0f847dc321fCD9B95a538f05
Welche Trüffel-Version verwendest du?
Trüffel v5.0.0-beta.1
Ich habe die Beschreibung mit einem anderen Test aktualisiert. Anscheinend kann ich auch keine Token verbrennen. Alle Lesevorgänge scheinen zu funktionieren. Ich kann balanceOf auf msg.sender testen und es besteht. Ich kann balanceOf die Adresse 0x89... testen und sie besteht. kann aber keine Token übertragen oder Token brennen,
Ich verwende Javascript zum Testen des Smart Contracts. Da ich keine Artefakte wie "truffle/DeployedAddresses.sol" verwende, kann ich einen Testfall für Sie erstellen. Darin wird es ordnungsgemäß funktionieren. Und die Solidity-Version, die Sie verwenden, ist ^ 0.4.0, die eine alte Änderung ist, wot 0.4.24 ist, die Sie im Smart Contract verwenden. Das Schreiben von Testfällen ist nicht der gute Weg. und eine weitere Sache, die Sie versuchen können, ist, Ihre Truffle-Version in eine stabile Version zu ändern, indem Sie den Befehl "npm install truffle@4.1.4 -g" verwenden, da es einige Probleme in den Testfällen in der Beta-Version gibt.
Auf ^0.4.24 geändert, Truffle 4.1.4 installiert, alles neu kompiliert und bereitgestellt. Bekomme immer noch einen Revert-Fehler.

Antworten (1)

Das Problem war mit dem Konstruktor:

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

}

Sollte sein:

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

}

Danke an @dwarfu drüben bei ConsenSys gitter, der die Lösung gefunden hat.