[BIP-175] Grant permissions for V3 pool factories

Payload PR: BIP-175: Authorize V3 factories by Tritium-VLK · Pull Request #57 · BalancerMaxis/multisig-ops · GitHub

Background

The v3 Weighted Pool Factory and the v3 Composable Stable Pool Factory where deployed to fix reentrancy issue described here. Some initial “wire-up” of permissions is required to bring them into standard function. This BIP lays out these changes and requests permission to apply them.

English Specification

The authorisations to be ratified by this proposal would grant the same permissions to the Balancer Mulitisigs as the v2 factories as described by BIP-62.

The specific permissions are best described by this map, which links function calls on the v3 pool and factory contracts to callers:

{
    "setSwapFeePercentage(uint256)": "feeManager",
    "startAmplificationParameterUpdate(uint256,uint256)": "feeManager",
    "stopAmplificationParameterUpdate()": "feeManager",
    "pause()": "emergency",
    "disable()": "emergency",
    "enableRecoveryMode()": "emergency",
}

The “emergency” caller maps to the Balancer Emergency DAO Multisig as defined in this vote.

The feeManager caller group maps to the feeManager multisig controlled by the Balancer Maxis on all chains except mainnet. On mainnet a special feeSetter multisig exists to manage a-factors and a gautletFeeSetter contract that allows bulk changing of fees. The maxi’s functionally control all contracts that make up the feeManager target group.

Authorize the Emergency subDAO to pause the pools

Just like with previous pools, these new pools have an emergency pause period which is hardcoded at 3 months from the time the factories were deployed. During the pause period, the Balancer Governance Multisig has the power to gracefully pause the system in case vulnerabilities or issues arise. Funds can always be withdrawn by users, even during an emergency pause, and the pause is only to be invoked in situations where user funds may be at risk.

Since gathering 6/11 governance multisig signers during an emergency may not be feasible or expedient, we propose also authorizing the Emergency subDAO to pause pools. Note that after the 3-month pause period ends, neither the Governance Multisig nor the Emergency subDAO will have any pause power. This authorization only applies to the composableStable and weighted v3 pool types.

Authorize Balancer Maxis to manage pool parameters

Each pool’s smart contract contains a series of parameters that affect their efficiency and can be tuned depending on market conditions. The Balancer Maxis have been managing fees and the amplification factor for weighted and stable pools historically, and this would grant them the ability to do so for the new pool types below if this proposal is approved by the community. Any updates to a pool’s parameters will be announced in Discord beforehand.

  • Stable Pools v3:
    • swap fee
    • amplification parameter
  • composableStable:
    • swap fee
    • amplification parameter
  • Weighted v3
    • swap fee

Specification

The DAO multisig in each network will initiate transactions with the Authorizer 0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6 calling the function grantRole for each one of the following role/account tuples.

For ease of review the below table has been sorted by chain and deployment, which should match the order found in the source of truth for actionIds on the balancer-v2-monorepo. This table is also available sorted by chain/address for easy verification of the JSON payloads in the PR linked above.

