123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- pragma solidity ^0.4.21;
- import "../../../math/SafeMath.sol";
- import "../../../ownership/Ownable.sol";
- /**
- * @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.
- */
- 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);
- }
- }
|