ETH Price: $2,185.04 (-8.41%)

Transaction Decoder

Block:
9908884 at Apr-20-2020 10:55:53 AM +UTC
Transaction Fee:
0.001600716 ETH $3.50
Gas Used:
133,393 Gas / 12 Gwei

Emitted Events:

137 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xd5072a055af90eb7182289a47c3033312a8abbbe, amount=55143518954259549 )
138 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0x0fe2f62bdc4b7e279701648ca5b55b2f53eeb86a, amount=55143518954259549 )
139 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xe80f98bd659fbc76016f7ff928412e7b66ec6ecf, amount=55143518954259549 )
140 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xa69cc762ebbdffa4b8abeb8d181b6f3c5c225133, amount=275717594771297703 )
141 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xabcf9a5e852305033306dee9e23e37819cd5689e, amount=55143518954259549 )
142 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xff1ebce7d2de5a6f03a39b713ef328663a92ea1a, amount=275717594771297703 )
143 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xd6e329a4d9ea501c7c9b66205107df2aa35acc9f, amount=137858797385648851 )
144 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0x09d58f8e067c6e55d66adf2f7e64e3297b54b4c6, amount=137858797385648851 )
145 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xe52e3315553b2a818e04370979929a43bf53d9c1, amount=20678819607847329 )
146 SuperOneSpots.CommissionSent( from=0x4BAee844...8288359dC, to=0xaeea15e8183b03bc44c4ba70a1d6340c68453b7d, amount=55143518954259549 )

Account State Difference:

  Address   Before After State Difference Code
0x09d58F8e...97b54B4c6 1.48576214222192005 Eth1.623620939607568901 Eth0.137858797385648851
0x0FE2f62B...F53Eeb86A 2.488259993245411981 Eth2.54340351219967153 Eth0.055143518954259549
0x8dB55B90...494a2c620
2.796191985397363 Eth
Nonce: 0
1.671042070704324818 Eth
Nonce: 1
1.125149914693038182
0xa69cC762...C5C225133 5.461652265262968616 Eth5.737369860034266319 Eth0.275717594771297703
0xabcF9A5e...19Cd5689E 60.545865422391809787 Eth60.601008941346069336 Eth0.055143518954259549
0xaEEa15e8...c68453B7D 33.541971445366474512 Eth33.597114964320734061 Eth0.055143518954259549
0xD5072A05...12A8AbbBE 11.843181640709237106 Eth11.898325159663496655 Eth0.055143518954259549
0xD6E329A4...aA35acC9f 0.135923085608510658 Eth0.273781882994159509 Eth0.137858797385648851
0xe52E3315...3BF53D9C1 51.135498008209684674 Eth51.156176827817532003 Eth0.020678819607847329
0xE80F98Bd...B66Ec6ecF 56.83067625224863232 Eth56.885819771202891869 Eth0.055143518954259549
(Ethermine)
851.551947070267487734 Eth851.553547786267487734 Eth0.001600716
0xff1EbcE7...63A92EA1A 0.271741650998953508 Eth0.547459245770251211 Eth0.275717594771297703

Execution Trace

