Создал контракт Crowdsales, отправил ropsten ETH на контракт и потерпел неудачу

Я создал контракт на краудсейл - https://ropsten.etherscan.io/address/0xfbb2759ef0b7169d0a2effa971845ea0f99f87b1

Мой токен - https://ropsten.etherscan.io/token/0x0f26c1c05f1bbBC7Eff0488F1a98619e8a9758cf

Я отправил myToken в созданный контракт, чтобы заполнить его некоторыми токенами.

Затем я отправляю ETH с другой учетной записи, чтобы получить мои токены на эту учетную запись, но возникает ошибка - https://ropsten.etherscan.io/tx/0x9468576385ba10bdac5dc9da7d260c68c8c654a5b06885aa20b38e2799473351

Помогите понять почему???

Вот контракт краудсейла: Вот мой zeppelinSales.sol:

pragma solidity ^0.4.24;
import "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";
import "zeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";


/**
 * @title Crowdsale
 * @dev Crowdsale is a base contract for managing a token crowdsale,
 * allowing investors to purchase tokens with ether. This contract     implements
 * such functionality in its most fundamental form and can be extended to provide additional
 * functionality and/or custom behavior.
 * The external interface represents the basic interface for purchasing tokens, and conform
 * the base architecture for crowdsales. They are *not* intended to be modified / overridden.
 * The internal interface conforms the extensible and modifiable surface of crowdsales. Override
 * the methods to add functionality. Consider using 'super' where appropriate to concatenate
 * behavior.
 */
