Transaction Hash:
Block:
10306753 at Jun-21-2020 03:39:24 AM +UTC
Transaction Fee:
0.00092708 ETH
$2.31
Gas Used:
46,354 Gas / 20 Gwei
Emitted Events:
116 |
EtherStake.onWithdraw( customerAddress=[Sender] 0xf06c2e20d39479d1451ebf10a6fcba224f69b297, ethereumWithdrawn=3439064589955619 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x2F70323D...0543E3a12 | 1,108.519504802344272289 Eth | 1,108.51606573775431667 Eth | 0.003439064589955619 | ||
0x5A0b54D5...D3E029c4c
Miner
| (Spark Pool) | 31.886554770176493952 Eth | 31.887481850176493952 Eth | 0.00092708 | |
0xf06C2E20...24f69b297 |
0.955807186281969681 Eth
Nonce: 16
|
0.9583191708719253 Eth
Nonce: 17
| 0.002511984589955619 |
Execution Trace
EtherStake.CALL( )

- ETH 0.003439064589955619
0xf06c2e20d39479d1451ebf10a6fcba224f69b297.CALL( )
[EtherStake (ln:189)]
purchaseTokens[EtherStake (ln:190)]
percent[EtherStake (ln:651)]
add[EtherStake (ln:652)]
percent[EtherStake (ln:654)]
percent[EtherStake (ln:656)]
percent[EtherStake (ln:659)]
sub[EtherStake (ln:661)]
ethereumToTokens_[EtherStake (ln:662)]
add[EtherStake (ln:670)]
distributeRefBonus[EtherStake (ln:680)]
percent[EtherStake (ln:524)]
percent[EtherStake (ln:525)]
percent[EtherStake (ln:526)]
percent[EtherStake (ln:527)]
percent[EtherStake (ln:528)]
percent[EtherStake (ln:529)]
percent[EtherStake (ln:530)]
percent[EtherStake (ln:531)]
percent[EtherStake (ln:532)]
percent[EtherStake (ln:533)]
add[EtherStake (ln:537)]
sub[EtherStake (ln:538)]
addDownlineRef[EtherStake (ln:540)]
add[EtherStake (ln:556)]
sub[EtherStake (ln:557)]
addDownlineRef[EtherStake (ln:559)]
add[EtherStake (ln:566)]
sub[EtherStake (ln:567)]
addDownlineRef[EtherStake (ln:569)]
add[EtherStake (ln:576)]
sub[EtherStake (ln:577)]
addDownlineRef[EtherStake (ln:579)]
add[EtherStake (ln:586)]
sub[EtherStake (ln:587)]
addDownlineRef[EtherStake (ln:589)]
add[EtherStake (ln:596)]
sub[EtherStake (ln:597)]
addDownlineRef[EtherStake (ln:599)]
add[EtherStake (ln:606)]
sub[EtherStake (ln:607)]
addDownlineRef[EtherStake (ln:609)]
add[EtherStake (ln:616)]
sub[EtherStake (ln:617)]
addDownlineRef[EtherStake (ln:619)]
add[EtherStake (ln:626)]
sub[EtherStake (ln:627)]
addDownlineRef[EtherStake (ln:629)]
add[EtherStake (ln:636)]
sub[EtherStake (ln:637)]
addDownlineRef[EtherStake (ln:639)]
add[EtherStake (ln:643)]
add[EtherStake (ln:683)]
add[EtherStake (ln:688)]
add[EtherStake (ln:698)]
onTokenPurchase[EtherStake (ln:702)]
pragma solidity ^0.4.20; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function percent(uint value,uint numerator, uint denominator, uint precision) internal pure returns(uint quotient) { uint _numerator = numerator * 10 ** (precision+1); uint _quotient = ((_numerator / denominator) + 5) / 10; return (value*_quotient/1000000000000000000); } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract EtherStake { /*===================================== = CONFIGURABLES = =====================================*/ string public name = "EtherStake"; string public symbol = "EST"; uint8 constant public decimals = 18; uint8 constant internal dividendFee_ = 5; uint8 constant internal referralPer_ = 20; uint8 constant internal developerFee_ = 5; uint8 internal stakePer_ = 1; uint256 constant internal tokenPriceInitial_ = 0.000001 ether; uint256 constant internal tokenPriceIncremental_ = 0.0000001 ether; uint256 constant internal tokenPriceDecremental_ = 0.0000001 ether; uint256 constant internal magnitude = 2**64; uint256 public stakingRequirement = 1e18; // Ambassador program mapping(address => bool) internal ambassadors_; uint256 constant internal ambassadorMaxPurchase_ = 1 ether; uint256 constant internal ambassadorQuota_ = 1 ether; /*================================ = DATASETS = ================================*/ mapping(address => uint256) internal tokenBalanceLedger_; mapping(address => uint256) internal stakeBalanceLedger_; mapping(address => uint256) internal stakingTime_; mapping(address => uint256) internal referralBalance_; mapping(address => address) internal referralLevel1Address; mapping(address => address) internal referralLevel2Address; mapping(address => address) internal referralLevel3Address; mapping(address => address) internal referralLevel4Address; mapping(address => address) internal referralLevel5Address; mapping(address => address) internal referralLevel6Address; mapping(address => address) internal referralLevel7Address; mapping(address => address) internal referralLevel8Address; mapping(address => address) internal referralLevel9Address; mapping(address => address) internal referralLevel10Address; mapping(address => int256) internal payoutsTo_; mapping(address => uint256) internal ambassadorAccumulatedQuota_; uint256 internal tokenSupply_ = 0; uint256 internal developerBalance = 0; uint256 internal profitPerShare_; mapping(bytes32 => bool) public administrators; bool public onlyAmbassadors = false; /*================================= = MODIFIERS = =================================*/ // Only people with tokens modifier onlybelievers () { require(myTokens() > 0); _; } // Only people with profits modifier onlyhodler() { require(myDividends(true) > 0); _; } // Only admin modifier onlyAdministrator(){ address _customerAddress = msg.sender; require(administrators[keccak256(_customerAddress)]); _; } modifier antiEarlyWhale(uint256 _amountOfEthereum){ address _customerAddress = msg.sender; if( onlyAmbassadors && ((totalEthereumBalance() - _amountOfEthereum) <= ambassadorQuota_ )){ require( // is the customer in the ambassador list? ambassadors_[_customerAddress] == true && // does the customer purchase exceed the max ambassador quota? (ambassadorAccumulatedQuota_[_customerAddress] + _amountOfEthereum) <= ambassadorMaxPurchase_ ); // updated the accumulated quota ambassadorAccumulatedQuota_[_customerAddress] = SafeMath.add(ambassadorAccumulatedQuota_[_customerAddress], _amountOfEthereum); _; } else { // in case the ether count drops low, the ambassador phase won't reinitiate onlyAmbassadors = false; _; } } /*============================== = EVENTS = ==============================*/ event onTokenPurchase( address indexed customerAddress, uint256 incomingEthereum, uint256 tokensMinted, address indexed referredBy ); event onTokenSell( address indexed customerAddress, uint256 tokensBurned, uint256 ethereumEarned ); event onReinvestment( address indexed customerAddress, uint256 ethereumReinvested, uint256 tokensMinted ); event onWithdraw( address indexed customerAddress, uint256 ethereumWithdrawn ); event Transfer( address indexed from, address indexed to, uint256 tokens ); /*======================================= = PUBLIC FUNCTIONS = =======================================*/ /* * -- APPLICATION ENTRY POINTS -- */ function EtherStake() public { // add administrators here administrators[0x089e3a572868ae970476340e46d6945a8af57e4afa653bf80126615e7f2e2b8e] = true; ambassadors_[0x0000000000000000000000000000000000000000] = true; } /** * BUY */ function buy(address _referredBy) public payable returns(uint256) { purchaseTokens(msg.value, _referredBy); } function() payable public { purchaseTokens(msg.value, 0x0); } /** * REINVEST */ function reinvest() onlyhodler() public { uint256 _dividends = myDividends(false); // retrieve ref. bonus later in the code address _customerAddress = msg.sender; payoutsTo_[_customerAddress] += (int256) (_dividends * magnitude); _dividends += referralBalance_[_customerAddress]; referralBalance_[_customerAddress] = 0; uint256 _tokens = purchaseTokens(_dividends, 0x0); // fire event onReinvestment(_customerAddress, _dividends, _tokens); } /** * EXIT */ function exit() public { address _customerAddress = msg.sender; uint256 _tokens = tokenBalanceLedger_[_customerAddress]; if(_tokens > 0) sell(_tokens); withdraw(); } /** * WITHDRAW */ function withdraw() onlyhodler() public { address _customerAddress = msg.sender; uint256 _dividends = myDividends(false); // get ref. bonus later in the code payoutsTo_[_customerAddress] += (int256) (_dividends * magnitude); _dividends += referralBalance_[_customerAddress]; referralBalance_[_customerAddress] = 0; _customerAddress.transfer(_dividends); // fire event onWithdraw(_customerAddress, _dividends); } /** * SELL */ function sell(uint256 _amountOfTokens) onlybelievers () public { address _customerAddress = msg.sender; require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]); uint256 _tokens = _amountOfTokens; uint256 _ethereum = tokensToEthereum_(_tokens); uint256 _dividends = myDividends(false); uint256 _taxedEthereum = _ethereum; tokenSupply_ = SafeMath.sub(tokenSupply_, _tokens); tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _tokens); int256 _updatedPayouts = (int256) (profitPerShare_ * _tokens + (_taxedEthereum * magnitude)); payoutsTo_[_customerAddress] -= _updatedPayouts; if (tokenSupply_ > 0) { profitPerShare_ = SafeMath.add(profitPerShare_, (_dividends * magnitude) / tokenSupply_); } onTokenSell(_customerAddress, _tokens, _taxedEthereum); } /** * TRANSFER */ function transfer(address _toAddress, uint256 _amountOfTokens) onlybelievers () public returns(bool) { address _customerAddress = msg.sender; require(!onlyAmbassadors && _amountOfTokens <= tokenBalanceLedger_[_customerAddress]); if(myDividends(true) > 0) withdraw(); uint256 _taxedTokens = _amountOfTokens; uint256 _dividends = myDividends(false); tokenSupply_ = tokenSupply_; tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _amountOfTokens); tokenBalanceLedger_[_toAddress] = SafeMath.add(tokenBalanceLedger_[_toAddress], _taxedTokens); payoutsTo_[_customerAddress] -= (int256) (profitPerShare_ * _amountOfTokens); payoutsTo_[_toAddress] += (int256) (profitPerShare_ * _taxedTokens); profitPerShare_ = SafeMath.add(profitPerShare_, (_dividends * magnitude) / tokenSupply_); Transfer(_customerAddress, _toAddress, _taxedTokens); return true; } /*---------- ADMINISTRATOR ONLY FUNCTIONS ----------*/ function disableInitialStage() onlyAdministrator() public { onlyAmbassadors = false; } function changeStakePercent(uint8 stakePercent) onlyAdministrator() public { stakePer_ = stakePercent; } function setAdministrator(bytes32 _identifier, bool _status) onlyAdministrator() public { administrators[_identifier] = _status; } function setStakingRequirement(uint256 _amountOfTokens) onlyAdministrator() public { stakingRequirement = _amountOfTokens; } function setName(string _name) onlyAdministrator() public { name = _name; } function setSymbol(string _symbol) onlyAdministrator() public { symbol = _symbol; } function withdrawDeveloperFees() external onlyAdministrator { address _adminAddress = msg.sender; _adminAddress.transfer(developerBalance); developerBalance = 0; } /*---------- CALCULATORS ----------*/ function totalEthereumBalance() public view returns(uint) { return this.balance; } function totalDeveloperBalance() public view returns(uint) { return developerBalance; } function totalSupply() public view returns(uint256) { return tokenSupply_; } function myTokens() public view returns(uint256) { address _customerAddress = msg.sender; return balanceOf(_customerAddress); } function myDividends(bool _includeReferralBonus) public view returns(uint256) { address _customerAddress = msg.sender; return _includeReferralBonus ? dividendsOf(_customerAddress) + referralBalance_[_customerAddress] : dividendsOf(_customerAddress) ; } function balanceOf(address _customerAddress) view public returns(uint256) { return tokenBalanceLedger_[_customerAddress]; } function dividendsOf(address _customerAddress) view public returns(uint256) { return (uint256) ((int256)(profitPerShare_ * (tokenBalanceLedger_[_customerAddress] + stakeBalanceLedger_[_customerAddress])) - payoutsTo_[_customerAddress]) / magnitude; } function sellPrice() public view returns(uint256) { if(tokenSupply_ == 0){ return tokenPriceInitial_ - tokenPriceDecremental_; } else { uint256 _ethereum = tokensToEthereum_(1e18); uint256 _taxedEthereum = _ethereum; return _taxedEthereum; } } function buyPrice() public view returns(uint256) { if(tokenSupply_ == 0){ return tokenPriceInitial_ + tokenPriceIncremental_; } else { uint256 _ethereum = tokensToEthereum_(1e18); uint256 untotalDeduct = developerFee_ + referralPer_ + dividendFee_; uint256 totalDeduct = SafeMath.percent(_ethereum,untotalDeduct,100,18); uint256 _taxedEthereum = SafeMath.add(_ethereum, totalDeduct); return _taxedEthereum; } } function calculateTokensReceived(uint256 _ethereumToSpend) public view returns(uint256) { uint256 untotalDeduct = developerFee_ + referralPer_ + dividendFee_; uint256 totalDeduct = SafeMath.percent(_ethereumToSpend,untotalDeduct,100,18); uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, totalDeduct); uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); return _amountOfTokens; } function calculateEthereumReceived(uint256 _tokensToSell) public view returns(uint256) { require(_tokensToSell <= tokenSupply_); uint256 _ethereum = tokensToEthereum_(_tokensToSell); uint256 _taxedEthereum = _ethereum; return _taxedEthereum; } function stakeTokens(uint256 _amountOfTokens) onlybelievers () public returns(bool){ address _customerAddress = msg.sender; require(!onlyAmbassadors && _amountOfTokens <= tokenBalanceLedger_[_customerAddress]); uint256 _amountOfTokensWith1Token = SafeMath.sub(_amountOfTokens, 1e18); stakingTime_[_customerAddress] = now; stakeBalanceLedger_[_customerAddress] = SafeMath.add(stakeBalanceLedger_[_customerAddress], _amountOfTokensWith1Token); tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _amountOfTokensWith1Token); } function stakeTokensBalance(address _customerAddress) public view returns(uint256){ uint256 timediff = SafeMath.sub(now, stakingTime_[_customerAddress]); uint256 dayscount = SafeMath.div(timediff, 86400); //86400 Sec for 1 Day uint256 roiPercent = SafeMath.mul(dayscount, stakePer_); uint256 roiTokens = SafeMath.percent(stakeBalanceLedger_[_customerAddress],roiPercent,100,18); uint256 finalBalance = SafeMath.add(stakeBalanceLedger_[_customerAddress],roiTokens); return finalBalance; } function stakeTokensTime(address _customerAddress) public view returns(uint256){ return stakingTime_[_customerAddress]; } function releaseStake() onlybelievers () public returns(bool){ address _customerAddress = msg.sender; require(!onlyAmbassadors && stakingTime_[_customerAddress] > 0); uint256 _amountOfTokens = stakeBalanceLedger_[_customerAddress]; uint256 timediff = SafeMath.sub(now, stakingTime_[_customerAddress]); uint256 dayscount = SafeMath.div(timediff, 86400); uint256 roiPercent = SafeMath.mul(dayscount, stakePer_); uint256 roiTokens = SafeMath.percent(_amountOfTokens,roiPercent,100,18); uint256 finalBalance = SafeMath.add(_amountOfTokens,roiTokens); tokenSupply_ = SafeMath.add(tokenSupply_, roiTokens); tokenBalanceLedger_[_customerAddress] = SafeMath.add(tokenBalanceLedger_[_customerAddress], finalBalance); stakeBalanceLedger_[_customerAddress] = 0; stakingTime_[_customerAddress] = 0; } /*========================================== = INTERNAL FUNCTIONS = ==========================================*/ uint256 developerFee; uint256 incETH; address _refAddress; uint256 _referralBonus; uint256 bonusLv1; uint256 bonusLv2; uint256 bonusLv3; uint256 bonusLv4; uint256 bonusLv5; uint256 bonusLv6; uint256 bonusLv7; uint256 bonusLv8; uint256 bonusLv9; uint256 bonusLv10; address chkLv2; address chkLv3; address chkLv4; address chkLv5; address chkLv6; address chkLv7; address chkLv8; address chkLv9; address chkLv10; struct RefUserDetail { address refUserAddress; uint256 refLevel; } mapping(address => mapping (uint => RefUserDetail)) public RefUser; mapping(address => uint256) public referralCount_; function getDownlineRef(address senderAddress, uint dataId) external view returns (address,uint) { return (RefUser[senderAddress][dataId].refUserAddress,RefUser[senderAddress][dataId].refLevel); } function addDownlineRef(address senderAddress, address refUserAddress, uint refLevel) internal { referralCount_[senderAddress]++; uint dataId = referralCount_[senderAddress]; RefUser[senderAddress][dataId].refUserAddress = refUserAddress; RefUser[senderAddress][dataId].refLevel = refLevel; } function getref(address _customerAddress, uint _level) public view returns(address lv) { if(_level == 1) { lv = referralLevel1Address[_customerAddress]; } else if(_level == 2) { lv = referralLevel2Address[_customerAddress]; } else if(_level == 3) { lv = referralLevel3Address[_customerAddress]; } else if(_level == 4) { lv = referralLevel4Address[_customerAddress]; } else if(_level == 5) { lv = referralLevel5Address[_customerAddress]; } else if(_level == 6) { lv = referralLevel6Address[_customerAddress]; } else if(_level == 7) { lv = referralLevel7Address[_customerAddress]; } else if(_level == 8) { lv = referralLevel8Address[_customerAddress]; } else if(_level == 9) { lv = referralLevel9Address[_customerAddress]; } else if(_level == 10) { lv = referralLevel10Address[_customerAddress]; } return lv; } function distributeRefBonus(uint256 _incomingEthereum, address _referredBy, address _sender, bool _newReferral) internal { address _customerAddress = _sender; uint256 remainingRefBonus = _incomingEthereum; _referralBonus = _incomingEthereum; bonusLv1 = SafeMath.percent(_referralBonus,35,100,18); bonusLv2 = SafeMath.percent(_referralBonus,25,100,18); bonusLv3 = SafeMath.percent(_referralBonus,10,100,18); bonusLv4 = SafeMath.percent(_referralBonus,5,100,18); bonusLv5 = SafeMath.percent(_referralBonus,3,100,18); bonusLv6 = SafeMath.percent(_referralBonus,2,100,18); bonusLv7 = SafeMath.percent(_referralBonus,2,100,18); bonusLv8 = SafeMath.percent(_referralBonus,2,100,18); bonusLv9 = SafeMath.percent(_referralBonus,1,100,18); bonusLv10 = SafeMath.percent(_referralBonus,1,100,18); referralLevel1Address[_customerAddress] = _referredBy; referralBalance_[referralLevel1Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel1Address[_customerAddress]], bonusLv1); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv1); if(_newReferral == true) { addDownlineRef(_referredBy, _customerAddress, 1); } chkLv2 = referralLevel1Address[_referredBy]; chkLv3 = referralLevel2Address[_referredBy]; chkLv4 = referralLevel3Address[_referredBy]; chkLv5 = referralLevel4Address[_referredBy]; chkLv6 = referralLevel5Address[_referredBy]; chkLv7 = referralLevel6Address[_referredBy]; chkLv8 = referralLevel7Address[_referredBy]; chkLv9 = referralLevel8Address[_referredBy]; chkLv10 = referralLevel9Address[_referredBy]; if(chkLv2 != 0x0000000000000000000000000000000000000000) { referralLevel2Address[_customerAddress] = referralLevel1Address[_referredBy]; referralBalance_[referralLevel2Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel2Address[_customerAddress]], bonusLv2); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv2); if(_newReferral == true) { addDownlineRef(referralLevel1Address[_referredBy], _customerAddress, 2); } } if(chkLv3 != 0x0000000000000000000000000000000000000000) { referralLevel3Address[_customerAddress] = referralLevel2Address[_referredBy]; referralBalance_[referralLevel3Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel3Address[_customerAddress]], bonusLv3); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv3); if(_newReferral == true) { addDownlineRef(referralLevel2Address[_referredBy], _customerAddress, 3); } } if(chkLv4 != 0x0000000000000000000000000000000000000000) { referralLevel4Address[_customerAddress] = referralLevel3Address[_referredBy]; referralBalance_[referralLevel4Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel4Address[_customerAddress]], bonusLv4); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv4); if(_newReferral == true) { addDownlineRef(referralLevel3Address[_referredBy], _customerAddress, 4); } } if(chkLv5 != 0x0000000000000000000000000000000000000000) { referralLevel5Address[_customerAddress] = referralLevel4Address[_referredBy]; referralBalance_[referralLevel5Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel5Address[_customerAddress]], bonusLv5); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv5); if(_newReferral == true) { addDownlineRef(referralLevel4Address[_referredBy], _customerAddress, 5); } } if(chkLv6 != 0x0000000000000000000000000000000000000000) { referralLevel6Address[_customerAddress] = referralLevel5Address[_referredBy]; referralBalance_[referralLevel6Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel6Address[_customerAddress]], bonusLv6); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv6); if(_newReferral == true) { addDownlineRef(referralLevel5Address[_referredBy], _customerAddress, 6); } } if(chkLv7 != 0x0000000000000000000000000000000000000000) { referralLevel7Address[_customerAddress] = referralLevel6Address[_referredBy]; referralBalance_[referralLevel7Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel7Address[_customerAddress]], bonusLv7); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv7); if(_newReferral == true) { addDownlineRef(referralLevel6Address[_referredBy], _customerAddress, 7); } } if(chkLv8 != 0x0000000000000000000000000000000000000000) { referralLevel8Address[_customerAddress] = referralLevel7Address[_referredBy]; referralBalance_[referralLevel8Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel8Address[_customerAddress]], bonusLv8); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv8); if(_newReferral == true) { addDownlineRef(referralLevel7Address[_referredBy], _customerAddress, 8); } } if(chkLv9 != 0x0000000000000000000000000000000000000000) { referralLevel9Address[_customerAddress] = referralLevel8Address[_referredBy]; referralBalance_[referralLevel9Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel9Address[_customerAddress]], bonusLv9); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv9); if(_newReferral == true) { addDownlineRef(referralLevel8Address[_referredBy], _customerAddress, 9); } } if(chkLv10 != 0x0000000000000000000000000000000000000000) { referralLevel10Address[_customerAddress] = referralLevel9Address[_referredBy]; referralBalance_[referralLevel10Address[_customerAddress]] = SafeMath.add(referralBalance_[referralLevel10Address[_customerAddress]], bonusLv10); remainingRefBonus = SafeMath.sub(remainingRefBonus, bonusLv10); if(_newReferral == true) { addDownlineRef(referralLevel9Address[_referredBy], _customerAddress, 10); } } developerBalance = SafeMath.add(developerBalance, remainingRefBonus); } function purchaseTokens(uint256 _incomingEthereum, address _referredBy) antiEarlyWhale(_incomingEthereum) internal returns(uint256) { address _customerAddress = msg.sender; incETH = _incomingEthereum; developerFee = SafeMath.percent(incETH,developerFee_,100,18); developerBalance = SafeMath.add(developerBalance, developerFee); _referralBonus = SafeMath.percent(incETH,referralPer_,100,18); uint256 _dividends = SafeMath.percent(incETH,dividendFee_,100,18); uint256 untotalDeduct = developerFee_ + referralPer_ + dividendFee_; uint256 totalDeduct = SafeMath.percent(incETH,untotalDeduct,100,18); uint256 _taxedEthereum = SafeMath.sub(incETH, totalDeduct); uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); uint256 _fee = _dividends * magnitude; bool _newReferral = true; if(referralLevel1Address[_customerAddress] != 0x0000000000000000000000000000000000000000) { _referredBy = referralLevel1Address[_customerAddress]; _newReferral = false; } require(_amountOfTokens > 0 && (SafeMath.add(_amountOfTokens,tokenSupply_) > tokenSupply_)); if( _referredBy != 0x0000000000000000000000000000000000000000 && _referredBy != _customerAddress && tokenBalanceLedger_[_referredBy] >= stakingRequirement ){ distributeRefBonus(_referralBonus,_referredBy,_customerAddress,_newReferral); } else { developerBalance = SafeMath.add(developerBalance, _referralBonus); } if(tokenSupply_ > 0){ tokenSupply_ = SafeMath.add(tokenSupply_, _amountOfTokens); profitPerShare_ += (_dividends * magnitude / (tokenSupply_)); _fee = _fee - (_fee-(_amountOfTokens * (_dividends * magnitude / (tokenSupply_)))); } else { tokenSupply_ = _amountOfTokens; } tokenBalanceLedger_[_customerAddress] = SafeMath.add(tokenBalanceLedger_[_customerAddress], _amountOfTokens); int256 _updatedPayouts = (int256) ((profitPerShare_ * _amountOfTokens) - _fee); payoutsTo_[_customerAddress] += _updatedPayouts; onTokenPurchase(_customerAddress, incETH, _amountOfTokens, _referredBy); return _amountOfTokens; } function ethereumToTokens_(uint256 _ethereum) internal view returns(uint256) { uint256 _tokenPriceInitial = tokenPriceInitial_ * 1e18; uint256 _tokensReceived = ( ( SafeMath.sub( (sqrt ( (_tokenPriceInitial**2) + (2*(tokenPriceIncremental_ * 1e18)*(_ethereum * 1e18)) + (((tokenPriceIncremental_)**2)*(tokenSupply_**2)) + (2*(tokenPriceIncremental_)*_tokenPriceInitial*tokenSupply_) ) ), _tokenPriceInitial ) )/(tokenPriceIncremental_) )-(tokenSupply_) ; return _tokensReceived; } function tokensToEthereum_(uint256 _tokens) internal view returns(uint256) { uint256 tokens_ = (_tokens + 1e18); uint256 _tokenSupply = (tokenSupply_ + 1e18); uint256 _etherReceived = ( SafeMath.sub( ( ( ( tokenPriceInitial_ +(tokenPriceDecremental_ * (_tokenSupply/1e18)) )-tokenPriceDecremental_ )*(tokens_ - 1e18) ),(tokenPriceDecremental_*((tokens_**2-tokens_)/1e18))/2 ) /1e18); return _etherReceived; } function sqrt(uint x) internal pure returns (uint y) { uint z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } }