1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-24 15:28:10 +00:00

tests: update device_tests for external definitions

This commit is contained in:
matejcik 2023-03-16 16:36:34 +01:00 committed by matejcik
parent abbe5535ad
commit e2d600389b
8 changed files with 621 additions and 90 deletions

View File

@ -45,24 +45,6 @@
"address": "0xF410e37E9C8BCf8CF319c84Ae9dCEbe057804a04"
}
},
{
"name": "GoChain",
"parameters": {
"path": "m/44'/6060'/0'/0/0"
},
"result": {
"address": "0xA26a450ef46a5f11a510eBA2119A3236fa0Aca92"
}
},
{
"name": "Wanchain",
"parameters": {
"path": "m/44'/5718350'/0'/0/0"
},
"result": {
"address": "0xe432a7533D689ceed00B7EE91d9368b8A1693bD2"
}
},
{
"name": "Ledger Live legacy path",
"parameters": {

View File

@ -5,27 +5,7 @@
},
"tests": [
{
"name": "known_erc20_token",
"parameters": {
"comment": "Sending 200,000,000 ADT tokens to address 0x574bbb36871ba6b78e27f4b4dcfb76ea0091880b",
"data": "a9059cbb000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b000000000000000000000000000000000000000000000000000000000bebc200",
"path": "m/44'/60'/0'/0/0",
"to_address": "0xd0d6d6c5fe4a677d343cc433536bb717bae167dd",
"chain_id": 1,
"nonce": "0x0",
"gas_price": "0x14",
"gas_limit": "0x14",
"tx_type": null,
"value": "0x0"
},
"result": {
"sig_v": 37,
"sig_r": "ec1df922115d256745410fbc2070296756583c8786e4d402a88d4e29ec513fa9",
"sig_s": "7001bfe3ba357e4a9f9e0d3a3f8a8962257615a4cf215db93e48b98999fc51b7"
}
},
{
"name": "unknown_erc20_token",
"name": "erc20_token",
"parameters": {
"comment": "Sending 291 Grzegorz Brzęczyszczykiewicz tokens to address 0x574bbb36871ba6b78e27f4b4dcfb76ea0091880b",
"data": "a9059cbb000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b0000000000000000000000000000000000000000000000000000000000000123",

View File

@ -62,27 +62,7 @@
}
},
{
"name": "known_erc20",
"parameters": {
"comment": "Sending 200,000,000 ADT tokens to address 0x574bbb36871ba6b78e27f4b4dcfb76ea0091880b",
"data": "a9059cbb000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b000000000000000000000000000000000000000000000000000000000bebc200",
"path": "m/44'/60'/0'/0/0",
"to_address": "0xd0d6d6c5fe4a677d343cc433536bb717bae167dd",
"chain_id": 1,
"nonce": "0x0",
"gas_limit": "0x14",
"max_gas_fee": "0x14",
"max_priority_fee": "0x1",
"value": "0x0"
},
"result": {
"sig_v": 1,
"sig_r": "94d67bacb7966f881339d91103f5d738d9c491fff4c01a6513c554ab15e86cc0",
"sig_s": "405bd19a7bf4ae62d41fcb7844e36c786b106b456185c3d0877a7ce7eab6c751"
}
},
{
"name": "unknown_erc20",
"name": "erc20",
"parameters": {
"comment": "Sending 291 Grzegorz Brzęczyszczykiewicz tokens to address 0x574bbb36871ba6b78e27f4b4dcfb76ea0091880b",
"data": "a9059cbb000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b0000000000000000000000000000000000000000000000000000000000000123",

View File

@ -0,0 +1,145 @@
from __future__ import annotations
import io
import typing as t
from hashlib import sha256
from trezorlib import cosi, definitions, messages, protobuf
PRIVATE_KEYS_DEV = [byte * 32 for byte in (b"\xdd", b"\xde", b"\xdf")]
def sign_with_privkeys(digest: bytes, privkeys: t.Sequence[bytes]) -> bytes:
"""Locally produce a CoSi signature."""
pubkeys = [cosi.pubkey_from_privkey(sk) for sk in privkeys]
nonces = [cosi.get_nonce(sk, digest, i) for i, sk in enumerate(privkeys)]
global_pk = cosi.combine_keys(pubkeys)
global_R = cosi.combine_keys(R for _, R in nonces)
sigs = [
cosi.sign_with_privkey(digest, sk, global_pk, r, global_R)
for sk, (r, _) in zip(privkeys, nonces)
]
return cosi.combine_sig(global_R, sigs)
def make_network(
chain_id: int = 0,
slip44: int = 0,
symbol: str = "FAKE",
name: str = "Fake network",
) -> messages.EthereumNetworkInfo:
return messages.EthereumNetworkInfo(
chain_id=chain_id,
slip44=slip44,
symbol=symbol,
name=name,
)
def make_token(
symbol: str = "FAKE",
decimals: int = 18,
address: bytes = b"",
chain_id: int = 0,
name: str = "Fake token",
) -> messages.EthereumTokenInfo:
return messages.EthereumTokenInfo(
symbol=symbol,
decimals=decimals,
address=address,
chain_id=chain_id,
name=name,
)
def make_payload(
data_type: messages.EthereumDefinitionType = messages.EthereumDefinitionType.NETWORK,
timestamp: int = 0xFFFF_FFFF,
message: messages.EthereumNetworkInfo
| messages.EthereumTokenInfo
| bytes = make_network(),
) -> bytes:
if isinstance(message, bytes):
message_bytes = message
else:
writer = io.BytesIO()
protobuf.dump_message(writer, message)
message_bytes = writer.getvalue()
payload = definitions.DefinitionPayload(
magic=b"trzd1",
data_type=data_type,
timestamp=timestamp,
data=message_bytes,
)
return payload.build()
def sign_payload(
payload: bytes,
merkle_neighbors: list[bytes],
threshold: int = 3,
) -> tuple[bytes, bytes]:
digest = sha256(b"\x00" + payload).digest()
merkle_proof = []
for item in merkle_neighbors:
left, right = min(digest, item), max(digest, item)
digest = sha256(b"\x01" + left + right).digest()
merkle_proof.append(digest)
merkle_proof = len(merkle_proof).to_bytes(1, "little") + b"".join(merkle_proof)
signature = sign_with_privkeys(digest, PRIVATE_KEYS_DEV[:threshold])
sigmask = 0
for i in range(threshold):
sigmask |= 1 << i
sigmask_byte = sigmask.to_bytes(1, "little")
return merkle_proof, sigmask_byte + signature
def encode_network(
network: messages.EthereumNetworkInfo | None = None,
chain_id: int = 0,
slip44: int = 0,
symbol: str = "FAKE",
name: str = "Fake network",
) -> bytes:
if network is None:
network = make_network(chain_id, slip44, symbol, name)
payload = make_payload(
data_type=messages.EthereumDefinitionType.NETWORK, message=network
)
proof, signature = sign_payload(payload, [])
return payload + proof + signature
def encode_token(
token: messages.EthereumTokenInfo | None = None,
symbol: str = "FakeTok",
decimals: int = 18,
address: t.AnyStr = b"",
chain_id: int = 0,
name: str = "Fake token",
) -> bytes:
if token is None:
if isinstance(address, str):
if address.startswith("0x"):
address = address[2:]
address = bytes.fromhex(address) # type: ignore (typechecker is lying)
token = make_token(symbol, decimals, address, chain_id, name) # type: ignore (typechecker is lying)
payload = make_payload(
data_type=messages.EthereumDefinitionType.TOKEN, message=token
)
proof, signature = sign_payload(payload, [])
return payload + proof + signature
def make_defs(
network: bytes | None, token: bytes | None
) -> messages.EthereumDefinitions:
return messages.EthereumDefinitions(
encoded_network=network,
encoded_token=token,
)

View File

@ -0,0 +1,231 @@
from __future__ import annotations
from typing import Callable
import pytest
from trezorlib import ethereum
from trezorlib.debuglink import TrezorClientDebugLink as Client
from trezorlib.exceptions import TrezorFailure
from trezorlib.tools import parse_path
from . import common
from .test_sign_typed_data import DATA as TYPED_DATA
pytestmark = [pytest.mark.altcoin, pytest.mark.ethereum]
ERC20_OPERATION = "a9059cbb000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b0000000000000000000000000000000000000000000000000000000000000123"
ERC20_BUILTIN_TOKEN = "0xdac17f958d2ee523a2206206994597c13d831ec7" # USDT
ERC20_FAKE_ADDRESS = "0xdddddddddddddddddddddddddddddddddddddddd"
DEFAULT_TX_PARAMS = {
"nonce": 0x0,
"gas_price": 0x4A817C800,
"gas_limit": 0x5208,
"value": 0x2540BE400,
"to": "0x1d1c328764a41bda0492b66baa30c4a339ff85ef",
"chain_id": 1,
"n": parse_path("m/44h/60h/0h/0/0"),
}
DEFAULT_ERC20_PARAMS = {
"nonce": 0x0,
"gas_price": 0x4A817C800,
"gas_limit": 0x5208,
"value": 0x0,
"chain_id": 1,
"n": parse_path("m/44h/60h/0h/0/0"),
"data": bytes.fromhex(ERC20_OPERATION),
}
def test_builtin(client: Client) -> None:
# Ethereum (SLIP-44 60, chain_id 1) will sign without any definitions provided
ethereum.sign_tx(client, **DEFAULT_TX_PARAMS)
def test_chain_id_allowed(client: Client) -> None:
# Any chain id is allowed as long as the SLIP44 stays the same
params = DEFAULT_TX_PARAMS.copy()
params.update(chain_id=222222)
ethereum.sign_tx(client, **params)
def test_slip44_disallowed(client: Client) -> None:
# SLIP44 is not allowed without a valid network definition
params = DEFAULT_TX_PARAMS.copy()
params.update(n=parse_path("m/44h/66666h/0h/0/0"))
with pytest.raises(TrezorFailure, match="Forbidden key path"):
ethereum.sign_tx(client, **params)
def test_slip44_external(client: Client) -> None:
# to use a non-default SLIP44, a valid network definition must be provided
network = common.encode_network(chain_id=66666, slip44=66666)
params = DEFAULT_TX_PARAMS.copy()
params.update(n=parse_path("m/44h/66666h/0h/0/0"), chain_id=66666)
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, None))
def test_slip44_external_disallowed(client: Client) -> None:
# network definition does not allow a different SLIP44
network = common.encode_network(chain_id=66666, slip44=66666)
params = DEFAULT_TX_PARAMS.copy()
params.update(n=parse_path("m/44h/55555h/0h/0/0"), chain_id=66666)
with pytest.raises(TrezorFailure, match="Forbidden key path"):
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, None))
def test_chain_id_mismatch(client: Client) -> None:
# network definition for a different chain id will be rejected
network = common.encode_network(chain_id=66666, slip44=60)
params = DEFAULT_TX_PARAMS.copy()
params.update(chain_id=55555)
with pytest.raises(TrezorFailure, match="Network definition mismatch"):
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, None))
def test_definition_does_not_override_builtin(client: Client) -> None:
# The builtin definition for Ethereum (SLIP44 60, chain_id 1) will be used
# even if a valid definition with a different SLIP44 is provided
network = common.encode_network(chain_id=1, slip44=66666)
params = DEFAULT_TX_PARAMS.copy()
params.update(n=parse_path("m/44h/66666h/0h/0/0"), chain_id=1)
with pytest.raises(TrezorFailure, match="Forbidden key path"):
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, None))
# TODO: test that the builtin definition will not show different symbol
# TODO: figure out how to test acceptance of a token definition
# all tokens are currently accepted, we would need to check the screenshots
def test_builtin_token(client: Client) -> None:
# The builtin definition for USDT (ERC20) will be used even if not provided
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_BUILTIN_TOKEN)
ethereum.sign_tx(client, **params)
# TODO check that USDT symbol is shown
# TODO: test_builtin_token_not_overriden (builtin definition is used even if a custom one is provided)
def test_external_token(client: Client) -> None:
# A valid token definition must be provided to use a non-builtin token
token = common.encode_token(address=ERC20_FAKE_ADDRESS, chain_id=1, decimals=8)
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_FAKE_ADDRESS)
ethereum.sign_tx(client, **params, definitions=common.make_defs(None, token))
# TODO check that FakeTok symbol is shown
def test_external_chain_without_token(client: Client) -> None:
# when using an external chains, unknown tokens are allowed
network = common.encode_network(chain_id=66666, slip44=60)
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_BUILTIN_TOKEN, chain_id=66666)
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, None))
# TODO check that UNKN token is used, FAKE network
def test_external_chain_token_ok(client: Client) -> None:
# when providing an external chain and matching token, everything works
network = common.encode_network(chain_id=66666, slip44=60)
token = common.encode_token(address=ERC20_FAKE_ADDRESS, chain_id=66666, decimals=8)
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_FAKE_ADDRESS, chain_id=66666)
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, token))
# TODO check that FakeTok is used, FAKE network
def test_external_chain_token_mismatch(client: Client) -> None:
# when providing external defs, we explicitly allow, but not use, tokens
# from other chains
network = common.encode_network(chain_id=66666, slip44=60)
token = common.encode_token(address=ERC20_FAKE_ADDRESS, chain_id=55555, decimals=8)
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_FAKE_ADDRESS, chain_id=66666)
ethereum.sign_tx(client, **params, definitions=common.make_defs(network, token))
# TODO check that UNKN is used for token, FAKE for network
def _call_getaddress(client: Client, slip44: int, network: bytes | None) -> None:
ethereum.get_address(
client,
parse_path(f"m/44h/{slip44}h/0h"),
show_display=False,
encoded_network=network,
)
def _call_signmessage(client: Client, slip44: int, network: bytes | None) -> None:
ethereum.sign_message(
client,
parse_path(f"m/44h/{slip44}h/0h"),
b"hello",
encoded_network=network,
)
def _call_sign_typed_data(client: Client, slip44: int, network: bytes | None) -> None:
ethereum.sign_typed_data(
client,
parse_path(f"m/44h/{slip44}h/0h/0/0"),
TYPED_DATA,
metamask_v4_compat=True,
definitions=common.make_defs(network, None),
)
def _call_sign_typed_data_hash(
client: Client, slip44: int, network: bytes | None
) -> None:
ethereum.sign_typed_data_hash(
client,
parse_path(f"m/44h/{slip44}h/0h/0/0"),
b"\x00" * 32,
b"\xff" * 32,
encoded_network=network,
)
MethodType = Callable[[Client, int, "bytes | None"], None]
METHODS = (
_call_getaddress,
_call_signmessage,
pytest.param(_call_sign_typed_data, marks=pytest.mark.skip_t1),
pytest.param(_call_sign_typed_data_hash, marks=pytest.mark.skip_t2),
)
@pytest.mark.parametrize("method", METHODS)
def test_method_builtin(client: Client, method: MethodType) -> None:
# calling a method with a builtin slip44 will work
method(client, 60, None)
@pytest.mark.parametrize("method", METHODS)
def test_method_def_missing(client: Client, method: MethodType) -> None:
# calling a method with a slip44 that has no definition will fail
with pytest.raises(TrezorFailure, match="Forbidden key path"):
method(client, 66666, None)
@pytest.mark.parametrize("method", METHODS)
def test_method_external(client: Client, method: MethodType) -> None:
# calling a method with a slip44 that has an external definition will work
network = common.encode_network(slip44=66666)
method(client, 66666, network)
@pytest.mark.parametrize("method", METHODS)
def test_method_external_mismatch(client: Client, method: MethodType) -> None:
# calling a method with a slip44 that has an external definition that does not match
# the slip44 will fail
network = common.encode_network(slip44=77777)
with pytest.raises(TrezorFailure, match="Network definition mismatch"):
method(client, 66666, network)