deployment chain function role target target_address
20230206-composable-stable-pool-v3 arbitrum disable() 0xa23cd4468cbe8403f6163d16350699bab6b407aee02d6a29755b0cffa52dd023 emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-composable-stable-pool-v3 arbitrum enableRecoveryMode() 0xe6321aecff7f0051958627890aa2a16d7221f860dfa3359a1cea6f4a3f87933e emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-composable-stable-pool-v3 arbitrum pause() 0xcf96d782d1bc8dd12869fb51374544f9c037fd559b8811972f35756f204c6012 emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-composable-stable-pool-v3 arbitrum setSwapFeePercentage(uint256) 0xc383be2c6e87a9b18ae919e677f011279a8d98346dbcd5cb326053f5f873b753 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-composable-stable-pool-v3 arbitrum startAmplificationParameterUpdate(uint256,uint256) 0x79f0094a409615c52fb7491ca130145e7ec31efb578af4019db59e6636c07ebf feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-composable-stable-pool-v3 arbitrum stopAmplificationParameterUpdate() 0xfaede3ef05348eea541571b87b87560ae56292ed04fd5e08fcced4d41916dfb1 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-weighted-pool-v3 arbitrum disable() 0x3f476d79932a277fc0be18747fc314f1db33802d38a900d529db018c01de81a4 emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-weighted-pool-v3 arbitrum enableRecoveryMode() 0x1e3379f440ccd8ad4fbacfa446ce3de718eda1a091b271c9053bdedff90cdf1c emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-weighted-pool-v3 arbitrum pause() 0xbbb29600025604666f66b68dff00546068c5be9c0a5a0fbe825550f6c3519c27 emergency 0xf404C5a0c02397f0908A3524fc5eb84e68Bbe60D
20230206-weighted-pool-v3 arbitrum setSwapFeePercentage(uint256) 0x92253d002d63e0211f775527924e2891f18bb060ff2ab3be19c6b242bafa5fec feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-composable-stable-pool-v3 mainnet disable() 0x3fad985e82b2b68120f2bbe4c05b3bcbb41b29519eaa63fb25cb25833043f1e8 emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-composable-stable-pool-v3 mainnet enableRecoveryMode() 0x8c91ddec262ae544d56464e260d0b840239949d86149c139510d5e399a30099f emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-composable-stable-pool-v3 mainnet pause() 0xa4d7ff702c3f830a7ce937a195bfb05c081c0c36a462ed72bfbf721bc5a3f462 emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-composable-stable-pool-v3 mainnet setSwapFeePercentage(uint256) 0x1a88f724f61d4985675e65a2ba85b2a985d250dac00d27e06303f4cdabc906ae gauntletFeeSetter 0xE4a8ed6c1D8d048bD29A00946BFcf2DB10E7923B
20230206-composable-stable-pool-v3 mainnet startAmplificationParameterUpdate(uint256,uint256) 0xe560c24a44460de963ea8e6716dd635144e8c4991c131b63dd9e956b1f1415b8 feeManager 0xf4A80929163C5179Ca042E1B292F5EFBBE3D89e6
20230206-composable-stable-pool-v3 mainnet stopAmplificationParameterUpdate() 0x36e63b457adcc8834537417d275eec404708707f4fbe63097f15e865dc3e2847 feeManager 0xf4A80929163C5179Ca042E1B292F5EFBBE3D89e6
20230206-weighted-pool-v3 mainnet disable() 0x0df3339673f8356288d97461676bb443e5def15e6d6e8321add702ef77075160 emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-weighted-pool-v3 mainnet enableRecoveryMode() 0xa53ffba9aa2195cd7646f9cbaca0985f432bded3dd5319916afc5ec395f280d7 emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-weighted-pool-v3 mainnet pause() 0x33b06cb79113c1c80d5db0ad41675a5368e7ec0ba8a2fd4d6328524a984d465b emergency 0xA29F61256e948F3FB707b4b3B138C5cCb9EF9888
20230206-weighted-pool-v3 mainnet setSwapFeePercentage(uint256) 0xd8638fc873fb8c5c0e67c437099a19eb0546fb439dab8babff44196f11d44831 gauntletFeeSetter 0xE4a8ed6c1D8d048bD29A00946BFcf2DB10E7923B
20230206-composable-stable-pool-v3 optimism disable() 0xe59ccea4d4a98c33b7c0b3c05a3d65ff930273fa5ee03855a3104befc6d1d362 emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-composable-stable-pool-v3 optimism enableRecoveryMode() 0xa7508bde3c3d65fa21321ca35b2d1da564bc4a772cff9947de3c3e1a467e9dec emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-composable-stable-pool-v3 optimism pause() 0x25ec546c5f4dfc2fe31ba04f5cf65a8098b35111075a5fd114ea3475e4254ac6 emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-composable-stable-pool-v3 optimism setSwapFeePercentage(uint256) 0xe9d4a41f6bb25c8862c0c2c860268861488f862a3702115587343e3c3d6ea29a feeManager 0x09Df1626110803C7b3b07085Ef1E053494155089
20230206-composable-stable-pool-v3 optimism startAmplificationParameterUpdate(uint256,uint256) 0xe0788d96bd3d5c93d8ca894a720bf55835562c15aea8eba5cfb15c2c73bd5652 feeManager 0x09Df1626110803C7b3b07085Ef1E053494155089
20230206-composable-stable-pool-v3 optimism stopAmplificationParameterUpdate() 0x063ab569eba76f955edb79b6f9d647bf9772872dc688a6449689ad4d2d5b5ca3 feeManager 0x09Df1626110803C7b3b07085Ef1E053494155089
20230206-weighted-pool-v3 optimism disable() 0x3e97e0a2e6079577d465a9e3898ed6097ed0c661cb291f58991b80599b0e5558 emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-weighted-pool-v3 optimism enableRecoveryMode() 0x076ec7596fb2fd56057ab4b4ab843852ee914ca3095f9cdf46a79085b266a748 emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-weighted-pool-v3 optimism pause() 0xae409b1e306416a87e8d92b1a08f860798e5e882c8785f185db2e2a310793aa1 emergency 0xd4c87b33afcE39F1E3F4aF1ce8fFFF7241d9128B
20230206-weighted-pool-v3 optimism setSwapFeePercentage(uint256) 0x0173d9c9c500f721f528e83cd89297298d530857b46dc4adb8fe329905f4f773 feeManager 0x09Df1626110803C7b3b07085Ef1E053494155089
20230206-composable-stable-pool-v3 polygon disable() 0x9592bbf1ef6b5256ed5698e4cf4610375a5e984fa05ddb8a9c6f2e411f2d0d1e emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-composable-stable-pool-v3 polygon enableRecoveryMode() 0x4645b2fd612d1e3d4f7cbd5f68df6511f4dedfcba83090853604d4fbf33f467d emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-composable-stable-pool-v3 polygon pause() 0xf3018734e770ecf7082ee926a91cef5bd218b62d081217bf47f5a67ea7a1e80e emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-composable-stable-pool-v3 polygon setSwapFeePercentage(uint256) 0xf6c13c09ddba8f114fe2b23ff442766dca7a9bf303adfde386f20ac38c749733 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-composable-stable-pool-v3 polygon startAmplificationParameterUpdate(uint256,uint256) 0x1eeda74ac7741bce16788e080c79c907c79419e41281fa442cc39f8d148a8773 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-composable-stable-pool-v3 polygon stopAmplificationParameterUpdate() 0xe202c405a4ff60ae0c38dea8bbb722ee570a1c89487598e7fc4ede5248a527c7 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B
20230206-weighted-pool-v3 polygon disable() 0x18be448c0c01ad4576befd4f6bce2abf1214dc50697f946a487657e3c3c66947 emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-weighted-pool-v3 polygon enableRecoveryMode() 0x8e751c9d2a2e4de88b6c71094d5a2b18be451801333ea94579761179bc9b9ef9 emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-weighted-pool-v3 polygon pause() 0xb251963ecd27d2fe81c17cdd47c025b03bdc56bd9138b8556a747d1112d8c01b emergency 0x3c58668054c299bE836a0bBB028Bee3aD4724846
20230206-weighted-pool-v3 polygon setSwapFeePercentage(uint256) 0x22f3e304ab030be776b205711d7ba79f146b07726b10c5e9d29c24dacc09c140 feeManager 0x7c68c42De679ffB0f16216154C996C354cF1161B

Note that this table and the linked call data was built with a script developed under this Pull Request

Risk Assessment

This BIP is routine operation for provisioning a new factory. The new factories are themselves a risk mitigation.

References

Boosted Pools: Authorize Gauntlet and the Ballers Multisig to manage pool parameters

Previous swap fee and amp factor permissions granted to BalancerDAO

Directory of Addresses used by script which generated the table and multsig payloads

3 Likes

https://snapshot.org/#/balancer.eth/proposal/0xa5ec3483b5d271beee925a81aad62d9cc9237615264db32b1f7dfa569837782d