interface IShareTokenSaleData{
    /**
    * @dev Add a new purchased history of `account` and Update total purchased token amount of `account` in round `round`
    */
    function updatePurchaseData(address account, uint round, uint tokenAmount) external returns(bool);

    /**
    * @dev Update properties for end round
     */
    function end(uint round, uint time) external returns(bool);

    /**
    * @dev Get the next time can be released for this round
    */
    function getNextReleaseTime(uint round) external view returns(uint);

    /**
    * @dev Get release count by round
    */
    function getReleasedCountByRound(uint round) external view returns(uint);

    /**
    * @dev Get release count by round and holder
    */
    function getReleasedCountByRoundAndHolder(uint round, address account) external view returns(uint);

    /**
    * @dev Get release count by round
    */
    function getReleasedPercentByRound(uint round) external view returns(uint);

    /**
    * @dev Get total count can be released by round `round`
    */
    function getTotalCanReleaseCountByRound(uint round) external view returns(uint);

    /**
    * @dev Update released data when releasing
    */
    function updateReleasedData(uint round) external returns(bool);

    /**
    * @dev Update released data when releasing
    */
    function updateWithdrawData(address account, uint round) external returns(bool);

    /**
    * @dev Get the state to check whether shareholders can transfer BNU or not
    */
    function getShareholderCanTransfer() external view returns(bool);

    /**
    * @dev Get shareholder list 
    */
    function getShareholders() external view returns(address[] memory);

    /**
    * @dev Set the state to check whether shareholders can transfer BNU or not
    */
    function setShareholderCanTransfer(bool value) external;

    /**
    @dev Update all transfer data when a transfer request is maked
    *
    */
    function updateShareholderTransferData(address from, address to, uint amount, uint round) external returns(bool);

    /**
    * @dev Get shareholder's token balance by `round`
    */
    function getShareholderBalance(address account, uint round) external view returns(uint);

    /**
    * @dev Get end time of `round` 
    */
    function getTokenSaleEndTime(uint round)  external view returns(uint);
}
function getTotalCanReleaseCountByRound(uint round) external view returns(uint);
/**
 * @dev Get total count can be released by round `round`
 */