Wie können Sie eine Zahlfunktion in einem anderen Vertrag mit Argumenten aufrufen und Geld senden?

Ich habe einen Vertrag mit dem Namen Call:

contract Call {
  ...
  function () payable {
    // TODO: Call the call function in the main contract
    // and forward all funds (msg.value) sent to this contract
    // and passing in the following data: msg.sender
  }
}

Hier ist der MainVertrag:

contract Main {
  ...
  function call(address senderAddress) public {
    // Make the code in here run when someone sends ethers to the Call contract
  }
}

Ich möchte also, dass jedes Mal, wenn jemand den CallVertrag sendet, alle Ether an den MainVertrag weitergeleitet werden, während die callFunktion im MainVertrag mit den erforderlichen Argumenten ausgeführt wird.

Ist das möglich?

Antworten (2)

Update per @Girish-Kommentar, in Solidity 0.6+ hat sich die Syntax geändert zu:address.function{value:msg.value}(arg1, arg2, arg3)


Original

Die allgemeine Syntax zum Aufrufen einer Funktion in einem anderen Vertrag mit Argumenten und zum Senden von Geldern lautet:address.func.value(amount)(arg1, arg2, arg3)

funcmuss den payableModifikator haben (für Solidity 0.4+).

Um die Antwort von @Edmund mit diesen wichtigen Details zu vervollständigen, hier ist ein Beispiel, das kompiliert:

pragma solidity ^0.4.0;

contract PayMain {
  Main main;
  function PayMain(address _m) {
     main = Main(_m);
  }
  function () payable {
    // Call the handlePayment function in the main contract
    // and forward all funds (msg.value) sent to this contract
    // and passing in the following data: msg.sender
    main.handlePayment.value(msg.value)(msg.sender);
  }
}

contract Main {
  function handlePayment(address senderAddress) payable public {
      // senderAddress in this example could be removed since msg.sender can be used directly
  }
}

Er betont auch, was er geschrieben hat:

Seien Sie sich bewusst, dass dies nur funktioniert, wenn die Leute, die das Geld senden, genug Gas schicken, um den Anruf nach Main und alles, was Sie darin tun, abzudecken.

zu Ihrem Kommentar zu msg.sender, ist der Wert von msg.senderdie Adresse vonPayMin
Ab Solidity 0.6.0 ist address.function.value(amount)(arg1, arg2, arg3) veraltet. Verwenden Sie stattdessen address.function{value:msg.value}(arg1, arg2, arg3).
@GirishThimmegowda Danke, das ich oben in der Antwort hinzugefügt habe. (Im Moment ist keine Zeit, die gesamte Antwort zu testen und zu aktualisieren.)

Ja, das ist möglich. Rufen Sie jedoch nicht call"anrufen" an - es bittet um Ärger.

Sie benötigen den Vertrag, der die Zahlung erhält, um die Adresse Ihres Hauptvertrags zu kennen. Wenn Sie sich vorstellen, dass es in einer Variablen namens main_addr gespeichert ist und Main eine Methode namens handlePayment() hat, können Sie es mit etwas wie dem folgenden aufrufen:

Main m = Main(main_addr);
m.handlePayment();

Dies kann auch Parameter annehmen, z. B. möchten Sie ihm mitteilen, was Sie eingegeben haben msg.senderund msg.value.

Seien Sie sich bewusst, dass dies nur funktioniert, wenn die Leute, die das Geld senden, genug Gas schicken, um den Anruf nach Main und alles, was Sie darin tun, abzudecken. In manchen Situationen kann es besser sein, ein Ereignis einfach im kostenpflichtigen Vertrag zu protokollieren und es später zu bearbeiten.

Könnten Sie bitte genauer sagen, wie diese Art des Aufrufs weitere Parameter annehmen kann?
Siehe Antwort von @eth.
beantwortet die Frage nicht