View File

@ -0,0 +1,131 @@
from __future__ import annotations
from hashlib import sha256
import pytest
from trezorlib import ethereum
from trezorlib.debuglink import TrezorClientDebugLink as Client
from trezorlib.exceptions import TrezorFailure
from trezorlib.messages import EthereumDefinitionType
from trezorlib.tools import parse_path
from .common import make_defs, make_network, make_payload, make_token, sign_payload
from .test_definitions import DEFAULT_ERC20_PARAMS, ERC20_FAKE_ADDRESS
pytestmark = [pytest.mark.altcoin, pytest.mark.ethereum]
def fails(client: Client, network: bytes, match: str) -> None:
with pytest.raises(TrezorFailure, match=match):
ethereum.get_address(
client,
parse_path("m/44h/666666h/0h"),
show_display=False,
encoded_network=network,
)
def test_short_message(client: Client) -> None:
fails(client, b"\x00", "Invalid Ethereum definition")
def test_mangled_signature(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [])
bad_signature = signature[:-1] + b"\xff"
fails(client, payload + proof + bad_signature, "Invalid definition signature")
def test_not_enough_signatures(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [], threshold=1)
fails(client, payload + proof + signature, "Invalid definition signature")
def test_missing_signature(client: Client) -> None:
payload = make_payload()
proof, _ = sign_payload(payload, [])
fails(client, payload + proof, "Invalid Ethereum definition")
def test_mangled_payload(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [])
bad_payload = payload[:-1] + b"\xff"
fails(client, bad_payload + proof + signature, "Invalid definition signature")
def test_proof_length_mismatch(client: Client) -> None:
payload = make_payload()
_, signature = sign_payload(payload, [])
bad_proof = b"\x01"
fails(client, payload + bad_proof + signature, "Invalid Ethereum definition")
def test_bad_proof(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [sha256(b"x").digest()])
bad_proof = proof[:-1] + b"\xff"
fails(client, payload + bad_proof + signature, "Invalid definition signature")
def test_trimmed_proof(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [])
bad_proof = proof[:-1]
fails(client, payload + bad_proof + signature, "Invalid Ethereum definition")
def test_bad_prefix(client: Client) -> None:
payload = make_payload()
payload = b"trzd2" + payload[5:]
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature, "Invalid Ethereum definition")
def test_bad_type(client: Client) -> None:
# assuming we expect a network definition
payload = make_payload(data_type=EthereumDefinitionType.TOKEN, message=make_token())
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature, "Definition type mismatch")
def test_outdated(client: Client) -> None:
payload = make_payload(timestamp=0)
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature, "Definition is outdated")
def test_malformed_protobuf(client: Client) -> None:
payload = make_payload(message=b"\x00")
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature, "Invalid Ethereum definition")
def test_protobuf_mismatch(client: Client) -> None:
payload = make_payload(
data_type=EthereumDefinitionType.NETWORK, message=make_token()
)
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature, "Invalid Ethereum definition")
payload = make_payload(
data_type=EthereumDefinitionType.TOKEN, message=make_network()
)
proof, signature = sign_payload(payload, [])
# have to do this manually to invoke a method that eats token definitions
with pytest.raises(TrezorFailure, match="Invalid Ethereum definition"):
params = DEFAULT_ERC20_PARAMS.copy()
params.update(to=ERC20_FAKE_ADDRESS)
ethereum.sign_tx(
client,
**params,
definitions=make_defs(None, payload + proof + signature),
)
def test_trailing_garbage(client: Client) -> None:
payload = make_payload()
proof, signature = sign_payload(payload, [])
fails(client, payload + proof + signature + b"\x00", "Invalid Ethereum definition")

