Skip to main content
Source: src/FundManagerDeployer.sol

Responsibility

FundManagerDeployer is the protocol root — the single contract the protocol team deploys and operates. It:
  • Holds the canonical implementation addresses for every contract type in the system: Factory, FundManager, Fund, FundShare, DepositQueue, RedeemQueue, Oracle, FeeManager, RiskManager, and Strategy.
  • Creates FundManagers, one per tenant, each with its own fresh set of eight component factories.
  • Stores the protocol fee recipient, which every fund’s FeeManager resolves live at fee-accrual time (FeeManager → Fund → FundManager → deployer). Changing it here immediately applies to all funds across all tenants.
It has its own ACLModule access control and is itself deployed behind a proxy by script/DeployInfra.s.sol.

Tenant creation flow (createFundManager)

The result per tenant:
  • owner gets DEFAULT_ADMIN_ROLE on the FundManager, granting CREATE_FUND_ROLE, etc.
  • proxyAdmin owns the ProxyAdmins of the FundManager proxy and all eight factory proxies, and later, via createFund, of every fund component — full upgrade authority over the tenant’s contracts.
  • The FundManager owns the factories’ logic (Ownable), so only it can call create or setImplementation on them.
ProxyAdmin addresses are computed deterministically: in OZ v5, a TransparentUpgradeableProxy deploys its ProxyAdmin as its first CREATE (nonce 1), so _computeProxyAdminAddress(proxy) derives it from keccak256(rlp(proxy, 1)).

Function reference

FundManager · Factory · Access Control & Roles