Vertragsinteraktion und Batch-Transaktion mit Web3

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:

  • Benutzer A (Vertragseigentümer) sendet 100 Token von seiner Vertragsadresse an meine Pooladresse (bei mir funktioniert das bereits)
  • Benutzer B (interessierter Käufer) klickt auf eine Schaltfläche in meiner Bewerbung, die ihm 20 dieser Token von meiner Pooladresse im Austausch für den in der App vorgegebenen ETH-Betrag gewährt.

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?

  • Hinweis: Meine Pooladresse kann mehrere Token enthalten, daher müsste ich auch angeben, welches Token während der Transaktion gesendet wird.

Antworten (1)

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