contract zeppelinSales {
  using SafeMath for uint256;
  using SafeERC20 for ERC20;

  // The token being sold
  ERC20 public token;

  // Address where funds are collected
  address public wallet;

  // How many token units a buyer gets per wei.
  // The rate is the conversion between wei and the smallest and indivisible token unit.
  // So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
  // 1 wei will give you 1 unit, or 0.001 TOK.
  uint256 public rate;

  // Amount of wei raised
  uint256 public weiRaised;

  /**
   * Event for token purchase logging
   * @param purchaser who paid for the tokens
   * @param beneficiary who got the tokens
   * @param value weis paid for purchase
   * @param amount amount of tokens purchased
   */
  event TokenPurchase(
    address indexed purchaser,
        address indexed beneficiary,
    uint256 value,
    uint256 amount
  );

  /**
   * @param _rate Number of token units a buyer gets per wei
   * @param _wallet Address where collected funds will be forwarded to
   * @param _token Address of the token being sold
   */
  constructor(uint256 _rate, address _wallet, ERC20 _token) public {
    require(_rate > 0);
    require(_wallet != address(0));
    require(_token != address(0));

    rate = 8 * (10**8);
    wallet = 0xF76075Cf3B674fB9656E393e9e17091B01243666;
    token = ERC20(0x0f26c1c05f1bbBC7Eff0488F1a98619e8a9758cf);
  }

  // -----------------------------------------
  // Crowdsale external interface
  // -----------------------------------------

  /**
   * @dev fallback function ***DO NOT OVERRIDE***
   */
  function () external payable {
    buyTokens(msg.sender);
  }

  /**
   * @dev low level token purchase ***DO NOT OVERRIDE***
   * @param _beneficiary Address performing the token purchase
   */
  function buyTokens(address _beneficiary) public payable {

    uint256 weiAmount = msg.value;
    _preValidatePurchase(_beneficiary, weiAmount);

    // calculate token amount to be created
    uint256 tokens = _getTokenAmount(weiAmount);

    // update state
    weiRaised = weiRaised.add(weiAmount);

    _processPurchase(_beneficiary, tokens);
    emit TokenPurchase(
      msg.sender,
      _beneficiary,
      weiAmount,
      tokens
    );

    _updatePurchasingState(_beneficiary, weiAmount);

    _forwardFunds();
    _postValidatePurchase(_beneficiary, weiAmount);
  }

  // -----------------------------------------
  // Internal interface (extensible)
  // -----------------------------------------

  /**
   * @dev Validation of an incoming purchase. Use require statements to     revert state when conditions are not met. Use `super` in contracts that     inherit from Crowdsale to extend their validations.
   * Example from CappedCrowdsale.sol's _preValidatePurchase method: 
   *   super._preValidatePurchase(_beneficiary, _weiAmount);
   *   require(weiRaised.add(_weiAmount) <= cap);
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    require(_beneficiary != address(0));
    require(_weiAmount != 0);
  }

  /**
   * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met.
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _postValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens.
   * @param _beneficiary Address performing the token purchase
   * @param _tokenAmount Number of tokens to be emitted
   */
  function _deliverTokens(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    token.safeTransfer(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
   * @param _beneficiary Address receiving the tokens
   * @param _tokenAmount Number of tokens to be purchased
   */
  function _processPurchase(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    _deliverTokens(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.)
   * @param _beneficiary Address receiving the tokens
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _updatePurchasingState(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Override to extend the way in which ether is converted to tokens.
   * @param _weiAmount Value in wei to be converted into tokens
   * @return Number of tokens that can be purchased with the specified _weiAmount
   */
  function _getTokenAmount(uint256 _weiAmount)
    internal view returns (uint256)
  {
    return _weiAmount.mul(rate);
  }

  /**
   * @dev Determines how ETH is stored/forwarded on purchases.
   */
  function _forwardFunds() internal {
    wallet.transfer(msg.value);
  }
}

Token.sol

    pragma solidity ^0.4.24;
    import "openzeppelin-                        solidity/contracts/token/ERC20/StandardToken.sol";
    contract TestToken is StandardToken {
    string public name = "TMED Token";
    string public symbol = "TMED1";
    uint8 public decimals = 18;
    uint public INITIAL_SUPPLY = 4000000000000000000000000000;
    constructor() public {
      totalSupply_ = INITIAL_SUPPLY;
      balances[msg.sender] = INITIAL_SUPPLY;
    }
    }
Вы можете отредактировать сообщение, чтобы предоставить код смарт-контракта вашего токена?
И в вашем коде все еще есть опечатка, дубликат tokenвtoken = token = ERC20(0x0f26c1c05f1bbBC7Eff0488F1a98619e8a9758cf);
@HaĐANG Я только что добавил токен-контракт, пожалуйста, проверьте
ах, вы расширяетесь от StandardToken, тогда нет проблем, я думаю
Газ, используемый для всех транзакций, один и тот же 21046, и он немного превышает минимальную комиссию за транзакцию. Я предполагаю, что ошибка возникла очень рано в вашей резервной функции. Можете ли вы проверить исходный код ваших контрактов в etherscan?
Комментируйте requireутверждения, пока не выясните, какое из них вызывает проблему. Я предполагаю, что передача токена (может быть, недостаточно баланса?)
@LauriPeltonen пытался, та же ошибка
Для вас практически невозможно продолжать получать ошибку, если вы закомментируете все места, которые могут вернуться, то есть все requireоператоры. Так что я не думаю, что вы достаточно тщательно пытались
@LauriPeltonen не знаю, но я удалил все обязательные и предварительные коды в исходном коде. ropsten.etherscan.io/tx/… все еще ошибка....
Согласен с @LauriPeltonen; попробуйте много способов, но tnx по-прежнему не работает; нам нужно знать, какой именно исходный код в развернутом смарт-контракте, проверив на etherscan

Ответы (1)

При ставке = 8 * (10 ** 8) ака 800,000,000токен для 1ETH, тогда ваш адрес контракта краудсейла не имеет достаточного баланса токена для отправки, ваш баланс токена адреса контракта краудсейла просто100,000,000

Тогда, я думаю, вы должны сначала финансировать токен для своего контракта на краудсейл! Или просто попробуйте отправить на контракт небольшие ETH.

Дополнительно: fallback()функция будет иметь очень низкий лимит газа по умолчанию, поэтому при отправке ETH в смарт-контракт краудсейла попробуйте увеличить лимит газа до максимального значения в MEW, чтобы обеспечить достаточное количество газа для успешного проведения tnx.

Ха Данг, я пытался отправить небольшое количество ETH, та же проблема, проверьте транзакцию, пожалуйста - ropsten.etherscan.io/tx/…
помогите мне ребята! пожалуйста
Извините, я понятия не имею в данный момент; Вы исправили это в смарт-контракте краудсейла?token = token = ERC20(0x0f26c1c05f1bbBC7Eff0488F1a98619e8a9758cf);
это был тип в этом разделе комментариев, но с моим исходным кодом все в порядке, я отредактирую его здесь
Пожалуйста, попробуйте отправить 0.01ETH на краудсейл-контракт, чтобы посмотреть, что произойдет. Я боюсь, что 0,00005 ETH слишком малы, и баланса недостаточно для оплаты комиссии tnx.
Та же история - ropsten.etherscan.io/tx/…
но я могу отправить MyTokens без проблем, просто перевел 700 миллионов на адрес контракта - ropsten.etherscan.io/tx/…
да, отправка токена без проблем, потому что он не переходит к резервной функции контракта краудсейла
Можете ли вы опубликовать свой код контракта массовой продажи и проверить на ropsten, тогда все смогут подтвердить, что ваш фактический код контракта работает на ropsten.etherscan.io/…
кажется пустой тратой времени
Я добавляю некоторые дополнения к моему ответу, пожалуйста, посмотрите и попробуйте сделать
пробовал, не помогло