¿Comentarios de la interfaz de usuario de dapp de transacciones pendientes/minadas usando Metamask?

Entonces, implementé un contrato inteligente y puedo interactuar con él a través de una interfaz de usuario web usando web3.eth.contract(abi).at(address)Metamask, hasta ahora todo bien.

Sin embargo, entre el envío de una transacción y su extracción, me gustaría mostrar un mensaje y, una vez que se haya extraído, otro.

Entiendo que web3.eth.getTransactionReceipt(txhash).blockNumber == ""hasta que se haya minado el tx. Pero, ¿cómo verifico esto hasta que, de hecho, se haya extraído usando javascript y el web3 inyectado de Metamask?

EDITAR: Estoy tratando de hacer que funcione con promesas, pero simplemente no puedo entender cómo implementarlo. Este es mi código que debe manejar un recibo de transacción a través de una promesa:

function approveFactoryContract(factory) {
  factoryAdress = $("#factory").val();
  RegistratContractInstance.approveFactoryContract(factoryAdress, false, {from: web3.eth.accounts[0]}, function(error, result){
           if(!error)
               console.log(result),
               $("#message").html("Approval request has been submitted - please wait a moment for it to be mined. You can check your transaction <a href=\"https://ropsten.etherscan.io/tx/"+result+"\" target=\"_blank\">here</a>");
           else
               console.error(error);
       });
}

¿Cómo hago que esto funcione?

Mostrar texto mientras está pendiente: espere a que se extraiga su transacción. Mostrar texto cuando se resuelva: Su transacción ha sido extraída.

Respuestas (1)

Hay más de una manera de hacer esto.

Esta biblioteca es útil. Le da una promesa para la transacción extraída, por lo que puede continuar después de saber que se extrajo, actualizar la interfaz de usuario, etc.

https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

En la práctica, descubrí que siempre configuro detectores de eventos para ver actualizaciones de cualquier persona y luego, si esa información tiene un impacto en la pantalla, actualizo los campos relevantes. Conduce a buenas actualizaciones dinámicas en las llamadas páginas web estáticas.

He observado que cuando ese tipo de cosas está en su lugar, no necesito preocuparme por las transacciones extraídas de este usuario porque ya estoy buscando actualizaciones de cualquier usuario. Si sucede algo que afecta un campo, mensaje, estilo, etc. en la pantalla, la devolución de llamada se ocupa de ello.

Aquí hay un requisito oculto. Cada cambio de estado importante que se desarrolle en el contrato disparará una emisión de eventos que describirá todo lo importante sobre el cambio de estado. Yo diría que es una mejor práctica hacer eso. Entre otros beneficios, tener eso en su lugar es ciertamente conveniente en la etapa de construcción de la interfaz de usuario.

Espero eso ayude.

Activar un controlador de eventos para cada evento suena bastante excesivo. Imagine esa "mejor práctica" para una página ICO con miles de TX. Dudaría en llamar a esto una mejor práctica general. En mi opinión, es por eso que tenemos filtros y temas para suscribirse selectivamente.
@ValidityLabs-Sebastián. No estoy en desacuerdo con usted, por lo que posiblemente haya expresado mal mi significado. Tratando de decir que los contratos deberían emitir un evento. Los clientes pueden escuchar selectivamente, pero tiene que haber algo que escuchar.