# 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 |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.stake.link/core-staking-contracts/withdrawalpool.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
