[Proposal] Balancer V2: Authorize Gauntlet Network to set swap fees

The Balancer V2 core smart contracts were deployed to mainnet earlier this week, and the full UI launch is right around the corner. In the final days leading up to the launch, the core dev team at Balancer Labs intends for the Balancer Governance Multisig to execute additional authorizations on chain. But Balancer Labs has no decision-making power over the Multisig, which is strictly governed by BAL holders.

The authorization to be ratified by this proposal would enable Gauntlet Network to set swap fees on certain pools which have opted into the feature.


One of the exciting features planned for Balancer V2 is dynamically optimized swap fees powered by Gauntlet Network. These dynamic fees help to boost returns for liquidity providers by adapting to changing market conditions, while also reducing the pool design space by consolidating multiple potential pools into a single fee strategy.

But this feature is only made possible by granting Gauntlet’s smart contract (0xE4a8ed6c1D8d048bD29A00946BFcf2DB10E7923B) authorization to change the swap fee on certain pools. This authorization applies only to pools using the delegated owner address (0xBA1BA1ba1BA1bA1bA1Ba1BA1ba1BA1bA1ba1ba1B); pool creators retain the ability to opt out of Gauntlet-powered fees by setting the owner to their own EOA, a smart contract, or the zero address for immutability. Even for pools which have opted in, Gauntlet’s power would extend to the swap fee and only the swap fee; Gauntlet cannot alter any other attributes of the pool.


The Balancer Governance Multisig would submit 1 transaction as follows. Here, “Multisig” refers to the Gnosis Safe at 0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f and “Authorizer” is the smart contract deployed this week at 0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6.

  1. Grant Gauntlet ability to set swap fees on WeightedPools
    Multisig → Authorizer → grantRole(0x3697d13ee45583cf9c2c64a978ab5886bcd07ec2b851efbea2fced982b8f9596, 0xE4a8ed6c1D8d048bD29A00946BFcf2DB10E7923B)

For transparency’s sake, a developer could reproduce the bytes specifying the role above using this pseudo-code:

pool.getActionId(pool.interface.getSighash('setSwapFeePercentage')); // 0x3697d13ee45583cf9c2c64a978ab5886bcd07ec2b851efbea2fced982b8f9596