feat(tron): add TransferContract support
What changed, and why it matters
This commit adds the ability to sign native TRON (TRX) transfers on Trezor hardware wallets. It introduces new message types, a signing workflow, user confirmation screens, and client-side helpers. The change is a feature addition rather than a fix for a known vulnerability, and there is no vendor statement that this resolves a security issue.
Treat as a routine feature commit. Reviewers should verify that the signing path validates the owner address against the derived key, that the 256-byte data limit and user confirmations are enforced on device, and that the protobuf wire ordering cannot be abused to sign unintended raw_data. No immediate security response is indicated by the supplied materials.
Security signals we found
New signing surface added for TRON TransferContract
Transaction data/memo length capped at 256 bytes with explicit DataError
User confirmation required for recipient address and total send amount
Signature produced over SHA-256 of serialized raw_data only
Marked as partial/WIP support in support.json for affected models
No vendor disclosure of security relevance in commit or references
Evidence from the diff
The patch implements Tron TransferContract signing: new protobuf messages (TronSignTx, TronTransferContract, TronSignature, TronContractRequest, TronRawTransaction and nested types), a core signing app (core/src/apps/tron/sign_tx.py), UI confirmation helpers, generated bindings for Python and Rust, test fixtures, and CLI support. The device validates the BIP-32 path, limits the transaction memo/data to 256 bytes, shows the recipient address and total amount, then signs the SHA-256 hash of the serialized raw transaction using secp256k1. The commit is marked as work-in-progress/partial support in debug builds for several device models.
Changed components
core/src/apps/tron/sign_tx.pycore/src/apps/tron/layout.pycore/src/apps/tron/consts.pycore/src/apps/workflow_handlers.pycommon/protob/messages-tron.protopython/src/trezorlib/tron.pypython/src/trezorlib/cli/tron.pycore/src/trezor/ui/layouts/bolt/caesar/delizia/eckhart/__init__.pyrust/trezor-client generated protobuf bindingsInspect captured patch +3204 / −157
diff --git a/common/defs/misc/misc.json b/common/defs/misc/misc.json
index dbd09766..78ada11b 100644
--- a/common/defs/misc/misc.json
+++ b/common/defs/misc/misc.json
@@ -103,5 +103,12 @@
"slip44": 501,
"curve": "ed25519",
"decimals": 9
+ },
+ {
+ "name": "Tron",
+ "shortcut": "TRX",
+ "slip44": 195,
+ "curve": "secp256k1",
+ "decimals": 6
}
]
diff --git a/common/defs/support.json b/common/defs/support.json
index 76b7e9ec..34bec4ca 100644
--- a/common/defs/support.json
+++ b/common/defs/support.json
@@ -115,7 +115,8 @@
"misc:XTZ": "not implemented",
"misc:tADA": "not implemented",
"misc:tXRP": "not implemented",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "not implemented"
}
},
"T2B1": {
@@ -234,7 +235,8 @@
"nem:PAC:CHS": "not for T2B1 (#2793)",
"nem:PAC:HRT": "not for T2B1 (#2793)",
"nem:XEM": "not for T2B1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
"T2T1": {
@@ -353,7 +355,8 @@
"bitcoin:TRC": "address_type collides with Bitcoin",
"bitcoin:tPART": "incompatible fork",
"misc:LSK": "Incompatible mainnet hard-fork",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
"T3B1": {
@@ -472,7 +475,8 @@
"nem:PAC:CHS": "not for T3B1 (#2793)",
"nem:PAC:HRT": "not for T3B1 (#2793)",
"nem:XEM": "not for T3B1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
"T3T1": {
@@ -591,7 +595,8 @@
"nem:PAC:CHS": "not for T3T1 (#2793)",
"nem:PAC:HRT": "not for T3T1 (#2793)",
"nem:XEM": "not for T3T1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
"T3W1": {
@@ -710,7 +715,8 @@
"nem:PAC:CHS": "not for T3W1 (#2793)",
"nem:PAC:HRT": "not for T3W1 (#2793)",
"nem:XEM": "not for T3W1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
@@ -830,7 +836,8 @@
"nem:PAC:CHS": "not for T3W1 (#2793)",
"nem:PAC:HRT": "not for T3W1 (#2793)",
"nem:XEM": "not for T3W1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
},
@@ -950,7 +957,8 @@
"nem:PAC:CHS": "not for T3W1 (#2793)",
"nem:PAC:HRT": "not for T3W1 (#2793)",
"nem:XEM": "not for T3W1 (#2793)",
- "eth:tHOL:17000": "Deprecated testnet"
+ "eth:tHOL:17000": "Deprecated testnet",
+ "misc:TRX": "WIP: Partial support in Debug build"
}
}
}
diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto
index 8d037caf..30cfb8fb 100644
--- a/common/protob/messages-management.proto
+++ b/common/protob/messages-management.proto
@@ -176,6 +176,7 @@ message Features {
Capability_Haptic = 21 [(bitcoin_only) = true];
Capability_BLE = 22 [(bitcoin_only) = true]; // Bluetooth Low Energy
Capability_NFC = 23 [(bitcoin_only) = true]; // Near Field Communications
+ Capability_Tron = 24;
}
}
diff --git a/common/protob/messages-tron.proto b/common/protob/messages-tron.proto
index ddcfb084..bed48877 100644
--- a/common/protob/messages-tron.proto
+++ b/common/protob/messages-tron.proto
@@ -12,9 +12,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,6 +22,82 @@ message TronGetAddress {
* @end
*/
message TronAddress {
- required string address = 1; // Tron address in base58_checked encoding
+ required string address = 1; // Tron address in Base58Check encoding
optional bytes mac = 2; // Address authentication code
}
+
+/**
+ * Request: ask device to sign Tron transaction
+ * @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.
+}
+
+/**
+ * Response: device is ready for client to send the next operation
+ * @next TronTransferContract
+ */
+message TronContractRequest {
+}
+
+/**
+ * Request: ask device to confirm this operation type
+ * @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)
+}
+
+/**
+ * Response: signature for transaction
+ * @end
+ */
+message TronSignature {
+ required bytes signature = 1; // Signature of the transaction
+}
+
+
+/**
+ * TronRawTransaction and embedded messages are used to encode the Tron transaction, not for communication.
+ * @start
+ * @end
+ */
+// https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/Tron.proto#L431-L445
+message TronRawTransaction {
+ required bytes ref_block_bytes = 1;
+ required bytes ref_block_hash = 4;
+ required uint64 expiration = 8;
+ optional bytes data = 10;
+ repeated TronRawContract contract = 11;
+ required uint64 timestamp = 14;
+ optional uint64 fee_limit = 18;
+
+ // https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/Tron.proto#L337-L385
+ 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
+ }
+
+ enum TronRawContractType {
+ TransferContract = 1;
+ }
+
+ required TronRawContractType type = 1;
+ required TronRawParameter parameter = 2;
+
+ }
+}
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index 3e24f5d2..b76b7e26 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -352,6 +352,10 @@ enum MessageType {
// Tron
MessageType_TronGetAddress = 2200 [(wire_in) = true];
MessageType_TronAddress = 2201 [(wire_out) = true];
+ MessageType_TronSignTx = 2202 [(wire_in) = true];
+ MessageType_TronSignature = 2203 [(wire_out) = true];
+ MessageType_TronContractRequest = 2204 [(wire_out) = true];
+ MessageType_TronTransferContract = 2205 [(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
new file mode 100644
index 00000000..3ed62635
--- /dev/null
+++ b/common/tests/fixtures/tron/sign_tx.json
@@ -0,0 +1,222 @@
+{
+ "comment": "raw field is used only for debugging. TODO: Remove raw field",
+ "setup": {
+ "mnemonic": "all all all all all all all all all all all all",
+ "passphrase": ""
+ },
+ "tests": [
+ {
+ "name": "TransferContract",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "e942",
+ "ref_block_hash": "6394747da9fee421",
+ "expiration": 1752562632000,
+ "timestamp": 1752562572000
+ },
+ "contract": {
+ "_message_type": "TronTransferContract",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "amount": 18123456
+ },
+ "raw_data_hex": "0a02e94222086394747da9fee42140c08afee680335a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d20870e0b5fae68033",
+ "raw": {
+ "visible": false,
+ "txID": "91813c4e057a4c881d9dc4981f041c33cffb17c41e860a53eb68e7995f5de821",
+ "raw_data_hex": "0a02e94222086394747da9fee42140c08afee680335a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d20870e0b5fae68033",
+ "raw_data": {
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "amount": 18123456
+ },
+ "type_url": "type.googleapis.com/protocol.TransferContract"
+ },
+ "type": "TransferContract"
+ }
+ ],
+ "ref_block_bytes": "e942",
+ "ref_block_hash": "6394747da9fee421",
+ "expiration": 1752562632000,
+ "timestamp": 1752562572000
+ }
+ }
+ },
+ "result": {
+ "signature": "a7f8602b02413e9dded0170daa5b4ada9a2679198af276be456f4faea1bc326f5070789bec5e6471de3f726f4fe0c9daced8df183e4a62804db26d5650c59a521C"
+ }
+ },
+ {
+ "name": "TransferContract_amount_int64_max",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "0fc4",
+ "ref_block_hash": "9643b084bc8b5cde",
+ "expiration": 1752568944000,
+ "timestamp": 1752571244333
+ },
+ "contract": {
+ "_message_type": "TronTransferContract",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "amount": 9223372036854775807
+ },
+ "raw_data_hex": "0a020fc422089643b084bc8b5cde4080abffe980335a6d080112690a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412380a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318ffffffffffffffff7f70adde8beb8033",
+ "comment": "TronWeb JavaScript SDK does not support big integers"
+ },
+ "result": {
+ "signature": "36db819a6c50b8c770ff1067a2753692fa8c8bfa7efde8ddfc2f891f7053d9955f6ffd0ee7d6217b448ac3515d97f6877159b721f2a78da78d1fcc10c1019dd51b"
+ }
+ },
+ {
+ "name": "Note_hello_world",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "ea2a",
+ "ref_block_hash": "d43320ee5a8b677f",
+ "expiration": 1752563334000,
+ "timestamp": 1752563274000,
+ "data": "68656c6c6f20776f726c6421"
+ },
+ "contract": {
+ "_message_type": "TronTransferContract",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "amount": 18123456
+ },
+ "raw_data_hex": "0a02ea2a2208d43320ee5a8b677f40f0f6a8e78033520c68656c6c6f20776f726c64215a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d2087090a2a5e78033",
+ "raw": {
+ "txID": "2b166e72fe1cfb71345d5061d15e10ac2cc5ee3bb85b5ad34a14c9bf112b8372",
+ "raw_data": {
+ "data": "68656c6c6f20776f726c6421",
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "amount": 18123456,
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283"
+ },
+ "type_url": "type.googleapis.com/protocol.TransferContract"
+ },
+ "type": "TransferContract"
+ }
+ ],
+ "ref_block_bytes": "ea2a",
+ "ref_block_hash": "d43320ee5a8b677f",
+ "expiration": 1752563334000,
+ "timestamp": 1752563274000
+ },
+ "raw_data_hex": "0a02ea2a2208d43320ee5a8b677f40f0f6a8e78033520c68656c6c6f20776f726c64215a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d2087090a2a5e78033",
+ "visible": false
+ }
+ },
+ "result": {
+ "signature": "7b43c3e8977db4f5475656eec2e643bf1549d923f29c28c009c85b51556a78602aa0f3f2780cb19655dfa8d4eb2102a3c6b3440ce5b7448a814c860cdc925dd21C"
+ }
+ },
+ {
+ "name": "Note_bad_utf8_bytes",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "ea2a",
+ "ref_block_hash": "d43320ee5a8b677f",
+ "expiration": 1752563334000,
+ "timestamp": 1752563274000,
+ "data": "deaddeaddeaddeaddeaddeaddeaddeaddead"
+ },
+ "contract": {
+ "_message_type": "TronTransferContract",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "amount": 18123456
+ },
+ "raw_data_hex": "0a02ea2a2208d43320ee5a8b677f40f0f6a8e780335212deaddeaddeaddeaddeaddeaddeaddeaddead5a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d2087090a2a5e78033",
+ "raw": {
+ "txID": "b7922b85edb82ea58f4510d46b0ad2dd5fb112fb7ee89fc39590c7147f3f1a29",
+ "raw_data": {
+ "data": "deaddeaddeaddeaddeaddeaddeaddeaddead",
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "amount": 18123456,
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283"
+ },
+ "type_url": "type.googleapis.com/protocol.TransferContract"
+ },
+ "type": "TransferContract"
+ }
+ ],
+ "ref_block_bytes": "ea2a",
+ "ref_block_hash": "d43320ee5a8b677f",
+ "expiration": 1752563334000,
+ "timestamp": 1752563274000
+ },
+ "raw_data_hex": "0a02ea2a2208d43320ee5a8b677f40f0f6a8e780335212deaddeaddeaddeaddeaddeaddeaddeaddead5a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d2087090a2a5e78033",
+ "visible": false
+ }
+ },
+ "result": {
+ "signature": "b573db3a80dd15cfa8fbf2961a2d615ca0f62b4eb3b591bd0e3ac009dd31cc2461aeb9d31306c9e30f0afdcfa256bdfc03fed5fe01d441a5c867b2b142a9bbbe1B"
+ }
+ },
+ {
+ "name": "Note_too_long_string",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "ea54",
+ "ref_block_hash": "e5ae03970dae489a",
+ "expiration": 1752563466000,
+ "timestamp": 1752563406000,
+ "data": "deade7fb3e7e39d4c650449e8d80c2731c4cc7fe0c7888a189a6eb1ead3621729a3ae8578299b2a1a35edf5ce3d9ae732cc4f202a34304900156ab37a78917609ae58dae01cb4de5ed98ff79a56e7f0e41f6042d3a734ae3b438209294a8a1899ddd4dee47c1cc86a0b2bf7d57d8457dfeed5fc2a24cd553c08a831f10a02ce5fb776d287e71e6a1a899ae966a0928f01ce6d3c4b0ee5151872c6dd80fefbfb79cff1949bfb5aba76b624e4c58eadf6c8ad97680e34d50807dc628dce44b39f3f405d5da406eb109cabdfc8c782be22f39c2e8814946e69977781fd66c691416b2785f41b508db37e819257751ee97794a57d7a8db5fb4b2cfce6031b76874922010"
+ },
+ "contract": {
+ "_message_type": "TronTransferContract",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283",
+ "amount": 18123456
+ },
+ "raw_data_hex": "0a02ea542208e5ae03970dae489a4090feb0e78033528202deade7fb3e7e39d4c650449e8d80c2731c4cc7fe0c7888a189a6eb1ead3621729a3ae8578299b2a1a35edf5ce3d9ae732cc4f202a34304900156ab37a78917609ae58dae01cb4de5ed98ff79a56e7f0e41f6042d3a734ae3b438209294a8a1899ddd4dee47c1cc86a0b2bf7d57d8457dfeed5fc2a24cd553c08a831f10a02ce5fb776d287e71e6a1a899ae966a0928f01ce6d3c4b0ee5151872c6dd80fefbfb79cff1949bfb5aba76b624e4c58eadf6c8ad97680e34d50807dc628dce44b39f3f405d5da406eb109cabdfc8c782be22f39c2e8814946e69977781fd66c691416b2785f41b508db37e819257751ee97794a57d7a8db5fb4b2cfce6031b768749220105a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d20870b0a9ade78033",
+ "raw": {
+ "txID": "cf8f946e3dc28d9f6076c7dbb5418c5996fce003b7bdca34a50b052200d7d575",
+ "raw_data": {
+ "data": "deade7fb3e7e39d4c650449e8d80c2731c4cc7fe0c7888a189a6eb1ead3621729a3ae8578299b2a1a35edf5ce3d9ae732cc4f202a34304900156ab37a78917609ae58dae01cb4de5ed98ff79a56e7f0e41f6042d3a734ae3b438209294a8a1899ddd4dee47c1cc86a0b2bf7d57d8457dfeed5fc2a24cd553c08a831f10a02ce5fb776d287e71e6a1a899ae966a0928f01ce6d3c4b0ee5151872c6dd80fefbfb79cff1949bfb5aba76b624e4c58eadf6c8ad97680e34d50807dc628dce44b39f3f405d5da406eb109cabdfc8c782be22f39c2e8814946e69977781fd66c691416b2785f41b508db37e819257751ee97794a57d7a8db5fb4b2cfce6031b76874922010",
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "amount": 18123456,
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58",
+ "to_address": "4141f82674a30ae1328745d08afe2d1a0a24195283"
+ },
+ "type_url": "type.googleapis.com/protocol.TransferContract"
+ },
+ "type": "TransferContract"
+ }
+ ],
+ "ref_block_bytes": "ea54",
+ "ref_block_hash": "e5ae03970dae489a",
+ "expiration": 1752563466000,
+ "timestamp": 1752563406000
+ },
+ "raw_data_hex": "0a02ea542208e5ae03970dae489a4090feb0e78033528202deade7fb3e7e39d4c650449e8d80c2731c4cc7fe0c7888a189a6eb1ead3621729a3ae8578299b2a1a35edf5ce3d9ae732cc4f202a34304900156ab37a78917609ae58dae01cb4de5ed98ff79a56e7f0e41f6042d3a734ae3b438209294a8a1899ddd4dee47c1cc86a0b2bf7d57d8457dfeed5fc2a24cd553c08a831f10a02ce5fb776d287e71e6a1a899ae966a0928f01ce6d3c4b0ee5151872c6dd80fefbfb79cff1949bfb5aba76b624e4c58eadf6c8ad97680e34d50807dc628dce44b39f3f405d5da406eb109cabdfc8c782be22f39c2e8814946e69977781fd66c691416b2785f41b508db37e819257751ee97794a57d7a8db5fb4b2cfce6031b768749220105a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5812154141f82674a30ae1328745d08afe2d1a0a2419528318c095d20870b0a9ade78033",
+ "visible": false
+ }
+ },
+ "result": {
+ "error_message": "Tron: data field too long"
+ }
+ }
+ ]
+}
diff --git a/core/SConscript.firmware b/core/SConscript.firmware
index 4c341448..b434f3ef 100644
--- a/core/SConscript.firmware
+++ b/core/SConscript.firmware
@@ -700,6 +700,7 @@ if FROZEN:
SOURCE_PY_DIR + 'trezor/enums/Stellar*.py',
SOURCE_PY_DIR + 'trezor/enums/Tezos*.py',
SOURCE_PY_DIR + 'trezor/enums/Zcash*.py',
+ SOURCE_PY_DIR + 'trezor/enums/Tron*.py'
] + (
SOURCE_PY_DEBUG_ENUMS if PYOPT != '0' else []
) + (
diff --git a/core/SConscript.unix b/core/SConscript.unix
index 37fa573e..bc7f703f 100644
--- a/core/SConscript.unix
+++ b/core/SConscript.unix
@@ -712,6 +712,7 @@ if FROZEN:
SOURCE_PY_DIR + 'trezor/enums/Stellar*.py',
SOURCE_PY_DIR + 'trezor/enums/Tezos*.py',
SOURCE_PY_DIR + 'trezor/enums/Zcash*.py',
+ SOURCE_PY_DIR + 'trezor/enums/Tron*.py',
] + (
SOURCE_PY_DEBUG_ENUMS if PYOPT != '0' else []
) + (
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 2eba52ce..487a1580 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -1016,6 +1016,7 @@ static void _librust_qstrs(void) {
MP_QSTR_words__name;
MP_QSTR_words__no;
MP_QSTR_words__not_recommended;
+ MP_QSTR_words__note;
MP_QSTR_words__off;
MP_QSTR_words__on;
MP_QSTR_words__operation_cancelled;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index e28830e0..ba31a1b0 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1559,6 +1559,7 @@ pub enum TranslatedString {
secure_sync__delegated_identity_key_no_thp = 1170, // "Allow Trezor Suite to use Suite Sync with this Trezor?"
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"
}
impl TranslatedString {
@@ -5075,6 +5076,7 @@ impl TranslatedString {
(Self::secure_sync__delegated_identity_key_no_thp, "Allow Trezor Suite to use Suite Sync with this Trezor?"),
(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"),
];
#[cfg(feature = "micropython")]
@@ -6584,6 +6586,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__name, Self::words__name),
(Qstr::MP_QSTR_words__no, Self::words__no),
(Qstr::MP_QSTR_words__not_recommended, Self::words__not_recommended),
+ (Qstr::MP_QSTR_words__note, Self::words__note),
(Qstr::MP_QSTR_words__off, Self::words__off),
(Qstr::MP_QSTR_words__on, Self::words__on),
(Qstr::MP_QSTR_words__operation_cancelled, Self::words__operation_cancelled),
diff --git a/core/embed/upymod/qstrdefsport.h b/core/embed/upymod/qstrdefsport.h
index 110160fe..923db32e 100644
--- a/core/embed/upymod/qstrdefsport.h
+++ b/core/embed/upymod/qstrdefsport.h
@@ -488,6 +488,7 @@ Q(StellarMemoType)
Q(StellarSignerType)
Q(TezosBallotType)
Q(TezosContractType)
+Q(TronRawContractType)
Q(account_path_check)
Q(actions)
Q(add_resident_credential)
@@ -650,8 +651,11 @@ Q(apps.tezos.helpers)
Q(apps.tezos.layout)
Q(apps.tezos.sign_tx)
Q(apps.tron)
+Q(apps.tron.consts)
Q(apps.tron.get_address)
Q(apps.tron.helpers)
+Q(apps.tron.layout)
+Q(apps.tron.sign_tx)
Q(apps.webauthn)
Q(apps.webauthn.add_resident_credential)
Q(apps.webauthn.common)
@@ -787,6 +791,7 @@ Q(trezor.enums.StellarMemoType)
Q(trezor.enums.StellarSignerType)
Q(trezor.enums.TezosBallotType)
Q(trezor.enums.TezosContractType)
+Q(trezor.enums.TronRawContractType)
Q(tron)
Q(tx_ct_key)
Q(tx_ecdh)
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 41976e06..6a17a9fc 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -1089,6 +1089,7 @@ class TR:
words__name: str = "Name"
words__no: str = "No"
words__not_recommended: str = "Not recommended!"
+ words__note: str = "Note"
words__off: str = "OFF"
words__on: str = "ON"
words__operation_cancelled: str = "Operation cancelled"
diff --git a/core/src/apps/base.py b/core/src/apps/base.py
index 2032d132..6a81d47f 100644
--- a/core/src/apps/base.py
+++ b/core/src/apps/base.py
@@ -132,6 +132,7 @@ def get_features() -> Features:
Capability.Ripple,
Capability.Stellar,
Capability.Tezos,
+ Capability.Tron,
Capability.U2F,
Capability.Shamir,
Capability.ShamirGroups,
diff --git a/core/src/apps/tron/README.md b/core/src/apps/tron/README.md
new file mode 100644
index 00000000..13c30694
--- /dev/null
+++ b/core/src/apps/tron/README.md
@@ -0,0 +1,35 @@
+# TRON
+
+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.
+
+It uses `Protobuf` for encoding its transactions. Each transaction contains its main operation as a `contract`[^1] along with supported data like expiration timestamp, block hash reference[^2], etc.
+
+[`TronWeb` implementation](https://github.com/tronprotocol/tronweb) should be used as source of truth. The documentation on [tron.network](developers.tron.network) and [Tronprotocol](https://github.com/tronprotocol) were incorrect in some places.
+
+## Implementation Notes
+
+Transaction signing begins by sending `TronSignTx` message that contains the header information, including the BIP32 path to the key (e.g. `m/44h/195h/0h/0/0`). Trezor then awaits the contract to be included in the transaction as another message (e.g. `TronTransferContract`). When a valid contract is received, Trezor signs the `raw_data` part of the final transaction and sends the signature in the `TronSignature` message.
+
+## Fees
+
+The `Bandwidth` consumed for processing any transaction is equal to the size of the transaction, i.e. 250 byte transaction = 250 Bandwidth points.
+`Energy` is consumed only on smart contract invocation calls like `TRC-20` tokens are being transferred. If the user has sufficient `Energy` and `Bandwidth` for a transaction, they generally don't have to pay any fee[^3]. If they lack either, some `TRX` is burned to pay for the remaining resource.
+
+### 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.
+
+## Features supported
+
+- [X] Generate addresses for Receiving `TRX` or other tokens.
+- [X] `TransferContract`: Sending `TRX`
+- [ ] `TriggerSmartContract`: Send `USDT`, `USDD`, etc.
+- [ ] `FreezeBalanceV2`: Stake `TRX` to get more `Bandwidth` or `Energy`
+- [ ] `UnfreezeBalanceV2`: Unstake frozen `TRX`
+
+### Notes
+
+[^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.
diff --git a/core/src/apps/tron/consts.py b/core/src/apps/tron/consts.py
new file mode 100644
index 00000000..f5bfc124
--- /dev/null
+++ b/core/src/apps/tron/consts.py
@@ -0,0 +1,24 @@
+from typing import TYPE_CHECKING
+
+from trezor.enums import MessageType
+
+if TYPE_CHECKING:
+ from trezor.messages import TronTransferContract
+
+ TronMessageType = TronTransferContract
+
+TYPE_URL_TEMPLATE = "type.googleapis.com/protocol."
+
+CONTRACT_TYPES = (MessageType.TronTransferContract,)
+
+# https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/Tron.proto#L339-L379
+CONTRACT_TYPE_NAMES = {
+ 1: "TransferContract",
+}
+
+
+def get_contract_type_name(contract_type: int) -> str:
+ """Get contract type name by its number."""
+ if contract_type in CONTRACT_TYPE_NAMES:
+ return CONTRACT_TYPE_NAMES[contract_type]
+ raise ValueError(f"Unknown contract type: {contract_type}")
diff --git a/core/src/apps/tron/helpers.py b/core/src/apps/tron/helpers.py
index c7684e88..d89caed1 100644
--- a/core/src/apps/tron/helpers.py
+++ b/core/src/apps/tron/helpers.py
@@ -1,7 +1,8 @@
from trezor.crypto import base58
-from trezor.crypto.hashlib import sha3_256
def address_from_public_key(pubkey: bytes) -> str:
+ from trezor.crypto.hashlib import sha3_256
+
address_bytes = b"\x41" + sha3_256(pubkey[1:], keccak=True).digest()[12:]
return base58.encode_check(address_bytes)
diff --git a/core/src/apps/tron/layout.py b/core/src/apps/tron/layout.py
new file mode 100644
index 00000000..45a6f408
--- /dev/null
+++ b/core/src/apps/tron/layout.py
@@ -0,0 +1,25 @@
+from micropython import const
+from typing import TYPE_CHECKING
+
+import trezor.ui.layouts as layouts
+from trezor import TR, strings
+from trezor.crypto import base58
+
+if TYPE_CHECKING:
+ from trezor.messages import TronTransferContract
+
+
+def format_trx_amount(amount: int) -> str:
+ # 1 SUN = 0.000001 TRX
+ _TRX_AMOUNT_DECIMALS = const(6)
+
+ 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)
+ await layouts.confirm_address(
+ TR.send__title_sending_to,
+ to_address,
+ chunkify=True,
+ )
diff --git a/core/src/apps/tron/sign_tx.py b/core/src/apps/tron/sign_tx.py
new file mode 100644
index 00000000..1f399285
--- /dev/null
+++ b/core/src/apps/tron/sign_tx.py
@@ -0,0 +1,93 @@
+from micropython import const
+from typing import TYPE_CHECKING
+
+from trezor import messages
+from trezor.protobuf import dump_message_buffer
+from trezor.wire import DataError
+
+from apps.common.keychain import with_slip44_keychain
+
+from . import CURVE, PATTERN, SLIP44_ID, consts, layout
+
+if TYPE_CHECKING:
+ from trezor.messages import TronRawContract, TronSignature, TronSignTx
+ from trezor.protobuf import MessageType
+
+ from apps.common.keychain import Keychain
+
+
+@with_slip44_keychain(PATTERN, slip44_id=SLIP44_ID, curve=CURVE)
+async def sign_tx(msg: TronSignTx, keychain: Keychain) -> TronSignature:
+ from trezor import TR
+ from trezor.crypto.curve import secp256k1
+ from trezor.crypto.hashlib import sha256
+ from trezor.ui.layouts import confirm_blob, confirm_tron_send, show_continue_in_app
+ from trezor.wire.context import call_any
+
+ from apps.common import paths
+
+ _MAX_DATA_LENGTH = const(256)
+
+ await paths.validate_path(keychain, msg.address_n)
+ node = keychain.derive(msg.address_n)
+
+ # It is also not necessary for it to be UTF-8 encoded but all applications using it use it as a Note to be attached with the transaction.
+ if msg.data and msg.data != b"":
+ if len(msg.data) > _MAX_DATA_LENGTH:
+ raise DataError("Tron: data field too long")
+ await confirm_blob(
+ "confirm_tx_note",
+ TR.words__note,
+ bytes(msg.data).decode("utf-8", "replace"),
+ chunkify=False,
+ )
+
+ contract = await call_any(messages.TronContractRequest(), *consts.CONTRACT_TYPES)
+ raw_contract, total_send = await process_contract(contract)
+
+ await confirm_tron_send(total_send)
+
+ raw_tx = messages.TronRawTransaction(
+ ref_block_bytes=msg.ref_block_bytes,
+ ref_block_hash=msg.ref_block_hash,
+ expiration=msg.expiration,
+ data=msg.data,
+ contract=[raw_contract],
+ timestamp=msg.timestamp,
+ fee_limit=msg.fee_limit,
+ )
+ serialized_tx = dump_message_buffer(raw_tx)
+
+ w_hash = sha256(serialized_tx).digest()
+
+ # https://tronprotocol.github.io/documentation-en/mechanism-algorithm/account/#algorithm
+ signature = secp256k1.sign(node.private_key(), w_hash, False)
+ signature = signature[1:65] + signature[0:1] # r || s || v
+
+ show_continue_in_app(TR.send__transaction_signed)
+ return messages.TronSignature(signature=signature)
+
+
+async def process_contract(
+ contract: MessageType,
+) -> tuple[TronRawContract, str]:
+ from trezor.enums import TronRawContractType
+
+ if messages.TronTransferContract.is_type_of(contract):
+ contract_type = TronRawContractType.TransferContract
+ await layout.confirm_transfer_contract(contract)
+ total_send = layout.format_trx_amount(contract.amount)
+ else:
+ raise DataError("Tron: contract type unknown")
+
+ serialized_parameter = dump_message_buffer(contract)
+ raw_contract = messages.TronRawContract(
+ type=contract_type,
+ parameter=messages.TronRawParameter(
+ type_url=consts.TYPE_URL_TEMPLATE
+ + consts.get_contract_type_name(contract_type),
+ value=serialized_parameter,
+ ),
+ )
+
+ return raw_contract, total_send
diff --git a/core/src/apps/workflow_handlers.py b/core/src/apps/workflow_handlers.py
index 270f46d0..b18596b3 100644
--- a/core/src/apps/workflow_handlers.py
+++ b/core/src/apps/workflow_handlers.py
@@ -128,6 +128,12 @@ def _find_message_handler_module(msg_type: int) -> str:
if msg_type == MessageType.NostrSignEvent:
return "apps.nostr.sign_event"
+ # tron
+ if msg_type == MessageType.TronGetAddress:
+ return "apps.tron.get_address"
+ if msg_type == MessageType.TronSignTx:
+ return "apps.tron.sign_tx"
+
if msg_type == MessageType.SetU2FCounter:
return "apps.management.set_u2f_counter"
if msg_type == MessageType.GetNextU2FCounter:
@@ -225,10 +231,6 @@ def _find_message_handler_module(msg_type: int) -> str:
if msg_type == MessageType.SolanaSignTx:
return "apps.solana.sign_tx"
- # tron
- if msg_type == MessageType.TronGetAddress:
- return "apps.tron.get_address"
-
raise ValueError
diff --git a/core/src/trezor/enums/Capability.py b/core/src/trezor/enums/Capability.py
index 91b2d692..e6adba33 100644
--- a/core/src/trezor/enums/Capability.py
+++ b/core/src/trezor/enums/Capability.py
@@ -27,3 +27,4 @@ if not utils.BITCOIN_ONLY:
Tezos = 13
U2F = 14
Solana = 18
+ Tron = 24
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 531b72cf..6fd49fb8 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -270,3 +270,7 @@ if not utils.BITCOIN_ONLY:
NostrEventSignature = 2004
TronGetAddress = 2200
TronAddress = 2201
+ TronSignTx = 2202
+ TronSignature = 2203
+ TronContractRequest = 2204
+ TronTransferContract = 2205
diff --git a/core/src/trezor/enums/TronRawContractType.py b/core/src/trezor/enums/TronRawContractType.py
new file mode 100644
index 00000000..49e3f49d
--- /dev/null
+++ b/core/src/trezor/enums/TronRawContractType.py
@@ -0,0 +1,5 @@
+# Automatically generated by pb2py
+# fmt: off
+# isort:skip_file
+
+TransferContract = 1
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index cd4da3b6..9d9ae51c 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -234,6 +234,7 @@ if TYPE_CHECKING:
Haptic = 21
BLE = 22
NFC = 23
+ Tron = 24
class SdProtectOperationType(IntEnum):
DISABLE = 0
@@ -370,6 +371,9 @@ if TYPE_CHECKING:
QrCode = 3
NFC = 4
+ class TronRawContractType(IntEnum):
+ TransferContract = 1
+
class MessageType(IntEnum):
Initialize = 0
Ping = 1
@@ -632,6 +636,10 @@ if TYPE_CHECKING:
EvoluDelegatedIdentityKey = 2105
TronGetAddress = 2200
TronAddress = 2201
+ TronSignTx = 2202
+ TronSignature = 2203
+ TronContractRequest = 2204
+ TronTransferContract = 2205
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 9cb2bc10..96b1ef6c 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -69,6 +69,7 @@ if TYPE_CHECKING:
from trezor.enums import TezosContractType # noqa: F401
from trezor.enums import ThpMessageType # noqa: F401
from trezor.enums import ThpPairingMethod # noqa: F401
+ from trezor.enums import TronRawContractType # noqa: F401
from trezor.enums import WordRequestType # noqa: F401
class BenchmarkListNames(protobuf.MessageType):
@@ -6829,6 +6830,128 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["TronAddress"]:
return isinstance(msg, cls)
+ class TronSignTx(protobuf.MessageType):
+ address_n: "list[int]"
+ ref_block_bytes: "AnyBytes"
+ ref_block_hash: "AnyBytes"
+ expiration: "int"
+ data: "AnyBytes | None"
+ timestamp: "int"
+ fee_limit: "int | None"
+
+ def __init__(
+ self,
+ *,
+ ref_block_bytes: "AnyBytes",
+ ref_block_hash: "AnyBytes",
+ expiration: "int",
+ timestamp: "int",
+ address_n: "list[int] | None" = None,
+ data: "AnyBytes | None" = None,
+ fee_limit: "int | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronSignTx"]:
+ return isinstance(msg, cls)
+
+ class TronContractRequest(protobuf.MessageType):
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronContractRequest"]:
+ return isinstance(msg, cls)
+
+ class TronTransferContract(protobuf.MessageType):
+ owner_address: "AnyBytes"
+ to_address: "AnyBytes"
+ amount: "int"
+
+ def __init__(
+ self,
+ *,
+ owner_address: "AnyBytes",
+ to_address: "AnyBytes",
+ amount: "int",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronTransferContract"]:
+ return isinstance(msg, cls)
+
+ class TronSignature(protobuf.MessageType):
+ signature: "AnyBytes"
+
+ def __init__(
+ self,
+ *,
+ signature: "AnyBytes",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronSignature"]:
+ return isinstance(msg, cls)
+
+ class TronRawTransaction(protobuf.MessageType):
+ ref_block_bytes: "AnyBytes"
+ ref_block_hash: "AnyBytes"
+ expiration: "int"
+ data: "AnyBytes | None"
+ contract: "list[TronRawContract]"
+ timestamp: "int"
+ fee_limit: "int | None"
+
+ def __init__(
+ self,
+ *,
+ ref_block_bytes: "AnyBytes",
+ ref_block_hash: "AnyBytes",
+ expiration: "int",
+ timestamp: "int",
+ contract: "list[TronRawContract] | None" = None,
+ data: "AnyBytes | None" = None,
+ fee_limit: "int | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronRawTransaction"]:
+ return isinstance(msg, cls)
+
+ class TronRawContract(protobuf.MessageType):
+ type: "TronRawContractType"
+ parameter: "TronRawParameter"
+
+ def __init__(
+ self,
+ *,
+ type: "TronRawContractType",
+ parameter: "TronRawParameter",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronRawContract"]:
+ return isinstance(msg, cls)
+
+ class TronRawParameter(protobuf.MessageType):
+ type_url: "str"
+ value: "AnyBytes"
+
+ def __init__(
+ self,
+ *,
+ type_url: "str",
+ value: "AnyBytes",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronRawParameter"]:
+ return isinstance(msg, cls)
+
class WebAuthnListResidentCredentials(protobuf.MessageType):
@classmethod
diff --git a/core/src/trezor/ui/layouts/bolt/__init__.py b/core/src/trezor/ui/layouts/bolt/__init__.py
index 98a8ffc1..6e86b20c 100644
--- a/core/src/trezor/ui/layouts/bolt/__init__.py
+++ b/core/src/trezor/ui/layouts/bolt/__init__.py
@@ -1449,6 +1449,19 @@ if not utils.BITCOIN_ONLY:
chunkify=False,
)
+ if __debug__:
+
+ def confirm_tron_send(amount: str) -> Awaitable[None]:
+ return _confirm_summary(
+ amount,
+ amount_label=f"{TR.send__total_amount}:",
+ fee="",
+ fee_label="",
+ extra_items=None,
+ br_name="confirm_tron_send",
+ br_code=ButtonRequestType.SignTx,
+ )
+
def confirm_joint_total(spending_amount: str, total_amount: str) -> Awaitable[None]:
return raise_if_not_confirmed(
diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py
index 5f96e356..dbb37034 100644
--- a/core/src/trezor/ui/layouts/caesar/__init__.py
+++ b/core/src/trezor/ui/layouts/caesar/__init__.py
@@ -1501,6 +1501,20 @@ if not utils.BITCOIN_ONLY:
chunkify=False,
)
+ if __debug__:
+
+ def confirm_tron_send(amount: str) -> Awaitable[None]:
+ return raise_if_not_confirmed(
+ trezorui_api.confirm_summary(
+ amount=amount,
+ amount_label=TR.send__total_amount,
+ fee="",
+ fee_label="",
+ ),
+ br_name="confirm_tron_send",
+ br_code=ButtonRequestType.SignTx,
+ )
+
def confirm_joint_total(spending_amount: str, total_amount: str) -> Awaitable[None]:
return confirm_properties(
diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py
index 7a61aac6..8055ad1b 100644
--- a/core/src/trezor/ui/layouts/delizia/__init__.py
+++ b/core/src/trezor/ui/layouts/delizia/__init__.py
@@ -1370,6 +1370,19 @@ if not utils.BITCOIN_ONLY:
chunkify=False,
)
+ if __debug__:
+
+ def confirm_tron_send(amount: str) -> Awaitable[None]:
+ return _confirm_summary(
+ amount,
+ amount_label=TR.send__total_amount,
+ fee="",
+ fee_label="",
+ extra_items=None,
+ br_name="confirm_tron_send",
+ br_code=ButtonRequestType.SignTx,
+ )
+
def confirm_joint_total(spending_amount: str, total_amount: str) -> Awaitable[None]:
return _confirm_summary(
diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py
index fa2fbe21..3db1c364 100644
--- a/core/src/trezor/ui/layouts/eckhart/__init__.py
+++ b/core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -1394,6 +1394,19 @@ if not utils.BITCOIN_ONLY:
chunkify=False,
)
+ if __debug__:
+
+ def confirm_tron_send(amount: str) -> Awaitable[None]:
+ return _confirm_summary(
+ amount,
+ amount_label=TR.send__total_amount,
+ fee="",
+ fee_label="",
+ extra_items=None,
+ br_name="confirm_tron_send",
+ br_code=ButtonRequestType.SignTx,
+ )
+
def confirm_joint_total(spending_amount: str, total_amount: str) -> Awaitable[None]:
return _confirm_summary(
diff --git a/core/translations/en.json b/core/translations/en.json
index 6988ba42..805d3f18 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -2286,6 +2286,7 @@
"words__name": "Name",
"words__no": "No",
"words__not_recommended": "Not recommended!",
+ "words__note": "Note",
"words__off": "OFF",
"words__on": "ON",
"words__operation_cancelled": "Operation cancelled",
diff --git a/core/translations/order.json b/core/translations/order.json
index 5bb70186..8e068615 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1172,5 +1172,6 @@
"1170": "secure_sync__delegated_identity_key_no_thp",
"1171": "secure_sync__delegated_identity_key_thp",
"1172": "secure_sync__evolu_node_no_optiga",
- "1173": "secure_sync__header"
+ "1173": "secure_sync__header",
+ "1174": "words__note"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 625c28c0..d85cd30a 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "19960ba2ab2d4c96f12925bad01cc5d12bde396cfefa955519be3f171eec4f92",
- "datetime": "2026-01-05T10:56:41.158238+00:00",
- "commit": "2ea5146f8d2774bc213ac2a3d95ed77799260637"
+ "merkle_root": "9654cc0b1c6e21de19c7356e40363225cc103689c801b7e00fa94a3004487e69",
+ "datetime": "2026-01-06T06:45:30.091042+00:00",
+ "commit": "74100d3a3a8ee2b1c8028f4619e9226ae9f0dda7"
},
"history": [
{
diff --git a/python/src/trezorlib/cli/tron.py b/python/src/trezorlib/cli/tron.py
index 9a2847b0..3c4a1f44 100644
--- a/python/src/trezorlib/cli/tron.py
+++ b/python/src/trezorlib/cli/tron.py
@@ -33,3 +33,23 @@ def get_address(
"""Get Tron address"""
address_n = tools.parse_path(address)
return tron.get_address(session, address_n, show_display, chunkify)
+
+
+@cli.command()
+@click.option(
+ "-n",
+ "--address",
+ required=True,
+ help=PATH_HELP,
+)
+@click.argument("raw_data_hex", type=str)
+@with_session
+def sign_tx(session: "Session", address: str, raw_data_hex: str) -> str:
+ """Sign a raw transaction."""
+
+ raw_data = bytes.fromhex(raw_data_hex)
+ tx, contract = tron.from_raw_data(raw_data)
+ address_n = tools.parse_path(address)
+ signed_tx = tron.sign_tx(session, tx, contract, address_n)
+
+ return signed_tx.signature.hex()
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 370102f3..36496037 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -263,6 +263,7 @@ class Capability(IntEnum):
Haptic = 21
BLE = 22
NFC = 23
+ Tron = 24
class SdProtectOperationType(IntEnum):
@@ -423,6 +424,10 @@ class ThpPairingMethod(IntEnum):
NFC = 4
+class TronRawContractType(IntEnum):
+ TransferContract = 1
+
+
class MessageType(IntEnum):
Initialize = 0
Ping = 1
@@ -685,6 +690,10 @@ class MessageType(IntEnum):
EvoluDelegatedIdentityKey = 2105
TronGetAddress = 2200
TronAddress = 2201
+ TronSignTx = 2202
+ TronSignature = 2203
+ TronContractRequest = 2204
+ TronTransferContract = 2205
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
@@ -8616,6 +8625,142 @@ class TronAddress(protobuf.MessageType):
self.mac = mac
+class TronSignTx(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2202
+ FIELDS = {
+ 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),
+ 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),
+ }
+
+ def __init__(
+ self,
+ *,
+ ref_block_bytes: "bytes",
+ ref_block_hash: "bytes",
+ expiration: "int",
+ timestamp: "int",
+ address_n: Optional[Sequence["int"]] = None,
+ data: Optional["bytes"] = None,
+ fee_limit: Optional["int"] = None,
+ ) -> None:
+ self.address_n: Sequence["int"] = address_n if address_n is not None else []
+ self.ref_block_bytes = ref_block_bytes
+ self.ref_block_hash = ref_block_hash
+ self.expiration = expiration
+ self.timestamp = timestamp
+ self.data = data
+ self.fee_limit = fee_limit
+
+
+class TronContractRequest(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2204
+
+
+class TronTransferContract(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2205
+ FIELDS = {
+ 1: protobuf.Field("owner_address", "bytes", repeated=False, required=True),
+ 2: protobuf.Field("to_address", "bytes", repeated=False, required=True),
+ 3: protobuf.Field("amount", "uint64", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ owner_address: "bytes",
+ to_address: "bytes",
+ amount: "int",
+ ) -> None:
+ self.owner_address = owner_address
+ self.to_address = to_address
+ self.amount = amount
+
+
+class TronSignature(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2203
+ FIELDS = {
+ 1: protobuf.Field("signature", "bytes", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ signature: "bytes",
+ ) -> None:
+ self.signature = signature
+
+
+class TronRawTransaction(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = None
+ FIELDS = {
+ 1: protobuf.Field("ref_block_bytes", "bytes", repeated=False, required=True),
+ 4: protobuf.Field("ref_block_hash", "bytes", repeated=False, required=True),
+ 8: protobuf.Field("expiration", "uint64", repeated=False, required=True),
+ 10: protobuf.Field("data", "bytes", repeated=False, required=False, default=None),
+ 11: protobuf.Field("contract", "TronRawContract", repeated=True, required=False, default=None),
+ 14: protobuf.Field("timestamp", "uint64", repeated=False, required=True),
+ 18: protobuf.Field("fee_limit", "uint64", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ ref_block_bytes: "bytes",
+ ref_block_hash: "bytes",
+ expiration: "int",
+ timestamp: "int",
+ contract: Optional[Sequence["TronRawContract"]] = None,
+ data: Optional["bytes"] = None,
+ fee_limit: Optional["int"] = None,
+ ) -> None:
+ self.contract: Sequence["TronRawContract"] = contract if contract is not None else []
+ self.ref_block_bytes = ref_block_bytes
+ self.ref_block_hash = ref_block_hash
+ self.expiration = expiration
+ self.timestamp = timestamp
+ self.data = data
+ self.fee_limit = fee_limit
+
+
+class TronRawContract(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = None
+ FIELDS = {
+ 1: protobuf.Field("type", "TronRawContractType", repeated=False, required=True),
+ 2: protobuf.Field("parameter", "TronRawParameter", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ type: "TronRawContractType",
+ parameter: "TronRawParameter",
+ ) -> None:
+ self.type = type
+ self.parameter = parameter
+
+
+class TronRawParameter(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = None
+ FIELDS = {
+ 1: protobuf.Field("type_url", "string", repeated=False, required=True),
+ 2: protobuf.Field("value", "bytes", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ type_url: "str",
+ value: "bytes",
+ ) -> None:
+ self.type_url = type_url
+ self.value = value
+
+
class WebAuthnListResidentCredentials(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 800
diff --git a/python/src/trezorlib/tron.py b/python/src/trezorlib/tron.py
index 3ad98135..1ea1e96d 100644
--- a/python/src/trezorlib/tron.py
+++ b/python/src/trezorlib/tron.py
@@ -1,14 +1,54 @@
-from typing import TYPE_CHECKING, Any
+import io
+from typing import TYPE_CHECKING, Any, Tuple
from . import messages
+from .protobuf import load_message
if TYPE_CHECKING:
from .tools import Address
from .transport.session import Session
+ TronMessageType = messages.TronTransferContract
+
DEFAULT_BIP32_PATH = "m/44h/195h/0h/0/0"
+def from_raw_data(
+ raw_data: bytes,
+) -> Tuple[messages.TronSignTx, "TronMessageType"]:
+ raw_tx = load_message(io.BytesIO(raw_data), messages.TronRawTransaction)
+ tx = messages.TronSignTx(
+ ref_block_bytes=raw_tx.ref_block_bytes,
+ ref_block_hash=raw_tx.ref_block_hash,
+ expiration=raw_tx.expiration,
+ timestamp=raw_tx.timestamp,
+ fee_limit=raw_tx.fee_limit,
+ data=raw_tx.data,
+ )
+
+ if len(raw_tx.contract) != 1:
+ raise ValueError("Only single contract transactions are supported.")
+
+ contract_type = raw_tx.contract[0].type
+ if contract_type == messages.TronRawContractType.TransferContract:
+ raw_contract = load_message(
+ io.BytesIO(raw_tx.contract[0].parameter.value),
+ messages.TronTransferContract,
+ )
+ contract = messages.TronTransferContract(
+ to_address=raw_contract.to_address,
+ owner_address=raw_contract.owner_address,
+ amount=raw_contract.amount,
+ )
+ else:
+ raise ValueError(f"Unsupported contract type: {contract_type}")
+
+ return tx, contract
+
+
+# ====== Client functions ====== #
+
+
def get_address(*args: Any, **kwargs: Any) -> str:
return get_authenticated_address(*args, **kwargs).address
@@ -25,3 +65,17 @@ def get_authenticated_address(
),
expect=messages.TronAddress,
)
+
+
+def sign_tx(
+ session: "Session",
+ tx: messages.TronSignTx,
+ contract: "TronMessageType",
+ address_n: "Address",
+) -> messages.TronSignature:
+ tx.address_n = address_n
+ resp = session.call(tx)
+ messages.TronContractRequest.ensure_isinstance(resp)
+ resp = session.call(contract)
+ resp = messages.TronSignature.ensure_isinstance(resp)
+ return resp
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index bcc478db..0c3a1cea 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -312,6 +312,10 @@ trezor_message_impl! {
trezor_message_impl! {
TronGetAddress => MessageType_TronGetAddress,
TronAddress => MessageType_TronAddress,
+ TronSignTx => MessageType_TronSignTx,
+ TronSignature => MessageType_TronSignature,
+ TronContractRequest => MessageType_TronContractRequest,
+ TronTransferContract => MessageType_TronTransferContract,
}
#[cfg(feature = "webauthn")]
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index 15aaf01b..57544918 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -549,6 +549,14 @@ pub enum MessageType {
MessageType_TronGetAddress = 2200,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronAddress)
MessageType_TronAddress = 2201,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronSignTx)
+ MessageType_TronSignTx = 2202,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronSignature)
+ MessageType_TronSignature = 2203,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronContractRequest)
+ 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_BenchmarkListNames)
MessageType_BenchmarkListNames = 9100,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_BenchmarkNames)
@@ -829,6 +837,10 @@ impl ::protobuf::Enum for MessageType {
2105 => ::std::option::Option::Some(MessageType::MessageType_EvoluDelegatedIdentityKey),
2200 => ::std::option::Option::Some(MessageType::MessageType_TronGetAddress),
2201 => ::std::option::Option::Some(MessageType::MessageType_TronAddress),
+ 2202 => ::std::option::Option::Some(MessageType::MessageType_TronSignTx),
+ 2203 => ::std::option::Option::Some(MessageType::MessageType_TronSignature),
+ 2204 => ::std::option::Option::Some(MessageType::MessageType_TronContractRequest),
+ 2205 => ::std::option::Option::Some(MessageType::MessageType_TronTransferContract),
9100 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkListNames),
9101 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
9102 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
@@ -1100,6 +1112,10 @@ impl ::protobuf::Enum for MessageType {
"MessageType_EvoluDelegatedIdentityKey" => ::std::option::Option::Some(MessageType::MessageType_EvoluDelegatedIdentityKey),
"MessageType_TronGetAddress" => ::std::option::Option::Some(MessageType::MessageType_TronGetAddress),
"MessageType_TronAddress" => ::std::option::Option::Some(MessageType::MessageType_TronAddress),
+ "MessageType_TronSignTx" => ::std::option::Option::Some(MessageType::MessageType_TronSignTx),
+ "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_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),
@@ -1370,6 +1386,10 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_EvoluDelegatedIdentityKey,
MessageType::MessageType_TronGetAddress,
MessageType::MessageType_TronAddress,
+ MessageType::MessageType_TronSignTx,
+ MessageType::MessageType_TronSignature,
+ MessageType::MessageType_TronContractRequest,
+ MessageType::MessageType_TronTransferContract,
MessageType::MessageType_BenchmarkListNames,
MessageType::MessageType_BenchmarkNames,
MessageType::MessageType_BenchmarkRun,
@@ -1646,10 +1666,14 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_EvoluDelegatedIdentityKey => 258,
MessageType::MessageType_TronGetAddress => 259,
MessageType::MessageType_TronAddress => 260,
- MessageType::MessageType_BenchmarkListNames => 261,
- MessageType::MessageType_BenchmarkNames => 262,
- MessageType::MessageType_BenchmarkRun => 263,
- MessageType::MessageType_BenchmarkResult => 264,
+ MessageType::MessageType_TronSignTx => 261,
+ 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,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1668,7 +1692,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xd9\\\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xfb]\
\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\
@@ -1967,17 +1991,21 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\xa6\x1d\x01\x90\xb5\x18\x01\x124\n%MessageType_EvoluDelegatedIdentityKe\
y\x10\xb9\x10\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12%\n\x1aMessageT\
ype_TronGetAddress\x10\x98\x11\x1a\x04\x90\xb5\x18\x01\x12\"\n\x17Messag\
- eType_TronAddress\x10\x99\x11\x1a\x04\x98\xb5\x18\x01\x12)\n\x1eMessageT\
- ype_BenchmarkListNames\x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMessag\
- eType_BenchmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\x18MessageT\
- ype_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\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\rTrezorMessage\
- \x80\xa6\x1d\x01\
+ eType_TronAddress\x10\x99\x11\x1a\x04\x98\xb5\x18\x01\x12!\n\x16MessageT\
+ 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\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/rust/trezor-client/src/protos/generated/messages_management.rs b/rust/trezor-client/src/protos/generated/messages_management.rs
index 357f5851..7112aa2c 100644
--- a/rust/trezor-client/src/protos/generated/messages_management.rs
+++ b/rust/trezor-client/src/protos/generated/messages_management.rs
@@ -3052,6 +3052,8 @@ pub mod features {
Capability_BLE = 22,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_NFC)
Capability_NFC = 23,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.management.Features.Capability.Capability_Tron)
+ Capability_Tron = 24,
}
impl ::protobuf::Enum for Capability {
@@ -3086,6 +3088,7 @@ pub mod features {
21 => ::std::option::Option::Some(Capability::Capability_Haptic),
22 => ::std::option::Option::Some(Capability::Capability_BLE),
23 => ::std::option::Option::Some(Capability::Capability_NFC),
+ 24 => ::std::option::Option::Some(Capability::Capability_Tron),
_ => ::std::option::Option::None
}
}
@@ -3115,6 +3118,7 @@ pub mod features {
"Capability_Haptic" => ::std::option::Option::Some(Capability::Capability_Haptic),
"Capability_BLE" => ::std::option::Option::Some(Capability::Capability_BLE),
"Capability_NFC" => ::std::option::Option::Some(Capability::Capability_NFC),
+ "Capability_Tron" => ::std::option::Option::Some(Capability::Capability_Tron),
_ => ::std::option::Option::None
}
}
@@ -3143,6 +3147,7 @@ pub mod features {
Capability::Capability_Haptic,
Capability::Capability_BLE,
Capability::Capability_NFC,
+ Capability::Capability_Tron,
];
}
@@ -3177,6 +3182,7 @@ pub mod features {
Capability::Capability_Haptic => 20,
Capability::Capability_BLE => 21,
Capability::Capability_NFC => 22,
+ Capability::Capability_Tron => 23,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -12282,7 +12288,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\roptions.proto\"\x80\x01\n\nInitialize\x12\x1d\n\nsession_id\x18\x01\
\x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\
\x08R\x0eSkipPassphraseB\x02\x18\x01\x12%\n\x0ederive_cardano\x18\x03\
- \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xdd\x1a\n\x08Featur\
+ \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xf2\x1a\n\x08Featur\
es\x12\x16\n\x06vendor\x18\x01\x20\x01(\tR\x06vendor\x12#\n\rmajor_versi\
on\x18\x02\x20\x02(\rR\x0cmajorVersion\x12#\n\rminor_version\x18\x03\x20\
\x02(\rR\x0cminorVersion\x12#\n\rpatch_version\x18\x04\x20\x02(\rR\x0cpa\
@@ -12342,7 +12348,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
less_connected\x18<\x20\x01(\x08R\x11wirelessConnected\"C\n\x12BackupAva\
ilability\x12\x10\n\x0cNotAvailable\x10\0\x12\x0c\n\x08Required\x10\x01\
\x12\r\n\tAvailable\x10\x02\"7\n\x0eRecoveryStatus\x12\x0b\n\x07Nothing\
- \x10\0\x12\x0c\n\x08Recovery\x10\x01\x12\n\n\x06Backup\x10\x02\"\xf6\x04\
+ \x10\0\x12\x0c\n\x08Recovery\x10\x01\x12\n\n\x06Backup\x10\x02\"\x8b\x05\
\n\nCapability\x12\x1c\n\x12Capability_Bitcoin\x10\x01\x1a\x04\x80\xa6\
\x1d\x01\x12\x1b\n\x17Capability_Bitcoin_like\x10\x02\x12\x16\n\x12Capab\
ility_Binance\x10\x03\x12\x16\n\x12Capability_Cardano\x10\x04\x12\x1b\n\
@@ -12359,119 +12365,119 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x1f\n\x15Capability_Brightness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x12\x1b\
\n\x11Capability_Haptic\x10\x15\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCap\
ability_BLE\x10\x16\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCapability_NFC\
- \x10\x17\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDe\
- vice\"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryM\
- s\"\x0c\n\nEndSession\"\xdd\x05\n\rApplySettings\x12\x1e\n\x08language\
- \x18\x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\
- \x20\x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rus\
- ePassphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\
- \n\x12_passphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\
- \x18\x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDel\
- ayMs\x12Y\n\x10display_rotation\x18\x07\x20\x01(\x0e2..hw.trezor.message\
- s.management.DisplayRotationR\x0fdisplayRotation\x12=\n\x1bpassphrase_al\
- ways_on_device\x18\x08\x20\x01(\x08R\x18passphraseAlwaysOnDevice\x12T\n\
- \rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.messages.management.Safet\
- yCheckLevelR\x0csafetyChecks\x123\n\x15experimental_features\x18\n\x20\
- \x01(\x08R\x14experimentalFeatures\x129\n\x19hide_passphrase_from_host\
- \x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\x12'\n\x0fhaptic_feedba\
- ck\x18\r\x20\x01(\x08R\x0ehapticFeedback\x12+\n\x11homescreen_length\x18\
- \x0e\x20\x01(\rR\x10homescreenLength\x12:\n\x1aauto_lock_delay_battery_m\
- s\x18\x0f\x20\x01(\rR\x16autoLockDelayBatteryMs\"T\n\x0eChangeLanguage\
- \x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12!\n\x0cshow\
- _display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"T\n\x10DataChunkRequest\
- \x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12\x1f\n\x0bd\
- ata_offset\x18\x02\x20\x02(\rR\ndataOffset\"-\n\x0cDataChunkAck\x12\x1d\
- \n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\n\nApplyFlags\x12\
- \x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tChangePin\x12\x16\n\
- \x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChangeWipeCode\x12\
- \x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\n\tSdProtect\
- \x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.messages.management.\
- SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProtectOperationT\
- ype\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\x12\x0b\n\x07RE\
- FRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\
- \x07message\x12+\n\x11button_protection\x18\x02\x20\x01(\x08R\x10buttonP\
- rotection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\x12\x12\n\x04size\x18\
- \x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\x07entropy\x18\x01\
- \x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\x1c\n\tchallenge\
- \x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\n\x04has\
- h\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\x1c\n\tch\
- allenge\x18\x01\x20\x02(\x0cR\tchallenge\"\xcb\x01\n\x11AuthenticityProo\
- f\x12/\n\x13optiga_certificates\x18\x01\x20\x03(\x0cR\x12optigaCertifica\
- tes\x12)\n\x10optiga_signature\x18\x02\x20\x02(\x0cR\x0foptigaSignature\
- \x12/\n\x13tropic_certificates\x18\x03\x20\x03(\x0cR\x12tropicCertificat\
- es\x12)\n\x10tropic_signature\x18\x04\x20\x01(\x0cR\x0ftropicSignature\"\
- \x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\
- \x20\x03(\tR\tmnemonics\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\
- \n\x15passphrase_protection\x18\x04\x20\x01(\x08R\x14passphraseProtectio\
- n\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\
- \x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\
- \x07\x20\x01(\x08R\x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\
- \x01(\rR\nu2fCounter\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneeds\
- Backup\x12\x1b\n\tno_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x9d\x03\n\
- \x0bResetDevice\x12\x1f\n\x08strength\x18\x02\x20\x01(\r:\x03256R\x08str\
- ength\x123\n\x15passphrase_protection\x18\x03\x20\x01(\x08R\x14passphras\
- eProtection\x12%\n\x0epin_protection\x18\x04\x20\x01(\x08R\rpinProtectio\
- n\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\
- \x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\
- \x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0bskip_backup\x18\x08\x20\
- \x01(\x08R\nskipBackup\x12\x1b\n\tno_backup\x18\t\x20\x01(\x08R\x08noBac\
- kup\x12Q\n\x0bbackup_type\x18\n\x20\x01(\x0e2).hw.trezor.messages.manage\
- ment.BackupType:\x05Bip39R\nbackupType\x12#\n\rentropy_check\x18\x0b\x20\
- \x01(\x08R\x0centropyCheckJ\x04\x08\x01\x10\x02\"\xe5\x01\n\x0cBackupDev\
- ice\x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\x0egroupThreshold\x12O\
- \n\x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.messages.management.Backup\
- Device.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Group\x12)\n\x10member_thr\
- eshold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12!\n\x0cmember_count\x18\
- \x02\x20\x02(\rR\x0bmemberCount\"b\n\x0eEntropyRequest\x12-\n\x12entropy\
- _commitment\x18\x01\x20\x01(\x0cR\x11entropyCommitment\x12!\n\x0cprev_en\
- tropy\x18\x02\x20\x01(\x0cR\x0bprevEntropy\"&\n\nEntropyAck\x12\x18\n\
- \x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\x13\n\x11EntropyCheckRead\
- y\"5\n\x14EntropyCheckContinue\x12\x1d\n\x06finish\x18\x01\x20\x01(\x08:\
- \x05falseR\x06finish\"\x8d\x04\n\x0eRecoveryDevice\x12\x1d\n\nword_count\
- \x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphrase_protection\x18\x02\
- \x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\x03\
- \x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x04\x20\x01(\tR\
- \x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x05\x20\x01(\tR\x05labe\
- l\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\
- \x12j\n\x0cinput_method\x18\x08\x20\x01(\x0e2G.hw.trezor.messages.manage\
- ment.RecoveryDevice.RecoveryDeviceInputMethodR\x0binputMethod\x12\x1f\n\
- \x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12O\n\x04type\x18\n\x20\
- \x01(\x0e2+.hw.trezor.messages.management.RecoveryType:\x0eNormalRecover\
- yR\x04type\";\n\x19RecoveryDeviceInputMethod\x12\x12\n\x0eScrambledWords\
- \x10\0\x12\n\n\x06Matrix\x10\x01J\x04\x08\x07\x10\x08\"\xc5\x01\n\x0bWor\
- dRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.trezor.messages.manage\
- ment.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWordRequestType\x12\
- \x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordRequestType_Matri\
- x9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\"\x1d\n\x07WordA\
- ck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\
- \x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNext\
- U2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\
- \x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\x14Preauthorized\
- Request\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12RebootToBootloader\
- \x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.manage\
- ment.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\
- \n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14\
- language_data_length\x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\
- \n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UP\
- GRADE\x10\x01\"\n\n\x08GetNonce\"\x1d\n\x05Nonce\x12\x14\n\x05nonce\x18\
- \x01\x20\x02(\x0cR\x05nonce\";\n\nUnlockPath\x12\x1b\n\taddress_n\x18\
- \x01\x20\x03(\rR\x08addressN\x12\x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03m\
- ac\"'\n\x13UnlockedPathRequest\x12\x10\n\x03mac\x18\x01\x20\x02(\x0cR\
- \x03mac\"\x14\n\x12ShowDeviceTutorial\"\x12\n\x10UnlockBootloader\"%\n\r\
- SetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\rR\x05value\"\x11\n\
- \x0fGetSerialNumber\"3\n\x0cSerialNumber\x12#\n\rserial_number\x18\x01\
- \x20\x02(\tR\x0cserialNumber*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\x10\
- \0\x12\x10\n\x0cSlip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\x10\
- \x02\x12\x1c\n\x18Slip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip39_B\
- asic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\x05*\
- G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPromptAlway\
- s\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*=\n\x0fDisplayRotation\
- \x12\t\n\x05North\x10\0\x12\x08\n\x04East\x10Z\x12\n\n\x05South\x10\xb4\
- \x01\x12\t\n\x04West\x10\x8e\x02*0\n\x10HomescreenFormat\x12\x08\n\x04To\
- if\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\x10\x03*H\n\x0cRe\
- coveryType\x12\x12\n\x0eNormalRecovery\x10\0\x12\n\n\x06DryRun\x10\x01\
- \x12\x18\n\x14UnlockRepeatedBackup\x10\x02BB\n#com.satoshilabs.trezor.li\
- b.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\x01\
+ \x10\x17\x1a\x04\x80\xa6\x1d\x01\x12\x13\n\x0fCapability_Tron\x10\x18\
+ \x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDevice\"&\n\x07SetBusy\x12\x1b\n\t\
+ expiry_ms\x18\x01\x20\x01(\rR\x08expiryMs\"\x0c\n\nEndSession\"\xdd\x05\
+ \n\rApplySettings\x12\x1e\n\x08language\x18\x01\x20\x01(\tR\x08languageB\
+ \x02\x18\x01\x12\x14\n\x05label\x18\x02\x20\x01(\tR\x05label\x12%\n\x0eu\
+ se_passphrase\x18\x03\x20\x01(\x08R\rusePassphrase\x12\x1e\n\nhomescreen\
+ \x18\x04\x20\x01(\x0cR\nhomescreen\x120\n\x12_passphrase_source\x18\x05\
+ \x20\x01(\rR\x10PassphraseSourceB\x02\x18\x01\x12+\n\x12auto_lock_delay_\
+ ms\x18\x06\x20\x01(\rR\x0fautoLockDelayMs\x12Y\n\x10display_rotation\x18\
+ \x07\x20\x01(\x0e2..hw.trezor.messages.management.DisplayRotationR\x0fdi\
+ splayRotation\x12=\n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08\
+ R\x18passphraseAlwaysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/\
+ .hw.trezor.messages.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\
+ \x15experimental_features\x18\n\x20\x01(\x08R\x14experimentalFeatures\
+ \x129\n\x19hide_passphrase_from_host\x18\x0b\x20\x01(\x08R\x16hidePassph\
+ raseFromHost\x12'\n\x0fhaptic_feedback\x18\r\x20\x01(\x08R\x0ehapticFeed\
+ back\x12+\n\x11homescreen_length\x18\x0e\x20\x01(\rR\x10homescreenLength\
+ \x12:\n\x1aauto_lock_delay_battery_ms\x18\x0f\x20\x01(\rR\x16autoLockDel\
+ ayBatteryMs\"T\n\x0eChangeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\
+ \x02(\rR\ndataLength\x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bsho\
+ wDisplay\"T\n\x10DataChunkRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\
+ \x02(\rR\ndataLength\x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataO\
+ ffset\"-\n\x0cDataChunkAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\t\
+ dataChunk\"\"\n\nApplyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05fl\
+ ags\"#\n\tChangePin\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\
+ \"(\n\x0eChangeWipeCode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06rem\
+ ove\"\xaa\x01\n\tSdProtect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.t\
+ rezor.messages.management.SdProtect.SdProtectOperationTypeR\toperation\"\
+ >\n\x16SdProtectOperationType\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENAB\
+ LE\x10\x01\x12\x0b\n\x07REFRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07messag\
+ e\x18\x01\x20\x01(\t:\0R\x07message\x12+\n\x11button_protection\x18\x02\
+ \x20\x01(\x08R\x10buttonProtection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\
+ \x12\x12\n\x04size\x18\x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\
+ \x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\
+ \x1c\n\tchallenge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\
+ \x12\x12\n\x04hash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDev\
+ ice\x12\x1c\n\tchallenge\x18\x01\x20\x02(\x0cR\tchallenge\"\xcb\x01\n\
+ \x11AuthenticityProof\x12/\n\x13optiga_certificates\x18\x01\x20\x03(\x0c\
+ R\x12optigaCertificates\x12)\n\x10optiga_signature\x18\x02\x20\x02(\x0cR\
+ \x0foptigaSignature\x12/\n\x13tropic_certificates\x18\x03\x20\x03(\x0cR\
+ \x12tropicCertificates\x12)\n\x10tropic_signature\x18\x04\x20\x01(\x0cR\
+ \x0ftropicSignature\"\x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\
+ \n\tmnemonics\x18\x01\x20\x03(\tR\tmnemonics\x12\x10\n\x03pin\x18\x03\
+ \x20\x01(\tR\x03pin\x123\n\x15passphrase_protection\x18\x04\x20\x01(\x08\
+ R\x14passphraseProtection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08l\
+ anguageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12\
+ #\n\rskip_checksum\x18\x07\x20\x01(\x08R\x0cskipChecksum\x12\x1f\n\x0bu2\
+ f_counter\x18\x08\x20\x01(\rR\nu2fCounter\x12!\n\x0cneeds_backup\x18\t\
+ \x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tno_backup\x18\n\x20\x01(\x08R\
+ \x08noBackup\"\x9d\x03\n\x0bResetDevice\x12\x1f\n\x08strength\x18\x02\
+ \x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_protection\x18\x03\
+ \x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\x04\
+ \x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\
+ \x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\x20\x01(\tR\x05labe\
+ l\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0b\
+ skip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\x1b\n\tno_backup\x18\t\
+ \x20\x01(\x08R\x08noBackup\x12Q\n\x0bbackup_type\x18\n\x20\x01(\x0e2).hw\
+ .trezor.messages.management.BackupType:\x05Bip39R\nbackupType\x12#\n\ren\
+ tropy_check\x18\x0b\x20\x01(\x08R\x0centropyCheckJ\x04\x08\x01\x10\x02\"\
+ \xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\
+ \x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.mes\
+ sages.management.BackupDevice.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Gro\
+ up\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12\
+ !\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmemberCount\"b\n\x0eEntropyRe\
+ quest\x12-\n\x12entropy_commitment\x18\x01\x20\x01(\x0cR\x11entropyCommi\
+ tment\x12!\n\x0cprev_entropy\x18\x02\x20\x01(\x0cR\x0bprevEntropy\"&\n\n\
+ EntropyAck\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\x13\n\
+ \x11EntropyCheckReady\"5\n\x14EntropyCheckContinue\x12\x1d\n\x06finish\
+ \x18\x01\x20\x01(\x08:\x05falseR\x06finish\"\x8d\x04\n\x0eRecoveryDevice\
+ \x12\x1d\n\nword_count\x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphra\
+ se_protection\x18\x02\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epi\
+ n_protection\x18\x03\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\
+ \x18\x04\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x05\
+ \x20\x01(\tR\x05label\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\
+ \x0fenforceWordlist\x12j\n\x0cinput_method\x18\x08\x20\x01(\x0e2G.hw.tre\
+ zor.messages.management.RecoveryDevice.RecoveryDeviceInputMethodR\x0binp\
+ utMethod\x12\x1f\n\x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12O\n\
+ \x04type\x18\n\x20\x01(\x0e2+.hw.trezor.messages.management.RecoveryType\
+ :\x0eNormalRecoveryR\x04type\";\n\x19RecoveryDeviceInputMethod\x12\x12\n\
+ \x0eScrambledWords\x10\0\x12\n\n\x06Matrix\x10\x01J\x04\x08\x07\x10\x08\
+ \"\xc5\x01\n\x0bWordRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.tre\
+ zor.messages.management.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWor\
+ dRequestType\x12\x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordR\
+ equestType_Matrix9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\
+ \"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\r\
+ SetU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\
+ \x13\n\x11GetNextU2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_coun\
+ ter\x18\x01\x20\x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\
+ \x14PreauthorizedRequest\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12R\
+ ebootToBootloader\x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezo\
+ r.messages.management.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\
+ \x0bbootCommand\x12'\n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmw\
+ areHeader\x123\n\x14language_data_length\x18\x03\x20\x01(\r:\x010R\x12la\
+ nguageDataLength\"5\n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\
+ \x13\n\x0fINSTALL_UPGRADE\x10\x01\"\n\n\x08GetNonce\"\x1d\n\x05Nonce\x12\
+ \x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce\";\n\nUnlockPath\x12\x1b\
+ \n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\x10\n\x03mac\x18\x02\
+ \x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\x12\x10\n\x03mac\x18\
+ \x01\x20\x02(\x0cR\x03mac\"\x14\n\x12ShowDeviceTutorial\"\x12\n\x10Unloc\
+ kBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\rR\
+ \x05value\"\x11\n\x0fGetSerialNumber\"3\n\x0cSerialNumber\x12#\n\rserial\
+ _number\x18\x01\x20\x02(\tR\x0cserialNumber*\x99\x01\n\nBackupType\x12\t\
+ \n\x05Bip39\x10\0\x12\x10\n\x0cSlip39_Basic\x10\x01\x12\x13\n\x0fSlip39_\
+ Advanced\x10\x02\x12\x1c\n\x18Slip39_Single_Extendable\x10\x03\x12\x1b\n\
+ \x17Slip39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extenda\
+ ble\x10\x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\
+ \x0cPromptAlways\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*=\n\x0fD\
+ isplayRotation\x12\t\n\x05North\x10\0\x12\x08\n\x04East\x10Z\x12\n\n\x05\
+ South\x10\xb4\x01\x12\t\n\x04West\x10\x8e\x02*0\n\x10HomescreenFormat\
+ \x12\x08\n\x04Toif\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\
+ \x10\x03*H\n\x0cRecoveryType\x12\x12\n\x0eNormalRecovery\x10\0\x12\n\n\
+ \x06DryRun\x10\x01\x12\x18\n\x14UnlockRepeatedBackup\x10\x02BB\n#com.sat\
+ oshilabs.trezor.lib.protobufB\x17TrezorMessageManagement\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 975ec011..5b1ebd37 100644
--- a/rust/trezor-client/src/protos/generated/messages_tron.rs
+++ b/rust/trezor-client/src/protos/generated/messages_tron.rs
@@ -438,13 +438,1840 @@ impl ::protobuf::reflect::ProtobufValue for TronAddress {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronSignTx)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronSignTx {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.address_n)
+ pub address_n: ::std::vec::Vec<u32>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.ref_block_bytes)
+ pub ref_block_bytes: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@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>,
+ // @@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>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignTx.fee_limit)
+ pub fee_limit: ::std::option::Option<i64>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronSignTx.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronSignTx {
+ fn default() -> &'a TronSignTx {
+ <TronSignTx as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronSignTx {
+ pub fn new() -> TronSignTx {
+ ::std::default::Default::default()
+ }
+
+ // required bytes ref_block_bytes = 2;
+
+ pub fn ref_block_bytes(&self) -> &[u8] {
+ match self.ref_block_bytes.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_ref_block_bytes(&mut self) {
+ self.ref_block_bytes = ::std::option::Option::None;
+ }
+
+ pub fn has_ref_block_bytes(&self) -> bool {
+ self.ref_block_bytes.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_ref_block_bytes(&mut self, v: ::std::vec::Vec<u8>) {
+ self.ref_block_bytes = ::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_ref_block_bytes(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.ref_block_bytes.is_none() {
+ self.ref_block_bytes = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.ref_block_bytes.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_ref_block_bytes(&mut self) -> ::std::vec::Vec<u8> {
+ self.ref_block_bytes.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required bytes ref_block_hash = 3;
+
+ pub fn ref_block_hash(&self) -> &[u8] {
+ match self.ref_block_hash.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_ref_block_hash(&mut self) {
+ self.ref_block_hash = ::std::option::Option::None;
+ }
+
+ pub fn has_ref_block_hash(&self) -> bool {
+ self.ref_block_hash.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_ref_block_hash(&mut self, v: ::std::vec::Vec<u8>) {
+ self.ref_block_hash = ::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_ref_block_hash(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.ref_block_hash.is_none() {
+ self.ref_block_hash = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.ref_block_hash.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_ref_block_hash(&mut self) -> ::std::vec::Vec<u8> {
+ self.ref_block_hash.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required sint64 expiration = 4;
+
+ pub fn expiration(&self) -> i64 {
+ self.expiration.unwrap_or(0)
+ }
+
+ pub fn clear_expiration(&mut self) {
+ self.expiration = ::std::option::Option::None;
+ }
+
+ pub fn has_expiration(&self) -> bool {
+ self.expiration.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_expiration(&mut self, v: i64) {
+ self.expiration = ::std::option::Option::Some(v);
+ }
+
+ // optional bytes data = 5;
+
+ 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())
+ }
+
+ // required sint64 timestamp = 6;
+
+ pub fn timestamp(&self) -> i64 {
+ self.timestamp.unwrap_or(0)
+ }
+
+ pub fn clear_timestamp(&mut self) {
+ self.timestamp = ::std::option::Option::None;
+ }
+
+ pub fn has_timestamp(&self) -> bool {
+ self.timestamp.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_timestamp(&mut self, v: i64) {
+ self.timestamp = ::std::option::Option::Some(v);
+ }
+
+ // optional sint64 fee_limit = 7;
+
+ pub fn fee_limit(&self) -> i64 {
+ self.fee_limit.unwrap_or(0)
+ }
+
+ pub fn clear_fee_limit(&mut self) {
+ self.fee_limit = ::std::option::Option::None;
+ }
+
+ pub fn has_fee_limit(&self) -> bool {
+ self.fee_limit.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_fee_limit(&mut self, v: i64) {
+ self.fee_limit = ::std::option::Option::Some(v);
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(7);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+ "address_n",
+ |m: &TronSignTx| { &m.address_n },
+ |m: &mut TronSignTx| { &mut m.address_n },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "ref_block_bytes",
+ |m: &TronSignTx| { &m.ref_block_bytes },
+ |m: &mut TronSignTx| { &mut m.ref_block_bytes },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "ref_block_hash",
+ |m: &TronSignTx| { &m.ref_block_hash },
+ |m: &mut TronSignTx| { &mut m.ref_block_hash },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "expiration",
+ |m: &TronSignTx| { &m.expiration },
+ |m: &mut TronSignTx| { &mut m.expiration },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "data",
+ |m: &TronSignTx| { &m.data },
+ |m: &mut TronSignTx| { &mut m.data },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "timestamp",
+ |m: &TronSignTx| { &m.timestamp },
+ |m: &mut TronSignTx| { &mut m.timestamp },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "fee_limit",
+ |m: &TronSignTx| { &m.fee_limit },
+ |m: &mut TronSignTx| { &mut m.fee_limit },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronSignTx>(
+ "TronSignTx",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronSignTx {
+ const NAME: &'static str = "TronSignTx";
+
+ fn is_initialized(&self) -> bool {
+ if self.ref_block_bytes.is_none() {
+ return false;
+ }
+ if self.ref_block_hash.is_none() {
+ return false;
+ }
+ if self.expiration.is_none() {
+ return false;
+ }
+ if self.timestamp.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 => {
+ is.read_repeated_packed_uint32_into(&mut self.address_n)?;
+ },
+ 8 => {
+ self.address_n.push(is.read_uint32()?);
+ },
+ 18 => {
+ self.ref_block_bytes = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 26 => {
+ self.ref_block_hash = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 32 => {
+ self.expiration = ::std::option::Option::Some(is.read_sint64()?);
+ },
+ 42 => {
+ self.data = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 48 => {
+ self.timestamp = ::std::option::Option::Some(is.read_sint64()?);
+ },
+ 56 => {
+ self.fee_limit = ::std::option::Option::Some(is.read_sint64()?);
+ },
+ 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;
+ for value in &self.address_n {
+ my_size += ::protobuf::rt::uint32_size(1, *value);
+ };
+ if let Some(v) = self.ref_block_bytes.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(2, &v);
+ }
+ if let Some(v) = self.ref_block_hash.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(3, &v);
+ }
+ if let Some(v) = self.expiration {
+ my_size += ::protobuf::rt::sint64_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);
+ }
+ if let Some(v) = self.fee_limit {
+ my_size += ::protobuf::rt::sint64_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);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ for v in &self.address_n {
+ os.write_uint32(1, *v)?;
+ };
+ if let Some(v) = self.ref_block_bytes.as_ref() {
+ os.write_bytes(2, v)?;
+ }
+ if let Some(v) = self.ref_block_hash.as_ref() {
+ os.write_bytes(3, v)?;
+ }
+ if let Some(v) = self.expiration {
+ os.write_sint64(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)?;
+ }
+ if let Some(v) = self.fee_limit {
+ os.write_sint64(7, 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() -> TronSignTx {
+ TronSignTx::new()
+ }
+
+ fn clear(&mut self) {
+ self.address_n.clear();
+ self.ref_block_bytes = ::std::option::Option::None;
+ self.ref_block_hash = ::std::option::Option::None;
+ self.expiration = ::std::option::Option::None;
+ self.data = ::std::option::Option::None;
+ self.timestamp = ::std::option::Option::None;
+ self.fee_limit = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronSignTx {
+ static instance: TronSignTx = TronSignTx {
+ address_n: ::std::vec::Vec::new(),
+ ref_block_bytes: ::std::option::Option::None,
+ ref_block_hash: ::std::option::Option::None,
+ expiration: ::std::option::Option::None,
+ data: ::std::option::Option::None,
+ timestamp: ::std::option::Option::None,
+ fee_limit: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronSignTx {
+ 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("TronSignTx").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronSignTx {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronSignTx {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronContractRequest)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronContractRequest {
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronContractRequest.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronContractRequest {
+ fn default() -> &'a TronContractRequest {
+ <TronContractRequest as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronContractRequest {
+ pub fn new() -> TronContractRequest {
+ ::std::default::Default::default()
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(0);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronContractRequest>(
+ "TronContractRequest",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronContractRequest {
+ const NAME: &'static str = "TronContractRequest";
+
+ fn is_initialized(&self) -> bool {
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ 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;
+ 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<()> {
+ 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() -> TronContractRequest {
+ TronContractRequest::new()
+ }
+
+ fn clear(&mut self) {
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronContractRequest {
+ static instance: TronContractRequest = TronContractRequest {
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronContractRequest {
+ 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("TronContractRequest").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronContractRequest {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronContractRequest {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronTransferContract)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronTransferContract {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTransferContract.owner_address)
+ pub owner_address: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTransferContract.to_address)
+ pub to_address: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronTransferContract.amount)
+ pub amount: ::std::option::Option<u64>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronTransferContract.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronTransferContract {
+ fn default() -> &'a TronTransferContract {
+ <TronTransferContract as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronTransferContract {
+ pub fn new() -> TronTransferContract {
+ ::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 to_address = 2;
+
+ pub fn to_address(&self) -> &[u8] {
+ match self.to_address.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_to_address(&mut self) {
+ self.to_address = ::std::option::Option::None;
+ }
+
+ pub fn has_to_address(&self) -> bool {
+ self.to_address.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_to_address(&mut self, v: ::std::vec::Vec<u8>) {
+ self.to_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_to_address(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.to_address.is_none() {
+ self.to_address = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.to_address.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_to_address(&mut self) -> ::std::vec::Vec<u8> {
+ self.to_address.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required uint64 amount = 3;
+
+ pub fn amount(&self) -> u64 {
+ self.amount.unwrap_or(0)
+ }
+
+ pub fn clear_amount(&mut self) {
+ self.amount = ::std::option::Option::None;
+ }
+
+ pub fn has_amount(&self) -> bool {
+ self.amount.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_amount(&mut self, v: u64) {
+ self.amount = ::std::option::Option::Some(v);
+ }
+
+ 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: &TronTransferContract| { &m.owner_address },
+ |m: &mut TronTransferContract| { &mut m.owner_address },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "to_address",
+ |m: &TronTransferContract| { &m.to_address },
+ |m: &mut TronTransferContract| { &mut m.to_address },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "amount",
+ |m: &TronTransferContract| { &m.amount },
+ |m: &mut TronTransferContract| { &mut m.amount },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronTransferContract>(
+ "TronTransferContract",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronTransferContract {
+ const NAME: &'static str = "TronTransferContract";
+
+ fn is_initialized(&self) -> bool {
+ if self.owner_address.is_none() {
+ return false;
+ }
+ if self.to_address.is_none() {
+ return false;
+ }
+ if self.amount.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.to_address = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 24 => {
+ self.amount = ::std::option::Option::Some(is.read_uint64()?);
+ },
+ 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.to_address.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(2, &v);
+ }
+ if let Some(v) = self.amount {
+ my_size += ::protobuf::rt::uint64_size(3, 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.to_address.as_ref() {
+ os.write_bytes(2, v)?;
+ }
+ if let Some(v) = self.amount {
+ os.write_uint64(3, 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() -> TronTransferContract {
+ TronTransferContract::new()
+ }
+
+ fn clear(&mut self) {
+ self.owner_address = ::std::option::Option::None;
+ self.to_address = ::std::option::Option::None;
+ self.amount = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronTransferContract {
+ static instance: TronTransferContract = TronTransferContract {
+ owner_address: ::std::option::Option::None,
+ to_address: ::std::option::Option::None,
+ amount: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronTransferContract {
+ 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("TronTransferContract").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronTransferContract {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronTransferContract {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronSignature)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronSignature {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronSignature.signature)
+ pub signature: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronSignature.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronSignature {
+ fn default() -> &'a TronSignature {
+ <TronSignature as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronSignature {
+ pub fn new() -> TronSignature {
+ ::std::default::Default::default()
+ }
+
+ // required bytes signature = 1;
+
+ pub fn signature(&self) -> &[u8] {
+ match self.signature.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_signature(&mut self) {
+ self.signature = ::std::option::Option::None;
+ }
+
+ pub fn has_signature(&self) -> bool {
+ self.signature.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_signature(&mut self, v: ::std::vec::Vec<u8>) {
+ self.signature = ::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_signature(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.signature.is_none() {
+ self.signature = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.signature.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_signature(&mut self) -> ::std::vec::Vec<u8> {
+ self.signature.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(1);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "signature",
+ |m: &TronSignature| { &m.signature },
+ |m: &mut TronSignature| { &mut m.signature },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronSignature>(
+ "TronSignature",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronSignature {
+ const NAME: &'static str = "TronSignature";
+
+ fn is_initialized(&self) -> bool {
+ if self.signature.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.signature = ::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.signature.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(1, &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.signature.as_ref() {
+ os.write_bytes(1, 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() -> TronSignature {
+ TronSignature::new()
+ }
+
+ fn clear(&mut self) {
+ self.signature = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronSignature {
+ static instance: TronSignature = TronSignature {
+ signature: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronSignature {
+ 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("TronSignature").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronSignature {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronSignature {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronRawTransaction)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronRawTransaction {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.ref_block_bytes)
+ pub ref_block_bytes: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.ref_block_hash)
+ pub ref_block_hash: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.expiration)
+ pub expiration: ::std::option::Option<u64>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.data)
+ pub data: ::std::option::Option<::std::vec::Vec<u8>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.contract)
+ pub contract: ::std::vec::Vec<tron_raw_transaction::TronRawContract>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.timestamp)
+ pub timestamp: ::std::option::Option<u64>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.fee_limit)
+ pub fee_limit: ::std::option::Option<u64>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronRawTransaction.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronRawTransaction {
+ fn default() -> &'a TronRawTransaction {
+ <TronRawTransaction as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronRawTransaction {
+ pub fn new() -> TronRawTransaction {
+ ::std::default::Default::default()
+ }
+
+ // required bytes ref_block_bytes = 1;
+
+ pub fn ref_block_bytes(&self) -> &[u8] {
+ match self.ref_block_bytes.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_ref_block_bytes(&mut self) {
+ self.ref_block_bytes = ::std::option::Option::None;
+ }
+
+ pub fn has_ref_block_bytes(&self) -> bool {
+ self.ref_block_bytes.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_ref_block_bytes(&mut self, v: ::std::vec::Vec<u8>) {
+ self.ref_block_bytes = ::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_ref_block_bytes(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.ref_block_bytes.is_none() {
+ self.ref_block_bytes = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.ref_block_bytes.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_ref_block_bytes(&mut self) -> ::std::vec::Vec<u8> {
+ self.ref_block_bytes.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required bytes ref_block_hash = 4;
+
+ pub fn ref_block_hash(&self) -> &[u8] {
+ match self.ref_block_hash.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_ref_block_hash(&mut self) {
+ self.ref_block_hash = ::std::option::Option::None;
+ }
+
+ pub fn has_ref_block_hash(&self) -> bool {
+ self.ref_block_hash.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_ref_block_hash(&mut self, v: ::std::vec::Vec<u8>) {
+ self.ref_block_hash = ::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_ref_block_hash(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.ref_block_hash.is_none() {
+ self.ref_block_hash = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.ref_block_hash.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_ref_block_hash(&mut self) -> ::std::vec::Vec<u8> {
+ self.ref_block_hash.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ // required uint64 expiration = 8;
+
+ pub fn expiration(&self) -> u64 {
+ self.expiration.unwrap_or(0)
+ }
+
+ pub fn clear_expiration(&mut self) {
+ self.expiration = ::std::option::Option::None;
+ }
+
+ pub fn has_expiration(&self) -> bool {
+ self.expiration.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_expiration(&mut self, v: u64) {
+ self.expiration = ::std::option::Option::Some(v);
+ }
+
+ // optional bytes data = 10;
+
+ 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())
+ }
+
+ // required uint64 timestamp = 14;
+
+ pub fn timestamp(&self) -> u64 {
+ self.timestamp.unwrap_or(0)
+ }
+
+ pub fn clear_timestamp(&mut self) {
+ self.timestamp = ::std::option::Option::None;
+ }
+
+ pub fn has_timestamp(&self) -> bool {
+ self.timestamp.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_timestamp(&mut self, v: u64) {
+ self.timestamp = ::std::option::Option::Some(v);
+ }
+
+ // optional uint64 fee_limit = 18;
+
+ pub fn fee_limit(&self) -> u64 {
+ self.fee_limit.unwrap_or(0)
+ }
+
+ pub fn clear_fee_limit(&mut self) {
+ self.fee_limit = ::std::option::Option::None;
+ }
+
+ pub fn has_fee_limit(&self) -> bool {
+ self.fee_limit.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_fee_limit(&mut self, v: u64) {
+ self.fee_limit = ::std::option::Option::Some(v);
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(7);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "ref_block_bytes",
+ |m: &TronRawTransaction| { &m.ref_block_bytes },
+ |m: &mut TronRawTransaction| { &mut m.ref_block_bytes },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "ref_block_hash",
+ |m: &TronRawTransaction| { &m.ref_block_hash },
+ |m: &mut TronRawTransaction| { &mut m.ref_block_hash },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "expiration",
+ |m: &TronRawTransaction| { &m.expiration },
+ |m: &mut TronRawTransaction| { &mut m.expiration },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "data",
+ |m: &TronRawTransaction| { &m.data },
+ |m: &mut TronRawTransaction| { &mut m.data },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
+ "contract",
+ |m: &TronRawTransaction| { &m.contract },
+ |m: &mut TronRawTransaction| { &mut m.contract },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "timestamp",
+ |m: &TronRawTransaction| { &m.timestamp },
+ |m: &mut TronRawTransaction| { &mut m.timestamp },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "fee_limit",
+ |m: &TronRawTransaction| { &m.fee_limit },
+ |m: &mut TronRawTransaction| { &mut m.fee_limit },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronRawTransaction>(
+ "TronRawTransaction",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronRawTransaction {
+ const NAME: &'static str = "TronRawTransaction";
+
+ fn is_initialized(&self) -> bool {
+ if self.ref_block_bytes.is_none() {
+ return false;
+ }
+ if self.ref_block_hash.is_none() {
+ return false;
+ }
+ if self.expiration.is_none() {
+ return false;
+ }
+ if self.timestamp.is_none() {
+ return false;
+ }
+ for v in &self.contract {
+ if !v.is_initialized() {
+ 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.ref_block_bytes = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 34 => {
+ self.ref_block_hash = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 64 => {
+ self.expiration = ::std::option::Option::Some(is.read_uint64()?);
+ },
+ 82 => {
+ self.data = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 90 => {
+ self.contract.push(is.read_message()?);
+ },
+ 112 => {
+ self.timestamp = ::std::option::Option::Some(is.read_uint64()?);
+ },
+ 144 => {
+ 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())?;
+ },
+ };
+ }
+ ::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.ref_block_bytes.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(1, &v);
+ }
+ if let Some(v) = self.ref_block_hash.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(4, &v);
+ }
+ if let Some(v) = self.expiration {
+ my_size += ::protobuf::rt::uint64_size(8, v);
+ }
+ if let Some(v) = self.data.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(10, &v);
+ }
+ for value in &self.contract {
+ let len = value.compute_size();
+ my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
+ };
+ if let Some(v) = self.timestamp {
+ my_size += ::protobuf::rt::uint64_size(14, v);
+ }
+ if let Some(v) = self.fee_limit {
+ my_size += ::protobuf::rt::uint64_size(18, 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.ref_block_bytes.as_ref() {
+ os.write_bytes(1, v)?;
+ }
+ if let Some(v) = self.ref_block_hash.as_ref() {
+ os.write_bytes(4, v)?;
+ }
+ if let Some(v) = self.expiration {
+ os.write_uint64(8, v)?;
+ }
+ if let Some(v) = self.data.as_ref() {
+ os.write_bytes(10, v)?;
+ }
+ for v in &self.contract {
+ ::protobuf::rt::write_message_field_with_cached_size(11, v, os)?;
+ };
+ if let Some(v) = self.timestamp {
+ os.write_uint64(14, v)?;
+ }
+ if let Some(v) = self.fee_limit {
+ os.write_uint64(18, 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() -> TronRawTransaction {
+ TronRawTransaction::new()
+ }
+
+ fn clear(&mut self) {
+ self.ref_block_bytes = ::std::option::Option::None;
+ self.ref_block_hash = ::std::option::Option::None;
+ self.expiration = ::std::option::Option::None;
+ self.data = ::std::option::Option::None;
+ self.contract.clear();
+ self.timestamp = ::std::option::Option::None;
+ self.fee_limit = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronRawTransaction {
+ static instance: TronRawTransaction = TronRawTransaction {
+ ref_block_bytes: ::std::option::Option::None,
+ ref_block_hash: ::std::option::Option::None,
+ expiration: ::std::option::Option::None,
+ data: ::std::option::Option::None,
+ contract: ::std::vec::Vec::new(),
+ timestamp: ::std::option::Option::None,
+ fee_limit: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronRawTransaction {
+ 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("TronRawTransaction").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronRawTransaction {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronRawTransaction {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+/// Nested message and enums of message `TronRawTransaction`
+pub mod tron_raw_transaction {
+ // @@protoc_insertion_point(message:hw.trezor.messages.tron.TronRawTransaction.TronRawContract)
+ #[derive(PartialEq,Clone,Default,Debug)]
+ pub struct TronRawContract {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.type)
+ pub type_: ::std::option::Option<::protobuf::EnumOrUnknown<tron_raw_contract::TronRawContractType>>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.parameter)
+ pub parameter: ::protobuf::MessageField<tron_raw_contract::TronRawParameter>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+ }
+
+ impl<'a> ::std::default::Default for &'a TronRawContract {
+ fn default() -> &'a TronRawContract {
+ <TronRawContract as ::protobuf::Message>::default_instance()
+ }
+ }
+
+ impl TronRawContract {
+ pub fn new() -> TronRawContract {
+ ::std::default::Default::default()
+ }
+
+ // required .hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType type = 1;
+
+ pub fn type_(&self) -> tron_raw_contract::TronRawContractType {
+ match self.type_ {
+ Some(e) => e.enum_value_or(tron_raw_contract::TronRawContractType::TransferContract),
+ None => tron_raw_contract::TronRawContractType::TransferContract,
+ }
+ }
+
+ pub fn clear_type_(&mut self) {
+ self.type_ = ::std::option::Option::None;
+ }
+
+ pub fn has_type(&self) -> bool {
+ self.type_.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_type(&mut self, v: tron_raw_contract::TronRawContractType) {
+ self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
+ }
+
+ pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(2);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "type",
+ |m: &TronRawContract| { &m.type_ },
+ |m: &mut TronRawContract| { &mut m.type_ },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, tron_raw_contract::TronRawParameter>(
+ "parameter",
+ |m: &TronRawContract| { &m.parameter },
+ |m: &mut TronRawContract| { &mut m.parameter },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronRawContract>(
+ "TronRawTransaction.TronRawContract",
+ fields,
+ oneofs,
+ )
+ }
+ }
+
+ impl ::protobuf::Message for TronRawContract {
+ const NAME: &'static str = "TronRawContract";
+
+ fn is_initialized(&self) -> bool {
+ if self.type_.is_none() {
+ return false;
+ }
+ if self.parameter.is_none() {
+ return false;
+ }
+ for v in &self.parameter {
+ if !v.is_initialized() {
+ 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 {
+ 8 => {
+ self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
+ },
+ 18 => {
+ ::protobuf::rt::read_singular_message_into_field(is, &mut self.parameter)?;
+ },
+ 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.type_ {
+ my_size += ::protobuf::rt::int32_size(1, v.value());
+ }
+ if let Some(v) = self.parameter.as_ref() {
+ let len = v.compute_size();
+ my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
+ }
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ if let Some(v) = self.type_ {
+ os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
+ }
+ if let Some(v) = self.parameter.as_ref() {
+ ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;
+ }
+ 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() -> TronRawContract {
+ TronRawContract::new()
+ }
+
+ fn clear(&mut self) {
+ self.type_ = ::std::option::Option::None;
+ self.parameter.clear();
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronRawContract {
+ static instance: TronRawContract = TronRawContract {
+ type_: ::std::option::Option::None,
+ parameter: ::protobuf::MessageField::none(),
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+ }
+
+ impl ::protobuf::MessageFull for TronRawContract {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| super::file_descriptor().message_by_package_relative_name("TronRawTransaction.TronRawContract").unwrap()).clone()
+ }
+ }
+
+ impl ::std::fmt::Display for TronRawContract {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+ }
+
+ impl ::protobuf::reflect::ProtobufValue for TronRawContract {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+ }
+
+ /// Nested message and enums of message `TronRawContract`
+ pub mod tron_raw_contract {
+ // @@protoc_insertion_point(message:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawParameter)
+ #[derive(PartialEq,Clone,Default,Debug)]
+ pub struct TronRawParameter {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawParameter.type_url)
+ pub type_url: ::std::option::Option<::std::string::String>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawParameter.value)
+ pub value: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawParameter.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+ }
+
+ impl<'a> ::std::default::Default for &'a TronRawParameter {
+ fn default() -> &'a TronRawParameter {
+ <TronRawParameter as ::protobuf::Message>::default_instance()
+ }
+ }
+
+ impl TronRawParameter {
+ pub fn new() -> TronRawParameter {
+ ::std::default::Default::default()
+ }
+
+ // required string type_url = 1;
+
+ pub fn type_url(&self) -> &str {
+ match self.type_url.as_ref() {
+ Some(v) => v,
+ None => "",
+ }
+ }
+
+ pub fn clear_type_url(&mut self) {
+ self.type_url = ::std::option::Option::None;
+ }
+
+ pub fn has_type_url(&self) -> bool {
+ self.type_url.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_type_url(&mut self, v: ::std::string::String) {
+ self.type_url = ::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_type_url(&mut self) -> &mut ::std::string::String {
+ if self.type_url.is_none() {
+ self.type_url = ::std::option::Option::Some(::std::string::String::new());
+ }
+ self.type_url.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_type_url(&mut self) -> ::std::string::String {
+ self.type_url.take().unwrap_or_else(|| ::std::string::String::new())
+ }
+
+ // required bytes value = 2;
+
+ pub fn value(&self) -> &[u8] {
+ match self.value.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_value(&mut self) {
+ self.value = ::std::option::Option::None;
+ }
+
+ pub fn has_value(&self) -> bool {
+ self.value.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
+ self.value = ::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_value(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.value.is_none() {
+ self.value = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.value.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
+ self.value.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(2);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "type_url",
+ |m: &TronRawParameter| { &m.type_url },
+ |m: &mut TronRawParameter| { &mut m.type_url },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "value",
+ |m: &TronRawParameter| { &m.value },
+ |m: &mut TronRawParameter| { &mut m.value },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronRawParameter>(
+ "TronRawTransaction.TronRawContract.TronRawParameter",
+ fields,
+ oneofs,
+ )
+ }
+ }
+
+ impl ::protobuf::Message for TronRawParameter {
+ const NAME: &'static str = "TronRawParameter";
+
+ fn is_initialized(&self) -> bool {
+ if self.type_url.is_none() {
+ return false;
+ }
+ if self.value.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.type_url = ::std::option::Option::Some(is.read_string()?);
+ },
+ 18 => {
+ self.value = ::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.type_url.as_ref() {
+ my_size += ::protobuf::rt::string_size(1, &v);
+ }
+ if let Some(v) = self.value.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(2, &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.type_url.as_ref() {
+ os.write_string(1, v)?;
+ }
+ if let Some(v) = self.value.as_ref() {
+ os.write_bytes(2, 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() -> TronRawParameter {
+ TronRawParameter::new()
+ }
+
+ fn clear(&mut self) {
+ self.type_url = ::std::option::Option::None;
+ self.value = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronRawParameter {
+ static instance: TronRawParameter = TronRawParameter {
+ type_url: ::std::option::Option::None,
+ value: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+ }
+
+ impl ::protobuf::MessageFull for TronRawParameter {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name("TronRawTransaction.TronRawContract.TronRawParameter").unwrap()).clone()
+ }
+ }
+
+ impl ::std::fmt::Display for TronRawParameter {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+ }
+
+ impl ::protobuf::reflect::ProtobufValue for TronRawParameter {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+ }
+
+ #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+ // @@protoc_insertion_point(enum:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType)
+ pub enum TronRawContractType {
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.TransferContract)
+ TransferContract = 1,
+ }
+
+ impl ::protobuf::Enum for TronRawContractType {
+ const NAME: &'static str = "TronRawContractType";
+
+ fn value(&self) -> i32 {
+ *self as i32
+ }
+
+ fn from_i32(value: i32) -> ::std::option::Option<TronRawContractType> {
+ match value {
+ 1 => ::std::option::Option::Some(TronRawContractType::TransferContract),
+ _ => ::std::option::Option::None
+ }
+ }
+
+ fn from_str(str: &str) -> ::std::option::Option<TronRawContractType> {
+ match str {
+ "TransferContract" => ::std::option::Option::Some(TronRawContractType::TransferContract),
+ _ => ::std::option::Option::None
+ }
+ }
+
+ const VALUES: &'static [TronRawContractType] = &[
+ TronRawContractType::TransferContract,
+ ];
+ }
+
+ impl ::protobuf::EnumFull for TronRawContractType {
+ fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| super::super::file_descriptor().enum_by_package_relative_name("TronRawTransaction.TronRawContract.TronRawContractType").unwrap()).clone()
+ }
+
+ fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {
+ let index = match self {
+ TronRawContractType::TransferContract => 0,
+ };
+ Self::enum_descriptor().value_by_index(index)
+ }
+ }
+
+ // Note, `Default` is implemented although default value is not 0
+ impl ::std::default::Default for TronRawContractType {
+ fn default() -> Self {
+ TronRawContractType::TransferContract
+ }
+ }
+
+ impl TronRawContractType {
+ pub(in super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {
+ ::protobuf::reflect::GeneratedEnumDescriptorData::new::<TronRawContractType>("TronRawTransaction.TronRawContract.TronRawContractType")
+ }
+ }
+ }
+}
+
static file_descriptor_proto_data: &'static [u8] = b"\
\n\x13messages-tron.proto\x12\x17hw.trezor.messages.tron\"l\n\x0eTronGet\
Address\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12!\n\x0cs\
how_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\x12\x1a\n\x08chunkify\
\x18\x03\x20\x01(\x08R\x08chunkify\"9\n\x0bTronAddress\x12\x18\n\x07addr\
ess\x18\x01\x20\x02(\tR\x07address\x12\x10\n\x03mac\x18\x02\x20\x01(\x0c\
- R\x03macB8\n#com.satoshilabs.trezor.lib.protobufB\x11TrezorMessageTron\
+ 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\"\
+ \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\
+ \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.\
+ 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\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -462,10 +2289,18 @@ 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(2);
+ let mut messages = ::std::vec::Vec::with_capacity(9);
messages.push(TronGetAddress::generated_message_descriptor_data());
messages.push(TronAddress::generated_message_descriptor_data());
- let mut enums = ::std::vec::Vec::with_capacity(0);
+ messages.push(TronSignTx::generated_message_descriptor_data());
+ messages.push(TronContractRequest::generated_message_descriptor_data());
+ messages.push(TronTransferContract::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());
+ messages.push(tron_raw_transaction::tron_raw_contract::TronRawParameter::generated_message_descriptor_data());
+ let mut enums = ::std::vec::Vec::with_capacity(1);
+ enums.push(tron_raw_transaction::tron_raw_contract::TronRawContractType::generated_enum_descriptor_data());
::protobuf::reflect::GeneratedFileDescriptor::new_generated(
file_descriptor_proto(),
deps,
diff --git a/tests/device_tests/tron/test_sign_tx.py b/tests/device_tests/tron/test_sign_tx.py
new file mode 100644
index 00000000..158d6295
--- /dev/null
+++ b/tests/device_tests/tron/test_sign_tx.py
@@ -0,0 +1,76 @@
+import binascii
+import json
+
+import pytest
+
+from trezorlib import messages, protobuf, tron
+from trezorlib.debuglink import SessionDebugWrapper as Session
+from trezorlib.exceptions import Cancelled, TrezorFailure
+from trezorlib.tools import parse_path
+
+from ...common import COMMON_FIXTURES_DIR, parametrize_using_common_fixtures
+
+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):
+ address_n = parse_path(parameters["address_n"])
+ tx = protobuf.dict_to_proto(messages.TronSignTx, parameters["tx"])
+ contract = make_contract(parameters["contract"])
+
+ parsed_tx, parsed_contract = tron.from_raw_data(
+ bytes.fromhex(parameters["raw_data_hex"])
+ )
+ assert parsed_tx == tx
+ assert parsed_contract == contract
+
+ if "signature" in result:
+ 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"]):
+ 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 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)
+
+
+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)
+
+
+def make_contract(contract):
+ type_name = contract["_message_type"]
+ assert type_name.startswith("Tron") and type_name.endswith("Contract")
+ cls = getattr(messages, type_name)
+ return protobuf.dict_to_proto(cls, contract)
+
+
+def build_from_fixture(name: str):
+ fixtures = json.loads((COMMON_FIXTURES_DIR / "tron" / "sign_tx.json").read_text())
+ entry = next(t for t in fixtures["tests"] if t.get("name") == name)
+ params = entry["parameters"]
+ address_n = parse_path(params["address_n"])
+ tx = protobuf.dict_to_proto(messages.TronSignTx, params["tx"])
+ contract = make_contract(params["contract"])
+ return tx, contract, address_n
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index cd84a503..6580f1d4 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -2685,6 +2685,13 @@
"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_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_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",
@@ -4258,6 +4265,13 @@
"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_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_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",
@@ -5831,6 +5845,13 @@
"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_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_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",
@@ -7422,6 +7443,13 @@
"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_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_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",
@@ -8995,6 +9023,13 @@
"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_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_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",
@@ -10568,6 +10603,13 @@
"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_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_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",
@@ -12364,6 +12406,13 @@
"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_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_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",
@@ -13860,6 +13909,13 @@
"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_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_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",
@@ -15356,6 +15412,13 @@
"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_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_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",
@@ -16852,6 +16915,13 @@
"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_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_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",
@@ -18348,6 +18418,13 @@
"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_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_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",
@@ -19844,6 +19921,13 @@
"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_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_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",
@@ -21741,6 +21825,13 @@
"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_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_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": "b67b27c32ee64c1e53a9387d2aee7ab3d687611896cb27373c8fc42ea1322372",
@@ -23268,6 +23359,13 @@
"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_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_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": "fb343c27cf331f89c1751443a356e7fb6c33b207dbcd795c739b156c1f412676",
@@ -24795,6 +24893,13 @@
"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_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_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": "cc8f65290c5fe0d62237501e5fc0cff7331f235be8483661e26ac300e0349536",
@@ -26322,6 +26427,13 @@
"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_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_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": "d74a9b9a34cd64676e0b6b14e9f4beeacf8b3428238be19cb9026e950fdc1b45",
@@ -27849,6 +27961,13 @@
"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_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_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": "180e21c5c94fe1239e6f8a87b835f292ef879330a16a9de58f62f3435a3cd6cc",
@@ -29376,6 +29495,13 @@
"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_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_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": "84cfd9706f41af528ff0d595334c79ccc41f12fc64c340b45af6eaf4733d2fab",
@@ -31551,6 +31677,13 @@
"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_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_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": "51058115bbd11b1c13cfc06a610dfb63905bbbd1f0ba7284a619c3b5670e7cba",
@@ -33086,6 +33219,13 @@
"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_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_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": "a049b5e71d6f9f0d4d18051bf166f31e7551105fa14a4348a38c2d9d63e302f6",
@@ -34621,6 +34761,13 @@
"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_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_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": "d845065f3c3f706b58e3d9a92ced9d936a8452ea31d90917e3b65ed717519722",
@@ -36156,6 +36303,13 @@
"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_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_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": "afe519fcce82ca31a06215be2e8ad5656beaffa9843600cf98c7e3659557691d",
@@ -37691,6 +37845,13 @@
"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_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_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": "19b377cdb2c2438039884f1dc706cbf3abd2ea43ebc52fdb9434d4db1484188a",
@@ -39231,6 +39392,13 @@
"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_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_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": "048b0c53385f632b6485feff4bdbba8751e543266a0623e339865d7f77f2d87d",
diff --git a/tools/check-bitcoin-only b/tools/check-bitcoin-only
index 816cffd9..7c0cc7b4 100755
--- a/tools/check-bitcoin-only
+++ b/tools/check-bitcoin-only
@@ -8,6 +8,7 @@ EXCEPTIONS+=( "derive_cardano" ) # field name in Initialize message
# BIP39 or SLIP39 words that have "dash" and "ripple" in them
EXCEPTIONS+=( "dash" "ripple" )
EXCEPTIONS+=( "base" ) # name EVM chain
+EXCEPTIONS+=( "strong" ) # Gives false positive for TRON
GREP_ARGS=()
for exception in "${EXCEPTIONS[@]}"; do
@@ -22,7 +23,10 @@ IFS="
"
for altcoin in $ALTCOINS; do
# echo :"$altcoin":
- if strings "$1" | grep -i "$altcoin" | grep -vi ${GREP_ARGS[@]} ; then
+ FOUND=$(strings "$1" | grep -i "$altcoin" | grep -vi ${GREP_ARGS[@]})
+ if [ -n "$FOUND" ]; then
+ echo "Found altcoin string '$altcoin':"
+ echo "$FOUND"
RETURN=1
fi
done
Why this scored 35/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.