Токен не найден на Etherscan после развертывания Crowdsale

Я развертываю контракт, который создает токен и краудсейл на основе кода, слегка измененного из zeppelin-solidity .

Проблема: после развертывания контракта в Rinkeby с использованием Truffle и Infura поиск адреса контракта 0x9B4b8583048D77F7CDc5c665f138E6dbce1e37Baв [поиске токенов ERC20 Etherscan][2] дал результат, что токен не найден в этом адресе контракта!

Что пошло не так?

Выводtruffle migrate --network rinkeby

Using network 'rinkeby'.

Running migration: 1_initial_migration.js
  Replacing Migrations...
  ... 0xb101fbf5cb0c6f2e0e937484c2db43cef906501d5544c0ce742fd6965a06594e
  Migrations: 0x9b4b8583048d77f7cdc5c665f138e6dbce1e37ba
Saving successful migration to network...
  ... 0x53dd9d5eb01e0dc636695a21ea8e95d58862a0c9e010c7fa8c840048fc21f7ad
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Replacing SampleCrowdsale...
  ... 0x31fef6189be9eb877b87751cd27c00f52e46c0fca3ce17722a4a586691a5c995
  SampleCrowdsale: 0x2c7bf1f6c01bd45e104de98e96266a2b1f07907f
Saving successful migration to network...
  ... 0xddfecd93e7d8aefa4c438a0e4a7d8e775e17ff6241177b0511413a5ccb665985
Saving artifacts...

ОбразецCrowdsale.sol

pragma solidity ^0.4.11;

import "zeppelin-solidity/contracts/crowdsale/CappedCrowdsale.sol";
import "zeppelin-solidity/contracts/crowdsale/RefundableCrowdsale.sol";
import "zeppelin-solidity/contracts/token/MintableToken.sol";


contract SampleCrowdsaleToken is MintableToken {

  string public constant name = "Sample Crowdsale Token";
  string public constant symbol = "SCT";
  uint8 public constant decimals = 18;

  uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));

  /**
   * @dev Constructor that gives msg.sender all of existing tokens.
   */
  function SampleCrowdsaleToken() {
    totalSupply = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }

}


contract SampleCrowdsale is CappedCrowdsale, RefundableCrowdsale {

  function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet)
    CappedCrowdsale(_cap)
    FinalizableCrowdsale()
    RefundableCrowdsale(_goal)
    Crowdsale(_startTime, _endTime, _rate, _wallet)
  {
    //As goal needs to be met for a successful crowdsale
    //the value needs to less or equal than a cap which is limit for accepted funds
    require(_goal <= _cap);
  }

  function createTokenContract() internal returns (MintableToken) {
    return new SampleCrowdsaleToken();
  }

}

2_deploy_contract.js

var SampleCrowdsale = artifacts.require("../contracts/SampleCrowdsale.sol");

module.exports = function(deployer) {
    var d = new Date()
    var startTime = d.getTime()
    var endTime = startTime + (86400 * 20) // 20 days
    const rate = new web3.BigNumber(1000)
    const goal = 10000
    const cap = 1000000
    const wallet = '0xcede48d8aC162d1b08ed9419010DE3c99F2cfDd6'
  deployer.deploy(SampleCrowdsale, startTime, endTime, rate, goal, cap, wallet);
};

Это создает 2 контракта

  • Миграции: 0xc0e02bc10bc4fbdba607365afcab5f6c992759e0
  • Пример краудсейла: 0x09451e7df77a32f4b35858385b96ddd0a4e2bff2

Однако использование функции 0x09451e7df77a32f4b35858385b96ddd0a4e2bff2Metamask Add Tokenне добавляет никаких токенов. Etherscan ETC20 Standard Token Explorer также не находит действительных токенов по адресу контракта.

Ответы (2)

*** Добавление нового ответа в качестве моего предыдущего не отражает текущего состояния вопроса.

Если я не ошибаюсь, вы ищете на Etherscan этот адрес: 0x09451e7df77a32f4b35858385b96ddd0a4e2bff2, что соответствует Crowdsale.

Что вам нужно искать в Etherscan, так это адрес контракта для SampleCrowdsaleToken, который создается внутри токена Crowdsale.

