Change-rate constraints
The implementation of the lethargic governance bounds.
The bound
For any parameter θ, prior value θ₀, proposed value θ₁, the contract enforces:
This is a per-window bound enforced inside Parameterized._setTargetIf. It cannot be bypassed by governance.
Per-parameter rate limit
The rate limit is timestamp-based, not cycle-numbered. The Limited modifier is wired into Parameterized with window Constant.MONTH ≈ 30.44 days. Mechanically:
- A per-parameter mapping
_times[key]stores the earliestblock.timestampat which the next change is allowed. - On a successful change,
_times[key]is set toblock.timestamp + Constant.MONTH. - Any subsequent change to the same parameter before that timestamp reverts.
There is no separate cycle counter, no lastChangeCycle field, and no CYCLE constant — just per-parameter timestamps and the MONTH-wide window.
What this enforces
With a 2× per-window upper-bound:
- A 10× change requires at least 4 windows (
2⁴ = 16 ≥ 10) — ≈ 4 months. - A 64× change requires 6 windows (
2⁶ = 64) — ≈ 6 months. - A 1024× change requires 10 windows (
2¹⁰ = 1024) — ≈ 10 months.
The protocol cannot accelerate this. Even with unlimited governance power, the contract will reject changes that exceed the per-window 2× upper bound or arrive before the window timer has elapsed.
Asymptotic transition
In addition to the bound, each approved change phases in via the asymptotic curve described in Transition curves. The effective value is a function of time since the proposal was committed.