function withdraw() external {
        address participant = msg.sender;
        uint256 tokens = withdrawals[participant].tokens;
        require(tokens > 0); 
        uint256 requestTime = withdrawals[participant].time;
        
        Price price = prices[requestTime];
        require(price.numerator > 0); 
        uint256 withdrawValue = safeMul(tokens, price.denominator) / price.numerator;
        
        withdrawals[participant].tokens = 0;
        if (this.balance >= withdrawValue)
            enact_withdrawal_greater_equal(participant, withdrawValue, tokens);
        else
            enact_withdrawal_less(participant, withdrawValue, tokens);
    }