Вам нужно будет развернуть контракт Crowdsale, а затем узнать адрес, на который был развернут токен.

Обновлять:

Из результатов миграции трюфелей, опубликованных в вопросе, видно, что было создано только 2 контракта: 1 для миграции трюфелей (из 1_intiial_migration.js) и один для краудсейла (из 2_deploy_contracts.js). Предполагается ли создание третьего контракта для токена? Не могу найти третий контракт.

Сосредоточьтесь на контракте Crowdsale, который был развернут. Внутри этого контракта Crowdsale метод createTokenContract создает экземпляр вашего контракта Coin, фактически развертывая его по новому адресу. Именно этот адрес вы должны проверить на Etherscan, чтобы найти свой токен.

Вот пошаговое руководство по поиску контракта токена. Он основан на точно таком же коде, который вы опубликовали, и доступен в тестовой сети Ropsten:

1- Найдите свой контракт Crowdsale на Etherscan: мой развернут на https://ropsten.etherscan.io/address/0xb40b859107e7e788895f06fffdbb8db7777dcb9e .

2- Перейдите на вкладку «Внутренние транзакции», здесь будут показаны транзакции, совершенные по внутренним контрактам. https://ropsten.etherscan.io/address/0xb40b859107e7e788895f06fffdbb8db7777dcb9e#internaltx Первоначально будет показана 1 транзакция, которая представляет собой создание контракта (это контракт на монеты, который развернут контрактом Crowdsale). Мой покажет 2 транзакции, так как я уже купил несколько токенов.

3- Нажмите на транзакцию создания контракта. Он перенаправит вас на адрес, на который была развернута монета. Это адрес вашего токена https://ropsten.etherscan.io/address/0x50729cd2a36984b6ee6757755eb59ae2f87a7d20

4- Перейдите на https://ropsten.etherscan.io/token-search и найдите свой токен по адресу, который вы получили ранее. В данном случае: 0x50729cd2a36984b6ee6757755eb59ae2f87a7d20

5- Следующий экран появится после того, как вы совершите хотя бы 1 транзакцию с вашим токеном (например, используйте Metamask для отправки эфира на краудсейл, что вызовет резервную функцию краудсейла, которая вызывает buyTokens(). Даже если вы этого не сделали). Перед тем, как совершить транзакцию, вы должны увидеть переменные состояния вашего токена, такие как имя, общее количество и т. д.

Если вы все сделали правильно, то должны увидеть это:

введите описание изображения здесь

Из вывода, truffle migrateопубликованного в вопросе, видно, что было создано только 2 контракта: 1 для миграции трюфелей (из 1_intiial_migration.js) и один для краудсейла (из 2_deploy_contracts.js). Предполагается ли создание третьего контракта для токена? найти третий контракт.
@ pabloruiz55 Вы должны иметь возможность редактировать свой собственный ответ, чтобы добавлять/удалять информацию.
@Ismael Да, я знаю об этом, но, учитывая, что этот вопрос изменился с момента его первоначальной публикации, я предпочел добавить еще один ответ, связанный с текущим состоянием, а не удалять предыдущий, на случай, если он будет полезен для кого-то еще с аналогичная проблема.
Отлично, теперь все понятно! Не знал, как искать контракт токена из контракта краудсейла. Пошаговое руководство очень полезно.

Кажется, вы не переопределяете функцию Crowsale, которая обрабатывает создание токена.

Это функция, как она появляется в Crowdsale.sol

function createTokenContract() internal returns (MintableToken) {
    return new MintableToken();
}

Вы должны переопределить его в своей реализации SampleCrowdsale:

// creates the token to be sold.
// override this method to have crowdsale of a specific MintableToken token.
function createTokenContract() internal returns (MintableToken) {
  return new SimpleToken();
}
Добавлено createTokenContractобратно в Crowdsale.sol, но по-прежнему не удается найти действительные токены по адресу контракта для SampleCrowdsaleиспользования Metamask и Etherscan ERC20 Token Explorer.
Обратите внимание, что я создал первоначальную поставку токена и отправил все это наmsg.sender