pragma solidity ^0.4.21; contract P3D { uint256 public stakingRequirement; function buy(address _referredBy) public payable returns(uint256) {} function balanceOf(address _customerAddress) view public returns(uint256) {} function exit() public {} function withdraw() public {} function reinvest() public {} function sell(uint256 _amountOfTokens) public {} function myDividends(bool _includeReferralBonus) public view returns(uint256) {} } contract Hodler { P3D constant public p3d = P3D(0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe); R3D public r3d; address public owner; constructor(address _owner) public { owner = _owner; r3d = R3D(msg.sender); } modifier onlyR3D() { require(msg.sender == address(r3d)); _; } function buy() public onlyR3D() payable { p3d.buy.value(msg.value)(address(0)); } function reinvest(address _sender) public onlyR3D() returns(uint256) { // sender must have a master node require(p3d.balanceOf(_sender) >= p3d.stakingRequirement()); // withdraw dividends p3d.withdraw(); // reinvest them with a referral fee for sender p3d.buy.value(address(this).balance)(_sender); } function sell(uint256 _amountOfTokens) public onlyR3D() { p3d.sell(_amountOfTokens); owner.transfer(address(this).balance); } function withdraw() public onlyR3D() { p3d.withdraw(); owner.transfer(address(this).balance); } function exit() public onlyR3D() { p3d.exit(); selfdestruct(owner); } function myDividends(bool _includeReferralBonus) public view returns (uint256) { return p3d.myDividends(_includeReferralBonus); } } contract R3D { P3D constant public p3d = P3D(0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe); mapping (address => Hodler) public hodlers; event CreateHodler(address indexed owner, address indexed hodler); modifier onlyOwners(address _owner) { require(address(hodlers[_owner]) != address(0)); _; } function buy() public payable { // msg must have some value require(msg.value != 0); // get hodler contract Hodler hodler = hodlers[msg.sender]; // create a hodler if this address doesn't have one if (address(hodler) == address(0)) { hodler = new Hodler(msg.sender); hodlers[msg.sender] = hodler; emit CreateHodler(msg.sender, address(hodler)); } // purchase p3d hodler.buy.value(msg.value)(); } function reinvest(address _owner) public onlyOwners(_owner) { Hodler hodler = hodlers[_owner]; hodler.reinvest(msg.sender); } function sell(uint256 _amountOfTokens) public onlyOwners(msg.sender) { Hodler hodler = hodlers[msg.sender]; hodler.sell(_amountOfTokens); } function withdraw() public onlyOwners(msg.sender) { Hodler hodler = hodlers[msg.sender]; hodler.withdraw(); } function exit() public onlyOwners(msg.sender) { Hodler hodler = hodlers[msg.sender]; hodler.exit(); } function dividendsOf(address _owner, bool _includeReferralBonus) public view onlyOwners(_owner) returns (uint256) { Hodler hodler = hodlers[_owner]; return hodler.myDividends(_includeReferralBonus); } }
0.4.21