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