RefundableCrowdsale.sol 1.4 KB

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