function merge() external returns (bool success) {
        
        if (miningLeader.lastRewardTo() != msg.sender) {
            
            
            return false;
        }
            
        
        if (miningLeader.lastRewardEthBlockNumber() != block.number) {
            
            
            return false;
        }

        
        
        
        bytes32 challengeNumber = miningLeader.getChallengeNumber();
        bytes32 solution = solutionForChallenge[challengeNumber];
        if (solution != 0x0) return false; 
        
        bytes32 digest = 'merge';
        solutionForChallenge[challengeNumber] = digest;

        
        
        
        
        uint reward = getRewardAmount();
        
        
        unclaimedRewards = unclaimedRewards.add(reward);

        
        mintHelperRewards[msg.sender] = mintHelperRewards[msg.sender].add(reward);

        
        uint balance = zeroGold.balanceOf(address(this));

        
        assert(mintHelperRewards[msg.sender] <= balance);

        
        epochCount = epochCount.add(1);

        
        emit Mint(msg.sender, mintHelperRewards[msg.sender], epochCount, 0);

        return true;
    }