Gibt es eine Möglichkeit, das gesamte user.balance auf den Vertrag oder die externe Zahlungsadresse zu übertragen, ohne dass der Benutzer den msg.value eingeben muss?
Die intuitivste Version, die ich hatte, sieht auf Solidity 0.5.0 ein bisschen so aus:
address(this).transfer(msg.sender.balance)
Es scheint jedoch, dass die Vertragsadresse von Natur aus nicht zahlbar ist, also habe ich versucht, sie zuerst in eine zahlbare Adresse umzuwandeln:
address payable payableContract = address(uint160(address(this)))
Aber es scheint auch nicht zu funktionieren. Jemand schlug mir vor, mich bei Contract Factory umzusehen, was das Problem lösen könnte. Was wäre der beste Weg, um es zu umgehen, um das gleiche Ergebnis zu erzielen?
Sie müssen den Fluss der Dinge umkehren, sonst ergibt das keinen Sinn.
Es gibt keine Möglichkeit, einen Vertrag zu codieren, um Geld von einer Benutzer-Brieftasche zu überweisen. Nicht alle, nicht einige, nicht alle.
address(this).transfer(msg.sender.balance)
Das heißt, das Ziel ( to
) ist address(this)
und der Betrag ist der msg.sender
Saldo von . from: address
ist implizit address(this)
, weil nichts anderes möglich ist . Daher from
wird in der Syntax nicht erwähnt.
Was Sie eigentlich möchten, ist, dass der Benutzer eine Transaktion unterzeichnet, die sein Geld an Ihren Vertrag sendet. Ich weiß nicht, warum es ihr gesamtes Gleichgewicht sein muss, und das klingt für mich wie ein weiterer Design-Fehltritt, aber hier ist, wie Sie es tun würden.
Es ist ein Front-End-Anliegen. Nochmals zur Betonung, denn nur der Benutzer kann die Überweisung seiner eigenen Gelder autorisieren. Auf der Vertragsseite können Sie ihn nur empfangen, die Transaktion validieren und möglicherweise ablehnen, wenn etwas nicht stimmt.
function depositFunds() public payable {
// carry on
// msg.value and msg.sender inform about who and how much
}
Am Frontend würden Sie Web3 oder eine ähnliche Bibliothek verwenden, um dem Benutzer zu helfen, eine gültige Transaktion mit amount: as much as possible, to: your contract, {gas: amount, gasPrice: bid}
.
Der Benutzer muss für Benzin bezahlen, und dies verringert die Höhe der verfügbaren Mittel, die Sie an Ihren Vertrag senden können. Das müssen Sie berücksichtigen. Ihr Frontend muss Folgendes herausfinden:
Wenn der Browser (oder Server) die Berechnung durchführt, wird dem Benutzer die Option angeboten, eine Transaktion zu unterzeichnen, indem x Betrag gesendet und y für Gas geboten wird, mit einer Gasschätzung von z, was ihm einen Endsaldo von 0
.
Es ist mir unklar, warum jemand solchen Bedingungen zustimmen würde.
Ich hoffe es hilft.
transferOwnership()
. Natürlich müssen viele Details durchdacht werden, sodass alles im Voraus vereinbart wird. Der Eigentümer müsste die Delegierten von Zeit zu Zeit wechseln.
Benutzer19510
Hugo
Benutzer19510
Hugo
Rob Hitchens
Hugo