Al crear un nuevo contrato, recibo el error "No se pudo almacenar el código del contrato", pero el contrato aún se crea

Sale.new({ from: state.account, value: value, gas: 4000000 }).then((instance) => {
  // do something with instance
}).catch((err) => {
  alert(err)
})

Cuando se ejecuta el código anterior, a veces recibo este error:The contract code couldn't be stored, please check your gas amount.

El contrato que estoy tratando de crear es casi exactamente el mismo que el contrato de pago remoto seguro en los documentos de Solidity con tal vez solo unas pocas líneas más.

Lo extraño es que el contrato en realidad se crea y puedo ver la transacción exitosa en MetaMask y el Ether se resta de mi cuenta. Incluso puedo usarlo Sale.at(<new contract address>)para interactuar con el contrato creado. He estado probando en la red Ropsten.

Respuestas (3)

Una cosa que no mencionaste aquí es que antes funcionaba bien, pero hace una semana dejó de funcionar.

Esto me hace pensar que es un error con MetaMask, y lamento que aún no lo hayamos resuelto: https://github.com/MetaMask/metamask-plugin/issues/1361

Esto se siente como uno de esos errores muy amplios. Lo encontré cuando agregué un argumento de función sin actualizar mi archivo ABI (mantengo las definiciones de función y las funciones en archivos separados); esto llevó a que la definición de la función fuera inconsistente con la implementación.

Espero que eso ayude a alguien.

Este fue mi problema con este mensaje de error. Había agregado una función al contrato abstracto, pero no al contrato implementado.

obtuviste el error después de la excepción lanzada en el constructor.

Creo que hay algo mal con este fragmento:

  function Purchase() payable {
        seller = msg.sender;
        value = msg.value / 2;
        if (2 * value != msg.value) throw;
    }

es probable que arroje una excepción while 2*value==msg.value.

¿Por qué es probable que se produzca una excepción? Y si esto arroja, ¿no debería revertirse la transacción? ¿Por qué se crea con éxito?
¿Cuál es el valor que envía en la transacción de creación?
El usuario escribirá algo como 0.1. Que luego se ejecuta web3.toWei(web3.toBigNumber(0.1).times(2), 'ether')Entonces, creo que el constructor debería poder dividir el valor enviado en partes iguales en 2 porque se multiplicó por 2 antes de enviarlo.