> For the complete documentation index, see [llms.txt](https://docs.stake.link/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.stake.link/core-staking-contracts/withdrawalpool.md).

# Withdrawal Pool

The `WithdrawalPool` allows users to queue LST withdrawals if there is insufficient liquidity in the `PriorityPool` to satisfy the withdrawal amount. LST withdrawals will be added to a FIFO queue and will be fulfilled as the `PriorityPool` receives new deposits and/or as funds become available for withdrawal within the `StakingPool`.

## View Functions

### token

Returns the address of the token this pool handles

```solidity
function token() external view returns (address)
```

#### Return Values

| Name  | Type    | Description      |
| ----- | ------- | ---------------- |
| token | address | address of token |

### lst

Returns the address of the liquid staking token this pool handles

```solidity
function lst() external view returns (address)
```

#### Return Values

| Name | Type    | Description    |
| ---- | ------- | -------------- |
| lst  | address | address of lst |

### priorityPool

Returns the address of the priority pool

```solidity
function priorityPool() external view returns (address)
```

#### Return Values

| Name         | Type    | Description              |
| ------------ | ------- | ------------------------ |
| priorityPool | address | address of Priority Pool |

### indexOfNextWithdrawal

Returns the index of the withdrawal that's at the front of the queue

```solidity
function indexOfNextWithdrawal() external view returns (uint256)
```

#### Return Values

| Name                  | Type    | Description                           |
| --------------------- | ------- | ------------------------------------- |
| indexOfNextwithdrawal | uint256 | index of withdrawal at front of queue |

### withdrawalBatchIdCutoff

Returns the index where all batches before have had all withdrawal requests fully withdrawn

```solidity
function withdrawalBatchIdCutoff() external view returns (uint128)
```

#### Return Values

| Name                    | Type    | Description     |
| ----------------------- | ------- | --------------- |
| withdrawalBatchIdCutoff | uint128 | batch id cutoff |

### withdrawalIdCutoff

Returns the index where all requests before have been fully withdrawn

```solidity
function withdrawalIdCutoff() external view returns (uint128)
```

#### Return Values

| Name               | Type    | Description          |
| ------------------ | ------- | -------------------- |
| withdrawalIdCutoff | uint128 | withdrawal id cutoff |

### minWithdrawalAmount

Returns the min amount of LSTs that can be queued for withdrawal

```solidity
function minWithdrawalAmount() external view returns (uint256)
```

#### Return Values

| Name                | Type    | Description           |
| ------------------- | ------- | --------------------- |
| minWithdrawalAmount | uint256 | min withdrawal amount |

### minTimeBetweenWithdrawals

Returns the min amount of time between execution of withdrawals

```solidity
function minTimeBetweenWithdrawals() external view returns (uint64)
```

#### Return Values

| Name                      | Type   | Description                  |
| ------------------------- | ------ | ---------------------------- |
| minTimeBetweenwithdrawals | uint64 | min time between withdrawals |

### timeOfLastWithdrawal

Returns the time of last execution of withdrawals

```solidity
function timeOfLastWithdrawal() external view returns (uint64)
```

#### Return Values

| Name                 | Type   | Description             |
| -------------------- | ------ | ----------------------- |
| timeOfLastWithdrawal | uint64 | time of last withdrawal |

### getTotalQueuedWithdrawals

Returns the total amount of liquid staking tokens queued for withdrawal

```solidity
function getTotalQueuedWithdrawals() external view returns (uint256)
```

#### Return Values

| Name                   | Type    | Description                        |
| ---------------------- | ------- | ---------------------------------- |
| totalQueuedWithdrawals | uint256 | total amount queued for withdrawal |

### getAccountTotalQueuedWithdrawals

Returns the total amount of liquid staking tokens queued for withdrawal by an account

```solidity
function getAccountTotalQueuedWithdrawals(address _account) external view returns (uint256)
```

#### Parameters

| Name      | Type    | Description        |
| --------- | ------- | ------------------ |
| \_account | address | address of account |

#### Return Values

| Name                          | Type    | Description                                |
| ----------------------------- | ------- | ------------------------------------------ |
| accountTotalQueuedWithdrawals | uint256 | total amount queued across all withdrawals |

### getWithdrawals

Returns a list of withdrawals

```solidity
function getWithdrawals(uint256[] _withdrawalIds) external view returns (struct WithdrawalPool.Withdrawal[])
```

#### Parameters

| Name            | Type       | Description            |
| --------------- | ---------- | ---------------------- |
| \_withdrawalIds | uint256\[] | list of withdrawal ids |

#### Return Values

| Name        | Type                                | Description                                         |
| ----------- | ----------------------------------- | --------------------------------------------------- |
| withdrawals | struct WithdrawalPool.Withdrawal\[] | list of withdrawals corresponding to withdrawal ids |

### getBatchIds

Returns batch ids for a list of withdrawals

```solidity
function getBatchIds(uint256[] _withdrawalIds) public view returns (uint256[])
```

#### Parameters

| Name            | Type       | Description           |
| --------------- | ---------- | --------------------- |
| \_withdrawalIds | uint256\[] | list of withrawal ids |

#### Return Values

| Name     | Type       | Description                                       |
| -------- | ---------- | ------------------------------------------------- |
| batchIds | uint256\[] | list of batch ids corresponding to withdrawal ids |

### getWithdrawalIdsByOwner

Returns a list of withdrawal ids owned by an account

```solidity
function getWithdrawalIdsByOwner(address _account) public view returns (uint256[])
```

#### Parameters

| Name      | Type    | Description        |
| --------- | ------- | ------------------ |
| \_account | address | address of account |

#### Return Values

| Name          | Type       | Description            |
| ------------- | ---------- | ---------------------- |
| withdrawalIds | uint256\[] | list of withdrawal ids |

### getFinalizedWithdrawalIdsByOwner

Returns a list of finalized and partially finalized withdrawal ids owned by an account

*These withdrawals have funds available for the owner to withdraw*

```solidity
function getFinalizedWithdrawalIdsByOwner(address _account) external view returns (uint256[], uint256)
```

#### Parameters

| Name      | Type    | Description        |
| --------- | ------- | ------------------ |
| \_account | address | address of account |

#### Return Values

| Name          | Type       | Description                                         |
| ------------- | ---------- | --------------------------------------------------- |
| withdrawalIds | uint256\[] | list of withdrawal ids                              |
| withdrawable  | uint256    | total withdrawable across all account's withdrawals |

### checkUpkeep

Returns whether withdrawals should be executed based on available withdrawal space

```solidity
function checkUpkeep(bytes) external view returns (bool, bytes)
```

#### Return Values

| Name         | Type  | Description                                            |
| ------------ | ----- | ------------------------------------------------------ |
| upkeepNeeded | bool  | true if withdrawal should be executed, false otherwise |
|              | bytes |                                                        |

## Write Functions

### withdraw

Executes a group of fully and/or partially finalized withdrawals owned by the sender

```solidity
function withdraw(uint256[] _withdrawalIds, uint256[] _batchIds) external
```

#### Parameters

| Name            | Type       | Description                                       |
| --------------- | ---------- | ------------------------------------------------- |
| \_withdrawalIds | uint256\[] | list of withdrawal ids to execute                 |
| \_batchIds      | uint256\[] | list of batch ids corresponding to withdrawal ids |

### forceWithdraw

Executes a group of fully finalized withdrawals (owner-only)

```solidity
function forceWithdraw(uint256[] _withdrawalIds, uint256[] _batchIds) external
```

#### Parameters

| Name            | Type       | Description                                       |
| --------------- | ---------- | ------------------------------------------------- |
| \_withdrawalIds | uint256\[] | list of withdrawal ids to execute                 |
| \_batchIds      | uint256\[] | list of batch ids corresponding to withdrawal ids |

### queueWithdrawal

Queues a withdrawal of liquid staking tokens for an account

```solidity
function queueWithdrawal(address _account, uint256 _amount) external
```

#### Parameters

| Name      | Type    | Description        |
| --------- | ------- | ------------------ |
| \_account | address | address of account |
| \_amount  | uint256 | amount of LST      |

### deposit

Deposits asset tokens in exchange for liquid staking tokens, finalizing withdrawals\
starting from the front of the queue

```solidity
function deposit(uint256 _amount) external
```

#### Parameters

| Name     | Type    | Description                 |
| -------- | ------- | --------------------------- |
| \_amount | uint256 | amount of tokens to deposit |

### performUpkeep

Executes withdrawals if there is sufficient available withdrawal space

```solidity
function performUpkeep(bytes _performData) external
```

#### Parameters

| Name          | Type  | Description                                                       |
| ------------- | ----- | ----------------------------------------------------------------- |
| \_performData | bytes | encoded list of withdrawal data passed to staking pool strategies |

### updateWithdrawalBatchIdCutoff

Updates the withdrawalBatchIdCutoff

*This value is used to more efficiently return data in getBatchIds by skipping old withdrawal batches*

```solidity
function updateWithdrawalBatchIdCutoff() external
```

### setMinWithdrawalAmount

Sets the minimum amount of liquid staking tokens that can be queued for withdrawal

```solidity
function setMinWithdrawalAmount(uint256 _minWithdrawalAmount) external
```

#### Parameters

| Name                  | Type    | Description          |
| --------------------- | ------- | -------------------- |
| \_minWithdrawalAmount | uint256 | minimum token amount |

### setMinTimeBetweenWithdrawals

Sets the minimum amount of of time between calls to performUpkeep to finalize withdrawals

```solidity
function setMinTimeBetweenWithdrawals(uint64 _minTimeBetweenWithdrawals) external
```

#### Parameters

| Name                        | Type   | Description  |
| --------------------------- | ------ | ------------ |
| \_minTimeBetweenWithdrawals | uint64 | minimum time |
