Wenn Sie einen Vertrag von einem anderen Vertrag aufrufen, bleibt die Transaktion für immer anhängig

Ich entwickle eine DApp im Kovan-Netzwerk auf Remix und habe Schwierigkeiten, das Problem zu verstehen. Ich versuche, den Wrapped Ether-Vertrag (WETH: https://kovan.etherscan.io/address/0xd0a1e359811322d97991e03f863a0c30c2cf029c ) aus meinem eigenen Vertrag aufzurufen (um den Ether meiner Benutzereinlage automatisch zu verpacken / auszupacken).

Wenn ich den Vertrag von Etherscan über Metamask aufrufe, kann ich WETH problemlos einzahlen und abheben.

Das Problem tritt jedoch auf, wenn ich versuche, WETH durch meinen Vertrag zu „einzahlen“ (mit meiner WrapETH-Funktion) und dann „abzuheben“. Ich erkannte das Problem, als meine Auszahlungsversuche immer rückgängig gemacht wurden. Mir wurde klar, dass die Einzahlungstransaktion bei Remix immer ausstehend war, obwohl die Transaktion auf seiner Etherscan-Seite abgebaut wurde (zum Beispiel: https://kovan.etherscan.io/tx/0xe815da928878318b9e8eff18eb8ae353ebc0e8db9cd8fb2b39ca2b55f13d06f9 ), und dass ich das Ereignis sehen und meine überprüfen konnte Saldo auf der WETH-Seite. Die Transaktion selbst erschien auch nicht auf der WETH-Seite. Eine weitere seltsame Sache bei dieser ausstehenden Transaktion sind die „Eingabedaten“, die im Vergleich zu anderen Transaktionen nicht lesbar sind.

Weiß jemand, was passiert und warum es einen Unterschied zwischen dem Aufruf des WETH-Vertrags von Etherscan (wieder, wo die Transaktion direkt abgebaut und aufgezeichnet wird) und nicht von meinem Vertrag gibt?

Hier sind die Funktionen, die ich aufrufe (mit nur dem Nützlichen)

WETH9_ WETHContract = WETH9_(0xd0a1e359811322d97991e03f863a0c30c2cf029c);

function depositETH() public payable{ 

}

function wrapETH(uint256 _amount) public{
     WETHContract.deposit.value(_amount)();
}

function withdrawETH(uint256 _amount) public{
    WETHContract.withdraw(_amount);
}

Danke

Antworten (1)

Die Transaktion funktioniert wie erwartet.

Die Paritätsspur Ihres Vertrags zeigt, dass er den WETH-Vertrag aufruft. Ihre Transaktion löst auch das Deposit Ereignis für den Wert der Transaktion aus. Wenn Sie auf die Seite Vertrag lesen des WETH-Vertrags gehen und das Guthaben von abfragen 0xf2a800fa540060384ed4d778db7cafdf477df2ec, erhalten Sie ein entsprechendes WETH-Guthaben zurück.

Der einzige Unterschied wäre, wer die WETH erhält. Wenn Sie Metamask verwenden, um den WETH-Vertrag direkt aufzurufen, wird die WETH an das externe Konto gesendet, das die Transaktion initiiert hat.

Wenn Sie Ihren Vertrag durchgehen, wird Ihr WETH stattdessen Ihrem Vertrag gutgeschrieben, da es sich bei WETH um msg.senderIhren Vertrag handelt.

Sie sollten ein internes Hauptbuch in Ihrem Vertrag über Benutzersalden führen. Wenn Sie die Auszahlungsfunktion aufrufen, kommt der Ether zu Ihrem Kontrakt und Sie müssen ihn an den Benutzer weiterleiten.

Ja, das mache ich in der Vollversion. Allerdings funktioniert auch in dieser Version die Abhebungsfunktion nicht, wenn sie aufgerufen wird, aber für mich sollte mein Vertrag (0xf2a ...) wie Sie sagen, die benötigte WETH haben und somit in der Lage sein, ETH aus dem WETH-Vertrag abzuheben. Hier ist die Transaktion von der Funktion „RetractETH“ fehlgeschlagen: kovan.etherscan.io/tx/…
Es funktioniert, Sie brauchen nur eine kostenpflichtige Fallback-Funktion in Ihrem Vertrag, um den Ether zu akzeptieren
Es war tatsächlich die Fallback-Funktion!! Ich wusste nie, dass ich es dafür brauche. Vielen Dank für Ihre Hilfe!