address.transfer funktioniert nicht

pragma solidity ^0.4.23;

contract ApprovalContract {
address public sender;
address public receiver;

address public constant approver = 0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE;

constructor() public {
// tbd
}
function deposit(address _receiver) external payable {
    require(msg.value > 0);
    sender = msg.sender;
    receiver = _receiver;
}

function viewApprover() external pure returns(address){
    return(approver);
}

function viewRe() external pure returns(address){
    return(receiver);
}


function approve() external payable{
    require(msg.sender == approver);

    receiver.transfer(address(this).balance); // this line not working

}
}

Ich erhalte die Übertragungsvariable nicht sichtbar.

Member "transfer" nicht gefunden oder nach argumentabhängiger Suche in Adresse nicht sichtbar.

Antworten (6)

Verwenden

address payable public receiver;

in der Erklärung für die Adressen, die Sie Ether im Vertrag übertragen möchten. Gemäß der Soliditätsdokumentation:

Den Adresstyp gibt es in zwei Varianten, die weitgehend identisch sind:

address: Enthält einen 20-Byte-Wert (Größe einer Ethereum-Adresse).

address payable: Wie Adresse, aber mit den zusätzlichen Mitgliedern übertragen und versenden. Die Idee hinter dieser Unterscheidung ist, dass die zahlbare Adresse eine Adresse ist, an die Sie Ether senden können, während eine einfache Adresse nicht Ether gesendet werden kann.

Das stimmt in Solidity 0.5.x, aber der ursprüngliche Code in der Frage scheint Solidity 0.4.x zu verwenden, wo es address payablenoch nicht existiert. Das heißt, der ursprüngliche Code lässt sich gut in 0.4.x modulo a kompilieren, puredas ein view. Ich weiß also nicht, welche Compiler-Version tatsächlich verwendet wird. :-)
IMO kann nur ein Fehler auftreten, wenn der Compiler 0.5.0 ist. @sumeet Bitte klären Sie es
Nur weil es sagt, pragma solidity ^0.4.23;heißt das nicht, dass es diese Version verwendet. Wenn der Vertrag in einen anderen Vertrag mit der Compilerversion 0.5.0 importiert wird, wird er mit 0.5.0 kompiliert und gibt diesen Fehler aus.

Sie können jederzeit addressauf Folgendes übertragen payable address:

address(uint160(receiver)).transfer(...);
es sagtDeclarationError: Undeclared identifier.

Sie können diese ausprobieren ... indem Sie einfach die letzte Zeile ändern.

 function approve() external {
require(msg.sender == approver);
address(this).balance;

} }

Bei mir hat es nach diesem Code funktioniert.

function approve() external payable{
    require(msg.sender == approver);

  address(uint160(receiver)).transfer(address(this).balance);
}

Ich habe die ursprüngliche Empfängerdeklaration geändert in:

    address payable public receiver;

Dann habe ich den "receiver.transfer ..." geändert in:

     address(uint160(receiver)).transfer(address(this).balance);

Ich habe immer noch einen Fehler, der besagte:

Typ Adresse ist nicht implizit in den erwarteten Typ Adresse zahlbar umwandelbar. Empfänger = _Empfänger;

Also habe ich die Deklaration "function deposit..." geändert in:

    function deposit(address payable _receiver) external payable{

Und jetzt funktioniert es!

Mein Gesamtcode sieht jetzt so aus

pragma solidity ^0.5.16;

contract ApprovalContract {

    address public sender;
    address payable public receiver;
    address public constant approver = (your own test address);

    function deposit(address payable _receiver) external payable{
        require(msg.value > 0);
        sender = msg.sender;
        receiver = _receiver;
    }

    function viewApprover() external pure returns(address) {
        return(approver);
    }

    function approve() external {
        require(msg.sender == approver);
        address(uint160(receiver)).transfer(address(this).balance);
    }
}

Wechseln Sie address public receiverzu address payable receiver.