Verwendung der ERC223-Token-Fallback-Funktion

Ich schreibe gerade den Smart Contract „Trade“, der dem Smart Contract „Crowdsale“ ähnelt. Die einzige Funktion, die ich hinzufügen möchte, ist die Funktion "Verkaufen". Im Allgemeinen wird Crowdsale Smart Contract verwendet, um Menschen dazu zu bringen, ihren Token zu kaufen. Aufgrund der payable. Es kann nicht nur dafür sorgen, dass der Smart Contract den Ether empfängt, sondern auch die Transaktion mit einer bestimmten zahlbaren Funktion (dh function buy() payable public {}).

Ich brauche das Token Fallback functionwie Ether, also habe ich das gefunden, das ERC223basierend auf ERC20 verbessert wurde. Ich frage mich, ob ich eine Token-Fallback-Funktion in einem anderen Smart Contract verwenden kann. Ich meine einen anderen bereitgestellten Vertrag. Nehmen wir zum Beispiel an, dass jemand meine benutzerdefinierten erc20-Token an Smart Contract „Trade“ überträgt/sendet, weil er/sie eine gewisse Menge an Token verkaufen und die proportionale Menge an Ether zurückerhalten möchte (mithilfe von Web3 wie diesem myContract.methods.transfer()). Nachdem der „Trade“ Smart Contract den Token erhalten hat, wird Token Fallback Functionin „Trade“ der Smart Contract aufgerufen und die „Sell“-Funktion in diesem Contract ausgeführt. Ist das sinnvoll?

Das Problem ist, wie kann ich das umsetzen?

function transfer(address _to, uint _value, bytes _data) public {
    require(_value > 0 );
    if(isContract(_to)) {
        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.tokenFallback(msg.sender, _value, _data);
    }
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value, _data);
}

(Siehe https://gist.github.com/anonymous/eb7be71f34911b013552960cc4ac0f45 )

Dies ist die ERC223 Token transfer functionund die ERC223ReceivingContractwird so importiert import 'browser/ERC223ReceivingContract.sol';. Ich möchte den Vertrag nicht importieren, weil ich meinen Vertrag später aktualisieren muss. Ich möchte bleiben, mein Token-Vertrag hat nur wenige erforderliche Funktionen.

Ich habe auch eine andere Funktion namens gefunden TransferAndCall(). Ich kann die detaillierte Erklärung zur Verwendung nicht finden. Es scheint der Fallback-Funktion ähnlich zu sein.

Wie auch immer, habt ihr eine Lösung dafür? Warum ich den „Trade“ Smart Contract und den „Token“ Smart Contract aufteilen möchte, ist der Fall, wenn ich meinen „Trade“ Contract später aktualisieren muss, wie ich bereits erwähnt habe. Bitte helfen Sie mir, intelligente Soliditätsexperten!

Antworten (1)

Nachdem der Smart Contract „Trade“ das Token erhalten hat, wird die Token-Fallback-Funktion im Smart Contract „Trade“ aufgerufen und die Funktion „Sell“ in diesem Vertrag ausgeführt.

Ja.

Wie Sie sehen können, muss in der transferFunktion, wenn der Empfänger ein Vertrag ist, eine Fallback-Funktion für das Token vorhanden sein, sonst funktioniert es nicht.

Sie müssen diese Funktion in Ihrem Vertrag implementieren.

if(isContract(_to)) {
        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.tokenFallback(msg.sender, _value, _data);
    }

Wie Sie anhand des abstrakten Vertrages sehen können ERC223ReceivingContract, muss die Signatur der Funktion lauten:

function tokenFallback(address _from, uint _value, bytes _data) public