Index Coop Resource Center
  • Welcome to The Index Coop.
  • Products
    • Trade
      • Index Coop Leverage Suite
      • Leverage Token Parameters
      • Leverage Token Keepers
      • Trading Interface Guide
      • Ripcord Guide
    • Earn
      • High Yield ETH Index (hyETH)
      • Interest Compounding ETH Index (icETH)
    • Asset Management
      • Product Development Process
      • Product Revenue Tokens (PRTs)
    • Legacy Products
      • How to Redeem Legacy Products
      • DeFi Pulse Index (DPI)
      • Bankless BED Index (BED)
      • Metaverse Index (MVI)
      • Diversified Staked ETH Index (dsETH)
      • Index Coop CoinDesk ETH Trend Index (cdETI)
      • Index Coop Large Cap Index (ic21)
      • ETH 2x Flexible Leverage Index (ETH2x-FLI)
      • BTC 2x Flexible Leverage Index (BTC2x-FLI)
      • Flexible Leverage Index- Polygon (FLI-Ps)
        • ETH 2x Flexible Leverage Index (ETH2x-FLI-P)
        • Inverse ETH Flexible Leverage Index (iETH-FLI-P)
        • BTC 2x Flexible Leverage Index (BTC2x-FLI-P)
        • Inverse BTC Flexible Leverage Index (iBTC-FLI-P)
        • MATIC 2x Flexible Leverage Index (MATIC2x-FLI-P)
        • Inverse MATIC Flexible Leverage Index (iMATIC-FLI-P)
      • Market Neutral Yield ETH (MNYe)
      • Bankless DeFi Innovation Index (GMI)
      • Data Economy Index (DATA)
      • Legacy Contract Addresses
      • Gitcoin Staked ETH Index (gtcETH)
  • Protocol
    • Index Protocol
      • Core Contracts
        • Set Token
        • Set Token Creator
        • Controller
        • Integration Registry
        • Price Oracle
        • Set Valuer
      • Modules
        • Basic Issuance Module
        • Debt Issuance Module v2
        • NAV Issuance Module
        • Trade Module
        • Streaming Fee Module
        • Wrap Module
        • Airdrop Module
        • Claim Module
        • Governance Module
        • Compound Leverage Module
        • Aave v2 Leverage Module
        • Aave v3 Leverage Module
        • Auction Rebalance Module
    • Set Protocol v2
    • Security and Audits
    • Contract Verification
    • Programmatic Redemptions
  • Resources
    • Governance
      • $INDEX - Governance Token
      • Index Improvement Proposals (IIP) Overview
        • IIP Step-by-Step
        • Governance Representatives
        • IIP Template
        • Product (DG) Template
      • Meta-Governance
      • Delegation
    • Data & Analytics
    • Multisigs
    • Press Kit
Powered by GitBook
On this page
  • Select Methods
  • issue()
  • issueWithEther()
  • redeem()
  • redeemIntoEther()
  • initialize()
  • addReserveAsset()
  • removeReserveAsset()
  • editPremium()
  • editManagerFee()
  • editFeeRecipient()
  • Select View Methods
  • getReserveAssets()
  • getExpectedSetTokenIssueQuantity()
  • getExpectedReserveRedeemQuantity()
  1. Protocol
  2. Index Protocol
  3. Modules

NAV Issuance Module

PreviousDebt Issuance Module v2NextTrade Module

Last updated 1 year ago

The NAVIssuanceModule is a smart contract that enables issuance and redemption of a with any valid ERC20 token or ETH if allowed by the manager. Sender receives a proportional amount of SetTokens on issuance or ERC20 token on redemption based on the calculated net asset value (NAV) using . The manager is able to enforce a premium/discount on issuance/redemption to avoid arbitrage and front-running when relying on oracle prices.

Select Methods

issue()

issue(ISetToken _setToken, address _reserveAsset, uint256 _reserveAssetQuantity, uint256 _minSetTokenReceiveQuantity, address _to)

Deposits the allowed reserve asset into the SetToken and mints the appropriate % of Net Asset Value of the SetToken to the specified _to address.

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_reserveAsset

address

Address of the reserve asset to issue with

_reserveAssetQuantity

uint256

Quantity of the reserve asset to issue with

_minSetTokenReceiveQuantity

uint256

Min quantity of SetToken to receive after issuance

_to

address

Address to mint SetToken to

issueWithEther()

issue(ISetToken _setToken, uint256 _minSetTokenReceiveQuantity, address _to)

Wraps ETH and deposits WETH if allowed into the SetToken and mints the appropriate % of Net Asset Value of the SetToken to the specified _to address.

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_minSetTokenReceiveQuantity

uint256

Min quantity of SetToken to receive after issuance

_to

address

Address to mint SetToken to

redeem()

redeem(ISetToken _setToken, address _reserveAsset, uint256 _setTokenQuantity, uint256 _minReserveReceiveQuantity, address _to)

Redeems a SetToken into a valid reserve asset representing the appropriate % of Net Asset Value of the SetToken to the specified _to address. Only valid if there are available reserve units on the SetToken.

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_reserveAsset

