Treasury

1. The fee sink

Each pool’s treasury() is a plain address, not a contract. Pool.initialize seeds it from AccessControl.treasury() and reverts on zero; it moves afterwards only through the UPDATE_TREASURY op (GOVERNANCE tier, 7 days). Only that exact address may pull the pool’s accrued protocol fees (Admin.sol, collectProtocolFees).

2. Untrusted by design

The treasury is a pointer the owner rotates, not a principal (Access Control §1). It is untrusted: it calls collectProtocolFees and nothing else. Reserves, liabilities, LP positions and parameters are out of its reach.

3. Rotation

AccessControl.treasury() is a pointer, not a principal. The owner rotates it through queueRole(TREASURY)executeRole at the GOVERNANCE tier, guardian-cancellable while pending. previousTreasury() keeps the outgoing address payable for one GOVERNANCE delay plus the grace period, so a pool mid-rotation still settles.

Tier durations: Access Control §3.