Skip to content

Instantly share code, notes, and snippets.

@critesjosh
Last active April 6, 2022 20:00
Show Gist options
  • Select an option

  • Save critesjosh/80d41928db2310684bc7660aa45873da to your computer and use it in GitHub Desktop.

Select an option

Save critesjosh/80d41928db2310684bc7660aa45873da 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;
}
}
@critesjosh
Copy link
Copy Markdown
Author

thanks for pointing that out. gist updated

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment