# CryndexToken.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/governance/utils/IVotes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

interface ICryndexToken is IERC20, IERC20Metadata, IVotes, IERC1363 {
    /// @notice Emitted when an account stakes Cryndex
    /// @param account The account staking tokens
    /// @param amount The amount of tokens staked
    /// @param timestamp The timestamp when the account staked tokens
    event Stake(address account, uint256 amount, uint256 timestamp);

    /// @notice Emitted when an account unstakes Cryndex
    /// @param account The account unstaking tokens
    /// @param amount The amount of tokens unstaked
    /// @param timestamp The timestamp when the account unstaked tokens
    event Unstake(address account, uint256 amount, uint256 timestamp);

    /// @notice Returns the total locked amount and voting power for an account, including accrued interest
    /// @param account The address to query
    /// @return The total locked amount (base + interest) in wei, representing voting power
    function getVotes(address account) external view returns (uint256);

    /// @notice Returns the total locked amount across all accounts, including accrued interest
    /// @return The total locked amount in wei
    function getTotalStaked() external view returns (uint256);

    /// @notice Locks tokens, burning them from circulation and increasing voting power
    /// @param amount The amount of tokens to lock (in wei)
    function stake(uint256 amount) external;

    /// @notice Initiates the unlocking process for a specified amount of tokens, starting a one-year withdrawal period
    /// @param amount The amount of tokens to unlock (in wei)
    function unstake(uint256 amount) external;

    /// @notice Calculates the current interest rate for the period
    /// @return The current interest rate for staking
    function getInterestRate() external view returns (uint256);

    /// @notice Returns the cooldown timestamp
    /// @param account The address of the account
    /// @return The cooldown for an account
    function getCooldown(address account) external view returns (uint256);

    /// @notice Burns tokens from the msg.sender
    /// @param amount Amount of tokens to burn
    function burn(uint256 amount) external;
}

```
