pragma solidity ^0.4.5; /* Ether Splitter é um simples contrato que divide o ether enviado entre dois endereços. */ contract EtherSplitter { // Definição de evento. event Transfer(address _to, uint256 _amount); // Construtor vazio function EtherSplitter() {} // Dois argumentos, correspondentes aos endereços de destino. // Modifier `payable` diz que esta função pode receber ether function transferTo2(address _to1, address _to2) payable { // Simples tratamento de erro. // Interrompe a execução caso seja enviado 0 ou 1 wei (unidade mínima do ether) if (msg.value < 2 wei) throw; // Calcula a metade. Em nosso caso, poderíamos escolher o que fazer com o resto da divisão. // Aqui a segunda parte receberia a metade + resto. Poderíamos também deixar o resto no contrato, // ou transferir de volta para o endereço de origem da transação. uint256 amount = msg.value/2; // [address].send(valor) é o método que transfere ether para outro endereço. // Aqui estamos transferindo metade do valor if (!_to1.send(amount)) throw; // Evento de notificação Transfer(_to1, amount); // Transferindo para segunda parte. if (!_to2.send(msg.value - amount)) throw; // Evento de notificação Transfer(_to2, msg.value - amount); } } /* Possibilidades a partir deste contrato: 1) Transferir para N destinatários. Criar um array de endereços que fica salvo no contrato, que representaria as partes que receberão todo o ether transferido. + function addShareholder(address _newAddress) // adicionar um endereço ao array + function removeShareholder(address _newAddress) // remover endereço do array + function transfer() payable // transferir, sem parâmetros, para todas as partes 2) Restringir uso do contrato para apenas quem o criou Envolve o uso de `msg.sender` no constructor do contrato para verificação posterior. 3) Definir quotas (%) para cada endereço Dentre as opções disponíveis, poderia-se criar um `mapping address => uint` com a quantidade de quotas, semelhante ao sistema de shares americano. Ao executar o método `function transfer() payable`, ele transferiria proporcionalmente para as partes. + function addShareholder(address _addr, uint256 _quota) + function editShareholder(address _addr, uint256 _newQuota) + function removeShareholder(address _addr, uint256 _newQuota) + function transfer() payable */