Wie erstelle ich eine Payable-Funktion, die nur ein Kunden-Token akzeptiert?

Ich habe eine Frage, auf die ich anscheinend keine Antwort finden kann, und hoffe, dass die Community helfen kann (und dies ist mein erster Beitrag hier, also entschuldige ich mich, wenn dies die falsche Frage ist, die ich von Anfang an stellen sollte).

Ich versuche, einen Vertrag mit einer Payable-Funktion zu erstellen, die nur einen bestimmten Token, nicht ETH, als Zahlung akzeptiert. Ich besitze sowohl den Token-Vertrag als auch diesen Vertrag, der speziell erstellt wurde, um die Zahlung für diesen bestimmten Token zu akzeptieren.

Ist das überhaupt möglich? Als mögliche Lösung habe ich folgendes gefunden:

Quelle: Wie erstelle ich einen Crowdsale, der nur einen bestimmten erc20-Token akzeptiert?

contract Crowdsale {

        address owner;  
        mapping(address => uint256) balances;
        function Crowdsale(){
            owner = msg.sender;
        }

        function acceptOnlyMyToken(address _yourTokenAddress, uint256 amount){
            address user = msg.sender;
            YourToken token = YourToken(_yourTokenAddress);

            //get the user's balance
            uint256 userBalance = token.balanceOf(user);
            //check user's balance
            if(userBalance >= amount){      
                token.transferFrom(user, owner, amount);        

            }

        }

    }

Ist es sicher, mit dem obigen Code Folgendes anzunehmen?

  1. Das Ersetzen YourToken token = YourToken(_yourTokenAddress);durch YourToken token = YourToken(address(0xABCD...));"0xABCD" als Adresse meines Tokens, das in einem separaten Vertrag enthalten ist, sollte funktionieren.
  2. Die Angabe require(msg.value == 100unter der acceptOnlyMyToken(...)Funktion würde es mir ermöglichen, den erforderlichen spezifischen Zahlungsbetrag festzulegen.

Ich sehe auch nicht, dass diese Funktion als "zahlbar" bezeichnet wird, spielt das eine Rolle? Der Grund ist, dass ich Variablen als Teil der Funktion weitergeben möchte, um XYZ-Arbeiten als Teil der Vertragslogik zu erledigen, für die ich eine Zahlung in einer bestimmten Menge dieses Tokens erhalte.

Irgendwelche Gedanken?

Antworten (1)

Sie werden nicht payablefür Übertragungen ohne Protokoll verwendet. ERC20 ist kein "Protokoll", weil es in einem Vertrag definiert ist.

Es gibt keine Möglichkeit , ERC20-Token zu erkennen, die blind in einen Vertrag übertragen werden. Im besten Fall kann der Vertrag sein Guthaben überprüfen, aber er weiß nicht, wer Geld gesendet hat, also ist dies nicht gut.

uint myTokenBalance = IERC20(<tokenAddress>).balanceOf(address(this));

Sie suchen nach dem Muster „Genehmigen und übertragenVon“. Es geht so:

  1. Der Benutzer autorisiert Ihren Vertrag, aus dem Token-Guthaben des Benutzers zu ziehen.

  2. Dann ruft der Benutzer eine Funktion in Ihrem Vertrag auf, die versucht, die Token einzulesen.

Schritt 2 sieht so aus:

function sendMe100() external {
  IERC20(<tokenAddress>).transferFrom(msg.sender, address(this), 100);
  // success
}

Das Vorstehende geht davon aus , dass der Benutzer die Übertragung autorisiert hat, indem er zuerst die Funktion im ERC20-Vertrag aufgerufen hat approve(Schritt 1), aber das ist normalerweise ein Front-End-Anliegen, das Ihren Vertrag nicht betrifft.

Ich hoffe es hilft.