Vault

Berachain

0x4be03f781c497a489e3cb0287833452ca9b9e80b

Solidity v0.7.1+commit.f4a555be

🤖
Query this contract from your AI
Reference: 0x4be03f781c497a489e3cb0287833452ca9b9e80b
Sample prompt: "Tell me the current state of berachain/0x4be03f781c497a489e3cb0287833452ca9b9e80b"
No AI wired up yet? → mcp.smarts.md
Berachain is a docs-only chain on Smarts: source code and ABI are indexed, but live on-chain data (state, recent events, admin profile) is not currently available. AI agents can still query get_contract_info and get_contract_source via MCP.

Overview

Read Functions
12
Write Functions
14
Events
12

Read Functions

WETH() view
dev: Returns the Vault's WETH instance.

Returns

Name Type Description
address
getActionId(selector: bytes4) view
dev: Returns the action identifier associated with the external function described by `selector`.

Parameters

Name Type Description
selector bytes4

Returns

Name Type Description
bytes32
getAuthorizer() view
dev: Returns the Vault's Authorizer.

Returns

Name Type Description
address
getDomainSeparator() view
dev: Returns the EIP712 domain separator.

Returns

Name Type Description
bytes32
getInternalBalance(user: address, tokens: address[]) view
dev: Returns `user`'s Internal Balance for a set of tokens.

Parameters

Name Type Description
user address
tokens address[]

Returns

Name Type Description
balances uint256[]
getNextNonce(user: address) view
dev: Returns the next nonce used by an address to sign messages.

Parameters

Name Type Description
user address

Returns

Name Type Description
uint256
getPausedState() view
dev: Returns the current contract pause status, as well as the end times of the Pause Window and Buffer Period.

Returns

Name Type Description
paused bool
pauseWindowEndTime uint256
bufferPeriodEndTime uint256
getPool(poolId: bytes32) view
dev: Returns a Pool's contract address and specialization setting.

Parameters

Name Type Description
poolId bytes32

Returns

Name Type Description
address
uint8
getPoolTokenInfo(poolId: bytes32, token: address) view
dev: Returns detailed information for a Pool's registered token. `cash` is the number of tokens the Vault currently holds for the Pool. `managed` is the number of tokens withdrawn and held outside the Vault by the Pool's token Asset Manager. The Pool's total balance for `token` equals the sum of `cash` and `managed`. Internally, `cash` and `managed` are stored using 112 bits. No action can ever cause a Pool's token `cash`, `managed` or `total` balance to be greater than 2^112 - 1. `lastChangeBlock` is the number of the block in which `token`'s total balance was last modified (via either a join, exit, swap, or Asset Manager update). This value is useful to avoid so-called 'sandwich attacks', for example when developing price oracles. A change of zero (e.g. caused by a swap with amount zero) is considered a change for this purpose, and will update `lastChangeBlock`. `assetManager` is the Pool's token Asset Manager.

Parameters

Name Type Description
poolId bytes32
token address

Returns

Name Type Description
cash uint256
managed uint256
lastChangeBlock uint256
assetManager address
getPoolTokens(poolId: bytes32) view
dev: Returns a Pool's registered tokens, the total balance for each, and the latest block when *any* of the tokens' `balances` changed. The order of the `tokens` array is the same order that will be used in `joinPool`, `exitPool`, as well as in all Pool hooks (where applicable). Calls to `registerTokens` and `deregisterTokens` may change this order. If a Pool only registers tokens once, and these are sorted in ascending order, they will be stored in the same order as passed to `registerTokens`. Total balances include both tokens held by the Vault and those withdrawn by the Pool's Asset Managers. These are the amounts used by joins, exits and swaps. For a detailed breakdown of token balances, use `getPoolTokenInfo` instead.

Parameters

Name Type Description
poolId bytes32

Returns

Name Type Description
tokens address[]
balances uint256[]
lastChangeBlock uint256
getProtocolFeesCollector() view
dev: Returns the current protocol fee module.

Returns

Name Type Description
address
hasApprovedRelayer(user: address, relayer: address) view
dev: Returns true if `user` has approved `relayer` to act as a relayer for them.

Parameters

Name Type Description
user address
relayer address

Returns

Name Type Description
bool

Write Functions

