IndividuallyCappedCrowdsale.sol 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. pragma solidity ^0.4.24;
  2. import "../../math/SafeMath.sol";
  3. import "../Crowdsale.sol";
  4. import "../../access/roles/CapperRole.sol";
  5. /**
  6. * @title IndividuallyCappedCrowdsale
  7. * @dev Crowdsale with per-beneficiary caps.
  8. */
  9. contract IndividuallyCappedCrowdsale is Crowdsale, CapperRole {
  10. using SafeMath for uint256;
  11. mapping(address => uint256) private _contributions;
  12. mapping(address => uint256) private _caps;
  13. /**
  14. * @dev Sets a specific beneficiary's maximum contribution.
  15. * @param beneficiary Address to be capped
  16. * @param cap Wei limit for individual contribution
  17. */
  18. function setCap(address beneficiary, uint256 cap) external onlyCapper {
  19. _caps[beneficiary] = cap;
  20. }
  21. /**
  22. * @dev Returns the cap of a specific beneficiary.
  23. * @param beneficiary Address whose cap is to be checked
  24. * @return Current cap for individual beneficiary
  25. */
  26. function getCap(address beneficiary) public view returns (uint256) {
  27. return _caps[beneficiary];
  28. }
  29. /**
  30. * @dev Returns the amount contributed so far by a specific beneficiary.
  31. * @param beneficiary Address of contributor
  32. * @return Beneficiary contribution so far
  33. */
  34. function getContribution(address beneficiary) public view returns (uint256) {
  35. return _contributions[beneficiary];
  36. }
  37. /**
  38. * @dev Extend parent behavior requiring purchase to respect the beneficiary's funding cap.
  39. * @param beneficiary Token purchaser
  40. * @param weiAmount Amount of wei contributed
  41. */
  42. function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
  43. super._preValidatePurchase(beneficiary, weiAmount);
  44. require(_contributions[beneficiary].add(weiAmount) <= _caps[beneficiary]);
  45. }
  46. /**
  47. * @dev Extend parent behavior to update beneficiary contributions
  48. * @param beneficiary Token purchaser
  49. * @param weiAmount Amount of wei contributed
  50. */
  51. function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal {
  52. super._updatePurchasingState(beneficiary, weiAmount);
  53. _contributions[beneficiary] = _contributions[beneficiary].add(weiAmount);
  54. }
  55. }