Allowances

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.