batchSwap(kind: uint8, swaps: tuple[], assets: address[], funds: tuple, limits: int256[], deadline: uint256) payable
dev: Performs a series of swaps with one or multiple Pools. In each individual swap, the caller determines either the amount of tokens sent to or received from the Pool, depending on the `kind` value. Returns an array with the net Vault asset balance deltas. Positive amounts represent tokens (or ETH) sent to the Vault, and negative amounts represent tokens (or ETH) sent by the Vault. Each delta corresponds to the asset at the same index in the `assets` array. Swaps are executed sequentially, in the order specified by the `swaps` array. Each array element describes a Pool, the token to be sent to this Pool, the token to receive from it, and an amount that is either `amountIn` or `amountOut` depending on the swap kind. Multihop swaps can be executed by passing an `amount` value of zero for a swap. This will cause the amount in/out of the previous swap to be used as the amount in for the current one. In a 'given in' swap, 'tokenIn' must equal the previous swap's `tokenOut`. For a 'given out' swap, `tokenOut` must equal the previous swap's `tokenIn`. The `assets` array contains the addresses of all assets involved in the swaps. These are either token addresses, or the IAsset sentinel value for ETH (the zero address). Each entry in the `swaps` array specifies tokens in and out by referencing an index in `assets`. Note that Pools never interact with ETH directly: it will be wrapped to or unwrapped from WETH by the Vault. Internal Balance usage, sender, and recipient are determined by the `funds` struct. The `limits` array specifies the minimum or maximum amount of each token the vault is allowed to transfer. `batchSwap` can be used to make a single swap, like `swap` does, but doing so requires more gas than the equivalent `swap` call. Emits `Swap` events.

Parameters

Name Type Description
kind uint8
swaps tuple[]
assets address[]
funds tuple
limits int256[]
deadline uint256

Returns

Name Type Description
assetDeltas int256[]
deregisterTokens(poolId: bytes32, tokens: address[]) nonpayable
dev: Deregisters `tokens` for the `poolId` Pool. Must be called by the Pool's contract. Only registered tokens (via `registerTokens`) can be deregistered. Additionally, they must have zero total balance. For Pools with the Two Token specialization, `tokens` must have a length of two, that is, both tokens must be deregistered in the same `deregisterTokens` call. A deregistered token can be re-registered later on, possibly with a different Asset Manager. Emits a `TokensDeregistered` event.

Parameters

Name Type Description
poolId bytes32
tokens address[]
exitPool(poolId: bytes32, sender: address, recipient: address, request: tuple) nonpayable
dev: Called by users to exit a Pool, which transfers tokens from the Pool's balance to `recipient`. This will trigger custom Pool behavior, which will typically ask for something in return from `sender` - often tokenized Pool shares. The amount of tokens that can be withdrawn is limited by the Pool's `cash` balance (see `getPoolTokenInfo`). If the caller is not `sender`, it must be an authorized relayer for them. The `tokens` and `minAmountsOut` arrays must have the same length, and each entry in these indicates the minimum token amount to receive for each token contract. The amounts to send are decided by the Pool and not the Vault: it just enforces these minimums. If exiting a Pool that holds WETH, it is possible to receive ETH directly: the Vault will do the unwrapping. To enable this mechanism, the IAsset sentinel value (the zero address) must be passed in the `assets` array instead of the WETH address. Note that it is not possible to combine ETH and WETH in the same exit. `assets` must have the same length and order as the array returned by `getPoolTokens`. This prevents issues when interacting with Pools that register and deregister tokens frequently. If receiving ETH however, the array must be sorted *before* replacing the WETH address with the ETH sentinel value (the zero address), which means the final `assets` array might not be sorted. Pools with no registered tokens cannot be exited. If `toInternalBalance` is true, the tokens will be deposited to `recipient`'s Internal Balance. Otherwise, an ERC20 transfer will be performed. Note that ETH cannot be deposited to Internal Balance: attempting to do so will trigger a revert. `minAmountsOut` is the minimum amount of tokens the user expects to get out of the Pool, for each token in the `tokens` array. This array must match the Pool's registered tokens. This causes the Vault to call the `IBasePool.onExitPool` hook on the Pool's contract, where Pools implement their own custom logic. This typically requires additional information from the user (such as the expected number of Pool shares to return). This can be encoded in the `userData` argument, which is ignored by the Vault and passed directly to the Pool's contract. Emits a `PoolBalanceChanged` event.

Parameters

Name Type Description
poolId bytes32
sender address
recipient address
request tuple
flashLoan(recipient: address, tokens: address[], amounts: uint256[], userData: bytes) nonpayable
dev: Performs a 'flash loan', sending tokens to `recipient`, executing the `receiveFlashLoan` hook on it, and then reverting unless the tokens plus a proportional protocol fee have been returned. The `tokens` and `amounts` arrays must have the same length, and each entry in these indicates the loan amount for each token contract. `tokens` must be sorted in ascending order. The 'userData' field is ignored by the Vault, and forwarded as-is to `recipient` as part of the `receiveFlashLoan` call. Emits `FlashLoan` events.

Parameters

Name Type Description
recipient address
tokens address[]
amounts uint256[]
userData bytes
joinPool(poolId: bytes32, sender: address, recipient: address, request: tuple) payable
dev: Called by users to join a Pool, which transfers tokens from `sender` into the Pool's balance. This will trigger custom Pool behavior, which will typically grant something in return to `recipient` - often tokenized Pool shares. If the caller is not `sender`, it must be an authorized relayer for them. The `assets` and `maxAmountsIn` arrays must have the same length, and each entry indicates the maximum amount to send for each asset. The amounts to send are decided by the Pool and not the Vault: it just enforces these maximums. If joining a Pool that holds WETH, it is possible to send ETH directly: the Vault will do the wrapping. To enable this mechanism, the IAsset sentinel value (the zero address) must be passed in the `assets` array instead of the WETH address. Note that it is not possible to combine ETH and WETH in the same join. Any excess ETH will be sent back to the caller (not the sender, which is important for relayers). `assets` must have the same length and order as the array returned by `getPoolTokens`. This prevents issues when interacting with Pools that register and deregister tokens frequently. If sending ETH however, the array must be sorted *before* replacing the WETH address with the ETH sentinel value (the zero address), which means the final `assets` array might not be sorted. Pools with no registered tokens cannot be joined. If `fromInternalBalance` is true, the caller's Internal Balance will be preferred: ERC20 transfers will only be made for the difference between the requested amount and Internal Balance (if any). Note that ETH cannot be withdrawn from Internal Balance: attempting to do so will trigger a revert. This causes the Vault to call the `IBasePool.onJoinPool` hook on the Pool's contract, where Pools implement their own custom logic. This typically requires additional information from the user (such as the expected number of Pool shares). This can be encoded in the `userData` argument, which is ignored by the Vault and passed directly to the Pool's contract, as is `recipient`. Emits a `PoolBalanceChanged` event.

Parameters

Name Type Description
poolId bytes32
sender address
recipient address
request tuple
managePoolBalance(ops: tuple[]) nonpayable
dev: Performs a set of Pool balance operations, which may be either withdrawals, deposits or updates. Pool Balance management features batching, which means a single contract call can be used to perform multiple operations of different kinds, with different Pools and tokens, at once. For each operation, the caller must be registered as the Asset Manager for `token` in `poolId`.

Parameters

Name Type Description
ops tuple[]
manageUserBalance(ops: tuple[]) payable
dev: Performs a set of user balance operations, which involve Internal Balance (deposit, withdraw or transfer) and plain ERC20 transfers using the Vault's allowance. This last feature is particularly useful for relayers, as it lets integrators reuse a user's Vault allowance. For each operation, if the caller is not `sender`, it must be an authorized relayer for them.

Parameters

Name Type Description
ops tuple[]
queryBatchSwap(kind: uint8, swaps: tuple[], assets: address[], funds: tuple) nonpayable
dev: Simulates a call to `batchSwap`, returning an array of Vault asset deltas. Calls to `swap` cannot be simulated directly, but an equivalent `batchSwap` call can and will yield the exact same result. Each element in the array corresponds to the asset at the same index, and indicates the number of tokens (or ETH) the Vault would take from the sender (if positive) or send to the recipient (if negative). The arguments it receives are the same that an equivalent `batchSwap` call would receive. Unlike `batchSwap`, this function performs no checks on the sender or recipient field in the `funds` struct. This makes it suitable to be called by off-chain applications via eth_call without needing to hold tokens, approve them for the Vault, or even know a user's address. Note that this function is not 'view' (due to implementation details): the client code must explicitly execute eth_call instead of eth_sendTransaction.

Parameters

Name Type Description
kind uint8
swaps tuple[]
assets address[]
funds tuple

Returns

Name Type Description
int256[]
registerPool(specialization: uint8) nonpayable
dev: Registers the caller account as a Pool with a given specialization setting. Returns the Pool's ID, which is used in all Pool-related functions. Pools cannot be deregistered, nor can the Pool's specialization be changed. The caller is expected to be a smart contract that implements either `IGeneralPool` or `IMinimalSwapInfoPool`, depending on the chosen specialization setting. This contract is known as the Pool's contract. Note that the same contract may register itself as multiple Pools with unique Pool IDs, or in other words, multiple Pools may share the same contract. Emits a `PoolRegistered` event.

Parameters

Name Type Description
specialization uint8

Returns

