Basic Minting and Redeeming Sets

What is the BasicIssuanceModule:

Simple issuance that only works with Sets with default positions. Includes normal issue / redeem functionality. Performs the actions of moving funds to / from user’s possession to the Set as needed. Has access to the SetToken's mint, burn, transfer functionality.

Initializing the BasicIssuanceModule:

All modules need to be added to the SetToken as the first step. Learn how to add a module to your SetToken in this section.

Once you have added the BasicIssuanceModule to the SetToken, you must initialize the SetToken on the BasicIssuanceModule:

/**
* 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
*
* @param _setToken Instance of the SetToken to issue
* @param _preIssueHook Instance of the Manager Contract with the Pre-Issuance Hook function
*/
function initialize(ISetToken _setToken, IManagerIssuanceHook _preIssueHook);

Input the SetToken address and the pre issue hook that can contain any custom logic you write prior to issuance. For example, the manager issuance contract can include whitelisting functionality, issuance limits and any other custom logic for operating your Set. Input the zero address if you do not have an manager issuance contract.

Issuing Sets:

In order to issue Sets you must call issue on the BasicIssuanceModule, the interface for issue is as follows:

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

Simply input the address of the Set you wish to issue and the amount of SetTokens you wish to issue. In order for issuance to work ALL of the components must be owned by the calling address in the correct proportions (whether it's a wallet or smart contract address).

All components must be approved to the BasicIssuanceModule contract with appropriate allowance for transfer.

In order to figure out the correct token amounts needed for issuance you can call the following function which returns a list of component addresses and required component units:

/**
* Retrieves the addresses and units required to mint a particular quantity of SetToken.
*
* @param _setToken Instance of the SetToken to issue
* @param _quantity Quantity of SetToken to issue
* @return address[] List of component addresses
* @return uint256[] List of component units required to issue the quantity of SetTokens
*/
function getRequiredComponentUnitsForIssue(ISetToken _setToken, uint256 _quantity) public view returns (address[] memory, uint256[] memory)

Each component unit is denominated the component base units. For example, 1 USDC is 10 ^ 6 and 1 WBTC is 10 ^ 18

Once you confirm you have all the required components to collateralize each position of the Set you will be able to issue which transfers those components to the SetToken and mint's the passed _quantity to the calling address.

Redeeming Sets:

The logic is very similar just in reverse. The interface for redeem is as follows:

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

You specify the amount of Sets you want to redeem and then those Sets are burned and the components are transferred to the calling address.