Token-Übertragung schlägt mit Zurücksetzen fehl

Ich habe Ihre neueste Vertragsversion und fast das gleiche Beispiel wie Ihres im Github https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/examples/SampleCrowdsale.sol - ich verwende Ganache zum Testen auf MAC-Betriebssystemen . Und der Vertrag funktioniert nur, wenn ich die Zeile kommentiere

function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal {
    //token.transfer(_beneficiary, _tokenAmount);
  }

Wenn dies nicht kommentiert wird, bekomme ich einen Laufzeitfehler und kehre zurück.

Mein einfacher Code lautet wie folgt:

ZEICHEN

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';

/**
 * The LeonardianToken contract does this and that...
 */
contract LeonardianToken is MintableToken {

    uint256 public constant INITIAL_SUPPLY = 10000;


    string public constant name = "Leonardian"; // solium-disable-line uppercase
    string public constant symbol = "LEON"; // solium-disable-line uppercase
    uint8 public constant decimals = 18; // solium-disable-line uppercase
}

VERTRAG:

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol';
import "zeppelin-solidity/contracts/crowdsale/Crowdsale.sol";
import './LeonardianToken.sol';

contract LeonardianCrowdsale is Crowdsale {

    function LeonardianCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, MintableToken _token) public 
    Crowdsale(_rate, _wallet, _token)
    // TimedCrowdsale(_startTime, _endTime)
    {

    }
}

MIGRATION (ohne Fehler):

var LeonardianCrowdsale = artifacts.require("./LeonardianCrowdsale.sol");
var LeonardianToken = artifacts.require("./LeonardianToken.sol");

module.exports = function(deployer) {

  deployer.deploy(LeonardianToken).then(function () {

    const startTime = Math.round((new Date(Date.now() - 86400000).getTime())/1000); // Yesterday
    const endTime = Math.round((new Date().getTime() + (86400000 * 20))/1000); // Today + 20 days
    var exchangeRate = 1; // 1 LEON = 0.0025 ETH or 1 ETH = 400 LEON

    deployer.deploy(LeonardianCrowdsale, 
        startTime, 
        endTime,
        exchangeRate, 
        "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", // Replace this wallet address with the last one (10th account) from Ganache UI. This will be treated as the beneficiary address. 
        LeonardianToken.address
      );
  });

};

Könnt ihr mir helfen was ich falsch mache?

LÖSUNG

Wie bereits erwähnt ERC20 _token = new LeonardianToken(); muss im Crowdsale-Vertrag aufgeführt werden, und eine wichtige Sache, um danach alles zu bearbeiten, ist, Ihre Migration ein wenig zu ändern

return deployer
    .then(() => {
        return deployer.deploy(Token);
    })
    .then(() => {

        return deployer.deploy(
            Crowdsale,
            startTime,
            endTime,
            exchangeRate,
            "wallet",
            Token.address
        );
    })
    .then(() => {

        var token = Token.at(Token.address);

        token.transferOwnership(Crowdsale.address);
    });

Antworten (1)

Das Token muss getrennt von Crowdsale bereitgestellt und in Crowdsale instanziiert werden

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol';
import "zeppelin-solidity/contracts/crowdsale/Crowdsale.sol";
import './LeonardianToken.sol';

contract LeonardianCrowdsale is Crowdsale {

    ERC20 _token = new LeonardianToken();

    function LeonardianCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, MintableToken _token) public 
    Crowdsale(_rate, _wallet, _token)
    // TimedCrowdsale(_startTime, _endTime)
    {

    }
}
Ich stoße auf dasselbe Problem. Wie erhalten Sie die Adresse dieses bereitgestellten Tokens extern und stellen sicher, dass es sich um die richtige Instanz handelt?
Eigentlich habe ich gerade diese Lösung ausprobiert. Es scheint zu funktionieren, weil es die Lösung nicht wirft, aber das Problem nicht wirklich löst. Dies liegt daran, dass die Instanz des bereitgestellten Vertrags nicht mit der in der Crowd-Sale-Datei erstellten Instanz identisch ist. Der Aufruf löst also withdrawTokenskeine Ausnahme aus, überträgt aber auch die Token nicht korrekt.
Ich füge der Frage die richtige Lösung hinzu