ETH Price: $2,411.12 (+6.95%)

Transaction Decoder

Block:
10696906 at Aug-20-2020 11:58:06 AM +UTC
Transaction Fee:
0.015280513717264614 ETH $36.84
Gas Used:
159,642 Gas / 95.717378367 Gwei

Emitted Events:

248 MYXNetwork.Transfer( from=[Sender] 0x86bebc8147ff4bf046f82b7fcb388f6f728ea1c4, to=[Receiver] 0x40432844506f3a51c266ecabad2beb23cad27f66, tokens=48049210960000000000000 )
249 MYXNetwork.Transfer( from=[Sender] 0x86bebc8147ff4bf046f82b7fcb388f6f728ea1c4, to=MYXNetwork, tokens=1264452920000000000000 )
250 MYXNetwork.Transfer( from=[Sender] 0x86bebc8147ff4bf046f82b7fcb388f6f728ea1c4, to=0x0000000000000000000000000000000000000000, tokens=1264452920000000000000 )
251 MYXNetwork.Burn( tokens=1264452920000000000000 )
252 0x40432844506f3a51c266ecabad2beb23cad27f66.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x00000000000000000000000086bebc8147ff4bf046f82b7fcb388f6f728ea1c4, 000000000000000000000000000000000000000000000a2cc0c1087d5df50000 )
253 0x40432844506f3a51c266ecabad2beb23cad27f66.0xff69b2ba8f4ef8248f8c375ba3916c770604b215557acdd4e8387a4dd5e7de86( 0xff69b2ba8f4ef8248f8c375ba3916c770604b215557acdd4e8387a4dd5e7de86, 0x00000000000000000000000086bebc8147ff4bf046f82b7fcb388f6f728ea1c4, 0x00000000000000000000000082844e2e0363e6f5f7edc87471c16341f5d77a4c, 000000000000000000000000000000000000000000000ab5d85f674098cc0000, 000000000000000000000000000000000000000000000a2cc0c1087d5df50000, 000000000000000000000000000000000000000000000000000000005f3e654e )

Account State Difference:

  Address   Before After State Difference Code
0x2129fF60...6B0D8E019
0x40432844...3cAd27F66
(Spark Pool)
133.04082472947801432 Eth133.056105243195278934 Eth0.015280513717264614
0x86BEbc81...F728eA1C4
0.382488183842881734 Eth
Nonce: 32
0.36720767012561712 Eth
Nonce: 33
0.015280513717264614

Execution Trace

