Overview
Reserve Folio uses a role-based access control (RBAC) system to separate concerns and enable secure, flexible governance. Each role has specific permissions designed to balance security with operational flexibility.Role Constants
Roles are defined asbytes32 constants:
Reserve Folio uses OpenZeppelin’s
AccessControlEnumerable for role management, allowing enumeration of all role members.Core Roles
DEFAULT_ADMIN_ROLE
The primary owner and administrator of the Folio.DEFAULT_ADMIN_ROLE
Expected Holder: Timelock of Slow Folio GovernorPermissions:
- Add/remove basket assets
- Set fees (TVL, mint, folio self fee)
- Configure fee recipients
- Set auction parameters (max auction length)
- Configure other roles (grant/revoke)
- Set mandate (mission statement)
- Set Folio name
- Configure trusted filler registry
- Set rebalance control parameters
- Enable/disable permissionless bids
- Configure trade allowlist
- Deprecate the Folio
- Close auctions and rebalances
Key Functions
- Asset Management
- Fee Configuration
- System Configuration
- Emergency Actions
REBALANCE_MANAGER
Controls the rebalancing process and auction lifecycle.REBALANCE_MANAGER
Expected Holder: Timelock of Fast Folio GovernorPermissions:
- Start rebalances with target parameters
- End rebalances early
- Close individual auctions
Key Functions
Responsibilities
Setting Rebalance Targets
Setting Rebalance Targets
- Define token inclusion and weights
- Set conservative price ranges
- Configure basket limits (BU/share targets)
- Set auction launcher window duration
- Set rebalance TTL
Risk Management
Risk Management
- Monitor ongoing rebalances
- End rebalances if market conditions change dramatically
- Coordinate with AUCTION_LAUNCHER on execution
- Ensure price ranges remain appropriate
REBALANCE_MANAGER typically has a shorter timelock than DEFAULT_ADMIN_ROLE (1-3 days) to enable responsive rebalancing.
AUCTION_LAUNCHER
Provides precision and responsiveness during rebalancing.AUCTION_LAUNCHER
Expected Holder: EOA or Multisig (semi-trusted)Permissions:
- Open auctions during restricted period
- Select subset of tokens for each auction
- Adjust basket weight ranges (if weightControl enabled)
- Adjust price ranges (if priceControl != NONE)
- Adjust basket limits (within governance range)
- Set individual auction lengths
- End auctions and rebalances
Key Functions
Trust Assumptions
Price Control Impact
- NONE
- PARTIAL
- ATOMIC_SWAP
No Price ControlAUCTION_LAUNCHER cannot modify prices from governance-set ranges.
- Most restrictive
- Auction length must be
maxAuctionLength - Safest for untrusted AUCTION_LAUNCHER
Revocation
If AUCTION_LAUNCHER behaves maliciously:BRAND_MANAGER
An optional, permissionless role for off-chain use.BRAND_MANAGER
Expected Holder: Marketing/Brand team (optional)Permissions: NONE (on-chain)Purpose: Off-chain identification of brand managers for marketing, social media, and community management.
BRAND_MANAGER has no on-chain permissions. It exists purely for off-chain tooling and identification purposes.
Role Management
Roles are managed using OpenZeppelin’s AccessControl:Granting Roles
Revoking Roles
Renouncing Roles
Querying Roles
Typical Role Configuration
A well-configured Folio typically has:1
DEFAULT_ADMIN_ROLE
Holder: Slow Governor’s Timelock (7-14 day delay)Purpose: Critical parameter changes and emergency actions
2
REBALANCE_MANAGER
Holder: Fast Governor’s Timelock (1-3 day delay)Purpose: Start and manage rebalances
3
AUCTION_LAUNCHER
Holder: Trusted EOA or Multisig (no timelock)Purpose: Responsive auction execution
4
BRAND_MANAGER
Holder: Brand/Marketing team (optional)Purpose: Off-chain identification
Multi-Holder Roles
Roles can have multiple holders:Role Transition
Transitioning roles should be done carefully:1
Grant New Role
2
Test New Holder
Verify the new role holder can perform their duties before removing the old one.
3
Revoke Old Role
Emergency Scenarios
Compromised AUCTION_LAUNCHER
1
Immediate Revocation
2
End Active Rebalance
3
Grant New Role
Lost AUCTION_LAUNCHER Access
If AUCTION_LAUNCHER goes offline:No immediate action needed. After the restricted period expires, auctions can be opened permissionlessly via
openAuctionUnrestricted().Lost DEFAULT_ADMIN_ROLE Access
Best Practices
Role Holder Selection
Role Holder Selection
DEFAULT_ADMIN_ROLE:
- MUST be a timelock (7-14 days)
- Controlled by slow, careful governance
- Multiple signers if using multisig governance
- SHOULD be a timelock (1-3 days)
- Controlled by faster governance
- Same voting token as DEFAULT_ADMIN_ROLE
- CAN be EOA or multisig
- Should be trusted but replace if malicious
- Consider multisig with 2-of-3 or 3-of-5
Timelock Configuration
Timelock Configuration
- Longer delays for higher privilege roles
- Balance security with responsiveness
- Document timelock parameters
- Test timelock execution before mainnet
Monitoring and Response
Monitoring and Response
- Monitor all role-gated function calls
- Set up alerts for privilege escalation
- Review role membership periodically
- Have revocation procedures ready
- Document emergency response plans
Documentation
Documentation
- Document role holders publicly
- Explain role responsibilities
- Maintain contact information
- Update documentation when roles change
- Be transparent about role holder identities