Remix -> Llamada de función: El gas requerido excede el límite

Sigo recibiendo un "límite de exceso de gas" en una función simple que intenta transferir tokens ERC20 de una billetera a otra. Mi primera pregunta es ¿cuál es la forma más eficiente de depurar ese error? En segundo lugar, ¿alguien ve algo malo en mi función tal como está?

Aquí está el error:

Transact to browser/SmartLoan.sol:Loan.sendFunds errored: Gas required exceeds limit: 3000000.  An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). 

Y aquí está la función que falla cuando se llama:

    function sendFunds(address dest, uint amount) public {
        if(totalPayments < loanStatics.totalAmount){

            address addressToken = 0xfef45491b96af14c98b81325cbb7a3fbb83bb7a0;
            abstractToken Token = abstractToken(addressToken);
            Token.transferFrom(msg.sender, dest, amount);

            totalPayments = totalPayments.add(amount);
            payments[msg.sender] = payments[msg.sender].add(amount);
            company = dest;
        }

        if(totalPayments == loanStatics.totalAmount){
            status = Status.funded;
        } else {
            status = Status.partially_funded;
        }
        LoanFunded(status, amount);
    }

Así es como creo el resumen del contrato:

contract abstractToken {
   function transferFrom(address _from, address _to, uint256 _value) public returns (bool);
}

ACTUALIZAR

Aquí hay una pantalla de impresión de la consola, parece que mi transacción ni siquiera se crea, o al menos no sé cómo obtener el hash y, por lo tanto, no estoy seguro de cómo depurarla...

ingrese la descripción de la imagen aquí

¿Funciona si solo aumentas el límite de gas? Intente agregar un cero al final de ese número y avísenos si funciona (algunos de mis grandes contratos tienen ese problema en las primeras etapas).
Lo intenté, todavía no funciona. Recibo exactamente el mismo mensaje, por lo tanto, sospecho que hay un error en mi contrato en alguna parte. Pero no estoy seguro de cómo depurar.
¿Has resuelto este problema?

Respuestas (2)

Tendría que publicar un poco más de su código (el material actual no se compila) o mi estrategia habitual es solo comentar varias líneas y luego puede reducirlo. Pero supongo que es cuando llamas al contrato abstractToken. Prueba este:

abstractToken Token;

function sendFunds(address dest, uint amount) public {
    if(totalPayments < loanStatics.totalAmount){

        address addressToken = 0xfef45491b96af14c98b81325cbb7a3fbb83bb7a0;
        Token = abstractToken(addressToken);
        Token.transferFrom(msg.sender, dest, amount);

        totalPayments = totalPayments.add(amount);
        payments[msg.sender] = payments[msg.sender].add(amount);
        company = dest;
    }

    if(totalPayments == loanStatics.totalAmount){
        status = Status.funded;
    } else {
        status = Status.partially_funded;
    }
    LoanFunded(status, amount);
}

Para su primera pregunta, la forma más fácil de probar esto sería en Remix. Si lo depura allí, puede revisar cada paso y ver cuánto gas queda.

Ahora, el problema aquí en realidad no parece tener que ver con el agotamiento del gas, ya que no está haciendo ningún bucle ni cálculo intensivo.

Lo depuraría en Remix para ver dónde se detiene realmente. Algunas cosas para comprobar:

  • ¿Estás seguro de que el token de dirección es correcto? ¿Hay un token ERC20 implementado en esa dirección en la red que está utilizando actualmente?
  • Antes de realizar TransferFrom, deberá llamar a apply() en el token para establecer una asignación para msg.sender. ¿Has hecho esto?
El token de dirección está bien, me olvidé de aprobar, lo intenté y sigo teniendo el mismo error. También intenté llamar a la función transferFrom "manualmente" desde la remezcla, y tengo el mismo problema. Estoy realmente confundido sobre cómo lidiar con esto.
Acerca de la depuración, parece que solo puede depurar una transacción, pero no se crea ninguna transacción. Ni siquiera llega a ese punto. Actualicé mi publicación con una pantalla de impresión