Doble devolución de llamada al implementar un nuevo contrato inteligente con web3 y metamask

Así que este es el código en la API web3: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

Menciona que la function(err, myContract)devolución de llamada se disparará 2 veces

var myContractReturned = MyContract.new(param1, param2, {
   from:mySenderAddress,
   data:bytecode,
   gas:gasEstimate}, function(err, myContract){
    if(!err) {
       // NOTE: The callback will fire twice!
       // Once the contract has the transactionHash property set and once its deployed on an address.

   // e.g. check tx hash on the first call (transaction send)
   if(!myContract.address) {
       console.log(myContract.transactionHash) // The hash of the transaction, which deploys the contract
       $.post('/hash', {contractAddress: myContract.address, txHash:myContract.transactionHash}, function(success){
            if(success){

            }
       });

   // check address on the second call (contract deployed)
   } else {
       console.log(myContract.address) // the contract address
       $.post('/hash', {contractAddress: myContract.address, txHash:myContract.transactionHash}, function(success){
            if(success){

            }
       });
   }

   // Note that the returned "myContractReturned" === "myContract",
   // so the returned "myContractReturned" object will also get the address set.
 }
});

--Como nota, actualmente estoy probando esto a través de TestRPC, por lo que mi contrato se implementa y extrae muy rápidamente--

He agregado 2 solicitudes de publicación que envían datos a un servidor node.js en el código para replicar lo que estoy tratando de hacer con mi sitio web.

Este código funciona perfectamente bien si implementa el contrato y espera en la página web para que esta devolución de llamada ocurra 2 veces. Sin embargo, si implemento un contrato, luego dejo la página web actual, la segunda devolución de llamada nunca ocurre y la dirección del contrato nunca se recibe.

Entonces, mi pregunta es, si tuviera que poner mi aplicación en producción, donde podría tomar horas recuperar la dirección del contrato. ¿Nunca se llamará si el usuario cambia a una página web diferente o cierra el sitio?

Respuestas (1)

Hay una función llamada getTransactionReceipt que le permite ingresar el Txhash y obtener la dirección del contrato y un montón de otra información que solo está disponible después de que se haya extraído la transacción.

web3.eth.getTransactionReceipt(hashString [, callback]) 

Entonces, para responder a mi propia pregunta, puede llamar a esta función manualmente cuando finalmente se haya extraído el contrato inteligente.