Vertrag-zu-Vertrag-Transaktion mit Ether

Ich habe einige Probleme beim Erstellen von zwei interagierenden Verträgen. Der erste Vertrag soll Ether von einem Benutzer an einer Funktion payRate() erhalten und den Betrag an einen anderen Vertrag weiterleiten, der im Adresspool gespeichert ist. Beide Funktionen (die payRate()- und die ReceivePayment()-Funktion) sind zahlbar und ReceivePayment() funktioniert, wenn sie von einem Benutzer aufgerufen wird. Das Schürfen der Verträge funktioniert gut, aber die Verwendung der Funktionen schlägt fehl. Ich habe auch verschiedene Versionen mit kleinen festen Mengen Ether ausprobiert, das gleiche Ergebnis.

Als Umgebung habe ich Visual Studio Code mit der Solidity Extension als Compiler und Parity (dev. chain) verwendet.

    pragma solidity ^0.4.18;

    contract sendEther {

    address owner;
    address pool;
    uint amountPaid;

    function sendEther(address _pool) public {
    pool = _pool;
    owner = msg.sender;
    }

    function payRate() payable {
       require(pool != address(0));

       pool.transfer(msg.value);
       amountPaid += msg.value;

       //other ways of sending i tried:
       //TransactionPool test = TransactionPool(pool);
       //test.receivePayment().value(msg.value);

       //pool.call.value(msg.value)(bytes4(keccak256("receivePayment()")));
    }
    }

Und

    pragma solidity ^0.4.18;

    contract TransactionPool {

    address owner;
    uint totalPayments;

    function TransactionPool() public {
       owner = msg.sender;
    }

    function receivePayment() public payable {
       totalPayments += msg.value;
    }

    function() payable public { //fallback function
       totalPayments += msg.value;
    }
    }

Danke!

Welche Fehlermeldung erhalten Sie?

Antworten (1)

Überprüfen Sie die Syntax, um einen externen Aufruf in Solidity-Dokumenten zu tätigen

function payRate() payable {
   require(pool != address(0));

   amountPaid += msg.value;

   TransactionPool(pool).receivePayment.value(msg.value)();
}

Der Fehler besteht darin, pool.transfer(msg.value);dass die Fallback-Funktion des Pools mit nur 2300 Benzinstipendien aufgerufen wird, und der Fallback des Pools versucht, totalPayments zu ändern und kein Benzin mehr zu haben.