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)
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.
BENUTZERBILD
Markus Irvine
BENUTZERBILD
Markus Irvine
Markus Irvine
BENUTZERBILD
Markus Irvine