Estoy trabajando en un proyecto para interactuar con un contrato inteligente en ethereum. Todo funcionaba bien, las transacciones funcionaban correctamente y así sucesivamente... pero me di cuenta de que cuando traté de ejecutar un código después de una función de espera específica, ese código nunca se ejecutó y realmente no sé por qué. Otros métodos de contrato que invoqué funcionan bien y el código se ejecuta normalmente.
El código:
onSubmit = async (event) => { event.preventDefault() console.log("Submitting the form...") var day = new Date(Date.now()).getDate() var month = new Date(Date.now()).getMonth() + 1 var year = new Date(Date.now()).getFullYear() var today = new Date(year, month -1, 1) var todayTime = today.getTime() const ipfsadded = await ipfs.add({path:this.state.fileName, content:this.state.buffer}) var ipfsHash = ipfsadded.cid.toString() this.setState({ipfsHash: ipfsHash}) console.log('hash:', ipfsHash, " / name =", this.state.fileName ) console.log("inserindo na blockchain..") const accounts = await web3.eth.getAccounts() //ERROR HERE!! //THIS FUNCTION IS EXECUTED, THE TRANSACTION IS CONFIRMED IN METAMASK BUT AFTER THAT NOTHING HAPPENS var result = await contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime).send({from:accounts[0], gas:300000}); console.log("resultado =", result) //IS NEVER EXECUTED EVEN WITH TRANSACTION OK console.log("File submitted on blockchain!") //IS NEVER EXECUTED }Es probable que se deba a que la transacción no se extrajo en 750 segundos y .send arrojó un error, pero no se detectó. Puede probar esto envolviéndolo con un bloque try/catch e inspeccionar el error.
try { var result = await contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime).send({from:accounts[0], gas:300000}); } catch(err) { console.error(err); } Una mejor manera es suscribirse a un evento de receipt , transactionHash o confirmation , que se expone mediante el send .
contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime) .send({from:accounts[0], gas:300000}) .on('transactionHash', resolve) .on('error', reject);en tu caso seria
onSubmit = async (event) => { event.preventDefault() console.log("Submitting the form...") var day = new Date(Date.now()).getDate() var month = new Date(Date.now()).getMonth() + 1 var year = new Date(Date.now()).getFullYear() var today = new Date(year, month -1, 1) var todayTime = today.getTime() const ipfsadded = await ipfs.add({path:this.state.fileName, content:this.state.buffer}) var ipfsHash = ipfsadded.cid.toString() this.setState({ipfsHash: ipfsHash}) console.log('hash:', ipfsHash, " / name =", this.state.fileName ) console.log("inserindo na blockchain..") const accounts = await web3.eth.getAccounts() //ERROR HERE!! //THIS FUNCTION IS EXECUTED, THE TRANSACTION IS CONFIRMED IN METAMASK BUT AFTER THAT NOTHING HAPPENS const promise = new Promise() contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime) .send({from:accounts[0], gas:300000}) .on('receipt', (receipt) => { console.log('this should be executed now') console.log("resultado =", receipt) console.log("File submitted on blockchain!") }) .on('error', console.error) }Cualquiera de estas respuestas https://ethereum.stackexchange.com/a/58936/6814 y https://ethereum.stackexchange.com/a/59114/6814 son correctas.