From 600cb1365781aa7dadcfb1e58a449db0e2d0a1f6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:33:22 +0200 Subject: [PATCH] new release (#116) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/asottile/pyupgrade: v3.8.0 → v3.9.0](https://github.com/asottile/pyupgrade/compare/v3.8.0...v3.9.0) - [github.com/PyCQA/docformatter: v1.7.3 → v1.7.4](https://github.com/PyCQA/docformatter/compare/v1.7.3...v1.7.4) - [github.com/psf/black: 23.3.0 → 23.7.0](https://github.com/psf/black/compare/23.3.0...23.7.0) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Upgrade pre-commit * Update history * Update documentation * Bump version * assorted fixes * fixed * Test taproot script byte serialization * Remove some type: ignore --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Giacomo Caironi Co-authored-by: fametrano --- .pre-commit-config.yaml | 6 ++--- HISTORY.md | 11 +++++++-- btclib/__init__.py | 2 +- btclib/block/block.py | 2 +- btclib/ec/curve_group.py | 6 ++--- btclib/psbt/psbt.py | 9 ++++--- btclib/psbt/psbt_in.py | 21 +++++++++++----- btclib/psbt/psbt_out.py | 22 +++++++++++------ btclib/script/engine/__init__.py | 2 -- btclib/script/engine/script.py | 4 +-- btclib/script/engine/tapscript.py | 4 +-- docs/source/btclib.script.engine.rst | 37 ++++++++++++++++++++++++++++ docs/source/btclib.script.rst | 16 ++++++++++++ docs/source/conf.py | 2 +- setup.py | 4 +-- tests/ecc/test_rfc6979.py | 8 +++--- tests/psbt/test_psbt.py | 10 ++++---- tests/script/test_script.py | 2 +- tests/script/test_taproot.py | 14 +++++++++++ tests/test_to_pub_key.py | 12 ++++----- tests/tx/test_tx.py | 2 +- 21 files changed, 144 insertions(+), 52 deletions(-) create mode 100644 docs/source/btclib.script.engine.rst diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 72f816064..6f11c26a7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: language: python types: [python] - repo: https://github.com/asottile/pyupgrade - rev: v3.8.0 + rev: v3.9.0 hooks: - id: pyupgrade args: [--py37-plus] @@ -70,7 +70,7 @@ repos: language: python types: [python] - repo: https://github.com/PyCQA/docformatter - rev: v1.7.3 + rev: v1.7.5 hooks: - id: docformatter description: "Formats docstrings to follow PEP 257." @@ -103,7 +103,7 @@ repos: language: python types: [python] - repo: https://github.com/psf/black - rev: 23.3.0 + rev: 23.7.0 hooks: - id: black name: black (in place fixes) diff --git a/HISTORY.md b/HISTORY.md index 5e6afda37..1b17676f3 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -5,11 +5,18 @@ Notable changes to the codebase are documented here. Release names follow *[calendar versioning](https://calver.org/)*: full year, short month, short day (YYYY-M-D) -## v2023.6 (work in progress, not released yet) +## v2023.7.12 + +This is the last release supporting py37. Major changes include: -- add descriptor util functions +- added first draft implementation of descriptors +- added first draft implementation of script engine +- added taproot psbt fields +- improved bip32 derivation (speeded-up, added one more test) +- supported py3.12 with btclib_libsecp256k1 +- updated toolchain ## v2023.5.30 diff --git a/btclib/__init__.py b/btclib/__init__.py index 4a459558d..8ebdbb700 100644 --- a/btclib/__init__.py +++ b/btclib/__init__.py @@ -10,7 +10,7 @@ """__init__ module for the btclib package.""" name = "btclib" -__version__ = "2023.5.30" +__version__ = "2023.7.12" __author__ = "The btclib developers" __author_email__ = "devs@btclib.org" __copyright__ = "Copyright (C) 2017-2023 The btclib developers" diff --git a/btclib/block/block.py b/btclib/block/block.py index 97dd854ae..595c17d95 100644 --- a/btclib/block/block.py +++ b/btclib/block/block.py @@ -53,7 +53,7 @@ def height(self) -> int | None: script_sig. https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki - Block 227,835 (2013-03-24 15 + Block 227,835 (2013-03-24 15 :49: 13 GMT) was the last version 1 block. """ if not self.transactions[0].is_coinbase(): diff --git a/btclib/ec/curve_group.py b/btclib/ec/curve_group.py index 750b2a870..f437b2296 100644 --- a/btclib/ec/curve_group.py +++ b/btclib/ec/curve_group.py @@ -703,9 +703,9 @@ def _multi_mult( Use Bos-Coster's algorithm for efficient computation. - The input points are assumed to be on curve, - the scalar coefficients are assumed to have been reduced mod n - if appropriate (e.g. cyclic groups of order n). + The input points are assumed to be on curve, the scalar coefficients + are assumed to have been reduced mod n if appropriate (e.g. cyclic + groups of order n). """ # source: https://cr.yp.to/badbatch/boscoster2.py if len(scalars) != len(jac_points): diff --git a/btclib/psbt/psbt.py b/btclib/psbt/psbt.py index 5dccfd0d5..967eaf76a 100644 --- a/btclib/psbt/psbt.py +++ b/btclib/psbt/psbt.py @@ -189,13 +189,16 @@ def to_dict(self, check_validity: bool = True) -> dict[str, Any]: def from_dict( cls: type[Psbt], dict_: Mapping[str, Any], check_validity: bool = True ) -> Psbt: + hd_key_paths = cast( + Mapping[Octets, BIP32KeyOrigin], + decode_from_bip32_derivs(dict_["bip32_derivs"]), + ) return cls( Tx.from_dict(dict_["tx"]), [PsbtIn.from_dict(psbt_in, False) for psbt_in in dict_["inputs"]], [PsbtOut.from_dict(psbt_out, False) for psbt_out in dict_["outputs"]], dict_["version"], - # FIXME - decode_from_bip32_derivs(dict_["bip32_derivs"]), # type: ignore[arg-type] + hd_key_paths, dict_["unknown"], check_validity, ) @@ -483,7 +486,7 @@ def _sort_or_shuffle_together( if ordering_func is None: random.shuffle(tmp) else: - tmp.sort(key=lambda t: ordering_func(t[0])) # type: ignore + tmp.sort(key=lambda t: ordering_func(t[0])) # type: ignore[misc] tuple_a, tuple_b = zip(*tmp) return list(tuple_a), list(tuple_b) diff --git a/btclib/psbt/psbt_in.py b/btclib/psbt/psbt_in.py index 5e6a17c66..1f12a0bf6 100644 --- a/btclib/psbt/psbt_in.py +++ b/btclib/psbt/psbt_in.py @@ -15,7 +15,7 @@ # Standard library imports from dataclasses import dataclass -from typing import Any, Mapping +from typing import Any, List, Mapping, Tuple, cast from btclib.alias import Octets from btclib.bip32.key_origin import ( @@ -54,7 +54,6 @@ serialize_hd_key_paths, serialize_leaf_scripts, serialize_taproot_bip32, - taproot_bip32_from_dict, taproot_bip32_to_dict, ) from btclib.script import Witness @@ -319,6 +318,14 @@ def to_dict(self, check_validity: bool = True) -> dict[str, Any]: def from_dict( cls: type[PsbtIn], dict_: Mapping[str, Any], check_validity: bool = True ) -> PsbtIn: + hd_key_paths = cast( + Mapping[Octets, BIP32KeyOrigin], + decode_from_bip32_derivs(dict_["bip32_derivs"]), + ) + taproot_hd_key_paths = cast( + Mapping[Octets, Tuple[List[Octets], BIP32KeyOrigin]], + decode_from_bip32_derivs(dict_["taproot_hd_key_paths"]), + ) return cls( Tx.from_dict(dict_["non_witness_utxo"], False) if dict_["non_witness_utxo"] @@ -330,8 +337,7 @@ def from_dict( dict_["sig_hash"], dict_["redeem_script"], dict_["witness_script"], - # FIXME - decode_from_bip32_derivs(dict_["bip32_derivs"]), # type: ignore + hd_key_paths, dict_["final_script_sig"], Witness.from_dict(dict_["final_script_witness"], False), dict_["ripemd160_preimages"], @@ -341,7 +347,7 @@ def from_dict( dict_["taproot_key_spend_signature"], dict_["taproot_script_spend_signatures"], dict_["taproot_leaf_scripts"], - taproot_bip32_from_dict(dict_["taproot_hd_key_paths"]), # type: ignore + taproot_hd_key_paths, dict_["taproot_internal_key"], dict_["taproot_merkle_root"], dict_["unknown"], @@ -526,7 +532,10 @@ def parse( elif k[:1] == PSBT_IN_TAP_LEAF_SCRIPT: taproot_leaf_scripts[k[1:]] = parse_leaf_script(v) elif k[:1] == PSBT_IN_TAP_BIP32_DERIVATION: - taproot_hd_key_paths[k[1:]] = parse_taproot_bip32(v) # type: ignore + taproot_hd_key_path = cast( + Tuple[List[Octets], BIP32KeyOrigin], parse_taproot_bip32(v) + ) + taproot_hd_key_paths[k[1:]] = taproot_hd_key_path elif k[:1] == PSBT_IN_TAP_INTERNAL_KEY: taproot_internal_key = deserialize_bytes(k, v, "taproot internal key") elif k[:1] == PSBT_IN_TAP_MERKLE_ROOT: diff --git a/btclib/psbt/psbt_out.py b/btclib/psbt/psbt_out.py index 2dd04bd9a..f09bb5fe6 100644 --- a/btclib/psbt/psbt_out.py +++ b/btclib/psbt/psbt_out.py @@ -15,7 +15,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any, Mapping, Sequence +from typing import Any, List, Mapping, Sequence, Tuple, cast from btclib.alias import Octets from btclib.bip32 import ( @@ -126,15 +126,21 @@ def to_dict(self, check_validity: bool = True) -> dict[str, Any]: def from_dict( cls: type[PsbtOut], dict_: Mapping[str, Any], check_validity: bool = True ) -> PsbtOut: + hd_key_paths = cast( + Mapping[Octets, BIP32KeyOrigin], + decode_from_bip32_derivs(dict_["bip32_derivs"]), + ) + taproot_hd_key_paths = cast( + Mapping[Octets, Tuple[List[bytes], BIP32KeyOrigin]], + taproot_bip32_from_dict(dict_["taproot_hd_key_paths"]), + ) return cls( dict_["redeem_script"], dict_["witness_script"], - # FIXME - decode_from_bip32_derivs(dict_["bip32_derivs"]), # type: ignore + hd_key_paths, dict_["taproot_internal_key"], dict_["taproot_tree"], - # FIXME - taproot_bip32_from_dict(dict_["taproot_hd_key_paths"]), # type: ignore + taproot_hd_key_paths, dict_["unknown"], check_validity, ) @@ -195,7 +201,7 @@ def parse( hd_key_paths: dict[Octets, BIP32KeyOrigin] = {} taproot_internal_key = b"" taproot_tree: list[tuple[int, int, bytes]] = [] - taproot_hd_key_paths: dict[Octets, tuple[list[Octets], BIP32KeyOrigin]] = {} + taproot_hd_key_paths: dict[Octets, tuple[list[bytes], BIP32KeyOrigin]] = {} unknown: dict[Octets, Octets] = {} for k, v in output_map.items(): @@ -212,7 +218,7 @@ def parse( taproot_tree = parse_taproot_tree(v) elif k[:1] == PSBT_OUT_TAP_BIP32_DERIVATION: #  parse just one hd key path at time :-( - taproot_hd_key_paths[k[1:]] = parse_taproot_bip32(v) # type: ignore + taproot_hd_key_paths[k[1:]] = parse_taproot_bip32(v) else: # unknown unknown[k] = v @@ -222,7 +228,7 @@ def parse( hd_key_paths, taproot_internal_key, taproot_tree, - taproot_hd_key_paths, # type: ignore + taproot_hd_key_paths, unknown, check_validity, ) diff --git a/btclib/script/engine/__init__.py b/btclib/script/engine/__init__.py index 43bb91bb6..a15a298da 100644 --- a/btclib/script/engine/__init__.py +++ b/btclib/script/engine/__init__.py @@ -11,8 +11,6 @@ from __future__ import annotations -from typing import cast - from btclib.alias import Command, ScriptList from btclib.exceptions import BTClibValueError from btclib.hashes import sha256 diff --git a/btclib/script/engine/script.py b/btclib/script/engine/script.py index 153d8f764..7802c756e 100644 --- a/btclib/script/engine/script.py +++ b/btclib/script/engine/script.py @@ -16,7 +16,7 @@ try: from btclib_libsecp256k1.dsa import verify as dsa_verify except ImportError: - from btclib.ecc.dsa import verify_ as dsa_verify # type: ignore + from btclib.ecc.dsa import verify_ as dsa_verify # type: ignore[assignment] from btclib.alias import ScriptList from btclib.ecc.dsa import Sig @@ -125,7 +125,7 @@ def op_checksig( msg_hash = sig_hash.segwit_v0(script_code, tx, i, signature[-1], prevout_value) else: msg_hash = sig_hash.legacy(script_code, tx, i, signature[-1]) - return dsa_verify(msg_hash, pub_key, signature[:-1]) # type: ignore + return bool(dsa_verify(msg_hash, pub_key, signature[:-1])) def script_op_count(count: int, increment: int): diff --git a/btclib/script/engine/tapscript.py b/btclib/script/engine/tapscript.py index 0b072c3eb..bdc5babec 100644 --- a/btclib/script/engine/tapscript.py +++ b/btclib/script/engine/tapscript.py @@ -64,7 +64,7 @@ def verify_key_path( pub_key = type_and_payload(script_pub_key)[1] msg_hash = sig_hash.taproot(tx, i, prevouts, sighash_type, 0, annex, b"") - if not ssa_verify(msg_hash, pub_key, signature[:64]): # type: ignore + if not ssa_verify(msg_hash, pub_key, signature[:64]): raise BTClibValueError() @@ -93,7 +93,7 @@ def op_checksig( tapleaf_hash = tagged_hash(b"TapLeaf", preimage) ext = tapleaf_hash + b"\x00" + codesep_pos.to_bytes(4, "little") msg_hash = sig_hash.taproot(tx, i, prevouts, sighash_type, 1, annex, ext) - if not ssa_verify(msg_hash, pub_key, signature[:64]): # type: ignore + if not ssa_verify(msg_hash, pub_key, signature[:64]): raise BTClibValueError() stack.append(_from_num(int(bool(signature)))) return budget diff --git a/docs/source/btclib.script.engine.rst b/docs/source/btclib.script.engine.rst new file mode 100644 index 000000000..4e8996bf9 --- /dev/null +++ b/docs/source/btclib.script.engine.rst @@ -0,0 +1,37 @@ +btclib.script.engine package +============================ + +Submodules +---------- + +btclib.script.engine.script module +---------------------------------- + +.. automodule:: btclib.script.engine.script + :members: + :undoc-members: + :show-inheritance: + +btclib.script.engine.script\_op\_codes module +--------------------------------------------- + +.. automodule:: btclib.script.engine.script_op_codes + :members: + :undoc-members: + :show-inheritance: + +btclib.script.engine.tapscript module +------------------------------------- + +.. automodule:: btclib.script.engine.tapscript + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: btclib.script.engine + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/btclib.script.rst b/docs/source/btclib.script.rst index b9c43e000..6f35aa91a 100644 --- a/docs/source/btclib.script.rst +++ b/docs/source/btclib.script.rst @@ -1,9 +1,25 @@ btclib.script package ===================== +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + btclib.script.engine + Submodules ---------- +btclib.script.op\_codes\_tapscript module +----------------------------------------- + +.. automodule:: btclib.script.op_codes_tapscript + :members: + :undoc-members: + :show-inheritance: + btclib.script.script module --------------------------- diff --git a/docs/source/conf.py b/docs/source/conf.py index ddf8ebdac..3c87300d5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -20,7 +20,7 @@ project = "btclib" project_copyright = "2017-2023 The btclib developers" author = "The btclib developers" -release = "2023.5.30" +release = "2023.7.12" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/setup.py b/setup.py index 77eb12e3e..63340d143 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ # or distributed except according to the terms contained in the LICENSE file. """Build script for setuptools.""" -from setuptools import find_packages, setup # type: ignore +from setuptools import find_namespace_packages, setup # type: ignore[import] import btclib @@ -34,7 +34,7 @@ description="A library for 'bitcoin cryptography'", long_description=longdescription, long_description_content_type="text/markdown", - packages=find_packages(exclude=["tests", "tests.*"]), + packages=find_namespace_packages(exclude=["tests", "tests.*"]), include_package_data=True, # test_suite="btclib.tests", install_requires=["btclib_libsecp256k1"], diff --git a/tests/ecc/test_rfc6979.py b/tests/ecc/test_rfc6979.py index 2c378a783..2478990c8 100644 --- a/tests/ecc/test_rfc6979.py +++ b/tests/ecc/test_rfc6979.py @@ -14,7 +14,7 @@ from os import path from btclib.ec import mult -from btclib.ec.curve import CURVES +from btclib.ec.curve import CURVES, Curve from btclib.ecc import dsa from btclib.ecc.rfc6979_nonce import rfc6979_nonce_ from btclib.hashes import reduce_to_hlen @@ -31,7 +31,9 @@ def test_rfc6979() -> None: def test_rfc6979_nonce_example() -> None: - class _helper: # pylint: disable=too-few-public-methods + class _helper( + Curve + ): # pylint: disable=too-few-public-methods, super-init-not-called def __init__(self, n: int) -> None: self.n = n self.nlen = n.bit_length() @@ -43,7 +45,7 @@ def __init__(self, n: int) -> None: msg = b"sample" msg_hash = hashlib.sha256(msg).digest() k = 0x23AF4074C90A02B3FE61D286D5C87F425E6BDD81B - assert k == rfc6979_nonce_(msg_hash, x, fake_ec) # type: ignore[arg-type] + assert k == rfc6979_nonce_(msg_hash, x, fake_ec) def test_rfc6979_nonce_tv() -> None: diff --git a/tests/psbt/test_psbt.py b/tests/psbt/test_psbt.py index 27d377c62..fd39f5e75 100644 --- a/tests/psbt/test_psbt.py +++ b/tests/psbt/test_psbt.py @@ -424,22 +424,22 @@ def test_exceptions() -> None: psbt_str = "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAAAAAA=" psbt = Psbt.b64decode(psbt_str) - psbt.outputs[0].redeem_script = "bad script" # type: ignore + psbt.outputs[0].redeem_script = "bad script" # type: ignore[assignment] with pytest.raises(TypeError): psbt.serialize() psbt = Psbt.b64decode(psbt_str) - psbt.inputs[0].witness_script = "bad script" # type: ignore + psbt.inputs[0].witness_script = "bad script" # type: ignore[assignment] with pytest.raises(TypeError): psbt.serialize() psbt = Psbt.b64decode(psbt_str) - psbt.outputs[0].unknown = {"bad key": b""} # type: ignore + psbt.outputs[0].unknown = {"bad key": b""} # type: ignore[dict-item] with pytest.raises(TypeError): psbt.serialize() psbt = Psbt.b64decode(psbt_str) - psbt.outputs[0].unknown = {b"deadbeef": "bad value"} # type: ignore + psbt.outputs[0].unknown = {b"deadbeef": "bad value"} # type: ignore[dict-item] with pytest.raises(TypeError): psbt.serialize() @@ -449,7 +449,7 @@ def test_exceptions() -> None: psbt.serialize() psbt = Psbt.b64decode(psbt_str) - psbt.inputs[0].final_script_sig = "bad script" # type: ignore + psbt.inputs[0].final_script_sig = "bad script" # type: ignore[assignment] with pytest.raises(TypeError): psbt.serialize() diff --git a/tests/script/test_script.py b/tests/script/test_script.py index 5e4a5e4f0..5e3ec54ab 100644 --- a/tests/script/test_script.py +++ b/tests/script/test_script.py @@ -78,7 +78,7 @@ def test_add_and_eq() -> None: assert Script(script_1) + Script(script_2) == Script(script_1 + script_2) with pytest.raises(TypeError): - _ = Script(script_1) + script_2 # type: ignore + _ = Script(script_1) + script_2 # type: ignore[operator] def test_simple_scripts() -> None: diff --git a/tests/script/test_taproot.py b/tests/script/test_taproot.py index c0b57ea26..0824982f8 100644 --- a/tests/script/test_taproot.py +++ b/tests/script/test_taproot.py @@ -143,6 +143,20 @@ def test_serialize_op_success() -> None: assert parse(b"\x7e\x02\x01") == ["OP_SUCCESS126", b"\x02\x01"] +def test_serialize_bytes_command() -> None: + length = 75 + b = b"\x0A" * length + assert len(serialize([b])) == length + 1 + b = b"\x0A" * (length + 1) + assert len(serialize([b])) == (length + 1) + 2 + + length = 255 + b = b"\x0A" * length + assert len(serialize([b])) == length + 2 + b = b"\x0A" * (length + 1) + assert len(serialize([b])) == (length + 1) + 3 + + def test_invalid_serialization() -> None: with pytest.raises(BTClibValueError): serialize(["AAA"]) diff --git a/tests/test_to_pub_key.py b/tests/test_to_pub_key.py index e62cb6ef1..128a6e2da 100644 --- a/tests/test_to_pub_key.py +++ b/tests/test_to_pub_key.py @@ -118,9 +118,9 @@ def test_from_key() -> None: for invalid_pub_key in [INF, INF_xpub_data, *invalid_pub_keys]: with pytest.raises(BTClibValueError): - point_from_pub_key(invalid_pub_key) # type: ignore + point_from_pub_key(invalid_pub_key) # type: ignore[arg-type] with pytest.raises(BTClibValueError): - pub_keyinfo_from_pub_key(invalid_pub_key) # type: ignore + pub_keyinfo_from_pub_key(invalid_pub_key) # type: ignore[arg-type] for not_a_pub_key in [ INF, @@ -137,9 +137,9 @@ def test_from_key() -> None: *uncompressed_prv_keys, ]: with pytest.raises(BTClibValueError): - point_from_pub_key(not_a_pub_key) # type: ignore + point_from_pub_key(not_a_pub_key) # type: ignore[arg-type] with pytest.raises(BTClibValueError): - pub_keyinfo_from_pub_key(not_a_pub_key) # type: ignore + pub_keyinfo_from_pub_key(not_a_pub_key) # type: ignore[arg-type] for key in [Q, *plain_pub_keys, q, *plain_prv_keys]: assert Q == point_from_key(key) @@ -205,9 +205,9 @@ def test_from_key() -> None: *invalid_prv_keys, ]: with pytest.raises(BTClibValueError): - point_from_key(invalid_key) # type: ignore + point_from_key(invalid_key) # type: ignore[arg-type] with pytest.raises(BTClibValueError): - pub_keyinfo_from_key(invalid_key) # type: ignore + pub_keyinfo_from_key(invalid_key) # type: ignore[arg-type] for not_a_key in [ q0, diff --git a/tests/tx/test_tx.py b/tests/tx/test_tx.py index 6f9a49df8..b2963efbb 100644 --- a/tests/tx/test_tx.py +++ b/tests/tx/test_tx.py @@ -339,7 +339,7 @@ def test_dataclasses_json_dict() -> None: # Tx dataclass to dict tx_dict = tx.to_dict() assert isinstance(tx_dict, dict) - assert tx_dict["vin"][0]["txinwitness"]["stack"] # type: ignore + assert tx_dict["vin"][0]["txinwitness"]["stack"] # type: ignore[index] # Tx dataclass dict to file datadir = path.join(path.dirname(__file__), "_generated_files")