View File

@ -19,9 +19,10 @@ import pytest
from trezorlib import ethereum, exceptions, messages
from trezorlib.debuglink import TrezorClientDebugLink as Client, message_filters
from trezorlib.exceptions import TrezorFailure
from trezorlib.tools import parse_path
from trezorlib.tools import parse_path, unharden
from ...common import parametrize_using_common_fixtures
from .common import encode_network
TO_ADDR = "0x1d1c328764a41bda0492b66baa30c4a339ff85ef"
SHOW_ALL = (143, 167)
@ -30,6 +31,17 @@ GO_BACK = (16, 220)
pytestmark = [pytest.mark.altcoin, pytest.mark.ethereum]
def make_defs(parameters: dict) -> messages.EthereumDefinitions:
# With removal of most built-in defs from firmware, we have test vectors
# that no longer run. Because this is not the place to test the definitions,
# we generate fake entries so that we can check the signing results.
address_n = parse_path(parameters["path"])
slip44 = unharden(address_n[1])
network = encode_network(chain_id=parameters["chain_id"], slip44=slip44)
return messages.EthereumDefinitions(encoded_network=network)
@parametrize_using_common_fixtures(
"ethereum/sign_tx.json",
"ethereum/sign_tx_eip155.json",
@ -47,6 +59,7 @@ def test_signtx(client: Client, parameters, result):
value=int(parameters["value"], 16),
tx_type=parameters["tx_type"],
data=bytes.fromhex(parameters["data"]),
definitions=make_defs(parameters),
)
expected_v = 2 * parameters["chain_id"] + 35
@ -70,6 +83,7 @@ def test_signtx_eip1559(client: Client, parameters, result):
chain_id=parameters["chain_id"],
value=int(parameters["value"], 16),
data=bytes.fromhex(parameters["data"]),
definitions=make_defs(parameters),
)
assert sig_r.hex() == result["sig_r"]

