SplitPayment.sol 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. pragma solidity ^0.4.24;
  2. import "../math/SafeMath.sol";
  3. /**
  4. * @title SplitPayment
  5. * @dev Base contract that supports multiple payees claiming funds sent to this contract
  6. * according to the proportion they own.
  7. */
  8. contract SplitPayment {
  9. using SafeMath for uint256;
  10. uint256 public totalShares = 0;
  11. uint256 public totalReleased = 0;
  12. mapping(address => uint256) public shares;
  13. mapping(address => uint256) public released;
  14. address[] public payees;
  15. /**
  16. * @dev Constructor
  17. */
  18. constructor(address[] _payees, uint256[] _shares) public payable {
  19. require(_payees.length == _shares.length);
  20. require(_payees.length > 0);
  21. for (uint256 i = 0; i < _payees.length; i++) {
  22. _addPayee(_payees[i], _shares[i]);
  23. }
  24. }
  25. /**
  26. * @dev payable fallback
  27. */
  28. function () external payable {}
  29. /**
  30. * @dev Claim your share of the balance.
  31. */
  32. function claim() public {
  33. address payee = msg.sender;
  34. require(shares[payee] > 0);
  35. uint256 totalReceived = address(this).balance.add(totalReleased);
  36. uint256 payment = totalReceived.mul(
  37. shares[payee]).div(
  38. totalShares).sub(
  39. released[payee]
  40. );
  41. require(payment != 0);
  42. assert(address(this).balance >= payment);
  43. released[payee] = released[payee].add(payment);
  44. totalReleased = totalReleased.add(payment);
  45. payee.transfer(payment);
  46. }
  47. /**
  48. * @dev Add a new payee to the contract.
  49. * @param _payee The address of the payee to add.
  50. * @param _shares The number of shares owned by the payee.
  51. */
  52. function _addPayee(address _payee, uint256 _shares) internal {
  53. require(_payee != address(0));
  54. require(_shares > 0);
  55. require(shares[_payee] == 0);
  56. payees.push(_payee);
  57. shares[_payee] = _shares;
  58. totalShares = totalShares.add(_shares);
  59. }
  60. }