Transaction Hash:
Block:
9842973 at Apr-10-2020 06:41:36 AM +UTC
Transaction Fee:
0.001372793448463767 ETH
$2.96
Gas Used:
207,999 Gas / 6.600000233 Gwei
Emitted Events:
| 91 |
CryptoLife.TransferEvent( recipient=0x16cd3bd70de6d6224f5b358fc2f1ee0acb5c17e1, sender=[Sender] 0x57e1a2be1d911074aff6d77c980d48b48b960a91, amount=210000000000000000, time=1586500896, recipientID=1115, senderID=1251, superprofit=False )
|
| 92 |
CryptoLife.BuyLevelEvent( user=[Sender] 0x57e1a2be1d911074aff6d77c980d48b48b960a91, level=0, time=1586500896 )
|
| 93 |
CryptoLife.RegisterUserEvent( user=[Sender] 0x57e1a2be1d911074aff6d77c980d48b48b960a91, referrer=0x16cd3bd70de6d6224f5b358fc2f1ee0acb5c17e1, time=1586500896 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x16cD3Bd7...acB5c17E1 | 0.076260005 Eth | 0.286260005 Eth | 0.21 | ||
| 0x1DEEBAcf...436e4F6E6 | |||||
| 0x57E1A2BE...48B960A91 |
0.23 Eth
Nonce: 0
|
0.018627206551536233 Eth
Nonce: 1
| 0.211372793448463767 | ||
|
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 736.488509942732021298 Eth | 736.489882736180485065 Eth | 0.001372793448463767 |
Execution Trace
ETH 0.21
CryptoLife.16cd3bd7( )
-
Coin.balanceOf( tokenOwner=0x57E1A2BE1d911074Aff6D77C980D48B48B960A91 ) => ( balance=0 )
- ETH 0.21
0x16cd3bd70de6d6224f5b358fc2f1ee0acb5c17e1.CALL( )
File 1 of 2: CryptoLife
File 2 of 2: Coin
/**
* _________ __ .____ .__ _____
* \_ ___ \_______ ___.__._______/ |_ ____ | | |__|/ ____\____
* / \ \/\_ __ < | |\____ \ __\/ _ \ | | | \ __\/ __ \
* \ \____| | \/\___ || |_> > | ( <_> ) | |___| || | \ ___/
* \______ /|__| / ____|| __/|__| \____/ |_______ \__||__| \___ >
* \/ \/ |__| \/ \/
* https://cryptolife.top
**/
pragma solidity ^0.5.11;
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
}
contract SafeMath {
function safeAdd(uint a, uint b) public pure returns(uint c) {
c = a + b;
require(c >= a);
}
function safeSub(uint a, uint b) public pure returns (uint c) {
require(b <= a);
c = a - b;
}
function safeMul(uint a, uint b) public pure returns (uint c) {
c = a * b;
require(a == 0 || c / a == b);
}
function safeDiv(uint a, uint b) public pure returns (uint c) {
require(b > 0);
c = a / b;
}
}
contract CryptoLife is SafeMath {
uint public currentUserID;
mapping (uint => User) public users;
mapping (address => uint) public userWallets;
uint[5] public levelBase;
uint[7] public regBase;
address public token_contract;
struct User {
bool exists;
address wallet;
uint referrer;
mapping (uint => uint) uplines;
mapping (uint => uint[]) referrals;
mapping (uint => uint) levelExpiry;
}
event RegisterUserEvent(address indexed user, address indexed referrer, uint time);
event BuyLevelEvent(address indexed user, uint indexed level, uint time);
event TransferEvent(address indexed recipient, address indexed sender, uint indexed amount, uint time, uint recipientID, uint senderID, bool superprofit);
event LostProfitEvent(address indexed recipient, address indexed sender, uint indexed amount, uint time, uint senderID);
event CommissionEvent(address indexed recipient, address indexed sender, uint indexed amount, address referral, uint time, uint recipientID, uint senderID, uint referralID);
constructor(address _owner, address _token, address[2] memory techAccounts) public {
currentUserID++;
levelBase = [0.1 ether, 0.2 ether, 0.5 ether, 1.5 ether, 2.3 ether];
regBase = [0.21 ether, 1.61 ether, 3.22 ether, 6.33 ether, 12.44 ether, 24.55 ether, 48.66 ether];
users[currentUserID] = User({ exists: true, wallet: _owner, referrer: 1});
userWallets[_owner] = currentUserID;
emit RegisterUserEvent(_owner, _owner, now);
token_contract = _token;
for (uint i = 0; i < 35; i++) {
users[currentUserID].levelExpiry[i] = 1 << 37;
}
for (uint i = 1; i < 8; i++) {
users[currentUserID].uplines[i] = 1;
users[currentUserID].referrals[i] = new uint[](0);
}
for(uint i = 0; i < techAccounts.length; i++){
currentUserID++;
users[currentUserID] = User({ exists: true, wallet: techAccounts[i], referrer: 1});
userWallets[techAccounts[i]] = currentUserID;
emit RegisterUserEvent(techAccounts[i], _owner, now);
for(uint levelID = 0; levelID < 35; levelID+= 5){
users[currentUserID].levelExpiry[levelID] = 1 << 37;
// emit BuyLevelEvent(techAccounts[levelID], levelID, now);
}
for (uint j = 1; j < 8; j++) {
users[currentUserID].uplines[j] = 1;
users[currentUserID].referrals[j] = new uint[](0);
users[1].referrals[j].push(currentUserID);
}
}
}
function () external payable {
if (userWallets[msg.sender] == 0) {
require(msg.value == 0.21 ether, 'Wrong amount');
registerUser(userWallets[bytesToAddress(msg.data)]);
} else {
buyLevel(0);
}
}
function registerUser(uint _referrer) public payable {
require(_referrer > 0 && _referrer <= currentUserID, 'Invalid referrer ID');
require(msg.value == regBase[0], 'Wrong amount');
require(userWallets[msg.sender] == 0, 'User already registered');
currentUserID++;
users[currentUserID] = User({ exists: true, wallet: msg.sender, referrer: _referrer });
userWallets[msg.sender] = currentUserID;
levelUp(0, 1, 1, currentUserID, _referrer);
emit RegisterUserEvent(msg.sender, users[_referrer].wallet, now);
}
function buyLevel(uint _upline) public payable {
uint userID = userWallets[msg.sender];
require (userID > 0, 'User not registered');
(uint round, uint level, uint levelID) = getLevel(msg.value);
if (level == 1 && round > 1) {
bool prev = false;
for (uint l = levelID - 2; l < levelID; l++) {
if (users[userID].levelExpiry[l] >= now) {
prev = true;
break;
}
require(prev == true, 'Previous round not active');
}
} else {
for (uint l = level - 1; l > 0; l--) {
require(users[userID].levelExpiry[levelID - level + l] >= now, 'Previous level not active');
}
}
levelUp(levelID, level, round, userID, _upline);
if (level == 4 && round < 7 && users[userID].levelExpiry[levelID + 3] <= now) levelUp(levelID + 2, 1, round + 1, userID, _upline);
if (address(this).balance > 0) msg.sender.transfer(address(this).balance);
}
function levelUp(uint _levelid, uint _level, uint _round, uint _userid, uint _upline) internal {
uint duration = 30 days * _round + 150 days;
IERC20 token = IERC20(token_contract);
uint clft = token.balanceOf(msg.sender);
if (users[_userid].levelExpiry[_levelid] == 0 || (users[_userid].levelExpiry[_levelid] < now && clft >= _round)) {
users[_userid].levelExpiry[_levelid] = now + duration;
} else {
users[_userid].levelExpiry[_levelid] += duration;
}
if (_level == 1 && users[_userid].uplines[_round] == 0) {
if (_upline == 0) _upline = users[_userid].referrer;
if (_round > 1) _upline = findUplineUp(_upline, _round);
_upline = findUplineDown(_upline, _round);
users[_userid].uplines[_round] = _upline;
users[_upline].referrals[_round].push(_userid);
}
payForLevel(_levelid, _userid, _level, _round, false);
emit BuyLevelEvent(msg.sender, _levelid, now);
}
function payForLevel(uint _levelid, uint _userid, uint _height, uint _round, bool _superprofit) internal {
uint refer = users[_userid].referrer;
uint referrer = getUserUpline(_userid, _height, _round);
uint amount = lvlAmount(_levelid);
if (users[referrer].levelExpiry[_levelid] < now) {
emit LostProfitEvent(users[referrer].wallet, msg.sender, amount, now, userWallets[msg.sender]);
payForLevel(_levelid, referrer, _height, _round, true);
return;
}
if(_levelid == 0 && refer != referrer){
uint comission = safeDiv(amount, 10);
emit CommissionEvent(users[refer].wallet, users[referrer].wallet, comission, msg.sender, now, refer, referrer, userWallets[msg.sender]);
if (address(uint160(users[refer].wallet)).send(safeDiv(amount, 10))) {
emit TransferEvent(users[refer].wallet, msg.sender, comission, now, refer, userWallets[msg.sender], _superprofit);
}
if (address(uint160(users[referrer].wallet)).send(safeMul(safeDiv(amount, 100), 90))) {
emit TransferEvent(users[referrer].wallet, msg.sender, (amount - comission), now, referrer, userWallets[msg.sender], _superprofit);
}
} else {
if (address(uint160(users[referrer].wallet)).send(amount)) {
emit TransferEvent(users[referrer].wallet, msg.sender, amount, now, referrer, userWallets[msg.sender], _superprofit);
}
}
}
function getUserUpline(uint _user, uint _height, uint _round) public view returns (uint) {
while (_height > 0) {
_user = users[_user].uplines[_round];
_height--;
}
return _user;
}
function findUplineUp(uint _user, uint _round) public view returns (uint) {
while (users[_user].uplines[_round] == 0) {
_user = users[_user].uplines[1];
}
return _user;
}
function findUplineDown(uint _user, uint _round) public view returns (uint) {
if (users[_user].referrals[_round].length < 2) {
return _user;
}
uint[1024] memory referrals;
referrals[0] = users[_user].referrals[_round][0];
referrals[1] = users[_user].referrals[_round][1];
uint referrer;
for (uint i = 0; i < 1024; i++) {
if (users[referrals[i]].referrals[_round].length < 2) {
referrer = referrals[i];
break;
}
if (i >= 512) {
continue;
}
referrals[(i+1)*2] = users[referrals[i]].referrals[_round][0];
referrals[(i+1)*2+1] = users[referrals[i]].referrals[_round][1];
}
require(referrer != 0, 'Referrer not found');
return referrer;
}
function getLevel(uint _amount) public view returns(uint, uint, uint) {
uint level = 0;
uint tmp = _amount % 0.1 ether;
uint round = tmp / 0.01 ether;
require(round != 0, 'Wrong amount');
tmp = (_amount - (0.11 ether * round)) / (2 ** (round - 1));
for (uint i = 1; i <= 5; i++) {
if (tmp == levelBase[i - 1]) {
level = i;
break;
}
}
require(level > 0, 'Wrong amount');
uint levelID = (round - 1) * 5 + level - 1;
return (round, level, levelID);
}
function lvlAmount (uint _levelID) public view returns(uint) {
uint level = _levelID % 5;
uint round = (_levelID - level) / 5;
uint tmp = levelBase[level] * (2 ** round);
uint price = (tmp + (0.11 ether * (round + 1)));
if(level == 3 && round < 6) return (price - (levelBase[0] * (2 ** (round + 1) ) ) - (0.11 ether * ( round + 2)));
return price;
}
function getReferralTree(uint _user, uint _treeLevel, uint _round) external view returns (uint[] memory, uint[] memory, uint) {
uint tmp = 2 ** (_treeLevel + 1) - 2;
uint[] memory ids = new uint[](tmp);
uint[] memory lvl = new uint[](tmp);
ids[0] = (users[_user].referrals[_round].length > 0)? users[_user].referrals[_round][0]: 0;
ids[1] = (users[_user].referrals[_round].length > 1)? users[_user].referrals[_round][1]: 0;
lvl[0] = getMaxLevel(ids[0], _round);
lvl[1] = getMaxLevel(ids[1], _round);
for (uint i = 0; i < (2 ** _treeLevel - 2); i++) {
tmp = i * 2 + 2;
ids[tmp] = (users[ids[i]].referrals[_round].length > 0)? users[ids[i]].referrals[_round][0]: 0;
ids[tmp + 1] = (users[ids[i]].referrals[_round].length > 1)? users[ids[i]].referrals[_round][1]: 0;
lvl[tmp] = getMaxLevel(ids[tmp], _round);
lvl[tmp + 1] = getMaxLevel(ids[tmp + 1], _round);
}
uint curMax = getMaxLevel(_user, _round);
return(ids, lvl, curMax);
}
function getMaxLevel(uint _user, uint _round) private view returns (uint){
uint max = 0;
if (_user == 0) return 0;
if (!users[_user].exists) return 0;
for (uint i = 1; i <= 5; i++) {
if (users[_user].levelExpiry[_round * 5 - i] > now) {
max = 6 - i;
break;
}
}
return max;
}
function getUplines(uint _user, uint _round) public view returns (uint[5] memory uplines, address[5] memory uplinesWallets) {
for(uint i = 0; i < 5; i++) {
_user = users[_user].uplines[_round];
uplines[i] = _user;
uplinesWallets[i] = users[_user].wallet;
}
}
function getUserLevels(uint _user) external view returns (uint[35] memory levels) {
for (uint i = 0; i < 35; i++) {
levels[i] = users[_user].levelExpiry[i];
}
}
function bytesToAddress(bytes memory _addr) private pure returns (address addr) {
assembly {
addr := mload(add(_addr, 20))
}
}
}File 2 of 2: Coin
pragma solidity 0.5.11;
// ----------------------------------------------------------------------------
// Safe maths
// ----------------------------------------------------------------------------
contract SafeMath {
function safeAdd(uint a, uint b) public pure returns(uint c) {
c = a + b;
require(c >= a);
}
function safeSub(uint a, uint b) public pure returns (uint c) {
require(b <= a);
c = a - b;
}
function safeMul(uint a, uint b) public pure returns (uint c) {
c = a * b;
require(a == 0 || c / a == b);
}
function safeDiv(uint a, uint b) public pure returns (uint c) {
require(b > 0);
c = a / b;
}
}
// ----------------------------------------------------------------------------
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
function totalSupply() public view returns (uint);
function balanceOf(address tokenOwner) public view returns (uint balance);
function allowance(address tokenOwner, address spender) public view returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
// ----------------------------------------------------------------------------
// ERC20 Token, with the addition of symbol, name and decimals and assisted
// token transfers
// ----------------------------------------------------------------------------
contract Coin is ERC20Interface, SafeMath {
string public symbol;
string public name;
uint8 public decimals;
uint public _totalSupply;
address owner;
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
constructor(address _owner) public {
symbol = "CLFT";
name = "Crypto Life Token";
decimals = 0;
_totalSupply = 100000;
balances[address(this)] = _totalSupply;
emit Transfer(address(0), address(this), _totalSupply);
owner = _owner;
}
// ------------------------------------------------------------------------
// Total supply
// ------------------------------------------------------------------------
function totalSupply() public view returns (uint) {
return _totalSupply - balances[address(0)];
}
// ------------------------------------------------------------------------
// Get the token balance for account tokenOwner
// ------------------------------------------------------------------------
function balanceOf(address tokenOwner) public view returns (uint balance) {
return balances[tokenOwner];
}
// ------------------------------------------------------------------------
// Transfer the balance from token owner's account to to account
// - Owner's account must have sufficient balance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transfer(address to, uint tokens) public returns (bool success) {
balances[msg.sender] = safeSub(balances[msg.sender], tokens);
balances[to] = safeAdd(balances[to], tokens);
emit Transfer(msg.sender, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Token owner can approve for spender to transferFrom(...) tokens
// from the token owner's account
// ------------------------------------------------------------------------
function approve(address spender, uint tokens) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
}
// ------------------------------------------------------------------------
// Transfer tokens from the from account to the to account
//
// The calling account must already have sufficient tokens approve(...)-d
// for spending from the from account and
// - From account must have sufficient balance to transfer
// - Spender must have sufficient allowance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transferFrom(address from, address to, uint tokens) public returns (bool success) {
balances[from] = safeSub(balances[from], tokens);
allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
balances[to] = safeAdd(balances[to], tokens);
emit Transfer(from, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Returns the amount of tokens approved by the owner that can be
// transferred to the spender's account
// ------------------------------------------------------------------------
function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
return allowed[tokenOwner][spender];
}
// ------------------------------------------------------------------------
// Don't accept ETH
// ------------------------------------------------------------------------
function () external payable {
revert();
}
// ------------------------------------------------------------------------
// Get current sale price
// ------------------------------------------------------------------------
function getPrice() public view returns (uint price) {
return (_totalSupply - balances[address(this)]) * 0.0001 ether + 0.1 ether;
}
// ------------------------------------------------------------------------
// Buy one coin
// ------------------------------------------------------------------------
function buyOne() public payable returns (bool success) {
uint price = getPrice();
uint fee = price / 10;
require(msg.value == (price + fee), 'Wrong amount');
balances[address(this)] = safeSub(balances[address(this)], 1);
balances[msg.sender] = safeAdd(balances[msg.sender], 1);
emit Transfer(address(this), msg.sender, 1);
address(uint160(owner)).transfer(fee);
return true;
}
// ------------------------------------------------------------------------
// Sell one coin
// ------------------------------------------------------------------------
function sellOne() public returns (bool success) {
uint price = getPrice() - 0.0001 ether;
uint fee = price / 10;
balances[msg.sender] = safeSub(balances[msg.sender], 1);
balances[address(this)] = safeAdd(balances[address(this)], 1);
emit Transfer(msg.sender, address(this), 1);
msg.sender.transfer(price - fee);
address(uint160(owner)).transfer(fee);
return true;
}
}