Skip to content

Instantly share code, notes, and snippets.

@evertonfraga
Created January 27, 2017 20:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evertonfraga/8e865688e35281dcc2ddbcf6a69b25ce to your computer and use it in GitHub Desktop.
Save evertonfraga/8e865688e35281dcc2ddbcf6a69b25ce to your computer and use it in GitHub Desktop.
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
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment