Developers
Search…
Error Codes
Vault exceptions will revert with "BAL#" instead of text; see below for the interpretation of the number.
All error codes for the Balancer V2 core contracts are defined in the BalancerErrors.sol contract.

Math

Code
Error
Comment
0
ADD_OVERFLOW
1
SUB_OVERFLOW
2
SUB_UNDERFLOW
3
MUL_OVERFLOW
4
ZERO_DIVISION
5
DIV_INTERNAL
Multiplication overflow during FixedPoint Division
6
X_OUT_OF_BOUNDS
Invalid x in ExpMath.pow(x, y)
7
Y_OUT_OF_BOUNDS
Invalid y in ExpMath.pow(x, y)
8
PRODUCT_OUT_OF_BOUNDS
In LogExpMath.pow(x, y), error computing x^y as exp(y * ln(x))
9
INVALID_EXPONENT
In LogExpMath.exp(x) = e^x; x out of bounds

Input

Code
Error
Comment
100
OUT_OF_BOUNDS
101
UNSORTED_ARRAY
See UNSORTED_TOKENS
102
UNSORTED_TOKENS
Tokens must be sorted in address order on pool registration
103
INPUT_LENGTH_MISMATCH
Used to ensure array inputs intended to be parallel have the same length
104
ZERO_TOKEN
Address to be interpreted as a token cannot be 0

Shared pools

Code
Error
Comment
200
MIN_TOKENS
All pools must contain at least two tokens
201
MAX_TOKENS
Token count exceeds the maximum for a given pool type
202
MAX_SWAP_FEE_PERCENTAGE
203
MIN_SWAP_FEE_PERCENTAGE
204
MINIMUM_BPT
On pool initialization, a small amount of BPT is minted to the zero address (keeps math well behaved). If initial balances are too small, initialization can fail
205
CALLER_NOT_VAULT
Certain pool callbacks need to be external, but could be exploited if called by anyone but the Vault
206
UNINITIALIZED
Pools must be initialized with a special "Init" join, before they can be joined by LPs
207
BPT_IN_MAX_AMOUNT
Slippage/front-running protection check failed on a pool exit
208
BPT_OUT_MIN_AMOUNT
Slippage/front-running protection check failed on a pool join
209
EXPIRED_PERMIT
210
NOT_TWO_TOKENS
Pools with oracles are limited to two tokens (e.g., WeightedPool2Tokens and MetastablePools). A pool with the TWO_TOKEN specialization must have exactly two tokens

Pools

Code
Error
Comment
300
MIN_AMP
Amplification factor out of range (Stable/Metastable pools)
301
MAX_AMP
302
MIN_WEIGHT
Weighted Pool minimum weight
303
MAX_STABLE_TOKENS
304
MAX_IN_RATIO
Token in unbalanced the pool too much on a swap
305
MAX_OUT_RATIO
Token out unbalanced the pool too much on a swap
306
MIN_BPT_IN_FOR_TOKEN_OUT
Disproportionate exit unbalanced the pool too much
307
MAX_OUT_BPT_FOR_TOKEN_IN
Disproportionate join unbalanced the pool too much
308
NORMALIZED_WEIGHT_INVARIANT
Weighted Pool normalized weights must add to 1.0
309
INVALID_TOKEN
310
UNHANDLED_JOIN_KIND
Some joins are pool type-specific
311
ZERO_INVARIANT
Pool balances must be > 0
312
ORACLE_INVALID_SECONDS_QUERY
The "ago" timestamp when querying the oracle must be in the past
313
ORACLE_NOT_INITIALIZED
Cannot query an oracle with no data
314
ORACLE_QUERY_TOO_OLD
Cannot query before the oracle's earliest data sample
315
ORACLE_INVALID_INDEX
Cannot query a sample outside the buffer (1024)
316
ORACLE_BAD_SECS
Oracle query window must have non-zero duration
317
AMP_END_TIME_TOO_CLOSE
Amplification parameter change has less than the minimum duration
318
AMP_ONGOING_UPDATE
Cannot start an amplification parameter update if one is already ongoing
319
AMP_RATE_TOO_HIGH
The requested amplification parameter change is too fast (cannot halve or double over less than a day)
320
AMP_NO_ONGOING_UPDATE
Cannot cancel an update if there isn't one
321
STABLE_INVARIANT_DIDNT_CONVERGE
322
STABLE_GET_BALANCE_DIDNT_CONVERGE
323
RELAYER_NOT_CONTRACT
324
BASE_POOL_RELAYER_NOT_CALLED
325
REBALANCING_RELAYER_REENTERED
326
GRADUAL_UPDATE_TIME_TRAVEL
start > end time in a gradual weights update
327
SWAPS_DISABLED
328
CALLER_IS_NOT_LBP_OWNER
329
PRICE_RATE_OVERFLOW
Rate returned from a rateProvider must fit in 128 bits
330
INVALID_JOIN_EXIT_KIND_WHILE_SWAPS_DISABLED
Investment pools only allow proportional joins and exits when swaps are disabled (to prevent unbalancing the pool)
331
WEIGHT_CHANGE_TOO_FAST
Gradual weight update duration too short (minimum 1 day)
332
LOWER_GREATER_THAN_UPPER_TARGET
Invalid Linear Pool operating range
333
UPPER_TARGET_TOO_HIGH
Linear Pool max balance must fit in 112 bits
334
UNHANDLED_BY_LINEAR_POOL
Some joins/exits are pool type-specific
335
OUT_OF_TARGET_RANGE
Cannot reset Linear Pool targets if pool is unbalanced
336
UNHANDLED_EXIT_KIND
Some exits are pool type-specific
337
UNAUTHORIZED_EXIT
Management fees can only be collected by the pool owner
338
MAX_MANAGEMENT_SWAP_FEE_PERCENTAGE
339
UNHANDLED_BY_INVESTMENT_POOL
Some joins/exits are pool type-specific

Lib

Code
Error
Comment
400
REENTRANCY
401
SENDER_NOT_ALLOWED
402
PAUSED
403
PAUSE_WINDOW_EXPIRED
404
MAX_PAUSE_WINDOW_DURATION
405
MAX_BUFFER_PERIOD_DURATION
406
INSUFFICIENT_BALANCE
407
INSUFFICIENT_ALLOWANCE
408
ERC20_TRANSFER_FROM_ZERO_ADDRESS
409
ERC20_TRANSFER_TO_ZERO_ADDRESS
410
ERC20_MINT_TO_ZERO_ADDRESS
411
ERC20_BURN_FROM_ZERO_ADDRESS
412
ERC20_APPROVE_FROM_ZERO_ADDRESS
413
ERC20_APPROVE_TO_ZERO_ADDRESS
414
ERC20_TRANSFER_EXCEEDS_ALLOWANCE
415
ERC20_DECREASED_ALLOWANCE_BELOW_ZERO
416
ERC20_TRANSFER_EXCEEDS_BALANCE
417
ERC20_BURN_EXCEEDS_ALLOWANCE
418
SAFE_ERC20_CALL_FAILED
419
ADDRESS_INSUFFICIENT_BALANCE
420
ADDRESS_CANNOT_SEND_VALUE
421
SAFE_CAST_VALUE_CANT_FIT_INT256
422
GRANT_SENDER_NOT_ADMIN
In AccessControl, the caller of grantRole must be an admin
423
REVOKE_SENDER_NOT_ADMIN
In AccessControl, the caller of revokeRole must be an admin
424
RENOUNCE_SENDER_NOT_ALLOWED
In AccessControl, callers can onlyrenounceRole for their own account
425
BUFFER_PERIOD_EXPIRED
426
CALLER_IS_NOT_OWNER
427
NEW_OWNER_IS_ZERO
428
CODE_DEPLOYMENT_FAILED
429
CALL_TO_NON_CONTRACT
430
LOW_LEVEL_CALL_FAILED

Vault

Code
Error
Comment
500
INVALID_POOL_ID
501
CALLER_NOT_POOL
Some Vault hooks can only be called by the pool (e.g., register tokens)
502
SENDER_NOT_ASSET_MANAGER
503
USER_DOESNT_ALLOW_RELAYER
Relayers must be allowed by both governance and the user account
504
INVALID_SIGNATURE
505
EXIT_BELOW_MIN
Exit would yield fewer than the user-supplied minimum tokens out
506
JOIN_ABOVE_MAX
Join would cost more than the user-supplied maximum tokens in
507
SWAP_LIMIT
Swap violates user-supplied limits (min out or max in)
508
SWAP_DEADLINE
Swap transaction not mined within the specified deadline
509
CANNOT_SWAP_SAME_TOKEN
510
UNKNOWN_AMOUNT_IN_FIRST_SWAP
A batch swap must start with a non-zero amount in
511
MALCONSTRUCTED_MULTIHOP_SWAP
512
INTERNAL_BALANCE_OVERFLOW
Unused in current code
513
INSUFFICIENT_INTERNAL_BALANCE
514
INVALID_ETH_INTERNAL_BALANCE
Cannot transfer native ETH to/from internal balance
515
INVALID_POST_LOAN_BALANCE
Flashloan transactions must repay the loan in the same transaction
516
INSUFFICIENT_ETH
517
UNALLOCATED_ETH
Unused in current code
518
ETH_TRANSFER
Relayers cannot receive ETH directly (only through the Vault)
519
CANNOT_USE_ETH_SENTINEL
Internal Balance transfers cannot use ETH
520
TOKENS_MISMATCH
521
TOKEN_NOT_REGISTERED
522
TOKEN_ALREADY_REGISTERED
523
TOKENS_ALREADY_SET
524
TOKENS_LENGTH_MUST_BE_2
525
NONZERO_TOKEN_BALANCE
526
BALANCE_TOTAL_OVERFLOW
527
POOL_NO_TOKENS
528
INSUFFICIENT_FLASH_LOAN_BALANCE

Fees

Code
Error
Comment
600
SWAP_FEE_PERCENTAGE_TOO_HIGH
601
FLASH_LOAN_FEE_PERCENTAGE_TOO_HIGH
602
INSUFFICIENT_FLASH_LOAN_FEE_AMOUNT
Copy link
On this page
Math
Input
Shared pools
Pools
Lib
Vault
Fees