I have been working on error handling recently using the event emitter. If I call a function directly from a contract (using contract.methods.myMethod().send{from: Ganache supplied account}) with an input that violates a require statement, then the .error part of the event emitter is invoked. That works as I would expect.
However, if I call a function through a proxy contract with an input that violates a require statement, the .error part of the event emitter is not invoked. I would note that the ‘transactionHash’, 'receipt, and ‘confirmation’ events of the event emitter work when going through proxy contracts. However, I do receive a notification of an error through the console even though I do not have any console.log() statements in my code. See below:
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
OR
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)
I tried to encapsulate my function call in try catch blocks, but that didn’t do anything.
I believe that this issue is related to the differences between the Truffle contract instance and the web3.js contract object. I’ve put together some files that illustrate the issue on github. There are instructions in the readme file on how to get it running, how to run the functions, and what to look for. Hopefully, that’s enough to show you the problem I’m experiencing. If not, please let me know and I’ll clarify. If someone wouldn’t mind taking a look and letting me know what you think, that would be excellent.
The link to the github repository is https://github.com/cjd9s/ProxyErrorWeb3jsDemo.
I should mention that I found a post on here that might have been addressing the same issue. The link and quotes that caught my attention are below:
Handling require/assert failure errors correctly from a Node.JS app?
"The challenge is accessing this message further up the stack in Web3 and Node. In the meantime, you can use try and .catch() in promisified code such as a truffle contract abstraction."
In my case, .catch does work with the Truffle contract abstraction, but not with the web3.js object. Does this shed light on the problem?
Again, thanks so much for your time; I’ve very grateful. Cheers.
Sincerely, Craig