RefundableCrowdsale.sol 1.4 KB

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