contract RefundVault is Ownable {
	using SafeMath for uint256;

	enum State {
		Active,
		Refunding,
		Closed
	}

	mapping(address => uint256)public deposited;
	address public wallet;
	State public state;

	event Closed();
	event RefundsEnabled();
	event Refunded(address indexed beneficiary, uint256 weiAmount);

	/**
	 * @param _wallet Vault address
	 */
	function RefundVault(address _wallet)public {
		require(_wallet != address(0));
		wallet = _wallet;
		state = State.Active;
	}

	/**
	 * @param investor Investor address
	 */
	function deposit(address investor)onlyOwner public payable {
		require(state == State.Active);
		deposited[investor] = deposited[investor].add(msg.value);
	}

	function close()onlyOwner public {
		require(state == State.Active);
		state = State.Closed;
		emit Closed();
		wallet.transfer(address(this).balance);
	}

	function enableRefunds()onlyOwner public {
		require(state == State.Active);
		state = State.Refunding;
		emit RefundsEnabled();
	}

	/**
	 * @param investor Investor address
	 */
	function refund(address investor)public {
		require(state == State.Refunding);
		uint256 depositedValue = deposited[investor];
		deposited[investor] = 0;
		investor.transfer(depositedValue);
		emit Refunded(investor, depositedValue);
	}
}
/**
 * @title RefundVault
 * @dev This contract is used for storing funds while a crowdsale
 * is in progress. Supports refunding the money if crowdsale fails,
 * and forwarding it if crowdsale is successful.
 */
function deposit(address investor)onlyOwner public payable {
	require(state == State.Active);
	deposited[investor] = deposited[investor].add(msg.value);
}

/**
 	 * @param investor Investor address
 	 */