Transaction Hash:
Block:
10474107 at Jul-17-2020 01:53:44 AM +UTC
Transaction Fee:
0.0131607099 ETH
$25.08
Gas Used:
374,949 Gas / 35.1 Gwei
Emitted Events:
34 |
LionShare.Registration( member=[Sender] 0xa072513b46fab8378c689201ef91a9fbbb9ff0a6, memberId=31173, sponsor=0xf21253414649d24ac3b8b0506d62a17269fe21e6 )
|
35 |
LionShare.PlacementL1( member=[Sender] 0xa072513b46fab8378c689201ef91a9fbbb9ff0a6, sponsor=0xf21253414649d24ac3b8b0506d62a17269fe21e6, level=1, placement=2, passup=False )
|
36 |
LionShare.PlacementL2( member=[Sender] 0xa072513b46fab8378c689201ef91a9fbbb9ff0a6, sponsor=0xf21253414649d24ac3b8b0506d62a17269fe21e6, level=1, placementSide=2, placedUnder=0x8244aFa9...A51006C67, passup=False )
|
37 |
LionShare.FundsPayout( member=0xf21253414649d24ac3b8b0506d62a17269fe21e6, payoutFrom=[Sender] 0xa072513b46fab8378c689201ef91a9fbbb9ff0a6, matrix=1, level=1 )
|
38 |
LionShare.FundsPayout( member=0xf21253414649d24ac3b8b0506d62a17269fe21e6, payoutFrom=[Sender] 0xa072513b46fab8378c689201ef91a9fbbb9ff0a6, matrix=2, level=1 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x5A0b54D5...D3E029c4c
Miner
| (Spark Pool) | 76.422849674009015526 Eth | 76.436010383909015526 Eth | 0.0131607099 | |
0x9047237b...A605CdFE7 | (LionsShare.io) | ||||
0xA072513B...bbb9Ff0A6 |
0.08836494 Eth
Nonce: 0
|
0.0352042301 Eth
Nonce: 1
| 0.0531607099 | ||
0xF2125341...269fe21e6 | 0.041819629488345 Eth | 0.081819629488345 Eth | 0.04 |
Execution Trace
ETH 0.04
LionShare.registration( _sponsor=0xF21253414649D24AC3b8B0506d62A17269fe21e6 )
- ETH 0.02
0xf21253414649d24ac3b8b0506d62a17269fe21e6.CALL( )
- ETH 0.02
0xf21253414649d24ac3b8b0506d62a17269fe21e6.CALL( )
registration[LionShare (ln:129)]
preRegistration[LionShare (ln:130)]
createAccount[LionShare (ln:136)]
Account[LionShare (ln:156)]
Registration[LionShare (ln:159)]
handlePositionL1[LionShare (ln:140)]
L1[LionShare (ln:195)]
sponsorPlaceL1[LionShare (ln:205)]
PlacementL1[LionShare (ln:211)]
Cycle[LionShare (ln:214)]
sponsorPlaceL1[LionShare (ln:222)]
handlePositionL2[LionShare (ln:141)]
L2[LionShare (ln:233)]
sponsorPlaceL2[LionShare (ln:243)]
push[LionShare (ln:258)]
positionPlaceLastLevelL2[LionShare (ln:264)]
Cycle[LionShare (ln:329)]
sponsorPlaceL2[LionShare (ln:338)]
push[LionShare (ln:286)]
Cycle[LionShare (ln:291)]
sponsorPlaceL2[LionShare (ln:300)]
PlacementL2[LionShare (ln:304)]
handlePayout[LionShare (ln:143)]
findPayoutReceiver[LionShare (ln:464)]
handleReEntryL1[LionShare (ln:434)]
findActiveSponsor[LionShare (ln:372)]
FundsPassup[LionShare (ln:352)]
PlacementReEntry[LionShare (ln:382)]
handleReEntryL2[LionShare (ln:456)]
findActiveSponsor[LionShare (ln:401)]
FundsPassup[LionShare (ln:352)]
PlacementReEntry[LionShare (ln:410)]
FundsPayout[LionShare (ln:466)]
call[LionShare (ln:468)]
call[LionShare (ln:471)]
handlePayout[LionShare (ln:144)]
findPayoutReceiver[LionShare (ln:464)]
handleReEntryL1[LionShare (ln:434)]
findActiveSponsor[LionShare (ln:372)]
FundsPassup[LionShare (ln:352)]
PlacementReEntry[LionShare (ln:382)]
handleReEntryL2[LionShare (ln:456)]
findActiveSponsor[LionShare (ln:401)]
FundsPassup[LionShare (ln:352)]
PlacementReEntry[LionShare (ln:410)]
FundsPayout[LionShare (ln:466)]
call[LionShare (ln:468)]
call[LionShare (ln:471)]
// SPDX-License-Identifier: BSD-3-Clause /** * * ##### / ####### / * ###### / # / ### #/ * /# / / ### / ## ## * / / / # ## # ## * / / ### ## * ## ## ### /### ### /### /### ## ### ## /## /### ### /### /## * ## ## ### / ### / ###/ #### / / #### / ### ### ## / ### / ### / ###/ #### / / ### * ## ## ## / ###/ ## ###/ ## ###/ ### ### ##/ ### / ###/ ## ###/ / ### * ## ## ## ## ## ## ## k #### ### /## ## ## ## ## ## ## ### * ## ## ## ## ## ## ## a ### #/ /## ## ## ## ## ## ######## * # ## ## ## ## ## ## i ### #/ ## ## ## ## ## ## ####### * / ## ## ## ## ## z ### # / ## ## ## ## ## ## * /##/ / ## ## ## ## ## e /### ## /## / ## ## ## /# ## #### / * / ############/ ### / ###### ### ### n / #### / / ########/ ## ## ####/ ## ### ######/ * / ######### ##/ #### ### ### - ###/ / ##### ## ## ### ## ### ##### * # w | / * ## e \) / * b / * / * * * Lion's Share is the very first true follow-me matrix smart contract ever created. * https://www.lionsshare.io * Get your share, join today! */ pragma solidity 0.6.8; contract LionShare { struct Account { uint32 id; uint32 directSales; uint8[] activeLevel; bool exists; address sponsor; mapping(uint8 => L1) x31Positions; mapping(uint8 => L2) x22Positions; } struct L1 { uint32 directSales; uint16 cycles; uint8 passup; uint8 reEntryCheck; uint8 placement; address sponsor; } struct L2 { uint32 directSales; uint16 cycles; uint8 passup; uint8 cycle; uint8 reEntryCheck; uint8 placementLastLevel; uint8 placementSide; address sponsor; address placedUnder; address[] placementFirstLevel; } uint internal constant ENTRY_ENABLED = 1; uint internal constant ENTRY_DISABLED = 2; uint public constant REENTRY_REQ = 2; mapping(address => Account) public members; mapping(uint32 => address) public idToMember; mapping(uint8 => uint) public levelCost; uint internal reentry_status; uint32 public lastId; uint8 public topLevel; address internal owner; event Registration(address member, uint memberId, address sponsor); event Upgrade(address member, address sponsor, uint8 matrix, uint8 level); event PlacementL1(address member, address sponsor, uint8 level, uint8 placement, bool passup); event PlacementL2(address member, address sponsor, uint8 level, uint8 placementSide, address placedUnder, bool passup); event Cycle(address indexed member, address fromPosition, uint8 matrix, uint8 level); event PlacementReEntry(address indexed member, address reEntryFrom, uint8 matrix, uint8 level); event FundsPayout(address indexed member, address payoutFrom, uint8 matrix, uint8 level); event FundsPassup(address indexed member, address passupFrom, uint8 matrix, uint8 level); modifier isOwner(address _account) { require(owner == _account, "Restricted Access!"); _; } modifier isMember(address _addr) { require(members[_addr].exists, "Register Account First!"); _; } modifier blockReEntry() { require(reentry_status != ENTRY_DISABLED, "Security Block"); reentry_status = ENTRY_DISABLED; _; reentry_status = ENTRY_ENABLED; } constructor(address _addr) public { owner = msg.sender; reentry_status = ENTRY_ENABLED; levelCost[1] = 0.02 ether; topLevel = 1; createAccount(_addr, _addr, true); handlePositionL1(_addr, _addr, _addr, 1, true); handlePositionL2(_addr, _addr, _addr, 1, true); } fallback() external payable blockReEntry() { preRegistration(msg.sender, bytesToAddress(msg.data)); } receive() external payable blockReEntry() { preRegistration(msg.sender, idToMember[1]); } function registration(address _sponsor) external payable blockReEntry() { preRegistration(msg.sender, _sponsor); } function preRegistration(address _addr, address _sponsor) internal { require((levelCost[1] * 2) == msg.value, "Require .04 eth to register!"); createAccount(_addr, _sponsor, false); members[_sponsor].directSales++; handlePositionL1(_addr, _sponsor, _sponsor, 1, false); handlePositionL2(_addr, _sponsor, _sponsor, 1, false); handlePayout(_addr, 0, 1); handlePayout(_addr, 1, 1); } function createAccount(address _addr, address _sponsor, bool _initial) internal { require(!members[_addr].exists, "Already a member!"); if (_initial == false) { require(members[_sponsor].exists, "Sponsor dont exist!"); } lastId++; members[_addr] = Account({id: lastId, sponsor: _sponsor, exists: true, directSales: 0, activeLevel: new uint8[](2)}); idToMember[lastId] = _addr; emit Registration(_addr, lastId, _sponsor); } function purchaseLevel(uint8 _matrix, uint8 _level) external payable isMember(msg.sender) blockReEntry() { require((_matrix == 1 || _matrix == 2), "Invalid matrix identifier."); require((_level > 0 && _level <= topLevel), "Invalid matrix level."); uint8 activeLevel = members[msg.sender].activeLevel[(_matrix - 1)]; uint8 otherLevel = 1; if (_matrix == 2) { otherLevel = 0; } require((activeLevel < _level), "Already active at level!"); require((activeLevel == (_level - 1)), "Level upgrade req. in order!"); require(((members[msg.sender].activeLevel[otherLevel] * 2) >= _level), "Double upgrade exeeded."); require((msg.value == levelCost[_level]), "Wrong amount transferred."); address sponsor = members[msg.sender].sponsor; Upgrade(msg.sender, sponsor, _matrix, _level); if (_matrix == 1) { handlePositionL1(msg.sender, sponsor, findActiveSponsor(msg.sender, sponsor, 0, _level, true), _level, false); } else { handlePositionL2(msg.sender, sponsor, findActiveSponsor(msg.sender, sponsor, 1, _level, true), _level, false); } handlePayout(msg.sender, (_matrix - 1), _level); } function handlePositionL1(address _addr, address _mainSponsor, address _sponsor, uint8 _level, bool _initial) internal { Account storage member = members[_addr]; member.activeLevel[0] = _level; member.x31Positions[_level] = L1({sponsor: _sponsor, placement: 0, directSales: 0, cycles: 0, passup: 0, reEntryCheck: 0}); if (_initial == true) { return; } else if (_mainSponsor == _sponsor) { members[_mainSponsor].x31Positions[_level].directSales++; } else { member.x31Positions[_level].reEntryCheck = 1; } sponsorPlaceL1(_addr, _sponsor, _level, false); } function sponsorPlaceL1(address _addr, address _sponsor, uint8 _level, bool passup) internal { L1 storage position = members[_sponsor].x31Positions[_level]; emit PlacementL1(_addr, _sponsor, _level, (position.placement + 1), passup); if (position.placement >= 2) { emit Cycle(_sponsor, _addr, 1, _level); position.placement = 0; position.cycles++; if (_sponsor != idToMember[1]) { position.passup++; sponsorPlaceL1(_sponsor, position.sponsor, _level, true); } } else { position.placement++; } } function handlePositionL2(address _addr, address _mainSponsor, address _sponsor, uint8 _level, bool _initial) internal { Account storage member = members[_addr]; member.activeLevel[1] = _level; member.x22Positions[_level] = L2({sponsor: _sponsor, directSales: 0, cycles: 0, passup: 0, cycle: 0, reEntryCheck: 0, placementSide: 0, placedUnder: _sponsor, placementFirstLevel: new address[](0), placementLastLevel: 0}); if (_initial == true) { return; } else if (_mainSponsor == _sponsor) { members[_mainSponsor].x22Positions[_level].directSales++; } else { member.x22Positions[_level].reEntryCheck = 1; } sponsorPlaceL2(_addr, _sponsor, _level, false); } function sponsorPlaceL2(address _addr, address _sponsor, uint8 _level, bool passup) internal { L2 storage member = members[_addr].x22Positions[_level]; L2 storage position = members[_sponsor].x22Positions[_level]; if (position.placementFirstLevel.length < 2) { if (position.placementFirstLevel.length == 0) { member.placementSide = 1; } else { member.placementSide = 2; } member.placedUnder = _sponsor; position.placementFirstLevel.push(_addr); if (_sponsor != idToMember[1]) { position.passup++; } positionPlaceLastLevelL2(_addr, _sponsor, position.placedUnder, position.placementSide, _level); } else { if (position.placementLastLevel == 0) { member.placementSide = 1; member.placedUnder = position.placementFirstLevel[0]; position.placementLastLevel += 1; } else if ((position.placementLastLevel & 2) == 0) { member.placementSide = 2; member.placedUnder = position.placementFirstLevel[0]; position.placementLastLevel += 2; } else if ((position.placementLastLevel & 4) == 0) { member.placementSide = 1; member.placedUnder = position.placementFirstLevel[1]; position.placementLastLevel += 4; } else { member.placementSide = 2; member.placedUnder = position.placementFirstLevel[1]; position.placementLastLevel += 8; } if (member.placedUnder != idToMember[1]) { members[member.placedUnder].x22Positions[_level].placementFirstLevel.push(_addr); } } if ((position.placementLastLevel & 15) == 15) { emit Cycle(_sponsor, _addr, 2, _level); position.placementFirstLevel = new address[](0); position.placementLastLevel = 0; position.cycles++; if (_sponsor != idToMember[1]) { position.cycle++; sponsorPlaceL2(_sponsor, position.sponsor, _level, true); } } emit PlacementL2(_addr, _sponsor, _level, member.placementSide, member.placedUnder, passup); } function positionPlaceLastLevelL2(address _addr, address _sponsor, address _position, uint8 _placementSide, uint8 _level) internal { L2 storage position = members[_position].x22Positions[_level]; if (position.placementSide == 0 && _sponsor == idToMember[1]) { return; } if (_placementSide == 1) { if ((position.placementLastLevel & 1) == 0) { position.placementLastLevel += 1; } else { position.placementLastLevel += 2; } } else { if ((position.placementLastLevel & 4) == 0) { position.placementLastLevel += 4; } else { position.placementLastLevel += 8; } } if ((position.placementLastLevel & 15) == 15) { emit Cycle(_position, _addr, 2, _level); position.placementFirstLevel = new address[](0); position.placementLastLevel = 0; position.cycles++; if (_position != idToMember[1]) { position.cycle++; sponsorPlaceL2(_position, position.sponsor, _level, true); } } } function findActiveSponsor(address _addr, address _sponsor, uint8 _matrix, uint8 _level, bool _emit) internal returns (address) { address sponsorAddress = _sponsor; while (true) { if (members[sponsorAddress].activeLevel[_matrix] >= _level) { return sponsorAddress; } if (_emit == true) { emit FundsPassup(sponsorAddress, _addr, (_matrix + 1), _level); } sponsorAddress = members[sponsorAddress].sponsor; } } function handleReEntryL1(address _addr, uint8 _level) internal { L1 storage member = members[_addr].x31Positions[_level]; bool reentry = false; member.reEntryCheck++; if (member.reEntryCheck >= REENTRY_REQ) { address sponsor = members[_addr].sponsor; if (members[sponsor].activeLevel[0] >= _level) { member.reEntryCheck = 0; reentry = true; } else { sponsor = findActiveSponsor(_addr, sponsor, 0, _level, false); if (member.sponsor != sponsor && members[sponsor].activeLevel[0] >= _level) { reentry = true; } } if (reentry == true) { member.sponsor = sponsor; emit PlacementReEntry(sponsor, _addr, 1, _level); } } } function handleReEntryL2(address _addr, uint8 _level) internal { L2 storage member = members[_addr].x22Positions[_level]; bool reentry = false; member.reEntryCheck++; if (member.reEntryCheck >= REENTRY_REQ) { address sponsor = members[_addr].sponsor; if (members[sponsor].activeLevel[1] >= _level) { member.reEntryCheck = 0; member.sponsor = sponsor; reentry = true; } else { address active_sponsor = findActiveSponsor(_addr, sponsor, 1, _level, false); if (member.sponsor != active_sponsor && members[active_sponsor].activeLevel[1] >= _level) { member.sponsor = active_sponsor; reentry = true; } } if (reentry == true) { emit PlacementReEntry(member.sponsor, _addr, 2, _level); } } } function findPayoutReceiver(address _addr, uint8 _matrix, uint8 _level) internal returns (address) { address from; address receiver; if (_matrix == 0) { receiver = members[_addr].x31Positions[_level].sponsor; while (true) { L1 storage member = members[receiver].x31Positions[_level]; if (member.passup == 0) { return receiver; } member.passup--; from = receiver; receiver = member.sponsor; if (_level > 1 && member.reEntryCheck > 0) { handleReEntryL1(from, _level); } } } else { receiver = members[_addr].x22Positions[_level].sponsor; while (true) { L2 storage member = members[receiver].x22Positions[_level]; if (member.passup == 0 && member.cycle == 0) { return receiver; } if (member.passup > 0) { member.passup--; receiver = member.placedUnder; } else { member.cycle--; from = receiver; receiver = member.sponsor; if (_level > 1 && member.reEntryCheck > 0) { handleReEntryL2(from, _level); } } } } } function handlePayout(address _addr, uint8 _matrix, uint8 _level) internal { address receiver = findPayoutReceiver(_addr, _matrix, _level); emit FundsPayout(receiver, _addr, (_matrix + 1), _level); (bool success, ) = address(uint160(receiver)).call{ value: levelCost[_level], gas: 40000 }(""); if (success == false) { //Failsafe to prevent malicious contracts from blocking matrix (success, ) = address(uint160(idToMember[1])).call{ value: levelCost[_level], gas: 40000 }(""); require(success, 'Transfer Failed'); } } function getAffiliateId() external view returns (uint) { return members[msg.sender].id; } function getAffiliateWallet(uint32 memberId) external view returns (address) { return idToMember[memberId]; } function setupAccount(address _addr, address _sponsor, uint8 _level) external isOwner(msg.sender) { createAccount(_addr, _sponsor, false); compLevel(_addr, 1, _level); compLevel(_addr, 2, _level); } function compLevel(address _addr, uint8 _matrix, uint8 _level) public isOwner(msg.sender) isMember(_addr) { require((_matrix == 1 || _matrix == 2), "Invalid matrix identifier."); require((_level > 0 && _level <= topLevel), "Invalid matrix level."); uint8 matrix = _matrix - 1; uint8 activeLevel = members[_addr].activeLevel[matrix]; address sponsor = members[_addr].sponsor; require((activeLevel < _level), "Already active at level!"); for (uint8 num = (activeLevel + 1);num <= _level;num++) { Upgrade(_addr, sponsor, _matrix, num); if (matrix == 0) { handlePositionL1(_addr, sponsor, findActiveSponsor(_addr, sponsor, 0, num, true), num, false); } else { handlePositionL2(_addr, sponsor, findActiveSponsor(_addr, sponsor, 1, num, true), num, false); } } } function addLevel(uint _levelPrice) external isOwner(msg.sender) { require((levelCost[topLevel] < _levelPrice), "Check price point!"); topLevel++; levelCost[topLevel] = _levelPrice; handlePositionL1(idToMember[1], idToMember[1], idToMember[1], topLevel, true); handlePositionL2(idToMember[1], idToMember[1], idToMember[1], topLevel, true); } function updateLevelCost(uint8 _level, uint _levelPrice) external isOwner(msg.sender) { require((_level > 0 && _level <= topLevel), "Invalid matrix level."); require((_levelPrice > 0), "Check price point!"); if (_level > 1) { require((levelCost[(_level - 1)] < _levelPrice), "Check price point!"); } if (_level < topLevel) { require((levelCost[(_level + 1)] > _levelPrice), "Check price point!"); } levelCost[_level] = _levelPrice; } function bytesToAddress(bytes memory _source) private pure returns (address addr) { assembly { addr := mload(add(_source, 20)) } } }