function adminWithdraw(
        address token, 
        uint256 amount, 
        address user, 
        uint256 nonce, 
        uint8 v, 
        bytes32 r, 
        bytes32 s, 
        uint256 feeWithdrawal 
    ) onlyAdmin returns (bool success) {
        bytes32 hash = keccak256(this, token, amount, user, nonce); 
        if (withdrawn[hash]) throw; 
        withdrawn[hash] = true; 
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw; 
        if (feeWithdrawal > 50 finney) feeWithdrawal = 50 finney; 


        
        if (availableBalanceOf(token, user) < amount) throw; 

        
        subBalance(token, user, amount); 

        
        subBalance(address(0), user, feeWithdrawal); 

        
        addBalance(address(0), feeAccount, feeWithdrawal); 

        if (token == address(0)) { 
            if (!user.send(amount)) throw; 
        } else {
            if (!Token(token).transfer(user, amount)) throw; 
        }
        lastActiveTransaction[user] = block.number; 
        emit Withdraw(token, user, amount, balanceOf(token, user), feeWithdrawal); 
    }