View File

@ -360,10 +360,46 @@
"T1_bitcoin-test_zcash.py::test_spend_old_versions": "d86d753fa98cc9a99fd635bb57e14e0cae500cab6199b0ba1d501fa4eca6a63e",
"T1_bitcoin-test_zcash.py::test_v3_not_supported": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_bitcoin-test_zcash.py::test_version_group_id_missing": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_builtin": "d88cf848ef5ba25c4545f817db565b5a020f47cfd56453c930f62a3b2721cd2f",
"T1_ethereum-test_definitions.py::test_builtin_token": "918bc7c30de63b9778e9a97cd3e84424f85f777216285dc8d624d5d56497a954",
"T1_ethereum-test_definitions.py::test_chain_id_allowed": "cd3c38d2f2b1158846a646a3a589d651b8b81ad05018909b3bd9607e9a272de4",
"T1_ethereum-test_definitions.py::test_chain_id_mismatch": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_definition_does_not_override_builtin": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_external_chain_token_mismatch": "3dbb91414205db65140c6cf9b347c5a17fcc72207da62027ed1781c2142433ac",
"T1_ethereum-test_definitions.py::test_external_chain_token_ok": "98e80bde52f40cefe33b8e16db3f38942035614913362168cb0e946a9ab5c856",
"T1_ethereum-test_definitions.py::test_external_chain_without_token": "3dbb91414205db65140c6cf9b347c5a17fcc72207da62027ed1781c2142433ac",
"T1_ethereum-test_definitions.py::test_external_token": "b224ca172240ccb336fadaff42dbee3985afc865111ac25d2d89ac51f4e7f9fe",
"T1_ethereum-test_definitions.py::test_method_builtin[_call_getaddress]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_builtin[_call_sign_typed_data_hash]": "306b42e936a0c6c48f5ae556fe4d7612c63c45b73dc6a3830f12922b70c50330",
"T1_ethereum-test_definitions.py::test_method_builtin[_call_signmessage]": "59aaee443a05ad617bd7d112e9a8e75379e5464bb4238f9253d6f1e7e4f097dc",
"T1_ethereum-test_definitions.py::test_method_def_missing[_call_getaddress]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_def_missing[_call_sign_typed_data_hash]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_def_missing[_call_signmessage]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_external[_call_getaddress]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_external[_call_sign_typed_data_hash]": "8f7b33550d98bb2abf54271e9a435dd3d8371d4aaf03194a9dad8162ecfcb832",
"T1_ethereum-test_definitions.py::test_method_external[_call_signmessage]": "0b690024cdc6bc88d2eacf70a91287b691ef9ac7d8a9555281a9fa5155397a0a",
"T1_ethereum-test_definitions.py::test_method_external_mismatch[_call_getaddress]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_external_mismatch[_call_sign_typed_data_hash]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_method_external_mismatch[_call_signmessage]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_slip44_disallowed": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions.py::test_slip44_external": "ee68e40f34c86d20860b593d5551d4826cadb3d6c1f26d3c2bd53952595463fe",
"T1_ethereum-test_definitions.py::test_slip44_external_disallowed": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_bad_prefix": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_bad_proof": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_bad_type": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_malformed_protobuf": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_mangled_payload": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_mangled_signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_missing_signature": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_not_enough_signatures": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_outdated": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_proof_length_mismatch": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_protobuf_mismatch": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_short_message": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_trailing_garbage": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_definitions_bad.py::test_trimmed_proof": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_getaddress.py::test_getaddress[ETC]": "efe11a5e9959ba001e33298ec4e00c4f224e325bd41fd713cf01192ac4dfb01a",
"T1_ethereum-test_getaddress.py::test_getaddress[GoChain]": "1382242f4ee598a076b4ce007d63262a420cb38a0871e4679596ff61f2503197",
"T1_ethereum-test_getaddress.py::test_getaddress[Ledger Live legacy path]": "16ccd6cf4421b1002d479f9ca633ac1ee8dca0fa3f1339fa66380d14e5109e2a",
"T1_ethereum-test_getaddress.py::test_getaddress[Wanchain]": "ebaac4910879f20082df6b2755533ecbbd41d60d75bc86f181aa6c740fdba033",
"T1_ethereum-test_getaddress.py::test_getaddress[parameters0-result0]": "a229f91ee8c13470faa74e086d582032072f8f2e3a38cf5e9941bef634abb626",
"T1_ethereum-test_getaddress.py::test_getaddress[parameters1-result1]": "5eaa807f7ac37df989696049a1a5e19751f0c32b7541167e88f56a7aff353f42",
"T1_ethereum-test_getaddress.py::test_getaddress[parameters2-result2]": "d2f4a0194a0dfeb082daec10639c0489ebe30389d7baf1a26dfe20538421592a",
@ -402,36 +438,34 @@
"T1_ethereum-test_signtx.py::test_data_streaming": "058a66e82bb733d5c5c687b5537887022acfd7401bb0b5aa4a12f6f35b209239",
"T1_ethereum-test_signtx.py::test_sanity_checks": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_signtx.py::test_sanity_checks_eip1559": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1_ethereum-test_signtx.py::test_signtx[Auxilium]": "05d5ac917c9d3032fb4658b7f502748b412ffe435fc788c62733e00b948da5f7",
"T1_ethereum-test_signtx.py::test_signtx[Auxilium]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[ETC]": "05b7842c03625104ae3459a55097bc96e878eca465bf69ea2691407868e5dd4b",
"T1_ethereum-test_signtx.py::test_signtx[Ethereum]": "90feef1fdcd162209a948c127df638c09bee0444fee40f2d30dbff21658d83ef",
"T1_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path0]": "37aa64fbab44b89757833df6ee78e302c97fe24c4cb74175f1843f635cb2dbec",
"T1_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path1]": "90feef1fdcd162209a948c127df638c09bee0444fee40f2d30dbff21658d83ef",
"T1_ethereum-test_signtx.py::test_signtx[Palm]": "9d3f44b5d6089919a9e50c3344e5210bdf4a127db33d91b4eeaf93403acb5578",
"T1_ethereum-test_signtx.py::test_signtx[Pirl]": "159bb61626157fa11dbd7775d09b95af8b1269432ed83a649a04e700d944aa02",
"T1_ethereum-test_signtx.py::test_signtx[Palm]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[Pirl]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[Rinkeby]": "937894301354c759d2221ed56286e7df6c6696fa4be3d61846cb3307fd428d21",
"T1_ethereum-test_signtx.py::test_signtx[Ropsten]": "937894301354c759d2221ed56286e7df6c6696fa4be3d61846cb3307fd428d21",
"T1_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b",
"T1_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b",
"T1_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[data_1]": "8b432aba21bc4344814cceaf693e114b9d3e3d6ceb83c3a6af7c3ed0f9b37449",
"T1_ethereum-test_signtx.py::test_signtx[data_2_bigdata]": "445286b7501ca67dd16dafd7ea09c57cc4a37a642ae50f0c812d74353c37c017",
"T1_ethereum-test_signtx.py::test_signtx[known_erc20_token]": "7ef8d3bbf6e299b41522769a893f72b04571fc7176bc93e5c1701a2b5721fb20",
"T1_ethereum-test_signtx.py::test_signtx[max_chain_id]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b",
"T1_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b",
"T1_ethereum-test_signtx.py::test_signtx[erc20_token]": "d797c970429f1e974a69b9f5bd814a4f13f15b1b5d6ab1c117e65b919a434cf9",
"T1_ethereum-test_signtx.py::test_signtx[max_chain_id]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb",
"T1_ethereum-test_signtx.py::test_signtx[max_uint64]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b",
"T1_ethereum-test_signtx.py::test_signtx[newcontract]": "a7efa7f690d1448dc48f642f69688e8b266417901cc014e5930c94c9087b3e08",
"T1_ethereum-test_signtx.py::test_signtx[nodata_1]": "6bd90f2c98122de19159e60fd4dcf9f4b16a600407ac84ea1e447d561ea9decb",
"T1_ethereum-test_signtx.py::test_signtx[nodata_2_bigvalue]": "538f7be885ce6ea3a6dc842ef10797fa45184d7737f6f179c42d36fe92fadd45",
"T1_ethereum-test_signtx.py::test_signtx[unknown_erc20_token]": "df41efe4c5336fc188d3f754d2fe0b830588e57eaa32c98607b0bc4057851fcc",
"T1_ethereum-test_signtx.py::test_signtx[wanchain]": "37aa64fbab44b89757833df6ee78e302c97fe24c4cb74175f1843f635cb2dbec",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[Ledger Live legacy path]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[data_1]": "171ffadf61a2520274bedf6a8543127f23a8948c2689e034f996e170289b1822",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[data_2_bigdata]": "28d2a0d397b4e9865ca8286cc1a3669c3a7d34bb31b430662354bf3ec69d1cc5",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[known_erc20]": "b8e205a40711e377f2185cec6e085fa2f6a4d5bbc6a03d9cf2758058b6c1e17b",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[erc20]": "4b97bba97b14f40c36a793e8a842d5c6fd13c4465b4d3b47b96bab943eb649f3",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[long_fees]": "ef84e6b4ae6ff0b4c9d22a4b6356c8c67affbf28882e83cef4aea6e93b4bdcf5",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[nodata]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515",
"T1_ethereum-test_signtx.py::test_signtx_eip1559[unknown_erc20]": "548c1f22918351e9cbcc1e16d8ba67bc2e7460b9a92cfc6c8bfa0a2b063e68da",
"T1_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "f6c5f398d4e80fc8f93cf70e9b10de24b9a968db04dc6ea21b28d1a273f04ca1",
"T1_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "f6c5f398d4e80fc8f93cf70e9b10de24b9a968db04dc6ea21b28d1a273f04ca1",
"T1_misc-test_cosi.py::test_cosi_nonce": "6990c238036b79368fea1dc1e3e8871d7788322bbee7425d14c53623bc8182e8",
@ -1399,10 +1433,46 @@
"TT_eos-test_signtx.py::test_eos_signtx_updateauth": "e3f408a6dc73c86113f7e0d3edba362ab652c21771624ee43eb9e721582169c3",
"TT_eos-test_signtx.py::test_eos_signtx_vote": "652dc7e1f452c9907a2be4f9c58e0e94e68f694a082e1704b9e9ea303e6dcf06",
"TT_eos-test_signtx.py::test_eos_signtx_vote_proxy": "659a087b4cffcbcb0785685264250fc3a8fae54764a7c16988b4464b27e0c194",
"TT_ethereum-test_definitions.py::test_builtin": "1f1f89bc7682c0eca29eb9239b2a4c4de7c92fa5abd532df5251b7c7184631f8",
"TT_ethereum-test_definitions.py::test_builtin_token": "98f55944842bf2ed265fd68563d27a3564f5b8b9a782b13d9a434ff46ed95aa6",
"TT_ethereum-test_definitions.py::test_chain_id_allowed": "89f7e628525e4ce02391782755677db2807d0fad8d81d6105a9a982ff5cf152c",
"TT_ethereum-test_definitions.py::test_chain_id_mismatch": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_definition_does_not_override_builtin": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_external_chain_token_mismatch": "5fd23f1e3e69ccba8ef168d35c0de5a74d2b7b58805743e81a2f836bd058780d",
"TT_ethereum-test_definitions.py::test_external_chain_token_ok": "31860a9c885d8eef9757fbc5f2eb8c162229a8498c35338088eb410720479358",
"TT_ethereum-test_definitions.py::test_external_chain_without_token": "a08fd3c410590f1a648c979315b6a04157e01cb32c489f2a781f0a08b967f138",
"TT_ethereum-test_definitions.py::test_external_token": "11fb78853572702f09e12513a921196485375e3381a99631ce83bdb274a392a2",
"TT_ethereum-test_definitions.py::test_method_builtin[_call_getaddress]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_builtin[_call_sign_typed_data]": "6e4b23328381f4f251b8811a35bb37b423c66bbb1011046a1696300dc975d0f6",
"TT_ethereum-test_definitions.py::test_method_builtin[_call_signmessage]": "81432428efdd9cd492619471bd86f692dda92db91f606f75a176c5a67600c303",
"TT_ethereum-test_definitions.py::test_method_def_missing[_call_getaddress]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_def_missing[_call_sign_typed_data]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_def_missing[_call_signmessage]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_external[_call_getaddress]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_external[_call_sign_typed_data]": "a1ef5d1f82a996d8acf606f74726e142bde54c178b5a4cdcb76b726cbc28e8dd",
"TT_ethereum-test_definitions.py::test_method_external[_call_signmessage]": "c5228a275933a9bfa0b504ec1278c9d016f8c9cdfa8a6a6ec3fc350109ed5c18",
"TT_ethereum-test_definitions.py::test_method_external_mismatch[_call_getaddress]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_external_mismatch[_call_sign_typed_data]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_method_external_mismatch[_call_signmessage]": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_slip44_disallowed": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions.py::test_slip44_external": "3b55af88fa10d6c71fcba5c918f9ed78afc19242676a8a7cfb56eb3f94824588",
"TT_ethereum-test_definitions.py::test_slip44_external_disallowed": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_bad_prefix": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_bad_proof": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_bad_type": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_malformed_protobuf": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_mangled_payload": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_mangled_signature": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_missing_signature": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_not_enough_signatures": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_outdated": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_proof_length_mismatch": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_protobuf_mismatch": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_short_message": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_trailing_garbage": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_definitions_bad.py::test_trimmed_proof": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_getaddress.py::test_getaddress[ETC]": "6f26e25959f1508929d30929dd67fd4d8085ee0522a51a05345690dacecd3119",
"TT_ethereum-test_getaddress.py::test_getaddress[GoChain]": "843898752798328fa9ba2740a78b6cf4eadde908e20f8354f7e600a18bfffff6",
"TT_ethereum-test_getaddress.py::test_getaddress[Ledger Live legacy path]": "a747e033eb82c9e28b78a6fcd4c93a82f7aa422221fb277e51e7067736cec207",
"TT_ethereum-test_getaddress.py::test_getaddress[Wanchain]": "983e0ffb81b320861cb573ae47b760ff3cb189c26080e9fd3a1b9527e0992f56",
"TT_ethereum-test_getaddress.py::test_getaddress[parameters0-result0]": "a102b225d74a69cb1b10be5fd66254a38fe6f03d1c26a88e2b54a2ee8b84e2f2",
"TT_ethereum-test_getaddress.py::test_getaddress[parameters1-result1]": "3c334d7dc4890df577cfc4922edb42945f6ab1cd4f252ae12f29515209d53b5d",
"TT_ethereum-test_getaddress.py::test_getaddress[parameters2-result2]": "fec876b1cdf434a548b0961bf598f88845ae7086bd4c6bc038f3687e09ae692d",
@ -1443,39 +1513,37 @@
"TT_ethereum-test_signtx.py::test_data_streaming": "37b57deb4bebbb0b2ac938e37aa7a9c33a7dbccdcfcca6b5606e875486b0cdbf",
"TT_ethereum-test_signtx.py::test_sanity_checks": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_signtx.py::test_sanity_checks_eip1559": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_ethereum-test_signtx.py::test_signtx[Auxilium]": "c3f121684c33c095fe4df292fc7f339c972e2c8d9b9b2834872e7d4dad7e1936",
"TT_ethereum-test_signtx.py::test_signtx[Auxilium]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[ETC]": "d2821f3ae03d280ce0236bfaacfcf86347b9ec4db16bc693d42493446275b37c",
"TT_ethereum-test_signtx.py::test_signtx[Ethereum]": "de080fa4ed1460796ae10a6807979da0e3988ef2572f76807843bc3bc80aff98",
"TT_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path0]": "ace16be01942abb698eb6c3979db0a0b9ff717bfa97fdd203bad180a61529d4c",
"TT_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path1]": "de080fa4ed1460796ae10a6807979da0e3988ef2572f76807843bc3bc80aff98",
"TT_ethereum-test_signtx.py::test_signtx[Palm]": "664ffc62a4c83dad85c5112a2291c671f6592f135819e52f27aa75e6fadcd0f2",
"TT_ethereum-test_signtx.py::test_signtx[Pirl]": "8bdd6aebc2874f00a050ef405e13e332e97ab1f09b352de7563c676d064e4ab2",
"TT_ethereum-test_signtx.py::test_signtx[Palm]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[Pirl]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[Rinkeby]": "ab9d8984c582bd3e7e9bb73a8d3c3e0dd78378f6c3ee0583d4380fd39c5608e6",
"TT_ethereum-test_signtx.py::test_signtx[Ropsten]": "ab9d8984c582bd3e7e9bb73a8d3c3e0dd78378f6c3ee0583d4380fd39c5608e6",
"TT_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "4950ca1e7735c200993e57a43894cf5aa083221dfd2631e4c8bb0741f6d0a1f2",
"TT_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "4950ca1e7735c200993e57a43894cf5aa083221dfd2631e4c8bb0741f6d0a1f2",
"TT_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[data_1]": "115334e46d7d5437b059827983bf306c9f896e9c2c4e2bdcc607036161a2484c",
"TT_ethereum-test_signtx.py::test_signtx[data_2_bigdata]": "de82160d53cef7d21cf89aa821d967de71462701ab65e53cc46c76ae329a0b13",
"TT_ethereum-test_signtx.py::test_signtx[known_erc20_token]": "7d7b76994921f556caddaf02227f1d05a5f54b12011ca3e3ac913f28a6da9ee0",
"TT_ethereum-test_signtx.py::test_signtx[max_chain_id]": "4950ca1e7735c200993e57a43894cf5aa083221dfd2631e4c8bb0741f6d0a1f2",
"TT_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "4950ca1e7735c200993e57a43894cf5aa083221dfd2631e4c8bb0741f6d0a1f2",
"TT_ethereum-test_signtx.py::test_signtx[max_uint64]": "4950ca1e7735c200993e57a43894cf5aa083221dfd2631e4c8bb0741f6d0a1f2",
"TT_ethereum-test_signtx.py::test_signtx[erc20_token]": "d8caacabb30216f289f8ded087159a186f08d531b778ee107ddeb70147319779",
"TT_ethereum-test_signtx.py::test_signtx[max_chain_id]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[max_uint64]": "6ee2528a8f2fc02a5cbd626cf22aa45b0d744403a6e2dbe6d2cbe4bb81ad292a",
"TT_ethereum-test_signtx.py::test_signtx[newcontract]": "6fb5c72c8d682b39d04795989a54bc7401ad95a244b4b3c3933b15c7eda60bf8",
"TT_ethereum-test_signtx.py::test_signtx[nodata_1]": "be9fd7dd4e6bc5202052e220feb1b149e09ba9ba3459bbc0039a05f05b8702fb",
"TT_ethereum-test_signtx.py::test_signtx[nodata_2_bigvalue]": "f9af32cc8ad624a7770f47db01f49d3cebe550dd709e36d7d2770e44d728fd5c",
"TT_ethereum-test_signtx.py::test_signtx[unknown_erc20_token]": "d8caacabb30216f289f8ded087159a186f08d531b778ee107ddeb70147319779",
"TT_ethereum-test_signtx.py::test_signtx[wanchain]": "a680c055a31d426d0436f50ff41439c1c197a15bc7fa0dc79b4f1b33e86c0284",
"TT_ethereum-test_signtx.py::test_signtx[wanchain]": "5dc4c88049c0ec4fc7fa068adedd232f47764a3beb8e44e9a6c1aee612e73e1f",
"TT_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_go_back]": "52a7a2ba3c4a8819ce141a4da583908b1a999c3dc10918a43d62d0d6351a0ec8",
"TT_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_scroll_down]": "6d4e91dd6fa6eff311deab71d321680efdae195468fe802f43d6774316808d31",
"TT_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_skip]": "4f39e94891387b7b4bd1e7b704511ba8afeb02aef657807f9a35edda06ea31db",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[Ledger Live legacy path]": "62854c008d12948c388c267ca66c7e25bdc5e245988267e4a1237d643dba21f5",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[data_1]": "f70a7494aec21c14e41a6856ba50ebc3d70dcac4da925882955820619eb85073",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[data_2_bigdata]": "4a2f154fc53f1d0a33e67b522e9ae36cc47c3f4ddb4ed3fd82f7399b2bfd1ed8",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[known_erc20]": "c6c7d787d8601e763bb6226e162250198a696c2134b32a81e4b9e7ded796ee79",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "4796b85a0e684de5ad699055bcb0009ba4b5750e3156b36f9936e48f0111f9df",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[erc20]": "86a2b03fe7f23e93d561e840e02ccbdf302ba6a8c521a8d700d1484b30f5929a",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "01165868bb08fd60b5f9b83a96db0cf8698f45453e7b7f876c8a1c539ec2dea6",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[long_fees]": "7edbff2ecf112e55d91e54392615a27ef4f4d5b159e91a0071d4c3ea2047a852",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[nodata]": "62854c008d12948c388c267ca66c7e25bdc5e245988267e4a1237d643dba21f5",
"TT_ethereum-test_signtx.py::test_signtx_eip1559[unknown_erc20]": "86a2b03fe7f23e93d561e840e02ccbdf302ba6a8c521a8d700d1484b30f5929a",
"TT_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "1168af18805383061d7ef53a7670756f5bc3261254750bd0ac49fc72f3701940",
"TT_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "1168af18805383061d7ef53a7670756f5bc3261254750bd0ac49fc72f3701940",
"TT_misc-test_cosi.py::test_cosi_different_key": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",