feat(tron): add TriggerSmartContract support.
What changed, and why it matters
This commit adds support for signing TRON smart-contract calls (like USDT/USDD transfers) on Trezor hardware wallets. Because the device cannot yet decode the actual token-transfer details, users are shown only the smart-contract address and raw data, meaning they are 'blind signing' the transaction. The commit message explicitly calls this out. There is also a fee-limit check to cap how much TRX can be burned, and a fix changing some timestamp/expiration fields from signed to unsigned integers.
Treat this as a notable security-relevant feature change rather than a vulnerability. Users should be warned that TRON smart-contract signing is currently blind and should only be used with trusted contracts. Developers should prioritize the TODO to parse TRC-20 transfer details (recipient, amount, token identity) so the device can show meaningful confirmation before signing. Review the fee-limit cap and unsigned-int change for correctness against TRON protocol limits.
Security signals we found
Blind signing of smart-contract data: only contract address shown, not recipient or amount
Fee-limit cap enforced in firmware to limit TRX burn for smart-contract calls
Field type change from signed to unsigned int64 for expiration/timestamp/fee_limit
New contract type added to allowed message types and raw contract enum
TODO comment indicating amount extraction from contract.data is not yet implemented
Commit message explicitly states 'Blind signing TRON smart contracts' and 'Only contract address shown to user'
Evidence from the diff
The patch introduces TronTriggerSmartContract message handling across protobuf definitions, firmware, host libraries, and tests. In core/src/apps/tron/sign_tx.py, TriggerSmartContract transactions are processed, a fee_limit cap of 15,000,000,000 SUN is enforced, and layout.confirm_unkown_smart_contract is invoked. That layout shows an Ethereum-style ‘unknown contract’ warning, the contract address, and the raw ABI data blob. The total_send value is not extracted from contract.data (noted as TODO). The TronSignTx fields expiration, timestamp, and fee_limit are changed from sint64 to uint64, and a transfer-amount int64-max check is added. Tests and UI fixtures are updated for USDT/USDD transfer and fee-too-high cases.
Changed components
core/src/apps/tron/sign_tx.pycore/src/apps/tron/layout.pycore/src/apps/tron/consts.pycommon/protob/messages-tron.protocommon/protob/messages.protopython/src/trezorlib/tron.pypython/src/trezorlib/messages.pyrust/trezor-client generated protobuf bindingscore UI layouts for bolt/caesar/delizia/eckhartTRON device tests and fixturesInspect captured patch +877 / −171
diff --git a/common/protob/messages-tron.proto b/common/protob/messages-tron.proto
index bed48877..3df13f33 100644
--- a/common/protob/messages-tron.proto
+++ b/common/protob/messages-tron.proto
@@ -5,6 +5,8 @@ package hw.trezor.messages.tron;
option java_package = "com.satoshilabs.trezor.lib.protobuf";
option java_outer_classname = "TrezorMessageTron";
+// All uint64 are actually int64 in TRON. int64 is not supported on our firmware.
+
/**
* Request: Ask device for Tron address corresponding to address_n path
* @start
@@ -12,9 +14,9 @@ option java_outer_classname = "TrezorMessageTron";
* @next Failure
*/
message TronGetAddress {
- repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
- optional bool show_display = 2; // Optionally show on display before sending the result
- optional bool chunkify = 3; // display the address in chunks of 4 characters
+ repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
+ optional bool show_display = 2; // Optionally show on display before sending the result
+ optional bool chunkify = 3; // Display the address in chunks of 4 characters
}
/**
@@ -22,42 +24,55 @@ message TronGetAddress {
* @end
*/
message TronAddress {
- required string address = 1; // Tron address in Base58Check encoding
- optional bytes mac = 2; // Address authentication code
+ required string address = 1; // Tron address in Base58Check encoding
+ optional bytes mac = 2; // Address authentication code
}
/**
- * Request: ask device to sign Tron transaction
+ * Request: Ask device to sign Tron transaction. Provides mandatory contract-agnostic transaction details.
* @start
* @next TronContractRequest
*/
message TronSignTx {
- repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
- required bytes ref_block_bytes = 2; // The height of the transaction reference block, using the 6th to 8th (exclusive) bytes of the reference block height, a total of 2 bytes
- required bytes ref_block_hash = 3; // The hash of the transaction reference block
- required sint64 expiration = 4; // Transaction expiration time, beyond which the transaction will no longer be packed
- optional bytes data = 5; // Transaction memo. (256 bytes maximum, this is a Trezor limitation, not a Tron protocol limitation)
- required sint64 timestamp = 6; // Transaction timestamp, set as the transaction creation time
- optional sint64 fee_limit = 7; // Not TRX. Maximum Energy cost. Only for deploying or triggering smart contracts.
+ repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
+ required bytes ref_block_bytes = 2; // The height of the transaction reference block, using the 6th to 8th (exclusive) bytes of the reference block height, a total of 2 bytes
+ required bytes ref_block_hash = 3; // The hash of the transaction reference block
+ required uint64 expiration = 4; // Transaction expiration time, beyond which the transaction will no longer be packed
+ optional bytes data = 5; // Transaction memo. (256 bytes maximum, this is a Trezor limitation, not a Tron protocol limitation)
+ required uint64 timestamp = 6; // Transaction timestamp, set as the transaction creation time
+ optional uint64 fee_limit = 7; // Not TRX. Maximum Energy cost. Only for deploying or triggering smart contracts.
}
/**
- * Response: device is ready for client to send the next operation
+ * Response: Device ready to receive contract details
* @next TronTransferContract
+ * @next TronTriggerSmartContract
*/
message TronContractRequest {
}
/**
- * Request: ask device to confirm this operation type
+ * Request: Fill in TransferContract details
* @next TronSignature
*/
// https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/contract/balance_contract.proto#L32-L36
message TronTransferContract {
// https://developers.tron.network/docs/tron-contracttype#2-transfercontract
- required bytes owner_address = 1; // Sender's address, Base58Check encoding
- required bytes to_address = 2; // Recipient's address, Base58Check encoding
- required uint64 amount = 3; // Transfer amount (in SUN)
+ required bytes owner_address = 1; // Sender's address, Base58Check encoding
+ required bytes to_address = 2; // Recipient's address, Base58Check encoding
+ required uint64 amount = 3; // Transfer amount (in SUN)
+}
+
+
+/**
+ * Request: Fill in TriggerSmartContract details. TRC-10 not supported.
+ * @next TronSignature
+ */
+ //https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/contract/smart_contract.proto#L74
+message TronTriggerSmartContract {
+ required bytes owner_address = 1; // Sender account, signs transaction
+ required bytes contract_address = 2; // Target smart contract address
+ required bytes data = 4; // ABI-encoded function call data
}
/**
@@ -65,7 +80,7 @@ message TronTransferContract {
* @end
*/
message TronSignature {
- required bytes signature = 1; // Signature of the transaction
+ required bytes signature = 1; // Signature of the transaction
}
@@ -88,12 +103,13 @@ message TronRawTransaction {
message TronRawContract {
message TronRawParameter {
- required string type_url = 1; // e.g., "type.googleapis.com/protocol.TransferContract"
- required bytes value = 2; // The serialized value of the contract parameter, e.g., TronTransferContract
+ required string type_url = 1; // e.g., "type.googleapis.com/protocol.TransferContract"
+ required bytes value = 2; // The serialized value of the contract parameter, e.g., TronTransferContract
}
enum TronRawContractType {
TransferContract = 1;
+ TriggerSmartContract = 31;
}
required TronRawContractType type = 1;
@@ -101,3 +117,4 @@ message TronRawTransaction {
}
}
+
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index b76b7e26..97a4ff83 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -356,6 +356,7 @@ enum MessageType {
MessageType_TronSignature = 2203 [(wire_out) = true];
MessageType_TronContractRequest = 2204 [(wire_out) = true];
MessageType_TronTransferContract = 2205 [(wire_in) = true];
+ MessageType_TronTriggerSmartContract = 2206 [(wire_in) = true];
// Benchmark
MessageType_BenchmarkListNames = 9100 [(bitcoin_only) = true];
diff --git a/common/tests/fixtures/tron/sign_tx.json b/common/tests/fixtures/tron/sign_tx.json
index 3ed62635..acdc234b 100644
--- a/common/tests/fixtures/tron/sign_tx.json
+++ b/common/tests/fixtures/tron/sign_tx.json
@@ -217,6 +217,152 @@
"result": {
"error_message": "Tron: data field too long"
}
+ },
+ {
+ "name": "TriggerSmartContract_USDT_transfer",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "dae0",
+ "ref_block_hash": "9ab5c70b3a11405f",
+ "expiration": 1766454906000,
+ "fee_limit": 50000000,
+ "timestamp": 1766453046721
+ },
+ "contract": {
+ "_message_type": "TronTriggerSmartContract",
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a000000000000000000000000000000000000000000000000000000000013bb450",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"
+ },
+ "raw_data_hex": "0a02dae022089ab5c70b3a11405f409099abc7b4335aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a000000000000000000000000000000000000000000000000000000000013bb45070c1dbb9c6b433900180e1eb17",
+ "raw": {
+ "txID": "3b76769f2fae94ffad214967c013b714110f26c740b4bf2d5702069d125353de",
+ "raw_data": {
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a000000000000000000000000000000000000000000000000000000000013bb450",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"
+ },
+ "type_url": "type.googleapis.com/protocol.TriggerSmartContract"
+ },
+ "type": "TriggerSmartContract"
+ }
+ ],
+ "ref_block_bytes": "dae0",
+ "ref_block_hash": "9ab5c70b3a11405f",
+ "expiration": 1766454906000,
+ "fee_limit": 50000000,
+ "timestamp": 1766453046721
+ },
+ "raw_data_hex": "0a02dae022089ab5c70b3a11405f409099abc7b4335aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a000000000000000000000000000000000000000000000000000000000013bb45070c1dbb9c6b433900180e1eb17",
+ "visible": false
+ }
+ },
+ "result": {
+ "signature": "f99e2f704c78b07d49fcfa4cc7cd032635807f9a1f09b57adc2232cac38d0d42428008bd9953944e0276123ee6851a266078df9c68e5c4db158be05377dadd7b1C"
+ }
+ }
+ ,
+ {
+ "name": "TriggerSmartContract_USDD_transfer",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "30a2",
+ "ref_block_hash": "2d8cae7382b48775",
+ "expiration": 1766521434000,
+ "fee_limit": 50000000,
+ "timestamp": 1766519576813
+ },
+ "contract": {
+ "_message_type": "TronTriggerSmartContract",
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d00000",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "41d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c76"
+ },
+ "raw_data_hex": "0a0230a222082d8cae7382b487754090df87e7b4335aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a58121541d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c762244a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d0000070edb196e6b433900180e1eb17",
+ "raw": {
+ "visible": false,
+ "txID": "547eb950894b04fb3d6d66d4b34562d59525ffeef363836b0ad696f37a5d8ce6",
+ "raw_data": {
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d00000",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "41d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c76"
+ },
+ "type_url": "type.googleapis.com/protocol.TriggerSmartContract"
+ },
+ "type": "TriggerSmartContract"
+ }
+ ],
+ "ref_block_bytes": "30a2",
+ "ref_block_hash": "2d8cae7382b48775",
+ "expiration": 1766521434000,
+ "fee_limit": 50000000,
+ "timestamp": 1766519576813
+ }
+ }
+ },
+ "result": {
+ "signature": "6147d601b05fc3c2da8c33e303d4f2a866f5f6da424a87dd89c31ed92cbac204151d5ae4a316be889cc48f1cefefc742959f2eab40e62ff8a890c726dcb4be5d1B"
+ }
+ }
+ ,
+ {
+ "name": "TriggerSmartContract_USDD_fee_too_high",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "339a",
+ "ref_block_hash": "f3ac5279ff8e1b6b",
+ "expiration": 1766523738000,
+ "fee_limit": 15000000001,
+ "timestamp": 1766521878167
+ },
+ "contract": {
+ "_message_type": "TronTriggerSmartContract",
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d00000",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "41d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c76"
+ },
+ "raw_data_hex": "0a02339a2208f3ac5279ff8e1b6b4090af94e8b4335aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a58121541d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c762244a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d000007097eda2e7b433900181acc7f037",
+ "raw": {
+ "visible": false,
+ "txID": "e7bd2d37525df5734fa6f32ca5f1494e3b3ad14c5463a788eed70fcecdbb528f",
+ "raw_data": {
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "data": "a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d00000",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "contract_address": "41d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c76"
+ },
+ "type_url": "type.googleapis.com/protocol.TriggerSmartContract"
+ },
+ "type": "TriggerSmartContract"
+ }
+ ],
+ "ref_block_bytes": "339a",
+ "ref_block_hash": "f3ac5279ff8e1b6b",
+ "expiration": 1766523738000,
+ "fee_limit": 15000000001,
+ "timestamp": 1766521878167
+ },
+ "raw_data_hex": "0a02339a2208f3ac5279ff8e1b6b4090af94e8b4335aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a58121541d4a4b0bc1d69cdeb238e8604ead1b03ac0ed7c762244a9059cbb000000000000000000000000d093f24888ab06073a4bdffbb8107db1ea9dc0a0000000000000000000000000000000000000000000000001158e460913d000007097eda2e7b433900181acc7f037",
+ "visible": false
+ }
+ },
+ "result": {
+ "error_message": "Tron: fees too high"
+ }
}
]
}
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 30304476..600ad7e0 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -1004,6 +1004,7 @@ static void _librust_qstrs(void) {
MP_QSTR_words__enabled;
MP_QSTR_words__error;
MP_QSTR_words__fee;
+ MP_QSTR_words__fee_limit;
MP_QSTR_words__forget;
MP_QSTR_words__from;
MP_QSTR_words__good_to_know;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index ba31a1b0..33a8b1d1 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1560,6 +1560,7 @@ pub enum TranslatedString {
secure_sync__delegated_identity_key_thp = 1171, // "Allow {0} on {1} to use Suite Sync with this Trezor?"
secure_sync__header = 1173, // "Suite Sync"
words__note = 1174, // "Note"
+ words__fee_limit = 1175, // "Fee limit"
}
impl TranslatedString {
@@ -5077,6 +5078,7 @@ impl TranslatedString {
(Self::secure_sync__delegated_identity_key_thp, "Allow {0} on {1} to use Suite Sync with this Trezor?"),
(Self::secure_sync__header, "Suite Sync"),
(Self::words__note, "Note"),
+ (Self::words__fee_limit, "Fee limit"),
];
#[cfg(feature = "micropython")]
@@ -6573,6 +6575,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__enabled, Self::words__enabled),
(Qstr::MP_QSTR_words__error, Self::words__error),
(Qstr::MP_QSTR_words__fee, Self::words__fee),
+ (Qstr::MP_QSTR_words__fee_limit, Self::words__fee_limit),
(Qstr::MP_QSTR_words__forget, Self::words__forget),
(Qstr::MP_QSTR_words__from, Self::words__from),
(Qstr::MP_QSTR_words__good_to_know, Self::words__good_to_know),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 6a17a9fc..f4e8d8d1 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -1076,6 +1076,7 @@ class TR:
words__enabled: str = "Enabled"
words__error: str = "Error"
words__fee: str = "Fee"
+ words__fee_limit: str = "Fee limit"
words__forget: str = "Forget"
words__from: str = "from"
words__good_to_know: str = "Good to know"
diff --git a/core/src/apps/tron/README.md b/core/src/apps/tron/README.md
index 13c30694..ab0017ed 100644
--- a/core/src/apps/tron/README.md
+++ b/core/src/apps/tron/README.md
@@ -1,4 +1,4 @@
-# TRON
+# TRON [WIP]
Tron is an EVM like network that allows for nearly free token transfers like `USDT` etc. It achieves this by using `Bandwidth` and `Energy` for transfers, instead of `Gas` in Ethereum. `Bandwidth` is used for native `TRX` transfer, while `Energy` is used for `TRC-20` tokens like `Tether - USDT` etc.
@@ -17,14 +17,18 @@ The `Bandwidth` consumed for processing any transaction is equal to the size of
### Capping fees
-TRON only allows a maximum limit on the `Energy` resource using the `fee_limit` field in any transaction, and not on `TRX` or `Bandwidth`.
-Thus for native TRX transfer via `TransferContract`, we do not show any fees to the user on the device. The host application like Trezor Suite, should display potential resource consumption numbers. We can show the `fee_limit` on the device when we start supporting Smart contract calls.
+TRON only allows a maximum limit on the Energy **cost** using the `fee_limit` field in any transaction. It is displayed in `SUN` and only limits the `TRX` to be burned when the `Energy` is insufficient.
+
+TRON also allows for [energy cost sharing](https://developers.tron.network/docs/energy-consumption-mechanism#tron-energy-sharing-mechanism) between the caller and the deployer of the smartcontract. The `fee_limit` only applies to the caller.
+
+For native TRX transfer via `TransferContract`, there is no way to cap the `Bandwidth` consumption or tentative `TRX` that could be burned to make up for `Bandwidth` deficit.
+Therefore, we do not show any fees to the user on the device. The host application like Trezor Suite, should display potential resource consumption numbers.
## Features supported
- [X] Generate addresses for Receiving `TRX` or other tokens.
- [X] `TransferContract`: Sending `TRX`
-- [ ] `TriggerSmartContract`: Send `USDT`, `USDD`, etc.
+- [X] `TriggerSmartContract`: Send `USDT`, `USDD`, etc.
- [ ] `FreezeBalanceV2`: Stake `TRX` to get more `Bandwidth` or `Energy`
- [ ] `UnfreezeBalanceV2`: Unstake frozen `TRX`
@@ -33,3 +37,12 @@ Thus for native TRX transfer via `TransferContract`, we do not show any fees to
[^1]: It is encoded as a list to support multiple contracts in a transaction in future. Currently only one contract is supported per transaction.
[^2]: TRON uses block hash reference for avoiding cross-chain replay attacks unlike using chain_ID while signing [EIP-155]
[^3]: There are other fees charged for using other features like `1 TRX` for adding a `Note` to the transaction, etc.
+
+
+## Appendix
+
+### Explanation for the 2 step message
+
+- Tron using Protobuf is _almost_ a blessing.
+- The simplest design would be to send the transaction protobuf message, parse it correctly and sign it. The only missing info in that message would be the key derivation path. If we plug it in the transaction message itself, it would disturb the final protobuf encoding (There would be a way to remove it and re-encode but that's not necessarily better).
+- So the natural second idea would be to send the derivation path prior to the transaction. Having compromised with the 2 step message already, we can make it prettier by sending the 'top part' of the transaction along with the derivation path. This 'top part' is contract agnostic, thus making it a pretty denominator to any command we (will) support. The second message thus simply becomes the contract.
diff --git a/core/src/apps/tron/consts.py b/core/src/apps/tron/consts.py
index f5bfc124..105c8a4c 100644
--- a/core/src/apps/tron/consts.py
+++ b/core/src/apps/tron/consts.py
@@ -9,11 +9,15 @@ if TYPE_CHECKING:
TYPE_URL_TEMPLATE = "type.googleapis.com/protocol."
-CONTRACT_TYPES = (MessageType.TronTransferContract,)
+CONTRACT_TYPES = (
+ MessageType.TronTransferContract,
+ MessageType.TronTriggerSmartContract,
+)
# https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/Tron.proto#L339-L379
CONTRACT_TYPE_NAMES = {
1: "TransferContract",
+ 31: "TriggerSmartContract",
}
diff --git a/core/src/apps/tron/layout.py b/core/src/apps/tron/layout.py
index 45a6f408..29f52b73 100644
--- a/core/src/apps/tron/layout.py
+++ b/core/src/apps/tron/layout.py
@@ -6,7 +6,7 @@ from trezor import TR, strings
from trezor.crypto import base58
if TYPE_CHECKING:
- from trezor.messages import TronTransferContract
+ from trezor.messages import TronTransferContract, TronTriggerSmartContract
def format_trx_amount(amount: int) -> str:
@@ -16,10 +16,45 @@ def format_trx_amount(amount: int) -> str:
return f"{strings.format_amount(amount, _TRX_AMOUNT_DECIMALS)} TRX"
-async def confirm_transfer_contract(msg: TronTransferContract) -> None:
- to_address = base58.encode_check(msg.to_address)
+def format_energy_amount(amount: int) -> str:
+ return f"{strings.format_amount(amount, 0)} SUN"
+
+
+async def confirm_transfer_contract(contract: TronTransferContract) -> None:
+ to_address = base58.encode_check(contract.to_address)
await layouts.confirm_address(
TR.send__title_sending_to,
to_address,
chunkify=True,
)
+
+
+async def confirm_unkown_smart_contract(contract: TronTriggerSmartContract) -> None:
+
+ from trezor.enums import ButtonRequestType
+ from trezor.ui.layouts import (
+ confirm_address,
+ confirm_blob,
+ confirm_ethereum_unknown_contract_warning,
+ )
+
+ # TODO: Ethereum references should be given a more generic name
+ await confirm_ethereum_unknown_contract_warning(TR.words__send)
+
+ contract_address = base58.encode_check(contract.contract_address)
+ await confirm_address(
+ TR.ethereum__token_contract,
+ contract_address,
+ chunkify=True,
+ )
+
+ await confirm_blob(
+ "confirm_smart_contract_data",
+ TR.ethereum__title_input_data,
+ contract.data,
+ chunkify=False,
+ verb=TR.buttons__confirm,
+ verb_cancel=TR.send__cancel_sign,
+ br_code=ButtonRequestType.SignTx,
+ ask_pagination=True,
+ )
diff --git a/core/src/apps/tron/sign_tx.py b/core/src/apps/tron/sign_tx.py
index 1f399285..ef7f8a08 100644
--- a/core/src/apps/tron/sign_tx.py
+++ b/core/src/apps/tron/sign_tx.py
@@ -27,6 +27,7 @@ async def sign_tx(msg: TronSignTx, keychain: Keychain) -> TronSignature:
from apps.common import paths
_MAX_DATA_LENGTH = const(256)
+ _MAX_FEE_LIMIT = const(15_000_000_000) # TRON: Maximum Fee limit in SUN.
await paths.validate_path(keychain, msg.address_n)
node = keychain.derive(msg.address_n)
@@ -42,10 +43,20 @@ async def sign_tx(msg: TronSignTx, keychain: Keychain) -> TronSignature:
chunkify=False,
)
+ # https://developers.tron.network/docs/set-feelimit
+ fee_limit = msg.fee_limit or 0
+ if fee_limit > _MAX_FEE_LIMIT:
+ raise DataError("Tron: fees too high")
+
contract = await call_any(messages.TronContractRequest(), *consts.CONTRACT_TYPES)
raw_contract, total_send = await process_contract(contract)
- await confirm_tron_send(total_send)
+ fee_string = (
+ layout.format_energy_amount(fee_limit)
+ if messages.TronTriggerSmartContract.is_type_of(contract)
+ else None
+ )
+ await confirm_tron_send(total_send, fee_string)
raw_tx = messages.TronRawTransaction(
ref_block_bytes=msg.ref_block_bytes,
@@ -70,13 +81,22 @@ async def sign_tx(msg: TronSignTx, keychain: Keychain) -> TronSignature:
async def process_contract(
contract: MessageType,
-) -> tuple[TronRawContract, str]:
+) -> tuple[TronRawContract, str | None]:
from trezor.enums import TronRawContractType
+ _INT64_MAX = const(9_223_372_036_854_775_807)
+
+ total_send = None
if messages.TronTransferContract.is_type_of(contract):
contract_type = TronRawContractType.TransferContract
await layout.confirm_transfer_contract(contract)
+ if contract.amount > _INT64_MAX:
+ raise DataError("Tron: invalid transfer amount")
total_send = layout.format_trx_amount(contract.amount)
+ elif messages.TronTriggerSmartContract.is_type_of(contract):
+ contract_type = TronRawContractType.TriggerSmartContract
+ await layout.confirm_unkown_smart_contract(contract)
+ # TODO: Extract from contract.data to total_send
else:
raise DataError("Tron: contract type unknown")
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 6fd49fb8..8ec40389 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -274,3 +274,4 @@ if not utils.BITCOIN_ONLY:
TronSignature = 2203
TronContractRequest = 2204
TronTransferContract = 2205
+ TronTriggerSmartContract = 2206
diff --git a/core/src/trezor/enums/TronRawContractType.py b/core/src/trezor/enums/TronRawContractType.py
index 49e3f49d..fbe72683 100644
--- a/core/src/trezor/enums/TronRawContractType.py
+++ b/core/src/trezor/enums/TronRawContractType.py
@@ -3,3 +3,4 @@
# isort:skip_file
TransferContract = 1
+TriggerSmartContract = 31
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 9d9ae51c..7d613c40 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -373,6 +373,7 @@ if TYPE_CHECKING:
class TronRawContractType(IntEnum):
TransferContract = 1
+ TriggerSmartContract = 31
class MessageType(IntEnum):
Initialize = 0
@@ -640,6 +641,7 @@ if TYPE_CHECKING:
TronSignature = 2203
TronContractRequest = 2204
TronTransferContract = 2205
+ TronTriggerSmartContract = 2206
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 05874380..99b134c0 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -6878,6 +6878,24 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["TronTransferContract"]:
return isinstance(msg, cls)
+ class TronTriggerSmartContract(protobuf.MessageType):
+ owner_address: "AnyBytes"
+ contract_address: "AnyBytes"
+ data: "AnyBytes"
+
+ def __init__(
+ self,
+ *,
+ owner_address: "AnyBytes",
+ contract_address: "AnyBytes",
+ data: "AnyBytes",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronTriggerSmartContract"]:
+ return isinstance(msg, cls)
+
class TronSignature(protobuf.MessageType):
signature: "AnyBytes"
diff --git a/core/src/trezor/ui/layouts/bolt/__init__.py b/core/src/trezor/ui/layouts/bolt/__init__.py
index 3d55a54f..55abf3cd 100644
--- a/core/src/trezor/ui/layouts/bolt/__init__.py
+++ b/core/src/trezor/ui/layouts/bolt/__init__.py
@@ -1451,12 +1451,12 @@ if not utils.BITCOIN_ONLY:
if __debug__:
- def confirm_tron_send(amount: str) -> Awaitable[None]:
+ def confirm_tron_send(amount: str | None, fee: str | None) -> Awaitable[None]:
return _confirm_summary(
- amount,
- amount_label=f"{TR.send__total_amount}:",
- fee="",
- fee_label="",
+ amount or "",
+ amount_label=f"{TR.send__total_amount}:" if amount else "",
+ fee=fee or "",
+ fee_label=f"{TR.words__fee_limit}:" if fee else "",
extra_items=None,
br_name="confirm_tron_send",
br_code=ButtonRequestType.SignTx,
diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py
index 3c35a215..f24aef57 100644
--- a/core/src/trezor/ui/layouts/caesar/__init__.py
+++ b/core/src/trezor/ui/layouts/caesar/__init__.py
@@ -1506,13 +1506,13 @@ if not utils.BITCOIN_ONLY:
if __debug__:
- def confirm_tron_send(amount: str) -> Awaitable[None]:
+ def confirm_tron_send(amount: str | None, fee: str | None) -> Awaitable[None]:
return raise_if_not_confirmed(
trezorui_api.confirm_summary(
- amount=amount,
- amount_label=TR.send__total_amount,
- fee="",
- fee_label="",
+ amount=amount or "",
+ amount_label=TR.send__total_amount if amount else "",
+ fee=fee or "",
+ fee_label=TR.words__fee_limit if fee else "",
),
br_name="confirm_tron_send",
br_code=ButtonRequestType.SignTx,
diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py
index d7c4e5c6..59ec9f8c 100644
--- a/core/src/trezor/ui/layouts/delizia/__init__.py
+++ b/core/src/trezor/ui/layouts/delizia/__init__.py
@@ -1433,12 +1433,12 @@ if not utils.BITCOIN_ONLY:
if __debug__:
- def confirm_tron_send(amount: str) -> Awaitable[None]:
+ def confirm_tron_send(amount: str | None, fee: str | None) -> Awaitable[None]:
return _confirm_summary(
- amount,
- amount_label=TR.send__total_amount,
- fee="",
- fee_label="",
+ amount or "",
+ amount_label=TR.send__total_amount if amount else "",
+ fee=fee or "",
+ fee_label=TR.words__fee_limit if fee else "",
extra_items=None,
br_name="confirm_tron_send",
br_code=ButtonRequestType.SignTx,
diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py
index deaf604a..922a3ee1 100644
--- a/core/src/trezor/ui/layouts/eckhart/__init__.py
+++ b/core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -1466,12 +1466,12 @@ if not utils.BITCOIN_ONLY:
if __debug__:
- def confirm_tron_send(amount: str) -> Awaitable[None]:
+ def confirm_tron_send(amount: str | None, fee: str | None) -> Awaitable[None]:
return _confirm_summary(
- amount,
- amount_label=TR.send__total_amount,
- fee="",
- fee_label="",
+ amount or "",
+ TR.send__total_amount if amount else "",
+ fee or "",
+ TR.words__fee_limit if fee else "",
extra_items=None,
br_name="confirm_tron_send",
br_code=ButtonRequestType.SignTx,
diff --git a/core/translations/en.json b/core/translations/en.json
index 01f2ed0d..e945a499 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -2273,6 +2273,7 @@
"words__enabled": "Enabled",
"words__error": "Error",
"words__fee": "Fee",
+ "words__fee_limit": "Fee limit",
"words__forget": "Forget",
"words__from": "from",
"words__good_to_know": "Good to know",
diff --git a/core/translations/order.json b/core/translations/order.json
index 8e068615..2dc77955 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1173,5 +1173,6 @@
"1171": "secure_sync__delegated_identity_key_thp",
"1172": "secure_sync__evolu_node_no_optiga",
"1173": "secure_sync__header",
- "1174": "words__note"
+ "1174": "words__note",
+ "1175": "words__fee_limit"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 57b6150b..ba0a9793 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "1a2d132da4073844a409abfcfdf3846473870b745a74df7b8c82ed21a593d0c4",
- "datetime": "2026-01-06T09:22:13.403658+00:00",
- "commit": "4375c211f9dbf0f7fc9fbb2e70e60b112b83e385"
+ "merkle_root": "2cdefc083b575b3cfd4723135a04663f84de36a6940f6a16a78ec1c05fc85e1a",
+ "datetime": "2026-01-06T13:18:35.997250+00:00",
+ "commit": "20ea3aee526ded59599702390909be4f3af42199"
},
"history": [
{
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 87c79ffe..052a18f5 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -426,6 +426,7 @@ class ThpPairingMethod(IntEnum):
class TronRawContractType(IntEnum):
TransferContract = 1
+ TriggerSmartContract = 31
class MessageType(IntEnum):
@@ -694,6 +695,7 @@ class MessageType(IntEnum):
TronSignature = 2203
TronContractRequest = 2204
TronTransferContract = 2205
+ TronTriggerSmartContract = 2206
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
@@ -8628,10 +8630,10 @@ class TronSignTx(protobuf.MessageType):
1: protobuf.Field("address_n", "uint32", repeated=True, required=False, default=None),
2: protobuf.Field("ref_block_bytes", "bytes", repeated=False, required=True),
3: protobuf.Field("ref_block_hash", "bytes", repeated=False, required=True),
- 4: protobuf.Field("expiration", "sint64", repeated=False, required=True),
+ 4: protobuf.Field("expiration", "uint64", repeated=False, required=True),
5: protobuf.Field("data", "bytes", repeated=False, required=False, default=None),
- 6: protobuf.Field("timestamp", "sint64", repeated=False, required=True),
- 7: protobuf.Field("fee_limit", "sint64", repeated=False, required=False, default=None),
+ 6: protobuf.Field("timestamp", "uint64", repeated=False, required=True),
+ 7: protobuf.Field("fee_limit", "uint64", repeated=False, required=False, default=None),
}
def __init__(
@@ -8678,6 +8680,26 @@ class TronTransferContract(protobuf.MessageType):
self.amount = amount
+class TronTriggerSmartContract(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2206
+ FIELDS = {
+ 1: protobuf.Field("owner_address", "bytes", repeated=False, required=True),
+ 2: protobuf.Field("contract_address", "bytes", repeated=False, required=True),
+ 4: protobuf.Field("data", "bytes", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ owner_address: "bytes",
+ contract_address: "bytes",
+ data: "bytes",
+ ) -> None:
+ self.owner_address = owner_address
+ self.contract_address = contract_address
+ self.data = data
+
+
class TronSignature(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 2203
FIELDS = {
diff --git a/python/src/trezorlib/tron.py b/python/src/trezorlib/tron.py
index 1ea1e96d..9e42abd9 100644
--- a/python/src/trezorlib/tron.py
+++ b/python/src/trezorlib/tron.py
@@ -1,5 +1,5 @@
import io
-from typing import TYPE_CHECKING, Any, Tuple
+from typing import TYPE_CHECKING, Any, Tuple, Union
from . import messages
from .protobuf import load_message
@@ -8,7 +8,9 @@ if TYPE_CHECKING:
from .tools import Address
from .transport.session import Session
- TronMessageType = messages.TronTransferContract
+ TronMessageType = Union[
+ messages.TronTransferContract, messages.TronTriggerSmartContract
+ ]
DEFAULT_BIP32_PATH = "m/44h/195h/0h/0/0"
@@ -40,6 +42,16 @@ def from_raw_data(
owner_address=raw_contract.owner_address,
amount=raw_contract.amount,
)
+ elif contract_type == messages.TronRawContractType.TriggerSmartContract:
+ raw_contract = load_message(
+ io.BytesIO(raw_tx.contract[0].parameter.value),
+ messages.TronTriggerSmartContract,
+ )
+ contract = messages.TronTriggerSmartContract(
+ owner_address=raw_contract.owner_address,
+ contract_address=raw_contract.contract_address,
+ data=raw_contract.data,
+ )
else:
raise ValueError(f"Unsupported contract type: {contract_type}")
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 0c3a1cea..269fab7b 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -316,6 +316,7 @@ trezor_message_impl! {
TronSignature => MessageType_TronSignature,
TronContractRequest => MessageType_TronContractRequest,
TronTransferContract => MessageType_TronTransferContract,
+ TronTriggerSmartContract => MessageType_TronTriggerSmartContract,
}
#[cfg(feature = "webauthn")]
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index 57544918..5ac95f7d 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -557,6 +557,8 @@ pub enum MessageType {
MessageType_TronContractRequest = 2204,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronTransferContract)
MessageType_TronTransferContract = 2205,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronTriggerSmartContract)
+ MessageType_TronTriggerSmartContract = 2206,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_BenchmarkListNames)
MessageType_BenchmarkListNames = 9100,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_BenchmarkNames)
@@ -841,6 +843,7 @@ impl ::protobuf::Enum for MessageType {
2203 => ::std::option::Option::Some(MessageType::MessageType_TronSignature),
2204 => ::std::option::Option::Some(MessageType::MessageType_TronContractRequest),
2205 => ::std::option::Option::Some(MessageType::MessageType_TronTransferContract),
+ 2206 => ::std::option::Option::Some(MessageType::MessageType_TronTriggerSmartContract),
9100 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkListNames),
9101 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
9102 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
@@ -1116,6 +1119,7 @@ impl ::protobuf::Enum for MessageType {
"MessageType_TronSignature" => ::std::option::Option::Some(MessageType::MessageType_TronSignature),
"MessageType_TronContractRequest" => ::std::option::Option::Some(MessageType::MessageType_TronContractRequest),
"MessageType_TronTransferContract" => ::std::option::Option::Some(MessageType::MessageType_TronTransferContract),
+ "MessageType_TronTriggerSmartContract" => ::std::option::Option::Some(MessageType::MessageType_TronTriggerSmartContract),
"MessageType_BenchmarkListNames" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkListNames),
"MessageType_BenchmarkNames" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
"MessageType_BenchmarkRun" => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
@@ -1390,6 +1394,7 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_TronSignature,
MessageType::MessageType_TronContractRequest,
MessageType::MessageType_TronTransferContract,
+ MessageType::MessageType_TronTriggerSmartContract,
MessageType::MessageType_BenchmarkListNames,
MessageType::MessageType_BenchmarkNames,
MessageType::MessageType_BenchmarkRun,
@@ -1670,10 +1675,11 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_TronSignature => 262,
MessageType::MessageType_TronContractRequest => 263,
MessageType::MessageType_TronTransferContract => 264,
- MessageType::MessageType_BenchmarkListNames => 265,
- MessageType::MessageType_BenchmarkNames => 266,
- MessageType::MessageType_BenchmarkRun => 267,
- MessageType::MessageType_BenchmarkResult => 268,
+ MessageType::MessageType_TronTriggerSmartContract => 265,
+ MessageType::MessageType_BenchmarkListNames => 266,
+ MessageType::MessageType_BenchmarkNames => 267,
+ MessageType::MessageType_BenchmarkRun => 268,
+ MessageType::MessageType_BenchmarkResult => 269,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1692,7 +1698,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xfb]\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xac^\
\n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\x80\xa6\
\x1d\x01\xb0\xb5\x18\x01\x90\xb5\x18\x01\x12\x1e\n\x10MessageType_Ping\
\x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x13MessageType_S\
@@ -1995,17 +2001,18 @@ static file_descriptor_proto_data: &'static [u8] = b"\
ype_TronSignTx\x10\x9a\x11\x1a\x04\x90\xb5\x18\x01\x12$\n\x19MessageType\
_TronSignature\x10\x9b\x11\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType\
_TronContractRequest\x10\x9c\x11\x1a\x04\x98\xb5\x18\x01\x12+\n\x20Messa\
- geType_TronTransferContract\x10\x9d\x11\x1a\x04\x90\xb5\x18\x01\x12)\n\
- \x1eMessageType_BenchmarkListNames\x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\
- \n\x1aMessageType_BenchmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\
- \x18MessageType_BenchmarkRun\x10\x8eG\x1a\x04\x80\xa6\x1d\x01\x12&\n\x1b\
- MessageType_BenchmarkResult\x10\x8fG\x1a\x04\x80\xa6\x1d\x01\x1a\x08\xc8\
- \xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08G\x10J\"\x04\x08r\
- \x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\xdb\x01\"\x06\x08\xe0\
- \x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\x06\x08\xb5\x02\x10\xb8\
- \x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\x07\x10\xf7\x07\"\x06\
- \x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezor.lib.protobufB\rTrezo\
- rMessage\x80\xa6\x1d\x01\
+ geType_TronTransferContract\x10\x9d\x11\x1a\x04\x90\xb5\x18\x01\x12/\n$M\
+ essageType_TronTriggerSmartContract\x10\x9e\x11\x1a\x04\x90\xb5\x18\x01\
+ \x12)\n\x1eMessageType_BenchmarkListNames\x10\x8cG\x1a\x04\x80\xa6\x1d\
+ \x01\x12%\n\x1aMessageType_BenchmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\
+ \x01\x12#\n\x18MessageType_BenchmarkRun\x10\x8eG\x1a\x04\x80\xa6\x1d\x01\
+ \x12&\n\x1bMessageType_BenchmarkResult\x10\x8fG\x1a\x04\x80\xa6\x1d\x01\
+ \x1a\x08\xc8\xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08G\x10\
+ J\"\x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\xdb\x01\"\
+ \x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\x06\x08\xb5\
+ \x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\x07\x10\xf7\
+ \x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezor.lib.protob\
+ ufB\rTrezorMessage\x80\xa6\x1d\x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/rust/trezor-client/src/protos/generated/messages_tron.rs b/rust/trezor-client/src/protos/generated/messages_tron.rs
index 5b1ebd37..9aa286e6 100644
--- a/rust/trezor-client/src/protos/generated/messages_tron.rs
+++ b/rust/trezor-client/src/protos/generated/messages_tron.rs
@@ -449,13 +449,13 @@ pub struct TronSignTx {
// @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.ref_block_hash)
pub ref_block_hash: ::std::option::Option<::std::vec::Vec<u8>>,
// @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.expiration)
- pub expiration: ::std::option::Option<i64>,
+ pub expiration: ::std::option::Option<u64>,
// @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.data)
pub data: ::std::option::Option<::std::vec::Vec<u8>>,
// @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.timestamp)
- pub timestamp: ::std::option::Option<i64>,
+ pub timestamp: ::std::option::Option<u64>,
// @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.fee_limit)
- pub fee_limit: ::std::option::Option<i64>,
+ pub fee_limit: ::std::option::Option<u64>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronSignTx.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -544,9 +544,9 @@ impl TronSignTx {
self.ref_block_hash.take().unwrap_or_else(|| ::std::vec::Vec::new())
}
- // required sint64 expiration = 4;
+ // required uint64 expiration = 4;
- pub fn expiration(&self) -> i64 {
+ pub fn expiration(&self) -> u64 {
self.expiration.unwrap_or(0)
}
@@ -559,7 +559,7 @@ impl TronSignTx {
}
// Param is passed by value, moved
- pub fn set_expiration(&mut self, v: i64) {
+ pub fn set_expiration(&mut self, v: u64) {
self.expiration = ::std::option::Option::Some(v);
}
@@ -599,9 +599,9 @@ impl TronSignTx {
self.data.take().unwrap_or_else(|| ::std::vec::Vec::new())
}
- // required sint64 timestamp = 6;
+ // required uint64 timestamp = 6;
- pub fn timestamp(&self) -> i64 {
+ pub fn timestamp(&self) -> u64 {
self.timestamp.unwrap_or(0)
}
@@ -614,13 +614,13 @@ impl TronSignTx {
}
// Param is passed by value, moved
- pub fn set_timestamp(&mut self, v: i64) {
+ pub fn set_timestamp(&mut self, v: u64) {
self.timestamp = ::std::option::Option::Some(v);
}
- // optional sint64 fee_limit = 7;
+ // optional uint64 fee_limit = 7;
- pub fn fee_limit(&self) -> i64 {
+ pub fn fee_limit(&self) -> u64 {
self.fee_limit.unwrap_or(0)
}
@@ -633,7 +633,7 @@ impl TronSignTx {
}
// Param is passed by value, moved
- pub fn set_fee_limit(&mut self, v: i64) {
+ pub fn set_fee_limit(&mut self, v: u64) {
self.fee_limit = ::std::option::Option::Some(v);
}
@@ -718,16 +718,16 @@ impl ::protobuf::Message for TronSignTx {
self.ref_block_hash = ::std::option::Option::Some(is.read_bytes()?);
},
32 => {
- self.expiration = ::std::option::Option::Some(is.read_sint64()?);
+ self.expiration = ::std::option::Option::Some(is.read_uint64()?);
},
42 => {
self.data = ::std::option::Option::Some(is.read_bytes()?);
},
48 => {
- self.timestamp = ::std::option::Option::Some(is.read_sint64()?);
+ self.timestamp = ::std::option::Option::Some(is.read_uint64()?);
},
56 => {
- self.fee_limit = ::std::option::Option::Some(is.read_sint64()?);
+ self.fee_limit = ::std::option::Option::Some(is.read_uint64()?);
},
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
@@ -751,16 +751,16 @@ impl ::protobuf::Message for TronSignTx {
my_size += ::protobuf::rt::bytes_size(3, &v);
}
if let Some(v) = self.expiration {
- my_size += ::protobuf::rt::sint64_size(4, v);
+ my_size += ::protobuf::rt::uint64_size(4, v);
}
if let Some(v) = self.data.as_ref() {
my_size += ::protobuf::rt::bytes_size(5, &v);
}
if let Some(v) = self.timestamp {
- my_size += ::protobuf::rt::sint64_size(6, v);
+ my_size += ::protobuf::rt::uint64_size(6, v);
}
if let Some(v) = self.fee_limit {
- my_size += ::protobuf::rt::sint64_size(7, v);
+ my_size += ::protobuf::rt::uint64_size(7, v);
}
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32);
@@ -778,16 +778,16 @@ impl ::protobuf::Message for TronSignTx {
os.write_bytes(3, v)?;
}
if let Some(v) = self.expiration {
- os.write_sint64(4, v)?;
+ os.write_uint64(4, v)?;
}
if let Some(v) = self.data.as_ref() {
os.write_bytes(5, v)?;
}
if let Some(v) = self.timestamp {
- os.write_sint64(6, v)?;
+ os.write_uint64(6, v)?;
}
if let Some(v) = self.fee_limit {
- os.write_sint64(7, v)?;
+ os.write_uint64(7, v)?;
}
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
@@ -1209,6 +1209,281 @@ impl ::protobuf::reflect::ProtobufValue for TronTransferContract {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronTriggerSmartContract)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronTriggerSmartContract {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTriggerSmartContract.owner_address)
+ pub owner_address: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTriggerSmartContract.contract_address)
+ pub contract_address: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTriggerSmartContract.data)
+ pub data: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronTriggerSmartContract.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronTriggerSmartContract {
+ fn default() -> &'a TronTriggerSmartContract {
+ <TronTriggerSmartContract as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronTriggerSmartContract {
+ pub fn new() -> TronTriggerSmartContract {
+ ::std::default::Default::default()
+ }
+
+ // required bytes owner_address = 1;
+
+ pub fn owner_address(&self) -> &[u8] {
+ match self.owner_address.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_owner_address(&mut self) {
+ self.owner_address = ::std::option::Option::None;
+ }
+
+ pub fn has_owner_address(&self) -> bool {
+ self.owner_address.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_owner_address(&mut self, v: ::std::vec::Vec<u8>) {
+ self.owner_address = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_owner_address(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.owner_address.is_none() {
+ self.owner_address = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.owner_address.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_owner_address(&mut self) -> ::std::vec::Vec<u8> {
+ self.owner_address.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required bytes contract_address = 2;
+
+ pub fn contract_address(&self) -> &[u8] {
+ match self.contract_address.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_contract_address(&mut self) {
+ self.contract_address = ::std::option::Option::None;
+ }
+
+ pub fn has_contract_address(&self) -> bool {
+ self.contract_address.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_contract_address(&mut self, v: ::std::vec::Vec<u8>) {
+ self.contract_address = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_contract_address(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.contract_address.is_none() {
+ self.contract_address = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.contract_address.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_contract_address(&mut self) -> ::std::vec::Vec<u8> {
+ self.contract_address.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required bytes data = 4;
+
+ pub fn data(&self) -> &[u8] {
+ match self.data.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_data(&mut self) {
+ self.data = ::std::option::Option::None;
+ }
+
+ pub fn has_data(&self) -> bool {
+ self.data.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_data(&mut self, v: ::std::vec::Vec<u8>) {
+ self.data = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_data(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.data.is_none() {
+ self.data = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.data.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_data(&mut self) -> ::std::vec::Vec<u8> {
+ self.data.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(3);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "owner_address",
+ |m: &TronTriggerSmartContract| { &m.owner_address },
+ |m: &mut TronTriggerSmartContract| { &mut m.owner_address },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "contract_address",
+ |m: &TronTriggerSmartContract| { &m.contract_address },
+ |m: &mut TronTriggerSmartContract| { &mut m.contract_address },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "data",
+ |m: &TronTriggerSmartContract| { &m.data },
+ |m: &mut TronTriggerSmartContract| { &mut m.data },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronTriggerSmartContract>(
+ "TronTriggerSmartContract",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronTriggerSmartContract {
+ const NAME: &'static str = "TronTriggerSmartContract";
+
+ fn is_initialized(&self) -> bool {
+ if self.owner_address.is_none() {
+ return false;
+ }
+ if self.contract_address.is_none() {
+ return false;
+ }
+ if self.data.is_none() {
+ return false;
+ }
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ 10 => {
+ self.owner_address = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 18 => {
+ self.contract_address = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 34 => {
+ self.data = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ tag => {
+ ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+ },
+ };
+ }
+ ::std::result::Result::Ok(())
+ }
+
+ // Compute sizes of nested messages
+ #[allow(unused_variables)]
+ fn compute_size(&self) -> u64 {
+ let mut my_size = 0;
+ if let Some(v) = self.owner_address.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(1, &v);
+ }
+ if let Some(v) = self.contract_address.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(2, &v);
+ }
+ if let Some(v) = self.data.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(4, &v);
+ }
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ if let Some(v) = self.owner_address.as_ref() {
+ os.write_bytes(1, v)?;
+ }
+ if let Some(v) = self.contract_address.as_ref() {
+ os.write_bytes(2, v)?;
+ }
+ if let Some(v) = self.data.as_ref() {
+ os.write_bytes(4, v)?;
+ }
+ os.write_unknown_fields(self.special_fields.unknown_fields())?;
+ ::std::result::Result::Ok(())
+ }
+
+ fn special_fields(&self) -> &::protobuf::SpecialFields {
+ &self.special_fields
+ }
+
+ fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+ &mut self.special_fields
+ }
+
+ fn new() -> TronTriggerSmartContract {
+ TronTriggerSmartContract::new()
+ }
+
+ fn clear(&mut self) {
+ self.owner_address = ::std::option::Option::None;
+ self.contract_address = ::std::option::Option::None;
+ self.data = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronTriggerSmartContract {
+ static instance: TronTriggerSmartContract = TronTriggerSmartContract {
+ owner_address: ::std::option::Option::None,
+ contract_address: ::std::option::Option::None,
+ data: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronTriggerSmartContract {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| file_descriptor().message_by_package_relative_name("TronTriggerSmartContract").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronTriggerSmartContract {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronTriggerSmartContract {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronSignature)
#[derive(PartialEq,Clone,Default,Debug)]
pub struct TronSignature {
@@ -2184,6 +2459,8 @@ pub mod tron_raw_transaction {
pub enum TronRawContractType {
// @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.TransferContract)
TransferContract = 1,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.TriggerSmartContract)
+ TriggerSmartContract = 31,
}
impl ::protobuf::Enum for TronRawContractType {
@@ -2196,6 +2473,7 @@ pub mod tron_raw_transaction {
fn from_i32(value: i32) -> ::std::option::Option<TronRawContractType> {
match value {
1 => ::std::option::Option::Some(TronRawContractType::TransferContract),
+ 31 => ::std::option::Option::Some(TronRawContractType::TriggerSmartContract),
_ => ::std::option::Option::None
}
}
@@ -2203,12 +2481,14 @@ pub mod tron_raw_transaction {
fn from_str(str: &str) -> ::std::option::Option<TronRawContractType> {
match str {
"TransferContract" => ::std::option::Option::Some(TronRawContractType::TransferContract),
+ "TriggerSmartContract" => ::std::option::Option::Some(TronRawContractType::TriggerSmartContract),
_ => ::std::option::Option::None
}
}
const VALUES: &'static [TronRawContractType] = &[
TronRawContractType::TransferContract,
+ TronRawContractType::TriggerSmartContract,
];
}
@@ -2221,6 +2501,7 @@ pub mod tron_raw_transaction {
fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {
let index = match self {
TronRawContractType::TransferContract => 0,
+ TronRawContractType::TriggerSmartContract => 1,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -2250,28 +2531,32 @@ static file_descriptor_proto_data: &'static [u8] = b"\
R\x03mac\"\xe6\x01\n\nTronSignTx\x12\x1b\n\taddress_n\x18\x01\x20\x03(\r\
R\x08addressN\x12&\n\x0fref_block_bytes\x18\x02\x20\x02(\x0cR\rrefBlockB\
ytes\x12$\n\x0eref_block_hash\x18\x03\x20\x02(\x0cR\x0crefBlockHash\x12\
- \x1e\n\nexpiration\x18\x04\x20\x02(\x12R\nexpiration\x12\x12\n\x04data\
- \x18\x05\x20\x01(\x0cR\x04data\x12\x1c\n\ttimestamp\x18\x06\x20\x02(\x12\
- R\ttimestamp\x12\x1b\n\tfee_limit\x18\x07\x20\x01(\x12R\x08feeLimit\"\
+ \x1e\n\nexpiration\x18\x04\x20\x02(\x04R\nexpiration\x12\x12\n\x04data\
+ \x18\x05\x20\x01(\x0cR\x04data\x12\x1c\n\ttimestamp\x18\x06\x20\x02(\x04\
+ R\ttimestamp\x12\x1b\n\tfee_limit\x18\x07\x20\x01(\x04R\x08feeLimit\"\
\x15\n\x13TronContractRequest\"r\n\x14TronTransferContract\x12#\n\rowner\
_address\x18\x01\x20\x02(\x0cR\x0cownerAddress\x12\x1d\n\nto_address\x18\
\x02\x20\x02(\x0cR\ttoAddress\x12\x16\n\x06amount\x18\x03\x20\x02(\x04R\
- \x06amount\"-\n\rTronSignature\x12\x1c\n\tsignature\x18\x01\x20\x02(\x0c\
- R\tsignature\"\x81\x05\n\x12TronRawTransaction\x12&\n\x0fref_block_bytes\
+ \x06amount\"~\n\x18TronTriggerSmartContract\x12#\n\rowner_address\x18\
+ \x01\x20\x02(\x0cR\x0cownerAddress\x12)\n\x10contract_address\x18\x02\
+ \x20\x02(\x0cR\x0fcontractAddress\x12\x12\n\x04data\x18\x04\x20\x02(\x0c\
+ R\x04data\"-\n\rTronSignature\x12\x1c\n\tsignature\x18\x01\x20\x02(\x0cR\
+ \tsignature\"\x9b\x05\n\x12TronRawTransaction\x12&\n\x0fref_block_bytes\
\x18\x01\x20\x02(\x0cR\rrefBlockBytes\x12$\n\x0eref_block_hash\x18\x04\
\x20\x02(\x0cR\x0crefBlockHash\x12\x1e\n\nexpiration\x18\x08\x20\x02(\
\x04R\nexpiration\x12\x12\n\x04data\x18\n\x20\x01(\x0cR\x04data\x12W\n\
\x08contract\x18\x0b\x20\x03(\x0b2;.hw.trezor.messages.tron.TronRawTrans\
action.TronRawContractR\x08contract\x12\x1c\n\ttimestamp\x18\x0e\x20\x02\
(\x04R\ttimestamp\x12\x1b\n\tfee_limit\x18\x12\x20\x01(\x04R\x08feeLimit\
- \x1a\xd4\x02\n\x0fTronRawContract\x12c\n\x04type\x18\x01\x20\x02(\x0e2O.\
+ \x1a\xee\x02\n\x0fTronRawContract\x12c\n\x04type\x18\x01\x20\x02(\x0e2O.\
hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContra\
ctTypeR\x04type\x12j\n\tparameter\x18\x02\x20\x02(\x0b2L.hw.trezor.messa\
ges.tron.TronRawTransaction.TronRawContract.TronRawParameterR\tparameter\
\x1aC\n\x10TronRawParameter\x12\x19\n\x08type_url\x18\x01\x20\x02(\tR\
- \x07typeUrl\x12\x14\n\x05value\x18\x02\x20\x02(\x0cR\x05value\"+\n\x13Tr\
- onRawContractType\x12\x14\n\x10TransferContract\x10\x01B8\n#com.satoshil\
- abs.trezor.lib.protobufB\x11TrezorMessageTron\
+ \x07typeUrl\x12\x14\n\x05value\x18\x02\x20\x02(\x0cR\x05value\"E\n\x13Tr\
+ onRawContractType\x12\x14\n\x10TransferContract\x10\x01\x12\x18\n\x14Tri\
+ ggerSmartContract\x10\x1fB8\n#com.satoshilabs.trezor.lib.protobufB\x11Tr\
+ ezorMessageTron\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -2289,12 +2574,13 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
file_descriptor.get(|| {
let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
let mut deps = ::std::vec::Vec::with_capacity(0);
- let mut messages = ::std::vec::Vec::with_capacity(9);
+ let mut messages = ::std::vec::Vec::with_capacity(10);
messages.push(TronGetAddress::generated_message_descriptor_data());
messages.push(TronAddress::generated_message_descriptor_data());
messages.push(TronSignTx::generated_message_descriptor_data());
messages.push(TronContractRequest::generated_message_descriptor_data());
messages.push(TronTransferContract::generated_message_descriptor_data());
+ messages.push(TronTriggerSmartContract::generated_message_descriptor_data());
messages.push(TronSignature::generated_message_descriptor_data());
messages.push(TronRawTransaction::generated_message_descriptor_data());
messages.push(tron_raw_transaction::TronRawContract::generated_message_descriptor_data());
diff --git a/tests/device_tests/tron/test_sign_tx.py b/tests/device_tests/tron/test_sign_tx.py
index 158d6295..a1a9e27a 100644
--- a/tests/device_tests/tron/test_sign_tx.py
+++ b/tests/device_tests/tron/test_sign_tx.py
@@ -9,12 +9,23 @@ from trezorlib.exceptions import Cancelled, TrezorFailure
from trezorlib.tools import parse_path
from ...common import COMMON_FIXTURES_DIR, parametrize_using_common_fixtures
+from ...input_flows import InputFlowConfirmAllWarnings
pytestmark = [pytest.mark.altcoin, pytest.mark.tron, pytest.mark.models("core")]
@parametrize_using_common_fixtures("tron/sign_tx.json")
-def test_sign_tx(session: Session, parameters, result):
+def test_sign_tx(session: Session, parameters: dict, result: dict):
+ input_flow = (
+ InputFlowConfirmAllWarnings(session.client).get()
+ if not session.client.debug.legacy_debug
+ else None
+ )
+ _do_test_signtx(session, parameters, result, input_flow)
+
+
+def _do_test_signtx(session: Session, parameters: dict, result: dict, input_flow=None):
+
address_n = parse_path(parameters["address_n"])
tx = protobuf.dict_to_proto(messages.TronSignTx, parameters["tx"])
contract = make_contract(parameters["contract"])
@@ -26,17 +37,23 @@ def test_sign_tx(session: Session, parameters, result):
assert parsed_contract == contract
if "signature" in result:
- response = tron.sign_tx(session, tx, contract, address_n)
- assert response.signature == binascii.unhexlify(result["signature"])
+ with session.client as client:
+ client.set_input_flow(input_flow)
+ response = tron.sign_tx(session, tx, contract, address_n)
+ assert response.signature == binascii.unhexlify(result["signature"])
elif "error_message" in result:
- with pytest.raises(TrezorFailure, match=result["error_message"]):
+ with (
+ pytest.raises(TrezorFailure, match=result["error_message"]),
+ session.client as client,
+ ):
+ client.set_input_flow(input_flow)
tron.sign_tx(session, tx, contract, address_n)
else:
assert False, "Invalid expected result"
-def test_cancel_transfer(session: Session):
- tx, contract, address_n = build_from_fixture("TransferContract")
+def _do_cancel_sign_tx(session: Session, fixture: str):
+ tx, contract, address_n = build_from_fixture(fixture)
def input_flow():
yield
@@ -47,16 +64,16 @@ def test_cancel_transfer(session: Session):
tron.sign_tx(session, tx, contract, address_n)
-def test_cancel_transfer_with_note(session: Session):
- tx, contract, address_n = build_from_fixture("Note_hello_world")
-
- def input_flow():
- yield
- session.cancel()
-
- with pytest.raises(Cancelled), session.client as client:
- client.set_input_flow(input_flow)
- tron.sign_tx(session, tx, contract, address_n)
+@pytest.mark.parametrize(
+ "fixture",
+ [
+ "TransferContract",
+ "Note_hello_world",
+ "TriggerSmartContract_USDT_transfer",
+ ],
+)
+def test_cancel_sign_tx(session: Session, fixture: str):
+ _do_cancel_sign_tx(session, fixture)
def make_contract(contract):
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index 07a7053d..f822f024 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -2691,13 +2691,17 @@
"T2T1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "56ae0ccc765b67aa0e2bd67ac2e4e039ff2504d5a71ce67512a92c9c1bc3ddc2",
"T2T1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "e1ce9860a9ce0e196346d80958e17be96b6b128113eaad0e0d2b3a5fd379f59c",
"T2T1_cs_tron-test_get_address.py::test_invalid_path": "32d380b2c0942f8a2ab6a32e0e4c8a2ad2ab6750ee39c6fa4d4f0bacf59a4b7c",
-"T2T1_cs_tron-test_sign_tx.py::test_cancel_transfer": "42ae9120c9684d6399c7d1f8000a5ba5963ab4da8d0d3dd76f1ddfdea4dea931",
-"T2T1_cs_tron-test_sign_tx.py::test_cancel_transfer_with_note": "34f9379944aeaef6ba731541045ca6f6326598eb8e63eb88f0e1f99e81f54cb2",
+"T2T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "34f9379944aeaef6ba731541045ca6f6326598eb8e63eb88f0e1f99e81f54cb2",
+"T2T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "42ae9120c9684d6399c7d1f8000a5ba5963ab4da8d0d3dd76f1ddfdea4dea931",
+"T2T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "7bd9b7e78060b05a9d46c8175bef847c8413394fa2aff4fc9d66e4d5042b2f63",
"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "ce1d37701ed6e24fae914d785f913be0dbc85b42df23c71db22c0fe852a6ed6d",
"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "e77dd0ac01dc570f54b85ea822492ac60481bdbafae391ca1e88a1d35b0cf013",
"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "32d380b2c0942f8a2ab6a32e0e4c8a2ad2ab6750ee39c6fa4d4f0bacf59a4b7c",
"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "ee8723276bc61d51e5dcfe733f14d05634d61bf7da21fed8a7803e5fa8264278",
"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "34e4b048b1e42bbc142b16178091d19f8a2a49a642534c7c8c72bfab8ecbe35d",
+"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "32d380b2c0942f8a2ab6a32e0e4c8a2ad2ab6750ee39c6fa4d4f0bacf59a4b7c",
+"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "b1384bff6c7934ee35a46dde157773df420af406faa5e7f83799d58c72a66930",
+"T2T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "a722e915d7256badb17722dbd5e65ea993279e4a923583ec5973e8cbb003bf27",
"T2T1_cs_webauthn-test_msg_webauthn.py::test_add_remove": "98ce38f5635ac1db1c1003685df0f823fadaaea5ea369ed0cdc7bd9e40659d16",
"T2T1_cs_webauthn-test_u2f_counter.py::test_u2f_counter": "af84cf50468fbeac774c36ef29be10ebae747d6a2c1a0e46e7118c4d7e1070b9",
"T2T1_cs_zcash-test_sign_tx.py::test_external_presigned": "145147ce9825018ce234c9c16c8881818061cca23fa4254d55e04ccc3714d443",
@@ -4272,13 +4276,17 @@
"T2T1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "b64868edac0028e8da185bb7cbb6121cfefcbc603293d7e9aa909e9dbd4cd44c",
"T2T1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "3c8d44b7abf4ad6dd53df2a8fdd29787d0b6ee2b0a65029563b9fb3fe2d72d6b",
"T2T1_de_tron-test_get_address.py::test_invalid_path": "a3edf3ced8fa1fa6b9f67f869a28bc880ce5e214b0adfaf839cd867875845912",
-"T2T1_de_tron-test_sign_tx.py::test_cancel_transfer": "c096a5ecea3a94bbc46143820d40276947f02f283b0c22ed48e8864fedf43e31",
-"T2T1_de_tron-test_sign_tx.py::test_cancel_transfer_with_note": "d9383bc8d493b4148b66a48fbaccb250b2734cc8c199cd80496bad4ae0555392",
+"T2T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "d9383bc8d493b4148b66a48fbaccb250b2734cc8c199cd80496bad4ae0555392",
+"T2T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "c096a5ecea3a94bbc46143820d40276947f02f283b0c22ed48e8864fedf43e31",
+"T2T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "86a66e69d903fa57817024655b88fc566d0a733b92c14763ef15030d97bdefee",
"T2T1_de_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "af363acc6d819d7998327787a42b6d7bcdacd16ffe4c287f58b7ef76765fd4d4",
"T2T1_de_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "5ed0e9de14a940d605e119e9b2fc1797e0aa434bbc06148dc258473a70a58d66",
"T2T1_de_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "a3edf3ced8fa1fa6b9f67f869a28bc880ce5e214b0adfaf839cd867875845912",
"T2T1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "b4131def63ade4bd7cc650ec4a32b2d96285e9dc3771bc85cd9d70b41a480e26",
"T2T1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "957324d0fb06f51cf99c2f3d2a5f6ac7bf6cb943a9f93965c8d4fc3a158a0fab",
+"T2T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "a3edf3ced8fa1fa6b9f67f869a28bc880ce5e214b0adfaf839cd867875845912",
+"T2T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "5cb9bdad0df8bd925830d493eb54296c4dc5156918f5b7e59e224318f0759785",
+"T2T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "e5438bd8aca4e363e711c7e7b514ed699e608332fc9d2b36f14127cd2f13bb4f",
"T2T1_de_webauthn-test_msg_webauthn.py::test_add_remove": "82e777aadabc585da236cdade17db8d98814221c331d9e18cfeafd5b9d6b4322",
"T2T1_de_webauthn-test_u2f_counter.py::test_u2f_counter": "f421530e66cc9657f68cb9fdba5e92d29a0a02ec50c35059e898cffeeef1217a",
"T2T1_de_zcash-test_sign_tx.py::test_external_presigned": "450dbdcd5ef0c579701d7572ac43de8809dff41929ea697eb270bafdea0b0268",
@@ -5853,13 +5861,17 @@
"T2T1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "c2816c52bf151db0e05cd8b516a4e8f3cfdc0f7023663932c7406465fda77348",
"T2T1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "9e95307d17f2a6d4008c51ba425b5d3733f892a9e7bd58aa17bb81ed73246249",
"T2T1_en_tron-test_get_address.py::test_invalid_path": "8b1ccc0dbd6e6e3d02a896650ab90dd332ba4edbbcc4095e0fbb6a96e5256f75",
-"T2T1_en_tron-test_sign_tx.py::test_cancel_transfer": "253f793c76f1d12726600114e598741cc91529df36b5820b5d7fd6d80ff53736",
-"T2T1_en_tron-test_sign_tx.py::test_cancel_transfer_with_note": "4a1ee9e18ac119ad6327008f96964676daafe7db3b42713915d877661e60730f",
+"T2T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "4a1ee9e18ac119ad6327008f96964676daafe7db3b42713915d877661e60730f",
+"T2T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "253f793c76f1d12726600114e598741cc91529df36b5820b5d7fd6d80ff53736",
+"T2T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "57235a07005c5fc035c73ec53249c05d817dbb76332f44844c5ad9c2312c2a71",
"T2T1_en_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "dfa388e99e97dbca5309a0ee7603e3e3fc6cce4fc129d062a1bac384eecc14c4",
"T2T1_en_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "2ad2d76dd6c5830f3ae206390d14acdf5268e2f59e85f97ee8af8735475b906e",
"T2T1_en_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "8b1ccc0dbd6e6e3d02a896650ab90dd332ba4edbbcc4095e0fbb6a96e5256f75",
"T2T1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "0ddfdb83078922b057cd849a9e6a08ddac803d2c49034743439c96b3b659fb44",
"T2T1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "30a10f207067a9b36a9b9dff2f2b1c2a6e8aedfb09422b0e2bfc966e475a7b28",
+"T2T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "8b1ccc0dbd6e6e3d02a896650ab90dd332ba4edbbcc4095e0fbb6a96e5256f75",
+"T2T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "2d793998203f8fca2ffbf741a4ffd6ea68e9ae8d78267c90608b40d8ff1859dc",
+"T2T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "830ff8005a67e4c714f12f88aca8bcbb3469c991a0eae6108a29d1ce4c2ecf6d",
"T2T1_en_webauthn-test_msg_webauthn.py::test_add_remove": "3e750190e9608a1ea76f00e5ec220576cc7842567c1f01c61a1d5b11ed3ed7c2",
"T2T1_en_webauthn-test_u2f_counter.py::test_u2f_counter": "f740248e1b4e4289052807569a0a1defdd88d8fc0532a47850da0ea26277276d",
"T2T1_en_zcash-test_sign_tx.py::test_external_presigned": "2492bd16ea82738cec9778d3afed746d21da8181d7e2782b701fa240dffbb42a",
@@ -7452,13 +7464,17 @@
"T2T1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "c1b1c53d814f7818bc9d7589254c96c3e429d611aa9c889058c9f31eb3f57418",
"T2T1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "7489765b62b5642035727ad3f63702270f13ea0dffff0f996b430ae6dd22fb57",
"T2T1_es_tron-test_get_address.py::test_invalid_path": "1775658fa541fff7933453c1d346449c492079a39341e07135ac9e7662b3bbd3",
-"T2T1_es_tron-test_sign_tx.py::test_cancel_transfer": "554bba8d977403963f9e50a7d046291d8c08a7d4387763de9b33b5ad7c03c874",
-"T2T1_es_tron-test_sign_tx.py::test_cancel_transfer_with_note": "d63a4ae6415ec79245006513fa02ead82d5bbed86516419a68749210665b2658",
+"T2T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "d63a4ae6415ec79245006513fa02ead82d5bbed86516419a68749210665b2658",
+"T2T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "554bba8d977403963f9e50a7d046291d8c08a7d4387763de9b33b5ad7c03c874",
+"T2T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "717fd06f98afd710b84256debaed64be91168501ae5b03bad5dc0ceb98cc37ec",
"T2T1_es_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "a932057860a7c099285f764c35f74d80f2572457a0b833ff58360ae08db89858",
"T2T1_es_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "e3d35699793dd38d0cad304a19347c465060aa21f66942c14bfc42c8c0f86fce",
"T2T1_es_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "1775658fa541fff7933453c1d346449c492079a39341e07135ac9e7662b3bbd3",
"T2T1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "eb210fa72b8a9877db37137edc58cfbbb22e09c0107b519eef28ab175499fce8",
"T2T1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "307c712ca35c9b6e9b2715a09e70b2644dd048d762eabf80f9a60211e6c66586",
+"T2T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "1775658fa541fff7933453c1d346449c492079a39341e07135ac9e7662b3bbd3",
+"T2T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "ff8a6f2e3c240ec33d18c383754457ee6033a474cd94dff9431733e41e26a3df",
+"T2T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "7fa2a0d3043c98009659b817823909e6f374030459da112fb893a7413524168a",
"T2T1_es_webauthn-test_msg_webauthn.py::test_add_remove": "8678ef3a2a2bce13a5bfad6696800f0f8f925c5ee6a94355e567a4d902642328",
"T2T1_es_webauthn-test_u2f_counter.py::test_u2f_counter": "3f0e81d8c7cab7e9f5d78adbf15d25c4f91a82ea42f46a423b545045030a9603",
"T2T1_es_zcash-test_sign_tx.py::test_external_presigned": "9f681299b9f1120944d4add7c73237fddb7a9c72b0f8b316132771812b607a61",
@@ -9033,13 +9049,17 @@
"T2T1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "3ae35d1e13c4c5dcda9a0caccb2948d66928d3141f8aade981775dea5df32a50",
"T2T1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "7b10049f50395f088522f10a6eeb0ed2c7917243897ad5a0cdc9320e84798737",
"T2T1_fr_tron-test_get_address.py::test_invalid_path": "94d3ba1cba15b836e6ebc48ab307aeea71275ef2d9849aaabc8e883df555ce3f",
-"T2T1_fr_tron-test_sign_tx.py::test_cancel_transfer": "096714bb08ab431e5e4fca74b9e76f98b9b1e6a7fde74903e05163084ad9727d",
-"T2T1_fr_tron-test_sign_tx.py::test_cancel_transfer_with_note": "b0eeb08ae7f983b1485a667e77ab0b01b48ee0a20345e9a731f1c1f624c92bc4",
+"T2T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "b0eeb08ae7f983b1485a667e77ab0b01b48ee0a20345e9a731f1c1f624c92bc4",
+"T2T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "096714bb08ab431e5e4fca74b9e76f98b9b1e6a7fde74903e05163084ad9727d",
+"T2T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "bbbf3347ef2407db31e88b469ec816e786d61d4290d61770fd2bbaa6d33b1112",
"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "287fa869188391ee21cb7e1ce0c85155ee26f6665ac716694880689ef5fede60",
"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "2f96a34598542838bf3b50f2fd0138a3d2c65cea4a4e3491835c6aab81bec746",
"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "94d3ba1cba15b836e6ebc48ab307aeea71275ef2d9849aaabc8e883df555ce3f",
"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "fe57641979862f7b9a2fc06fbf760e391a790bfa161bbe753ee51cdb3a2de37f",
"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "17fa6c84be11ce51389042d3ea59f5d868e187d24a06d2d2039e54e495ae8772",
+"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "94d3ba1cba15b836e6ebc48ab307aeea71275ef2d9849aaabc8e883df555ce3f",
+"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "9103cfea59f64c1b2c6cedee321df20d82ecf03660a338e209d624398800cd7f",
+"T2T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "b021dac3afcc34395e09fed798bd54af1f90591fb113711662e30fabd5e24d19",
"T2T1_fr_webauthn-test_msg_webauthn.py::test_add_remove": "325b695f038f917d0c4ba40ac7abfeaaa8531be5e59154bee5859dce133cc41d",
"T2T1_fr_webauthn-test_u2f_counter.py::test_u2f_counter": "34a31a6a0c500259f8c30e801a242e1bcf4baff98fb03af3c87e2a00fca556d1",
"T2T1_fr_zcash-test_sign_tx.py::test_external_presigned": "f961e642c7694e827cb9182950cf5dda35adcb64c3ba44b98fa92656356b87f6",
@@ -10614,13 +10634,17 @@
"T2T1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "2a7a877b0fcca09070f1714e8c05db246cf710f09a3c32d703775b3d557f71b7",
"T2T1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "34312b7f745970415477fba537d394516c72c4e16c60a02b2bb8a90a9b120d29",
"T2T1_pt_tron-test_get_address.py::test_invalid_path": "e9e80e1bfd347b598699a7a84deb8932eff90fc5fb8b56771453e06fe3c4c216",
-"T2T1_pt_tron-test_sign_tx.py::test_cancel_transfer": "33a9ba21b5bc5e99f468eaef6f824cecee7745971fb713e0142bd6b9feafaadc",
-"T2T1_pt_tron-test_sign_tx.py::test_cancel_transfer_with_note": "fe6ef78cf0650fd4b21f7966539201dd3613d472b10ddc91041fd7655dc29a40",
+"T2T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "fe6ef78cf0650fd4b21f7966539201dd3613d472b10ddc91041fd7655dc29a40",
+"T2T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "33a9ba21b5bc5e99f468eaef6f824cecee7745971fb713e0142bd6b9feafaadc",
+"T2T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "2b6ed7140f893c13af599a049d7bdfa176b62984404e2a7e8e147668e007a901",
"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "5c6c05aee73ae8e374aa6cb40b284420e4713abe5922fe1bd91b3dc45f47f42a",
"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "67abb17e8d8a8601d6b56bb2a25ed49869dc4cfe2acf905d8683b972f991e220",
"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "e9e80e1bfd347b598699a7a84deb8932eff90fc5fb8b56771453e06fe3c4c216",
"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "a55a31594618e2611a88375d6f64bf0ce341c67aa1926d347d1ea171376b450a",
"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "5e9a3c04ab45e1a945c5befc4311b0d0e06ca42e836470e9ba8dedeadebde317",
+"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "e9e80e1bfd347b598699a7a84deb8932eff90fc5fb8b56771453e06fe3c4c216",
+"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "8c82cc72f32a849c4c1b8aa1a5bc739935998782090a91aadd9d633e9aa7cc75",
+"T2T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "03b3e4fb6265652aa57684bd52a4764b6d7c58cc2948a71521c05c1f3c78c408",
"T2T1_pt_webauthn-test_msg_webauthn.py::test_add_remove": "356e3d65eb5d9838fdbfec275d5491a460416f8e157d2c1364db397f8d5302dc",
"T2T1_pt_webauthn-test_u2f_counter.py::test_u2f_counter": "507d4eef68b980907884cdb055cfe5f78d9288bef0e987d65083009082abad26",
"T2T1_pt_zcash-test_sign_tx.py::test_external_presigned": "9652b526098be999a73dee53f0c64d49c6343463d92bbafcda023f89a6ae2757",
@@ -12418,13 +12442,17 @@
"T3B1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "724b77fb030bd64794f3bcc1661777c8eb677e5ccdc1dba416e1483f299100f3",
"T3B1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "f938002123d30ddd6bc6cfdbc945f23044da1a4dbc5579611f76ea44fd0bb8a5",
"T3B1_cs_tron-test_get_address.py::test_invalid_path": "92840d4624bb07440bb1ab5cb4b57251c9950388accbc8334a9a7d609ededb01",
-"T3B1_cs_tron-test_sign_tx.py::test_cancel_transfer": "de7222b5d576dbb7a64e4ed6aa7e18144e48b0bb2650f05cee77e7d98be0ccb4",
-"T3B1_cs_tron-test_sign_tx.py::test_cancel_transfer_with_note": "4f2630d7948e29ae8b34551bbb6f719e966823660c35a99b2883727b04a9e832",
+"T3B1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "4f2630d7948e29ae8b34551bbb6f719e966823660c35a99b2883727b04a9e832",
+"T3B1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "de7222b5d576dbb7a64e4ed6aa7e18144e48b0bb2650f05cee77e7d98be0ccb4",
+"T3B1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "280e61051eba0e4708e394d32d373ed5aa7023f01ffa41d59f7cedf3e7fcebb0",
"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "da26252b324d32d7ec7d5bd14fcdba340cc7680e2a2b87373acdcf12680b4642",
"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "3a52e020f91fda5a4f9e0c997f2a7a1691f8700122bd87b6ca3c1512807bfbc6",
"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "92840d4624bb07440bb1ab5cb4b57251c9950388accbc8334a9a7d609ededb01",
"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "84c154e16a6d9b39cc72fd6e47302a239fbdacfc6704b3f59a341045f87c43c9",
"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "927d60f4e78393aa30cfe41185bdb8f2db15baba5ef9b406cbfad762134e5837",
+"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "92840d4624bb07440bb1ab5cb4b57251c9950388accbc8334a9a7d609ededb01",
+"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "4d64dbc87e28541daaadc55aba9048020e093471778015ce38ff7cdd1553c675",
+"T3B1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "532fd14ee2e1b67b6835ee895b2cbfdc770318437c6d8dee18c0e1683921210a",
"T3B1_cs_webauthn-test_msg_webauthn.py::test_add_remove": "1b01ab5508dbcd5a5ee064ec608071b5155ba9606bfdb7b10c5e03a57b36d312",
"T3B1_cs_webauthn-test_u2f_counter.py::test_u2f_counter": "62ddcf8e15851755ac555299395cfe10dcefc43bded072f4985b592a398e50ec",
"T3B1_cs_zcash-test_sign_tx.py::test_external_presigned": "3bc987c4c060d2b495fd439a6e129bdeb05d2646e555d7a6cd0b2aa7eb124685",
@@ -13922,13 +13950,17 @@
"T3B1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "ab37ec9042efdabb6b6af771790fd6652fa5d918ca0d372e1c86d184957b2749",
"T3B1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "2032a5ce75b2db57de100fd38db124180aa00a22b5c80a7ecf8057bfd486df2a",
"T3B1_de_tron-test_get_address.py::test_invalid_path": "c92ee4e050daadcfc7cc95657b00deed76bb463d486eefcc66455bdbe60faa33",
-"T3B1_de_tron-test_sign_tx.py::test_cancel_transfer": "2bca0c483330a8db2e0f2760ffac7dd4284a5d846e97ba8a7e5e2751b0c3fcee",
-"T3B1_de_tron-test_sign_tx.py::test_cancel_transfer_with_note": "d9814f5442a86fc8e221bce338d0c31291831fdf2a02fc83b969f94c2de488a1",
+"T3B1_de_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "d9814f5442a86fc8e221bce338d0c31291831fdf2a02fc83b969f94c2de488a1",
+"T3B1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "2bca0c483330a8db2e0f2760ffac7dd4284a5d846e97ba8a7e5e2751b0c3fcee",
+"T3B1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "c92aceb1105b97a5a97aa13a8ae84b0efe38f136d73e35317b542790dc3c3fe8",
"T3B1_de_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "e0890468a8fa5e74ba84cedd0c473dda57a3d8bac332924ce564812539c9b22a",
"T3B1_de_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "27cc4902f9cabc93a2937768d0e294084238a0963f8ac0d83bd77135bbe0d39a",
"T3B1_de_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "c92ee4e050daadcfc7cc95657b00deed76bb463d486eefcc66455bdbe60faa33",
"T3B1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "dd50fb3384218b90945daee8a6b4bdb08f18dca1a86acd70b235c720863b1fd7",
"T3B1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "e6f3a8774653bdfd89389f78d52a4451970dba00c2553165b6d49832310ac54b",
+"T3B1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "c92ee4e050daadcfc7cc95657b00deed76bb463d486eefcc66455bdbe60faa33",
+"T3B1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "9b7b04213b6942274ecbd2b643f5bf12e515bdda6d02d1ebbdec6ed53d618168",
+"T3B1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "b8b56e116ae90332be2cbc900a7c805562f78a5d0d1ec5b3378ca1e539be1c71",
"T3B1_de_webauthn-test_msg_webauthn.py::test_add_remove": "86db73c48fe88a4cffd01114340f5d4c40283537fcce7e442613518cb6530ade",
"T3B1_de_webauthn-test_u2f_counter.py::test_u2f_counter": "a4aad5a86c96cae9667e5147a5b55b5ad5907099412ff606cc10298e8bcef130",
"T3B1_de_zcash-test_sign_tx.py::test_external_presigned": "6319777da3cecae02dda5fc4ad0f8b81e28779cb76b38ae2e7e75075d6b5f116",
@@ -15426,13 +15458,17 @@
"T3B1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "f7959b4955aacde49001e6bc5a78249409e541d7a4eef6b8f8fa0e4b228e3c57",
"T3B1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "69336c030fa424d7d59076429f68af919ec1eb31361848147a8b58bcf562ddcd",
"T3B1_en_tron-test_get_address.py::test_invalid_path": "1477d62e338f4d7c1bfac2fc5d2fc231218da5768666c11482dc1f83229506f3",
-"T3B1_en_tron-test_sign_tx.py::test_cancel_transfer": "46a0135d2a61e245fa02a8cb4a0194f537f07ae105c4f279b5eb4ce962bab9b1",
-"T3B1_en_tron-test_sign_tx.py::test_cancel_transfer_with_note": "432a88cc5b21d2bc896729e6974185c4762951338dcd628d01a14d475366d804",
+"T3B1_en_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "432a88cc5b21d2bc896729e6974185c4762951338dcd628d01a14d475366d804",
+"T3B1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "46a0135d2a61e245fa02a8cb4a0194f537f07ae105c4f279b5eb4ce962bab9b1",
+"T3B1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "c7346e58ab0e80d992c6b3ef265beabe775d5e7d4170b4ef8ef0dbe9931e96df",
"T3B1_en_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "f7b9a208dd7b4ec02b5be200597e683bdc0b992b39efe4729a5bc028dff9aabe",
"T3B1_en_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "a83c6825cb9bffa876b6f5e79e4825f3492581475f55bbaa9e16ca275a0a71ac",
"T3B1_en_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "1477d62e338f4d7c1bfac2fc5d2fc231218da5768666c11482dc1f83229506f3",
"T3B1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "a988e702b00f41adee084f7e61637a73193624deea13e8bd8138216a5c3ae6d6",
"T3B1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "c093db704e3358ad217917b4a44866fdb9e2dab7f5389eef4f42f322022aa712",
+"T3B1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "1477d62e338f4d7c1bfac2fc5d2fc231218da5768666c11482dc1f83229506f3",
+"T3B1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "11bcba03619742fe47ec7d5b3b8011862272aa16450b6fe9853db29c1a48676c",
+"T3B1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "17ce4487d9aed85099c2ee002d3d1c1e54a810154b12056e90219f3141ec8b65",
"T3B1_en_webauthn-test_msg_webauthn.py::test_add_remove": "540214b367b638082b9beb67e492b59b5ac523b5dedb972ace9b4caca974ef6e",
"T3B1_en_webauthn-test_u2f_counter.py::test_u2f_counter": "49f01fce798fe9d5a22cea12d7f276fb91cd77c04087b1dd2c3e37a6106cc350",
"T3B1_en_zcash-test_sign_tx.py::test_external_presigned": "6bc1f0b265163f105b4b084e518a23e6a248849f3141d82dbe25538a43d69883",
@@ -16930,13 +16966,17 @@
"T3B1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "bc82e7054f1befd6d96dafb8640fefac40859e84588901bd1f0467df0b2c78b4",
"T3B1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "d4d2dcf7e768d7f4e643201dbf71427d2e8dfcd3b7ade6c8968cd5fceae7f046",
"T3B1_es_tron-test_get_address.py::test_invalid_path": "211e7c3419bd48ceefc570971fc522f809b39614563be948fd1e545366506dee",
-"T3B1_es_tron-test_sign_tx.py::test_cancel_transfer": "0d0222fa778662f3aa31348e5935b03b7e4a5529b81d724ab0f44af9652dd0f2",
-"T3B1_es_tron-test_sign_tx.py::test_cancel_transfer_with_note": "1a809c5cc17dcf2fc5af644960414c8fb5fcfce0ad0e89b48f4a0262fc5c35f9",
+"T3B1_es_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "1a809c5cc17dcf2fc5af644960414c8fb5fcfce0ad0e89b48f4a0262fc5c35f9",
+"T3B1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "0d0222fa778662f3aa31348e5935b03b7e4a5529b81d724ab0f44af9652dd0f2",
+"T3B1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "f1314d1dff5c8d7aacd159ba28f84d5477840605235eb9ef1e85ba749723336b",
"T3B1_es_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "69ad85f92d67c206dfc155718f1b863a604d6718d61b1a918afbd6946fb54022",
"T3B1_es_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "58ad4f65aac52012ead9d5af69b4815ab57d53349c80960a5be03d5d88c04a9e",
"T3B1_es_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "211e7c3419bd48ceefc570971fc522f809b39614563be948fd1e545366506dee",
"T3B1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "aabf5d3a4b3429b123813e46ced6a6e6f3c1e657276e811364693c2b7f6bfa92",
"T3B1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "61de879eaa2e94c169c72f3d400f02709a030108ee596a5e6252ebde620a7223",
+"T3B1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "211e7c3419bd48ceefc570971fc522f809b39614563be948fd1e545366506dee",
+"T3B1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "a71d00bb0a1d6b5d9365d89d4b25a0c72b1178495bbf756eeffcb521a4ef0d20",
+"T3B1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "64fa8b0ff6f0ae2b5882aa9b1f8d9a6da985880b6a4a7046171492066d3f3f2a",
"T3B1_es_webauthn-test_msg_webauthn.py::test_add_remove": "07d58a3658c5c25a62ca160b8b4a1045575c64673589c99d20769a12efd57ef9",
"T3B1_es_webauthn-test_u2f_counter.py::test_u2f_counter": "db9781a9acce29167a3ca4a201f2e67ecb3bcbd037fe26a4bebb82f8c234cb13",
"T3B1_es_zcash-test_sign_tx.py::test_external_presigned": "945cf3aa13f8a1b5cdcb4506ce2c0aadf6b79c5b4489b5660298898ba75c7eb6",
@@ -18434,13 +18474,17 @@
"T3B1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "dab00783804a4c3150db28cf5fb21ad5ca57036f5df932dd4a9abcfab123a9c0",
"T3B1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "c105c2517b66073b17348a076da17bbaa30776249d6373d375c7e1bdc3b6b925",
"T3B1_fr_tron-test_get_address.py::test_invalid_path": "35c9c9529c59ca5c386ac05856f7452f26cde732203b5b61ec9321230b52df89",
-"T3B1_fr_tron-test_sign_tx.py::test_cancel_transfer": "91639717bd126dc045c49bbb314819f02c643e640e3b172846073527efef385c",
-"T3B1_fr_tron-test_sign_tx.py::test_cancel_transfer_with_note": "4f601ff1f7c10d7b978c03e90351a6ddc7009304eacc6fe776213cac33abcec7",
+"T3B1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "4f601ff1f7c10d7b978c03e90351a6ddc7009304eacc6fe776213cac33abcec7",
+"T3B1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "91639717bd126dc045c49bbb314819f02c643e640e3b172846073527efef385c",
+"T3B1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "41acd9ca666fd9ce5ec93f8c38e80fe69ac317e826315b05c9dfe770200854ae",
"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "9ae2d0d9bd89bb754efacfbfea7165ecda3567588b745ecd39c14cb6e126f214",
"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "bfce6691c7970a6fb08258b4b8cabd1249bbbb05bca50a28d02b7b73cce75113",
"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "35c9c9529c59ca5c386ac05856f7452f26cde732203b5b61ec9321230b52df89",
"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "cee7be2f47b0a786ebad473085b790e8a8861b25b2df243ae4ee89e9957ff7bf",
"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "4db51c1350edf873a0ba82b8e3cd25cf3bc8829e705b5546746d4fc31460e351",
+"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "35c9c9529c59ca5c386ac05856f7452f26cde732203b5b61ec9321230b52df89",
+"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "0a22f7f31a673f80e686f3f41388d6f26a98b23b4bd73999cbc74aacf2203ef7",
+"T3B1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "21f92ced7135095e87ce43bb08a6385a0bc1cc99e894f48fe530b682df14c500",
"T3B1_fr_webauthn-test_msg_webauthn.py::test_add_remove": "3f946df11aed0e73ba7e21bacc1bace824325f8575c444f67d5d7a2c3394c9d5",
"T3B1_fr_webauthn-test_u2f_counter.py::test_u2f_counter": "186427cd3da75b39add98615c2242bab81efe5ac5e07e66291a7a1b5cf79f084",
"T3B1_fr_zcash-test_sign_tx.py::test_external_presigned": "5ef044c8f3d294bb1b3b1bf74d8d06a92fb3668b56a426bf76b0825149594aaa",
@@ -19938,13 +19982,17 @@
"T3B1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "a1dab6d59815388a863f1ec6f5c361901ea234e1b324410021531893897007f1",
"T3B1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "87689f32381c08aa518a9b3f844f27f5e9b8a4ba99f62c0a0a1911709c59619b",
"T3B1_pt_tron-test_get_address.py::test_invalid_path": "6ba5ca7223cd8ad675e081407f186acdfc8420304eea96de0fde5eda45ef0a57",
-"T3B1_pt_tron-test_sign_tx.py::test_cancel_transfer": "df629b282128c2b52f8e3f08f3ee2aca9ae03059673941bdb777ecf114ead4e3",
-"T3B1_pt_tron-test_sign_tx.py::test_cancel_transfer_with_note": "1ccf097dbe53c829c9d378a8cf4e7ca291bb7572469253914ab803086980b26b",
+"T3B1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "1ccf097dbe53c829c9d378a8cf4e7ca291bb7572469253914ab803086980b26b",
+"T3B1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "df629b282128c2b52f8e3f08f3ee2aca9ae03059673941bdb777ecf114ead4e3",
+"T3B1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "a1a29bdfda665b7e55b0147c943f2e6efa823bf12e132463860755cc46a9189e",
"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "721d4f3ad00a09eedf875a363248c0a8eb8f443678fd061d89ed52b407b68c00",
"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "3b5cccd76f8594148413fc9af386557f3ffa696809eda5c6eaab05634cf6e393",
"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "6ba5ca7223cd8ad675e081407f186acdfc8420304eea96de0fde5eda45ef0a57",
"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "7ab006309beb49e9f34defb272277a70f2c3b9be5ac75420cfea9b07020bf52a",
"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "a311a2584b9a812ea04dbde3f2a6958716af15c58eb1ce12683d1b28b667c68c",
+"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "6ba5ca7223cd8ad675e081407f186acdfc8420304eea96de0fde5eda45ef0a57",
+"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "52ffc20e7f7fab426d2ba8704a5d5aa4f860f5d45c1dbd395aa402862e86019d",
+"T3B1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "f588dfe59f1e156acd7e9850eb7be0f61d1a149d8cab66425286aceb0ec259c5",
"T3B1_pt_webauthn-test_msg_webauthn.py::test_add_remove": "d09a8586ac2da47399f9209862c748c327934b37eceab9b5fde02410302e5379",
"T3B1_pt_webauthn-test_u2f_counter.py::test_u2f_counter": "450cbe2f0b48489505a6ea2bbac03f0394bd1b396b596997f3d705f7e10f8ea0",
"T3B1_pt_zcash-test_sign_tx.py::test_external_presigned": "9b4bdced7e74a9a1d1a7dbec357f1d12daea7d6b4365526ee23469c6539ad3ab",
@@ -21845,13 +21893,17 @@
"T3T1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "d4c4ea5346c48043e7015cc1527231aaaa2f43e0c7712feaf2b883ab6d993b0c",
"T3T1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "6aca105c71b7b4bdc3fc5d57c25abd201460b6cc1bc9be4d795aab597d89a9ef",
"T3T1_cs_tron-test_get_address.py::test_invalid_path": "592adf9c06f8f39132298b46037dd524fac99e58237a0c023197bf47df67d632",
-"T3T1_cs_tron-test_sign_tx.py::test_cancel_transfer": "5720c3b4ba1145b58b595c9c4477a254fdf25146c4e5562c885ec3a8fdb4d292",
-"T3T1_cs_tron-test_sign_tx.py::test_cancel_transfer_with_note": "426a62807089ac353d1904ab855f2b625a39901f63449d8b35df8a7d944bf715",
+"T3T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "426a62807089ac353d1904ab855f2b625a39901f63449d8b35df8a7d944bf715",
+"T3T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "5720c3b4ba1145b58b595c9c4477a254fdf25146c4e5562c885ec3a8fdb4d292",
+"T3T1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "67d1403107bed78d99d4172b422458bf2c878d0f6ed410b80d430abe4b5d618e",
"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "c698dc41d062d23dd71bbd26a5c179e64bc1c5a5b1fd8a1f1efe584c183ba82a",
"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "f2ccc1838c30304af948b8230a80133c5072a68048a3a055bbc22ac56880b393",
"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "592adf9c06f8f39132298b46037dd524fac99e58237a0c023197bf47df67d632",
"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "f6922eb29439401430cf91335ef12bb210e1ec863d1f634dfd7b2f38c0fcfc9f",
"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "d22247c3eac086b535ce90920d2aa2d17ad508f3c0c46736d0c6ff2a2d59c508",
+"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "592adf9c06f8f39132298b46037dd524fac99e58237a0c023197bf47df67d632",
+"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "2976b11179e7b858a48393d7fae63fe9f29d8e564dd8a1f0a0a4d5e0147c01ff",
+"T3T1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "8f07da581daf7189d5261393af1486a2a3d7aff55bb57736631898388fff59df",
"T3T1_cs_webauthn-test_msg_webauthn.py::test_add_remove": "7c62ef402935dbc2b2784eb785e16d290247bb293eb7061464b27d237f5d54d0",
"T3T1_cs_webauthn-test_u2f_counter.py::test_u2f_counter": "0a1e90cdaa05275432b5e4bda47626d008da19b488223a39012d10dc58eb2e4f",
"T3T1_cs_zcash-test_sign_tx.py::test_external_presigned": "a856a114b82848ecdb9da807c9fbb5e89ceb883e95e2c098c49a39349e746f97",
@@ -23382,13 +23434,17 @@
"T3T1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "4dfe2f8adb531d51659105455fad417bb2e7fbbaaac8532f9157b57aaff41675",
"T3T1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "d5cf7acf41f810c11c55daab8fe4c5e38b4716dc269cdc9f9a5848b5de8d886e",
"T3T1_de_tron-test_get_address.py::test_invalid_path": "f2fcbbd7ad83aff9adc0ee97fe98e7272d8bcfcc4a023798e2ab1c9895fda70f",
-"T3T1_de_tron-test_sign_tx.py::test_cancel_transfer": "ca200b6d39707f10c7194c18e1d0240df345a85315932392fa1733d24081ee88",
-"T3T1_de_tron-test_sign_tx.py::test_cancel_transfer_with_note": "430dc9eeb74cf5b285ffce4a9d5012f642aa8873a112e406233173da79b17034",
+"T3T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "430dc9eeb74cf5b285ffce4a9d5012f642aa8873a112e406233173da79b17034",
+"T3T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "ca200b6d39707f10c7194c18e1d0240df345a85315932392fa1733d24081ee88",
+"T3T1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "eccdf7a68ce2ae7cdddf262967be30e8a2c0f4ec1660b930c9a05f3f3f0ffb61",
"T3T1_de_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "86172f2f8184b1d431b8f0ab8fb9f20cce1dac5a71e34a404f75b1b992e187e1",
"T3T1_de_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "b29ec1c159df24716860550f942b84ab4eea2e7e57baa1d4ba726e82622ba624",
"T3T1_de_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "f2fcbbd7ad83aff9adc0ee97fe98e7272d8bcfcc4a023798e2ab1c9895fda70f",
"T3T1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "6188904cafb2b2f54ee23d7160e476757539108085d13c199a3e9d45397c6c0c",
"T3T1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "d2f72ce42286f62769c6d0443ba0c45c2e34d2b268917ef40c1bf70a15225317",
+"T3T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "f2fcbbd7ad83aff9adc0ee97fe98e7272d8bcfcc4a023798e2ab1c9895fda70f",
+"T3T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "15ffa7c4c31b0f89f846f0abc08e4d9673794d2cccd86496787e4fa39934d26a",
+"T3T1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "d131733be46445264e80777939e5046e5445a4668ab1d44d17d8c9726cc4a7ca",
"T3T1_de_webauthn-test_msg_webauthn.py::test_add_remove": "400b1c08d621d1982b62a2ef26c5f456348e86dd51b8f220cce0c2029137af65",
"T3T1_de_webauthn-test_u2f_counter.py::test_u2f_counter": "c84c97b408cfde113ba8ed7f4a67f50c4d846fb97825e75b3bda13009db63da2",
"T3T1_de_zcash-test_sign_tx.py::test_external_presigned": "88e3ad5e12c0b0dd4ef072dfadcdb3fede1e7a309499ec0d3d612dda12082315",
@@ -24919,13 +24975,17 @@
"T3T1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "aeb617730fe0738f8a87065681d7d3888f8c731122b95712ab491566b6cb8a35",
"T3T1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "59962f5f0f27533c564c7776289dadf8eab1654a77a141eb45c732cd81b6ecd6",
"T3T1_en_tron-test_get_address.py::test_invalid_path": "cb8641952bec9e793e7d19f281a85a0ca1be2c3397ca5c0cf4ee7ad905429984",
-"T3T1_en_tron-test_sign_tx.py::test_cancel_transfer": "32761e9ceca97387c01081967e9e8af3c433c4e939c5306ed24f99e61df25430",
-"T3T1_en_tron-test_sign_tx.py::test_cancel_transfer_with_note": "c7a95104ba935de3a1d1595b729dd7096ebbd2c225b0f9b66c1ce38c4aba5091",
+"T3T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "c7a95104ba935de3a1d1595b729dd7096ebbd2c225b0f9b66c1ce38c4aba5091",
+"T3T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "32761e9ceca97387c01081967e9e8af3c433c4e939c5306ed24f99e61df25430",
+"T3T1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "3460066406430f7b70b5e4357a43c3325ffd2ad29f1592034ccb99ded754b8ef",
"T3T1_en_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "809bc2de7f5b10bde8851806b32e96c54f86c60b0147eca30d0ebdc7c683ac5f",
"T3T1_en_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "43f8a5772c098a58111a5eb1a0bc0969bdee634aa5f2a9a4593ad1d204780c25",
"T3T1_en_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "cb8641952bec9e793e7d19f281a85a0ca1be2c3397ca5c0cf4ee7ad905429984",
"T3T1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "a2bf49388cac41657eb795438952878b40fd27d60c6d9d939f9b0ed8dae239ab",
"T3T1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "5c77245ff9ed0a5654eb271f04b6541b7ea1dac9a75e83647e6959e02c8e8c62",
+"T3T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "cb8641952bec9e793e7d19f281a85a0ca1be2c3397ca5c0cf4ee7ad905429984",
+"T3T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "088ac814c9d6c289f1ecee5995e9a580ea666690aa8ce96543017ba99b2e1a6c",
+"T3T1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "e39fceb32e1e54de107720c56f15aa1e3838bba9841e0f6e5c4fac1f05a7de98",
"T3T1_en_webauthn-test_msg_webauthn.py::test_add_remove": "95351793ff4ed12276b36d9223bff9456adce515a4ec26e72c966b351c32e179",
"T3T1_en_webauthn-test_u2f_counter.py::test_u2f_counter": "b81ea8c63aa65f04c3f42b6da5b8c4fda384013d468ca7b24a446863984cc788",
"T3T1_en_zcash-test_sign_tx.py::test_external_presigned": "52a03f2f7159ac1c8cdac6b23f1de8665bdc592dd1095c2281f7bea8fef82080",
@@ -26456,13 +26516,17 @@
"T3T1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "687c48ea028518c2756e6c6cc4601bebf4fb0b965b4cbfa428f9b26607c043a7",
"T3T1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "075a470d658a00c31b80c136c2ef11b3d2f543ade42f7c9b80a79f536e8e9ff3",
"T3T1_es_tron-test_get_address.py::test_invalid_path": "c568b82943d9f63ad6b29b7dee6f5ed9dca78fc9610d4fa7f12bb8a061a6882a",
-"T3T1_es_tron-test_sign_tx.py::test_cancel_transfer": "ed967426a161e7ca629a9d8c2ac2392df7cb0117c15c8fd32487b64f18e4eb2e",
-"T3T1_es_tron-test_sign_tx.py::test_cancel_transfer_with_note": "d537911e0ea28654d4bfa4ac74274349d0bdd0ea67806cf8f0c7416372cc0353",
+"T3T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "d537911e0ea28654d4bfa4ac74274349d0bdd0ea67806cf8f0c7416372cc0353",
+"T3T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "ed967426a161e7ca629a9d8c2ac2392df7cb0117c15c8fd32487b64f18e4eb2e",
+"T3T1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "b91cb930c779ed7ecc6f26bbd5ac4b0c363403feaaa1b9410d98d271237f7e81",
"T3T1_es_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "4b16f209721654f8563e21ef857fc8b98dc0dd7f9a4b2d6bed8f26559a268080",
"T3T1_es_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "5df24189842eddc32c0f64d355a1c72484c27ac987ab2fc2e1f0f4c717420587",
"T3T1_es_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "c568b82943d9f63ad6b29b7dee6f5ed9dca78fc9610d4fa7f12bb8a061a6882a",
"T3T1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "891e6613a09de3e090ebeb2b4412986e048df162a288fa3e98c31867433990c5",
"T3T1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "2e40969907c7609a365fe319623746b3fa1b4ba219cb2e00a4462b4dd21bc451",
+"T3T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "c568b82943d9f63ad6b29b7dee6f5ed9dca78fc9610d4fa7f12bb8a061a6882a",
+"T3T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "85652b68691a896d6684ceb92d566ff46560a9fdeb64e71d6e874fc14ba6dcaa",
+"T3T1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "10fb30584e09768d357e4c9fe1bafbce16f4369c4483a093cd8b2f544f49f4e8",
"T3T1_es_webauthn-test_msg_webauthn.py::test_add_remove": "f0cf005283047cb5259daa065131e71c7e50488bab14fb3a95390b79ba6ce97a",
"T3T1_es_webauthn-test_u2f_counter.py::test_u2f_counter": "65cffffbbe80d2b3a3babd0d5b586eaca830dc3b35a61c4d9a6f5c27ce96556d",
"T3T1_es_zcash-test_sign_tx.py::test_external_presigned": "07ba334e426afe3efcd4f7895aff67ce45bfd0c50d8187f941c04666fc41fb19",
@@ -27993,13 +28057,17 @@
"T3T1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "1f15cd1fdf1d2ff0f2c40220b3453d3b841df6840dd342b3c1e81e36a0c9c5a0",
"T3T1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "76ff5bec51278641ac93656792e1bf04b218b273deab904ed7826c5483934d5e",
"T3T1_fr_tron-test_get_address.py::test_invalid_path": "fdf4909aff89183fa79899fde974115e687a71e0cf09dea210e8aa60ba54c906",
-"T3T1_fr_tron-test_sign_tx.py::test_cancel_transfer": "c0f74f11101164b8bbfdae3f41c68d9a304130a3a5b3d5395bcc7e4ea2906aa9",
-"T3T1_fr_tron-test_sign_tx.py::test_cancel_transfer_with_note": "c02a93442ba7e339b068a35641c63ee0a603cb1c89a749fb3f04edcba6a31a39",
+"T3T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "c02a93442ba7e339b068a35641c63ee0a603cb1c89a749fb3f04edcba6a31a39",
+"T3T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "c0f74f11101164b8bbfdae3f41c68d9a304130a3a5b3d5395bcc7e4ea2906aa9",
+"T3T1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "5e86f851e15ce7b990b44a55878beb3daee873aca6620e5d54b3b2f69e80072a",
"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "de6ff1581d46ec85d8eaabe1501466571d6519304207fcbaaea01d0e49c870f1",
"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "7a2aac20874a97e50bea1f87c2d3fdb466a6f913367936906cee35e58523c318",
"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "fdf4909aff89183fa79899fde974115e687a71e0cf09dea210e8aa60ba54c906",
"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "0232aa0b6a40ef9ee8b332ecb7fe03ede622a4d8038a79bd32bce35fc2e1bc55",
"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "7beb51a88d48ded88e38b0a645c97ff81c587104ae0978a5416558f24353907a",
+"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "fdf4909aff89183fa79899fde974115e687a71e0cf09dea210e8aa60ba54c906",
+"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "cd7bdb67b8940b7935ab19175b2abd2a332fba12187cc8c920e92f60d002cf0b",
+"T3T1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "5aadbb34079a6257add3864507cf7980579c8793ee9c2d0405906a1fe7d8458e",
"T3T1_fr_webauthn-test_msg_webauthn.py::test_add_remove": "30db81763d6d91d4c91fdd870e516889c9378efe4ee9ec8ab7940431eaea6a8d",
"T3T1_fr_webauthn-test_u2f_counter.py::test_u2f_counter": "aa72dfd17391ca58696a1e043c0ffd7316cf8fab95a4df864c072c6904127433",
"T3T1_fr_zcash-test_sign_tx.py::test_external_presigned": "0ed55eb2a80f7d7bae57fbf68df11d443c7fc95171fabd4b0759af4df7605baa",
@@ -29530,13 +29598,17 @@
"T3T1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "4bd3bd76264b89f0ee49505b67d33499ae5f9d38e8e1b8c5b3f23e6ae9dc30d9",
"T3T1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "4b0fed344320ac8125e69a37789b6f00509e4cf1cf7d0ef2b9ea1beeeba19882",
"T3T1_pt_tron-test_get_address.py::test_invalid_path": "c15216b8aa033bd81f0a8fb6415c6728320b0c30fe3150eeb8a1749ae0a1a83c",
-"T3T1_pt_tron-test_sign_tx.py::test_cancel_transfer": "9d929b30c3ba831da0f379f50d5dca26bd6514d70d11bf8dd283ec117e277473",
-"T3T1_pt_tron-test_sign_tx.py::test_cancel_transfer_with_note": "589f6424f3797616fbb389b82046100c2b9ba25ddbdf5d109364d45f12dda57d",
+"T3T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "589f6424f3797616fbb389b82046100c2b9ba25ddbdf5d109364d45f12dda57d",
+"T3T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "9d929b30c3ba831da0f379f50d5dca26bd6514d70d11bf8dd283ec117e277473",
+"T3T1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "377f6e1db8f25d6aea5fcde1c3a16b702b7ad5142e540ccd454d3319f0bbdf41",
"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "c68f4d38bd29db62795ebc84521e87f3a63012c06ed2b058f2fae5f2292fb9b4",
"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "de391f69383429ac34ad422ea46ba35629088d879d6ada7222d84d778a1046c9",
"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "c15216b8aa033bd81f0a8fb6415c6728320b0c30fe3150eeb8a1749ae0a1a83c",
"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "e72a1971da0688cb848abbe47634f98385d053fa5baaebb9d37c9d7cdf4134b9",
"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "8b0173cd850ad2b4cb19cbd1a94b6367c7b50ab4cbb08edb2f7fccb7c3d71b19",
+"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "c15216b8aa033bd81f0a8fb6415c6728320b0c30fe3150eeb8a1749ae0a1a83c",
+"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "5963d59de2daafb3aef794f25415d14c72940bf0b12a7f62e2dd3eb050dad972",
+"T3T1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "9792faf45609aaffc571c72b8ec37fae82217d1be55701e5ef7d4a2d786eb010",
"T3T1_pt_webauthn-test_msg_webauthn.py::test_add_remove": "dd0cf886c63379d9550544fa5a763dcf33ae09d5dbe0373bb96757aa93677529",
"T3T1_pt_webauthn-test_u2f_counter.py::test_u2f_counter": "767c0287a73905ef855648d06f2d40fe07b0e4ae7b1dfad0f54e2cc9f253a638",
"T3T1_pt_zcash-test_sign_tx.py::test_external_presigned": "3ac1451362f2f22eda13907794dd6202434bd79278229615231668386421c04a",
@@ -31714,13 +31786,17 @@
"T3W1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "4065e6e11ad43c2183a1f99c13ed496083362d2377b77e534014ba327e6401ba",
"T3W1_cs_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "70e989cd8de96f2924e230f9959ad1c26a0a1c7f5ae197911ebd962cfaa138e6",
"T3W1_cs_tron-test_get_address.py::test_invalid_path": "c24521e569c08e3605b164212c876f8ac57c5eef6cca6f2ca53a635a883ebc4b",
-"T3W1_cs_tron-test_sign_tx.py::test_cancel_transfer": "3f0c396a68eae38ad98e709d289b39df05ad584e2b84410c4bcb768ed8881123",
-"T3W1_cs_tron-test_sign_tx.py::test_cancel_transfer_with_note": "f8c72e3e2072a1beb84729ed109afce04cf2a8a34a551153daa2b01d9e2ccb33",
+"T3W1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "f8c72e3e2072a1beb84729ed109afce04cf2a8a34a551153daa2b01d9e2ccb33",
+"T3W1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "3f0c396a68eae38ad98e709d289b39df05ad584e2b84410c4bcb768ed8881123",
+"T3W1_cs_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "c7442a2f04ddab8e4057765076574d986ccbaa8b4754e05bd78b0636324b578d",
"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "bf11e51138ccf11ed11851d7e100e745d9dc231dcc550cc11e8859d99aa8ffda",
"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "0bc3df99e3e79a37a147a4cf1de69f3550ec93d7988b794b8b47b487d8b463da",
"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "c24521e569c08e3605b164212c876f8ac57c5eef6cca6f2ca53a635a883ebc4b",
"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "6f9f16a90897b5a9d296470b9d316901cf51879c57541cd2ed53fca1241b4e29",
"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "289cdae7c831642ce304f4af42de8314b3cb57acf7a77b3968f6c185d8c566b0",
+"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "c24521e569c08e3605b164212c876f8ac57c5eef6cca6f2ca53a635a883ebc4b",
+"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "64617d4f7b1bc598cb6a78d8b527ba38a7db220ec53ee1b834a8addbba150dd9",
+"T3W1_cs_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "7ec98424c143a5ae43b98c48bdc14012855c7ec66d8fc70263755cc0e93fcb88",
"T3W1_cs_webauthn-test_msg_webauthn.py::test_add_remove": "41e0ff0345000141e896ac5e1b7efccba213037de18b5eb8c0882be670034b18",
"T3W1_cs_webauthn-test_u2f_counter.py::test_u2f_counter": "3384ce14138163512ed53ca5d68499080d4c54d81ca071585bb552afdd1b6e57",
"T3W1_cs_zcash-test_sign_tx.py::test_external_presigned": "e696a398d3028639c0f081f2793849e2e9abc73e612ccdecc92975117b6c6bcd",
@@ -33258,13 +33334,17 @@
"T3W1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "76905ae90027fa3d9d516bc976bd93b8275390237deda35c6d76c70d29da0260",
"T3W1_de_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "636c5ae914b38a7fdbb561cefb72f283b1ca2abecd1f0a12e382c2e112c83e2f",
"T3W1_de_tron-test_get_address.py::test_invalid_path": "b3ce10e1620297758d6f2b235127f1dd0d61804c8cc32bc6664db5c3a9d81dde",
-"T3W1_de_tron-test_sign_tx.py::test_cancel_transfer": "c411370e6bafcca5dcb2a18b92b367dd47188dc5d75c1555d1191fd73dd76775",
-"T3W1_de_tron-test_sign_tx.py::test_cancel_transfer_with_note": "5ad02c07fb8ae5aa25cad330ec80d54d3e3d788795d213484585310645331cd9",
+"T3W1_de_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "5ad02c07fb8ae5aa25cad330ec80d54d3e3d788795d213484585310645331cd9",
+"T3W1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "c411370e6bafcca5dcb2a18b92b367dd47188dc5d75c1555d1191fd73dd76775",
+"T3W1_de_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "caeeabebe44a7599129ccf0bbcd4442a563ee82a4142b7fc3844422d9bccfbb9",
"T3W1_de_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "a4b20de8237e28151d0f6cd7bd1d581a966d6dfd190dd51638588c17ce8b5c3f",
"T3W1_de_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "7ecf5fdab091ee91d2742c2b4bfb59b15dbadae50b8c065376b9bcc49e27d3c5",
"T3W1_de_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "b3ce10e1620297758d6f2b235127f1dd0d61804c8cc32bc6664db5c3a9d81dde",
"T3W1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "713a3fa56057ac1ccfa649501360f61c237a6c1424c1f763f4d1b4153f909ec3",
"T3W1_de_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "e7f6dc97cbcf8b5405c8f09c65faa36de93b2419c5009e23ce9bc511c2445222",
+"T3W1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "b3ce10e1620297758d6f2b235127f1dd0d61804c8cc32bc6664db5c3a9d81dde",
+"T3W1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "b69037ea055aff3d7c8370e50859be0160d68c2f75fba3bbd396f0b06862215d",
+"T3W1_de_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "97c3a8bc44ecfc5c1e6f157322c2e8cd2d3d9d94da8c6fc5ecc88aac969e70ed",
"T3W1_de_webauthn-test_msg_webauthn.py::test_add_remove": "863a2e211e9f25759e0c0621ec25a265145319c205fdf3ae5770e6eebb7e120e",
"T3W1_de_webauthn-test_u2f_counter.py::test_u2f_counter": "d9ab4afce880a5c149e95a70a5d45af550ae3c186448e16665cc4ca8ffbd6523",
"T3W1_de_zcash-test_sign_tx.py::test_external_presigned": "a9285400bc6e3bb9ff9d4cab3c00ccded1a90c30871d32cbd70c554f4e907ed5",
@@ -34802,13 +34882,17 @@
"T3W1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "3d9fa36476d32eb62b79f7b9f09bb2f792622ec592ec0a2000b1ca896856ce47",
"T3W1_en_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "d477ae58811839dfbd7e8bfaf31211c7b858a3781f4b7647659b90e04e88398e",
"T3W1_en_tron-test_get_address.py::test_invalid_path": "931d9afceb0ba1e4faae891775819277242d889644d5c0c5863fc8c9fcf859b1",
-"T3W1_en_tron-test_sign_tx.py::test_cancel_transfer": "9b7678841ee27d5fa3b8fd40164134afecf543201cc0546ea52de795f9fb743a",
-"T3W1_en_tron-test_sign_tx.py::test_cancel_transfer_with_note": "156f74d5e2bf5fea58d5a5d90738402d9f0981b7ee3cb4d49f5fdde0f0e806ed",
+"T3W1_en_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "156f74d5e2bf5fea58d5a5d90738402d9f0981b7ee3cb4d49f5fdde0f0e806ed",
+"T3W1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "9b7678841ee27d5fa3b8fd40164134afecf543201cc0546ea52de795f9fb743a",
+"T3W1_en_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "4360ded1ee1610db78a0851db09c4cbec481116ede2ae8687a81f782f3911545",
"T3W1_en_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "e85f80af980d6ed6569915de5bc0bc0ea188a2e451cd2546bc532056cd2c9b16",
"T3W1_en_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "7d00d85562d4369e5848f06c350e6952e1d97d6a9ba4c72c101f3e64cee6e143",
"T3W1_en_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "931d9afceb0ba1e4faae891775819277242d889644d5c0c5863fc8c9fcf859b1",
"T3W1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "561b1ecd75958237a2728df6450909cc313d80e781a4f504a49229e2aab51633",
"T3W1_en_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "a2856395a04585736620867329ab62bb0f36983c1a81b52e1713631e1a4471f8",
+"T3W1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "931d9afceb0ba1e4faae891775819277242d889644d5c0c5863fc8c9fcf859b1",
+"T3W1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "fc62b5b39c85ef8831a309e6e6fba0fc9680725a568684e1266cd9c0abf3b919",
+"T3W1_en_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "de6acb52dff4913cd460972fd33121791146d6d0dd999b3ff0cc976b48a2aec9",
"T3W1_en_webauthn-test_msg_webauthn.py::test_add_remove": "222e1dc521b9a3ccfb91530fd9246664a62a102f1595b78b7207ec9348036017",
"T3W1_en_webauthn-test_u2f_counter.py::test_u2f_counter": "109039621b36fd1ebe09cd76f7e898259aafa80401a8bd91799e448a6e134f79",
"T3W1_en_zcash-test_sign_tx.py::test_external_presigned": "923afb57943e0eab7350f79148d255a23ee0fdc1985baad5bb8a6861f3535da3",
@@ -36346,13 +36430,17 @@
"T3W1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "1c13fd401d577427ccfb47b6f5b02277869e3a38a3ea9ded68259503418cd68a",
"T3W1_es_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "448266b09133c90d3c529861bc42650472f35082bd9430189cfa716fe3fd6cc5",
"T3W1_es_tron-test_get_address.py::test_invalid_path": "56536ae9cd7c4ff8022def4ec3350031d3614064d961f53a2850f2be425af201",
-"T3W1_es_tron-test_sign_tx.py::test_cancel_transfer": "3ff3588960098e20f4d62633ec301dc9f581213e56414961a9e7058890acae81",
-"T3W1_es_tron-test_sign_tx.py::test_cancel_transfer_with_note": "8c68ee38e4e55ebb5915b512259309a795646ceecc84ecc21701497dae94686b",
+"T3W1_es_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "8c68ee38e4e55ebb5915b512259309a795646ceecc84ecc21701497dae94686b",
+"T3W1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "3ff3588960098e20f4d62633ec301dc9f581213e56414961a9e7058890acae81",
+"T3W1_es_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "08a16c244ca2217573c14975e4dffe1e14e8325467440ae0093e86c758ba278b",
"T3W1_es_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "247edc68de607f2e5069a5873a4580092358e1b978047b7ef4965d6ea5cd7bad",
"T3W1_es_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "14b5388a5d9e82e2c66d4c52abff2f992ca98d12aade4d16d655c67d3cdd5267",
"T3W1_es_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "56536ae9cd7c4ff8022def4ec3350031d3614064d961f53a2850f2be425af201",
"T3W1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "82d4c80bb23b69fd92ed4dafa89ec4d4282a91840297cd36b3b3b195d543c6cf",
"T3W1_es_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "af638ffd5e3fa83eb99859a7912dd77573e35a5eca0de2f1acf1f833dbc57f45",
+"T3W1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "56536ae9cd7c4ff8022def4ec3350031d3614064d961f53a2850f2be425af201",
+"T3W1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "93c78b82f26b990d8ceb592e9eeb8b0e48285f9d097a75f520bf8373f70eda72",
+"T3W1_es_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "5313b18f29675231e58317d464a29f8a3c0891cdd2b7f9a1a686ad8f5bedcdd8",
"T3W1_es_webauthn-test_msg_webauthn.py::test_add_remove": "048cf2fd22ccf58994f9e729252c4a470f417c3a73f42eeb5affe273ebe9cb5b",
"T3W1_es_webauthn-test_u2f_counter.py::test_u2f_counter": "813b59a0c86c9801d39e952d27c2708e3cc35219aeef4bde9d091f6ced445c02",
"T3W1_es_zcash-test_sign_tx.py::test_external_presigned": "5d87f304c035aa0a4edda312c7781b726869b97cb91c7a67c67fd6d17e980a87",
@@ -37890,13 +37978,17 @@
"T3W1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "1c4518996e61eecfc507fdafb927b8496c28d4238df15ff8e2af7589a0f49d2d",
"T3W1_fr_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "79eee99413015c9bcbc5b31674a9c45730cf71bf8068ccab8c02c4fa93be44b5",
"T3W1_fr_tron-test_get_address.py::test_invalid_path": "e8156cf4eda1d29060f05b4a18d50032b0b344230609b7de7cababfe0a86b20b",
-"T3W1_fr_tron-test_sign_tx.py::test_cancel_transfer": "706cadcf40e9c537744df7b2f06cafef5e6de4497ed679bc4d1718edfbe0cd21",
-"T3W1_fr_tron-test_sign_tx.py::test_cancel_transfer_with_note": "b1f007b298e58991d60216223c85afd99d3037142068785b197c045ea88ea162",
+"T3W1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "b1f007b298e58991d60216223c85afd99d3037142068785b197c045ea88ea162",
+"T3W1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "706cadcf40e9c537744df7b2f06cafef5e6de4497ed679bc4d1718edfbe0cd21",
+"T3W1_fr_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "7f8ce6d5837b687fac12ff331cfafab01cfa91448d61e0eee6acffe4717a6693",
"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "04ddc6c568f9c2669115c278cd35f70d97fd1e7dd51ff1657996fa5a24bac12a",
"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "d994b9c7ca67ecc593c5e77e2f87923289ed8699e5d96329d74e5f34541b3c6e",
"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "e8156cf4eda1d29060f05b4a18d50032b0b344230609b7de7cababfe0a86b20b",
"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "dd1ab39b630a4f2a9c8e4f3a46e719ce45156ba0dab23aebfbfc438394cdc29b",
"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "6074de84ae65a02b4c513b0ba48d514a8389a9131fa199b14ab98c2bca407451",
+"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "e8156cf4eda1d29060f05b4a18d50032b0b344230609b7de7cababfe0a86b20b",
+"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "f8e182322c5e27f548e7a9fb7afcda00a112808ab869506803e20a32284ec785",
+"T3W1_fr_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "f1ef00041fd852cc9346828b8cc223b7b641af1630a29cd1f596b4022ffbfd7e",
"T3W1_fr_webauthn-test_msg_webauthn.py::test_add_remove": "5346304ff4c3d817f5804c64a656a3bd9e4c353575bb1fcbab46796003f61f64",
"T3W1_fr_webauthn-test_u2f_counter.py::test_u2f_counter": "033c546199c5ce4a81246ce4acfd1f16ad39fef83bd6deeb8fa5d67ad8842494",
"T3W1_fr_zcash-test_sign_tx.py::test_external_presigned": "8373497bf13956be92af35b3080ad69d79f90d7693b087ff1795faf680358eb4",
@@ -39439,13 +39531,17 @@
"T3W1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters3-result3]": "6c8bab06e8d7fa66d425063acc17e742ada3bbb737a729cb4e9ade10ba480f8c",
"T3W1_pt_tron-test_get_address.py::test_get_address_chunkify_details[parameters4-result4]": "b0e500a3db0cf7f382014b1896a90ac80149f0e1f64399c3effd87c92fa85ad6",
"T3W1_pt_tron-test_get_address.py::test_invalid_path": "1c74667c078e25e7e0d37c7b2aa35f7c8ab02cd88e74695ecb355c82a293b0cc",
-"T3W1_pt_tron-test_sign_tx.py::test_cancel_transfer": "ef945fa12eca1dcabfd8daeae52000a769207bcf0b4fc46dde674609b20e5f0c",
-"T3W1_pt_tron-test_sign_tx.py::test_cancel_transfer_with_note": "66f750f8631355ce228ec0086e93d7c8e78d729bfc8c50fcbb46e8084f38b24c",
+"T3W1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[Note_hello_world]": "66f750f8631355ce228ec0086e93d7c8e78d729bfc8c50fcbb46e8084f38b24c",
+"T3W1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TransferContract]": "ef945fa12eca1dcabfd8daeae52000a769207bcf0b4fc46dde674609b20e5f0c",
+"T3W1_pt_tron-test_sign_tx.py::test_cancel_sign_tx[TriggerSmartContract_USDT_transfer]": "df791c6630e40c268662df913b75480e6e93f8da0dcca4b4afd6291a82440e70",
"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[Note_bad_utf8_bytes]": "003bfce4e4914d9290957741fb981e65319d2429ea8e6e84f10376fb68fc5772",
"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[Note_hello_world]": "6b3b3c83a17aa274cbc97cafb462ca2721cbfe38b5a609f736de8e892911172a",
"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[Note_too_long_string]": "1c74667c078e25e7e0d37c7b2aa35f7c8ab02cd88e74695ecb355c82a293b0cc",
"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract]": "cf035ab83f367580d030e9d1644186b8c98fac6ab73c38c523816669d4b2faad",
"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[TransferContract_amount_int64_max]": "f8f1a383ff98416b37c94d14b410c2717f456cc35fa1ec97b132c982ddd6f3cd",
+"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_fee_too_high]": "1c74667c078e25e7e0d37c7b2aa35f7c8ab02cd88e74695ecb355c82a293b0cc",
+"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDD_transfer]": "b7c4f6267227fe3263a80da76bf7c4161c3d33f6d6e8742d3e6c80fdb3cb235f",
+"T3W1_pt_tron-test_sign_tx.py::test_sign_tx[TriggerSmartContract_USDT_transfer]": "36957b32d4e740d5171440529985bb83b9ac034b70079eca04c7c1d8c15deb9c",
"T3W1_pt_webauthn-test_msg_webauthn.py::test_add_remove": "a1ed451071cde0e63427435fd7b65cb69636cf2df720d37f78f4008142a2865b",
"T3W1_pt_webauthn-test_u2f_counter.py::test_u2f_counter": "3fb0b0df6622e98475343c3d518ef83717b0a7d0104b33708d19848035a57390",
"T3W1_pt_zcash-test_sign_tx.py::test_external_presigned": "1b60e959560544f2b7748a91239d213e66eda937c52733652b2b6515bc40ed97",
Why this scored 51/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.