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

 */