0x40432844506f3a51c266ecabad2beb23cad27f66.7deb6025( )
  • MYXNetwork.transferFrom( _from=0x86BEbc8147FF4bF046f82B7fCB388f6F728eA1C4, _to=0x40432844506f3A51c266ecabAD2BeB23cAd27F66, _tokens=50578116800000000000000 ) => ( True )
    /**
     * Official Site: https://myx.network
     * Telegram: https://t.me/myxnetwork
     * Twitter: https://twitter.com/myxnetwork
     * Copyright 2020 MYX Network All Rights Reserved.
     * No alteration, reproduction or replication of this contract without prior written consent from MYX Network
    */
    
    pragma solidity ^0.5.13;
    
    interface Callable {
    	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
    }
    
    contract MYXNetwork {
    
    	uint256 constant private FLOAT_SCALAR = 2**64;
    	uint256 constant private INITIAL_SUPPLY = 1e27; // 1B
    	uint256 constant private BURN_RATE = 5; // 5% per tx
    	uint256 constant private SUPPLY_FLOOR = 10; // 10% of 1B = 100M
    	uint256 constant private MIN_FREEZE_AMOUNT = 1e20; // 100
    
    	string constant public name = "MYX Network";
    	string constant public symbol = "MYX";
    	uint8 constant public decimals = 18;
    
    	struct User {
    		bool whitelisted;
    		uint256 balance;
    		uint256 frozen;
    		mapping(address => uint256) allowance;
    		int256 scaledPayout;
    	}
    
    	struct Info {
    		uint256 totalSupply;
    		uint256 totalFrozen;
    		mapping(address => User) users;
    		uint256 scaledPayoutPerToken;
    		address admin;
    	}
    	Info private info;
    
    
    	event Transfer(address indexed from, address indexed to, uint256 tokens);
    	event Approval(address indexed owner, address indexed spender, uint256 tokens);
    	event Whitelist(address indexed user, bool status);
    	event Freeze(address indexed owner, uint256 tokens);
    	event Unfreeze(address indexed owner, uint256 tokens);
    	event Collect(address indexed owner, uint256 tokens);
    	event Burn(uint256 tokens);
    
    
    	constructor() public {
    		info.admin = msg.sender;
    		info.totalSupply = INITIAL_SUPPLY;
    		info.users[msg.sender].balance = INITIAL_SUPPLY;
    		emit Transfer(address(0x0), msg.sender, INITIAL_SUPPLY);
    		whitelist(msg.sender, true);
    	}
    
    	function freeze(uint256 _tokens) external {
    		_freeze(_tokens);
    	}
    
    	function unfreeze(uint256 _tokens) external {
    		_unfreeze(_tokens);
    	}
    
    	function collect() external returns (uint256) {
    		uint256 _dividends = dividendsOf(msg.sender);
    		require(_dividends >= 0);
    		info.users[msg.sender].scaledPayout += int256(_dividends * FLOAT_SCALAR);
    		info.users[msg.sender].balance += _dividends;
    		emit Transfer(address(this), msg.sender, _dividends);
    		emit Collect(msg.sender, _dividends);
    		return _dividends;
    	}
    
    	function burn(uint256 _tokens) external {
    		require(balanceOf(msg.sender) >= _tokens);
    		info.users[msg.sender].balance -= _tokens;
    		uint256 _burnedAmount = _tokens;
    		if (info.totalFrozen > 0) {
    			_burnedAmount /= 2;
    			info.scaledPayoutPerToken += _burnedAmount * FLOAT_SCALAR / info.totalFrozen;
    			emit Transfer(msg.sender, address(this), _burnedAmount);
    		}
    		info.totalSupply -= _burnedAmount;
    		emit Transfer(msg.sender, address(0x0), _burnedAmount);
    		emit Burn(_burnedAmount);
    	}
    
    	function distribute(uint256 _tokens) external {
    		require(info.totalFrozen > 0);
    		require(balanceOf(msg.sender) >= _tokens);
    		info.users[msg.sender].balance -= _tokens;
    		info.scaledPayoutPerToken += _tokens * FLOAT_SCALAR / info.totalFrozen;
    		emit Transfer(msg.sender, address(this), _tokens);
    	}
    
    	function transfer(address _to, uint256 _tokens) external returns (bool) {
    		_transfer(msg.sender, _to, _tokens);
    		return true;
    	}
    
    	function approve(address _spender, uint256 _tokens) external returns (bool) {
    		info.users[msg.sender].allowance[_spender] = _tokens;
    		emit Approval(msg.sender, _spender, _tokens);
    		return true;
    	}
    
    	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
    		require(info.users[_from].allowance[msg.sender] >= _tokens);
    		info.users[_from].allowance[msg.sender] -= _tokens;
    		_transfer(_from, _to, _tokens);
    		return true;
    	}
    
    	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
    		uint256 _transferred = _transfer(msg.sender, _to, _tokens);
    		uint32 _size;
    		assembly {
    			_size := extcodesize(_to)
    		}
    		if (_size > 0) {
    			require(Callable(_to).tokenCallback(msg.sender, _transferred, _data));
    		}
    		return true;
    	}
    
    	function bulkTransfer(address[] calldata _receivers, uint256[] calldata _amounts) external {
    		require(_receivers.length == _amounts.length);
    		for (uint256 i = 0; i < _receivers.length; i++) {
    			_transfer(msg.sender, _receivers[i], _amounts[i]);
    		}
    	}
    
    	function whitelist(address _user, bool _status) public {
    		require(msg.sender == info.admin);
    		info.users[_user].whitelisted = _status;
    		emit Whitelist(_user, _status);
    	}
    
    
    	function totalSupply() public view returns (uint256) {
    		return info.totalSupply;
    	}
    
    	function totalFrozen() public view returns (uint256) {
    		return info.totalFrozen;
    	}
    
    	function balanceOf(address _user) public view returns (uint256) {
    		return info.users[_user].balance - frozenOf(_user);
    	}
    
    	function frozenOf(address _user) public view returns (uint256) {
    		return info.users[_user].frozen;
    	}
    
    	function dividendsOf(address _user) public view returns (uint256) {
    		return uint256(int256(info.scaledPayoutPerToken * info.users[_user].frozen) - info.users[_user].scaledPayout) / FLOAT_SCALAR;
    	}
    
    	function allowance(address _user, address _spender) public view returns (uint256) {
    		return info.users[_user].allowance[_spender];
    	}
    
    	function isWhitelisted(address _user) public view returns (bool) {
    		return info.users[_user].whitelisted;
    	}
    
    	function allInfoFor(address _user) public view returns (uint256 totalTokenSupply, uint256 totalTokensFrozen, uint256 userBalance, uint256 userFrozen, uint256 userDividends) {
    		return (totalSupply(), totalFrozen(), balanceOf(_user), frozenOf(_user), dividendsOf(_user));
    	}
    
    
    	function _transfer(address _from, address _to, uint256 _tokens) internal returns (uint256) {
    		require(balanceOf(_from) >= _tokens);
    		info.users[_from].balance -= _tokens;
    		uint256 _burnedAmount = _tokens * BURN_RATE / 100;
    		if (totalSupply() - _burnedAmount < INITIAL_SUPPLY * SUPPLY_FLOOR / 100 || isWhitelisted(_from)) {
    			_burnedAmount = 0;
    		}
    		uint256 _transferred = _tokens - _burnedAmount;
    		info.users[_to].balance += _transferred;
    		emit Transfer(_from, _to, _transferred);
    		if (_burnedAmount > 0) {
    			if (info.totalFrozen > 0) {
    				_burnedAmount /= 2;
    				info.scaledPayoutPerToken += _burnedAmount * FLOAT_SCALAR / info.totalFrozen;
    				emit Transfer(_from, address(this), _burnedAmount);
    			}
    			info.totalSupply -= _burnedAmount;
    			emit Transfer(_from, address(0x0), _burnedAmount);
    			emit Burn(_burnedAmount);
    		}
    		return _transferred;
    	}
    
    	function _freeze(uint256 _amount) internal {
    		require(balanceOf(msg.sender) >= _amount);
    		require(frozenOf(msg.sender) + _amount >= MIN_FREEZE_AMOUNT);
    		info.totalFrozen += _amount;
    		info.users[msg.sender].frozen += _amount;
    		info.users[msg.sender].scaledPayout += int256(_amount * info.scaledPayoutPerToken);
    		emit Transfer(msg.sender, address(this), _amount);
    		emit Freeze(msg.sender, _amount);
    	}
    
    	function _unfreeze(uint256 _amount) internal {
    		require(frozenOf(msg.sender) >= _amount);
    		uint256 _burnedAmount = _amount * BURN_RATE / 100;
    		info.scaledPayoutPerToken += _burnedAmount * FLOAT_SCALAR / info.totalFrozen;
    		info.totalFrozen -= _amount;
    		info.users[msg.sender].balance -= _burnedAmount;
    		info.users[msg.sender].frozen -= _amount;
    		info.users[msg.sender].scaledPayout -= int256(_amount * info.scaledPayoutPerToken);
    		emit Transfer(address(this), msg.sender, _amount - _burnedAmount);
    		emit Unfreeze(msg.sender, _amount);
    	}
    }