feat(core): SLIP-24 payment requests for Cardano
What changed, and why it matters
This commit adds a new feature to Trezor hardware wallets: SLIP-24 payment requests for Cardano transactions. It lets a merchant or service provider attach a signed payment request to a Cardano transaction, which the device then displays to the user for confirmation. The change is a feature addition, not a documented security fix. It includes a restriction that payment requests can only be used with single-output transactions, and it reuses an existing payment-request verification framework already present in the firmware.
Review the integration of `PaymentRequestVerifier` with Cardano outputs to ensure the verifier's assumptions (e.g., output ordering, change detection, amount matching) hold for Cardano's transaction structure. Confirm that the single-output restriction is sufficient and cannot be bypassed through output chunking or nested change outputs. Validate that the UI correctly distinguishes payment-request transactions from normal ones to prevent user confusion.
Security signals we found
New protobuf field marked experimental: `payment_req` in `CardanoSignTxInit`
Payment request verification delegated to existing `apps.common.payment_request.PaymentRequestVerifier`
Guard added: multiple outputs rejected when a payment request is present
User confirmation flow added via `require_confirm_payment_request`
SLIP-21 keychain passed into Cardano signer for payment-request signature verification
No changelog entry; commit is labeled as a feature
Evidence from the diff
The commit extends Cardano transaction signing to accept an optional PaymentRequest message in CardanoSignTxInit. The firmware validates the payment request against the transaction outputs using PaymentRequestVerifier, and shows the request details on screen via require_confirm_payment_request. A guard rejects transactions where payment_req is set and outputs_count > 1. The feature is marked experimental in the protobuf definition ([(experimental_field)=true]). Tests and UI fixtures are added for both successful and failure cases.
Changed components
core/src/apps/cardano/sign_tx/signer.pycore/src/apps/cardano/sign_tx/ordinary_signer.pycore/src/apps/cardano/sign_tx/__init__.pycore/src/apps/cardano/layout.pycommon/protob/messages-cardano.protocore/src/trezor/messages.pypython/src/trezorlib/cardano.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_cardano.rsInspect captured patch +458 / −109
diff --git a/common/protob/messages-cardano.proto b/common/protob/messages-cardano.proto
index 857a8f95..0f93004c 100644
--- a/common/protob/messages-cardano.proto
+++ b/common/protob/messages-cardano.proto
@@ -6,6 +6,7 @@ option java_package = "com.satoshilabs.trezor.lib.protobuf";
option java_outer_classname = "TrezorMessageCardano";
import "messages-common.proto";
+import "options.proto";
enum CardanoDerivationType {
LEDGER = 0;
@@ -237,6 +238,7 @@ message CardanoSignTxInit {
optional uint32 reference_inputs_count = 21 [default=0];
optional bool chunkify = 22; // display the address in chunks of 4 characters
optional bool tag_cbor_sets = 23 [default=false]; // use tag 258 for sets in cbor
+ optional common.PaymentRequest payment_req = 24 [(experimental_field)=true]; // SLIP-24 payment request
}
/**
diff --git a/common/tests/fixtures/cardano/sign_tx.slip24.failed.json b/common/tests/fixtures/cardano/sign_tx.slip24.failed.json
new file mode 100644
index 00000000..d40d6f42
--- /dev/null
+++ b/common/tests/fixtures/cardano/sign_tx.slip24.failed.json
@@ -0,0 +1,53 @@
+{
+ "setup": {
+ "mnemonic": "all all all all all all all all all all all all",
+ "passphrase": ""
+ },
+ "tests": [
+ {
+ "description": "Swap - multiple outputs",
+ "parameters": {
+ "protocol_magic": 764824073,
+ "network_id": 1,
+ "fee": 42,
+ "ttl": 10,
+ "validity_interval_start": null,
+ "certificates": [],
+ "withdrawals": [],
+ "auxiliary_data": null,
+ "inputs": [
+ {
+ "path": "m/44'/1815'/0'/0/1",
+ "prev_hash": "1af8fa0b754ff99253d983894e63a2b09cbb56c833ba18c3384210163f63dcfc",
+ "prev_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "address": "Ae2tdPwUPEZCanmBz5g2GEwFqKTKpNJcGYPKfDxoNeKZ8bRHr8366kseiK2",
+ "amount": "3003112"
+ },
+ {
+ "address": "2657WMsDfac7BteXkJq5Jzdog4h47fPbkwUM49isuWbYAr2cFRHa3rURP236h9PBe",
+ "amount": "1001234"
+ }
+ ],
+ "mint": [],
+ "script_data_hash": null,
+ "collateral_inputs": [],
+ "required_signers": [],
+ "collateral_return": null,
+ "total_collateral": null,
+ "reference_inputs": [],
+ "signing_mode": "ORDINARY_TRANSACTION",
+ "additional_witness_requests": [],
+ "include_network_id": false,
+ "tag_cbor_sets": false,
+ "payment_req": true
+ },
+ "result": {
+ "error_message": "Multiple outputs not supported for payment requests"
+ }
+ }
+ ]
+}
diff --git a/common/tests/fixtures/cardano/sign_tx.slip24.json b/common/tests/fixtures/cardano/sign_tx.slip24.json
new file mode 100644
index 00000000..72c5df15
--- /dev/null
+++ b/common/tests/fixtures/cardano/sign_tx.slip24.json
@@ -0,0 +1,57 @@
+{
+ "setup": {
+ "mnemonic": "all all all all all all all all all all all all",
+ "passphrase": ""
+ },
+ "tests": [
+ {
+ "description": "Swap",
+ "parameters": {
+ "protocol_magic": 764824073,
+ "network_id": 1,
+ "fee": 42,
+ "ttl": 10,
+ "validity_interval_start": null,
+ "certificates": [],
+ "withdrawals": [],
+ "auxiliary_data": null,
+ "inputs": [
+ {
+ "path": "m/44'/1815'/0'/0/1",
+ "prev_hash": "1af8fa0b754ff99253d983894e63a2b09cbb56c833ba18c3384210163f63dcfc",
+ "prev_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "address": "Ae2tdPwUPEZCanmBz5g2GEwFqKTKpNJcGYPKfDxoNeKZ8bRHr8366kseiK2",
+ "amount": "3003112"
+ }
+ ],
+ "mint": [],
+ "script_data_hash": null,
+ "collateral_inputs": [],
+ "required_signers": [],
+ "collateral_return": null,
+ "total_collateral": null,
+ "reference_inputs": [],
+ "signing_mode": "ORDINARY_TRANSACTION",
+ "additional_witness_requests": [],
+ "include_network_id": false,
+ "tag_cbor_sets": false,
+ "payment_req": true
+ },
+ "result": {
+ "tx_hash": "73e09bdebf98a9e0f17f86a2d11e0f14f4f8dae77cdf26ff1678e821f20c8db6",
+ "witnesses": [
+ {
+ "type": 0,
+ "pub_key": "89053545a6c254b0d9b1464e48d2b5fcf91d4e25c128afb1fcfc61d0843338ea",
+ "signature": "da07ac5246e3f20ebd1276476a4ae34a019dd4b264ffc22eea3c28cb0f1a6bb1c7764adeecf56bcb0bc6196fd1dbe080f3a7ef5b49f56980fe5b2881a4fdfa00",
+ "chain_code": "26308151516f3b0e02bb1638142747863c520273ce9bd3e5cd91e1d46fe2a635"
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/core/src/apps/cardano/layout.py b/core/src/apps/cardano/layout.py
index ab0adb6d..14a4a1a8 100644
--- a/core/src/apps/cardano/layout.py
+++ b/core/src/apps/cardano/layout.py
@@ -1,6 +1,6 @@
from typing import TYPE_CHECKING
-from trezor import TR
+from trezor import TR, wire
from trezor.enums import (
ButtonRequestType,
CardanoAddressType,
@@ -28,8 +28,11 @@ if TYPE_CHECKING:
from trezor import messages
from trezor.enums import CardanoNativeScriptHashDisplayFormat
+ from trezor.messages import PaymentRequest
from trezor.ui.layouts import PropertyType
+ from apps.common.paths import Bip32Path
+
from .helpers.credential import Credential
from .seed import Keychain
@@ -1117,3 +1120,59 @@ async def show_cardano_address(
network=network_name,
chunkify=chunkify,
)
+
+
+async def require_confirm_payment_request(
+ provider_address: str,
+ verified_payment_request: PaymentRequest,
+ address_n: Bip32Path | None,
+ network_id: int,
+) -> None:
+ from trezor.ui.layouts import confirm_payment_request
+
+ assert verified_payment_request.amount is not None # required for non-CoinJoin
+ total_amount = format_coin_amount(verified_payment_request.amount, network_id)
+
+ texts: list[tuple[str | None, str]] = []
+ refunds: list[tuple[str, str | None, str | None]] = []
+ trades: list[tuple[str, str, str, str | None, str | None]] = []
+ for memo in verified_payment_request.memos:
+ if memo.text_memo is not None:
+ texts.append((None, memo.text_memo.text))
+ elif memo.text_details_memo is not None:
+ texts.append((memo.text_details_memo.title, memo.text_details_memo.text))
+ elif memo.refund_memo:
+ refund_account_path = address_n_to_str(memo.refund_memo.address_n)
+ refunds.append((memo.refund_memo.address, None, refund_account_path))
+ elif memo.coin_purchase_memo:
+ coin_purchase_account_path = address_n_to_str(
+ memo.coin_purchase_memo.address_n
+ )
+ trades.append(
+ (
+ f"-\u00A0{total_amount}",
+ f"+\u00A0{memo.coin_purchase_memo.amount}",
+ memo.coin_purchase_memo.address,
+ None,
+ coin_purchase_account_path,
+ )
+ )
+ else:
+ raise wire.DataError("Unrecognized memo type in payment request memo.")
+
+ account_path = address_n_to_str(address_n) if address_n else None
+ account_items = []
+ if account_path:
+ account_items.append((TR.address_details__derivation_path, account_path))
+
+ await confirm_payment_request(
+ verified_payment_request.recipient_name,
+ provider_address,
+ texts,
+ refunds,
+ trades,
+ account_items,
+ None,
+ None,
+ None,
+ )
diff --git a/core/src/apps/cardano/sign_tx/__init__.py b/core/src/apps/cardano/sign_tx/__init__.py
index 26b53b6a..26fc641a 100644
--- a/core/src/apps/cardano/sign_tx/__init__.py
+++ b/core/src/apps/cardano/sign_tx/__init__.py
@@ -43,7 +43,7 @@ async def sign_tx(
else:
raise RuntimeError # should be unreachable
- signer = signer_type(msg, keychain)
+ signer = signer_type(msg, keychain, slip21_keychain)
try:
await signer.sign()
diff --git a/core/src/apps/cardano/sign_tx/ordinary_signer.py b/core/src/apps/cardano/sign_tx/ordinary_signer.py
index 5abe51a7..0871c1ff 100644
--- a/core/src/apps/cardano/sign_tx/ordinary_signer.py
+++ b/core/src/apps/cardano/sign_tx/ordinary_signer.py
@@ -10,6 +10,8 @@ from .signer import Signer, SuiteTxType
if TYPE_CHECKING:
from trezor import messages
+ from apps.common.keychain import Keychain as Slip21Keychain
+
class OrdinarySigner(Signer):
"""
@@ -23,8 +25,9 @@ class OrdinarySigner(Signer):
self,
msg: messages.CardanoSignTxInit,
keychain: seed.Keychain,
+ slip21_keychain: Slip21Keychain,
) -> None:
- super().__init__(msg, keychain)
+ super().__init__(msg, keychain, slip21_keychain)
self.suite_tx_type: SuiteTxType = self._suite_tx_type()
def _validate_tx_init(self) -> None:
diff --git a/core/src/apps/cardano/sign_tx/signer.py b/core/src/apps/cardano/sign_tx/signer.py
index b4c9c639..1c1a62bc 100644
--- a/core/src/apps/cardano/sign_tx/signer.py
+++ b/core/src/apps/cardano/sign_tx/signer.py
@@ -21,7 +21,7 @@ from ..helpers.hash_builder_collection import (
HashBuilderList,
HashBuilderSet,
)
-from ..helpers.paths import SCHEMA_STAKING
+from ..helpers.paths import SCHEMA_STAKING, SLIP44_ID
from ..helpers.utils import derive_public_key
if TYPE_CHECKING:
@@ -31,6 +31,7 @@ if TYPE_CHECKING:
from trezor.enums import CardanoAddressType
from apps.common import cbor
+ from apps.common.keychain import Keychain as Slip21Keychain
from apps.common.paths import PathSchema
from ..helpers.hash_builder_collection import HashBuilderEmbeddedCBOR
@@ -104,11 +105,13 @@ class Signer:
self,
msg: messages.CardanoSignTxInit,
keychain: seed.Keychain,
+ slip21_keychain: Slip21Keychain,
) -> None:
from ..helpers.account_path_check import AccountPathChecker
self.msg = msg
self.keychain = keychain
+ self.slip21_keychain = slip21_keychain
self.total_out = 0 # sum of output amounts
self.change_out = 0 # sum of change amounts
@@ -250,6 +253,9 @@ class Signer:
msg = self.msg # local_cache_attribute
+ if msg.payment_req and msg.outputs_count > 1:
+ raise ProcessError("Multiple outputs not supported for payment requests")
+
if msg.fee > LOVELACE_MAX_SUPPLY:
raise ProcessError("Fee is out of range!")
if (
@@ -334,6 +340,8 @@ class Signer:
raise RuntimeError # should be unreachable
def _validate_output(self, output: CardanoTxOutput) -> None:
+ from apps.common.payment_request import PaymentRequestVerifier
+
from ..helpers import OUTPUT_DATUM_HASH_SIZE
address_parameters = output.address_parameters # local_cache_attribute
@@ -370,11 +378,36 @@ class Signer:
if output.format != CardanoTxOutputSerializationFormat.MAP_BABBAGE:
raise ProcessError("Invalid output")
+ if self.msg.payment_req:
+ self.payment_req_verifier = PaymentRequestVerifier(
+ self.msg.payment_req, SLIP44_ID, self.slip21_keychain
+ )
+ assert output.address is not None
+ self.payment_req_verifier.add_output(
+ output.amount, output.address, change=self._is_change_output(output)
+ )
+ self.payment_req_verifier.verify()
+ else:
+ self.payment_req_verifier = None
+
self.account_path_checker.add_output(output)
async def _show_output_init(
self, output: CardanoTxOutput, output_index: int
) -> None:
+ if self.payment_req_verifier:
+ assert self.msg.payment_req
+ assert output.address
+ address_n = (
+ output.address_parameters.address_n
+ if output.address_parameters
+ else None
+ )
+ await layout.require_confirm_payment_request(
+ output.address, self.msg.payment_req, address_n, self.msg.network_id
+ )
+ return
+
address_type = self._get_output_address_type(output)
if (
output.datum_hash is None
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index d505c15e..a9198c93 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -1284,6 +1284,7 @@ if TYPE_CHECKING:
reference_inputs_count: "int"
chunkify: "bool | None"
tag_cbor_sets: "bool"
+ payment_req: "PaymentRequest | None"
def __init__(
self,
@@ -1311,6 +1312,7 @@ if TYPE_CHECKING:
reference_inputs_count: "int | None" = None,
chunkify: "bool | None" = None,
tag_cbor_sets: "bool | None" = None,
+ payment_req: "PaymentRequest | None" = None,
) -> None:
pass
diff --git a/python/src/trezorlib/cardano.py b/python/src/trezorlib/cardano.py
index f753bc8c..a46c04c9 100644
--- a/python/src/trezorlib/cardano.py
+++ b/python/src/trezorlib/cardano.py
@@ -900,6 +900,7 @@ def sign_tx(
include_network_id: bool = False,
chunkify: bool = False,
tag_cbor_sets: bool = False,
+ payment_req: Optional[m.PaymentRequest] = None,
) -> Dict[str, Any]:
witness_requests = _get_witness_requests(
inputs,
@@ -936,6 +937,7 @@ def sign_tx(
include_network_id=include_network_id,
chunkify=chunkify,
tag_cbor_sets=tag_cbor_sets,
+ payment_req=payment_req,
),
expect=m.CardanoTxItemAck,
)
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 410aff68..17eaea5d 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -2328,6 +2328,7 @@ class CardanoSignTxInit(protobuf.MessageType):
21: protobuf.Field("reference_inputs_count", "uint32", repeated=False, required=False, default=0),
22: protobuf.Field("chunkify", "bool", repeated=False, required=False, default=None),
23: protobuf.Field("tag_cbor_sets", "bool", repeated=False, required=False, default=False),
+ 24: protobuf.Field("payment_req", "PaymentRequest", repeated=False, required=False, default=None),
}
def __init__(
@@ -2356,6 +2357,7 @@ class CardanoSignTxInit(protobuf.MessageType):
reference_inputs_count: Optional["int"] = 0,
chunkify: Optional["bool"] = None,
tag_cbor_sets: Optional["bool"] = False,
+ payment_req: Optional["PaymentRequest"] = None,
) -> None:
self.signing_mode = signing_mode
self.protocol_magic = protocol_magic
@@ -2380,6 +2382,7 @@ class CardanoSignTxInit(protobuf.MessageType):
self.reference_inputs_count = reference_inputs_count
self.chunkify = chunkify
self.tag_cbor_sets = tag_cbor_sets
+ self.payment_req = payment_req
class CardanoTxInput(protobuf.MessageType):
diff --git a/rust/trezor-client/src/protos/generated/messages_cardano.rs b/rust/trezor-client/src/protos/generated/messages_cardano.rs
index 2903c4a2..a7b34c1a 100644
--- a/rust/trezor-client/src/protos/generated/messages_cardano.rs
+++ b/rust/trezor-client/src/protos/generated/messages_cardano.rs
@@ -2344,6 +2344,8 @@ pub struct CardanoSignTxInit {
pub chunkify: ::std::option::Option<bool>,
// @@protoc_insertion_point(field:hw.trezor.messages.cardano.CardanoSignTxInit.tag_cbor_sets)
pub tag_cbor_sets: ::std::option::Option<bool>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.cardano.CardanoSignTxInit.payment_req)
+ pub payment_req: ::protobuf::MessageField<super::messages_common::PaymentRequest>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.cardano.CardanoSignTxInit.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -2821,7 +2823,7 @@ impl CardanoSignTxInit {
}
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(23);
+ let mut fields = ::std::vec::Vec::with_capacity(24);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"signing_mode",
@@ -2938,6 +2940,11 @@ impl CardanoSignTxInit {
|m: &CardanoSignTxInit| { &m.tag_cbor_sets },
|m: &mut CardanoSignTxInit| { &mut m.tag_cbor_sets },
));
+ fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::messages_common::PaymentRequest>(
+ "payment_req",
+ |m: &CardanoSignTxInit| { &m.payment_req },
+ |m: &mut CardanoSignTxInit| { &mut m.payment_req },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<CardanoSignTxInit>(
"CardanoSignTxInit",
fields,
@@ -2992,6 +2999,11 @@ impl ::protobuf::Message for CardanoSignTxInit {
if self.required_signers_count.is_none() {
return false;
}
+ for v in &self.payment_req {
+ if !v.is_initialized() {
+ return false;
+ }
+ };
true
}
@@ -3067,6 +3079,9 @@ impl ::protobuf::Message for CardanoSignTxInit {
184 => {
self.tag_cbor_sets = ::std::option::Option::Some(is.read_bool()?);
},
+ 194 => {
+ ::protobuf::rt::read_singular_message_into_field(is, &mut self.payment_req)?;
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -3148,6 +3163,10 @@ impl ::protobuf::Message for CardanoSignTxInit {
if let Some(v) = self.tag_cbor_sets {
my_size += 2 + 1;
}
+ if let Some(v) = self.payment_req.as_ref() {
+ let len = v.compute_size();
+ my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
+ }
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32);
my_size
@@ -3223,6 +3242,9 @@ impl ::protobuf::Message for CardanoSignTxInit {
if let Some(v) = self.tag_cbor_sets {
os.write_bool(23, v)?;
}
+ if let Some(v) = self.payment_req.as_ref() {
+ ::protobuf::rt::write_message_field_with_cached_size(24, v, os)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -3263,6 +3285,7 @@ impl ::protobuf::Message for CardanoSignTxInit {
self.reference_inputs_count = ::std::option::Option::None;
self.chunkify = ::std::option::Option::None;
self.tag_cbor_sets = ::std::option::Option::None;
+ self.payment_req.clear();
self.special_fields.clear();
}
@@ -3291,6 +3314,7 @@ impl ::protobuf::Message for CardanoSignTxInit {
reference_inputs_count: ::std::option::Option::None,
chunkify: ::std::option::Option::None,
tag_cbor_sets: ::std::option::Option::None,
+ payment_req: ::protobuf::MessageField::none(),
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -10490,108 +10514,110 @@ impl CardanoTxWitnessType {
static file_descriptor_proto_data: &'static [u8] = b"\
\n\x16messages-cardano.proto\x12\x1ahw.trezor.messages.cardano\x1a\x15me\
- ssages-common.proto\"\x87\x01\n\x1cCardanoBlockchainPointerType\x12\x1f\
- \n\x0bblock_index\x18\x01\x20\x02(\rR\nblockIndex\x12\x19\n\x08tx_index\
- \x18\x02\x20\x02(\rR\x07txIndex\x12+\n\x11certificate_index\x18\x03\x20\
- \x02(\rR\x10certificateIndex\"\xef\x02\n\x13CardanoNativeScript\x12G\n\
- \x04type\x18\x01\x20\x02(\x0e23.hw.trezor.messages.cardano.CardanoNative\
- ScriptTypeR\x04type\x12I\n\x07scripts\x18\x02\x20\x03(\x0b2/.hw.trezor.m\
- essages.cardano.CardanoNativeScriptR\x07scripts\x12\x19\n\x08key_hash\
- \x18\x03\x20\x01(\x0cR\x07keyHash\x12\x19\n\x08key_path\x18\x04\x20\x03(\
- \rR\x07keyPath\x12:\n\x19required_signatures_count\x18\x05\x20\x01(\rR\
- \x17requiredSignaturesCount\x12%\n\x0einvalid_before\x18\x06\x20\x01(\
- \x04R\rinvalidBefore\x12+\n\x11invalid_hereafter\x18\x07\x20\x01(\x04R\
- \x10invalidHereafter\"\xaa\x02\n\x1aCardanoGetNativeScriptHash\x12G\n\
- \x06script\x18\x01\x20\x02(\x0b2/.hw.trezor.messages.cardano.CardanoNati\
- veScriptR\x06script\x12g\n\x0edisplay_format\x18\x02\x20\x02(\x0e2@.hw.t\
- rezor.messages.cardano.CardanoNativeScriptHashDisplayFormatR\rdisplayFor\
- mat\x12Z\n\x0fderivation_type\x18\x03\x20\x02(\x0e21.hw.trezor.messages.\
- cardano.CardanoDerivationTypeR\x0ederivationType\":\n\x17CardanoNativeSc\
- riptHash\x12\x1f\n\x0bscript_hash\x18\x01\x20\x02(\x0cR\nscriptHash\"\
- \xaf\x03\n\x1cCardanoAddressParametersType\x12Q\n\x0caddress_type\x18\
- \x01\x20\x02(\x0e2..hw.trezor.messages.cardano.CardanoAddressTypeR\x0bad\
- dressType\x12\x1b\n\taddress_n\x18\x02\x20\x03(\rR\x08addressN\x12*\n\
- \x11address_n_staking\x18\x03\x20\x03(\rR\x0faddressNStaking\x12(\n\x10s\
- taking_key_hash\x18\x04\x20\x01(\x0cR\x0estakingKeyHash\x12i\n\x13certif\
- icate_pointer\x18\x05\x20\x01(\x0b28.hw.trezor.messages.cardano.CardanoB\
- lockchainPointerTypeR\x12certificatePointer\x12.\n\x13script_payment_has\
- h\x18\x06\x20\x01(\x0cR\x11scriptPaymentHash\x12.\n\x13script_staking_ha\
- sh\x18\x07\x20\x01(\x0cR\x11scriptStakingHash\"\xe4\x02\n\x11CardanoGetA\
- ddress\x12(\n\x0cshow_display\x18\x02\x20\x01(\x08:\x05falseR\x0bshowDis\
- play\x12%\n\x0eprotocol_magic\x18\x03\x20\x02(\rR\rprotocolMagic\x12\x1d\
- \n\nnetwork_id\x18\x04\x20\x02(\rR\tnetworkId\x12g\n\x12address_paramete\
- rs\x18\x05\x20\x02(\x0b28.hw.trezor.messages.cardano.CardanoAddressParam\
- etersTypeR\x11addressParameters\x12Z\n\x0fderivation_type\x18\x06\x20\
- \x02(\x0e21.hw.trezor.messages.cardano.CardanoDerivationTypeR\x0ederivat\
- ionType\x12\x1a\n\x08chunkify\x18\x07\x20\x01(\x08R\x08chunkify\"<\n\x0e\
- CardanoAddress\x12\x18\n\x07address\x18\x01\x20\x02(\tR\x07address\x12\
- \x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"\xb1\x01\n\x13CardanoGetPubl\
- icKey\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12!\n\x0csho\
- w_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\x12Z\n\x0fderivation_type\
- \x18\x03\x20\x02(\x0e21.hw.trezor.messages.cardano.CardanoDerivationType\
- R\x0ederivationType\"a\n\x10CardanoPublicKey\x12\x12\n\x04xpub\x18\x01\
- \x20\x02(\tR\x04xpub\x129\n\x04node\x18\x02\x20\x02(\x0b2%.hw.trezor.mes\
- sages.common.HDNodeTypeR\x04node\"\xde\x08\n\x11CardanoSignTxInit\x12S\n\
- \x0csigning_mode\x18\x01\x20\x02(\x0e20.hw.trezor.messages.cardano.Carda\
- noTxSigningModeR\x0bsigningMode\x12%\n\x0eprotocol_magic\x18\x02\x20\x02\
- (\rR\rprotocolMagic\x12\x1d\n\nnetwork_id\x18\x03\x20\x02(\rR\tnetworkId\
- \x12!\n\x0cinputs_count\x18\x04\x20\x02(\rR\x0binputsCount\x12#\n\routpu\
- ts_count\x18\x05\x20\x02(\rR\x0coutputsCount\x12\x10\n\x03fee\x18\x06\
- \x20\x02(\x04R\x03fee\x12\x10\n\x03ttl\x18\x07\x20\x01(\x04R\x03ttl\x12-\
- \n\x12certificates_count\x18\x08\x20\x02(\rR\x11certificatesCount\x12+\n\
- \x11withdrawals_count\x18\t\x20\x02(\rR\x10withdrawalsCount\x12,\n\x12ha\
- s_auxiliary_data\x18\n\x20\x02(\x08R\x10hasAuxiliaryData\x126\n\x17valid\
- ity_interval_start\x18\x0b\x20\x01(\x04R\x15validityIntervalStart\x124\n\
- \x16witness_requests_count\x18\x0c\x20\x02(\rR\x14witnessRequestsCount\
- \x12;\n\x1aminting_asset_groups_count\x18\r\x20\x02(\rR\x17mintingAssetG\
- roupsCount\x12Z\n\x0fderivation_type\x18\x0e\x20\x02(\x0e21.hw.trezor.me\
- ssages.cardano.CardanoDerivationTypeR\x0ederivationType\x123\n\x12includ\
- e_network_id\x18\x0f\x20\x01(\x08:\x05falseR\x10includeNetworkId\x12(\n\
- \x10script_data_hash\x18\x10\x20\x01(\x0cR\x0escriptDataHash\x126\n\x17c\
- ollateral_inputs_count\x18\x11\x20\x02(\rR\x15collateralInputsCount\x124\
- \n\x16required_signers_count\x18\x12\x20\x02(\rR\x14requiredSignersCount\
- \x129\n\x15has_collateral_return\x18\x13\x20\x01(\x08:\x05falseR\x13hasC\
- ollateralReturn\x12)\n\x10total_collateral\x18\x14\x20\x01(\x04R\x0ftota\
- lCollateral\x127\n\x16reference_inputs_count\x18\x15\x20\x01(\r:\x010R\
- \x14referenceInputsCount\x12\x1a\n\x08chunkify\x18\x16\x20\x01(\x08R\x08\
- chunkify\x12)\n\rtag_cbor_sets\x18\x17\x20\x01(\x08:\x05falseR\x0btagCbo\
- rSets\"L\n\x0eCardanoTxInput\x12\x1b\n\tprev_hash\x18\x01\x20\x02(\x0cR\
- \x08prevHash\x12\x1d\n\nprev_index\x18\x02\x20\x02(\rR\tprevIndex\"\xc5\
- \x03\n\x0fCardanoTxOutput\x12\x18\n\x07address\x18\x01\x20\x01(\tR\x07ad\
- dress\x12g\n\x12address_parameters\x18\x02\x20\x01(\x0b28.hw.trezor.mess\
- ages.cardano.CardanoAddressParametersTypeR\x11addressParameters\x12\x16\
- \n\x06amount\x18\x03\x20\x02(\x04R\x06amount\x12,\n\x12asset_groups_coun\
- t\x18\x04\x20\x02(\rR\x10assetGroupsCount\x12\x1d\n\ndatum_hash\x18\x05\
- \x20\x01(\x0cR\tdatumHash\x12d\n\x06format\x18\x06\x20\x01(\x0e2>.hw.tre\
- zor.messages.cardano.CardanoTxOutputSerializationFormat:\x0cARRAY_LEGACY\
- R\x06format\x12-\n\x11inline_datum_size\x18\x07\x20\x01(\r:\x010R\x0finl\
- ineDatumSize\x125\n\x15reference_script_size\x18\x08\x20\x01(\r:\x010R\
- \x13referenceScriptSize\"S\n\x11CardanoAssetGroup\x12\x1b\n\tpolicy_id\
- \x18\x01\x20\x02(\x0cR\x08policyId\x12!\n\x0ctokens_count\x18\x02\x20\
- \x02(\rR\x0btokensCount\"q\n\x0cCardanoToken\x12(\n\x10asset_name_bytes\
- \x18\x01\x20\x02(\x0cR\x0eassetNameBytes\x12\x16\n\x06amount\x18\x02\x20\
- \x01(\x04R\x06amount\x12\x1f\n\x0bmint_amount\x18\x03\x20\x01(\x12R\nmin\
- tAmount\"/\n\x19CardanoTxInlineDatumChunk\x12\x12\n\x04data\x18\x01\x20\
- \x02(\x0cR\x04data\"3\n\x1dCardanoTxReferenceScriptChunk\x12\x12\n\x04da\
- ta\x18\x01\x20\x02(\x0cR\x04data\"f\n\x10CardanoPoolOwner\x12(\n\x10stak\
- ing_key_path\x18\x01\x20\x03(\rR\x0estakingKeyPath\x12(\n\x10staking_key\
- _hash\x18\x02\x20\x01(\x0cR\x0estakingKeyHash\"\xd9\x01\n\x1aCardanoPool\
- RelayParameters\x12D\n\x04type\x18\x01\x20\x02(\x0e20.hw.trezor.messages\
- .cardano.CardanoPoolRelayTypeR\x04type\x12!\n\x0cipv4_address\x18\x02\
- \x20\x01(\x0cR\x0bipv4Address\x12!\n\x0cipv6_address\x18\x03\x20\x01(\
- \x0cR\x0bipv6Address\x12\x1b\n\thost_name\x18\x04\x20\x01(\tR\x08hostNam\
- e\x12\x12\n\x04port\x18\x05\x20\x01(\rR\x04port\"?\n\x17CardanoPoolMetad\
- ataType\x12\x10\n\x03url\x18\x01\x20\x02(\tR\x03url\x12\x12\n\x04hash\
- \x18\x02\x20\x02(\x0cR\x04hash\"\x9a\x03\n\x19CardanoPoolParametersType\
- \x12\x17\n\x07pool_id\x18\x01\x20\x02(\x0cR\x06poolId\x12\x20\n\x0cvrf_k\
- ey_hash\x18\x02\x20\x02(\x0cR\nvrfKeyHash\x12\x16\n\x06pledge\x18\x03\
- \x20\x02(\x04R\x06pledge\x12\x12\n\x04cost\x18\x04\x20\x02(\x04R\x04cost\
- \x12)\n\x10margin_numerator\x18\x05\x20\x02(\x04R\x0fmarginNumerator\x12\
- -\n\x12margin_denominator\x18\x06\x20\x02(\x04R\x11marginDenominator\x12\
- %\n\x0ereward_account\x18\x07\x20\x02(\tR\rrewardAccount\x12O\n\x08metad\
- ata\x18\n\x20\x01(\x0b23.hw.trezor.messages.cardano.CardanoPoolMetadataT\
- ypeR\x08metadata\x12!\n\x0cowners_count\x18\x0b\x20\x02(\rR\x0bownersCou\
- nt\x12!\n\x0crelays_count\x18\x0c\x20\x02(\rR\x0brelaysCount\"\x8a\x01\n\
+ ssages-common.proto\x1a\roptions.proto\"\x87\x01\n\x1cCardanoBlockchainP\
+ ointerType\x12\x1f\n\x0bblock_index\x18\x01\x20\x02(\rR\nblockIndex\x12\
+ \x19\n\x08tx_index\x18\x02\x20\x02(\rR\x07txIndex\x12+\n\x11certificate_\
+ index\x18\x03\x20\x02(\rR\x10certificateIndex\"\xef\x02\n\x13CardanoNati\
+ veScript\x12G\n\x04type\x18\x01\x20\x02(\x0e23.hw.trezor.messages.cardan\
+ o.CardanoNativeScriptTypeR\x04type\x12I\n\x07scripts\x18\x02\x20\x03(\
+ \x0b2/.hw.trezor.messages.cardano.CardanoNativeScriptR\x07scripts\x12\
+ \x19\n\x08key_hash\x18\x03\x20\x01(\x0cR\x07keyHash\x12\x19\n\x08key_pat\
+ h\x18\x04\x20\x03(\rR\x07keyPath\x12:\n\x19required_signatures_count\x18\
+ \x05\x20\x01(\rR\x17requiredSignaturesCount\x12%\n\x0einvalid_before\x18\
+ \x06\x20\x01(\x04R\rinvalidBefore\x12+\n\x11invalid_hereafter\x18\x07\
+ \x20\x01(\x04R\x10invalidHereafter\"\xaa\x02\n\x1aCardanoGetNativeScript\
+ Hash\x12G\n\x06script\x18\x01\x20\x02(\x0b2/.hw.trezor.messages.cardano.\
+ CardanoNativeScriptR\x06script\x12g\n\x0edisplay_format\x18\x02\x20\x02(\
+ \x0e2@.hw.trezor.messages.cardano.CardanoNativeScriptHashDisplayFormatR\
+ \rdisplayFormat\x12Z\n\x0fderivation_type\x18\x03\x20\x02(\x0e21.hw.trez\
+ or.messages.cardano.CardanoDerivationTypeR\x0ederivationType\":\n\x17Car\
+ danoNativeScriptHash\x12\x1f\n\x0bscript_hash\x18\x01\x20\x02(\x0cR\nscr\
+ iptHash\"\xaf\x03\n\x1cCardanoAddressParametersType\x12Q\n\x0caddress_ty\
+ pe\x18\x01\x20\x02(\x0e2..hw.trezor.messages.cardano.CardanoAddressTypeR\
+ \x0baddressType\x12\x1b\n\taddress_n\x18\x02\x20\x03(\rR\x08addressN\x12\
+ *\n\x11address_n_staking\x18\x03\x20\x03(\rR\x0faddressNStaking\x12(\n\
+ \x10staking_key_hash\x18\x04\x20\x01(\x0cR\x0estakingKeyHash\x12i\n\x13c\
+ ertificate_pointer\x18\x05\x20\x01(\x0b28.hw.trezor.messages.cardano.Car\
+ danoBlockchainPointerTypeR\x12certificatePointer\x12.\n\x13script_paymen\
+ t_hash\x18\x06\x20\x01(\x0cR\x11scriptPaymentHash\x12.\n\x13script_staki\
+ ng_hash\x18\x07\x20\x01(\x0cR\x11scriptStakingHash\"\xe4\x02\n\x11Cardan\
+ oGetAddress\x12(\n\x0cshow_display\x18\x02\x20\x01(\x08:\x05falseR\x0bsh\
+ owDisplay\x12%\n\x0eprotocol_magic\x18\x03\x20\x02(\rR\rprotocolMagic\
+ \x12\x1d\n\nnetwork_id\x18\x04\x20\x02(\rR\tnetworkId\x12g\n\x12address_\
+ parameters\x18\x05\x20\x02(\x0b28.hw.trezor.messages.cardano.CardanoAddr\
+ essParametersTypeR\x11addressParameters\x12Z\n\x0fderivation_type\x18\
+ \x06\x20\x02(\x0e21.hw.trezor.messages.cardano.CardanoDerivationTypeR\
+ \x0ederivationType\x12\x1a\n\x08chunkify\x18\x07\x20\x01(\x08R\x08chunki\
+ fy\"<\n\x0eCardanoAddress\x12\x18\n\x07address\x18\x01\x20\x02(\tR\x07ad\
+ dress\x12\x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"\xb1\x01\n\x13Carda\
+ noGetPublicKey\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12!\
+ \n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\x12Z\n\x0fderiva\
+ tion_type\x18\x03\x20\x02(\x0e21.hw.trezor.messages.cardano.CardanoDeriv\
+ ationTypeR\x0ederivationType\"a\n\x10CardanoPublicKey\x12\x12\n\x04xpub\
+ \x18\x01\x20\x02(\tR\x04xpub\x129\n\x04node\x18\x02\x20\x02(\x0b2%.hw.tr\
+ ezor.messages.common.HDNodeTypeR\x04node\"\xb0\t\n\x11CardanoSignTxInit\
+ \x12S\n\x0csigning_mode\x18\x01\x20\x02(\x0e20.hw.trezor.messages.cardan\
+ o.CardanoTxSigningModeR\x0bsigningMode\x12%\n\x0eprotocol_magic\x18\x02\
+ \x20\x02(\rR\rprotocolMagic\x12\x1d\n\nnetwork_id\x18\x03\x20\x02(\rR\tn\
+ etworkId\x12!\n\x0cinputs_count\x18\x04\x20\x02(\rR\x0binputsCount\x12#\
+ \n\routputs_count\x18\x05\x20\x02(\rR\x0coutputsCount\x12\x10\n\x03fee\
+ \x18\x06\x20\x02(\x04R\x03fee\x12\x10\n\x03ttl\x18\x07\x20\x01(\x04R\x03\
+ ttl\x12-\n\x12certificates_count\x18\x08\x20\x02(\rR\x11certificatesCoun\
+ t\x12+\n\x11withdrawals_count\x18\t\x20\x02(\rR\x10withdrawalsCount\x12,\
+ \n\x12has_auxiliary_data\x18\n\x20\x02(\x08R\x10hasAuxiliaryData\x126\n\
+ \x17validity_interval_start\x18\x0b\x20\x01(\x04R\x15validityIntervalSta\
+ rt\x124\n\x16witness_requests_count\x18\x0c\x20\x02(\rR\x14witnessReques\
+ tsCount\x12;\n\x1aminting_asset_groups_count\x18\r\x20\x02(\rR\x17mintin\
+ gAssetGroupsCount\x12Z\n\x0fderivation_type\x18\x0e\x20\x02(\x0e21.hw.tr\
+ ezor.messages.cardano.CardanoDerivationTypeR\x0ederivationType\x123\n\
+ \x12include_network_id\x18\x0f\x20\x01(\x08:\x05falseR\x10includeNetwork\
+ Id\x12(\n\x10script_data_hash\x18\x10\x20\x01(\x0cR\x0escriptDataHash\
+ \x126\n\x17collateral_inputs_count\x18\x11\x20\x02(\rR\x15collateralInpu\
+ tsCount\x124\n\x16required_signers_count\x18\x12\x20\x02(\rR\x14required\
+ SignersCount\x129\n\x15has_collateral_return\x18\x13\x20\x01(\x08:\x05fa\
+ lseR\x13hasCollateralReturn\x12)\n\x10total_collateral\x18\x14\x20\x01(\
+ \x04R\x0ftotalCollateral\x127\n\x16reference_inputs_count\x18\x15\x20\
+ \x01(\r:\x010R\x14referenceInputsCount\x12\x1a\n\x08chunkify\x18\x16\x20\
+ \x01(\x08R\x08chunkify\x12)\n\rtag_cbor_sets\x18\x17\x20\x01(\x08:\x05fa\
+ lseR\x0btagCborSets\x12P\n\x0bpayment_req\x18\x18\x20\x01(\x0b2).hw.trez\
+ or.messages.common.PaymentRequestR\npaymentReqB\x04\xc8\xf0\x19\x01\"L\n\
+ \x0eCardanoTxInput\x12\x1b\n\tprev_hash\x18\x01\x20\x02(\x0cR\x08prevHas\
+ h\x12\x1d\n\nprev_index\x18\x02\x20\x02(\rR\tprevIndex\"\xc5\x03\n\x0fCa\
+ rdanoTxOutput\x12\x18\n\x07address\x18\x01\x20\x01(\tR\x07address\x12g\n\
+ \x12address_parameters\x18\x02\x20\x01(\x0b28.hw.trezor.messages.cardano\
+ .CardanoAddressParametersTypeR\x11addressParameters\x12\x16\n\x06amount\
+ \x18\x03\x20\x02(\x04R\x06amount\x12,\n\x12asset_groups_count\x18\x04\
+ \x20\x02(\rR\x10assetGroupsCount\x12\x1d\n\ndatum_hash\x18\x05\x20\x01(\
+ \x0cR\tdatumHash\x12d\n\x06format\x18\x06\x20\x01(\x0e2>.hw.trezor.messa\
+ ges.cardano.CardanoTxOutputSerializationFormat:\x0cARRAY_LEGACYR\x06form\
+ at\x12-\n\x11inline_datum_size\x18\x07\x20\x01(\r:\x010R\x0finlineDatumS\
+ ize\x125\n\x15reference_script_size\x18\x08\x20\x01(\r:\x010R\x13referen\
+ ceScriptSize\"S\n\x11CardanoAssetGroup\x12\x1b\n\tpolicy_id\x18\x01\x20\
+ \x02(\x0cR\x08policyId\x12!\n\x0ctokens_count\x18\x02\x20\x02(\rR\x0btok\
+ ensCount\"q\n\x0cCardanoToken\x12(\n\x10asset_name_bytes\x18\x01\x20\x02\
+ (\x0cR\x0eassetNameBytes\x12\x16\n\x06amount\x18\x02\x20\x01(\x04R\x06am\
+ ount\x12\x1f\n\x0bmint_amount\x18\x03\x20\x01(\x12R\nmintAmount\"/\n\x19\
+ CardanoTxInlineDatumChunk\x12\x12\n\x04data\x18\x01\x20\x02(\x0cR\x04dat\
+ a\"3\n\x1dCardanoTxReferenceScriptChunk\x12\x12\n\x04data\x18\x01\x20\
+ \x02(\x0cR\x04data\"f\n\x10CardanoPoolOwner\x12(\n\x10staking_key_path\
+ \x18\x01\x20\x03(\rR\x0estakingKeyPath\x12(\n\x10staking_key_hash\x18\
+ \x02\x20\x01(\x0cR\x0estakingKeyHash\"\xd9\x01\n\x1aCardanoPoolRelayPara\
+ meters\x12D\n\x04type\x18\x01\x20\x02(\x0e20.hw.trezor.messages.cardano.\
+ CardanoPoolRelayTypeR\x04type\x12!\n\x0cipv4_address\x18\x02\x20\x01(\
+ \x0cR\x0bipv4Address\x12!\n\x0cipv6_address\x18\x03\x20\x01(\x0cR\x0bipv\
+ 6Address\x12\x1b\n\thost_name\x18\x04\x20\x01(\tR\x08hostName\x12\x12\n\
+ \x04port\x18\x05\x20\x01(\rR\x04port\"?\n\x17CardanoPoolMetadataType\x12\
+ \x10\n\x03url\x18\x01\x20\x02(\tR\x03url\x12\x12\n\x04hash\x18\x02\x20\
+ \x02(\x0cR\x04hash\"\x9a\x03\n\x19CardanoPoolParametersType\x12\x17\n\
+ \x07pool_id\x18\x01\x20\x02(\x0cR\x06poolId\x12\x20\n\x0cvrf_key_hash\
+ \x18\x02\x20\x02(\x0cR\nvrfKeyHash\x12\x16\n\x06pledge\x18\x03\x20\x02(\
+ \x04R\x06pledge\x12\x12\n\x04cost\x18\x04\x20\x02(\x04R\x04cost\x12)\n\
+ \x10margin_numerator\x18\x05\x20\x02(\x04R\x0fmarginNumerator\x12-\n\x12\
+ margin_denominator\x18\x06\x20\x02(\x04R\x11marginDenominator\x12%\n\x0e\
+ reward_account\x18\x07\x20\x02(\tR\rrewardAccount\x12O\n\x08metadata\x18\
+ \n\x20\x01(\x0b23.hw.trezor.messages.cardano.CardanoPoolMetadataTypeR\
+ \x08metadata\x12!\n\x0cowners_count\x18\x0b\x20\x02(\rR\x0bownersCount\
+ \x12!\n\x0crelays_count\x18\x0c\x20\x02(\rR\x0brelaysCount\"\x8a\x01\n\
\x0bCardanoDRep\x12?\n\x04type\x18\x01\x20\x02(\x0e2+.hw.trezor.messages\
.cardano.CardanoDRepTypeR\x04type\x12\x19\n\x08key_hash\x18\x02\x20\x01(\
\x0cR\x07keyHash\x12\x1f\n\x0bscript_hash\x18\x03\x20\x01(\x0cR\nscriptH\
@@ -10688,8 +10714,9 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();
file_descriptor.get(|| {
let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
- let mut deps = ::std::vec::Vec::with_capacity(1);
+ let mut deps = ::std::vec::Vec::with_capacity(2);
deps.push(super::messages_common::file_descriptor().clone());
+ deps.push(super::options::file_descriptor().clone());
let mut messages = ::std::vec::Vec::with_capacity(37);
messages.push(CardanoBlockchainPointerType::generated_message_descriptor_data());
messages.push(CardanoNativeScript::generated_message_descriptor_data());
diff --git a/tests/device_tests/cardano/test_sign_tx.py b/tests/device_tests/cardano/test_sign_tx.py
index e2014269..5d2b963f 100644
--- a/tests/device_tests/cardano/test_sign_tx.py
+++ b/tests/device_tests/cardano/test_sign_tx.py
@@ -16,14 +16,21 @@
import pytest
-from trezorlib import cardano, device, messages
+from trezorlib import btc, cardano, device, messages, misc
from trezorlib.debuglink import LayoutType
from trezorlib.debuglink import SessionDebugWrapper as Session
from trezorlib.debuglink import TrezorClientDebugLink as Client
from trezorlib.exceptions import TrezorFailure
+from trezorlib.tools import parse_path
from ...common import parametrize_using_common_fixtures
from ...input_flows import InputFlowConfirmAllWarnings
+from ..payment_req import (
+ CoinPurchaseMemo,
+ RefundMemo,
+ TextDetailsMemo,
+ make_payment_request,
+)
pytestmark = [pytest.mark.altcoin, pytest.mark.cardano, pytest.mark.models("core")]
@@ -118,6 +125,41 @@ def call_sign_tx(session: Session, parameters, input_flow=None, chunkify: bool =
else:
device.apply_settings(session, safety_checks=messages.SafetyCheckLevel.Strict)
+ if parameters.get("payment_req"):
+ # Note: "payment_req" in the JSON is just a boolean,
+ # which makes us generate a payment request here.
+ # It could be changed to encode the payment request in the JSON,
+ # but it feels overkill for now.
+ purchase_memo = CoinPurchaseMemo(
+ amount="0.00001 BTC",
+ coin_name="Bitcoin",
+ slip44=0,
+ address_n=parse_path("m/44h/0h/0h/0/0"),
+ )
+ purchase_memo.address_resp = btc.get_authenticated_address(
+ session, purchase_memo.coin_name, purchase_memo.address_n
+ )
+ refund_memo = RefundMemo(address_n=parse_path("m/44h/1815h/0h/0/2"))
+ refund_memo.address_resp = cardano.get_authenticated_address(
+ session, cardano.create_address_parameters(8, refund_memo.address_n)
+ )
+ text_details_memo = TextDetailsMemo(
+ title="Are you sure...",
+ text="... you want to swap your valuable ADA for some sats?",
+ )
+ memos = [purchase_memo, refund_memo, text_details_memo]
+ nonce = misc.get_nonce(session)
+ payment_request = make_payment_request(
+ session,
+ recipient_name="trezor.io",
+ slip44=1815,
+ outputs=[(o[0].amount, o[0].address) for o in outputs],
+ memos=memos,
+ nonce=nonce,
+ )
+ else:
+ payment_request = None
+
with session.client as client:
if input_flow is not None:
session.client.watch_layout()
@@ -147,6 +189,7 @@ def call_sign_tx(session: Session, parameters, input_flow=None, chunkify: bool =
include_network_id=parameters["include_network_id"],
chunkify=chunkify,
tag_cbor_sets=parameters["tag_cbor_sets"],
+ payment_req=payment_request,
)
@@ -182,3 +225,32 @@ def _transform_expected_result(result):
"cvote_registration_signature"
] = bytes.fromhex(cvote_registration_signature)
return transformed_result
+
+
+@pytest.mark.models(
+ "core",
+ skip="t2t1",
+ reason="T1 does not support payment requests. Payment requests not yet implemented on model T.",
+)
+@pytest.mark.altcoin
+@pytest.mark.experimental
+@parametrize_using_common_fixtures(
+ "cardano/sign_tx.slip24.json",
+)
+def test_signtx_payment_req(session: Session, parameters, result):
+ call_sign_tx(session, parameters, None)
+
+
+@pytest.mark.models(
+ "core",
+ skip="t2t1",
+ reason="T1 does not support payment requests. Payment requests not yet implemented on model T.",
+)
+@pytest.mark.altcoin
+@pytest.mark.experimental
+@parametrize_using_common_fixtures(
+ "cardano/sign_tx.slip24.failed.json",
+)
+def test_sign_tx_payment_req_failed(session: Session, parameters, result):
+ with pytest.raises(TrezorFailure, match=result["error_message"]):
+ call_sign_tx(session, parameters, None)
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index f1bb31a4..551be03e 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -11182,6 +11182,8 @@
"T3B1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "f1fbaecdf25816c8ffe0434775c304b179aa47556b727aefa47033053b7e2fd1",
"T3B1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "b33aa52eb5700694d0fffce7dd941a97959a5be15e1f7f423fcc4ec31374c36a",
"T3B1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "d9afe3c426101441c083498534f2c5c3f7fd0914007cbddfadad6b14877da507",
+"T3B1_cs_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "d84b6b16576c5bc1d2839feda59ef20ff8a8334159d1084406cd5dcd1025e233",
+"T3B1_cs_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "dfda1a2ce22ae80d421257866bf22cbf90c87afbe302cdf331ce91ea803ad3d0",
"T3B1_cs_ethereum-test_definitions.py::test_builtin": "c689aa27d67575b5cc51a11ad72fcf9c10c1405fe87e04833f0c4be871e1aa3e",
"T3B1_cs_ethereum-test_definitions.py::test_builtin_token": "469a537d09294a80c2161bc7ecb35ccbb34b370d2363c4c24ca531022bbd08ac",
"T3B1_cs_ethereum-test_definitions.py::test_chain_id_allowed": "6240fbcc28e1d595aef9e9b9017e9965c6f2e16cae8d6e54056912088802ffd6",
@@ -12616,6 +12618,8 @@
"T3B1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "9185ead588d5b83e14b537d77498590af6766c4f7787de9343990c7b192948a3",
"T3B1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "272087330102730a9df554309f4f8e0de1b645f4733e6e3e9f3e94fb325a107a",
"T3B1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "87df29e41220db07a23d392c21b35ea3e375b10813d6a7588e090f29462a6050",
+"T3B1_de_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "fd01c071d3013e00623e3cb6839ef6621b97d1318156e5493cecdbace2d6aa75",
+"T3B1_de_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "4c20003675f14ccc832d87d26f01e232dc2437b66b44b63cadbf7cb09e91ce43",
"T3B1_de_ethereum-test_definitions.py::test_builtin": "371e26c3501e02aee068ba12851e5f8f463c515a7ce1d9163df3947e0c60bb69",
"T3B1_de_ethereum-test_definitions.py::test_builtin_token": "1593134659c08d797105bbc9354b250dad12210259e7f428532ff8344758af71",
"T3B1_de_ethereum-test_definitions.py::test_chain_id_allowed": "3bdf35ae8ee4662404a0b4e901a927b77fdd0b24c79681f8f01d65260cfd3b01",
@@ -14050,6 +14054,8 @@
"T3B1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "ca6f469b561148a93068795d467e8b1f8db00340e28ea33a7e6476c3948f4e46",
"T3B1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "950823439ea9fe2cc6701b41d8785e0d4a7ddc5066db69c0ae139c85fd4c1696",
"T3B1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "1545505011f2a71a99f48b249e35745a923c1390d1020fb3f398884f157099f0",
+"T3B1_en_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "79c2cdcf10b1d4dbb2450a5c7ead0456f94e0e58fc11d43f70b8c2ab42276a4f",
+"T3B1_en_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "32b71941f356697db51b561b3ef83fc7e83df153ed5a6a0e58b495c8f34ecfbb",
"T3B1_en_ethereum-test_definitions.py::test_builtin": "a5e700e37e287c122a4de705253f0b9940aa8b28667f54dbaeeb03d32cfcfb1d",
"T3B1_en_ethereum-test_definitions.py::test_builtin_token": "90490e9896a6d45284d67ac5a9d15e1852456268ff2cca71b659d98f74675643",
"T3B1_en_ethereum-test_definitions.py::test_chain_id_allowed": "dbfdf0d28caf300fb39952083a675cfaafcaa0e0595abf28b49ba7c41cdcaa8b",
@@ -15484,6 +15490,8 @@
"T3B1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "3a1b5a0ef27a1562c76dcb0f8d4e6c4c1153c6baaf6c6d0f9ce9204155d9cf23",
"T3B1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "b0939e77ed39950ba7e6e1116d7d71d0a11b3bca553dbaca07dbd56240569bea",
"T3B1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "7ceae810ffc43fd8d0ff8906a9ae615e6b454e7f1982aca8bbb41e0a791af356",
+"T3B1_es_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "7eb0082b5a4dc8391d6ddeec7ebe503631766a97c8b4547645bbd6f3d453fdcf",
+"T3B1_es_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "dda319565c27c10aa5df11e1b669fbe5de0b82f273cad8ecb8e3ea4e85502d6e",
"T3B1_es_ethereum-test_definitions.py::test_builtin": "56c5d02bbabbd887f0c1f2082dfc1c20396cebd3537dbc148db0b0df3b6e6d08",
"T3B1_es_ethereum-test_definitions.py::test_builtin_token": "d0be986ba8337aea85d36422f15a12d25a5aa1422b9cbba35880ff9b54f0ec18",
"T3B1_es_ethereum-test_definitions.py::test_chain_id_allowed": "037e831343abef4e865c00e219ceb43e02796f81c03f91aab415af59b2a75ad7",
@@ -16918,6 +16926,8 @@
"T3B1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "5351b11c4a092df82be344032bfa371a97fa50e6242dabca418481f184825b43",
"T3B1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "e27da23bb1ecf4a45773c882dd142f9b58eb012da8b38ac91d8421bfc7177921",
"T3B1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "cd96ba36e79007642c6c905adc8cf066fd7251eaec45c888f3770ed902b4221a",
+"T3B1_fr_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "18a879960549990b042d655c252f5aea74479ddb2f8ad68cf25debaaebc0c8f9",
+"T3B1_fr_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "37ee820a9182b2196e603a7741be5ade5d416ae1e7cf2b03e23ff9df5ca43af8",
"T3B1_fr_ethereum-test_definitions.py::test_builtin": "ca0b0bfaed17774379362edc3ce020986352c8afc49746dd3a8b71a8b632b04b",
"T3B1_fr_ethereum-test_definitions.py::test_builtin_token": "544133bbab9adbd8e52fd1087e31bcd092bba834ed3e5ea6ce041c81f1891a32",
"T3B1_fr_ethereum-test_definitions.py::test_chain_id_allowed": "8bbea08853cee5e36b32662c0564f0eefc9c3789ca31e6115a9acdbfa218157b",
@@ -18352,6 +18362,8 @@
"T3B1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "5b0372d6b55c0a1b0ab4424d78b090f5659e072d3ab4461b79b63d32c5a30bc1",
"T3B1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "a727883900b59929527810596ba6625ffb8b13a57918a611de4cf2b2abb7bf2f",
"T3B1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "752643099faa1de5d5a841b9709af8a94f08f4ce1068e2b196c34e8d8df1a7a3",
+"T3B1_pt_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "764ea51e5f04f0d3614627e9b141df76590128e3ab361b9ac2a451dabb3756bc",
+"T3B1_pt_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "62a4e4455cd612aa7b89b7697196ad643efb0be1515149d9eada21bfa8d72a73",
"T3B1_pt_ethereum-test_definitions.py::test_builtin": "46cf84ad58b83e4868cea81762580e9bff7a84b09608909c7ec8e5b68a317c0d",
"T3B1_pt_ethereum-test_definitions.py::test_builtin_token": "cd17b7109461f417803eba33be6c2c56e36c659b424dd9918a9df030858208b5",
"T3B1_pt_ethereum-test_definitions.py::test_chain_id_allowed": "f0cb9f47e39efa72083810cc9ac4a55bb016da7440fe471cb9f33e91c41c9099",
@@ -20178,6 +20190,8 @@
"T3T1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "692b3d851ae926a6a0b99d4480a259123fb66095fe95bef6849e24f4427ed4a8",
"T3T1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "4fa832ebe10a6d41c07520deb24071eecb063e8e7cc4492a5c1661331cb093b1",
"T3T1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "95bfb2a14c4160fad7717029d4ea31a3b15df0b2fab78e4735ae3a5440a46f85",
+"T3T1_cs_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "a81669ef605498457a4e2bc2a46dd8d7d3f5fa701fb99c4c60e3fa7111144373",
+"T3T1_cs_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "76b8cfac14ba99d2bbf75bdec1d597383cd86812ee9214870ab416d77116bf4e",
"T3T1_cs_ethereum-test_definitions.py::test_builtin": "7d47791c66f60605cd2ae2fd06f4966879e80ee5c4abd5be0f9b1640c15e5326",
"T3T1_cs_ethereum-test_definitions.py::test_builtin_token": "0fcccf6a1fe14882f0ba857e60380a2b7220fb4ee6fca63857b9d7b71316afde",
"T3T1_cs_ethereum-test_definitions.py::test_chain_id_allowed": "21b2534e73cede72eb63ef36f969e6aea27293590e2e065f38ac14ca2a936dfe",
@@ -21643,6 +21657,8 @@
"T3T1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "35d35c567b2663864123ad209e2db68293bd962c961e6b903d6cb2a154568bb1",
"T3T1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "3528b0b303c3feda3443f337b738749fb09563b72a8a6459e7aa171226d5ff6f",
"T3T1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "835560a203af4b3aacef79a8a9af4aeeddab7e808e7f514dc933a54a11f5da99",
+"T3T1_de_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "7707d99ed4fa158c84cd437dae52010a4b58899b932a7caa4e411cbbde4aaded",
+"T3T1_de_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "3c01ec5a696990cce3db074058bdf985a38aabce7db190d078eba05e992455c0",
"T3T1_de_ethereum-test_definitions.py::test_builtin": "de55ab17598d3460e3237fdb299292e3121d18df65a07435c22553c20a81c194",
"T3T1_de_ethereum-test_definitions.py::test_builtin_token": "b7a4d58bce1402d432e4905101e5adee75093c28503059c595591dd343b4c8d7",
"T3T1_de_ethereum-test_definitions.py::test_chain_id_allowed": "c579487d066aa455cf8b5ff3832ec047c001d5b14913d23a766d1921b07b09d8",
@@ -23108,6 +23124,8 @@
"T3T1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "53ca292b240892a3763a8188434a27cdcb8620a04f6f95f06794ac09a8c668fb",
"T3T1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "95b48b0813c6e2438c550a87946cf6d6d07b7ec6f716af62c23db5b80c168f9f",
"T3T1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "df86a797b48b8a6f56171e318e2379d56856ade66c313a9b74eae54f4b7e066f",
+"T3T1_en_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "299c35cdae0601fa6e38eef26961269b8235c1522e3354f17d711b85d4fb8fe8",
+"T3T1_en_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "f8247770c82f1202eff4b3f3ea24914efe68fc86ed5c813568f5f56e56ff8937",
"T3T1_en_ethereum-test_definitions.py::test_builtin": "ed123aaf6484810e023b86b368f24658492c93392e9ee6c37605fe548da235a8",
"T3T1_en_ethereum-test_definitions.py::test_builtin_token": "f7ab241252e3a5ed4cce2ced95d552b4ef7486f3f9e699cad8352879a6770e00",
"T3T1_en_ethereum-test_definitions.py::test_chain_id_allowed": "1095ce966156d660d82a71c2fdcdd5e7fd88ff9b7b06a3b9395296b55491be70",
@@ -24573,6 +24591,8 @@
"T3T1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "b1e725951eb4aa3dcbc1e5be60d7707e1c8d4ab1a776621e8041a2e5f19d46da",
"T3T1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "0528a841a56b97d9ff8414e8977840f77a627191e1d094f6469b56dc9e052027",
"T3T1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "2de8ec30b1763419220f2de1411bca5d7458d310dadce15a2425d31202aba0d3",
+"T3T1_es_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "0d3703cd3aecc456b536f7d4a583cff76bdcbf34e6f6af10a54f7e8d0b678413",
+"T3T1_es_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "ed49fbd92e591d0c1257d02ca9009a5ac6e975483f1a10192c2319ac89fc8a03",
"T3T1_es_ethereum-test_definitions.py::test_builtin": "ba81a721bcf53a626c1fc604c546d9decdeb377da171fe9316ede2b9c08a6417",
"T3T1_es_ethereum-test_definitions.py::test_builtin_token": "7d7af0886e5c2f65eeeff4565195682641d0a02b31acfa9a9bbddfa294658dda",
"T3T1_es_ethereum-test_definitions.py::test_chain_id_allowed": "a516ab1869129b43343d3c86246178cf93c189507faeeeed9788680297546c95",
@@ -26038,6 +26058,8 @@
"T3T1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "1bb83783eb275d019707fb1dfb254a73018122e96fd874151d84fa6db364359f",
"T3T1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "3326d141b67f7607c175b5cfc06c4e53a67174e3ac3f13ec19a1a57ddde13325",
"T3T1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "789d99768e1b4ba18ae60f9f2546d6d52a503c621281be1f2f5a8ab706d1c95a",
+"T3T1_fr_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "3e17c0b6264d10d2f8bb1d937917b5458690bb38c2e501081cc715a5cb0d2603",
+"T3T1_fr_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "5a36f07b4c322951bc8f5e3aab102cd96ea70312ca4f1aa803084697bfd3213c",
"T3T1_fr_ethereum-test_definitions.py::test_builtin": "0f31af48065b07c25e1b019e4e79407b5ea4a8b01135e70d553727b5fb37f14d",
"T3T1_fr_ethereum-test_definitions.py::test_builtin_token": "55e814f0bf1bff8702657cce2b7d9ddf2d8de0ba323504b362810fa5a90b2891",
"T3T1_fr_ethereum-test_definitions.py::test_chain_id_allowed": "c5e432ecadef38742c828e4758652b557a3e7b8a30eed120cc596f335eb885b2",
@@ -27503,6 +27525,8 @@
"T3T1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "2381705a77452ca704dc6b464786ce0ed05e5da3ab6d5d48ab7f5496a892346b",
"T3T1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "7c30f157b5ccda685b79d93d642d955c3304877c12ab397499295d0579b84716",
"T3T1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "88b87f3a0f940a391c1e387b2d87189c88df3378efd2c53ad7d13ca21b6d29d9",
+"T3T1_pt_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "3508e558d80bd52cef768d93c0b8e227f0d01c6dd4c521f3faf48f40ce7bcd1b",
+"T3T1_pt_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "4da555d8b1d3082a652265bfdd52629f8e6ed414807292fea8418235a1627b94",
"T3T1_pt_ethereum-test_definitions.py::test_builtin": "a60ec3f37a001da4efc2031f1d54947d082f4a0e5c99d5185343531867427960",
"T3T1_pt_ethereum-test_definitions.py::test_builtin_token": "68d9965b44ba59a8d30826cbcb1605132668dd018592af2815000168d142fc50",
"T3T1_pt_ethereum-test_definitions.py::test_chain_id_allowed": "bdd82ed801fb1536189433e2df4f5ee2830c06c920adc43ecc4f03fb17442cda",
@@ -29332,6 +29356,8 @@
"T3W1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "1ade2e4da890f2dd685c112c097fe74025363317726dc85dc89dac2545034790",
"T3W1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "668920f664556c614ecd215d01c5bb9ba77b2be90357c385146978475e421548",
"T3W1_cs_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "acc0604cca3ff03f3ef4d4c981488882c41f8c84e6c0c573bdfb043cc22ad611",
+"T3W1_cs_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "76d5e14fd70e4acf4b34b0c46fcd42e5b78c5fbc746f1192a634220e184921d9",
+"T3W1_cs_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "06973bd6fc3014eee95abcf1b5a507e4c3c72e3b4c490742f2a8bfb3b1204eb0",
"T3W1_cs_ethereum-test_definitions.py::test_builtin": "4e6b8e15f6bff0f4517bdaa27747600ed682608150cf47b59b3e38845a663496",
"T3W1_cs_ethereum-test_definitions.py::test_builtin_token": "2b9e957b83a9615b23a4f048aeb32ea5972a25bad3b2d5b4eb1a8574f37d8459",
"T3W1_cs_ethereum-test_definitions.py::test_chain_id_allowed": "b92cafcfe25c4088991420561d2df03998ea626ec99c11bc5d30a377c12f99f1",
@@ -30787,6 +30813,8 @@
"T3W1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "82154ba7c01f22cdb44987a4993e922236ba70c055daedb7e0c2b0a8d3da4c1c",
"T3W1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "a790cb45f4d12303b0a4a8d0234100647a0fff8dc4a91e97b54bb5f4aefa588d",
"T3W1_de_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "49093bb18823f9dde131a3d1ac4c5bc7079d0c14c30fc06e9b933fc940418a19",
+"T3W1_de_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "311e1d14d18ebc079cefb7164b2dd5afe552be056333599c72b60571964424ef",
+"T3W1_de_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "daa440690c7d48e6e8f9dd08b3cac760d41163861e14fae42cbe2f6c181f713f",
"T3W1_de_ethereum-test_definitions.py::test_builtin": "6f89407e7efbef3b2219dac8c7a7dcb120aa0008b717db3667205e2e15b460bc",
"T3W1_de_ethereum-test_definitions.py::test_builtin_token": "c140368b25dd09fa59b80fb9e89737e7d4e709618f0eced2068d95020a32af0b",
"T3W1_de_ethereum-test_definitions.py::test_chain_id_allowed": "f42d9061947263e30469c7e8a12e6114ac8d58075dae6111090af7d81ed098ba",
@@ -32242,6 +32270,8 @@
"T3W1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "ab9ac30f5a0c7652ba4bb2ca42bcd59ea1551591f0fda445d15469de96acffbb",
"T3W1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "75f385d42e954d2ca0180363fd1dbdaeb0b5f82e6a632b8d91fd567c6006f104",
"T3W1_en_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "f72cde36b217b09ac2ea0a4774aa265eb035700dffa792bb6417f42a0661a1a3",
+"T3W1_en_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "5e0216ba18fad19657a4ef8e6508c31a19bd8fcfb579deca56a9022f5523c7dc",
+"T3W1_en_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "4b951b325150ce984e605be9ebb1017cdc3e30da8a9e295b77d626f26b02861c",
"T3W1_en_ethereum-test_definitions.py::test_builtin": "3c142f8c98a9f726aa17719e5fa4fadd347a6dfff571271e9a6c728125f829fa",
"T3W1_en_ethereum-test_definitions.py::test_builtin_token": "5327473e8779779bbad5db7bcc91515072acb2f5a6887ecd1d99bb31414b9d48",
"T3W1_en_ethereum-test_definitions.py::test_chain_id_allowed": "d2de1071f94b57da2e0be962eb42f279d583cc62bb62253037a322c0144dd7a4",
@@ -33697,6 +33727,8 @@
"T3W1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "80e7f4a928d807827f4d6bd44cbddf661caa86307b790dfb9b814fbb534a3e82",
"T3W1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "dd1466f9afd5e1d68eac4e560a29b2dd302aa58b139d951cf00b660d120f5fda",
"T3W1_es_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "5a0825a014d313267d279ddf1b615a0b97fa023495da7843427d70b0cbe20ce0",
+"T3W1_es_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "9b94a957f6ce4e51359527a9e1da6b14bb0f38a4a08d23c52545b78fd7da048e",
+"T3W1_es_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "302a2f305abfab811b65208f9c3fb9dd9f7429b1701250554ba89a2c09610d8e",
"T3W1_es_ethereum-test_definitions.py::test_builtin": "3e73fbb7ff248b6f905fb673fbb4833b439f3794c61bb2ed623c625d5d3c8977",
"T3W1_es_ethereum-test_definitions.py::test_builtin_token": "a2c23dbd548637160e8411f1f58f9d2f532d4708fd283eb0d8660c9f4125716f",
"T3W1_es_ethereum-test_definitions.py::test_chain_id_allowed": "101bd0064cce8b108dc9fc9e230436d3570db0a2b058b984d02dcbff15bc3f81",
@@ -35152,6 +35184,8 @@
"T3W1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "f9acd2501fe5c87585bdb18a05f762db8a9a58764436f7c973aa61864e1541cb",
"T3W1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "56f458269727d9db0536a936d647fc849b670f8783960a369aa3f6757f81dc9b",
"T3W1_fr_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "48cd808193b2a5bb98c8124ca94ae83fec879eb9596cc8fc385734eacaeecd75",
+"T3W1_fr_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "822adfe6f040e1751f8125e6fab3db315552feee32547da2950dabdfd7b7fdaa",
+"T3W1_fr_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "e4b0e91de7ea3c9e641db34c1eb3327dea11f418ce4ad73dd5be7bf4e0fbf2f8",
"T3W1_fr_ethereum-test_definitions.py::test_builtin": "f61064ec7b7a38d826920a88eaec6a2d33f2b0b1c8afe44077db5bbc189bc344",
"T3W1_fr_ethereum-test_definitions.py::test_builtin_token": "4a6f638b6a1c907605e98c943c0beff671ee1f5c57a9341a1d22cdb7f20aa268",
"T3W1_fr_ethereum-test_definitions.py::test_chain_id_allowed": "304b42eb0bdb3c5f1f43f1fe94aaf160f50e50d1c6d09a0cbf5e554f59f40838",
@@ -36607,6 +36641,8 @@
"T3W1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "8821d9c52fd4ea8aa76da7e6ee9f9c8e19e0f7575d9c6c5372869a04fd1fe2ef",
"T3W1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "31e5e75e5dccdd8e745c4cf8d75b5c188e5e3b92a6537355beb1228c15b69c44",
"T3W1_pt_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "33dadb917ce0024209df3d1b3a1bfb7d7a7e5d55366e2f0585b668604b47b27c",
+"T3W1_pt_cardano-test_sign_tx.py::test_sign_tx_payment_req_failed[swap_-_multiple_outputs]": "02233cdccfcfa8e058c45563ccd58bccd022fde7773255d9597b5cf495fa1ff8",
+"T3W1_pt_cardano-test_sign_tx.py::test_signtx_payment_req[swap]": "b101bf11a0c286b9382b022a0906eee8066bee8fc3f5417e0cc971010213d8e8",
"T3W1_pt_ethereum-test_definitions.py::test_builtin": "7e9fe8c277a57101559aa0a9d9113cda29b88bb154030ec981b2bfb8c6862de7",
"T3W1_pt_ethereum-test_definitions.py::test_builtin_token": "1b6bff84230094c8575a47bc4af33693c4b69a964bc72dcd9316de930e73561e",
"T3W1_pt_ethereum-test_definitions.py::test_chain_id_allowed": "f34f9f3dd4d6c705282f0e13d2477c2bf1f8d6fb6a625985926bf0202992c235",
Why this scored 35/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.