Allowances
Allowances are a mechanism for enforcing spending limits or other kind of quotas for individual roles.
Structure
Allowances are centrally defined and can be referenced from conditions. Each allowance is stored as a tuple of the following shape:
struct Allowance {
  uint128 refill;
  uint128 maxRefill;
  uint64 period;
  uint128 balance;
  uint64 timestamp;
}period – Duration of the refill interval in seconds, 0 for one-time allowance
refill – Amount that will be refilled per interval
timestamp – Timestamp of the last interval refilled for
maxRefill – Max accrual amount, refilling stops once the unused allowance balance hits this value
balance – Unused allowance that can be spent
All fields can be manually updated.
Upon consumption of an allowance, the balance and timestamp fields will be updated automatically:
- Update the balance to reflect the accrual since the last refill
- Update the refill timestamp to the current interval's timestamp
- Subtract the consumed amount from the balance
Usage
There are three different ways allowances can be used:
Allowance on a uint field
To define an allowance on any uint field in the transaction call data, use a WithinAllowance condition.
Allowance on the Ether value
To define an allowance on the Ether value sent with the transaction, use an EtherWithinAllowance condition.
Call rate limits
It's also possible to enforce a rate limit on the number of calls to a function using a CallWithinAllowance condition.
Each call to the function will decrement the allowance balance by 1.