ETH 1.123549198693038182 SuperOneSpots.distributeCommission( beneficiaries=[0xD5072A055Af90eb7182289A47C3033312A8AbbBE, 0x0FE2f62Bdc4b7e279701648Ca5b55b2F53Eeb86A, 0xE80F98Bd659FbC76016f7Ff928412E7B66Ec6ecF, 0xa69cC762eBbdFFA4B8AbEb8d181b6F3C5C225133, 0xabcF9A5e852305033306DEE9e23e37819Cd5689E, 0xff1EbcE7d2dE5a6f03A39b713eF328663A92EA1A, 0xD6E329A4d9EA501c7C9B66205107df2aA35acC9f, 0x09d58F8e067c6E55D66ADF2F7E64e3297b54B4c6, 0xe52E3315553b2a818e04370979929a43BF53D9C1, 0xaEEa15e8183b03BC44C4bA70a1D6340c68453B7D], amounts=[55143518954259549, 55143518954259549, 55143518954259549, 275717594771297703, 55143518954259549, 275717594771297703, 137858797385648851, 137858797385648851, 20678819607847329, 55143518954259549] )
  • ETH 0.055143518954259549 0xd5072a055af90eb7182289a47c3033312a8abbbe.CALL( )
  • ETH 0.055143518954259549 0x0fe2f62bdc4b7e279701648ca5b55b2f53eeb86a.CALL( )
  • ETH 0.055143518954259549 0xe80f98bd659fbc76016f7ff928412e7b66ec6ecf.CALL( )
  • ETH 0.275717594771297703 0xa69cc762ebbdffa4b8abeb8d181b6f3c5c225133.CALL( )
  • ETH 0.055143518954259549 0xabcf9a5e852305033306dee9e23e37819cd5689e.CALL( )
  • ETH 0.275717594771297703 0xff1ebce7d2de5a6f03a39b713ef328663a92ea1a.CALL( )
  • ETH 0.137858797385648851 0xd6e329a4d9ea501c7c9b66205107df2aa35acc9f.CALL( )
  • ETH 0.137858797385648851 0x09d58f8e067c6e55d66adf2f7e64e3297b54b4c6.CALL( )
  • ETH 0.020678819607847329 0xe52e3315553b2a818e04370979929a43bf53d9c1.CALL( )
  • ETH 0.055143518954259549 0xaeea15e8183b03bc44c4ba70a1d6340c68453b7d.CALL( )
    pragma solidity ^0.5.7;
    
    contract Ownable {
        address public owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
        /**
         * @dev The Ownable constructor sets the original `owner` of the contract to the sender
         * account.
         */
        constructor() public{
            owner = msg.sender;
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(msg.sender == owner);
            _;
        }
    
        /**
         * @dev Allows the current owner to transfer control of the contract to a newOwner.
         * @param newOwner The address to transfer ownership to.
         */
        function transferOwnership(address newOwner) onlyOwner public {
            require(newOwner != address(0));
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
        }
    
    }
    
    contract User is Ownable {
    
        event UserRegistered(address internal_wallet_address, address external_wallet_address, address referrer, bytes32 nick_name, bytes32 geo_location);
    
        event UserNickNameUpdated(address external_wallet_address, bytes32 old_nick_name, bytes32 new_nick_name);
    
        event UserGeoLocationUpdated(address external_wallet_address, bytes32 old_geo_location, bytes32 new_geo_location);
    
        struct UserDetails {
            bytes32 nick_name;
            address payable referrer;
            bytes32 geo_location;
        }
    
        // address details
        mapping(address => UserDetails) public users;
    
        // mapping of internal wallet to external wallet
        mapping(address => address) public internal_to_external;
    
        // mapping of external wallet to internal wallet
        mapping(address => address) public external_to_internal;
    
        // all referees for an address
        mapping(address => address[]) public referees;
    
        constructor() public {
            UserDetails memory root = UserDetails({
                nick_name : "new",
                referrer : address(0),
                geo_location : "51.507351,-0.127758" // London
                });
            users[msg.sender] = root;
            internal_to_external[msg.sender] = msg.sender;
        }
    
        /**
         * @dev method to register users, can be called by admin only
         * @param _internal_wallet_addresses internal wallet addresses array
         * @param _external_wallet_addresses external wallet addresses array
         * @param _referrers referrers array
         * @param _nick_names nick names array
         * @param _geo_locations geo locations array
         */
        function registerUsers(
            address payable[] calldata _internal_wallet_addresses,
            address payable[] calldata _external_wallet_addresses,
            address payable[] calldata _referrers,
            bytes32[] calldata _nick_names,
            bytes32[] calldata _geo_locations) external onlyOwner() {
            for (uint256 i; i < _internal_wallet_addresses.length; i++) {
                UserDetails memory ud = UserDetails({
                    nick_name : _nick_names[i],
                    referrer : _referrers[i],
                    geo_location : _geo_locations[i]
                    });
                users[_external_wallet_addresses[i]] = ud;
                referees[_referrers[i]].push(_external_wallet_addresses[i]);
                internal_to_external[_internal_wallet_addresses[i]] = _external_wallet_addresses[i];
                external_to_internal[_external_wallet_addresses[i]] = _internal_wallet_addresses[i];
                emit UserRegistered(_internal_wallet_addresses[i], _external_wallet_addresses[i], _referrers[i], _nick_names[i], _geo_locations[i]);
            }
        }
    
        /**
         * @dev method to register user, can be called by admin only
         * @param _internal_wallet_address internal wallet address
         * @param _external_wallet_address external wallet address
         * @param _referrer referrer
         * @param _nick_name nick name
         * @param _geo_location geo location
         */
        function registerUser(
            address payable _internal_wallet_address,
            address payable _external_wallet_address,
            address payable _referrer,
            bytes32 _nick_name,
            bytes32 _geo_location) external onlyOwner() {
            UserDetails memory ud = UserDetails({
                nick_name : _nick_name,
                referrer : _referrer,
                geo_location : _geo_location
                });
            users[_external_wallet_address] = ud;
            referees[_referrer].push(_external_wallet_address);
            internal_to_external[_internal_wallet_address] = _external_wallet_address;
            external_to_internal[_external_wallet_address] = _internal_wallet_address;
            emit UserRegistered(_internal_wallet_address, _external_wallet_address, _referrer, _nick_name, _geo_location);
        }
    
        /**
         * @dev method to update users nick name, can be called external address only
         * @param _nick_name new nick name
         */
        function updateNickname(bytes32 _nick_name) external {
            require(external_to_internal[msg.sender] != address(0));
            UserDetails memory ud = users[msg.sender];
            require(ud.nick_name != bytes32(0), "user does not esist!");
            bytes32 old_nick_name = ud.nick_name;
            ud.nick_name = _nick_name;
            users[msg.sender] = ud;
            emit UserNickNameUpdated(msg.sender, old_nick_name, _nick_name);
        }
    
        /**
         * @dev method to update users geo location, can be called external address only
         * @param _geo_location new geo location
         */
        function updateGeoLocation(bytes32 _geo_location) external {
            require(external_to_internal[msg.sender] != address(0));
            UserDetails memory ud = users[msg.sender];
            require(ud.nick_name != bytes32(0), "user does not esist!");
            bytes32 old_geo_location = ud.geo_location;
            ud.geo_location = _geo_location;
            users[msg.sender] = ud;
            emit UserGeoLocationUpdated(msg.sender, old_geo_location, _geo_location);
        }
    
        /**
           * @dev Throws if called by any account other than the internal wallet.
           */
        modifier onlyInternalWallets() {
            require(internal_to_external[msg.sender] != address(0));
            _;
        }
    }
    
    contract SuperOneSpots is User {
    
        event Withdrawal(address wallet, uint256 weiAmount);
        event CommissionSent(address indexed from, address to, uint256 amount);
    
        // coordinates to Spot index first is level(x) then mapping of y to owner address
        mapping(uint256 => mapping(uint256 => address)) public coordinates;
    
        // mapping to return what to add according to x index
        mapping(uint256 => uint256) public x_addition;
    
        // mapping to return what to add according to y index
        mapping(uint256 => uint256) public y_addition;
    
        // Constructor to bootstartp the contract
        constructor() public {
            // initial coordinates belongs to owner
            coordinates[0][0] = msg.sender;
            uint256 x_factor = 1;
            uint256 y_factor;
            //pre fill x_addition for level calculation in the tree
            for (uint256 i; i < 128; i++) {
                // for x_addition
                if ((i + 2) >= (2 * (2 ** x_factor))) {
                    x_factor += 1;
                    y_factor = 1;
                } else {
                    y_factor += 1;
                }
                x_addition[i] = x_factor;
                y_addition[i] = y_factor - 1;
            }
    
        }
    
        /**
         * @dev method to assign spots, can be called by admin only
         * @param coord_x coordinate x of the tree to start
         * @param coord_y coordinate y of the tree to start
         * @param _count count of spots to be assigned
         */
        function assignSpotsByAdmin(uint256 coord_x, uint256 coord_y, uint _count, address external_wallet_address) external onlyOwner() {
            require(_count < 128);
            coordinates[coord_x][coord_y] = external_wallet_address;
            for (uint256 i; i < _count - 1; i++) {
                coordinates[coord_x + x_addition[i]][coord_y * (2 * (2 ** (x_addition[i] - 1))) + y_addition[i]] = external_wallet_address;
            }
        }
    
        /**
         * @dev method to assign spots, can be called by internal wallets only
         * @param coord_x coordinate x of the tree to start
         * @param coord_y coordinate y of the tree to start
         * @param _count count of spots to be assigned
         */
        function assignSpots(uint256 coord_x, uint256 coord_y, uint _count) external onlyInternalWallets() {
            require(_count < 128);
            address wallet = internal_to_external[msg.sender];
            coordinates[coord_x][coord_y] = wallet;
            for (uint256 i; i < _count - 1; i++) {
                coordinates[coord_x + x_addition[i]][coord_y * (2 * (2 ** (x_addition[i] - 1))) + y_addition[i]] = wallet;
            }
        }
    
        /**
         * @dev method to distribute Comission, can be called by internal wallets only
         * @param beneficiaries address to which funds will be transferred
         * @param amounts the amount of index wise benificiaries
         */
        function distributeCommission(address payable[] calldata beneficiaries, uint256[] calldata amounts) external payable onlyInternalWallets() {
            require(beneficiaries.length == amounts.length);
            for (uint256 i; i < beneficiaries.length; i++) {
                beneficiaries[i].transfer(amounts[i]);
                emit CommissionSent(internal_to_external[msg.sender], beneficiaries[i], amounts[i]);
            }
        }
    
        /**
         * @dev method to withdraw funds only by owner
         * @param _wallet address to which funds will be transferred
         */
        function withdraw(address payable _wallet) onlyOwner() public {
            uint256 weiAmount = address(this).balance;
            require(weiAmount > 0);
            _wallet.transfer(weiAmount);
            emit Withdrawal(_wallet, weiAmount);
        }
    
        function checkSpots(uint256[] calldata x, uint256[] calldata y) external view returns (address[] memory){
            address[] memory addresses;
            for (uint256 i; i < x.length; i++) {
                addresses[i] = coordinates[x[i]][y[i]];
            }
            return addresses;
        }
    
    }