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...
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:
el feto
0xtuytuy
rexciro