Transaction Hash:
Block:
8985609 at Nov-23-2019 09:23:18 AM +UTC
Transaction Fee:
0.000057312 ETH
$0.14
Gas Used:
57,312 Gas / 1 Gwei
Emitted Events:
171 |
CryptoHands.getMoneyForLevelEvent( _user=0xef4872760ab1f1c87d409fe3ad3de53a90f2314c, _referral=[Sender] 0x58ed0e8af1d471d204e4aa2ad22019006e83c54e, _level=2, _time=1574500998 )
|
172 |
CryptoHands.buyLevelEvent( _user=[Sender] 0x58ed0e8af1d471d204e4aa2ad22019006e83c54e, _level=2, _time=1574500998 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x58Ed0e8a...06E83C54E |
0.16772563 Eth
Nonce: 1
|
0.017668318 Eth
Nonce: 2
| 0.150057312 | ||
0xA315bD2e...7EAFf9cb4 | (CryptoHands) | ||||
0xb2930B35...e543a0347
Miner
| (MiningPoolHub: Old Address) | 9,359.076719984359460298 Eth | 9,359.076777296359460298 Eth | 0.000057312 | |
0xef487276...a90F2314c | 0.05642783101139712 Eth | 0.20642783101139712 Eth | 0.15 |
Execution Trace
ETH 0.15
CryptoHands.CALL( )

- ETH 0.15
0xef4872760ab1f1c87d409fe3ad3de53a90f2314c.CALL( )
[CryptoHands (ln:142)]
revert[CryptoHands (ln:163)]
buyLevel[CryptoHands (ln:167)]
payForLevel[CryptoHands (ln:248)]
send[CryptoHands (ln:280)]
getMoneyForLevelEvent[CryptoHands (ln:281)]
lostMoneyForLevelEvent[CryptoHands (ln:283)]
payForLevel[CryptoHands (ln:284)]
buyLevelEvent[CryptoHands (ln:249)]
bytesToAddress[CryptoHands (ln:170)]
revert[CryptoHands (ln:175)]
regUser[CryptoHands (ln:178)]
findFreeReferrer[CryptoHands (ln:194)]
UserStruct[CryptoHands (ln:201)]
push[CryptoHands (ln:220)]
payForLevel[CryptoHands (ln:222)]
send[CryptoHands (ln:280)]
getMoneyForLevelEvent[CryptoHands (ln:281)]
lostMoneyForLevelEvent[CryptoHands (ln:283)]
payForLevel[CryptoHands (ln:284)]
regLevelEvent[CryptoHands (ln:224)]
revert[CryptoHands (ln:180)]
/* $$$$$$\ $$\ $$\ $$\ $$\ $$ __$$\ $$ | $$ | $$ | $$ | $$ / \__| $$$$$$\ $$\ $$\ $$$$$$\ $$$$$$\ $$$$$$\ $$ | $$ | $$$$$$\ $$$$$$$\ $$$$$$$ | $$$$$$$\ $$ | $$ __$$\ $$ | $$ |$$ __$$\\_$$ _| $$ __$$\ $$$$$$$$ | \____$$\ $$ __$$\ $$ __$$ |$$ _____| $$ | $$ | \__|$$ | $$ |$$ / $$ | $$ | $$ / $$ |$$ __$$ | $$$$$$$ |$$ | $$ |$$ / $$ |\$$$$$$\ $$ | $$\ $$ | $$ | $$ |$$ | $$ | $$ |$$\ $$ | $$ |$$ | $$ |$$ __$$ |$$ | $$ |$$ | $$ | \____$$\ \$$$$$$ |$$ | \$$$$$$$ |$$$$$$$ | \$$$$ |\$$$$$$ |$$ | $$ |\$$$$$$$ |$$ | $$ |\$$$$$$$ |$$$$$$$ | \______/ \__| \____$$ |$$ ____/ \____/ \______/ \__| \__| \_______|\__| \__| \_______|\_______/ $$\ $$ |$$ | \$$$$$$ |$$ | \______/ \__| telegram: @cryptohands hashtag: #cryptohands */ pragma solidity ^0.5.7; library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a / b; 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 Ownable { address public owner; address public manager; address public ownerWallet; constructor() public { owner = msg.sender; manager = msg.sender; ownerWallet = 0xd5E9F24607CA70910973dC2149f9B780f84d8839; } modifier onlyOwner() { require(msg.sender == owner, "only for owner"); _; } modifier onlyOwnerOrManager() { require((msg.sender == owner)||(msg.sender == manager), "only for owner or manager"); _; } function transferOwnership(address newOwner) public onlyOwner { owner = newOwner; } function setManager(address _manager) public onlyOwnerOrManager { manager = _manager; } } contract CryptoHands is Ownable { event regLevelEvent(address indexed _user, address indexed _referrer, uint _time); event buyLevelEvent(address indexed _user, uint _level, uint _time); event prolongateLevelEvent(address indexed _user, uint _level, uint _time); event getMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time); event lostMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time); //------------------------------ mapping (uint => uint) public LEVEL_PRICE; uint REFERRER_1_LEVEL_LIMIT = 3; uint PERIOD_LENGTH = 365 days; struct UserStruct { bool isExist; uint id; uint referrerID; address[] referral; mapping (uint => uint) levelExpired; } mapping (address => UserStruct) public users; mapping (uint => address) public userList; uint public currUserID = 0; constructor() public { LEVEL_PRICE[1] = 0.05 ether; LEVEL_PRICE[2] = 0.15 ether; LEVEL_PRICE[3] = 0.45 ether; LEVEL_PRICE[4] = 1.35 ether; LEVEL_PRICE[5] = 4.05 ether; LEVEL_PRICE[6] = 12.15 ether; LEVEL_PRICE[7] = 36.45 ether; LEVEL_PRICE[8] = 109.35 ether; UserStruct memory userStruct; currUserID++; userStruct = UserStruct({ isExist : true, id : currUserID, referrerID : 0, referral : new address[](0) }); users[ownerWallet] = userStruct; userList[currUserID] = ownerWallet; users[ownerWallet].levelExpired[1] = 77777777777; users[ownerWallet].levelExpired[2] = 77777777777; users[ownerWallet].levelExpired[3] = 77777777777; users[ownerWallet].levelExpired[4] = 77777777777; users[ownerWallet].levelExpired[5] = 77777777777; users[ownerWallet].levelExpired[6] = 77777777777; users[ownerWallet].levelExpired[7] = 77777777777; users[ownerWallet].levelExpired[8] = 77777777777; } function () external payable { uint level; if(msg.value == LEVEL_PRICE[1]){ level = 1; }else if(msg.value == LEVEL_PRICE[2]){ level = 2; }else if(msg.value == LEVEL_PRICE[3]){ level = 3; }else if(msg.value == LEVEL_PRICE[4]){ level = 4; }else if(msg.value == LEVEL_PRICE[5]){ level = 5; }else if(msg.value == LEVEL_PRICE[6]){ level = 6; }else if(msg.value == LEVEL_PRICE[7]){ level = 7; }else if(msg.value == LEVEL_PRICE[8]){ level = 8; }else { revert('Incorrect Value send'); } if(users[msg.sender].isExist){ buyLevel(level); } else if(level == 1) { uint refId = 0; address referrer = bytesToAddress(msg.data); if (users[referrer].isExist){ refId = users[referrer].id; } else { revert('Incorrect referrer'); } regUser(refId); } else { revert("Please buy first level for 0.05 ETH"); } } function regUser(uint _referrerID) public payable { require(!users[msg.sender].isExist, 'User exist'); require(_referrerID > 0 && _referrerID <= currUserID, 'Incorrect referrer Id'); require(msg.value==LEVEL_PRICE[1], 'Incorrect Value'); if(users[userList[_referrerID]].referral.length >= REFERRER_1_LEVEL_LIMIT) { _referrerID = users[findFreeReferrer(userList[_referrerID])].id; } UserStruct memory userStruct; currUserID++; userStruct = UserStruct({ isExist : true, id : currUserID, referrerID : _referrerID, referral : new address[](0) }); users[msg.sender] = userStruct; userList[currUserID] = msg.sender; users[msg.sender].levelExpired[1] = now + PERIOD_LENGTH; users[msg.sender].levelExpired[2] = 0; users[msg.sender].levelExpired[3] = 0; users[msg.sender].levelExpired[4] = 0; users[msg.sender].levelExpired[5] = 0; users[msg.sender].levelExpired[6] = 0; users[msg.sender].levelExpired[7] = 0; users[msg.sender].levelExpired[8] = 0; users[userList[_referrerID]].referral.push(msg.sender); payForLevel(1, msg.sender); emit regLevelEvent(msg.sender, userList[_referrerID], now); } function buyLevel(uint _level) public payable { require(users[msg.sender].isExist, 'User not exist'); require( _level>0 && _level<=8, 'Incorrect level'); if(_level == 1){ require(msg.value==LEVEL_PRICE[1], 'Incorrect Value'); users[msg.sender].levelExpired[1] += PERIOD_LENGTH; } else { require(msg.value==LEVEL_PRICE[_level], 'Incorrect Value'); for(uint l =_level-1; l>0; l-- ){ require(users[msg.sender].levelExpired[l] >= now, 'Buy the previous level'); } if(users[msg.sender].levelExpired[_level] == 0){ users[msg.sender].levelExpired[_level] = now + PERIOD_LENGTH; } else { users[msg.sender].levelExpired[_level] += PERIOD_LENGTH; } } payForLevel(_level, msg.sender); emit buyLevelEvent(msg.sender, _level, now); } function payForLevel(uint _level, address _user) internal { address referer; address referer1; address referer2; address referer3; if(_level == 1 || _level == 5){ referer = userList[users[_user].referrerID]; } else if(_level == 2 || _level == 6){ referer1 = userList[users[_user].referrerID]; referer = userList[users[referer1].referrerID]; } else if(_level == 3 || _level == 7){ referer1 = userList[users[_user].referrerID]; referer2 = userList[users[referer1].referrerID]; referer = userList[users[referer2].referrerID]; } else if(_level == 4 || _level == 8){ referer1 = userList[users[_user].referrerID]; referer2 = userList[users[referer1].referrerID]; referer3 = userList[users[referer2].referrerID]; referer = userList[users[referer3].referrerID]; } if(!users[referer].isExist){ referer = userList[1]; } if(users[referer].levelExpired[_level] >= now ){ bool result; result = address(uint160(referer)).send(LEVEL_PRICE[_level]); emit getMoneyForLevelEvent(referer, msg.sender, _level, now); } else { emit lostMoneyForLevelEvent(referer, msg.sender, _level, now); payForLevel(_level,referer); } } function findFreeReferrer(address _user) public view returns(address) { if(users[_user].referral.length < REFERRER_1_LEVEL_LIMIT){ return _user; } address[] memory referrals = new address[](363); referrals[0] = users[_user].referral[0]; referrals[1] = users[_user].referral[1]; referrals[2] = users[_user].referral[2]; address freeReferrer; bool noFreeReferrer = true; for(uint i =0; i<363;i++){ if(users[referrals[i]].referral.length == REFERRER_1_LEVEL_LIMIT){ if(i<120){ referrals[(i+1)*3] = users[referrals[i]].referral[0]; referrals[(i+1)*3+1] = users[referrals[i]].referral[1]; referrals[(i+1)*3+2] = users[referrals[i]].referral[2]; } }else{ noFreeReferrer = false; freeReferrer = referrals[i]; break; } } require(!noFreeReferrer, 'No Free Referrer'); return freeReferrer; } function viewUserReferral(address _user) public view returns(address[] memory) { return users[_user].referral; } function viewUserLevelExpired(address _user, uint _level) public view returns(uint) { return users[_user].levelExpired[_level]; } function bytesToAddress(bytes memory bys) private pure returns (address addr ) { assembly { addr := mload(add(bys, 20)) } } }