pragma solidity ^0.4.24; contract GoldenTree { uint FEE = 0.01 ether; uint PARENTS_LIST_SIZE = 5; struct Node { uint amountEarned; address parent; address[] children; } mapping(address => Node) tree; constructor () public { tree[msg.sender].parent = msg.sender; } function acceptInvite(address inviteFrom) public payable { require(tree[inviteFrom].parent != address(0)); require(tree[msg.sender].parent == address(0)); require(msg.value >= FEE * PARENTS_LIST_SIZE); require(address(this).balance >= FEE * PARENTS_LIST_SIZE); // set parent tree[msg.sender].parent = inviteFrom; //pay commision to parents address currentNode = msg.sender; for(uint i = 0; i < PARENTS_LIST_SIZE; i++) { if (tree[currentNode].parent != address(0)) { tree[currentNode].parent.transfer(FEE); tree[tree[currentNode].parent].amountEarned += FEE; currentNode = tree[currentNode].parent; } } // update children list for parent node tree[inviteFrom].children.push(msg.sender); } function getNodeInfo(address addr) public view returns( uint amountEarned, address parentNodeAddress, uint parentNodeAmountEarned, address[] childrenAddresses, uint[] childrenEarnedAmount ) { amountEarned = tree[addr].amountEarned; parentNodeAddress = tree[addr].parent; parentNodeAmountEarned = tree[tree[addr].parent].amountEarned; childrenAddresses = tree[addr].children; childrenEarnedAmount = new uint[](tree[addr].children.length); for(uint i=0; i < tree[addr].children.length; i++) { childrenEarnedAmount[i] = tree[tree[addr].children[i]].amountEarned; } } }
0.4.24