mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
76 lines
2.0 KiB
Solidity
76 lines
2.0 KiB
Solidity
pragma solidity ^0.4.11;
|
|
|
|
/**
|
|
* @title DayLimit
|
|
* @dev Base contract that enables methods to be protected by placing a linear limit (specifiable)
|
|
* on a particular resource per calendar day. Is multiowned to allow the limit to be altered.
|
|
*/
|
|
contract DayLimit {
|
|
|
|
uint256 public dailyLimit;
|
|
uint256 public spentToday;
|
|
uint256 public lastDay;
|
|
|
|
/**
|
|
* @dev Constructor that sets the passed value as a dailyLimit.
|
|
* @param _limit uint256 to represent the daily limit.
|
|
*/
|
|
constructor(uint256 _limit) {
|
|
dailyLimit = _limit;
|
|
lastDay = today();
|
|
}
|
|
|
|
/**
|
|
* @dev sets the daily limit. Does not alter the amount already spent today.
|
|
* @param _newLimit uint256 to represent the new limit.
|
|
*/
|
|
function _setDailyLimit(uint256 _newLimit) internal {
|
|
dailyLimit = _newLimit;
|
|
}
|
|
|
|
/**
|
|
* @dev Resets the amount already spent today.
|
|
*/
|
|
function _resetSpentToday() internal {
|
|
spentToday = 0;
|
|
}
|
|
|
|
/**
|
|
* @dev Checks to see if there is enough resource to spend today. If true, the resource may be expended.
|
|
* @param _value uint256 representing the amount of resource to spend.
|
|
* @return A boolean that is True if the resource was spended and false otherwise.
|
|
*/
|
|
function underLimit(uint256 _value) internal returns (bool) {
|
|
// reset the spend limit if we're on a different day to last time.
|
|
if (today() > lastDay) {
|
|
spentToday = 0;
|
|
lastDay = today();
|
|
}
|
|
// check to see if there's enough left - if so, subtract and return true.
|
|
// overflow protection // dailyLimit check
|
|
if (spentToday + _value >= spentToday && spentToday + _value <= dailyLimit) {
|
|
spentToday += _value;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @dev Private function to determine today's index
|
|
* @return uint256 of today's index.
|
|
*/
|
|
function today() private view returns (uint256) {
|
|
return now / 1 days;
|
|
}
|
|
|
|
/**
|
|
* @dev Simple modifier for daily limit.
|
|
*/
|
|
modifier limitedDaily(uint256 _value) {
|
|
if (!underLimit(_value)) {
|
|
throw;
|
|
}
|
|
_;
|
|
}
|
|
}
|