Modifikator zahlbar löst eine Aktion aus, wenn eine Adresse Ether an einen Vertrag sendet.
Zum Beispiel:
function () public payable {
require(msg.data.length == 0);
DoSomething();
}
Wird diese Aktion auch ausgelöst, wenn der msg.sender Tokens sendet? Meine Frage ist, ob es möglich ist, Aktionen durch Zahlung auszulösen, wenn eine Adresse auch Token sendet, oder ist ein anderer Modifikator oder eine komplexere Problemumgehung erforderlich, um dies zu erreichen?
Um mit dem Empfang von Token umgehen zu können, können Sie Ihre Klasse vom ERC223Receiver
Standard erben lassen:
contract ERC223Receiver
{
function tokenFallback(address _from, uint _value, bytes _data);
}
contract YourContract is ERC223Receiver
{
function tokenFallback(address _from, uint _value, bytes _data)
{
// Handle receiving tokens
}
}
Das habe ich selbst nicht getestet.
tokenFallback
vom Token-Vertrag selbst aufgerufen wird, msg.sender
ist dies die Adresse des Token-Vertrags. Sie sollten wahrscheinlich werfen, wenn tokenFallback
nicht von einem vertrauenswürdigen Token-Vertrag aufgerufen wird.tokenFallback
Ihren Vertrag auf. Die Tatsache, dass der Aufruf tokenFallback
aus dem Token-Vertrag kam, beweist, dass echte Token übertragen wurden. Die Aufrufkette sieht so aus: USER --> TokenContract.transfer(..) --> YourContract.tokenFallBack(...)function tokenFallback(...)
wenn er Code ausführen möchte, wenn er Token empfängt. tokenFallback(...)
Der Token-Vertrag muss innerhalb seiner aufrufenfunction transfer(...)
Der zahlbare Modifikator ermöglicht es der Funktion, Äther zu erhalten. Die Funktion in Ihrem Beispiel ist eine standardmäßige zahlbare Fallback-Funktion, die jedes Mal aufgerufen wird, wenn jemand Ether an Ihren Vertrag sendet.
Sie können auch jede andere Funktion als zahlbar implementieren, damit diese Funktion Ether akzeptieren kann.
Payable erlaubt der Funktion nur, Ether zu akzeptieren, und es steht in keiner Weise im Zusammenhang mit Token-Transfers.
Das Senden von Token ist nur eine Übertragungsfunktion im ERC20-Standard. Standardmäßig ändert es nur das Gleichgewicht innerhalb des Tokens. Wenn Sie also 1 Token von A nach B senden, ändert sich nur Folgendes:
token.balances[A] = token.balannces[A] - 1
token.balances[B] = token.balances[B] + 1
Um tun zu können, was Sie wollen, haben Sie zwei Möglichkeiten.
Implementieren Sie Ihre Token so, dass sie die tokenFallback-Funktion aufrufen, wenn die Übertragung aufgerufen wird. Bitte beachten Sie, dass das sendende Token die tokenFallback-Funktion im empfangenden Vertrag aufrufen muss. Das standardmäßige Open Zeppelin ERC20-Token tut dies nicht. Sie müssen eine Änderung daran vornehmen.
Schreiben Sie einen Javascript- oder Python-Code mit der web3-Bibliothek, der auf Übertragungsereignisse von Ihrem Token lauscht und eine Funktion im empfangenden Vertrag aufruft, wenn die Übertragung durchgeführt wird.
Badr Bellaj