# Basic Issuance Module

The **BasicIssuanceModule** is a smart contract that enables issuance and redemption functionality on a [SetToken](https://docs.indexcoop.com/index-coop-community-handbook/protocol/index-protocol/core-contracts/set-token) for default-only positions.

## Select Methods

### issue()

`function issue(ISetToken _setToken, uint256 _quantity, address _to)`

Deposits the SetToken's position components into the SetToken and mints the SetToken of the given quantity to the specified \_to address. This function only handles Default Positions (positionState = 0). Components must be approved to this contract (BasicIssuanceModule) ahead of the issuance call.

| Parameter Name | Type      | Description                      |
| -------------- | --------- | -------------------------------- |
| \_setToken     | ISetToken | Instance of the SetToken         |
| \_quantity     | uint256   | Quantity of the SetToken to mint |
| \_to           | address   | Address to mint SetToken to      |

### redeem()

`function redeem( ISetToken _setToken, uint256 _quantity,address _to)`

Redeems the SetToken's positions and sends the components of the given quantity to the caller. This function only handles Default Positions (positionState = 0).

| Parameter Name | Type      | Description                         |
| -------------- | --------- | ----------------------------------- |
| \_setToken     | ISetToken | Address of the SetToken             |
| \_quantity     | uint256   | Quantity of the SetToken to`redeem` |
| \_to           | address   | Address to redeem components to     |

### initialize()

`function initialize(ISetToken _setToken, IManagerIssuanceHook _preIssueHook)`

**Manager only.** Initializes this module to the SetToken with issuance-related hooks. Only callable by the SetToken's manager. Hook addresses are optional. Address(0) means that no hook will be called

| Parameter Name | Type                 | Description                                                          |
| -------------- | -------------------- | -------------------------------------------------------------------- |
| \_setToken     | ISetToken            | Address of the SetToken                                              |
| \_preIssueHook | IManagerIssuanceHook | Instance of the Manager Contract with the Pre-Issuance Hook function |

## Select View Methods

### getRequiredComponentUnitsForIssue()

`function getRequiredComponentUnitsForIssue(ISetToken _setToken, uint256 _quantity) view returns (address[] memory, uint256[] memory)`

Retrieves the addresses and units required to mint a particular quantity of SetToken.

| Parameter Name | Type      | Description                         |
| -------------- | --------- | ----------------------------------- |
| \_setToken     | ISetToken | Address of the SetToken             |
| \_quantity     | uint256   | Quantity of the SetToken to`redeem` |

| Return Name         | Type       | Description                                                         |
| ------------------- | ---------- | ------------------------------------------------------------------- |
| componentAddresses  | address\[] | Address of the SetToken                                             |
| componentQuantities | uint256\[] | List of component units required to issue the quantity of SetTokens |
