RefundableCrowdsale.sol 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. pragma solidity ^0.4.24;
  2. import "../../math/SafeMath.sol";
  3. import "./FinalizableCrowdsale.sol";
  4. import "./utils/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. /**
  18. * @dev Constructor, creates RefundVault.
  19. * @param _goal Funding goal
  20. */
  21. constructor(uint256 _goal) public {
  22. require(_goal > 0);
  23. vault = new RefundVault(wallet);
  24. goal = _goal;
  25. }
  26. /**
  27. * @dev Investors can claim refunds here if crowdsale is unsuccessful
  28. */
  29. function claimRefund() public {
  30. require(isFinalized);
  31. require(!goalReached());
  32. vault.refund(msg.sender);
  33. }
  34. /**
  35. * @dev Checks whether funding goal was reached.
  36. * @return Whether funding goal was reached
  37. */
  38. function goalReached() public view returns (bool) {
  39. return weiRaised >= goal;
  40. }
  41. /**
  42. * @dev vault finalization task, called when owner calls finalize()
  43. */
  44. function finalization() internal {
  45. if (goalReached()) {
  46. vault.close();
  47. } else {
  48. vault.enableRefunds();
  49. }
  50. super.finalization();
  51. }
  52. /**
  53. * @dev Overrides Crowdsale fund forwarding, sending funds to vault.
  54. */
  55. function _forwardFunds() internal {
  56. vault.deposit.value(msg.value)(msg.sender);
  57. }
  58. }