|
@@ -0,0 +1,75 @@
|
|
|
+pragma solidity ^0.4.4;
|
|
|
+
|
|
|
+
|
|
|
+import './Shareable.sol';
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * DayLimit
|
|
|
+ *
|
|
|
+ * inheritable "property" 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. resource that method
|
|
|
+ * uses is specified in the modifier.
|
|
|
+ */
|
|
|
+contract DayLimit is Shareable {
|
|
|
+ // FIELDS
|
|
|
+
|
|
|
+ uint public dailyLimit;
|
|
|
+ uint public spentToday;
|
|
|
+ uint public lastDay;
|
|
|
+
|
|
|
+
|
|
|
+ // MODIFIERS
|
|
|
+
|
|
|
+ // simple modifier for daily limit.
|
|
|
+ modifier limitedDaily(uint _value) {
|
|
|
+ if (underLimit(_value))
|
|
|
+ _;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // CONSTRUCTOR
|
|
|
+ // stores initial daily limit and records the present day's index.
|
|
|
+ function DayLimit(uint _limit) {
|
|
|
+ dailyLimit = _limit;
|
|
|
+ lastDay = today();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // METHODS
|
|
|
+
|
|
|
+ // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
|
|
|
+ function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external {
|
|
|
+ dailyLimit = _newLimit;
|
|
|
+ }
|
|
|
+
|
|
|
+ // resets the amount already spent today. needs many of the owners to confirm
|
|
|
+ function resetSpentToday() onlymanyowners(sha3(msg.data)) external {
|
|
|
+ spentToday = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // INTERNAL METHODS
|
|
|
+
|
|
|
+ // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
|
|
|
+ // returns true. otherwise just returns false.
|
|
|
+ function underLimit(uint _value) internal onlyowner 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ // determines today's index.
|
|
|
+ function today() private constant returns (uint) {
|
|
|
+ return now / 1 days;
|
|
|
+ }
|
|
|
+}
|