Wie kann ich einen Crowdsale-Vertrag codieren, um alle nicht verkauften Token an eine bestimmte Adresse zu senden?

Nach meinem Verständnis von Smart Contracts scheint es keine Möglichkeit zu geben, eine bestimmte Funktion oder Aktion so einzustellen, dass sie sich nach einer bestimmten Zeit selbst auslöst, ist dies der Fall?

Ist die einzige Möglichkeit, nicht verkaufte Token zuzuweisen, eine Funktion festzulegen, die dies tut, und diese Funktion dann nach Ablauf des ICO-Enddatums manuell aufzurufen?

Ich kann keine Implementierung dieser Art finden, aber es ist sicherlich eine gängige Methode innerhalb von ICOs? Der „FinalizeAgent“-Vertrag von OpenZeppelins ist nicht hilfreich, da er nicht erklärt, wie er ausgelöst wird.

Danke schön.

Antworten (3)

Haben Sie darüber nachgedacht, einen [mintable] Token ( https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/MintableToken.sol ) zu verwenden? Dann gäbe es keine unverkauften Token, um deren Verbrennung man sich Sorgen machen müsste 😉

Aber wenn du das nicht kannst.

Dann ja, Sie haben Recht, dass ein intelligenter Vertrag sich nicht selbst auslösen kann, um etwas zu tun, da dies eine Art Schleife erfordern würde. Und könnten Sie sich vorstellen, wie vermasselt das EVM wäre, wenn alle Smart Contracts in einer Schleife auf das Eintreten eines zeitbasierten Ereignisses warten würden? Nein bueno. Nicht nur das, Smart Contracts können keine Gaskosten bezahlen (IIRC, das in Arbeit ist oder ein EIP ist)

Direkte Antwort:

function burnTokens() public onlyOwner onlyCrowdsaleOver {
    address(0).transfer(remainingTokens);
}

Sie sagen zu Recht, dass es keine Möglichkeit gibt, eine Aktion so einzustellen, dass sie nach einem bestimmten Zeitrahmen von selbst ausgelöst wird. Es muss eine Transaktion geben, die das tut.

Die Transaktion könnte eine solche Funktion auslösen

function burnTokensAfterSale() {
    if (finalized && (block.number > 6000000)) {
        _transfer(0, remainingTokens)
    }
}

Es gibt das nowSchlüsselwort in Ethereum, das einem Zeitstempel entspricht.

Warum verwendest du nicht so etwas wie:

    if(now > 1500000)
    {
       sendTo(0x123456789213456789123456789);
    }
Aber müsste das nicht innerhalb einer Funktion sein, die dann aufgerufen würde, nachdem der Crowdsale beendet ist? Ist der Aufruf einer Funktion über die Eigentümeradresse der akzeptierte Weg, dies zu implementieren? Vielen Dank für Ihre Hilfe.
ethereum.org/crowdsale Schauen Sie sich das Beispiel an, hier wird die Überprüfung jedes Mal, wenn eine Funktion aufgerufen wird, von einem Modifikator aufgerufen.