# Unstake

Stakers can exchange their stake receipt tokens for the underlying asset they staked in the Rewards Manager (typically a Safety Module deposit receipt token). There is no delay to unstake - stakers can immediately unstake from a Rewards Manager.

### Using CozyRouter to unstake assets

The recommended way to programmatically unstake assets is to call `CozyRouter.unstake` (see CozyRouter):

```solidity
function unstake(
    IRewardsManager rewardsManager_,
    uint16 stakePoolId_,
    uint256 stakeReceiptTokenAmount,
    address receiver_
) public payable;
```

This method will internally call`RewardsManager.unstake`.

Prior to calling this function, the user must have approved `CozyRouter` to a spend sufficient amount of their `StakePool.stakeReceiptToken` balance.

### Unstake mechanics

On `RewardsManager.unstake`, we follow the following steps:

* Claim rewards on behalf of the `owner_`, transferring the reward assets to `receiver_`.
* Decrement `StakePool.amount`.
* Burn the `owner_`'s stake receipt tokens.
* Transfer the `receiver_` the relevant amount of stake assets.
* Emit a `Unstaked` event.
