расширенный смарт-контракт краудсейла не развертывается в тестовой сети

Я пытаюсь развернуть следующий контракт краудсейла (расширенный от openzeppelin) в тестовой сети ropsten, используя IDE для ремикса.
Контракты компилируются, но выдают ошибки ( превышен лимит газа ), когда я пытаюсь развернуть.
Ошибки кажутся мне неоднозначными, так как я увеличил цену на газ и лимит, но все еще имею ту же проблему.

код приведен ниже:

pragma solidity ^0.4.23;

import "../node_modules/zeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol";
import "../node_modules/zeppelin-solidity/contracts/crowdsale/distribution/RefundableCrowdsale.sol";
import "../node_modules/zeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol";

contract SaleContract is CappedCrowdsale, RefundableCrowdsale, MintedCrowdsale {
  // solium-disable operator-whitespace

  event refund(string why, address beneficiary);
  event sentExternalTokens(uint256 amount);

  uint8 public constant decimals = 18;

  uint256 public presaleStarts;
  uint256 public crowdsaleStartTime;
  uint256 public presaleRate;
  uint256 public crowdsaleRate;
  uint256 public presaleRaised;
  uint256 public externalTokensSent;

  uint256 public constant maxTokens       = 6000000 * 10 ** uint256(decimals);
  uint256 public constant totalSaleTokens = 5000000 * 10 ** uint256(decimals);
  uint256 public constant presaleTokens   = 2000000 * 10 ** uint256(decimals);

  uint256 public reservedTokens  = 1000000 * 10 ** uint256(decimals);


  /**
   * @dev vary rate according to block time.
   */
  modifier rateMod {
    // solium-disable-next-line security/no-block-members
    if (block.timestamp >= crowdsaleStartTime) rate = crowdsaleRate;
    else rate = presaleRate;
    _;
  }


  /**
   * @dev prevent purchase when limit exceeded.
   */
  modifier limitCheck {    
    uint256 tokensTomint   = msg.value.mul(rate);
    uint256 totalAfterMint = token.totalSupply() + tokensTomint;

    // solium-disable-next-line security/no-block-members
    if ((block.timestamp < crowdsaleStartTime) && (totalAfterMint > presaleTokens)) {
      msg.sender.transfer(msg.value); // Refund them
      emit refund("presale limit hit, refunding ", msg.sender);
      return;
    }
    _;
  }


  constructor(    
      uint256 _openingTime,
      uint256 _crowdsaleStartTime,
      uint256 _closingTime,
      uint256 _presaleRate,
      uint256 _crowdsaleRate,
      uint256 _goal,
      uint256 _cap,
      MintableToken _token,
      address _wallet
    )
    public
    Crowdsale(_presaleRate, _wallet, _token)
    CappedCrowdsale(_cap)
    TimedCrowdsale(_openingTime, _closingTime)
    RefundableCrowdsale(_goal)
  {
    require(_openingTime < _crowdsaleStartTime);
    require(_goal <= _cap);

    crowdsaleStartTime = _crowdsaleStartTime;

    presaleRate     = _presaleRate;
    crowdsaleRate   = _crowdsaleRate;        
  }


  /**
   * @dev Extend parent behavior requiring purchase to consider emission rate based on ~time.
   * @param _beneficiary Token purchaser
   * @param _weiAmount Amount of wei contributed
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
    rateMod           // **set appropriate rate**  
    limitCheck        // **verify limits**   
  {
    super._preValidatePurchase(_beneficiary, _weiAmount);
  }


  /**
   * @dev update state variables
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _updatePurchasingState(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // solium-disable-next-line security/no-block-members
    if (block.timestamp < crowdsaleStartTime) {
      presaleRaised = presaleRaised.add(msg.value);
    }

    super._updatePurchasingState(_beneficiary, _weiAmount);
  }

  function sendExternalTokens(address[] recipients, uint amount) onlyOwner public {
    require(amount > 0);

    uint256 totalToTransfer = recipients.length.mul(amount);

    require((token.totalSupply() + totalToTransfer) < maxTokens);

    for (uint256 i = 0; i < recipients.length; i++) {
      _deliverTokens(recipients[i], amount);
    }

    externalTokensSent = externalTokensSent.add(totalToTransfer);
    emit sentExternalTokens(totalToTransfer);  
  }


  function finalize(address _reserveWallet) onlyOwner public {
    require(!isFinalized);

    uint256 existingTokens = token.totalSupply();
    require(existingTokens < maxTokens);

    uint256 unsoldTokens = totalSaleTokens - existingTokens;

    if (unsoldTokens > 0) {
      reservedTokens = reservedTokens + unsoldTokens;
    }

    _deliverTokens(_reserveWallet, reservedTokens);

    super.finalize();
  }
}
какие ошибки вылетают?
@BadrBellaj, лимит газа превышен , ошибки кажутся мне неоднозначными, так как я увеличил цену и лимит газа, но все еще имею ту же проблему
Какие параметры вы используете при развертывании?

Ответы (2)

Мне удалось развернуться в Rinkeby Network. Поэтому я представлю свой способ.

  1. Скомпилируйте код и разверните MintableToken на Rinke с помощью Remix.
  2. Получите адрес токена Mintable, разверните SaleContract с известным адресом токена Mintable в Rinkeby.
  3. Возможны проблемы с вашими параметрами. Мои параметры для инициализации следующим образом1541902893,1551902893,1571902893,3,4,5,6,"0xd40e809eefe17efca14aa4604de7f8599cdf8871","0xca35b7d915458ef540ade6068dfe2f44e8fa733c"

Rinkeby (Mintable): https://rinkeby.etherscan.io/address/0xd40e809eefe17efca14aa4604de7f8599cdf8871 Rinkeby (SaleContract): https://rinkeby.etherscan.io/address/0xf959a499a514f80f07d4e6f26517aefca4da8ca

PS : я импортировал библиотеки open-zeppelin из github, и это предлагается на этапе разработки. import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol"; import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/crowdsale/distribution/RefundableCrowdsale.sol"; import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol";

Я не уверен, что Remix ведет себя так же, но для меня при попытке развернуть контракт с Truffle эти ошибки газа обычно вызваны ошибками в коде. Ошибки передаются компилятору, но возникают при попытке развертывания.

Некоторые из таких ошибок связаны с наследованием контрактов (например, отсутствие вызова конструктора из субконтракта).

Я предлагаю вам удалить фрагменты кода, пока вы не выясните причину проблемы. В вашем коде нет ничего сложного, поэтому это не должно быть реальной проблемой газа (если вы просто установите приличный лимит газа).