abstract contract ERC20Burnable is Ownable, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    // 成都链安 // 代币销毁函数，合约所有者销毁自身一定数量的代币
    function burn(uint256 amount) public virtual  {
        _burn(_msgSender(), amount); // 成都链安 // 调用内部函数_burn进行代币销毁
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    // 成都链安 // 代理代币销毁函数，合约所有者代理指定代币持有者account销毁一定数量的代币
    function burnFrom(address account, uint256 amount) public virtual  {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance); // 成都链安 // 调用内部函数_approve更新account对调用者的授权值
        _burn(account, amount); // 成都链安 // 调用内部函数_burn进行代币销毁
    }
}
function burnFrom(address account, uint256 amount) public virtual  {
    uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

    _approve(account, _msgSender(), decreasedAllowance); // 成都链安 // 调用内部函数_approve更新account对调用者的授权值
    _burn(account, amount); // 成都链安 // 调用内部函数_burn进行代币销毁
}

// 成都链安 // 代理代币销毁函数，合约所有者代理指定代币持有者account销毁一定数量的代币