# Wrapped SD Token

`WrappedSDToken` wraps rebasing liquid staking tokens (such as stLINK) with a normal ERC20 token.

## ERC20 Functions

All standard ERC20 functions are implemented for `WrappedSDToken`

## View Functions

### sdToken

Returns the underlying staking receipt token that this contract wraps

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

#### Return Values

| Name    | Type    | Description                      |
| ------- | ------- | -------------------------------- |
| sdToken | address | Address of staking receipt token |

### getWrappedByUnderlying

Returns the amount of wrapped tokens that corresponds an amount of unwrapped tokens

```solidity
function getWrappedByUnderlying(uint256 _amount) external view returns (uint256)
```

#### Parameters

| Name     | Type    | Description                |
| -------- | ------- | -------------------------- |
| \_amount | uint256 | Amount of unwrapped tokens |

#### Return Values

| Name          | Type    | Description                            |
| ------------- | ------- | -------------------------------------- |
| wrappedAmount | uint256 | Amount of corresponding wrapped tokens |

### getUnderlyingByWrapped

Returns the amount of unwrapped tokens that corresponds to an amount of wrapped tokens

```solidity
function getUnderlyingByWrapped(uint256 _amount) external view returns (uint256)
```

#### Parameters

| Name     | Type    | Description              |
| -------- | ------- | ------------------------ |
| \_amount | uint256 | Amount of wrapped tokens |

#### Return Values

| Name            | Type    | Description                              |
| --------------- | ------- | ---------------------------------------- |
| unwrappedAmount | uint256 | Corresponding amount of unwrapped tokens |

## Write Functions

### onTokenTransfer

ERC677 implementation that proxies wrapping

```solidity
function onTokenTransfer(address _sender, uint256 _value, bytes) external
```

#### Parameters

| Name     | Type    | Description                  |
| -------- | ------- | ---------------------------- |
| \_sender | address | Sender of the token transfer |
| \_value  | uint256 | Value of the token transfer  |
|          | bytes   |                              |

### wrap

Wraps tokens

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

#### Parameters

| Name     | Type    | Description                        |
| -------- | ------- | ---------------------------------- |
| \_amount | uint256 | Amount of unwrapped tokens to wrap |

### unwrap

Unwraps tokens

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

#### Parameters

| Name     | Type    | Description                        |
| -------- | ------- | ---------------------------------- |
| \_amount | uint256 | Amount of wrapped tokens to unwrap |

### transferAndCall

Transfers tokens to an address and calls `onTokenTransfer` with additional data if the recipient is a contract

```solidity
function transferAndCall(address _to, uint256 _value, bytes _data) external returns (bool)
```

#### Parameters

| Name    | Type    | Description                       |
| ------- | ------- | --------------------------------- |
| \_to    | address | Address to send the tokens to     |
| \_value | uint256 | Value of token transfer           |
| \_data  | bytes   | Calldata included in the transfer |
