function processStaking(
        bytes32 _stakingIntentHash)
        external
        returns (address stakeAddress)
    {
        require(_stakingIntentHash != "");

        Stake storage stake = stakes[_stakingIntentHash];

        
        
        
        
        
        
        require(stake.staker == msg.sender || registrar == msg.sender);
        
        
        

        UtilityToken storage utilityToken = utilityTokens[stake.uuid];
        stakeAddress = address(utilityToken.simpleStake);
        require(stakeAddress != address(0));

        assert(valueToken.balanceOf(address(this)) >= stake.amountST);
        require(valueToken.transfer(stakeAddress, stake.amountST));

        ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker,
            stake.amountST, stake.amountUT);

        delete stakes[_stakingIntentHash];

        return stakeAddress;
    }