Salida extraña de la migración de trufas --network live --dry-run

No puedo hacer que mi contrato se implemente correctamente con Infura, MetaMask y Truffle.

Cuando ejecuto truffle migrate --network liveme sale este error:

Error encountered, bailing. Network state unknown. Review successful transactions manually. insufficient funds for gas * price + value

Pero luego, si ejecuto truffle migrate --network live --dry-runobtengo este resultado:

sender doesn't have enough funds to send tx. The upfront cost is: 672197500000000000 and the sender's account only has: 60000000000000000

Suponiendo que el valor está en wei, ¿por qué costaría tanto implementar un contrato? ¿Qué puedo hacer sobre esto?

Aquí está mi truffle.jsarchivo:

var HDWalletProvider = require("truffle-hdwallet-provider");

var mnemonic = "my_mnemonic";

module.exports = {
  networks: {
    live: {
      network_id: 1,
      provider: new HDWalletProvider(mnemonic, "https://mainnet.infura.io/my_api_key")    
    }   
  }
};
¿También estás enviando éter en el momento de la implementación? Ayudaría si publicaras tu código.
@AdamKipnis No. Buen punto, publiqué el código de mi contrato.
@vipertherapper no está relacionado con su pregunta, pero a menos que lo use msg.valueen una función, no debe hacer esa función payable. Esa palabra clave significa que puede enviar ETH al contrato con la transacción, pero su returnEth, y feeno lo haga, solo adoptespera que se le envíe ETH
@Andrey gracias por señalarlo. Entonces, ¿debería eliminar payablede returnEthy fee? ¿Cuáles son las implicaciones de dejar la payablepalabra clave en esas funciones?
Las implicaciones son que alguien puede enviar eth al llamar a esas funciones, y que eth quedará atrapado en el contrato, ya que el contrato no tiene forma de devolverlo a la persona que llama o al propietario.
@AdamKipnis ¿Alguna idea de por qué esto requiere tanto eth para implementar?
Estoy empezando a pensar que es un mensaje de error engañoso y que la respuesta de Ismael es correcta (lo siento, Ismael). Pude reproducir el mismo problema en Rinkeby. Cuando la implementación falla, siempre usa el mismo valor para el costo inicial, aunque ese no sea su costo real si tiene éxito. Dado que solo tiene 0,06 eth en su cuenta, sus costos superan sus fondos (el gas de 3M a 20 Gwei es ~ 0,06 eth). Pruebe con un precio de gasolina realmente bajo (~2 Gwei) y vuelva a ejecutar. El mío puede tardar un poco, pero debería funcionar.
@AdamKipnis Lo intentaré. ¿Debo usar el mismo 4M para gas que sugirió Ismael?
Sí. Lo que no se use se te devolverá. Puede esperar que la implementación cueste aproximadamente 0,006 eth (o ~$5 USD).

Respuestas (1)

Puede usar remix.ethereum.org para probar su contrato y calcular el uso de gas. Para mí, usa aproximadamente 2M de gas cuando se implementa.

No especificó el límite de gas en su configuración, usará el valor predeterminado (era alrededor de 6,7 millones de gas). Puedes intentar bajarlo en tu truffle.js.

var HDWalletProvider = require("truffle-hdwallet-provider");

var mnemonic = "my_mnemonic";

module.exports = {
  networks: {
    live: {
      network_id: 1,
      provider: new HDWalletProvider(mnemonic, "https://mainnet.infura.io/my_api_key"),
      gas: "4000000",           // 4M
      gasPrice: "20000000000"   // 20gwei
    }   
  }
};
Pensé lo mismo, pero se arroja el mismo error (con el mismo costo) independientemente del gas/gasPrice establecido en truffle.js. Además, incluso con esos parámetros, el costo debería ser mucho menor (total <.03 eth @20 Gwei).
@AdamKipnis Tendría que estar de acuerdo contigo. Estoy perdido aquí. Estoy tratando de entender por qué sucede esto.