mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-16 17:42:02 +00:00
chore(tests): make all the device tests work with UI2
This commit is contained in:
parent
5187be91fe
commit
f48890afb3
@ -1081,8 +1081,8 @@ pub static mp_module_trezorui2: Module = obj_module! {
|
||||
/// def confirm_action(
|
||||
/// *,
|
||||
/// title: str,
|
||||
/// action: str | None = None,
|
||||
/// description: str | None = None,
|
||||
/// action: str | None,
|
||||
/// description: str | None,
|
||||
/// verb: str | None = None,
|
||||
/// verb_cancel: str | None = None,
|
||||
/// hold: bool = False,
|
||||
|
@ -60,8 +60,8 @@ INFO: object
|
||||
def confirm_action(
|
||||
*,
|
||||
title: str,
|
||||
action: str | None = None,
|
||||
description: str | None = None,
|
||||
action: str | None,
|
||||
description: str | None,
|
||||
verb: str | None = None,
|
||||
verb_cancel: str | None = None,
|
||||
hold: bool = False,
|
||||
|
@ -447,6 +447,8 @@ def test_sign_tx_spend(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
|
@ -72,13 +72,16 @@ def test_send_bch_change(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_bc37c2),
|
||||
request_input(0, TXHASH_bc37c2),
|
||||
@ -123,13 +126,16 @@ def test_send_bch_nochange(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_502e85),
|
||||
request_input(0, TXHASH_502e85),
|
||||
@ -180,13 +186,16 @@ def test_send_bch_oldaddr(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_502e85),
|
||||
request_input(0, TXHASH_502e85),
|
||||
@ -249,6 +258,7 @@ def test_attack_change_input(client: Client):
|
||||
return msg
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_filter(messages.TxAck, attack_processor)
|
||||
client.set_expected_responses(
|
||||
[
|
||||
@ -256,7 +266,9 @@ def test_attack_change_input(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_bd32ff),
|
||||
request_input(0, FAKE_TXHASH_bd32ff),
|
||||
@ -323,12 +335,15 @@ def test_send_bch_multisig_wrongchange(client: Client):
|
||||
amount=23_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_062fbd),
|
||||
request_input(0, FAKE_TXHASH_062fbd),
|
||||
@ -390,13 +405,16 @@ def test_send_bch_multisig_change(client: Client):
|
||||
amount=24_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_203416),
|
||||
request_input(0, FAKE_TXHASH_203416),
|
||||
@ -433,8 +451,10 @@ def test_send_bch_multisig_change(client: Client):
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_203416),
|
||||
request_input(0, FAKE_TXHASH_203416),
|
||||
@ -489,12 +509,14 @@ def test_send_bch_external_presigned(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_502e85),
|
||||
|
@ -71,13 +71,16 @@ def test_send_bitcoin_gold_change(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_6f0398),
|
||||
request_input(0, FAKE_TXHASH_6f0398),
|
||||
@ -123,13 +126,16 @@ def test_send_bitcoin_gold_nochange(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_6f0398),
|
||||
request_input(0, FAKE_TXHASH_6f0398),
|
||||
@ -191,6 +197,7 @@ def test_attack_change_input(client: Client):
|
||||
return msg
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_filter(messages.TxAck, attack_processor)
|
||||
client.set_expected_responses(
|
||||
[
|
||||
@ -198,7 +205,9 @@ def test_attack_change_input(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_6f0398),
|
||||
request_input(0, FAKE_TXHASH_6f0398),
|
||||
@ -251,13 +260,16 @@ def test_send_btg_multisig_change(client: Client):
|
||||
amount=1_252_382_934 - 24_000 - 1_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_a63dbe),
|
||||
request_input(0, FAKE_TXHASH_a63dbe),
|
||||
@ -294,8 +306,10 @@ def test_send_btg_multisig_change(client: Client):
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_a63dbe),
|
||||
request_input(0, FAKE_TXHASH_a63dbe),
|
||||
@ -342,14 +356,18 @@ def test_send_p2sh(client: Client):
|
||||
amount=1_252_382_934 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_db7239),
|
||||
request_input(0, FAKE_TXHASH_db7239),
|
||||
@ -393,13 +411,16 @@ def test_send_p2sh_witness_change(client: Client):
|
||||
amount=1_252_382_934 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_db7239),
|
||||
request_input(0, FAKE_TXHASH_db7239),
|
||||
@ -452,12 +473,15 @@ def test_send_multisig_1(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_7f1f6b),
|
||||
request_input(0, FAKE_TXHASH_7f1f6b),
|
||||
@ -479,7 +503,9 @@ def test_send_multisig_1(client: Client):
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_7f1f6b),
|
||||
request_input(0, FAKE_TXHASH_7f1f6b),
|
||||
@ -573,6 +599,7 @@ def test_send_btg_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_6f0398),
|
||||
|
@ -57,12 +57,15 @@ def test_send_dash(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(inp1.prev_hash),
|
||||
request_input(0, inp1.prev_hash),
|
||||
@ -103,13 +106,16 @@ def test_send_dash_dip2_input(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(inp1.prev_hash),
|
||||
request_input(0, inp1.prev_hash),
|
||||
|
@ -72,13 +72,16 @@ def test_send_decred(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.FeeOverThreshold),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_4d8acd),
|
||||
request_input(0, FAKE_TXHASH_4d8acd),
|
||||
@ -133,9 +136,11 @@ def test_purchase_ticket_decred(client: Client):
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_4d8acd),
|
||||
request_input(0, FAKE_TXHASH_4d8acd),
|
||||
@ -191,13 +196,16 @@ def test_spend_from_stake_generation_and_revocation_decred(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_f8e2f2),
|
||||
request_input(0, FAKE_TXHASH_f8e2f2),
|
||||
@ -271,6 +279,7 @@ def test_send_decred_change(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
@ -278,8 +287,10 @@ def test_send_decred_change(client: Client):
|
||||
request_input(2),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_4d8acd),
|
||||
request_input(0, FAKE_TXHASH_4d8acd),
|
||||
@ -376,6 +387,7 @@ def test_decred_multisig_change(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
@ -383,7 +395,9 @@ def test_decred_multisig_change(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_9ac7d2),
|
||||
request_input(0, FAKE_TXHASH_9ac7d2),
|
||||
|
@ -45,7 +45,9 @@ VECTORS = ( # path, script_type, address
|
||||
|
||||
|
||||
@pytest.mark.parametrize("path, script_type, address", VECTORS)
|
||||
def test_show(client: Client, path, script_type, address):
|
||||
def test_show(
|
||||
client: Client, path: str, script_type: messages.InputScriptType, address: str
|
||||
):
|
||||
def input_flow():
|
||||
yield
|
||||
client.debug.press_no()
|
||||
@ -184,7 +186,12 @@ VECTORS_MULTISIG = ( # script_type, bip48_type, address, xpubs, ignore_xpub_mag
|
||||
"script_type, bip48_type, address, xpubs, ignore_xpub_magic", VECTORS_MULTISIG
|
||||
)
|
||||
def test_show_multisig_xpubs(
|
||||
client, script_type, bip48_type, address, xpubs, ignore_xpub_magic
|
||||
client: Client,
|
||||
script_type: messages.InputScriptType,
|
||||
bip48_type: int,
|
||||
address: str,
|
||||
xpubs: list[str],
|
||||
ignore_xpub_magic: bool,
|
||||
):
|
||||
nodes = [
|
||||
btc.get_public_node(
|
||||
@ -205,43 +212,29 @@ def test_show_multisig_xpubs(
|
||||
|
||||
def input_flow():
|
||||
yield # show address
|
||||
lines = client.debug.wait_layout().lines # TODO: do not need to *wait* now?
|
||||
assert lines[0] == "Multisig 2 of 3"
|
||||
assert "".join(lines[1:]) == address
|
||||
layout = client.debug.wait_layout() # TODO: do not need to *wait* now?
|
||||
assert layout.get_title() == "MULTISIG 2 OF 3"
|
||||
assert layout.get_content() == address
|
||||
|
||||
client.debug.press_no()
|
||||
yield # show QR code
|
||||
assert client.debug.wait_layout().text.startswith("Qr")
|
||||
assert "Painter" in client.debug.wait_layout().text
|
||||
|
||||
client.debug.press_no()
|
||||
yield # show XPUB#1
|
||||
lines1 = client.debug.wait_layout().lines
|
||||
assert lines1[0] == "XPUB #1 " + ("(yours)" if i == 0 else "(cosigner)")
|
||||
client.debug.swipe_up()
|
||||
# Three xpub pages with the same testing logic
|
||||
for xpub_num in range(3):
|
||||
expected_title = f"XPUB #{xpub_num + 1} " + (
|
||||
"(yours)" if i == xpub_num else "(cosigner)"
|
||||
)
|
||||
|
||||
lines2 = client.debug.wait_layout().lines
|
||||
assert lines2[0] == "XPUB #1 " + ("(yours)" if i == 0 else "(cosigner)")
|
||||
assert "".join(lines1[1:] + lines2[1:]) == xpubs[0]
|
||||
client.debug.press_no()
|
||||
yield # show XPUB#{xpub_num}
|
||||
layout1 = client.debug.wait_layout()
|
||||
assert layout1.get_title() == expected_title
|
||||
client.debug.swipe_up()
|
||||
|
||||
client.debug.press_no()
|
||||
yield # show XPUB#2
|
||||
lines1 = client.debug.wait_layout().lines
|
||||
assert lines1[0] == "XPUB #2 " + ("(yours)" if i == 1 else "(cosigner)")
|
||||
client.debug.swipe_up()
|
||||
|
||||
lines2 = client.debug.wait_layout().lines
|
||||
assert lines2[0] == "XPUB #2 " + ("(yours)" if i == 1 else "(cosigner)")
|
||||
assert "".join(lines1[1:] + lines2[1:]) == xpubs[1]
|
||||
|
||||
client.debug.press_no()
|
||||
yield # show XPUB#3
|
||||
lines1 = client.debug.wait_layout().lines
|
||||
assert lines1[0] == "XPUB #3 " + ("(yours)" if i == 2 else "(cosigner)")
|
||||
client.debug.swipe_up()
|
||||
|
||||
lines2 = client.debug.wait_layout().lines
|
||||
assert lines2[0] == "XPUB #3 " + ("(yours)" if i == 2 else "(cosigner)")
|
||||
assert "".join(lines1[1:] + lines2[1:]) == xpubs[2]
|
||||
layout2 = client.debug.wait_layout()
|
||||
assert layout2.get_title() == expected_title
|
||||
assert layout1.get_content() + layout2.get_content() == xpubs[xpub_num]
|
||||
|
||||
client.debug.press_yes()
|
||||
|
||||
|
@ -61,13 +61,16 @@ def test_one_one_fee_sapling(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_2807c),
|
||||
request_input(0, TXHASH_2807c),
|
||||
@ -124,15 +127,19 @@ def test_one_one_rewards_claim(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_7b28bd),
|
||||
request_input(0, TXHASH_7b28bd),
|
||||
|
@ -82,11 +82,14 @@ def test_2_of_3(client: Client):
|
||||
)
|
||||
|
||||
# Expected responses are the same for both two signings
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_6b07c1),
|
||||
request_input(0, TXHASH_6b07c1),
|
||||
|
@ -138,7 +138,13 @@ INP3 = messages.TxInputType(
|
||||
)
|
||||
|
||||
|
||||
def _responses(INP1, INP2, change=0):
|
||||
def _responses(
|
||||
client: Client,
|
||||
INP1: messages.TxInputType,
|
||||
INP2: messages.TxInputType,
|
||||
change: int = 0,
|
||||
):
|
||||
tt = client.features.model == "T"
|
||||
resp = [
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
@ -146,11 +152,16 @@ def _responses(INP1, INP2, change=0):
|
||||
]
|
||||
if change != 1:
|
||||
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
|
||||
if tt:
|
||||
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
|
||||
resp.append(request_output(1))
|
||||
if change != 2:
|
||||
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
|
||||
if tt:
|
||||
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
|
||||
resp += [
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(INP1.prev_hash),
|
||||
request_input(0, INP1.prev_hash),
|
||||
@ -191,7 +202,7 @@ def test_external_external(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -222,7 +233,7 @@ def test_external_internal(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2, change=2))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2, change=2))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -253,7 +264,7 @@ def test_internal_external(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2, change=1))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2, change=1))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -284,7 +295,7 @@ def test_multisig_external_external(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -323,7 +334,7 @@ def test_multisig_change_match_first(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2, change=1))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2, change=1))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -362,7 +373,7 @@ def test_multisig_change_match_second(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2, change=2))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2, change=2))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -401,7 +412,7 @@ def test_multisig_mismatch_change(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP2))
|
||||
client.set_expected_responses(_responses(client, INP1, INP2))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
@ -440,7 +451,7 @@ def test_multisig_mismatch_inputs(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
client.set_expected_responses(_responses(INP1, INP3))
|
||||
client.set_expected_responses(_responses(client, INP1, INP3))
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client,
|
||||
"Bitcoin",
|
||||
|
@ -63,14 +63,17 @@ def test_opreturn(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_4075a1),
|
||||
request_input(0, TXHASH_4075a1),
|
||||
|
@ -18,7 +18,12 @@
|
||||
import pytest
|
||||
|
||||
from trezorlib import btc, messages
|
||||
from trezorlib.debuglink import TrezorClientDebugLink as Client, message_filters
|
||||
from trezorlib.debuglink import (
|
||||
LayoutContent,
|
||||
TrezorClientDebugLink as Client,
|
||||
message_filters,
|
||||
multipage_content,
|
||||
)
|
||||
from trezorlib.tools import parse_path
|
||||
|
||||
S = messages.InputScriptType
|
||||
@ -282,39 +287,30 @@ MESSAGE_LENGTHS = (
|
||||
|
||||
@pytest.mark.skip_t1
|
||||
@pytest.mark.parametrize("message", MESSAGE_LENGTHS)
|
||||
def test_signmessage_pagination(client: Client, message):
|
||||
def test_signmessage_pagination(client: Client, message: str):
|
||||
message_read = ""
|
||||
|
||||
def input_flow():
|
||||
# collect screen contents into `message_read`.
|
||||
# Join lines that are separated by a single "-" string, space-separate lines otherwise.
|
||||
# Using a helper debuglink function to assemble the final text.
|
||||
nonlocal message_read
|
||||
layouts: list[LayoutContent] = []
|
||||
|
||||
# confirm address
|
||||
br = yield
|
||||
layout = client.debug.wait_layout()
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
# start assuming there was a word break; this avoids prepending space at start
|
||||
word_break = True
|
||||
br = yield
|
||||
for i in range(br.pages):
|
||||
layout = client.debug.wait_layout()
|
||||
for line in layout.lines[1:]:
|
||||
if line == "-":
|
||||
# next line will be attached without space
|
||||
word_break = True
|
||||
elif word_break:
|
||||
# attach without space, reset word_break
|
||||
message_read += line
|
||||
word_break = False
|
||||
else:
|
||||
# attach with space
|
||||
message_read += " " + line
|
||||
layouts.append(layout)
|
||||
|
||||
if i < br.pages - 1:
|
||||
client.debug.swipe_up()
|
||||
|
||||
message_read = multipage_content(layouts)
|
||||
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
@ -326,7 +322,10 @@ def test_signmessage_pagination(client: Client, message):
|
||||
n=parse_path("m/44h/0h/0h/0/0"),
|
||||
message=message,
|
||||
)
|
||||
assert "Confirm message: " + message.replace("\n", " ") == message_read
|
||||
|
||||
# We cannot differentiate between a newline and space in the message read from Trezor.
|
||||
expected_message = "Confirm message: " + message.replace("\n", " ").rstrip()
|
||||
assert expected_message == message_read
|
||||
|
||||
|
||||
@pytest.mark.skip_t1
|
||||
|
@ -104,12 +104,15 @@ def test_one_one_fee(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_0dac36),
|
||||
request_input(0, TXHASH_0dac36),
|
||||
@ -156,13 +159,16 @@ def test_testnet_one_two_fee(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e5040e),
|
||||
request_input(0, TXHASH_e5040e),
|
||||
@ -205,13 +211,16 @@ def test_testnet_fee_high_warning(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.FeeOverThreshold),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_25fee5),
|
||||
request_input(0, TXHASH_25fee5),
|
||||
@ -256,13 +265,16 @@ def test_one_two_fee(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_50f6f1),
|
||||
request_input(0, TXHASH_50f6f1),
|
||||
@ -316,15 +328,19 @@ def test_one_three_fee(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_bb5169),
|
||||
request_input(0, TXHASH_bb5169),
|
||||
@ -384,6 +400,7 @@ def test_two_two(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
@ -391,7 +408,9 @@ def test_two_two(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_ac4ca0),
|
||||
request_input(0, TXHASH_ac4ca0),
|
||||
@ -527,16 +546,19 @@ def test_lots_of_change(client: Client):
|
||||
request_change_outputs = [request_output(i + 1) for i in range(cnt)]
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
]
|
||||
+ request_change_outputs
|
||||
+ [
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_892d06),
|
||||
request_input(0, TXHASH_892d06),
|
||||
@ -577,13 +599,16 @@ def test_fee_high_warning(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.FeeOverThreshold),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_1f326f),
|
||||
request_input(0, TXHASH_1f326f),
|
||||
@ -636,7 +661,13 @@ def test_fee_high_hardfail(client: Client):
|
||||
|
||||
def input_flow():
|
||||
nonlocal finished
|
||||
for expected in (B.ConfirmOutput, B.FeeOverThreshold, B.SignTx):
|
||||
for expected in (
|
||||
B.ConfirmOutput,
|
||||
B.ConfirmOutput,
|
||||
B.FeeOverThreshold,
|
||||
B.SignTx,
|
||||
B.SignTx,
|
||||
):
|
||||
br = yield
|
||||
assert br.code == expected
|
||||
client.debug.press_yes()
|
||||
@ -673,11 +704,13 @@ def test_not_enough_funds(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.Failure(code=messages.FailureType.NotEnoughFunds),
|
||||
]
|
||||
)
|
||||
@ -702,12 +735,15 @@ def test_p2sh(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_58d56a),
|
||||
request_input(0, TXHASH_58d56a),
|
||||
@ -788,6 +824,7 @@ def test_attack_change_outputs(client: Client):
|
||||
|
||||
# Test if the transaction can be signed normally
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
@ -795,7 +832,9 @@ def test_attack_change_outputs(client: Client):
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_ac4ca0),
|
||||
request_input(0, TXHASH_ac4ca0),
|
||||
@ -954,14 +993,17 @@ def test_attack_change_input_address(client: Client):
|
||||
|
||||
# Now run the attack, must trigger the exception
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_filter(messages.TxAck, attack_processor)
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_d2dcda),
|
||||
request_input(0, TXHASH_d2dcda),
|
||||
@ -1004,12 +1046,15 @@ def test_spend_coinbase(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(FAKE_TXHASH_005f6f),
|
||||
request_input(0, FAKE_TXHASH_005f6f),
|
||||
@ -1061,14 +1106,17 @@ def test_two_changes(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e5040e),
|
||||
request_input(0, TXHASH_e5040e),
|
||||
@ -1119,13 +1167,16 @@ def test_change_on_main_chain_allowed(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e5040e),
|
||||
request_input(0, TXHASH_e5040e),
|
||||
@ -1380,13 +1431,16 @@ def test_lock_time(client: Client, lock_time, sequence):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_0dac36),
|
||||
request_input(0, TXHASH_0dac36),
|
||||
@ -1431,6 +1485,9 @@ def test_lock_time_blockheight(client: Client):
|
||||
yield # confirm output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
yield # confirm output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # confirm locktime
|
||||
layout = client.debug.wait_layout()
|
||||
@ -1440,6 +1497,8 @@ def test_lock_time_blockheight(client: Client):
|
||||
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
client.set_input_flow(input_flow)
|
||||
@ -1480,6 +1539,9 @@ def test_lock_time_datetime(client: Client, lock_time_str):
|
||||
yield # confirm output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
yield # confirm output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # confirm locktime
|
||||
layout = client.debug.wait_layout()
|
||||
@ -1489,6 +1551,8 @@ def test_lock_time_datetime(client: Client, lock_time_str):
|
||||
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
|
||||
lock_time_naive = datetime.strptime(lock_time_str, "%Y-%m-%d %H:%M:%S")
|
||||
lock_time_utc = lock_time_naive.replace(tzinfo=timezone.utc)
|
||||
|
@ -222,10 +222,13 @@ def test_p2wpkh_in_p2sh_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
@ -270,10 +273,13 @@ def test_p2wpkh_in_p2sh_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
@ -399,6 +405,7 @@ def test_p2wsh_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_ec16dc),
|
||||
@ -443,6 +450,7 @@ def test_p2wsh_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_ec16dc),
|
||||
@ -507,6 +515,7 @@ def test_p2tr_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(1),
|
||||
@ -538,6 +547,7 @@ def test_p2tr_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(1),
|
||||
@ -607,8 +617,10 @@ def test_p2wpkh_with_proof(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e5b7e2),
|
||||
@ -697,6 +709,7 @@ def test_p2tr_with_proof(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
|
@ -200,14 +200,22 @@ def test_payment_request_details(client: Client):
|
||||
layout = client.debug.wait_layout()
|
||||
assert outputs[0].address[:16] in layout.text
|
||||
client.debug.press_yes()
|
||||
yield # confirm first output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # confirm second output
|
||||
layout = client.debug.wait_layout()
|
||||
assert outputs[1].address[:16] in layout.text
|
||||
client.debug.press_yes()
|
||||
yield # confirm second output
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
yield # confirm transaction
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
client.set_input_flow(input_flow)
|
||||
|
@ -65,14 +65,18 @@ def test_send_p2sh(client: Client):
|
||||
amount=123_456_789 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
request_input(0, TXHASH_20912f),
|
||||
@ -116,13 +120,16 @@ def test_send_p2sh_change(client: Client):
|
||||
amount=123_456_789 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
request_input(0, TXHASH_20912f),
|
||||
@ -170,12 +177,15 @@ def test_testnet_segwit_big_amount(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(prev_hash),
|
||||
request_input(0, prev_hash),
|
||||
@ -226,11 +236,14 @@ def test_send_multisig_1(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_338e2d),
|
||||
request_input(0, TXHASH_338e2d),
|
||||
@ -292,15 +305,19 @@ def test_attack_change_input_address(client: Client):
|
||||
|
||||
# Test if the transaction can be signed normally.
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
# The user is required to confirm transfer to another account.
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
request_input(0, TXHASH_20912f),
|
||||
@ -369,13 +386,16 @@ def test_attack_mixed_inputs(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.FeeOverThreshold),
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e5040e),
|
||||
request_input(0, TXHASH_e5040e),
|
||||
|
@ -81,14 +81,18 @@ def test_send_p2sh(client: Client):
|
||||
amount=123_456_789 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
request_input(0, TXHASH_20912f),
|
||||
@ -134,13 +138,16 @@ def test_send_p2sh_change(client: Client):
|
||||
amount=123_456_789 - 11_000 - 12_300_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_20912f),
|
||||
request_input(0, TXHASH_20912f),
|
||||
@ -186,14 +193,18 @@ def test_send_native(client: Client):
|
||||
amount=100_000 - 40_000 - 10_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_b36780),
|
||||
request_input(0, TXHASH_b36780),
|
||||
@ -271,13 +282,16 @@ def test_send_native_change(client: Client):
|
||||
amount=100_000 - 40_000 - 10_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_fcb3f5),
|
||||
request_input(0, TXHASH_fcb3f5),
|
||||
@ -337,17 +351,22 @@ def test_send_both(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_65047a),
|
||||
request_input(0, TXHASH_65047a),
|
||||
@ -417,11 +436,14 @@ def test_send_multisig_1(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_b9abfa),
|
||||
request_input(0, TXHASH_b9abfa),
|
||||
@ -493,11 +515,14 @@ def test_send_multisig_2(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_b9abfa),
|
||||
request_input(0, TXHASH_b9abfa),
|
||||
@ -576,10 +601,12 @@ def test_send_multisig_3_change(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOP2SHWITNESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_b9abfa),
|
||||
request_input(0, TXHASH_b9abfa),
|
||||
@ -659,10 +686,12 @@ def test_send_multisig_4_change(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOWITNESS,
|
||||
)
|
||||
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_b9abfa),
|
||||
request_input(0, TXHASH_b9abfa),
|
||||
@ -757,16 +786,20 @@ def test_multisig_mismatch_inputs_single(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
# Ensure that the multisig output is not identified as a change output.
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_1c022d),
|
||||
request_input(0, TXHASH_1c022d),
|
||||
|
@ -78,12 +78,15 @@ def test_send_p2tr(client: Client):
|
||||
script_type=messages.OutputScriptType.PAYTOADDRESS,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_input(0),
|
||||
@ -131,14 +134,17 @@ def test_send_two_with_change(client: Client):
|
||||
amount=6_800 + 13_000 - 200 - 15_000,
|
||||
)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
@ -219,6 +225,7 @@ def test_send_mixed(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
# process inputs
|
||||
@ -229,15 +236,20 @@ def test_send_mixed(client: Client):
|
||||
# approve outputs
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(2),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(3),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
request_output(4),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
# verify inputs
|
||||
request_input(0),
|
||||
request_meta(TXHASH_8c3ea7),
|
||||
@ -346,6 +358,7 @@ def test_attack_script_type(client: Client):
|
||||
return msg
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_filter(messages.TxAck, attack_processor)
|
||||
client.set_expected_responses(
|
||||
[
|
||||
@ -353,7 +366,9 @@ def test_attack_script_type(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
@ -381,7 +396,7 @@ def test_attack_script_type(client: Client):
|
||||
"tb1pllllllllllllllllllllllllllllllllllllllllllllallllscqgl4zhn",
|
||||
),
|
||||
)
|
||||
def test_send_invalid_address(client: Client, address):
|
||||
def test_send_invalid_address(client: Client, address: str):
|
||||
inp1 = messages.TxInputType(
|
||||
# tb1pn2d0yjeedavnkd8z8lhm566p0f2utm3lgvxrsdehnl94y34txmts5s7t4c
|
||||
address_n=parse_path("m/86h/1h/0h/1/0"),
|
||||
|
@ -106,12 +106,15 @@ def test_one_one_fee_sapling(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e38206),
|
||||
request_input(0, TXHASH_e38206),
|
||||
@ -264,6 +267,7 @@ def test_external_presigned(client: Client):
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_e38206),
|
||||
|
@ -126,11 +126,15 @@ def test_data_streaming(client: Client):
|
||||
checked in vectorized function above.
|
||||
"""
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.Other)),
|
||||
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
|
||||
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
|
||||
message_filters.EthereumTxRequest(
|
||||
data_length=1_024,
|
||||
signature_r=None,
|
||||
@ -325,7 +329,9 @@ def test_sanity_checks_eip1559(client: Client):
|
||||
)
|
||||
|
||||
|
||||
def input_flow_skip(client: Client, cancel=False):
|
||||
def input_flow_skip(client: Client, cancel: bool = False):
|
||||
pytest.skip("Skip not supported")
|
||||
|
||||
yield # confirm sending
|
||||
client.debug.press_yes()
|
||||
|
||||
@ -338,14 +344,13 @@ def input_flow_skip(client: Client, cancel=False):
|
||||
client.debug.press_yes()
|
||||
|
||||
|
||||
def input_flow_scroll_down(client: Client, cancel=False):
|
||||
def input_flow_scroll_down(client: Client, cancel: bool = False):
|
||||
yield # confirm sending
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # confirm data
|
||||
yield
|
||||
client.debug.wait_layout()
|
||||
client.debug.click(SHOW_ALL)
|
||||
client.debug.press_yes()
|
||||
|
||||
br = yield # paginated data
|
||||
for i in range(br.pages):
|
||||
@ -354,16 +359,20 @@ def input_flow_scroll_down(client: Client, cancel=False):
|
||||
client.debug.swipe_up()
|
||||
|
||||
client.debug.press_yes()
|
||||
yield # confirm data
|
||||
yield # confirm fee
|
||||
if cancel:
|
||||
client.debug.press_no()
|
||||
else:
|
||||
client.debug.press_yes()
|
||||
yield # maximum fee
|
||||
client.debug.press_yes()
|
||||
yield # hold to confirm
|
||||
client.debug.press_yes()
|
||||
|
||||
|
||||
def input_flow_go_back(client: Client, cancel=False):
|
||||
def input_flow_go_back(client: Client, cancel: bool = False):
|
||||
pytest.skip("Go back not supported")
|
||||
|
||||
br = yield # confirm sending
|
||||
client.debug.wait_layout()
|
||||
client.debug.press_yes()
|
||||
|
@ -31,6 +31,7 @@ pytestmark = [
|
||||
|
||||
# assertion data from T1
|
||||
def test_nem_signtx_simple(client: Client):
|
||||
tt = client.features.model == "T"
|
||||
with client:
|
||||
client.set_expected_responses(
|
||||
[
|
||||
@ -38,6 +39,12 @@ def test_nem_signtx_simple(client: Client):
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
|
||||
# Unencrypted message
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
|
||||
(
|
||||
tt,
|
||||
messages.ButtonRequest(
|
||||
code=messages.ButtonRequestType.ConfirmOutput
|
||||
),
|
||||
),
|
||||
# Confirm recipient
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
messages.NEMSignedTx,
|
||||
@ -75,12 +82,19 @@ def test_nem_signtx_simple(client: Client):
|
||||
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
|
||||
def test_nem_signtx_encrypted_payload(client: Client):
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
# Confirm transfer and network fee
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
|
||||
# Ask for encryption
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
|
||||
(
|
||||
tt,
|
||||
messages.ButtonRequest(
|
||||
code=messages.ButtonRequestType.ConfirmOutput
|
||||
),
|
||||
),
|
||||
# Confirm recipient
|
||||
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
|
||||
messages.NEMSignedTx,
|
||||
|
@ -47,20 +47,19 @@ def do_recover_legacy(client: Client, mnemonic, **kwargs):
|
||||
|
||||
|
||||
def do_recover_core(client: Client, mnemonic, **kwargs):
|
||||
layout = client.debug.wait_layout
|
||||
|
||||
def input_flow():
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "check the recovery seed" in layout.text.replace("\n", " ")
|
||||
assert "check the recovery seed" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "Select number of words" in layout.text
|
||||
assert "Select number of words" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert layout.text == "WordSelector"
|
||||
assert "SelectWordCount" in layout().text
|
||||
# click the number
|
||||
word_option_offset = 6
|
||||
word_options = (12, 18, 20, 24, 33)
|
||||
@ -68,8 +67,7 @@ def do_recover_core(client: Client, mnemonic, **kwargs):
|
||||
client.debug.click(buttons.grid34(index % 3, index // 3))
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "Enter recovery seed" in layout.text
|
||||
assert "Enter recovery seed" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
@ -116,49 +114,43 @@ def test_invalid_seed_t1(client: Client):
|
||||
|
||||
@pytest.mark.skip_t1
|
||||
def test_invalid_seed_core(client: Client):
|
||||
layout = client.debug.wait_layout
|
||||
|
||||
def input_flow():
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "check the recovery seed" in layout.text.replace("\n", " ")
|
||||
assert "check the recovery seed" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "Select number of words" in layout.text
|
||||
assert "Select number of words" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert layout.text == "WordSelector"
|
||||
assert "SelectWordCount" in layout().text
|
||||
# select 12 words
|
||||
client.debug.click(buttons.grid34(0, 2))
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "Enter recovery seed" in layout.text
|
||||
assert "Enter recovery seed" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
for _ in range(12):
|
||||
layout = client.debug.wait_layout()
|
||||
assert layout.text == "Bip39Keyboard"
|
||||
assert layout().text == "< MnemonicKeyboard >"
|
||||
client.debug.input("stick")
|
||||
|
||||
br = yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert br.code == messages.ButtonRequestType.Warning
|
||||
assert "invalid recovery seed" in layout.text
|
||||
assert "invalid recovery seed" in layout().get_content()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
yield
|
||||
# retry screen
|
||||
layout = client.debug.wait_layout()
|
||||
assert "Select number of words" in layout.text
|
||||
assert "Select number of words" in layout().get_content()
|
||||
client.debug.click(buttons.CANCEL)
|
||||
|
||||
yield
|
||||
layout = client.debug.wait_layout()
|
||||
assert "abort" in layout.text
|
||||
assert "ABORT SEED CHECK" == layout().get_title()
|
||||
client.debug.click(buttons.OK)
|
||||
|
||||
with client:
|
||||
|
@ -31,36 +31,36 @@ def test_tt_pin_passphrase(client: Client):
|
||||
|
||||
def input_flow():
|
||||
yield
|
||||
assert "Do you really want to recover a wallet?" in layout().text
|
||||
assert "Do you really want to recover a wallet?" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
assert layout().text == "PinDialog"
|
||||
assert layout().text == "< PinKeyboard >"
|
||||
client.debug.input("654")
|
||||
|
||||
yield
|
||||
assert layout().text == "PinDialog"
|
||||
assert layout().text == "< PinKeyboard >"
|
||||
client.debug.input("654")
|
||||
|
||||
yield
|
||||
assert "Select number of words" in layout().text
|
||||
assert "Select number of words" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
assert "WordSelector" in layout().text
|
||||
assert "SelectWordCount" in layout().text
|
||||
client.debug.input(str(len(mnemonic)))
|
||||
|
||||
yield
|
||||
assert "Enter recovery seed" in layout().text
|
||||
assert "Enter recovery seed" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
for word in mnemonic:
|
||||
assert layout().text == "Bip39Keyboard"
|
||||
assert layout().text == "< MnemonicKeyboard >"
|
||||
client.debug.input(word)
|
||||
|
||||
yield
|
||||
assert "You have successfully recovered your wallet." in layout().text
|
||||
assert "You have successfully recovered your wallet." in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
@ -85,28 +85,28 @@ def test_tt_nopin_nopassphrase(client: Client):
|
||||
|
||||
def input_flow():
|
||||
yield
|
||||
assert "Do you really want to recover a wallet?" in layout().text
|
||||
assert "Do you really want to recover a wallet?" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
assert "Select number of words" in layout().text
|
||||
assert "Select number of words" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
assert "WordSelector" in layout().text
|
||||
assert "SelectWordCount" in layout().text
|
||||
client.debug.input(str(len(mnemonic)))
|
||||
|
||||
yield
|
||||
assert "Enter recovery seed" in layout().text
|
||||
assert "Enter recovery seed" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield
|
||||
for word in mnemonic:
|
||||
assert layout().text == "Bip39Keyboard"
|
||||
assert layout().text == "< MnemonicKeyboard >"
|
||||
client.debug.input(word)
|
||||
|
||||
yield
|
||||
assert "You have successfully recovered your wallet." in layout().text
|
||||
assert "You have successfully recovered your wallet." in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
|
@ -354,6 +354,7 @@ def test_signtx(client: Client):
|
||||
|
||||
_assert_protection(client)
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.use_pin_sequence([PIN4])
|
||||
client.set_expected_responses(
|
||||
[
|
||||
@ -362,7 +363,9 @@ def test_signtx(client: Client):
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_meta(TXHASH_50f6f1),
|
||||
request_input(0, TXHASH_50f6f1),
|
||||
|
@ -49,21 +49,23 @@ def test_sd_no_format(client: Client):
|
||||
@pytest.mark.sd_card
|
||||
@pytest.mark.setup_client(pin="1234")
|
||||
def test_sd_protect_unlock(client: Client):
|
||||
layout = client.debug.wait_layout
|
||||
|
||||
def input_flow_enable_sd_protect():
|
||||
yield # Enter PIN to unlock device
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # do you really want to enable SD protection
|
||||
assert "SD card protection" in client.debug.wait_layout().text
|
||||
assert "SD card protection" in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # enter current PIN
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # you have successfully enabled SD protection
|
||||
assert "Success" in client.debug.wait_layout().text
|
||||
assert "You have successfully enabled SD protection." in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
@ -73,23 +75,23 @@ def test_sd_protect_unlock(client: Client):
|
||||
|
||||
def input_flow_change_pin():
|
||||
yield # do you really want to change PIN?
|
||||
assert "Change PIN" in client.debug.wait_layout().text
|
||||
assert "CHANGE PIN" == layout().get_title()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # enter current PIN
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # enter new PIN
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # enter new PIN again
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # Pin change successful
|
||||
assert "Success" in client.debug.wait_layout().text
|
||||
assert "You have successfully changed your PIN." in layout().get_content()
|
||||
client.debug.press_yes()
|
||||
|
||||
with client:
|
||||
@ -101,15 +103,15 @@ def test_sd_protect_unlock(client: Client):
|
||||
|
||||
def input_flow_change_pin_format():
|
||||
yield # do you really want to change PIN?
|
||||
assert "Change PIN" in client.debug.wait_layout().text
|
||||
assert "CHANGE PIN" == layout().get_title()
|
||||
client.debug.press_yes()
|
||||
|
||||
yield # enter current PIN
|
||||
assert "PinDialog" == client.debug.wait_layout().text
|
||||
assert "< PinKeyboard >" == layout().text
|
||||
client.debug.input("1234")
|
||||
|
||||
yield # SD card problem
|
||||
assert "Wrong SD card" in client.debug.wait_layout().text
|
||||
assert "Wrong SD card" in layout().get_content()
|
||||
client.debug.press_no() # close
|
||||
|
||||
with client, pytest.raises(TrezorFailure) as e:
|
||||
|
@ -95,12 +95,15 @@ def test_spend_v4_input(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_finished(),
|
||||
@ -142,12 +145,15 @@ def test_send_to_multisig(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_finished(),
|
||||
@ -188,12 +194,15 @@ def test_spend_v5_input(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_finished(),
|
||||
@ -240,13 +249,16 @@ def test_one_two(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
@ -297,13 +309,16 @@ def test_unified_address(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
request_output(1),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_output(1),
|
||||
@ -360,12 +375,14 @@ def test_external_presigned(client: Client):
|
||||
)
|
||||
|
||||
with client:
|
||||
tt = client.features.model == "T"
|
||||
client.set_expected_responses(
|
||||
[
|
||||
request_input(0),
|
||||
request_input(1),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
request_input(1),
|
||||
request_input(0),
|
||||
@ -471,11 +488,14 @@ def test_spend_multisig(client: Client):
|
||||
)
|
||||
|
||||
# Expected responses are the same for both two signings
|
||||
tt = client.features.model == "T"
|
||||
expected_responses = [
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
messages.ButtonRequest(code=B.ConfirmOutput),
|
||||
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
|
||||
messages.ButtonRequest(code=B.SignTx),
|
||||
(tt, messages.ButtonRequest(code=B.SignTx)),
|
||||
request_input(0),
|
||||
request_output(0),
|
||||
request_finished(),
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user