Machen Sie msg.sender so, dass es in Solidity-Nested-Contracts konstant bleibt

Ich habe drei verschiedene Verträge. Einer ist ein einfacher Vertrag (ContractA), der zweite ist mein Token-Vertrag und der dritte ist ein ERC20-Token-Vertrag, der in meinem Token-Vertrag vererbt wird. Wenn ich also eine Anfrage von meinem Frontend (reactjs) an meinen ContractA sende, sendet er diese Anfrage an meinen Token-Vertrag, der die Anfrage an den ERC20-Token-Vertrag sendet, um Token an eine Adresse zu übertragen.

Das Problem, mit dem ich konfrontiert bin, ist, dass beim Aufrufen der Funktionen die Adresse des Benutzers in den Vertrag geändert wird, der den anderen Vertrag aufruft. Wie kann ich den Vertrag während der gesamten Ausführung konstant halten? Das bedeutet, dass die Vertragsadresse der Benutzer sein sollte, der die Anfrage vom Frontend gestellt hat.

Hinweis: Ich kann meine Implementierung in meinem Token-Vertrag nicht ändern, da sie bereits bereitgestellt ist.

MeinVertrag.sol

function sellTokens(address _from) public {
        require(myToken.balanceOf(_from) >= 1);
        myToken.transfer(_deployerAddress, 1);
}

Hier ist meine sellTokens-Funktion, die einen Token an den Eigentümer des Tokens überträgt. Dies wird aus der myContract- Datei aufgerufen .

Die Übertragungsfunktion ist in der ERC20-Token-Implementierung von OpenZeppllin implementiert. Wenn ich jetzt die Übertragungsfunktion aufrufe, erhält sie den msg.sender als Vertrag, der myContract ist. Und im Gegenzug gibt es mir einen Fehler, weil der Betrag das Gleichgewicht übersteigt, da myContract keine Token enthält. myToken ist derjenige, in dem das ERC20-Token vererbt wird.

Antworten (2)

Ich bin mir nicht ganz sicher, ob ich Ihre Frage verstehe und was Sie ändern können und was nicht und was der Unterschied zwischen snaToken und myToken ist. Sie prüfen den Kontostand von snaToken, senden dann aber myToken – was genau passiert da?

Aber wie auch immer, kennen Sie den Zulagemechanismus? (Funktionen .approve und .transferFrom) Sie können es verwenden, um dies zu tun:

  1. Der Benutzer ruft genehmigen für MyContract auf. Bedeutung - Ihr Frontend fordert den Benutzer auf, eine "genehmigte" Transaktion für das Token zu unterzeichnen, das Sie übertragen möchten. Wenn Sie also beispielsweise möchten, dass der Benutzer seine myTokens sendet, muss er zuerst anrufen und unterschreiben: myToken.approve(myContract, transferAmount). Dies gibt dem myContract-Vertrag die Erlaubnis, transferAmount-Tokens von msg.sender an jeden zu senden, den myContract auswählt.
  2. Dann ruft der Benutzer MyContract sellTokens auf, aber jetzt wird sellTokens nicht .transfer aufrufen, sondern transferFrom: myToken.transferForm(msg.sender, destinationAddress, transferAmount). Dadurch werden die myTokens des Benutzers an destinationAddress übertragen.

Hoffentlich hilft das, aber wie gesagt, ich bin mir nicht sicher, was die Beziehung zwischen myToken und snaToken ist und warum Sie das Guthaben von einem überprüfen und das andere senden.

Vielen Dank für die Hilfe, die Methode hat wie ein Zauber funktioniert. Außerdem gab es einen Fehler, dass snaToken mit myToken identisch ist. Ich habe nur vergessen, den Namen von snaToken in myToken zu ändern, ich habe es korrigiert.

tx.originSie sollten anstelle von verwenden msg.sender. Wenn es mehrere Funktionsaufrufe für mehrere Verträge gibt, verweist tx.origin immer auf das Konto, das die Transaktion gestartet hat, unabhängig vom Stapel der aufgerufenen Verträge. Allerdings bezieht sich msg.sender auf denjenigen, der den Vertrag aufgerufen hat, könnte eine intelligente Vertragsadresse sein.

Vielen Dank für den Vorschlag. Können Sie die Frage bitte noch einmal überprüfen und mir sagen, ob es jetzt Sinn macht. Ich habe einige weitere Details hinzugefügt, um mehr zu verdeutlichen. Ich hätte tx.origin verwendet, wenn ich myToken-Code bei mir gehabt oder eine andere Implementierung durchgeführt hätte. Da myToken-Code bereitgestellt wird und ich ihn nicht ändern kann, muss ich nach verschiedenen Implantationen suchen, in denen der msg.sender während der gesamten Ausführung konstant bleibt.
Entschuldigung, falsch verstanden, in diesem Fall sollten Sie approveden + transferFrom-Mechanismus von erc20 anstelle der Übertragungsfunktion verwenden. Übertragungsfunktionen können nur direkt aufgerufen werden.