Interactuar con un contrato de token personalizado

Parece que tengo problemas para interactuar con un contrato de token personalizado. Estoy usando trufa y ganache para mis pruebas. Estoy tratando de interactuar con el contrato de token personalizado para que MyContract pueda transferir tokens a una dirección en nombre del contrato de token personalizado. Yo también tengo el ABI.

contrato de token personalizado:

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

Mi contrato:

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

prueba de trufa:

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

Cuando ejecuto esta prueba, obtengo la transacción revertida. ¿Algunas ideas? ¡gracias de antemano!

Reduje el error y parece provenir de esta línea: let tx = await myContract.transferCustom(cuentaprimero, monto);

Respuestas (1)

Estoy bastante seguro de que el problema es enviar una dirección nula al contrato y luego require(_to != address(0));. El requisito de la función del contrato es bueno, pero el envío nulo es un problema del lado del cliente.

No creo que esto (a continuación) funcione sincrónicamente, por lo que accountfirst es nulo cuando se invoca la función, por lo que la transacción se revierte.

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

Intente obtener la cuenta de forma asíncrona.

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

o

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

Espero eso ayude.