> For the complete documentation index, see [llms.txt](https://docs.bancor.network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bancor.network/guides/bancor-etherscan-guide/withdrawing-tokens/completing-the-withdrawal.md).

# Completing the Withdrawal

This is the last step of the withdrawal process, after which, your funds will be returned to your wallet.&#x20;

{% hint style="warning" %}
This can only be done once the cooldown time is completed
{% endhint %}

### 1. (BNT withdrawals only) Approve vBNT

{% hint style="info" %}
Withdrawing BNT requires an equal number of vBNT to the bnBNT you are withdrawing. For example, withdrawing 10 bnBNT requires 10 vBNT.&#x20;

For any other token, skip to [step 2](#2.-cooldown-id)
{% endhint %}

The BancorNetwork contract requires approval to perform the transaction with your vBNT tokens.

* Visit the `vBNT` contract [on etherscan](https://etherscan.io/token/0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94#writeContract)
* Execute the `Approve` function (this is a Write function)&#x20;

<table data-header-hidden><thead><tr><th width="220"></th><th></th></tr></thead><tbody><tr><td>_spender</td><td>The address of the <code>BancorNetwork</code> <a href="/pages/iStK5vfPhzSkgGPem4ru#the-following-network-contracts-are-required">found here</a></td></tr><tr><td>_value</td><td>The amount you would like to approve (it can be identical or more than the amount of bnBNT you wish to withdraw, BUT NOT LESS) in <code>WEI</code> format as <a href="/pages/ptmiyfiWw9tCRpQ3xIH6">explained here</a></td></tr></tbody></table>

### 2. Cooldown ID

This step will explain how to identify the cooldown ID needed to complete the withdrawal.

* Visit the *`PendingWithdrawals`* contract [on etherscan](https://etherscan.io/address/0x857Eb0Eb2572F7092C417CD386BA82e45EbA9B8a#readProxyContract)
* Execute the *`withdrawalRequestIds`* function (this is a Read function)&#x20;

![](/files/Y2aFooNXPlndHhs118Q6)

`Input variable`

| Name     | Type    | Description         |
| -------- | ------- | ------------------- |
| provider | address | Your wallet address |

`Output response`

| Name       | Type    | Description                                                            |
| ---------- | ------- | ---------------------------------------------------------------------- |
| cooldownId | uint256 | The ID of the existing cooldown requests you have (can be more than 1) |

**Save the cooldownIds** as these represent the inputs needed for the next steps.

### 3. Identify which cooldown ID to use

This step will explain how to identify which cooldown ID to use.&#x20;

{% hint style="info" %}
If you only have a single ID, skip to the [next step](#3.-identify-if-cooldown-is-over).
{% endhint %}

* Visit the *`PendingWithdrawals`* contract [on etherscan](https://etherscan.io/address/0x857Eb0Eb2572F7092C417CD386BA82e45EbA9B8a#readProxyContract)
* Execute the *`withdrawalRequest`* function (this is a Read function)&#x20;

![](/files/5PeZbAlzun9piVxIzujY)

`Input variable`

| Name | Type    | Description                                     |
| ---- | ------- | ----------------------------------------------- |
| id   | uint256 | One of the IDs generated from the previous step |

`Output response`

| Name               | Type       | Description                                              |
| ------------------ | ---------- | -------------------------------------------------------- |
| provider           | address    | The address that can interact with this cooldown request |
| poolToken          | IPoolToken | The locked bnToken                                       |
| reserveToken       | Token      | The underlying token                                     |
| createdAt          | uint32     | The time when the request was created                    |
| poolTokenAmount    | uint256    | The locked bnToken amount                                |
| reserveTokenAmount | uint256    | The expected amount of underlying asset to receive       |

Using the returned values,&#x20;

1. Identify the *`reserveToken`* you would like to withdraw
2. Save the *`id`* for the next step

### 4. Identify if the cooldown period is over

This step will explain how to check if your cooldown is over and you can safely withdraw your tokens.

* Visit the *`BancorNetworkInfo`* contract [on etherscan](https://etherscan.io/address/0x8E303D296851B320e6a697bAcB979d13c9D6E760#readProxyContract)
* Execute the *`isReadyForWithdrawal`* function (this is a Read function)&#x20;

![](/files/VDwc78PYozvOfrjKHYr8)

`Input variable`

| Name | Type    | Description                          |
| ---- | ------- | ------------------------------------ |
| id   | uint256 | The cooldown ID you wish to finalize |

`Output response`

| Name    | Type | Description                                                                                                         |
| ------- | ---- | ------------------------------------------------------------------------------------------------------------------- |
| isReady | bool | True/False indication on the status of the cooldown. (when True, [proceed to next step](#5.-complete-the-withdraw)) |

### 5. Complete the withdraw

This step will explain how to complete the withdrawal process and call the *`withdraw`* function.

* Visit the *`BancorNetwork`* contract [on etherscan](https://etherscan.io/address/0xeEF417e1D5CC832e619ae18D2F140De2999dD4fB#writeProxyContract)
* Execute the *`withdraw`* function (this is a Write function)&#x20;

`Input variable`

| Name | Type    | Description                          |
| ---- | ------- | ------------------------------------ |
| id   | uint256 | The cooldown ID you wish to withdraw |

`Output`&#x20;

This will complete the withdrawal process and return the underlying tokens to your wallet.
