diff --git a/docs/developer-reference/contracts/error-codes.md b/docs/developer-reference/contracts/error-codes.md index 76cfdb5..519f8fc 100644 --- a/docs/developer-reference/contracts/error-codes.md +++ b/docs/developer-reference/contracts/error-codes.md @@ -6,271 +6,681 @@ order: 4 Balancer uses custom errors which provide a convenient and gas-efficient way to explain why an operation failed. Comments and context for the specific errors can be found in the tables below. -## IAuthentication - -| Error | Comment | -| --------------- | ----------------------------------------------- | -| SenderNotAllowed| The sender does not have permission to call a function | - -## IBasePoolFactory - -| Error | Comment | -| ------- | ----------------------------------------------- | -| Disabled| Cannot create a pool after the factory was disabled | -| IndexOutOfBounds| A pool index is beyond the current bounds of the array | - -## IERC20MultitokenErrors - -| Error | Comment | -| ---------------- | ----------------------------------------------- | -| PoolTotalSupplyTooLow(uint256) | The total supply of a pool token can't be lower than the absolute minimum | - -## IVaultErrors - -| Error | Comment | -| ------------------------------- | ----------------------------------------------- | -| PoolAlreadyRegistered(address) | A pool has already been registered. `registerPool` may only be called once | -| PoolAlreadyInitialized(address) | A pool has already been initialized. `initialize` may only be called once | -| PoolNotRegistered(address) | A pool has not been registered | -| PoolNotInitialized(address) | A referenced pool has not been initialized | -| HookRegistrationFailed(address,address,address) | A hook contract rejected a pool on registration | -| TokenAlreadyRegistered(IERC20) | A token was already registered (i.e.,it is a duplicate in the pool) | -| MinTokens() | The token count is below the minimum allowed | -| MaxTokens() | The token count is above the maximum allowed | -| InvalidToken() | Invalid tokens (e.g.,zero) cannot be registered | -| InvalidTokenType() | The token type given in a TokenConfig during pool registration is invalid | -| InvalidTokenConfiguration() | The data in a TokenConfig struct is inconsistent or unsupported | -| InvalidTokenDecimals() | Tokens with more than 18 decimals are not supported | -| TokensMismatch(address,address,address) | The token list passed into an operation does not match the pool tokens in the pool | -| BalanceNotSettled() | A transient accounting operation completed with outstanding token deltas | -| VaultIsNotUnlocked() | A user called a Vault function (swap,add/remove liquidity) outside the lock context | -| DynamicSwapFeeHookFailed() | The pool has returned false to the beforeSwap hook, indicating the transaction should revert | -| BeforeSwapHookFailed() | The pool has returned false to the beforeSwap hook, indicating the transaction should revert | -| AfterSwapHookFailed() | The pool has returned false to the afterSwap hook, indicating the transaction should revert | -| BeforeInitializeHookFailed() | The pool has returned false to the beforeInitialize hook, indicating the transaction should revert | -| AfterInitializeHookFailed() | The pool has returned false to the afterInitialize hook, indicating the transaction should revert | -| BeforeAddLiquidityHookFailed() | The pool has returned false to the beforeAddLiquidity hook, indicating the transaction should revert | -| AfterAddLiquidityHookFailed() | The pool has returned false to the afterAddLiquidity hook, indicating the transaction should revert | -| BeforeRemoveLiquidityHookFailed() | The pool has returned false to the beforeRemoveLiquidity hook, indicating the transaction should revert | -| AfterRemoveLiquidityHookFailed() | The pool has returned false to the afterRemoveLiquidity hook, indicating the transaction should revert | -| RouterNotTrusted() | An unauthorized Router tried to call a permissioned function (i.e.,using the Vault's token allowance) | -| AmountGivenZero() | The user tried to swap zero tokens | -| CannotSwapSameToken() | The user attempted to swap a token for itself | -| TokenNotRegistered(IERC20) | The user attempted to swap a token not in the pool | -| SwapLimit(uint256,uint256) | An amount in or out has exceeded the limit specified in the swap request | -| HookAdjustedSwapLimit(uint256,uint256) | A hook adjusted amount in or out has exceeded the limit specified in the swap request | -| TradeAmountTooSmall() | The amount given or calculated for an operation is below the minimum limit | -| InvalidAddLiquidityKind() | Add liquidity kind not supported | -| AmountInAboveMax(IERC20,uint256,uint256) | A required amountIn exceeds the maximum limit specified for the operation | -| HookAdjustedAmountInAboveMax(IERC20,uint256,uint256) | A hook adjusted amountIn exceeds the maximum limit specified for the operation | -| BptAmountOutBelowMin(uint256,uint256) | The BPT amount received from adding liquidity is below the minimum specified for the operation | -| DoesNotSupportAddLiquidityCustom() | Pool does not support adding liquidity with a customized input | -| DoesNotSupportDonation() | Pool does not support adding liquidity through donation | -| InvalidRemoveLiquidityKind() | Remove liquidity kind not supported | -| AmountOutBelowMin(IERC20,uint256,uint256) | The actual amount out is below the minimum limit specified for the operation | -| HookAdjustedAmountOutBelowMin(IERC20,uint256,uint256) | The hook adjusted amount out is below the minimum limit specified for the operation | -| BptAmountInAboveMax(uint256,uint256) | The required BPT amount in exceeds the maximum limit specified for the operation | -| DoesNotSupportRemoveLiquidityCustom() | Pool does not support removing liquidity with a customized input | -| ProtocolFeesExceedTotalCollected() | Error raised when the sum of the parts (aggregate swap or yield fee) | -| SwapFeePercentageTooLow() | Error raised when the swap fee percentage is less than the minimum allowed value | -| SwapFeePercentageTooHigh() | Error raised when the swap fee percentage exceeds the maximum allowed value | -| FeePrecisionTooHigh() | Primary fee percentages result in an aggregate fee that cannot be stored with the required precision | -| PercentageAboveMax() | A given percentage is above the maximum (usually FixedPoint.ONE,or 1e18 wei) | -| QueriesDisabled() | A user tried to execute a query operation when they were reversibly disabled | -| QueriesDisabledPermanently() | A user tried to execute a query operation when they were permanently disabled | -| PoolInRecoveryMode(address) | Cannot enable recovery mode when already enabled | -| PoolNotInRecoveryMode(address) | Cannot disable recovery mode when not enabled | -| SenderIsNotVault(address) | Error indicating the sender is not the Vault (e.g.,someone is trying to call a permissioned function) | -| VaultPauseWindowDurationTooLarge() | The caller specified a pause window period longer than the maximum | -| PauseBufferPeriodDurationTooLarge() | The caller specified a buffer period longer than the maximum | -| VaultPaused() | A user tried to perform an operation while the Vault was paused | -| VaultNotPaused() | Governance tried to unpause the Vault when it was not paused | -| VaultPauseWindowExpired() | Governance tried to pause the Vault after the pause period expired | -| PoolPaused(address) | A user tried to perform an operation involving a paused Pool | -| PoolNotPaused(address) | Governance tried to unpause the Pool when it was not paused | -| PoolPauseWindowExpired(address)| Governance tried to pause a Pool after the pause period expired | -| BufferAlreadyInitialized(IERC4626)| Buffer for the given wrapped token was already initialized | -| BufferNotInitialized(IERC4626)| Buffer for the given wrapped token was not initialized | -| NotEnoughBufferShares()| The user is trying to remove more than their allocated shares from the buffer | -| WrongUnderlyingToken(IERC4626,address)| The wrapped token asset does not match the underlying token | -| InvalidUnderlyingToken(IERC4626)| A wrapped token reported the zero address as its underlying token asset | -| WrapAmountTooSmall(IERC4626)| The amount given to wrap/unwrap was too small,which can introduce rounding issues | -| VaultBuffersArePaused()| Buffer operation attempted while vault buffers are paused | -| BufferSharesInvalidReceiver()| Buffer shares were minted to an invalid address | -| BufferSharesInvalidOwner()| Buffer shares were burned from an invalid address | -| BufferTotalSupplyTooLow(uint256) | The total supply of a buffer can't be lower than the absolute minimum | -| NotEnoughUnderlying(IERC4626,uint256,uint256) | A wrap/unwrap operation consumed more or returned less underlying tokens than it should | -| NotEnoughWrapped(IERC4626,uint256,uint256) | A wrap/unwrap operation consumed more or returned less wrapped tokens than it should | -| IssuedSharesBelowMin(uint256,uint256) | Shares issued during initialization are below the requested amount | -| DoesNotSupportUnbalancedLiquidity() | Pool does not support adding / removing liquidity with an unbalanced input | -| CannotReceiveEth() | The contract should not receive ETH | -| NotVaultDelegateCall() | The Vault extension was called by an account directly; it can only be called by the Vault via delegatecall | -| WrongVaultExtensionDeployment()| The vault extension was configured with an incorrect Vault address | -| WrongProtocolFeeControllerDeployment()| The protocol fee controller was configured with an incorrect Vault address | -| WrongVaultAdminDeployment() | The vault admin was configured with an incorrect Vault address | -| QuoteResultSpoofed() | Quote reverted with a reserved error code | - -## IProtocolFeeController - -| Error | Comment | -| -------------- | ----------------------------------------------- | -| ProtocolSwapFeePercentageTooHigh() | Error raised when the protocol swap fee percentage exceeds the maximum allowed value | -| ProtocolYieldFeePercentageTooHigh() | Error raised when the protocol yield fee percentage exceeds the maximum allowed value | -| PoolCreatorNotRegistered(address) | Error raised if there is no pool creator on a withdrawal attempt from the given pool | -| CallerIsNotPoolCreator(address,address) | Error raised if the wrong account attempts to withdraw pool creator fees | -| PoolCreatorFeePercentageTooHigh() | Error raised when the pool creator swap or yield fee percentage exceeds the maximum allowed value | - -## ICompositeLiquidityRouter - -| Error | Comment | -| -------------- | ----------------------------------------------- | -| WrongTokensOut(address[],address[]) | `tokensOut` array does not have all the tokens from `expectedTokensOut` | - -## RouterCommon - -| Error | Comment | -| -------------- | ----------------------------------------------- | -| EthTransfer | Incoming ETH transfer from an address that is not WETH | -| InsufficientEth| The amount of ETH paid is insufficient to complete this operation | -| SwapDeadline | The swap transaction was not mined before the specified deadline timestamp | - -## BasePoolFactory - -| Error | Comment | -| --------------- | ----------------------------------------------- | -| StandardPoolWithCreator() | A pool creator was specified for a pool from a Balancer core pool type | - -## BasePoolMath -| Error | Comment | -| --------------- | ----------------------------------------------- | -| InvariantRatioAboveMax() | An add liquidity operation increased the invariant above the limit | -| InvariantRatioBelowMin() | A remove liquidity operation decreased the invariant below the limit | - +# governance-scripts +## BalancerContractRegistryInitializer +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AlreadyInitialized | | The initialization can only be done once. | `0x0dc149f0` | +| PermissionNotGranted | | A permission required to complete the initialization was not granted. | `0xe5557e90` | +| VaultMismatch | | The Vault passed in as a sanity check doesn't match the Vault associated with the registry. | `0xc1faacc5` | + +## ProtocolFeeControllerMigration +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AlreadyMigrated | | Migration can only be performed once. | `0xca1c3cbc` | +| InvalidFeeController | | Attempt to deploy this contract with invalid parameters. | `0xd6f1cb05` | + +# interfaces +## interfaces/oracles +### ILPOracleBase +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidOraclePrice | | Oracle prices must be greater than zero to prevent zero or negative TVL values. | `0x1f8f95a0` | +| UnsupportedDecimals | | A price feed has decimals greater than the maximum allowed. | `0xd4f1d302` | + +### ILPOracleFactoryBase +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| OracleAlreadyExists(IBasePool,bool,AggregatorV3Interface[],ILPOracleBase) | pool: IBasePool, shouldUseBlockTimeForOldestFeedUpdate: bool, feeds: AggregatorV3Interface[], oracle: ILPOracleBase | Oracle already exists for the given pool. | `0xbcb86005` | +| OracleFactoryIsDisabled | | Oracle factory is disabled. | `0xb110e99d` | + +### ISequencerUptimeFeed +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SequencerDown | | The uptime sequencer has returned a status of "down". | `0x032b3d00` | +| SequencerResyncIncomplete | | A price feed was accessed while still within the resync window (e.g., after a sequencer outage). | `0xed1bba46` | + +## interfaces/pool-cow +### ICowPoolFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidTrustedCowRouter | | The trusted CoW router cannot be address zero. | `0xb4d8fbf3` | + +### ICowRouter +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InsufficientFunds(IERC20,uint256,uint256) | token: IERC20, senderCredits: uint256, senderDebits: uint256 | The funds transferred to the Vault and the swap tokenOut amount were not enough to pay for the Swap and Donate operation. | `0x0e60796c` | +| InvalidFeeSweeper | | The caller tried to set the zero address as the fee sweeper. | `0x05a399e2` | +| ProtocolFeePercentageAboveLimit(uint256,uint256) | newProtocolFeePercentage: uint256, maxProtocolFeePercentage: uint256 | The `newProtocolFeePercentage` is above the maximum limit. | `0xe76c2b23` | +| SwapDeadline | | The swap transaction was not validated before the specified deadline timestamp. | `0xe08b8af0` | + +## interfaces/pool-gyro +### IGyro2CLPPool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SqrtParamsWrong | | The informed alpha is greater than beta. | `0x0579e1da` | + +## interfaces/pool-hooks +### IECLPSurgeHook +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidImbalanceSlope | | Thrown when an invalid imbalance slope is provided. | `0x450a9fed` | +| InvalidRotationAngle | | The rotation angle is too small or too large for the surge hook to be used. | `0x4988ec15` | + +### IMevCaptureHook +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidBalancerContractRegistry | | The `BalancerContractRegistry` set in the constructor is invalid. | `0x5c84f39b` | +| MevCaptureHookNotRegisteredInPool(address) | pool: address | The pool was not registered with the MEV Hook contract. | `0x7501acd8` | +| MevSwapFeePercentageAboveMax(uint256,uint256) | feePercentage: uint256, maxFeePercentage: uint256 | The new max MEV swap fee percentage is above the allowed absolute maximum. | `0x20fb3f00` | +| MevTaxExemptSenderAlreadyAdded(address) | sender: address | The sender is already registered as MEV tax-exempt. | `0x106fa5a4` | +| SenderNotRegisteredAsMevTaxExempt(address) | sender: address | The sender is not registered as MEV tax-exempt. | `0x01147f3f` | + +### ISurgeHookCommon +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidPercentage | | The max surge fee and threshold values must be valid percentages. | `0x1f3b85d3` | + +## interfaces/pool-weighted +### IFixedPriceLBPool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidInitializationAmount | | An initialization amount is invalid (e.g., zero token balance, or non-zero reserve). | `0xfc3e9be7` | +| InvalidProjectTokenRate | | The token sale price cannot be zero. | `0x2d889800` | +| TokenSwapsInUnsupported | | All fixed price LBPools are "buy only;" token swaps in are not supported. | `0x0ad2684a` | + +### ILBPMigrationRouter +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| IncorrectMigrationRouter(address,address) | expectedRouter: address, actualRouter: address | A router called `migrate` on a pool that was not the one specified on deployment. | `0x2a6ef7fc` | +| NoRegisteredWeightedPoolFactory | | The Balancer Contract Registry did not return an active address for the "WeightedPool" alias. | `0x66d89320` | +| SenderIsNotLBPOwner | | The caller is not the owner of the LBP. | `0xea37ac06` | + +### ILBPool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InsufficientRealReserveBalance(uint256,uint256) | reserveTokenAmountOut: uint256, reserveTokenRealBalance: uint256 | The amount out of the reserve token cannot exceed the real balance. | `0x37153449` | +| SeedlessLBPInitializationWithNonZeroReserve | | If the LBP is seedless, the caller must initialize with 0 reserve tokens. | `0x26704f1c` | + +### IWeightedPool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| MinWeight | | Indicates that one of the pool tokens' weight is below the minimum allowed. | `0xbd393583` | +| NormalizedWeightInvariant | | Indicates that the sum of the pool tokens' weights is not FixedPoint.ONE. | `0x39cf114e` | + +### interfaces/solidity-utils/helpers +#### IAuthentication +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SenderNotAllowed | | The sender does not have permission to call a function. | `0x23dada53` | + +## interfaces/standalone-utils +### IBalancerContractRegistry +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ContractAddressAlreadyRegistered(ContractType,address) | contractType: ContractType, contractAddress: address | A contract has already been registered under the given address. | `0x961be8b5` | +| ContractAddressNotRegistered(address) | contractAddress: address | An operation that requires a valid contract specified an unrecognized address. | `0xf5b5d364` | +| ContractAliasInUseAsName(ContractType,string) | contractType: ContractType, contractName: string | The proposed alias has already been registered as a contract. | `0xcc986f2b` | +| ContractAlreadyDeprecated(address) | contractAddress: address | Contracts can only be deprecated once. | `0x1f118c35` | +| ContractNameAlreadyRegistered(ContractType,string) | contractType: ContractType, contractName: string | A contract has already been registered under the given name. | `0x0626a7b0` | +| ContractNameInUseAsAlias(string,address) | contractName: string, contractAddress: address | The proposed contract name has already been added as an alias. | `0x6d4f9990` | +| ContractNameNotRegistered(string) | contractName: string | Thrown when attempting to deregister a contract that was not previously registered. | `0xcd3599f9` | +| InvalidContractAlias | | Cannot add an empty string as an alias. | `0x907f9fd9` | +| InvalidContractName | | Cannot register (or deregister) a contract with an empty string as a name. | `0x830c907e` | +| ZeroContractAddress | | Cannot register or deprecate contracts, or add an alias targeting the zero address. | `0xb4d92c53` | + +### IBalancerFeeBurner +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BufferNotInitialized(address) | wrappedToken: address | Buffer not initialized for the wrapped token. | `0x85f41299` | +| BurnPathDoesNotExist | | Burn path not set for the fee token. | `0xf9aa0315` | +| InvalidBufferTokenOut(IERC20,uint256) | tokenOut: IERC20, step: uint256 | Invalid token out for buffer step. | `0x5a5e9413` | +| TargetTokenOutMismatch | | The last token in the path is not the same as the target token. | `0xa682e903` | +| TokenDoesNotExistInPool(IERC20,uint256) | token: IERC20, step: uint256 | Token does not exist in pool. | `0x9ef7cd5c` | + +### ICowConditionalOrder +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| OrderNotValid(string) | reason: string | This error is returned by the `getTradeableOrder` function if the order conditions are not met. | `0xc8fc2725` | +| PollNever(string) | reason: string | The conditional order should not be polled again (i.e., deleted). | `0x981b64cd` | +| PollTryAtBlock(uint256,string) | blockNumber: uint256, reason: string | Polling should be retried at a specific block number. | `0x1fe8506e` | +| PollTryAtEpoch(uint256,string) | timestamp: uint256, reason: string | Polling should be retried at a specific epoch (unix timestamp). | `0x7e334637` | +| PollTryNextBlock(string) | reason: string | Polling should be retried at the next block. | `0xd05f3065` | + +### ICowSwapFeeBurner +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InterfaceIsSignatureVerifierMuxer | | Fails on SignatureVerifierMuxer due to compatibility issues with ComposableCow. | `0x32798566` | +| InvalidOrderParameters(string) | reason: string | The order parameters were invalid. | `0x8d8a6110` | +| OrderHasUnexpectedStatus(OrderStatus) | actualStatus: OrderStatus | Attempt to revert an order that had not failed. | `0x3ba126d8` | + +### IHyperEVMRateProviderFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| RateProviderAlreadyExists(uint32,uint32,address) | tokenIndex: uint32, pairIndex: uint32, rateProvider: address | A rate provider already exists for the given token and pair. | `0xf4c64ee1` | +| RateProviderFactoryIsDisabled | | The factory is disabled. | `0x42fb89b8` | +| RateProviderNotFound(uint32,uint32) | tokenIndex: uint32, pairIndex: uint32 | The rate provider was not found for the given token and pair. | `0xdc120e77` | + +### IPoolHelperCommon +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| IndexOutOfBounds(uint256) | poolSetId: uint256 | An index is beyond the current bounds of the set. | `0x44945fcc` | +| InvalidPoolSetId(uint256) | poolSetId: uint256 | Pool set id associated with an operation is invalid. | `0x98592ddb` | +| InvalidPoolSetManager | | The initial manager of a pool set cannot be zero. | `0x2de5256e` | +| PoolAlreadyInSet(address,uint256) | pool: address, poolSetId: uint256 | Cannot add a pool that is already there. | `0x5a17aa8d` | +| PoolNotInSet(address,uint256) | pool: address, poolSetId: uint256 | Cannot remove a pool that was not added. | `0x80145d72` | +| PoolSetManagerNotUnique(address) | poolSetManager: address | Pool set managers can only manage a single pool set. | `0x2c35aa96` | +| SenderIsNotPoolSetManager | | Permissioned operations on pools can only be performed by the pool set manager. | `0xbcc08f74` | + +### IPoolSwapFeeHelper +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| PoolHasSwapManager(address) | pool: address | Cannot add a pool that has a swap manager. | `0xf043494a` | + +### IProtocolFeeBurner +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AmountOutBelowMin(IERC20,uint256,uint256) | tokenOut: IERC20, amountOut: uint256, minAmountOut: uint256 | The actual amount out is below the minimum limit specified for the operation. | `0x9eabe649` | +| SwapDeadline | | The swap transaction was not validated before the specified deadline timestamp. | `0xe08b8af0` | + +### IProtocolFeeSweeper +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BurnerDidNotConsumeAllowance | | The burner did not consume its entire allowance. | `0xc5bc8d51` | +| InvalidFeeRecipient | | The fee recipient is invalid. | `0x768dc598` | +| InvalidProtocolFeeBurner | | The protocol fee burner to be added is invalid. | `0x31ec2736` | +| InvalidTargetToken | | The target token is invalid. | `0x8562eb45` | +| ProtocolFeeBurnerAlreadyAdded(address) | protocolFeeBurner: address | Protocol fee burners can only be added to the allowlist once. | `0x6fe47af6` | +| ProtocolFeeBurnerNotAdded(address) | protocolFeeBurner: address | Protocol fee burners must be added to the allowlist before being removed. | `0xbca5ab34` | +| UnsupportedProtocolFeeBurner(address) | protocolFeeBurner: address | The specified fee burner has not been approved. | `0x38553f6c` | +| UnwrapIsNotAllowed | | Unwrapping is not allowed for the operation. | `0xca9e3a1e` | + +### ITokenPairRegistry +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BufferNotInitialized(address) | buffer: address | The given buffer address does not correspond to an initialized buffer. | `0x85f41299` | +| EmptyPath | | The path to add cannot be empty. | `0x20a2d33d` | +| IndexOutOfBounds | | Attempted to remove a path at an index beyond the registered length. | `0x4e23d035` | +| InvalidBufferPath(address,address,address) | buffer: address, tokenIn: address, tokenOut: address | The output token does not match the expected address in a wrap or unwrap operation. | `0x29198c3d` | +| InvalidRemovePath(address,address,address) | poolOrBuffer: address, tokenIn: address, tokenOut: address | The given pool or buffer is not registered as a path for the token pair. | `0x3a9458d9` | +| InvalidSimplePath(address) | path: address | The given address is not a valid pool or buffer. | `0xb309199b` | + +## interfaces/vault +### IBasePoolFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| Disabled | | Attempted pool creation after the factory was disabled. | `0x75884cda` | +| IndexOutOfBounds | | A pool index is beyond the current bounds of the array. | `0x4e23d035` | + +### ICompositeLiquidityRouterErrors +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| DuplicateTokenIn(address) | duplicateToken: address | The `tokensIn` array contains a duplicate token. | `0x60a054e0` | +| WrongTokensOut(address[],address[]) | actualTokensOut: address[], expectedTokensOut: address[] | The actual result of the liquidity removal operation does not match the expected set of tokens. | `0x94ae280c` | + +### IERC20MultiTokenErrors +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| PoolTotalSupplyTooLow(uint256) | totalSupply: uint256 | The total supply of a pool token can't be lower than the absolute minimum. | `0xd38d20fc` | + +### IProtocolFeeController +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| CallerIsNotPoolCreator(address,address) | caller: address, pool: address | Error raised if the wrong account attempts to withdraw pool creator fees. | `0xfbecdbf4` | +| PoolCreatorFeePercentageTooHigh | | Error raised when the pool creator swap or yield fee percentage exceeds the maximum allowed value. | `0x0370da74` | +| PoolCreatorNotRegistered(address) | pool: address | Error raised if there is no pool creator on a withdrawal attempt from the given pool. | `0x8bcbf353` | +| ProtocolSwapFeePercentageTooHigh | | Error raised when the protocol swap fee percentage exceeds the maximum allowed value. | `0x7e6eb7fb` | +| ProtocolYieldFeePercentageTooHigh | | Error raised when the protocol yield fee percentage exceeds the maximum allowed value. | `0xa7849e8e` | + +### IProtocolFeePercentagesProvider +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| FactoryFeesNotSet(address) | factory: address | `setFactorySpecificProtocolFeePercentages` has not been called for this factory address. | `0xa589c09e` | +| PoolNotFromFactory(address,address) | pool: address, factory: address | The given pool is not from the expected factory. | `0xf400ce63` | +| UnknownFactory(address) | factory: address | Fees can only be set on recognized factories (i.e., registered in the `BalancerContractRegistry`). | `0xc2a47384` | +| WrongProtocolFeeControllerDeployment | | The protocol fee controller was configured with an incorrect Vault address. | `0x1bbe95c7` | + +### IRouterCommon +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| OperationNotSupported | | The operation not supported by the router (e.g., permit2 operation when pre-paid). | `0x29a270f5` | + +### ISenderGuard +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| EthTransfer | | Incoming ETH transfer from an address that is not WETH. | `0x0540ddf6` | +| SwapDeadline | | The swap transaction was not validated before the specified deadline timestamp. | `0xe08b8af0` | + +### IUnbalancedAddViaSwapRouter +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AmountInAboveMaxAdjustableAmount(uint256,uint256) | amountIn: uint256, maxAdjustableAmount: uint256 | The amountIn for the adjustable token exceeds the maxAdjustableAmount specified. | `0xbe24bb39` | +| AmountInDoesNotMatchExact(uint256,uint256) | amountIn: uint256, exactAmount: uint256 | The amountIn for the exact token does not match the exactAmount specified. | `0xc1820fbb` | +| NotTwoTokenPool | | This router only supports two-token pools. | `0xfc20f864` | + +### IVaultErrors +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AfterAddLiquidityHookFailed | | The pool has returned false to the afterAddLiquidity hook, indicating the transaction should revert. | `0xe1249165` | +| AfterInitializeHookFailed | | The pool has returned false to the afterInitialize hook, indicating the transaction should revert. | `0x0f23dbc6` | +| AfterRemoveLiquidityHookFailed | | The pool has returned false to the afterRemoveLiquidity hook, indicating the transaction should revert. | `0x1d3391d8` | +| AfterSwapHookFailed | | The pool has returned false to the afterSwap hook, indicating the transaction should revert. | `0x15a29dec` | +| AmountGivenZero | | The user tried to swap zero tokens. | `0x57a456b7` | +| AmountInAboveMax(IERC20,uint256,uint256) | tokenIn: IERC20, amountIn: uint256, maxAmountIn: uint256 | A required amountIn exceeds the maximum limit specified for the operation. | `0x40e7a003` | +| AmountOutBelowMin(IERC20,uint256,uint256) | tokenOut: IERC20, amountOut: uint256, minAmountOut: uint256 | The actual amount out is below the minimum limit specified for the operation. | `0x9eabe649` | +| BalanceNotSettled | | A transient accounting operation completed with outstanding token deltas. | `0x20f1d86d` | +| BeforeAddLiquidityHookFailed | | The pool has returned false to the beforeAddLiquidity hook, indicating the transaction should revert. | `0x0b2eb652` | +| BeforeInitializeHookFailed | | The pool has returned false to the beforeInitialize hook, indicating the transaction should revert. | `0x60612925` | +| BeforeRemoveLiquidityHookFailed | | The pool has returned false to the beforeRemoveLiquidity hook, indicating the transaction should revert. | `0x2aaf8866` | +| BeforeSwapHookFailed | | The pool has returned false to the beforeSwap hook, indicating the transaction should revert. | `0xe91e17e7` | +| BptAmountInAboveMax(uint256,uint256) | amountIn: uint256, maxAmountIn: uint256 | The required BPT amount in exceeds the maximum limit specified for the operation. | `0x31d38e0b` | +| BptAmountOutBelowMin(uint256,uint256) | amountOut: uint256, minAmountOut: uint256 | The BPT amount received from adding liquidity is below the minimum specified for the operation. | `0x8d261d5d` | +| BufferAlreadyInitialized(IERC4626) | wrappedToken: IERC4626 | The buffer for the given wrapped token was already initialized. | `0xee44489a` | +| BufferNotInitialized(IERC4626) | wrappedToken: IERC4626 | The buffer for the given wrapped token was not initialized. | `0x92998560` | +| BufferSharesInvalidOwner | | Buffer shares were burned from the zero address. | `0x586d06df` | +| BufferSharesInvalidReceiver | | Buffer shares were minted to the zero address. | `0xdbe6b10e` | +| BufferTotalSupplyTooLow(uint256) | totalSupply: uint256 | The total supply of a buffer can't be lower than the absolute minimum. | `0x34bdbfaa` | +| CannotReceiveEth | | The contract should not receive ETH. | `0xf2238896` | +| CannotSwapSameToken | | The user attempted to swap a token for itself. | `0xa54b181d` | +| DoesNotSupportAddLiquidityCustom | | Pool does not support adding liquidity with a customized input. | `0x4876c0bc` | +| DoesNotSupportDonation | | Pool does not support adding liquidity through donation. | `0xefe0265d` | +| DoesNotSupportRemoveLiquidityCustom | | Pool does not support removing liquidity with a customized input. | `0xcf0a95c0` | +| DoesNotSupportUnbalancedLiquidity | | Pool does not support adding / removing liquidity with an unbalanced input. | `0xd4f5779c` | +| DynamicSwapFeeHookFailed | | The pool has returned false to the beforeSwap hook, indicating the transaction should revert. | `0x53f976d4` | +| FeePrecisionTooHigh | | Primary fee percentages result in an aggregate fee that cannot be stored with the required precision. | `0x833fb3ce` | +| HookAdjustedAmountInAboveMax(IERC20,uint256,uint256) | tokenIn: IERC20, amountIn: uint256, maxAmountIn: uint256 | A hook adjusted amountIn exceeds the maximum limit specified for the operation. | `0xe3758c7d` | +| HookAdjustedAmountOutBelowMin(IERC20,uint256,uint256) | tokenOut: IERC20, amountOut: uint256, minAmountOut: uint256 | The hook adjusted amount out is below the minimum limit specified for the operation. | `0xabf6c797` | +| HookAdjustedSwapLimit(uint256,uint256) | amount: uint256, limit: uint256 | A hook adjusted amount in or out has exceeded the limit specified in the swap request. | `0xcc0e4a99` | +| HookRegistrationFailed(address,address,address) | poolHooksContract: address, pool: address, poolFactory: address | A hook contract rejected a pool on registration. | `0xfa93d814` | +| InvalidAddLiquidityKind | | Add liquidity kind not supported. | `0x6c02b395` | +| InvalidRemoveLiquidityKind | | Remove liquidity kind not supported. | `0x137a9a39` | +| InvalidToken | | Invalid tokens (e.g., zero) cannot be registered. | `0xc1ab6dc1` | +| InvalidTokenConfiguration | | The data in a TokenConfig struct is inconsistent or unsupported. | `0xdf450632` | +| InvalidTokenDecimals | | Tokens with more than 18 decimals are not supported. | `0x686d3607` | +| InvalidTokenType | | The token type given in a TokenConfig during pool registration is invalid. | `0xa1e9dd9d` | +| InvalidUnderlyingToken(IERC4626) | wrappedToken: IERC4626 | A wrapped token reported the zero address as its underlying token asset. | `0x4c089bd4` | +| IssuedSharesBelowMin(uint256,uint256) | issuedShares: uint256, minIssuedShares: uint256 | Shares issued during initialization are below the requested amount. | `0xda0cb07e` | +| MaxTokens | | The token count is above the maximum allowed. | `0x707bdf58` | +| MinTokens | | The token count is below the minimum allowed. | `0x5ed4ba8f` | +| NotEnoughBufferShares | | The user is trying to remove more than their allocated shares from the buffer. | `0x98c5dbd6` | +| NotEnoughUnderlying(IERC4626,uint256,uint256) | wrappedToken: IERC4626, expectedUnderlyingAmount: uint256, actualUnderlyingAmount: uint256 | A wrap/unwrap operation consumed more or returned less underlying tokens than it should. | `0xd5f9cbcd` | +| NotEnoughWrapped(IERC4626,uint256,uint256) | wrappedToken: IERC4626, expectedWrappedAmount: uint256, actualWrappedAmount: uint256 | A wrap/unwrap operation consumed more or returned less wrapped tokens than it should. | `0x1e04cc57` | +| NotVaultDelegateCall | | The `VaultExtension` contract was called by an account directly. | `0x9fd25b36` | +| PauseBufferPeriodDurationTooLarge | | The caller specified a buffer period longer than the maximum. | `0x9ea4efee` | +| PercentageAboveMax | | A given percentage is above the maximum (usually a value close to FixedPoint.ONE, or 1e18 wei). | `0x746e5940` | +| PoolAlreadyInitialized(address) | pool: address | A pool has already been initialized. `initialize` may only be called once. | `0x218e3747` | +| PoolAlreadyRegistered(address) | pool: address | A pool has already been registered. `registerPool` may only be called once. | `0xdb771c80` | +| PoolInRecoveryMode(address) | pool: address | Cannot enable recovery mode when already enabled. | `0x346d7607` | +| PoolNotInitialized(address) | pool: address | A referenced pool has not been initialized. | `0x4bdace13` | +| PoolNotInRecoveryMode(address) | pool: address | Cannot disable recovery mode when not enabled. | `0xef029adf` | +| PoolNotPaused(address) | pool: address | Governance tried to unpause the Pool when it was not paused. | `0xfdcd6894` | +| PoolNotRegistered(address) | pool: address | A pool has not been registered. | `0x9e51bd5c` | +| PoolPaused(address) | pool: address | A user tried to perform an operation involving a paused Pool. | `0xd971f597` | +| PoolPauseWindowExpired(address) | pool: address | Governance tried to pause a Pool after the pause period expired. | `0xeb5a1217` | +| ProtocolFeesExceedTotalCollected | | Error raised when there is an overflow in the fee calculation. | `0x4c69ac5d` | +| QueriesDisabled | | A user tried to execute a query operation when they were disabled. | `0x7a198886` | +| QueriesDisabledPermanently | | An admin tried to re-enable queries, but they were disabled permanently. | `0x069f8cbc` | +| QuoteResultSpoofed | | Quote reverted with a reserved error code. | `0x28f95541` | +| RouterNotTrusted | | An unauthorized Router tried to call a permissioned function (i.e., using the Vault's token allowance). | `0xe5d185cf` | +| SenderIsNotVault(address) | sender: address | Error indicating the sender is not the Vault (e.g., someone is trying to call a permissioned function). | `0x089676d5` | +| SwapFeePercentageTooHigh | | Error raised when the swap fee percentage is greater than the maximum allowed value. | `0x7f47834b` | +| SwapFeePercentageTooLow | | Error raised when the swap fee percentage is less than the minimum allowed value. | `0xbfb20688` | +| SwapLimit(uint256,uint256) | amount: uint256, limit: uint256 | An amount in or out has exceeded the limit specified in the swap request. | `0xe2ea151b` | +| TokenAlreadyRegistered(IERC20) | token: IERC20 | A token was already registered (i.e., it is a duplicate in the pool). | `0xcbc7ea2c` | +| TokenNotRegistered(IERC20) | token: IERC20 | The user attempted to operate with a token that is not in the pool. | `0x59674a0c` | +| TokensMismatch(address,address,address) | pool: address, expectedToken: address, actualToken: address | The token list passed into an operation does not match the pool tokens in the pool. | `0xffe261a1` | +| TradeAmountTooSmall | | The amount given or calculated for an operation is below the minimum limit. | `0x1ed4d118` | +| VaultBuffersArePaused | | Buffer operation attempted while vault buffers are paused. | `0x0f27df09` | +| VaultIsNotUnlocked | | A user called a Vault function (swap, add/remove liquidity) outside the lock context. | `0xc09ba736` | +| VaultNotPaused | | Governance tried to unpause the Vault when it was not paused. | `0xf7ff4dca` | +| VaultPaused | | A user tried to perform an operation while the Vault was paused. | `0xda9f8b34` | +| VaultPauseWindowDurationTooLarge | | The caller specified a pause window period longer than the maximum. | `0xcc0e8fe5` | +| VaultPauseWindowExpired | | Governance tried to pause the Vault after the pause period expired. | `0x0e4460b7` | +| WrapAmountTooSmall(IERC4626) | wrappedToken: IERC4626 | The amount given to wrap/unwrap was too small, which can introduce rounding issues. | `0x1a53f97f` | +| WrongProtocolFeeControllerDeployment | | The `ProtocolFeeController` contract was configured with an incorrect Vault address. | `0x1bbe95c7` | +| WrongUnderlyingToken(IERC4626,address) | wrappedToken: IERC4626, underlyingToken: address | The wrapped token asset does not match the underlying token. | `0xd5e7e2a6` | +| WrongVaultAdminDeployment | | The `VaultAdmin` contract was configured with an incorrect Vault address. | `0x82cc28b6` | +| WrongVaultExtensionDeployment | | The `VaultExtension` contract was configured with an incorrect Vault address. | `0x1ab9d9d0` | + +### IWrappedBalancerPoolToken +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| VaultIsUnlocked | | The vault is unlocked | `0xbe18e309` | + +### IWrappedBalancerPoolTokenFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BalancerPoolTokenNotRegistered | | The Balancer pool token has not been registered. | `0x916f5d0e` | +| WrappedBPTAlreadyExists(address) | wrappedToken: address | BPT can only be wrapped once, and cannot be overwritten. | `0x957f7dce` | + +# oracles +## EclpLPOracle +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| TokenPriceTooSmall | | One of the token prices is too small. | `0x1d2fcef0` | + +## StableLPOracle +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| KDidNotConverge | | The `k` parameter did not converge to the positive root. | `0xdc95cdb4` | +| MinPriceTooLow | | The minimum price of the feed array is too low. | `0x478b96d8` | +| PriceRatioTooHigh | | The ratio between the maximum and minimum prices is too high. | `0xb4c522e0` | + +# pool-gyro +## Gyro2CLPPoolFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SupportsOnlyTwoTokens | | 2-CLP pools support 2 tokens only. | `0x34e77320` | + +## GyroECLPPoolFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SupportsOnlyTwoTokens | | E-CLP pools support 2 tokens only. | `0x34e77320` | + +## pool-gyro/lib +### Gyro2CLPMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AssetBoundsExceeded | | | `0x03ba4186` | + +### GyroECLPMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AssetBoundsExceeded | | | `0x03ba4186` | +| DerivedDsqWrong | | | `0xfb154af0` | +| DerivedTauAlphaNotNormalized | | | `0xc196e496` | +| DerivedTauAlphaYWrong | | | `0xec13362c` | +| DerivedTauBetaNotNormalized | | | `0x25bbd708` | +| DerivedTauBetaYWrong | | | `0xfa40768d` | +| DerivedTauXWrong | | | `0x4071c5a8` | +| DerivedUWrong | | | `0xf84d4b44` | +| DerivedVWrong | | | `0xcfb498d5` | +| DerivedWWrong | | | `0x83446b36` | +| DerivedZWrong | | | `0x12e3e411` | +| InvariantDenominatorWrong | | | `0xd1c17993` | +| MaxAssetsExceeded | | | `0x2da2a5e5` | +| MaxInvariantExceeded | | | `0xdc10196f` | +| RotationVectorCWrong | | | `0x658639aa` | +| RotationVectorNotNormalized | | | `0xa26d8c2e` | +| RotationVectorSWrong | | | `0xa9587a74` | +| StretchingFactorWrong | | | `0x77dfa312` | + +### SignedFixedPoint +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AddOverflow | | | `0xa7f965e3` | +| DivInterval | | | `0xe03f5d57` | +| MulOverflow | | | `0x0cde6c26` | +| SubOverflow | | | `0x8a5d6af4` | +| ZeroDivision | | | `0x0a0c22c7` | + +# pool-hooks +## ExitFeeHookExample +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ExitFeeAboveLimit(uint256,uint256) | feePercentage: uint256, limit: uint256 | The exit fee cannot exceed the maximum allowed percentage. | `0x05631b5c` | +| PoolDoesNotSupportDonation | | The pool does not support adding liquidity through donation. | `0xdfcf485a` | + +## NftLiquidityPositionExample +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| CannotUseExternalRouter(address) | router: address | Hooks functions called from an external router. | `0x2f51a4f2` | +| PoolDoesNotSupportDonation | | The pool does not support adding liquidity through donation. | `0xdfcf485a` | +| PoolSupportsUnbalancedLiquidity | | The pool supports adding unbalanced liquidity. | `0x228342a4` | +| WithdrawalByNonOwner(address,address,uint256) | withdrawer: address, owner: address, nftId: uint256 | Attempted withdrawal of an NFT-associated position by an address that is not the owner. | `0x92cc6781` | + +# pool-stable ## StablePool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AmplificationFactorTooHigh | | The amplification factor is above the maximum of the range (1 - 5000). | `0x9b80d390` | +| AmplificationFactorTooLow | | The amplification factor is below the minimum of the range (1 - 5000). | `0xab923323` | +| AmpUpdateAlreadyStarted | | Amplification update operations must be done one at a time. | `0x2f301e7e` | +| AmpUpdateDurationTooShort | | The amplification change duration is too short. | `0xcd6b022a` | +| AmpUpdateNotStarted | | Cannot stop an amplification update before it starts. | `0x4673a675` | +| AmpUpdateRateTooFast | | The amplification change rate is too fast. | `0x1c708b92` | + +# pool-utils +## BasePoolFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| StandardPoolWithCreator | | A pool creator was specified for a pool type that doesn't support it. | `0x61ee1764` | -| Error | Comment | -| --------------- | ----------------------------------------------- | -| AmplificationFactorTooLow() | The amplification factor is below the minimum of the range (1 - 5000) | -| AmplificationFactorTooHigh() | The amplification factor is above the maximum of the range (1 - 5000) | -| AmpUpdateDurationTooShort() | The amplification change duration is too short | -| AmpUpdateRateTooFast() | The amplification change rate is too fast | -| AmpUpdateAlreadyStarted() | Amplification update operations must be done one at a time | -| AmpUpdateNotStarted() | Cannot stop an amplification update before it starts | - +# pool-weighted ## WeightedPool - -| Error | Comment | -| --------------- | ----------------------------------------------- | -| MinWeight() | Indicates that one of the pool tokens' weight is below the minimum allowed | -| NormalizedWeightInvariant() | Indicates that the sum of the pool tokens' weights is not FP 1 | -| WeightedPoolBptRateUnsupported | Weighted Pools cannot safely use themselves as rate providers (especially nested) | - -## EVMCallCodeHelpers - -| Error | Comment | -| --------------- | ----------------------------------------------- | -| NotStaticCall() | Indicates a state-changing transaction was initiated in a context that only allows static calls | - -## InputHelpers - -| Error | Comment | -| --------------------- | ----------------------------------------------- | -| InputLengthMismatch() | Arrays passed to a function and intended to be parallel have different lengths | -| MultipleNonZeroInputs() | Multiple non-zero inputs were provided | -| AllZeroInputs() | All inputs provided were zero | -| TokensNotSorted() | Tokens provided are not in sorted order | - -## WordCodec -| Error | Comment | -| --------------- | ----------------------------------------------- | -| CodecOverflow() | Function called with an invalid value | -| OutOfBounds() | Function called with an invalid bitLength or offset | - -## FixedPoint -| Error | Comment | -| ------------- | ------------------- | -| ZeroDivision()| Attempted division by zero | - -## LogExpMath - -| Error | Comment | -| --------------------- | ----------------------------------------------- | -| BaseOutOfBounds() | This error is thrown when a base is not within an acceptable range | -| ExponentOutOfBounds() | This error is thrown when a exponent is not within an acceptable range | -| ProductOutOfBounds() | This error is thrown when the exponent * ln(base) is not within an acceptable range | -| InvalidExponent() | This error is thrown when an exponent used in the exp function is not within an acceptable range | -| OutOfBounds() | This error is thrown when a variable or result is not within the acceptable bounds defined in the function | - -## StableMath -| Error | Comment | -| ----------------------------- | ----------------------------------------------- | -| StableInvariantDidNotConverge()| The iterations to calculate the invariant didn't converge | -| StableComputeBalanceDidNotConverge()| The iterations to calculate the balance didn't converge | - -## WeightedMath - -| Error | Comment | -| --------------------- | ----------------------------------------------- | -| MaxOutRatio() | User attempted to extract a disproportionate amountOut of tokens from a pool | -| MaxInRatio() | User attempted to add a disproportionate amountIn of tokens to a pool | -| ZeroInvariant() | Error thrown when the calculated invariant is zero, indicating an issue with the invariant calculation | - -## Enumerable Map -| Error | Comment | -| --------------- | ----------------------------------------------- | -| IndexOutOfBounds() | An index is beyond the current bounds of the set | -| KeyNotFound() | This error is thrown when attempting to retrieve an entry that is not present in the map | - -## (Transient) Enumerable Set - -| Error | Comment | -| --------------- | ----------------------------------------------- | -| IndexOutOfBounds() | An index is beyond the current bounds of the set | -| ElementNotFound() | An element that is not present in the set | - -## ReentrancyGuardTransient -| Error | Comment | -| --------------- | ----------------------------------------------- | -| ReentrancyGuardReentrantCall() | Unauthorized reentrant call | - +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| WeightedPoolBptRateUnsupported | | `getRate` from `IRateProvider` was called on a Weighted Pool. | `0x18e79a20` | + +## pool-weighted/lbp +### BaseLBPFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidTrustedRouter | | The zero address was given for the trusted router. | `0x0307417b` | + +### BPTTimeLocker +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BPTStillLocked(uint256) | unlockTimestamp: uint256 | The caller has a locked BPT balance, but is trying to burn it before the timelock expired. | `0x60489698` | +| NoLockedBPT | | The caller has no balance of the locked BPT. | `0x00e39db1` | + +### LBPCommon +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AddingLiquidityNotAllowed | | The pool does not allow adding liquidity except during initialization and before the weight update. | `0x3eee08c7` | +| RemovingLiquidityNotAllowed | | Removing liquidity is not allowed before the end of the sale. | `0xf38b5770` | +| SwapOfProjectTokenIn | | The LBP configuration prohibits selling the project token back into the pool. | `0x1269438a` | +| SwapsDisabled | | Swaps are disabled except during the sale (i.e., between and start and end times). | `0xfdf79845` | +| UnsupportedOperation | | Single token liquidity operations (that call `computeBalance` are unsupported. | `0x9ba6061b` | + +### LBPool +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| NotImplemented | | LBPs are WeightedPools by inheritance, but WeightedPool immutable/dynamic getters are wrong for LBPs. | `0xd6234725` | + +### LBPValidation +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidBptLockDuration | | The BPT lock duration is invalid. | `0xc715892a` | +| InvalidBptPercentageToMigrate | | The percentage of BPT to migrate is invalid (must be between 0-100%). | `0x14533421` | +| InvalidMigrationWeights | | The sum of migrated weights is not equal to 1. | `0x63ecd650` | +| InvalidOwner | | The owner is the zero address. | `0x49e27cff` | +| InvalidProjectToken | | The project token is the zero address. | `0x59977db3` | +| InvalidReserveToken | | The reserve token is the zero address. | `0xaaee807a` | +| MigrationRouterRequired | | Cannot create a pool with migration parameters if the migration router is not set. | `0xb199d1fa` | +| TokensMustBeDifferent | | The project and reserve tokens must be different. | `0xfbfc7a91` | + +## pool-weighted/lib +### GradualValueChange +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidStartTime(uint256,uint256) | resolvedStartTime: uint256, endTime: uint256 | Indicates that the start time is after the end time | `0xc9767706` | + +# solidity-utils +## solidity-utils/helpers +### CodeDeployer +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| CodeDeploymentFailed | | | `0xfef82207` | + +### EVMCallModeHelpers +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| NotStaticCall | | A state-changing transaction was initiated in a context that only allows static calls. | `0x67f84ab2` | + +### FactoryWidePauseWindow +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| PoolPauseWindowDurationOverflow | | The factory deployer gave a duration that would overflow the Unix timestamp. | `0x68755a11` | + +### InputHelpers +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AllZeroInputs | | No valid input was given for a single token operation. | `0x7e46bddc` | +| InputLengthMismatch | | Arrays passed to a function and intended to be parallel have different lengths. | `0xaaad13f7` | +| MultipleNonZeroInputs | | More than one non-zero value was given for a single token operation. | `0x6b8c3be5` | +| TokensNotSorted | | The tokens supplied to an array argument were not sorted in numerical order. | `0x6e8f1947` | + +### PackedTokenBalance +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BalanceOverflow | | One of the balances is above the maximum value that can be stored. | `0x89560ca1` | + +### RevertCodec +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ErrorSelectorNotFound | | Handle the "reverted without a reason" case (i.e., no return data). | `0xa7285689` | +| Result(bytes) | result: bytes | On success of the primary operation in a `quoteAndRevert`, this error is thrown with the return data. | `0x5ab64fb8` | + +### TransientStorageHelpers +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| TransientIndexOutOfBounds | | An index is out of bounds on an array operation (e.g., at). | `0x0f4ae0e4` | + +### WordCodec +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| CodecOverflow | | Function called with an invalid value. | `0xe4337c05` | +| OutOfBounds | | Function called with an invalid bitLength or offset. | `0xb4120f14` | + +## solidity-utils/math +### FixedPoint +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ZeroDivision | | Attempted division by zero. | `0x0a0c22c7` | + +### LogExpMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| BaseOutOfBounds | | This error is thrown when a base is not within an acceptable range. | `0x022701e0` | +| ExponentOutOfBounds | | This error is thrown when a exponent is not within an acceptable range. | `0xd8317311` | +| InvalidExponent | | This error is thrown when an exponent used in the exp function is not within an acceptable range. | `0xd4794efd` | +| OutOfBounds | | This error is thrown when a variable or result is not within the acceptable bounds defined in the function. | `0xb4120f14` | +| ProductOutOfBounds | | This error is thrown when the exponent * ln(base) is not within an acceptable range. | `0xa2f9f7e3` | + +### StableMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| StableComputeBalanceDidNotConverge | | The iterations to calculate the balance didn't converge. | `0xdcbda05c` | +| StableInvariantDidNotConverge | | The iterations to calculate the invariant didn't converge. | `0x010ca320` | + +### WeightedMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| MaxInRatio | | User attempted to add a disproportionate amountIn of tokens to a pool. | `0x340a4533` | +| MaxOutRatio | | User attempted to extract a disproportionate amountOut of tokens from a pool. | `0x64590b9f` | +| ZeroInvariant | | Error thrown when the calculated invariant is zero, indicating an issue with the invariant calculation. | `0x26543689` | + +## solidity-utils/openzeppelin +### EnumerableMap +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| IndexOutOfBounds | | An index is beyond the current bounds of the set. | `0x4e23d035` | +| KeyNotFound | | This error is thrown when attempting to retrieve an entry that is not present in the map. | `0x5f3f479c` | + +### EnumerableSet +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ElementNotFound | | An element that is not present in the set. | `0x66af5392` | +| IndexOutOfBounds | | An index is beyond the current bounds of the set. | `0x4e23d035` | + +### ReentrancyGuardTransient +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ReentrancyGuardReentrantCall | | Unauthorized reentrant call. | `0x3ee5aeb5` | + +### TransientEnumerableSet +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ElementNotFound | | An element that is not present in the set. | `0x66af5392` | +| IndexOutOfBounds | | An index is beyond the current bounds of the set. | `0x4e23d035` | + +# standalone-utils +## BalancerContractRegistry +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InconsistentState(string,address) | contractName: string, contractAddress: address | A `_contractRegistry` entry has no corresponding `_contractInfo`. | `0x36a7ac0a` | + +## CallAndRevert +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| QuoteResultSpoofed | | | `0x28f95541` | + +## ERC4626CowSwapFeeBurner +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| AmountOutIsZero(IERC20) | token: IERC20 | The amount out is zero. | `0xc609fb47` | + +## FeeBurnerAuthentication +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidProtocolFeeSweeper | | The fee protocol is invalid. | `0x932c92a5` | +| SenderNotAllowed | | The sender does not have permission to call a function. | `0x23dada53` | + +## OwnableAuthentication +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| VaultNotSet | | The vault has not been set. | `0xc8e28160` | + +## ProtocolFeeSweeper +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| CannotReceiveEth | | All pool tokens are ERC20, so this contract should not handle ETH. | `0xf2238896` | + +## standalone-utils/utils +### HyperSpotPricePrecompile +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| SpotPriceIsZero | | The spot price is zero. | `0x44526c24` | +| SpotPricePrecompileFailed | | The precompile had an error while fetching the spot price. | `0x79827df5` | + +### HyperTokenInfoPrecompile +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| TokenInfoPrecompileFailed | | The precompile had an error while fetching the token info. | `0x61c18134` | + +# vault ## BalancerPoolToken -| Error | Comment | -| ----------------------------- | ----------------------------------------------- | -| ERC2612ExpiredSignature(uint256) | Permit deadline has expired | -| ERC2612InvalidSigner(address,address) | Mismatched signature | +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| ERC2612ExpiredSignature(uint256) | deadline: uint256 | Operation failed due to an expired permit signature. | `0x62791302` | +| ERC2612InvalidSigner(address,address) | signer: address, owner: address | Operation failed due to a non-matching signature. | `0x4b800e46` | -## VaultFactory +## BasePoolMath +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvariantRatioAboveMax(uint256,uint256) | invariantRatio: uint256, maxInvariantRatio: uint256 | An add liquidity operation increased the invariant above the limit. | `0x3e8960dc` | +| InvariantRatioBelowMin(uint256,uint256) | invariantRatio: uint256, minInvariantRatio: uint256 | A remove liquidity operation decreased the invariant below the limit. | `0xe31c95be` | + +## CommonAuthentication +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| VaultNotSet | | Vault cannot be address(0). | `0xc8e28160` | + +## ProtocolFeeController +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidMigrationSource | | Migration source cannot be this contract. | `0xb82fd5bf` | +| PoolAlreadyRegistered(address) | pool: address | Prevent pool data from being registered more than once. | `0xdb771c80` | + +## RouterHooks +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InsufficientPayment(IERC20) | token: IERC20 | The sender has not transferred the correct amount of tokens to the Vault. | `0xabf6c150` | -| Error | Comment | -| --------------------- | ----------------------------------------------- | -| VaultAddressMismatch()| The given salt does not match the generated address when attempting to create the Vault | -| InvalidBytecode(string) | The bytecode for the given contract does not match the expected bytecode | - -## FactoryWidePauseWindow -| Error | Comment | -| --------------------------------- | ----------------------------------------------- | -| PoolPauseWindowDurationOverflow() | The factory deployer gave a duration that would overflow the Unix timestamp | - -## PackedTokenBalance -| Error | Comment | -| ----------------- | ----------------------------------------------- | -| BalanceOverflow() | One of the balances is above the maximum value that can be stored | - -## RevertCodec -| Error | Comment | -| ----------------- | ----------------------------------------------- | -| Result(bytes) | On success of the primary operation in a `quoteAndRevert`,this error is thrown with the return data | -| ErrorSelectorNotFound() | Handle the "reverted without a reason" case (i.e.,no return data) | - -## TransientStorageHelpers -| Error | Comment | -| ----------------- | ----------------------------------------------- | -| TransientIndexOutOfBounds() | An index is out of bounds on an array operation (e.g.,at) | - -## ERC20TestToken -| Error | Comment | -| ----------------- | ----------------------------------------------- | -| ZeroTransfer | A zero value transfer occurred (test tokens revert here to ensure the Vault supports tokens that prohibit zero value transfers) | +## VaultFactory +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InvalidBytecode(string) | contractName: string | The bytecode for the given contract does not match the expected bytecode. | `0xc7f4796e` | +| InvalidProtocolFeeController | | The ProtocolFeeController cannot be the zero address. | `0xd8b6cbcf` | +| VaultAddressMismatch | | The given salt does not match the generated address when attempting to create the Vault. | `0xb4c1be7b` | +| VaultAlreadyDeployed(address) | vault: address | The Vault has already been deployed at this target address. | `0xe254a88b` | + +## vault/lib +### RouterWethLib +| Error | Arguments | Comment | Signature | +| --- | --- | --- | --- | +| InsufficientEth | | The amount of ETH paid is insufficient to complete this operation. | `0xa01a9df6` |