Ошибка JavascriptVM (remix) при развертывании нескольких токенов

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

Внутри моего конструктора краудсейла я развертываю два токена следующим образом:

function Crowdsale() public {
    price = 1 ether;
    wallet = msg.sender;
    dollar = new StandardToken("Dollar", "HWD", 2, 2000000);
    vote = new StandardToken("Vote", "HWV", 2, 500000);
    StandardToken(dollar).transfer(wallet, 500000);
}

При развертывании контракта на Ropsten с инжектом Web3 через Remix все работает нормально. Я могу легко проверить это, вызвав эту функцию в краудсейл-контракте, который должен вернуть 1 500 000 (поскольку мы отправили 500 тысяч отправителю при создании)

function tokensAvailable() public view returns (uint256) {
    return StandardToken(dollar).balanceOf(this);
}

call to Crowdsale.tokensAvailable
[call] from:0xba5116fea48692a505c5e2a898d4c803f0ca5d2a, to:Crowdsale.tokensAvailable(), data:60659...59a92, return: 
    {
      "0": "uint256: 1500000"
    }

Однако при развертывании через JavascriptVM я могу вызывать функции только для второго созданного токена, а не для первого. Методы для первого токена всегда возвращают Undefined.

Это потому, что Remix не может обрабатывать несколько токенов в памяти, или что здесь может быть? Я работал над этим проектом 2 недели назад и могу поклясться, что все работало правильно. (Хотя моя память могла меня здесь подвести).

Есть идеи?

Спасибо !

Какие бывают виды dollarи vote? Если они имеют тип StandardToken, вам не нужно приводить dollarфункцию tokensAvailable()к StandardTokenпервому. Например, вы можете заменить строку tokensAvailable()наreturn dollar.balanceOf(this)

Ответы (1)

Ваш процесс похож на этот?

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

Убедитесь, что выбран правильный токен, прежде чем нажимать «По адресу», и что адрес представляет этот контракт. Я получаю описанную вами проблему, когда ввожу неправильный адрес в поле «Загрузить контракт с адреса».

Сначала я подумал, что это человеческая ошибка с моей стороны, но это та же самая процедура для Ropsten, и там она действительно работает. Также у меня есть функция в моем контракте на краудсейл, прямо ссылающаяся на токен, который в конечном итоге оказывается неопределенным, поэтому, даже если я не использую эту процедуру, я получаю сообщение об ошибке. "Невозможно прочитать длину свойства неопределенного..."
Как вы ссылаетесь на контракт с токеном через undefinedконтракт на краудсейл? Ваш контракт Crowdsale работает с ним напрямую или вы получаете адрес токена и создаете к нему интерфейс через Remix с описанным выше процессом или что-то еще?