Created
January 27, 2017 20:40
-
-
Save evertonfraga/8e865688e35281dcc2ddbcf6a69b25ce to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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