Ich habe fast alle Beiträge zu diesem Thema überprüft, aber keine der Antworten tut genau das, was ich brauche.
Ich habe eine Anwendung, die es Benutzern ermöglicht, ihre Token aus ihrem Vertrag in meinen „Pool“ an meine eigene Vertragsadresse einzureichen. Was ich möchte, ist, dass eine externe Adresse meinen eigenen Vertrag anfordern kann, um ihnen diese neuen Token zu senden, nachdem sie eine ETH-Gebühr bezahlt haben. Die Reihenfolge ist also wie folgt, beispielsweise mit zufälligen Beträgen:
Ich gehe davon aus, dass ich hier eine Batch-Add-Funktion verwenden muss, um die Token freizugeben und die ETH zu akzeptieren, aber wie bekomme ich meine Pool-Adresse dazu, die Transaktion automatisch ohne mein Eingreifen zu genehmigen?
In Schritt 1 überträgt der Benutzer einfach auf Ihren Vertrag im ERC20-Token-Vertrag. Ihr Vertrag weiß nicht einmal, dass diese Übertragung stattgefunden hat.
In Schritt 2 kauft der Benutzer einige Token X von Ihrem Vertrag zu einem Preis, und Ihr Vertrag sendet die Token, wenn der Vertrag genug hat, oder die Transaktion fehlschlägt und das Geld an den Benutzer zurückgegeben wird, was Sie wollen.
function(SafeERC20 token, uint amount) public payable {
require(msg.value == amount); // price is 1:1 in the example
// emit an event
token.safeTransfer(msg.sender, amount);
}
Das ist alles. Verwenden Sie die openZeppelin SafeERC20-Implementierung für einen wichtigen Schutz, da der Benutzer dadurch eine nicht vertrauenswürdige Vertragsadresse eingeben kann . Noch besser ist es, Token-Verträge auf die Whitelist zu setzen, damit Sie verdächtige Implementierungen abwehren und nur gut erzogene Implementierungen genehmigen können.
mapping(SafeERC20 => bool) public isApproved;
require(isApproved[token], "Not an approved token.");
Für den Fall, dass Sie einige Token-Verträge ablehnen, haben Sie weitere Bedenken, was Sie mit Token tun sollen, die in Ihrem Vertrag gestrandet sind, aber das geht ein wenig über den Rahmen der ursprünglichen Frage hinaus.
Es überprüft nicht das Guthaben Ihres Vertrags im Token Ihrer Wahl, da die Übertragung fehlschlägt, wenn Ihr Vertrag nicht über ausreichende Mittel verfügt. Wenn die Transaktion fehlschlägt, wird der gesendete Ether an den Absender zurückgeschickt. Alles am richtigen Platz. Wir sind fertig.
Ich hoffe es hilft.
Wenn du