IndividuallyCappedCrowdsale.sol 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. pragma solidity ^0.5.0;
  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. // solhint-disable-next-line max-line-length
  45. require(_contributions[beneficiary].add(weiAmount) <= _caps[beneficiary], "IndividuallyCappedCrowdsale: beneficiary's cap exceeded");
  46. }
  47. /**
  48. * @dev Extend parent behavior to update beneficiary contributions.
  49. * @param beneficiary Token purchaser
  50. * @param weiAmount Amount of wei contributed
  51. */
  52. function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal {
  53. super._updatePurchasingState(beneficiary, weiAmount);
  54. _contributions[beneficiary] = _contributions[beneficiary].add(weiAmount);
  55. }
  56. }