Manejo de errores de contrato de proxy web3.js

He estado trabajando en el manejo de errores recientemente usando el emisor de eventos. Si llamo a una función directamente desde un contrato (usando contract.methods.myMethod().send{from: Ganache added account}) con una entrada que viola una instrucción require, entonces se invoca la parte .error del emisor de eventos. Eso funciona como esperaba.

Sin embargo, si llamo a una función a través de un contrato de proxy con una entrada que viola una declaración requerida, la parte .error del emisor de eventos no se invoca. Me gustaría señalar que los eventos 'transactionHash', 'receipt y 'confirmation' del emisor de eventos funcionan cuando se realizan contratos de proxy. Sin embargo, recibo una notificación de un error a través de la consola aunque no tengo ninguna declaración de console.log() en mi código. Vea abajo:

web3.min.js:20 Uncaught (in promise) Error: Returned error: VM Exception while processing transaction: revert Number of offices can't be less than one
    at Object.ErrorResponse (web3.min.js:20)
    at Object.callback (web3.min.js:20)
    at web3.min.js:30
    at Array.forEach (<anonymous>)
    at s._onMessage (web3.min.js:30)
ErrorResponse @ web3.min.js:20
(anonymous) @ web3.min.js:20
(anonymous) @ web3.min.js:30
s._onMessage @ web3.min.js:30
async function (async)
initializeElectionProxy @ playing.js:743
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3

O

Uncaught (in promise) Error: Returned error: VM Exception while processing transaction: revert Number of offices can't be less than one
    at Object.ErrorResponse (errors.js:28)
    at Object.callback (index.js:303)
    at index.js:114
    at Array.forEach (<anonymous>)
    at s._onMessage (index.js:102)

Traté de encapsular mi llamada de función en bloques try catch, pero eso no hizo nada.

Creo que este problema está relacionado con las diferencias entre la instancia del contrato Truffle y el objeto del contrato web3.js. He reunido algunos archivos que ilustran el problema en github. Hay instrucciones en el archivo Léame sobre cómo hacerlo funcionar, cómo ejecutar las funciones y qué buscar. Con suerte, eso es suficiente para mostrarle el problema que estoy experimentando. Si no, por favor hágamelo saber y lo aclararé. Si a alguien no le importaría echar un vistazo y decirme lo que piensa, sería excelente.

El enlace al repositorio de github es https://github.com/cjd9s/ProxyErrorWeb3jsDemo .

Debo mencionar que encontré una publicación aquí que podría haber abordado el mismo problema. El enlace y las citas que me llamaron la atención están a continuación:

¿Manejar correctamente los errores de falla de solicitud/afirmación desde una aplicación Node.JS?

"El desafío es acceder a este mensaje más arriba en la pila en Web3 y Node. Mientras tanto, puede usar try y .catch() en código prometido, como una abstracción de contrato de trufa".

En mi caso, .catch funciona con la abstracción del contrato Truffle, pero no con el objeto web3.js. ¿Esto arroja luz sobre el problema?

Nuevamente, muchas gracias por su tiempo; Estoy muy agradecido. Salud.

Atentamente, Craig

Respuestas (1)

Me avergüenza informar que encontré mi problema. No tenía nada que ver con la abstracción del contrato Truffle o el objeto del contrato web3.js. El problema estaba en la función estimarGas de web3.js. Esta función no solo le brinda una estimación de gas, sino que simula la transacción y, por lo tanto, arroja cualquier error que arrojaría la llamada a la función cuando se usa con ira. Entonces, cuando estimó una llamada de función que violó una declaración requerida para el contrato, arrojó el error de reversión apropiado.

En el siguiente enlace se da una breve explicación. https://medium.com/@suyashsumaroo/go-ethereum-errores-y-soluciones-854c172ebfcb

De todos modos, le agradezco que me escuche y me disculpo por hacerle perder el tiempo. Salud.