Transaction Hash:
Block:
10324467 at Jun-23-2020 09:29:29 PM +UTC
Transaction Fee:
0.00216102 ETH
$4.13
Gas Used:
72,034 Gas / 30 Gwei
Emitted Events:
| 104 |
DoubleWay.getMoneyForLevelEvent( _user=0x60d555d003a5cc3da03fce03633b8cab998930f9, _referral=[Sender] 0x861b823ff394c0a569d30130ebbbef5f25b27a22, _level=2, _time=1592947769 )
|
| 105 |
DoubleWay.buyLevelEvent( _user=[Sender] 0x861b823ff394c0a569d30130ebbbef5f25b27a22, _level=2, _time=1592947769 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x60D555d0...b998930F9 | 0.1888633163223328 Eth | 0.3488633163223328 Eth | 0.16 | ||
|
0x829BD824...93333A830
Miner
| (F2Pool Old) | 6,659.838044952197322309 Eth | 6,659.840205972197322309 Eth | 0.00216102 | |
| 0x861b823F...f25b27A22 |
1.869559022613533997 Eth
Nonce: 122
|
1.707398002613533997 Eth
Nonce: 123
| 0.16216102 | ||
| 0xA22c1B53...105562296 | (Doubleway.io) |
Execution Trace
ETH 0.16
DoubleWay.CALL( )
DoubleWay.getUserReferrer( _user=0xBBa136560A09a9E3E6257597aa67E68cc6840786, _level=1 ) => ( 0x60D555d003A5cC3Da03fcE03633B8CAb998930F9 )
-
DoubleWay.getUserReferrer( _user=0x60D555d003A5cC3Da03fcE03633B8CAb998930F9, _level=0 ) => ( 0x60D555d003A5cC3Da03fcE03633B8CAb998930F9 )
-
- ETH 0.16
0x60d555d003a5cc3da03fce03633b8cab998930f9.CALL( )
[DoubleWay (ln:138)]
revert[DoubleWay (ln:159)]buyLevel[DoubleWay (ln:163)]payForLevel[DoubleWay (ln:234)]getUserReferrer[DoubleWay (ln:240)]getUserReferrer[DoubleWay (ln:290)]
send[DoubleWay (ln:248)]getMoneyForLevelEvent[DoubleWay (ln:249)]lostMoneyForLevelEvent[DoubleWay (ln:251)]payForLevel[DoubleWay (ln:252)]
buyLevelEvent[DoubleWay (ln:235)]
bytesToAddress[DoubleWay (ln:166)]viewCHUser[DoubleWay (ln:171)]users[DoubleWay (ln:308)]
findCHReferrer[DoubleWay (ln:174)]userList[DoubleWay (ln:317)]chUplineLogEvent[DoubleWay (ln:320)]chUplineLogEvent[DoubleWay (ln:323)]viewCHUser[DoubleWay (ln:324)]users[DoubleWay (ln:308)]
findCHReferrer[DoubleWay (ln:325)]
revert[DoubleWay (ln:177)]regUser[DoubleWay (ln:181)]findFreeReferrer[DoubleWay (ln:191)]UserStruct[DoubleWay (ln:198)]push[DoubleWay (ln:210)]payForLevel[DoubleWay (ln:212)]getUserReferrer[DoubleWay (ln:240)]getUserReferrer[DoubleWay (ln:290)]
send[DoubleWay (ln:248)]getMoneyForLevelEvent[DoubleWay (ln:249)]lostMoneyForLevelEvent[DoubleWay (ln:251)]payForLevel[DoubleWay (ln:252)]
regLevelEvent[DoubleWay (ln:214)]
revert[DoubleWay (ln:183)]
/*
| \ | \ | \ | \ _ | \
| $$$$$$$\ ______ __ __ | $$____ | $$ ______ | $$ / \ | $$ ______ __ __
| $$ | $$ / \ | \ | \| $$ \ | $$ / \ | $$/ $\| $$ | \ | \ | \
| $$ | $$| $$$$$$\| $$ | $$| $$$$$$$\| $$| $$$$$$\| $$ $$$\ $$ \$$$$$$\| $$ | $$
| $$ | $$| $$ | $$| $$ | $$| $$ | $$| $$| $$ $$| $$ $$\$$\$$ / $$| $$ | $$
| $$__/ $$| $$__/ $$| $$__/ $$| $$__/ $$| $$| $$$$$$$$| $$$$ \$$$$| $$$$$$$| $$__/ $$
| $$ $$ \$$ $$ \$$ $$| $$ $$| $$ \$$ \| $$$ \$$$ \$$ $$ \$$ $$
\$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$ \$$$$$$$ \$$ \$$ \$$$$$$$ _\$$$$$$$
| \__| $$
\$$ $$
\$$$$$$
Telegram Chat EN: @doublewaychat
Telegram Chat CN: @doublewaychatCN
Telegram Chat RU: @doublewaychatRU
Telegram Chat ES: @doublewaychatES
Telegram Channel: @doubleway
Hashtag: #doubleway
*/
pragma solidity ^0.5.14;
contract DoubleWay {
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);
event chUplineLogEvent(address indexed _chUpline, uint _idCh, uint _idDw);
address ownerWallet = 0xd5E9F24607CA70910973dC2149f9B780f84d8839;//0x46B78099611d50e1b0d200Fb0d43e6B3dFBA81C7;//0xd5E9F24607CA70910973dC2149f9B780f84d8839;
mapping (uint => uint) public LEVEL_PRICE;
uint REFERRER_1_LEVEL_LIMIT = 2;
uint PERIOD_LENGTH = 64 days;
uint RENEWAL_NOT_EARLIER = 64 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;
CryptoHands CRYPTO_HANDS = CryptoHands(0xA315bD2e3227C2ab71f1350644B01757EAFf9cb4);
uint public START_TIME = 1576800000; // Friday, 20 December 2019 г., 0:00:00
uint public END_OF_PERIOD_1 = START_TIME + 1 days;
uint public END_OF_PERIOD_2 = START_TIME + 2 days;
uint public END_OF_PERIOD_3 = START_TIME + 3 days;
uint public END_OF_PERIOD_4 = START_TIME + 5 days;
uint public END_OF_PERIOD_5 = START_TIME + 8 days;
uint public END_OF_PERIOD_6 = START_TIME + 13 days;
uint public END_OF_PERIOD_7 = START_TIME + 21 days;
uint public ID_OF_PERIOD_1 = 16;
uint public ID_OF_PERIOD_2 = 32;
uint public ID_OF_PERIOD_3 = 64;
uint public ID_OF_PERIOD_4 = 128;
uint public ID_OF_PERIOD_5 = 256;
uint public ID_OF_PERIOD_6 = 512;
modifier priorityRegistration() {
require(now >= START_TIME, 'The time has not come yet');
if(now <= END_OF_PERIOD_7){
(bool isExist, uint256 id, uint256 referrerID) = viewCHUser(msg.sender);
require(isExist, 'You must be registered in CryptoHands');
if(now > END_OF_PERIOD_6){
require( ( CRYPTO_HANDS.viewUserLevelExpired(msg.sender,1) > now ), 'You must be registered in CryptoHands');
} else if(now > END_OF_PERIOD_5){
require( ( id<=ID_OF_PERIOD_6 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,2) > now ), 'You must have level 2 in CryptoHands, or id <= 512');
} else if(now > END_OF_PERIOD_4){
require( ( id<=ID_OF_PERIOD_5 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,3) > now ), 'You must have level 3 in CryptoHands, or id <= 256');
} else if(now > END_OF_PERIOD_3){
require( ( id<=ID_OF_PERIOD_4 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,4) > now ), 'You must have level 4 in CryptoHands, or id <= 128');
} else if(now > END_OF_PERIOD_2){
require( ( id<=ID_OF_PERIOD_3 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,5) > now ), 'You must have level 5 in CryptoHands, or id <= 64');
} else if(now > END_OF_PERIOD_1){
require( ( id<=ID_OF_PERIOD_2 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,6) > now ), 'You must have level 6 in CryptoHands, or id <= 32');
} else{
require( ( id<=ID_OF_PERIOD_1 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,7) > now ), 'You must have level 7 in CryptoHands, or id <= 16');
}
}
_;
}
constructor() public {
LEVEL_PRICE[1] = 0.08 ether;
LEVEL_PRICE[2] = 0.16 ether;
LEVEL_PRICE[3] = 0.32 ether;
LEVEL_PRICE[4] = 0.64 ether;
LEVEL_PRICE[5] = 1.28 ether;
LEVEL_PRICE[6] = 2.56 ether;
LEVEL_PRICE[7] = 5.12 ether;
LEVEL_PRICE[8] = 10.24 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 priorityRegistration(){
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 {
(bool chIsExist, uint256 chId, uint256 chReferrerID) = viewCHUser(msg.sender);
if(chIsExist){
referrer = findCHReferrer(chReferrerID);
refId = users[referrer].id;
}else {
revert('Incorrect referrer');
}
}
regUser(refId);
} else {
revert("Please buy first level for 0.08 ETH");
}
}
function regUser(uint _referrerID) internal {
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[userList[_referrerID]].referral.push(msg.sender);
payForLevel(1, msg.sender);
emit regLevelEvent(msg.sender, userList[_referrerID], now);
}
function buyLevel(uint _level) internal {
require(users[msg.sender].levelExpired[_level] < now + RENEWAL_NOT_EARLIER, 'The level has already been extended for a long time. Try later');
if(_level == 1){
users[msg.sender].levelExpired[1] += PERIOD_LENGTH;
} else {
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 referrer = getUserReferrer(_user, _level);
if(!users[referrer].isExist){
referrer = userList[1];
}
if(users[referrer].levelExpired[_level] >= now ){
bool result;
result = address(uint160(referrer)).send(LEVEL_PRICE[_level]);
emit getMoneyForLevelEvent(referrer, msg.sender, _level, now);
} else {
emit lostMoneyForLevelEvent(referrer, msg.sender, _level, now);
payForLevel(_level,referrer);
}
}
function findFreeReferrer(address _user) public view returns(address) {
if(users[_user].referral.length < REFERRER_1_LEVEL_LIMIT){
return _user;
}
address[] memory referrals = new address[](2046);
referrals[0] = users[_user].referral[0];
referrals[1] = users[_user].referral[1];
address freeReferrer;
bool noFreeReferrer = true;
for(uint i =0; i<2046;i++){
if(users[referrals[i]].referral.length == REFERRER_1_LEVEL_LIMIT){
if(i<1022){
referrals[(i+1)*2] = users[referrals[i]].referral[0];
referrals[(i+1)*2+1] = users[referrals[i]].referral[1];
}
}else{
noFreeReferrer = false;
freeReferrer = referrals[i];
break;
}
}
require(!noFreeReferrer, 'No Free Referrer');
return freeReferrer;
}
function getUserReferrer(address _user, uint _level) public view returns (address) {
if (_level == 0 || _user == address(0)) {
return _user;
}
return this.getUserReferrer(userList[users[_user].referrerID], _level - 1);
}
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))
}
}
function viewCHUser(address _user) public view returns (bool isExist, uint id, uint referrerID) {
return CRYPTO_HANDS.users(_user);
}
function viewCHLevelExpired(address _user, uint _level) public view returns (uint) {
CRYPTO_HANDS.viewUserLevelExpired(_user,_level);
}
function findCHReferrer(uint _chUserId) internal returns(address) { //view
address chReferrerAddress = CRYPTO_HANDS.userList(_chUserId);
if(users[chReferrerAddress].isExist){
emit chUplineLogEvent(chReferrerAddress, _chUserId, users[chReferrerAddress].id);
return chReferrerAddress;
} else{
emit chUplineLogEvent(chReferrerAddress, _chUserId, 0);
(bool chIsExist, uint256 chId, uint256 chReferrerID) = viewCHUser(chReferrerAddress);
return findCHReferrer(chReferrerID);
}
}
}
contract CryptoHands {
struct UserStruct {
bool isExist;
uint id;
uint referrerID;
address[] referral;
mapping (uint => uint) levelExpired;
}
mapping (address => UserStruct) public users;
mapping (uint => address) public userList;
function viewUserLevelExpired(address _user, uint _level) public view returns(uint);
}