Transaction Hash:
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:
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x09d58F8e...97b54B4c6 | 1.48576214222192005 Eth | 1.623620939607568901 Eth | 0.137858797385648851 | ||
0x0FE2f62B...F53Eeb86A | 2.488259993245411981 Eth | 2.54340351219967153 Eth | 0.055143518954259549 | ||
0x8dB55B90...494a2c620 |
2.796191985397363 Eth
Nonce: 0
|
1.671042070704324818 Eth
Nonce: 1
| 1.125149914693038182 | ||
0xa69cC762...C5C225133 | 5.461652265262968616 Eth | 5.737369860034266319 Eth | 0.275717594771297703 | ||
0xabcF9A5e...19Cd5689E | 60.545865422391809787 Eth | 60.601008941346069336 Eth | 0.055143518954259549 | ||
0xaEEa15e8...c68453B7D | 33.541971445366474512 Eth | 33.597114964320734061 Eth | 0.055143518954259549 | ||
0xD5072A05...12A8AbbBE | 11.843181640709237106 Eth | 11.898325159663496655 Eth | 0.055143518954259549 | ||
0xD6E329A4...aA35acC9f | 0.135923085608510658 Eth | 0.273781882994159509 Eth | 0.137858797385648851 | ||
0xe52E3315...3BF53D9C1 | 51.135498008209684674 Eth | 51.156176827817532003 Eth | 0.020678819607847329 | ||
0xE80F98Bd...B66Ec6ecF | 56.83067625224863232 Eth | 56.885819771202891869 Eth | 0.055143518954259549 | ||
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 851.551947070267487734 Eth | 851.553547786267487734 Eth | 0.001600716 | |
0xff1EbcE7...63A92EA1A | 0.271741650998953508 Eth | 0.547459245770251211 Eth | 0.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( )
distributeCommission[SuperOneSpots (ln:231)]
transfer[SuperOneSpots (ln:234)]
CommissionSent[SuperOneSpots (ln:235)]
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; } }