Interaktion mit einem benutzerdefinierten Token-Vertrag

Ich habe anscheinend Probleme bei der Interaktion mit einem benutzerdefinierten Token-Vertrag. Ich verwende Trüffel und Ganache für meine Tests. Ich versuche, mit dem benutzerdefinierten Tokenvertrag zu interagieren, damit MyContract Token im Namen des benutzerdefinierten Tokenvertrags an eine Adresse übertragen kann. Ich habe auch das ABI.

benutzerdefinierter Token-Vertrag:

pragma solidity ^0.4.16;
import "./MintableToken.sol";
contract CustomToken is MintableToken {
  // Coin Properties
  string public name = "Custom Token";
  string public symbol = "Cust";
  uint256 public decimals = 18;
  function transfer(address _to, uint _value) public returns (bool) {
    return super.transfer(_to, _value);
  }
}

MeinVertrag:

pragma solidity ^0.4.4;

import "./CustomToken.sol";

contract MyContract is CustomToken{

    function transferCustom(address _to, uint _value) public returns (bool) {
        require(_to != address(0));


        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender,_to,_value);

        return true;
    }
}

Trüffeltest:

const accountfirst  = web3.eth.accounts[1];
const amount = 100;

let token = await CustomToken.deployed();
let myContract = await MyContract.deployed();

var ctoken = CustomToken.at(token.address);
ctoken.approve(myContract.address, amount);
let tx = await myContract.transferCustom(accountfirst, amount);

Wenn ich diesen Test durchführe, wird die Transaktion zurückgesetzt. Irgendwelche Ideen? Vielen Dank im Voraus!

Ich habe den Fehler eingegrenzt und er scheint aus dieser Zeile zu stammen: let tx = await myContract.transferCustom(accountfirst, amount);

Antworten (1)

Ich bin mir ziemlich sicher, dass das Problem darin besteht, eine Nulladresse an den Vertrag zu senden und dann require(_to != address(0));. Die Anforderung an die Vertragsfunktion ist gut, aber das Senden von null ist ein clientseitiges Problem.

Ich glaube nicht, dass dies (unten) synchron funktioniert, daher ist accountfirst null, wenn die Funktion aufgerufen wird, sodass die Transaktion zurückgesetzt wird.

const accountfirst  = web3.eth.accounts[1];

Versuchen Sie, das Konto asynchron abzurufen.

web3.eth.getAccounts()
.then(function(response) {
   account = response[0]);
   // carry on
}

oder

web3.eth.getAccounts(function(err,response) { 
  account = response[0];
  // carry on
}

Ich hoffe es hilft.