contract Serenity is ERC20Pausable, Ownable
{

    string public symbol = "SET";
    string public name = "Serenity";
    string public version = "V1.0";
    uint8  public decimals = 18;
 
    mapping (address => uint256) private _frozenBalances;
    using SafeMath for uint256;

    constructor() public
    {
        _mint(owner(), 500000000 * 10 ** (uint256)(decimals));
    }

    function bulkTransfer(address[] memory recipients, uint256[] memory amounts) public onlyOwner
    {
        require(recipients.length == amounts.length, "Addresses and amounts arrays are not equal");

        for (uint256 i = 0; i < recipients.length; ++i)
        {
            require(recipients[i] != address(0), "One of the addresses is null address");
            _transfer(owner(), recipients[i], amounts[i]);
        }
    }

    function freeze(address token_holder, uint256 amount) public onlyOwner
    {
        require(token_holder != address(0), "token_holder is null address");
        require(amount <= _balances[token_holder], "No enough balance to freeze");
        _balances[token_holder] = _balances[token_holder].sub(amount);
        _frozenBalances[token_holder] = _frozenBalances[token_holder].add(amount);
    }

    function unfreeze(address token_holder, uint256 amount) public onlyOwner
    {
        require(token_holder != address(0), "token_holder is null address");
        require(amount <= _frozenBalances[token_holder], "No enough frozen balance to unfreeze");
        _frozenBalances[token_holder] = _frozenBalances[token_holder].sub(amount);
        _balances[token_holder] = _balances[token_holder].add(amount);
    }

    /**
     * @dev Burns a specific amount of tokens.
     * @param amount The amount of token to be burned.
     */
    function burn(uint256 amount) public onlyOwner
    {
        _burn(msg.sender, amount);
    }

     /**
     * @dev Burns a specific amount of tokens from the target address and decrements allowance
     * @param from address The account whose tokens will be burned.
     * @param amount uint256 The amount of token to be burned.
     */
    function burnFrom(address from, uint256 amount) public onlyOwner
    {
        _burnFrom(from, amount);
    }
   

    function balanceOfFrozen(address token_holder) public view returns (uint256)
    {
        return _frozenBalances[token_holder];
    }
}
function burn(uint256 amount) public onlyOwner
    {
        _burn(msg.sender, amount);
    }
/**
 * @dev Burns a specific amount of tokens.
 * @param amount The amount of token to be burned.
 */