Reembolsa algunos éteres del contrato inteligente y envía el resto a una cuenta

Digamos que queremos hacer una transacción de x ether y si (x> 20) reembolsar el 5% al ​​remitente y enviar el resto al receptor inicial original. ¿Cómo puedo implementarlo en el código de contrato inteligente e invocarlo desde la consola? ¿Debo enviar ether al contrato y la dirección del receptor en datos o algo así?

Respuestas (1)

Usando un patrón de retiro que es una buena práctica, se vería así. En caso de que no esté claro, la función se parece mucho a un cajero automático.

pragma solidity ^0.4.18;

contract Refund {

    mapping(address => uint) public balances;

    event LogDeposit(address sender, uint amount);
    event LogWithdrawal(address receiver, uint amount);

    function withdrawFunds(uint amount) public returns(bool success) {
        require(amount >= balances[msg.sender]);
        LogWithdrawal(msg.sender, amount);
        msg.sender.transfer(amount);
        return true;
    }

    function () public payable {
        require(msg.value > 0);
        uint change;
        uint dep;
        if(msg.value > 20) {
            dep = 20;
            change = msg.value - change;
        }
        balances[msg.sender] += dep;
        if(change > 0) balances[msg.sender] += change;
        LogDeposit(msg.sender, msg.value);
    }
}

Espero eso ayude.

ps Disculpas por el formato. El navegador no está jugando bien con SE hoy.