Remezcla: el gas requerido excede la asignación o siempre falla la transacción

Tengo un contrato que tiene la función transferFrom

    mapping(address => uint) balances;

    mapping(address => mapping(address => uint)) allowed;

    mapping (address => bool) public frozenAccount;

   // Transfer token from spender account to receiver account
    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
        require(!transactionLock);         // Check for transaction lock
        require(!frozenAccount[from]);     // Check if sender is frozen
        require(!frozenAccount[to]);       // Check if recipient is frozen
        balances[from] = balances[from].sub(tokens);
        allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
        balances[to] = balances[to].add(tokens);
        emit Transfer(from, to, tokens);
        return true;
    }

Cuando ejecuto esta función, obtengo un error:

Error de estimación de gas con el siguiente mensaje (ver más abajo). Es probable que la ejecución de la transacción falle. ¿Quieres forzar el envío?

el gas requerido excede la asignación o siempre falla la transacción

He leído muchas respuestas en StackOverflow. ninguna solucion me funciono

como se transactionLockdefine ¿Está configurado para false?
sí, está inicializado falseen el constructor

Respuestas (1)

Tal vez la cuenta fromno ha permitido que la tocuenta retire fondos. Recomiendo agregar algunas verificaciones adicionales:

  function transferFrom(
    address from,
    address to,
    uint256 tokens
  )
    public
    returns (bool)
  {
    require(!transactionLock);         // Check for transaction lock
    require(!frozenAccount[from]);     // Check if sender is frozen
    require(!frozenAccount[to]);       // Check if recipient is frozen

    require(tokens <= _balances[from]);
    require(tokens <= _allowed[from][msg.sender]);
    require(to != address(0));

    _balances[from] = _balances[from].sub(tokens);
    _balances[to] = _balances[to].add(tokens);
    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(tokens);
    emit Transfer(from, to, tokens);
    return true;
  }

Además, asegúrese de que la fromcuenta permita que la tocuenta retire el tokensmonto y debería funcionar

Estoy siguiendo este enlace para este contrato. theethereum.wiki/w/index.php/ERC20_Token_Standard
Cuando estoy ejecutando el mismo código con javascriptVM. me da este error The constructor should be payable if you send value.
la transferFrom()función que te di es la de openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… más tus modificaciones añadidas
¿Hay alguna restricción para elegir estos desde y hacia la dirección O puedo usar cualquier dirección? He enviado un token a la dirección de origen y la dirección a es una dirección nueva que no tiene token. cuando realizo la transacción me da este error.
puede usar cualquier dirección , pero antes de llamar al transferFrom(from, to, amount), también debe llamar a approve(to, amount), desde la dirección anterior .
¿Cómo puedo llamar al approve(to,amount)método desde fromla dirección? mi fromdirección es una dirección aleatoria que tomé de etherscan. Llamé al método de aprobación de remix ui e intenté hacer la transferencia. estoy recibiendo el mismo error
no puedes llamar approve()desde una dirección aleatoria. Tienes que llamarlo desde la dirección que tiene los tokens . Esa dirección tiene que estar bajo tu control (para poder firmar transacciones con ella).
No funciona :( Implementé el contrato usando la dirección de mi base de monedas. Envié un token a la dirección A. Ahora cambio la cuenta de mi base de monedas a A. Ahora primero llamé al método de aprobación en la dirección B para recibir 10 tokens. Luego llamé a transferFrom (Dirección de A, dirección de B, 10). Recibí la misma advertencia e hice una transacción. Obtuve hash. Pero no obtuve saldo en B.