Skip to content

Instantly share code, notes, and snippets.

@dwardu
Forked from critesjosh/Splitter.sol
Last active June 21, 2018 10:52
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 dwardu/d5a5783cba8e7b0eedaa5ab913bd7c92 to your computer and use it in GitHub Desktop.
Save dwardu/d5a5783cba8e7b0eedaa5ab913bd7c92 to your computer and use it in GitHub Desktop.
A contract to split funds between addresses. Demostrates pushing vs pulling transfers
pragma solidity ^0.4.6;
contract Splitter {
mapping(address => uint) public balances;
function unsafeSplit(address address1, address address2)
public
payable
returns(bool success)
{
require(msg.value > 1);
require(address1 != address(0));
require(address2 != address(0));
uint amount = (msg.value - (msg.value % 2)) / 2;
address1.transfer(amount); // if either transfer fails, the function stops executing
address2.transfer(amount); //
msg.sender.transfer(msg.value % 2);
return true;
}
function split(address address1, address address2) // no external calls, so it will not fail
public
payable
returns(bool success)
{
require(2 <= msg.value);
require(msg.value % 2 == 0);
require(address1 != address(0));
require(address2 != address(0));
uint amount = msg.value / 2;
balances[address1] += amount;
balances[address2] += amount;
return true;
}
function withdraw()
public
returns(bool success)
{
require(0 < balances[msg.sender]);
uint256 amountToTransfer = balances[msg.sender];
balances[msg.sender] = 0;
msg.sender.transfer(amountToTransfer);
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment