Skip to content

Instantly share code, notes, and snippets.

@mcne65
Forked from critesjosh/Splitter.sol
Created February 1, 2020 11:48
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 mcne65/9105d6b19feb6f28ea7946da2465fe83 to your computer and use it in GitHub Desktop.
Save mcne65/9105d6b19feb6f28ea7946da2465fe83 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(msg.value > 1);
require(address1 != address(0));
require(address2 != address(0));
uint amount = (msg.value - (msg.value % 2)) / 2;
balances[address1] += amount;
balances[address2] += amount;
balances[msg.sender] += msg.value % 2;
return true;
}
function withdraw()
public
returns(bool success)
{
require(balances[msg.sender] > 0);
uint amount = balances[msg.sender];
balances[msg.sender] = 0;
msg.sender.transfer(amount);
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment