No se pudo almacenar el código de contrato, verifique su cantidad de gas. [Zeppelín, Truffle.js, Ropsten]

Tengo algunos problemas con la implementación del contrato de token simple en la red de Ropsten.

El error es "No se pudo almacenar el código del contrato, verifique la cantidad de gas".

Traté de cambiar los valores de Gas muchas veces en el archivo "Truffle.js", también parece que no tengo ninguna función abstracta en el archivo "TestToken.sol".

El software está actualizado. Pero todavía no puedo entender cuál es el problema, solo soy un principiante, así que por favor ayúdame, ¡te lo agradecería mucho!

// truffle.js
require('dotenv').config();
const HDWalletProvider = require("truffle-hdwallet-provider");
module.exports = {
  networks: {
development: {
  host: "localhost",
  port: 9545,
  gas: 6712390,
  network_id: "*"
},
ropsten: {
    provider: function() { 
      return new HDWalletProvider(process.env.MNENOMIC, "https://ropsten.infura.io/" + process.env.INFURA_API_KEY) },
    network_id: 3,
    gas: 4700000,
    },
  }
};

//TestToken.sol

pragma solidity ^0.4.24;


import "zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";


contract TestToken is ERC20Basic {
    using SafeMath for uint;
    string public name;
    string public symbol;
    uint8 public decimals;
    uint public _totalSupply;


    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;


    function TestToken() public {
        name = "TestToken";
        symbol = "tttest";
        decimals = 18;

        _totalSupply = 4000000000000000000000000000;
        balances[0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328] = _totalSupply;
        Transfer (address(0), 0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328, _totalSupply); 
     }
}
PS Número de puerto Primero usé 7545, en caso de que haya alguien que sugiera cambiar
¿Tiene un ID de transacción?
@RaghavSood ¿es este el correcto? 0xd2860dcb2466e064955a46f1f40e40c5e898f87dd6f33f2a94c0874fdd2842f7 0x3af00d91a4a4b8fb935dc40a667b96e344adbe172009d8a0b90adb786ce4eeae
2_deploy_contract.js es el siguiente: const TestToken = artefactos.require("./TestToken.sol"); módulo.exportaciones = function(implementador) { deployment.deploy(TestToken); };
El segundo parece haber implementado un contrato, pero no emitió un evento, por lo que puede que no sea el correcto.
@RaghavSood Acabo de ejecutar el comando de migración nuevamente, 0x3e2be8283ed37112c65cecf6bfb0e42ad8b835a04d2372765ef937859dc7037e
Parece que su tx está tratando de implementar un código vacío 0x, lo que implica que algo en la fuente de su contrato impide que se compile correctamente
@RaghavSood, ¿qué crees que lo impide? Adjunté mi archivo token.sol, ¿hay algo raro? ¿Dónde suele esconderse la causa?

Respuestas (2)

Su TestTokenhereda directamente de ERC20Basic. ERC20Basices un interface. Eso significa que TestTokentiene que implementar los métodos abstractos ERC20Basicdeclarados antes de que pueda implementarse.

El error que está recibiendo no apunta a este problema, que creo que es una falla, pero aparece cuando intenta implementar un contrato que no implementa todos los métodos abstractos.

Un consejo: en lugar de heredar de OpenZeppelin ERC20Basic, usa StandardToken. Implementa toda la funcionalidad necesaria para crear un token ERC-20

Documentos:

Prueba este contrato:

pragma solidity 0.4.24;

import "http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
import "http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";

contract TestToken is StandardToken {
    using SafeMath for uint;
    string public name;
    string public symbol;
    uint8 public decimals;
    uint public _totalSupply;


    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;


    constructor() public {

        name = "TestToken";
        symbol = "tttest";
        decimals = 18;
        _totalSupply = 4000000000000000000000000000;
        balances[0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328] = _totalSupply;
        emit Transfer (address(0), 0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328, _totalSupply); 
    }
}
Hola Henk, suena como una solución real, pero traté de cambiarla. import "zeppelin-solidity/contratos/token/ERC20/BasicToken.sol"; import "zeppelin-solidity/contratos/token/ERC20/ERC20.sol"; importar "zeppelin-solidity/contratos/math/SafeMath.sol"; contrato TestToken es ERC20, BasicToken {
Intenta implementar un token de prueba (0x0d0a79027660c068ab739450f9c301b720d7e60ecece055c69d09b4018f07bfb) y da el mismo error "Estado de la red desconocido. Revise las transacciones exitosas manualmente. Error: No se pudo almacenar el código del contrato, verifique la cantidad de gas".
Sí, pruébalo con StandardToken. BasicTokenimplementa ERC20Basic, StandardTokenimplementa ambos ERC20BasicyERC20
Ya cambié esas partes, sigo recibiendo el mismo error. Pero compila correctamente. Arriba te envié el código tx.
¿Ya encontraste la solución?

Este error generalmente es causado por problemas de gas (escenario menos típico) o problemas en el código.

¿Has intentado implementar en Ganache primero? Si no, intente eso. Si eso tiene éxito, lo más probable es que sea realmente un problema de gas.

Solía ​​tener el mismo problema por una eternidad, pero alguien sugirió agregar un número mágico para el límite de gas en truffle.js. Solía ​​tener 4000000 pero luego probé este número mágico y funcionó. No estoy seguro de si fue solo un problema de tiempo o si el número mágico realmente ayudó.

Este es mi aspecto de Ropsten (y ha funcionado):

ropsten:  {
         network_id: 3,
         host: "localhost",
         port:  8545,
         gas: 4867350,
         gasPrice: 10000000000 // 10 gwei
        },
Gracias compañero, desafortunadamente el número no es mágico para mí :(
Sí, intentaré implementar en Ganache, si no puedo encontrar ninguna respuesta. Mis códigos token.sol se comparten arriba, ¿puede detectar algún error o cosas extrañas que impidan que se implemente normalmente?