# CryndexAsset.sol

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/interfaces/IERC1363.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

interface ICryndexAsset is IERC20, IERC20Metadata, IERC1363 {
    /// @notice Calculates the average price of the asset using Chainlink aggregators
    /// @return The average price in TARGET_PRECISION decimals
    function getAssetPrice() external view returns (uint256);

    /// @notice Returns the class of the asset to which the price is pegged
    /// @return Class of asset
    function getAssetClass() external view returns (string memory);

    /// @notice Returns the Chainlink price feed aggregators
    /// @return The address of the aggregators
    function getAggregators() external view returns (address[] memory);

    /// @notice Returns the multipliers of each price feed
    /// @return The multipliers of each price feed
    function getMultipliers() external view returns (uint256[] memory);

    /// @notice Mints new tokens to a specified address
    /// @param to The address to receive the newly minted tokens
    /// @param amount The amount of tokens to mint (in wei)
    function mint(address to, uint256 amount) external;

    /// @notice Burns tokens from a specified address
    /// @param account Address from where to burn the tokens
    /// @param amount Amount of tokens to burn (in wei, e.g., 1e18 for 1 token with 18 decimals)
    function burn(address account, uint256 amount) external;

    /// @notice Adds an account that can mint new tokens
    /// @notice account The address of the account to acquire the role
    function addMinter(address account) external;

    /// @notice Removes an account that can mint new tokens
    /// @notice account The address of the account from whom to remove the role
    function removeMinter(address account) external;

    /// @notice Adds an account that can burn tokens
    /// @notice account The address of the account to acquire the role
    function addBurner(address account) external;

    /// @notice Removes an account that can mint and burn tokens
    /// @notice account The address of the account from whom to remove the role
    function removeBurner(address account) external;
}

```
