RefundableCrowdsale.sol 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. pragma solidity ^0.4.18;
  2. import "../math/SafeMath.sol";
  3. import "./FinalizableCrowdsale.sol";
  4. import "./RefundVault.sol";
  5. /**
  6. * @title RefundableCrowdsale
  7. * @dev Extension of Crowdsale contract that adds a funding goal, and
  8. * the possibility of users getting a refund if goal is not met.
  9. * Uses a RefundVault as the crowdsale's vault.
  10. */
  11. contract RefundableCrowdsale is FinalizableCrowdsale {
  12. using SafeMath for uint256;
  13. // minimum amount of funds to be raised in weis
  14. uint256 public goal;
  15. // refund vault used to hold funds while crowdsale is running
  16. RefundVault public vault;
  17. function RefundableCrowdsale(uint256 _goal) public {
  18. require(_goal > 0);
  19. vault = new RefundVault(wallet);
  20. goal = _goal;
  21. }
  22. // if crowdsale is unsuccessful, investors can claim refunds here
  23. function claimRefund() public {
  24. require(isFinalized);
  25. require(!goalReached());
  26. vault.refund(msg.sender);
  27. }
  28. function goalReached() public view returns (bool) {
  29. return weiRaised >= goal;
  30. }
  31. // vault finalization task, called when owner calls finalize()
  32. function finalization() internal {
  33. if (goalReached()) {
  34. vault.close();
  35. } else {
  36. vault.enableRefunds();
  37. }
  38. super.finalization();
  39. }
  40. // We're overriding the fund forwarding from Crowdsale.
  41. // In addition to sending the funds, we want to call
  42. // the RefundVault deposit function
  43. function forwardFunds() internal {
  44. vault.deposit.value(msg.value)(msg.sender);
  45. }
  46. }