Name Type Description
bytes32
registerTokens(poolId: bytes32, tokens: address[], assetManagers: address[]) nonpayable
dev: Registers `tokens` for the `poolId` Pool. Must be called by the Pool's contract. Pools can only interact with tokens they have registered. Users join a Pool by transferring registered tokens, exit by receiving registered tokens, and can only swap registered tokens. Each token can only be registered once. For Pools with the Two Token specialization, `tokens` must have a length of two, that is, both tokens must be registered in the same `registerTokens` call, and they must be sorted in ascending order. The `tokens` and `assetManagers` arrays must have the same length, and each entry in these indicates the Asset Manager for the corresponding token. Asset Managers can manage a Pool's tokens via `managePoolBalance`, depositing and withdrawing them directly, and can even set their balance to arbitrary amounts. They are therefore expected to be highly secured smart contracts with sound design principles, and the decision to register an Asset Manager should not be made lightly. Pools can choose not to assign an Asset Manager to a given token by passing in the zero address. Once an Asset Manager is set, it cannot be changed except by deregistering the associated token and registering again with a different Asset Manager. Emits a `TokensRegistered` event.

Parameters

Name Type Description
poolId bytes32
tokens address[]
assetManagers address[]
setAuthorizer(newAuthorizer: address) nonpayable
dev: Sets a new Authorizer for the Vault. The caller must be allowed by the current Authorizer to do this. Emits an `AuthorizerChanged` event.

Parameters

Name Type Description
newAuthorizer address
setPaused(paused: bool) nonpayable
dev: Safety mechanism to pause most Vault operations in the event of an emergency - typically detection of an error in some part of the system. The Vault can only be paused during an initial time period, after which pausing is forever disabled. While the contract is paused, the following features are disabled: - depositing and transferring internal balance - transferring external balance (using the Vault's allowance) - swaps - joining Pools - Asset Manager interactions Internal Balance can still be withdrawn, and Pools exited.

Parameters

Name Type Description
paused bool
setRelayerApproval(sender: address, relayer: address, approved: bool) nonpayable
dev: Allows `relayer` to act as a relayer for `sender` if `approved` is true, and disallows it otherwise. Emits a `RelayerApprovalChanged` event.

Parameters

Name Type Description
sender address
relayer address
approved bool
swap(singleSwap: tuple, funds: tuple, limit: uint256, deadline: uint256) payable
dev: Performs a swap with a single Pool. If the swap is 'given in' (the number of tokens to send to the Pool is known), it returns the amount of tokens taken from the Pool, which must be greater than or equal to `limit`. If the swap is 'given out' (the number of tokens to take from the Pool is known), it returns the amount of tokens sent to the Pool, which must be less than or equal to `limit`. Internal Balance usage and the recipient are determined by the `funds` struct. Emits a `Swap` event.

Parameters

Name Type Description
singleSwap tuple
funds tuple
limit uint256
deadline uint256

Returns

Name Type Description
amountCalculated uint256

Events

AuthorizerChanged(newAuthorizer: address)
Name Type Indexed Description
newAuthorizer address
ExternalBalanceTransfer(token: address, sender: address, recipient: address, amount: uint256)
Name Type Indexed Description
token address
sender address
recipient address
amount uint256
FlashLoan(recipient: address, token: address, amount: uint256, feeAmount: uint256)
Name Type Indexed Description
recipient address
token address
amount uint256
feeAmount uint256
InternalBalanceChanged(user: address, token: address, delta: int256)
Name Type Indexed Description
user address
token address
delta int256
PausedStateChanged(paused: bool)
Name Type Indexed Description
paused bool
PoolBalanceChanged(poolId: bytes32, liquidityProvider: address, tokens: address[], deltas: int256[], protocolFeeAmounts: uint256[])
Name Type Indexed Description
poolId bytes32
liquidityProvider address
tokens address[]
deltas int256[]
protocolFeeAmounts uint256[]
PoolBalanceManaged(poolId: bytes32, assetManager: address, token: address, cashDelta: int256, managedDelta: int256)
Name Type Indexed Description
poolId bytes32
assetManager address
token address
cashDelta int256
managedDelta int256
PoolRegistered(poolId: bytes32, poolAddress: address, specialization: uint8)
Name Type Indexed Description
poolId bytes32
poolAddress address
specialization uint8
RelayerApprovalChanged(relayer: address, sender: address, approved: bool)
Name Type Indexed Description
relayer address
sender address
approved bool
Swap(poolId: bytes32, tokenIn: address, tokenOut: address, amountIn: uint256, amountOut: uint256)
Name Type Indexed Description
poolId bytes32
tokenIn address
tokenOut address
amountIn uint256
amountOut uint256
TokensDeregistered(poolId: bytes32, tokens: address[])
Name Type Indexed Description
poolId bytes32
tokens address[]
TokensRegistered(poolId: bytes32, tokens: address[], assetManagers: address[])
Name Type Indexed Description
poolId bytes32
tokens address[]
assetManagers address[]