function merge() public returns (bool success) {

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            

            bytes32 future_challengeNumber = block.blockhash(block.number - 1);

            if(challengeNumber == future_challengeNumber){
                return false; 
            }

            if(ERC918Interface(parentAddress).lastRewardTo() != msg.sender){
                return false; 
            }
            

            if(ERC918Interface(parentAddress).lastRewardEthBlockNumber() != block.number){
                return false; 
            }

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            bytes32 parentChallengeNumber = ERC918Interface(parentAddress).challengeNumber();
            bytes32 solution = solutionForChallenge[parentChallengeNumber];
            if(solution != 0x0) return false;  

            
            
            
            bytes32 digest = 'merge';
            solutionForChallenge[challengeNumber] = digest;

            

            uint reward_amount = getMiningReward();

            balances[msg.sender] = balances[msg.sender].add(reward_amount);

            tokensMinted = tokensMinted.add(reward_amount);


            
            assert(tokensMinted <= maxSupplyForEra);

            
            lastRewardTo = msg.sender;
            lastRewardAmount = reward_amount;
            lastRewardEthBlockNumber = block.number;


            _startNewMiningEpoch();

            Mint(msg.sender, reward_amount, epochCount, 0 ); 

            return true;

    }