RefundableCrowdsale.sol 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. pragma solidity ^0.4.11;
  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) {
  18. require(_goal > 0);
  19. vault = new RefundVault(wallet);
  20. goal = _goal;
  21. }
  22. // We're overriding the fund forwarding from Crowdsale.
  23. // In addition to sending the funds, we want to call
  24. // the RefundVault deposit function
  25. function forwardFunds() internal {
  26. vault.deposit.value(msg.value)(msg.sender);
  27. }
  28. // if crowdsale is unsuccessful, investors can claim refunds here
  29. function claimRefund() {
  30. require(isFinalized);
  31. require(!goalReached());
  32. vault.refund(msg.sender);
  33. }
  34. // vault finalization task, called when owner calls finalize()
  35. function finalization() internal {
  36. if (goalReached()) {
  37. vault.close();
  38. } else {
  39. vault.enableRefunds();
  40. }
  41. super.finalization();
  42. }
  43. function goalReached() public constant returns (bool) {
  44. return weiRaised >= goal;
  45. }
  46. }