address

Address of the reserve asset to redeem

_reserveAssetQuantity

uint256

Quantity of the reserve asset to redeem

_minSetTokenReceiveQuantity

uint256

Min quantity of reserve asset to receive

_to

address

Address to redeem reserve asset to

redeemIntoEther()

redeemIntoEther(ISetToken _setToken, uint256 _setTokenQuantity, uint256 _minReserveReceiveQuantity, address _to)

Redeems a SetToken into Ether (if WETH is valid) representing the appropriate % of Net Asset Value of the SetToken to the specified _to address. Only valid if there are available WETH units on the SetToken.

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_reserveAssetQuantity

uint256

Quantity of the reserve asset to redeem

_minSetTokenReceiveQuantity

uint256

Min quantity of reserve asset to receive

_to

address

Address to redeem reserve asset to

initialize()

function initialize(ISetToken _setToken, NAVIssuanceSettings _navIssuanceSettings)

Manager only. Initializes this module to the SetToken with hooks, allowed reserve assets, fees and issuance premium. 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

_navIssuanceSettings

NAVIssuanceSettings

NAVIssuanceSettings struct defining parameters

The NAVIssuanceSettings struct is constructed as follows:

struct NAVIssuanceSettings {
    INAVIssuanceHook managerIssuanceHook;          // Issuance hook configurations
    INAVIssuanceHook managerRedemptionHook;        // Redemption hook configurations
    address[] reserveAssets;                       // Allowed reserve assets - Must have a price enabled with the price oracle
    address feeRecipient;                          // Manager fee recipient
    uint256[2] managerFees;                        // Manager fees. 0 index is issue and 1 index is redeem fee (0.01% = 1e14, 1% = 1e16)
    uint256 maxManagerFee;                         // Maximum fee manager is allowed to set for issue and redeem
    uint256 premiumPercentage;                     // Premium percentage (0.01% = 1e14, 1% = 1e16). This premium is a buffer around oracle
                                                   // prices paid by user to the SetToken, which prevents arbitrage and oracle front running
    uint256 maxPremiumPercentage;                  // Maximum premium percentage manager is allowed to set (configured by manager)
    uint256 minSetTokenSupply;                     // Minimum SetToken supply required for issuance and redemption 
                                                   // to prevent dramatic inflationary changes to the SetToken's position multiplier
}                                                   

addReserveAsset()

function addReserveAsset(ISetToken _setToken, address _reserveAsset)

Manager only. Add an allowed reserve asset

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_reserveAsset

address

Address of the reserve asset to add

removeReserveAsset()

function removeReserveAsset(ISetToken _setToken, address _reserveAsset)

Manager only. Add an allowed reserve asset

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_reserveAsset

address

Address of the reserve asset to remove

editPremium()

function editPremium(ISetToken _setToken, uint256 _premiumPercentage)

Manager only. Edit the premium percentage. Learn more about what the premium percentage is here.

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_premiumPercentage

uint256

Premium percentage in 10e16 (e.g. 10e16 = 1%)

editManagerFee()

function editManagerFee(ISetToken _setToken, uint256 _managerFeePercentage, uint256 _managerFeeIndex)

Manager only. Edit manager fee

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_managerFeePercentage

uint256

Manager fee percentage in 10e16 (e.g. 10e16 = 1%)

_managerFeeIndex

uint256

Manager fee index. 0 index is issue fee, 1 index is redeem fee

editFeeRecipient()

function editFeeRecipient(ISetToken _setToken, address _managerFeeRecipient)

Manager only. Edit fee recipient

Parameter Name

Type

Description

_setToken

ISetToken

Instance of the SetToken

_managerFeeRecipient

uint256

Manager fee recipient

Select View Methods

getReserveAssets()

function getReserveAssets(ISetToken _setToken) external view returns (address[] memory)

Returns reserve assets for a given SetToken.

Return Name

Type

Description

reserveAssets

address[]

Address array of reserve assets

getExpectedSetTokenIssueQuantity()

function getExpectedSetTokenIssueQuantity(ISetToken _setToken, address _reserveAsset, uint256 _reserveAssetQuantity) external view returns (uint256)

Get the expected SetTokens minted to recipient on issuance

Parameter Name

Type

Description

_setToken

ISetToken

Address of the SetToken

_reserveAsset

address

Address of the reserve asset to redeem

_reserveAssetQuantity

uint256

Quantity of the reserve asset to redeem

Return Name

Type

Description

setTokenQuantity

uint256

Expected SetTokens to be minted to recipient

getExpectedReserveRedeemQuantity()

function getExpectedReserveRedeemQuantity(ISetToken _setToken, address _reserveAsset, uint256 _setTokenQuantity) external view returns (uint256)

Get the expected reserve asset to be redeemed

Parameter Name

Type

Description

_setToken

ISetToken

Address of the SetToken

_reserveAsset

address

Address of the reserve asset to redeem

_setTokenQuantity

uint256

Quantity of SetTokens to redeem

Return Name

Type

Description

reserveAssetQuantity

uint256

Expected reserve asset quantity redeemed

SetToken
Price Oracles