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í?
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.