Detección de errores con problemas de gas

Estoy trabajando en la interfaz donde uso try / catch para encontrar errores y dar mensajes apropiados a los usuarios. Mi contrato inteligente tiene una función de pago y estaba a punto de detectar errores con respecto al uso de gas.

uint[] public theArray;




function myFunction(uint bigNumber) payable public {
         if(msg.value == 0.01 ether){
         theArray.push(bigNumber);}
else {if (msg.value == .05 ether){
            for (int i; i<50;i++)
            theArray.push(bigNumber);

        }
else { 
    revert();
}
}}

Ahora, cuando trato de detectar los errores, el mismo error puede tener dos 'salidas' diferentes (err.message). Los ejemplos:

Uso de MetaMask en la red de pruebas de Rinkeby

Si envío 0,05 ETH con 21.000 de gasolina o incluso 21.001 (cantidad mínima) el error que me sale es:

Error devuelto: Error: Error: [ethjs-rpc] error de rpc con carga útil

Sin embargo, si envío 0,05 ETH con 25 000 de gasolina (no hay suficiente gasolina, por lo que sigue fallando), el error que obtengo es:

La transacción ha sido revertida por el EVM

¿Alguien podría explicarme por qué si aumento la cantidad de gas, el error cambia?

Otra cosa que noté es que si envío una cantidad inválida como 0.04 también obtengo

La transacción ha sido revertida por el EVM

Respuestas (1)

Basado en mi observación y comprensión. Puede que no sea la mejor explicación que existe.

  1. Si envío 0,05 ETH con 21.000 de gasolina o incluso 21.001 (cantidad mínima) el error que me sale es:

    Error devuelto: Error: Error: [ethjs-rpc] error de rpc con carga útil

-Este error puede haber sido por la propia metamask, tal vez jugar con gasPrice y/o gasLimit. Puede consultar aquí o aquí para una mejor comprensión.


  1. Sin embargo, si envío 0,05 ETH con 25 000 de gasolina (no hay suficiente gasolina, por lo que sigue fallando), el error que obtengo es:

La transacción ha sido revertida por el EVM

¿Alguien podría explicarme por qué si aumento la cantidad de gas, el error cambia?

-Para este error, ejecuté el código y descubrí que la posible razón es que la transacción ocurre y continúa. Los parámetros satisfacen esta parte del código. Sin embargo, en medio del proceso, el gas se agotó mientras se ejecuta el bucle for, que consume la mayor parte del gas que ha proporcionado. Tal vez intente aumentar el límite de gas y esto se extraerá sin error.

if (msg.value == .05 ether){
        for (int i; i<50;i++)
        theArray.push(bigNumber);

    }

  1. Otra cosa que noté es que si envío una cantidad inválida como 0.04 también obtengo

La transacción ha sido revertida por el EVM

Con el último escenario, el parámetro simplemente no satisfizo ninguna de las condiciones, por eso va directamente al último else que lo revierte ().

Muchas gracias. ¡Estoy buscando ahora entender más sobre el primer error! En cuanto al segundo error, sé que si aumento el gas funcionará. Acabo de ver que da un error diferente al enviar 21000, así que tenía curiosidad por qué
Aquí igual. También me gustaría alguna respuesta con el primer error, pero según los enlaces que proporcioné, es muy probable que se deba a metamask, pero no estoy seguro de por qué exactamente.
Les envié un correo electrónico. Volveré con una actualización tan pronto como reciba una respuesta.