/
RefundVault.sol
60 lines (50 loc) · 1.7 KB
/
RefundVault.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
pragma solidity ^0.4.18;
import './SafeMath.sol';
import './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 {
using SafeMath for uint256;
enum State { Active, Refunding, Released}
mapping (address => uint256) public vault_deposited;
address public vault_wallet;
State public vault_state;
uint256 totalDeposited = 0;
uint256 public refundDeadline;
event DepositReleased();
event RefundsEnabled();
event RefundsDisabled();
event Refunded(address indexed beneficiary, uint256 weiAmount);
function RefundVault() public {
vault_state = State.Active;
}
function vault_deposit(address investor, uint256 _value) internal {
require(vault_state == State.Active);
vault_deposited[investor] = vault_deposited[investor].add(_value);
totalDeposited = totalDeposited.add(_value);
}
function vault_releaseDeposit() internal {
vault_state = State.Released;
DepositReleased();
if (totalDeposited > 0) {vault_wallet.transfer(totalDeposited);}
totalDeposited = 0;
}
function vault_enableRefunds() internal {
require(vault_state == State.Active);
refundDeadline = now + 180 days;
vault_state = State.Refunding;
RefundsEnabled();
}
function vault_refund(address investor) internal {
require(vault_state == State.Refunding);
uint256 depositedValue = vault_deposited[investor];
vault_deposited[investor] = 0;
investor.transfer(depositedValue);
Refunded(investor, depositedValue);
totalDeposited = totalDeposited.sub(depositedValue);
}
}