interface ITST {
    /**
     * @dev sets existing feeAccount to `feeAccount` by the caller.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits an {FeeAccountUpdated} event indicating the new FeeAccount.
     */
    function setFeeAccount(address feeAccount) external returns (bool);
    
    /**
     * @dev sets existing maxTransferFee to `_maxTransferFee` by the caller.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits an {MaxTransferFeeUpdated} event indicating the new maximum transfer fee.
     */
    function setMaxTransferFee(uint256 maxTransferFee) external returns (bool);
    
    /**
     * @dev sets existing minTransferFee to `_minTransferFee` by the caller.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits an {MinTransferFeeUpdated} event indicating the new minimum transfer fee.
     */
    function setMinTransferFee(uint256 minTransferFee) external returns (bool);
    
    /**
     * @dev sets existing transferFeePercentage to `_transferFeePercentage` by the caller.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits an {TransferFeePercentageUpdated} event indicating the new percentange transfer fee.
     */
    function setTransferFeePercentage(uint256 transferFeePercentage) external returns (bool);
        
    /**
     * @dev calculate transfer fee aginst `weiAmount`.
     * @param weiAmount Value in wei to be to calculate fee.
     * @return Number of tokens in wei to paid for transfer fee.
     */
    function calculateTransferFee(uint256 weiAmount) external view returns(uint256) ;
    
    /**
     * @return the current fee account collector.
     */    
    function feeAccount() external view returns (address);
    
    /**
     * @return the current maximum transfer fee.
     */
    function maxTransferFee() external view returns (uint256);
    
    /**
     * @return the current minimum transfer fee.
     */
    function minTransferFee() external view returns (uint256);

    /**
     * @return the current percentange of transfer fee.
     */ 
    function transferFeePercentage() external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient` with a transaction note `message`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount, string calldata message) external returns (bool);
    
    /**
     * Event for FeeAccount update.
     * @param newFeeAccount new FeeAccount.
     * @param previousFeeAccount old FeeAccount.
     */
    event FeeAccountUpdated(address indexed previousFeeAccount, address indexed newFeeAccount);
    
    /**
     * Event for MaxTransferFee update.
     * @param newMaxTransferFee new maximum tranfer fee.
     * @param previousMaxTransferFee old maximum tranfer fee.
     */
    event MaxTransferFeeUpdated(uint256 previousMaxTransferFee, uint256 newMaxTransferFee);
    
    /**
     * Event for MinTransferFee update.
     * @param newMinTransferFee new minimum tranfer fee.
     * @param previousMinTransferFee old minimum tranfer fee.
     */
    event MinTransferFeeUpdated(uint256 previousMinTransferFee, uint256 newMinTransferFee);
    
    /**
     * Event for TransferFeePercentage update.
     * @param newTransferFeePercentage new percentange tranfer fee.
     * @param previousTransferFeePercentage old percentange tranfer fee.
     */
    event TransferFeePercentageUpdated(uint256 previousTransferFeePercentage, uint256 newTransferFeePercentage);
    
    /**
     * @dev emitted with token transfer is done.
     * @param from the account from which tokens are moved.
     * @param to the recipient of tokens.
     * @param value the amount to tokens moved.
     * @param fee the account to fee deducted from `from`.
     */
    event Transfer(address indexed from, address indexed to, uint256 value, uint256 fee, string description);
}
function setMaxTransferFee(uint256 maxTransferFee) external returns (bool);

/**
 * @dev sets existing maxTransferFee to `_maxTransferFee` by the caller.
 *
 * Returns a boolean value indicating whether the operation succeeded.
 * 
 * Emits an {MaxTransferFeeUpdated} event indicating the new maximum transfer fee.
 */