def test_payment_req_wrong_output(client: Client): # Test wrong output in payment request. outputs[0].payment_req_index = 0 outputs[1].payment_req_index = 0 outputs[2].payment_req_index = None payment_req = make_payment_request( client, recipient_name="trezor.io", outputs=outputs[:2], nonce=misc.get_nonce(client), ) # Use a different address in the second output. fake_outputs = [ outputs[0], messages.TxOutputType( address="tb1qnspxpr2xj9s2jt6qlhuvdnxw6q55jvygcf89r2", script_type=outputs[1].script_type, amount=outputs[1].amount, payment_req_index=outputs[1].payment_req_index, ), outputs[2], ] with pytest.raises(TrezorFailure, match="Invalid signature in payment request"): btc.sign_tx( client, "Testnet", inputs, fake_outputs, prev_txes=PREV_TXES, payment_reqs=[payment_req], )
def test_payment_req_wrong_mac_purchase(client: Client): # Test wrong MAC in payment request memo. memo = CoinPurchaseMemo( amount="22.34904 DASH", coin_name="Dash", slip44=5, address_n=parse_path("m/44h/5h/0h/1/0"), ) outputs[0].payment_req_index = 0 outputs[1].payment_req_index = 0 outputs[2].payment_req_index = None payment_req = make_payment_request( client, recipient_name="trezor.io", outputs=outputs[:2], memos=[memo], nonce=misc.get_nonce(client), ) # Corrupt the MAC value. mac = bytearray(payment_req.memos[0].coin_purchase_memo.mac) mac[0] ^= 1 payment_req.memos[0].coin_purchase_memo.mac = mac with pytest.raises(TrezorFailure, match="Invalid address MAC"): btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=[payment_req], )
def test_payment_req_wrong_mac_refund(client: Client): # Test wrong MAC in payment request memo. memo = RefundMemo(parse_path("m/44h/1h/0h/1/0")) outputs[0].payment_req_index = 0 outputs[1].payment_req_index = 0 outputs[2].payment_req_index = None payment_req = make_payment_request( client, recipient_name="trezor.io", outputs=outputs[:2], memos=[memo], nonce=misc.get_nonce(client), ) # Corrupt the MAC value. mac = bytearray(payment_req.memos[0].refund_memo.mac) mac[0] ^= 1 payment_req.memos[0].refund_memo.mac = mac with pytest.raises(TrezorFailure, match="Invalid address MAC"): btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=[payment_req], )
def test_payment_req_wrong_amount(client: Client): # Test wrong total amount in payment request. outputs[0].payment_req_index = 0 outputs[1].payment_req_index = 0 outputs[2].payment_req_index = None payment_req = make_payment_request( client, recipient_name="trezor.io", outputs=outputs[:2], nonce=misc.get_nonce(client), ) # Decrease the total amount of the payment request. payment_req.amount -= 1 with pytest.raises(TrezorFailure, match="Invalid amount in payment request"): btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=[payment_req], )
def test_payment_request_details(client: Client): # Test that payment request details are shown when requested. outputs[0].payment_req_index = 0 outputs[1].payment_req_index = 0 outputs[2].payment_req_index = None nonce = misc.get_nonce(client) payment_reqs = [ make_payment_request( client, recipient_name="trezor.io", outputs=outputs[:2], memos=[TextMemo("Invoice #87654321.")], nonce=nonce, ) ] def input_flow(): yield # request to see details client.debug.wait_layout() client.debug.press_info() yield # confirm first output layout = client.debug.wait_layout() assert outputs[0].address[:16] in layout.text 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 transaction client.debug.press_yes() with client: client.set_input_flow(input_flow) client.watch_layout(True) _, serialized_tx = btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=payment_reqs, ) assert serialized_tx.hex() == SERIALIZED_TX
def test_payment_request(client: Client, payment_request_params): for txo in outputs: txo.payment_req_index = None payment_reqs = [] for i, params in enumerate(payment_request_params): request_outputs = [] for txo_index in params.txo_indices: outputs[txo_index].payment_req_index = i request_outputs.append(outputs[txo_index]) nonce = misc.get_nonce(client) if params.get_nonce else None payment_reqs.append( make_payment_request( client, recipient_name="trezor.io", outputs=request_outputs, change_addresses=[ "tb1qkvwu9g3k2pdxewfqr7syz89r3gj557l3uuf9r9" ], memos=params.memos, nonce=nonce, )) _, serialized_tx = btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=payment_reqs, ) assert serialized_tx.hex() == SERIALIZED_TX # Ensure that the nonce has been invalidated. with pytest.raises(TrezorFailure, match="Invalid nonce in payment request"): btc.sign_tx( client, "Testnet", inputs, outputs, prev_txes=PREV_TXES, payment_reqs=payment_reqs, )