Implementierung eines Allowance Crowdsale. Token Interface / _prevalidatePurchase-/_delivertokens-Funktion

Ich bin neu in der Solidity-Codierung und nachdem ich einige grundlegende Verträge sowie einen ERC20-Token-Vertrag erstellt hatte, wollte ich einen Crowdsale-Vertrag erstellen. Jetzt stecke ich fest und habe eine Frage bezüglich der Umsetzung eines Crowdsale-Vertrags über die OpenZeppelin-Verträge.

Hier ist der Code, den ich nach dem Import von SafeMath, Ownable, ERC20Basic, ERC20, Crowdsale, WhitelistedCrowdsale, AllowanceCrowdsale, CappedCrowdsale, TimedCrowdsale hinzugefügt habe:

contract TestToken is ERC20 {
    using SafeMath for uint256;

    string public symbol = "TEST";
    string public name = "TEST Token";
    uint8 public decimals = 18;
    uint256 public _totalSupply = 140000000 * 10**uint256(decimals);
}


contract TestCrowdsale is Crowdsale, WhitelistedCrowdsale, AllowanceCrowdsale, CappedCrowdsale, TimedCrowdsale
{
function TestCrowdsale(
    uint256 _openingTime,
    uint256 _closingTime,
    uint256 _rate,
    address _wallet,
    address _tokenWallet,
    uint256 _cap,
    TestToken _token
    )
    public
    Crowdsale(_rate, _wallet, _token)
    AllowanceCrowdsale(_tokenWallet)
    CappedCrowdsale(_cap)
    TimedCrowdsale(_openingTime, _closingTime)
    {
    }
}

Meine Fragen...

F1: Wo gebe ich die Token-Vertragsadresse ein, wenn ich einen Token verwenden möchte, der vor dem Crowdsale-Vertrag erstellt wurde?

F2: Wenn ich es nirgendwo direkt eingeben kann, wie definiere ich die Token-Schnittstelle im Crowdsale-Vertrag? Ich habe es auf die gleiche Weise versucht, wie im Beispiel-Crowdsale-Vertrag gezeigt, der einen geprägten Token verwendet, aber es ist fehlgeschlagen.

F3: Wenn die beiden genannten Optionen falsch sind, muss ich dann den Token und den Crowdsale in einem Schritt erstellen?

Q4: Muss ich zB wegen der Mehrfachverwendung von _prevalidatePurchase oder _deliverTokens Funktionen etwas an den importierten Verträgen selbst ändern?

Vielen Dank im Voraus für Ihre Hilfe.

Antworten (1)

Ich weiß, es ist schon 3 Monate her, aber die Antwort kann für andere nützlich sein. Als ich hier ankam, kannte ich einen Teil der Antwort, also lassen Sie mich sie vollständig beantworten. Lassen Sie mich zuerst Ihre Fragen beantworten:

Q1. Im TestCrowdsale-Konstruktor TestToken _tokensollte das Feld die Token-Vertragsadresse

Q2 sein. Du kannst!

Q3. "Vor langer Zeit", so funktionierte das, aber es hat sich geändert ... Sie haben Ihre Antwort.

Q4. Nein, betrachten Sie diese Verträge wie Java-Klassen. Der Crowdsale ist der grundlegendste, und die anderen erweitern ihn, und manchmal überschreiben sie Methoden wie die _deliverTokensMethode. In diesem Fall überschreibt AllowanceCrowdsale diese Methoden, MintedCrowdsale jedoch auch.

Ich denke, es hat deine Fragen beantwortet. Was Sie jetzt noch vermissen, ist die Bereitstellung dieser Verträge.
Nun, es gibt ein paar Methoden, aber lassen Sie mich sagen, dass die Verwendung von Truffle der einfachste Weg ist.
Da ich dies kürzlich getan habe, lassen Sie mich zeigen, wie es gemacht wird

var YourCrowdsale = artifacts.require("./YourCrowdsale.sol");
var YourCoin = artifacts.require("./YourCoin.sol");

module.exports = function(deployer, network, accounts) {
    deployer.then(() => {
        return deployer.deploy(YourCoin);
    })
    .then(() => {
        var rate = 1;
        var wallet = accounts[0];
        return deployer.deploy(YourCrowdsale, rate, wallet, wallet, YourCoin.address);
    });
};

Dies wird als Migrationsdatei auf Trüffel bezeichnet (schauen Sie einfach auf deren Website nach). Eine wichtige Anmerkung, es wurde mit Truffle v4 gemacht, die v5 wurde vor ein paar Tagen veröffentlicht und hat ein paar Fehler behoben, einschließlich der Notwendigkeit, deployer.then().then() zu verwenden .... (es gab einen Fehler in v4, der ließ keine Verträge innerhalb von Versprechungen bereitstellen, das war also der Trick).

Nun, die letzte wichtige Sache, wenn Sie Open-Zeppelin verwenden, müssen Sie das Eigentum an Verträgen übertragen, wie hier YourCoinInstance.transferOwnership(YourCrowdsaleInstance.address);. Falls Sie einen MintableCrowdsale verwenden, reicht es aus, Sie können mit dem Mining beginnen, in diesem Fall müssen Sie auch der Übertragung von Token zustimmen, wie z YourCoinInstance.approve(YourCrowdsaleInstance.address, web3.toWei(ammountOfTokens, 'ether'));.