chore(tron): scaffolding for `WithdrawBalanceContract`
What changed, and why it matters
This commit adds support for a new Tron blockchain operation called 'WithdrawBalanceContract' (claiming voting rewards). It is a feature addition: new message types, generated code, translations, and a test fixture. There is no indication of a security bug or vulnerability fix in the diff.
No security action required. Treat as routine feature scaffolding. Review the follow-up implementation commit that actually handles signing and user confirmation for WithdrawBalanceContract to ensure owner_address validation and safe prompts.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit introduces scaffolding for Tron WithdrawBalanceContract. Changes include: adding TronWithdrawBalance message and MessageType_TronWithdrawBalance = 2213 in protobuf definitions; adding WithdrawBalanceContract = 13 to TronRawContractType; regenerating Python, Rust, and translation artifacts; adding a test fixture ‘Claim_Voting_Rewards’; and updating the Tron app README. No runtime signing/validation logic is visible in the diff, and no security-relevant bug is patched.
Changed components
common/protob/messages-tron.protocommon/protob/messages.protocore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_tron.rscore/translations/en.jsoncore/src/apps/tron/README.mdInspect captured patch +481 / −51
diff --git a/common/protob/messages-tron.proto b/common/protob/messages-tron.proto
index c73b70b6..3318b4a9 100644
--- a/common/protob/messages-tron.proto
+++ b/common/protob/messages-tron.proto
@@ -57,6 +57,7 @@ message TronSignTx {
* @next TronFreezeBalanceV2Contract
* @next TronUnfreezeBalanceV2Contract
* @next TronWithdrawUnfreeze
+ * @next TronWithdrawBalance
*/
message TronContractRequest {}
@@ -130,6 +131,15 @@ message TronWithdrawUnfreeze {
required bytes owner_address = 1; // Address to claim all unfrozen TRX.
}
+/**
+ * Request: Claim voting rewards (WithdrawBalanceContract)
+ * @next TronSignature
+ */
+// https://github.com/tronprotocol/protocol/blob/4c726956542b8dff5a4bd5c54aa07cd9da257d08/core/contract/balance_contract.proto#L28
+message TronWithdrawBalance {
+ required bytes owner_address = 1;
+}
+
// https://github.com/tronprotocol/protocol/blob/37bb922a9967bbbef1e84de1c9e5cda56a2d7998/core/contract/common.proto#L9C1-L13C2
// Staking/Unstaking can not happen just for TRON_POWER:
// https://developers.tron.network/reference/freezebalancev2-1
@@ -171,6 +181,7 @@ message TronRawTransaction {
enum TronRawContractType {
TransferContract = 1;
VoteWitnessContract = 4;
+ WithdrawBalanceContract = 13;
TriggerSmartContract = 31;
FreezeBalanceV2Contract = 54;
UnfreezeBalanceV2Contract = 55;
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index 79f4d614..4c4418eb 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -378,6 +378,8 @@ enum MessageType {
MessageType_TronUnfreezeBalanceV2Contract = 2208 [(wire_in) = true];
MessageType_TronWithdrawUnfreeze = 2209 [(wire_in) = true];
MessageType_TronVoteWitnessContract = 2210 [(wire_in) = true];
+ // 2 indexes reserved for (un)delegation. PR in review.
+ MessageType_TronWithdrawBalance = 2213 [(wire_in) = true];
// Benchmark
MessageType_BenchmarkListNames = 9100 [(bitcoin_only) = true];
diff --git a/common/tests/fixtures/tron/sign_tx.json b/common/tests/fixtures/tron/sign_tx.json
index da13c850..1fd6a9d6 100644
--- a/common/tests/fixtures/tron/sign_tx.json
+++ b/common/tests/fixtures/tron/sign_tx.json
@@ -488,6 +488,48 @@
"signature": "833f6ba5c449a28ee6c58d98298f2f7cce8be1b7f70396e763ec216ca1d396b152bcefe9c7dde9970db2f1d38ecfba5aa20023f966f685da0048944415cb56f31C"
}
},
+ {
+ "name": "Claim_Voting_Rewards",
+ "parameters": {
+ "address_n": "m/44'/195'/0'/0/0",
+ "tx": {
+ "ref_block_bytes": "cb1c",
+ "ref_block_hash": "bda32dda74927326",
+ "expiration": 1781336880000,
+ "timestamp": 1781335620000
+ },
+ "contract": {
+ "_message_type": "TronWithdrawBalance",
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58"
+ },
+ "raw_data_hex": "0a02cb1c2208bda32dda749273264080e7ceffeb335a53080d124f0a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e576974686472617742616c616e6365436f6e747261637412170a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5870a0f381ffeb33",
+ "raw": {
+ "visible": false,
+ "txID": "4ccaede54129810a8f74d28666550ffaf515f4c3bab0ce5168985a48ee333b85",
+ "raw_data_hex": "0a02cb1c2208bda32dda749273264080e7ceffeb335a53080d124f0a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e576974686472617742616c616e6365436f6e747261637412170a1541f2cd810c48c401d392ead3c6e1e1cb9f57750a5870a0f381ffeb33",
+ "raw_data": {
+ "contract": [
+ {
+ "parameter": {
+ "value": {
+ "owner_address": "41f2cd810c48c401d392ead3c6e1e1cb9f57750a58"
+ },
+ "type_url": "type.googleapis.com/protocol.WithdrawBalanceContract"
+ },
+ "type": "WithdrawBalanceContract"
+ }
+ ],
+ "ref_block_bytes": "cb1c",
+ "ref_block_hash": "bda32dda74927326",
+ "expiration": 1781336880000,
+ "timestamp": 1781335620000
+ }
+ }
+ },
+ "result": {
+ "signature": "613af5d3a5190ce6f2ef4ff0a2164cd929950353e2a5d75190c927c6ff3277174d75ab0b2f1e3c2804de6f34d50d857c7a5b78043e61a448fa3f2bd7ce3ea5401B"
+ }
+ },
{
"name": "TriggerSmartContract_unknown_contract",
"parameters": {
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index b43d19df..2f880924 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -112,6 +112,7 @@ static void _librust_qstrs(void) {
MP_QSTR_address__title_receive_address;
MP_QSTR_address__title_refund_address;
MP_QSTR_address__title_yours;
+ MP_QSTR_address__warning_not_yours;
MP_QSTR_address__xpub;
MP_QSTR_address_details__account_info;
MP_QSTR_address_details__derivation_path;
@@ -1508,6 +1509,9 @@ static void _librust_qstrs(void) {
MP_QSTR_tezos__submit_ballot;
MP_QSTR_tezos__submit_proposal;
MP_QSTR_tezos__submit_proposals;
+ MP_QSTR_tron__claim_unfrozen_balance;
+ MP_QSTR_tron__claim_voting_rewards;
+ MP_QSTR_tron__owner_address;
MP_QSTR_u2f__get;
MP_QSTR_u2f__set_template;
MP_QSTR_u2f__title_get;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 0faa9989..0cb41388 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1620,6 +1620,13 @@ pub enum TranslatedString {
solana__offchain_is_multisig = 1232, // "The following message requires multiple signers."
words__comm_continue = 1233, // "Communication with your connected device failed. It's safe to continue."
address__title_cosigner_template = 1234, // "Cosigner {0}"
+ #[cfg(feature = "universal_fw")]
+ tron__claim_unfrozen_balance = 1235, // "Claim unfrozen balance?"
+ #[cfg(feature = "universal_fw")]
+ tron__claim_voting_rewards = 1236, // "Claim voting rewards?"
+ address__warning_not_yours = 1237, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "This is NOT your address"}
+ #[cfg(feature = "universal_fw")]
+ tron__owner_address = 1238, // "Owner address"
}
impl TranslatedString {
@@ -2862,6 +2869,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -4102,6 +4113,10 @@ impl TranslatedString {
19287,
19358,
19370,
+ 19393,
+ 19414,
+ 19414,
+ 19427,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5341,6 +5356,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -6581,6 +6600,10 @@ impl TranslatedString {
19287,
19358,
19370,
+ 19393,
+ 19414,
+ 19414,
+ 19427,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7820,6 +7843,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -9060,6 +9087,10 @@ impl TranslatedString {
19287,
19358,
19370,
+ 19393,
+ 19414,
+ 19414,
+ 19427,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -10299,6 +10330,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -11539,6 +11574,10 @@ impl TranslatedString {
19287,
19358,
19370,
+ 19393,
+ 19414,
+ 19414,
+ 19427,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12779,6 +12818,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -14019,6 +14062,10 @@ impl TranslatedString {
17175,
17246,
17258,
+ 17281,
+ 17302,
+ 17302,
+ 17315,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15258,6 +15305,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -16498,6 +16549,10 @@ impl TranslatedString {
17175,
17246,
17258,
+ 17281,
+ 17302,
+ 17302,
+ 17315,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17737,6 +17792,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -18977,6 +19036,10 @@ impl TranslatedString {
17175,
17246,
17258,
+ 17281,
+ 17302,
+ 17302,
+ 17315,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -20216,6 +20279,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -21456,6 +21523,10 @@ impl TranslatedString {
17175,
17246,
17258,
+ 17281,
+ 17302,
+ 17302,
+ 17315,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -22696,6 +22767,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -23936,6 +24011,10 @@ impl TranslatedString {
18804,
18875,
18887,
+ 18910,
+ 18931,
+ 18931,
+ 18944,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -25175,6 +25254,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -26415,6 +26498,10 @@ impl TranslatedString {
18804,
18875,
18887,
+ 18910,
+ 18931,
+ 18931,
+ 18944,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27654,6 +27741,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -28894,6 +28985,10 @@ impl TranslatedString {
18804,
18875,
18887,
+ 18910,
+ 18931,
+ 18931,
+ 18944,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -30133,6 +30228,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -31373,6 +31472,10 @@ impl TranslatedString {
18804,
18875,
18887,
+ 18910,
+ 18931,
+ 18931,
+ 18944,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -32613,6 +32716,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "This is NOT your address",
+ "Owner address",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -33853,6 +33960,10 @@ impl TranslatedString {
20088,
20159,
20171,
+ 20194,
+ 20215,
+ 20239,
+ 20252,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -35092,6 +35203,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "This is NOT your address",
+ "Owner address",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -36332,6 +36447,10 @@ impl TranslatedString {
20088,
20159,
20171,
+ 20194,
+ 20215,
+ 20239,
+ 20252,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37571,6 +37690,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "This is NOT your address",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -38811,6 +38934,10 @@ impl TranslatedString {
20088,
20159,
20171,
+ 20194,
+ 20215,
+ 20239,
+ 20252,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -40050,6 +40177,10 @@ impl TranslatedString {
"The following message requires multiple signers.",
"Communication with your connected device failed. It's safe to continue.",
"Cosigner {0}",
+ "Claim unfrozen balance?",
+ "Claim voting rewards?",
+ "This is NOT your address",
+ "Owner address",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -41290,6 +41421,10 @@ impl TranslatedString {
20088,
20159,
20171,
+ 20194,
+ 20215,
+ 20239,
+ 20252,
];
}
@@ -41319,6 +41454,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_address__title_receive_address, Self::address__title_receive_address),
(Qstr::MP_QSTR_address__title_refund_address, Self::address__title_refund_address),
(Qstr::MP_QSTR_address__title_yours, Self::address__title_yours),
+ (Qstr::MP_QSTR_address__warning_not_yours, Self::address__warning_not_yours),
(Qstr::MP_QSTR_address__xpub, Self::address__xpub),
(Qstr::MP_QSTR_address_details__account_info, Self::address_details__account_info),
(Qstr::MP_QSTR_address_details__derivation_path, Self::address_details__derivation_path),
@@ -42737,6 +42873,12 @@ impl TranslatedString {
(Qstr::MP_QSTR_thp__pair_new_device, Self::thp__pair_new_device),
(Qstr::MP_QSTR_thp__pair_title, Self::thp__pair_title),
(Qstr::MP_QSTR_thp__qr_title, Self::thp__qr_title),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_tron__claim_unfrozen_balance, Self::tron__claim_unfrozen_balance),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_tron__claim_voting_rewards, Self::tron__claim_voting_rewards),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_tron__owner_address, Self::tron__owner_address),
(Qstr::MP_QSTR_tutorial__continue, Self::tutorial__continue),
(Qstr::MP_QSTR_tutorial__did_you_know, Self::tutorial__did_you_know),
(Qstr::MP_QSTR_tutorial__exit, Self::tutorial__exit),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index b9ad75ea..32383e7a 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -22,6 +22,7 @@ class TR:
address__title_receive_address: str = "Receive address"
address__title_refund_address: str = "Refund address"
address__title_yours: str = "Yours"
+ address__warning_not_yours: str = "This is NOT your address"
address__xpub: str = "XPUB"
address_details__account_info: str = "Account info"
address_details__derivation_path: str = "Derivation path"
@@ -1001,6 +1002,9 @@ class TR:
thp__pair_new_device: str = "Pair with new device"
thp__pair_title: str = "Before you continue"
thp__qr_title: str = "Scan QR code to pair"
+ tron__claim_unfrozen_balance: str = "Claim unfrozen balance?"
+ tron__claim_voting_rewards: str = "Claim voting rewards?"
+ tron__owner_address: str = "Owner address"
tutorial__continue: str = "Continue tutorial"
tutorial__did_you_know: str = "Did you know?"
tutorial__exit: str = "Exit tutorial"
diff --git a/core/src/apps/tron/README.md b/core/src/apps/tron/README.md
index a5da791f..11fe07d6 100644
--- a/core/src/apps/tron/README.md
+++ b/core/src/apps/tron/README.md
@@ -28,11 +28,12 @@ Therefore, we do not show any fees to the user on the device. The host applicati
- [X] Generate addresses for Receiving `TRX` or other tokens.
- [X] `TransferContract`: Sending `TRX`
-- [X] `TriggerSmartContract`: Send `USDT`, `USDD`, etc.
+- [X] `TriggerSmartContract`: Send `USDT`, `USDD`, etc., Interact with any smart contract.
- [X] `FreezeBalanceV2`: Stake `TRX` to get more `Bandwidth` or `Energy`
- [X] `UnfreezeBalanceV2`: Unstake frozen `TRX`
- [X] `WithdrawExpireUnfreeze`: Claim Unstaked `TRX` past their lock-up period
- [X] `VoteWitnessContract`: Vote using earned TRON Power.
+- [X] `WithdrawBalanceContract`: Claim Voting rewards.
### Notes
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index bd08cd65..a50dab32 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -297,3 +297,4 @@ if not utils.BITCOIN_ONLY:
TronUnfreezeBalanceV2Contract = 2208
TronWithdrawUnfreeze = 2209
TronVoteWitnessContract = 2210
+ TronWithdrawBalance = 2213
diff --git a/core/src/trezor/enums/TronRawContractType.py b/core/src/trezor/enums/TronRawContractType.py
index 28395760..68cd5b67 100644
--- a/core/src/trezor/enums/TronRawContractType.py
+++ b/core/src/trezor/enums/TronRawContractType.py
@@ -4,6 +4,7 @@
TransferContract = 1
VoteWitnessContract = 4
+WithdrawBalanceContract = 13
TriggerSmartContract = 31
FreezeBalanceV2Contract = 54
UnfreezeBalanceV2Contract = 55
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 1b835bdf..15c2333f 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -426,6 +426,7 @@ if TYPE_CHECKING:
class TronRawContractType(IntEnum):
TransferContract = 1
VoteWitnessContract = 4
+ WithdrawBalanceContract = 13
TriggerSmartContract = 31
FreezeBalanceV2Contract = 54
UnfreezeBalanceV2Contract = 55
@@ -716,6 +717,7 @@ if TYPE_CHECKING:
TronUnfreezeBalanceV2Contract = 2208
TronWithdrawUnfreeze = 2209
TronVoteWitnessContract = 2210
+ TronWithdrawBalance = 2213
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index d44bb1fa..0cc24f35 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -7384,6 +7384,20 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["TronWithdrawUnfreeze"]:
return isinstance(msg, cls)
+ class TronWithdrawBalance(protobuf.MessageType):
+ owner_address: "AnyBytes"
+
+ def __init__(
+ self,
+ *,
+ owner_address: "AnyBytes",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["TronWithdrawBalance"]:
+ return isinstance(msg, cls)
+
class TronSignature(protobuf.MessageType):
signature: "AnyBytes"
diff --git a/core/translations/en.json b/core/translations/en.json
index 93a83863..6e7e30b7 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -49,6 +49,12 @@
"address__title_receive_address": "Receive address",
"address__title_refund_address": "Refund address",
"address__title_yours": "Yours",
+ "address__warning_not_yours": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "This is NOT your address"
+ },
"address__xpub": {
"Bolt": "XPUB",
"Caesar": "XPUB",
@@ -2883,6 +2889,9 @@
"Delizia": "",
"Eckhart": "Scan QR code to pair"
},
+ "tron__claim_unfrozen_balance": "Claim unfrozen balance?",
+ "tron__claim_voting_rewards": "Claim voting rewards?",
+ "tron__owner_address": "Owner address",
"tutorial__continue": "Continue tutorial",
"tutorial__did_you_know": {
"Bolt": "",
diff --git a/core/translations/order.json b/core/translations/order.json
index fe81ce50..59590f75 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1233,5 +1233,9 @@
"1231": "solana__app_domain",
"1232": "solana__offchain_is_multisig",
"1233": "words__comm_continue",
- "1234": "address__title_cosigner_template"
+ "1234": "address__title_cosigner_template",
+ "1235": "tron__claim_unfrozen_balance",
+ "1236": "tron__claim_voting_rewards",
+ "1237": "address__warning_not_yours",
+ "1238": "tron__owner_address"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index ac76bcf6..bb3b76ec 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "ca9dcceae2906c2cceb083d3db5fd984756661cf5324ed40ea13b5b9e6383c13",
- "datetime": "2026-06-20T09:22:14.358363+00:00",
- "commit": "f542da297ee0e5fefd125b07b517f86fef61ac3e"
+ "merkle_root": "1444a775f6cf08549795786415f117d83af648c41f22466d478f6a43ace38020",
+ "datetime": "2026-06-24T21:15:44.979240+00:00",
+ "commit": "6403dffd45b199aebc6647b33e2a627e47710442"
},
"history": [
{
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 53f0a5d6..03529f22 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -485,6 +485,7 @@ class TronResourceCode(IntEnum):
class TronRawContractType(IntEnum):
TransferContract = 1
VoteWitnessContract = 4
+ WithdrawBalanceContract = 13
TriggerSmartContract = 31
FreezeBalanceV2Contract = 54
UnfreezeBalanceV2Contract = 55
@@ -776,6 +777,7 @@ class MessageType(IntEnum):
TronUnfreezeBalanceV2Contract = 2208
TronWithdrawUnfreeze = 2209
TronVoteWitnessContract = 2210
+ TronWithdrawBalance = 2213
BenchmarkListNames = 9100
BenchmarkNames = 9101
BenchmarkRun = 9102
@@ -9289,6 +9291,20 @@ class TronWithdrawUnfreeze(protobuf.MessageType):
self.owner_address = owner_address
+class TronWithdrawBalance(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 2213
+ FIELDS = {
+ 1: protobuf.Field("owner_address", "bytes", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ owner_address: "bytes",
+ ) -> None:
+ self.owner_address = owner_address
+
+
class TronSignature(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 2203
FIELDS = {
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 110b4199..df4a4c68 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -336,6 +336,7 @@ trezor_message_impl! {
TronUnfreezeBalanceV2Contract => MessageType_TronUnfreezeBalanceV2Contract,
TronWithdrawUnfreeze => MessageType_TronWithdrawUnfreeze,
TronVoteWitnessContract => MessageType_TronVoteWitnessContract,
+ TronWithdrawBalance => MessageType_TronWithdrawBalance,
}
#[cfg(feature = "webauthn")]
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index d3679c34..9e923aba 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -595,6 +595,8 @@ pub enum MessageType {
MessageType_TronWithdrawUnfreeze = 2209,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronVoteWitnessContract)
MessageType_TronVoteWitnessContract = 2210,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_TronWithdrawBalance)
+ MessageType_TronWithdrawBalance = 2213,
// @@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)
@@ -902,6 +904,7 @@ impl ::protobuf::Enum for MessageType {
2208 => ::std::option::Option::Some(MessageType::MessageType_TronUnfreezeBalanceV2Contract),
2209 => ::std::option::Option::Some(MessageType::MessageType_TronWithdrawUnfreeze),
2210 => ::std::option::Option::Some(MessageType::MessageType_TronVoteWitnessContract),
+ 2213 => ::std::option::Option::Some(MessageType::MessageType_TronWithdrawBalance),
9100 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkListNames),
9101 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkNames),
9102 => ::std::option::Option::Some(MessageType::MessageType_BenchmarkRun),
@@ -1198,6 +1201,7 @@ impl ::protobuf::Enum for MessageType {
"MessageType_TronUnfreezeBalanceV2Contract" => ::std::option::Option::Some(MessageType::MessageType_TronUnfreezeBalanceV2Contract),
"MessageType_TronWithdrawUnfreeze" => ::std::option::Option::Some(MessageType::MessageType_TronWithdrawUnfreeze),
"MessageType_TronVoteWitnessContract" => ::std::option::Option::Some(MessageType::MessageType_TronVoteWitnessContract),
+ "MessageType_TronWithdrawBalance" => ::std::option::Option::Some(MessageType::MessageType_TronWithdrawBalance),
"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),
@@ -1493,6 +1497,7 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_TronUnfreezeBalanceV2Contract,
MessageType::MessageType_TronWithdrawUnfreeze,
MessageType::MessageType_TronVoteWitnessContract,
+ MessageType::MessageType_TronWithdrawBalance,
MessageType::MessageType_BenchmarkListNames,
MessageType::MessageType_BenchmarkNames,
MessageType::MessageType_BenchmarkRun,
@@ -1794,12 +1799,13 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_TronUnfreezeBalanceV2Contract => 281,
MessageType::MessageType_TronWithdrawUnfreeze => 282,
MessageType::MessageType_TronVoteWitnessContract => 283,
- MessageType::MessageType_BenchmarkListNames => 284,
- MessageType::MessageType_BenchmarkNames => 285,
- MessageType::MessageType_BenchmarkRun => 286,
- MessageType::MessageType_BenchmarkResult => 287,
- MessageType::MessageType_TelemetryGet => 288,
- MessageType::MessageType_Telemetry => 289,
+ MessageType::MessageType_TronWithdrawBalance => 284,
+ MessageType::MessageType_BenchmarkListNames => 285,
+ MessageType::MessageType_BenchmarkNames => 286,
+ MessageType::MessageType_BenchmarkRun => 287,
+ MessageType::MessageType_BenchmarkResult => 288,
+ MessageType::MessageType_TelemetryGet => 289,
+ MessageType::MessageType_Telemetry => 290,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1818,7 +1824,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xfae\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xa6f\
\n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\xb0\xb5\
\x18\x01\x80\xa6\x1d\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\
@@ -2145,19 +2151,20 @@ static file_descriptor_proto_data: &'static [u8] = b"\
4\n)MessageType_TronUnfreezeBalanceV2Contract\x10\xa0\x11\x1a\x04\x90\
\xb5\x18\x01\x12+\n\x20MessageType_TronWithdrawUnfreeze\x10\xa1\x11\x1a\
\x04\x90\xb5\x18\x01\x12.\n#MessageType_TronVoteWitnessContract\x10\xa2\
- \x11\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_BenchmarkListNames\
- \x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMessageType_BenchmarkNames\
- \x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\x18MessageType_BenchmarkRun\x10\
- \x8eG\x1a\x04\x80\xa6\x1d\x01\x12&\n\x1bMessageType_BenchmarkResult\x10\
- \x8fG\x1a\x04\x80\xa6\x1d\x01\x12'\n\x18MessageType_TelemetryGet\x10\xcc\
- \x08\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12$\n\x15MessageType_Telem\
- etry\x10\xcd\x08\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x1a\x08\xc8\xf3\
- \x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08M\x10N\"\x04\x08G\x10\
- J\"\x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\xdb\x01\"\
- \x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\x06\x08\xb5\
- \x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\x07\x10\xf7\
- \x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezor.lib.protob\
- ufB\rTrezorMessage\x80\xa6\x1d\x01\
+ \x11\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_TronWithdrawBalance\
+ \x10\xa5\x11\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_BenchmarkList\
+ Names\x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMessageType_BenchmarkNa\
+ mes\x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\x18MessageType_BenchmarkRun\
+ \x10\x8eG\x1a\x04\x80\xa6\x1d\x01\x12&\n\x1bMessageType_BenchmarkResult\
+ \x10\x8fG\x1a\x04\x80\xa6\x1d\x01\x12'\n\x18MessageType_TelemetryGet\x10\
+ \xcc\x08\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12$\n\x15MessageType_T\
+ elemetry\x10\xcd\x08\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x1a\x08\xc8\
+ \xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08M\x10N\"\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.li\
+ b.protobufB\rTrezorMessage\x80\xa6\x1d\x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/rust/trezor-client/src/protos/generated/messages_tron.rs b/rust/trezor-client/src/protos/generated/messages_tron.rs
index d6873e34..80c954c9 100644
--- a/rust/trezor-client/src/protos/generated/messages_tron.rs
+++ b/rust/trezor-client/src/protos/generated/messages_tron.rs
@@ -2516,6 +2516,167 @@ impl ::protobuf::reflect::ProtobufValue for TronWithdrawUnfreeze {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
+// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronWithdrawBalance)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct TronWithdrawBalance {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.tron.TronWithdrawBalance.owner_address)
+ pub owner_address: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.tron.TronWithdrawBalance.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a TronWithdrawBalance {
+ fn default() -> &'a TronWithdrawBalance {
+ <TronWithdrawBalance as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl TronWithdrawBalance {
+ pub fn new() -> TronWithdrawBalance {
+ ::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())
+ }
+
+ 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::<_, _>(
+ "owner_address",
+ |m: &TronWithdrawBalance| { &m.owner_address },
+ |m: &mut TronWithdrawBalance| { &mut m.owner_address },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TronWithdrawBalance>(
+ "TronWithdrawBalance",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for TronWithdrawBalance {
+ const NAME: &'static str = "TronWithdrawBalance";
+
+ fn is_initialized(&self) -> bool {
+ if self.owner_address.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()?);
+ },
+ 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);
+ }
+ 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)?;
+ }
+ 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() -> TronWithdrawBalance {
+ TronWithdrawBalance::new()
+ }
+
+ fn clear(&mut self) {
+ self.owner_address = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static TronWithdrawBalance {
+ static instance: TronWithdrawBalance = TronWithdrawBalance {
+ owner_address: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for TronWithdrawBalance {
+ 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("TronWithdrawBalance").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for TronWithdrawBalance {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for TronWithdrawBalance {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
// @@protoc_insertion_point(message:hw.trezor.messages.tron.TronSignature)
#[derive(PartialEq,Clone,Default,Debug)]
pub struct TronSignature {
@@ -3493,6 +3654,8 @@ pub mod tron_raw_transaction {
TransferContract = 1,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.VoteWitnessContract)
VoteWitnessContract = 4,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.WithdrawBalanceContract)
+ WithdrawBalanceContract = 13,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.TriggerSmartContract)
TriggerSmartContract = 31,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRawContractType.FreezeBalanceV2Contract)
@@ -3514,6 +3677,7 @@ pub mod tron_raw_transaction {
match value {
1 => ::std::option::Option::Some(TronRawContractType::TransferContract),
4 => ::std::option::Option::Some(TronRawContractType::VoteWitnessContract),
+ 13 => ::std::option::Option::Some(TronRawContractType::WithdrawBalanceContract),
31 => ::std::option::Option::Some(TronRawContractType::TriggerSmartContract),
54 => ::std::option::Option::Some(TronRawContractType::FreezeBalanceV2Contract),
55 => ::std::option::Option::Some(TronRawContractType::UnfreezeBalanceV2Contract),
@@ -3526,6 +3690,7 @@ pub mod tron_raw_transaction {
match str {
"TransferContract" => ::std::option::Option::Some(TronRawContractType::TransferContract),
"VoteWitnessContract" => ::std::option::Option::Some(TronRawContractType::VoteWitnessContract),
+ "WithdrawBalanceContract" => ::std::option::Option::Some(TronRawContractType::WithdrawBalanceContract),
"TriggerSmartContract" => ::std::option::Option::Some(TronRawContractType::TriggerSmartContract),
"FreezeBalanceV2Contract" => ::std::option::Option::Some(TronRawContractType::FreezeBalanceV2Contract),
"UnfreezeBalanceV2Contract" => ::std::option::Option::Some(TronRawContractType::UnfreezeBalanceV2Contract),
@@ -3537,6 +3702,7 @@ pub mod tron_raw_transaction {
const VALUES: &'static [TronRawContractType] = &[
TronRawContractType::TransferContract,
TronRawContractType::VoteWitnessContract,
+ TronRawContractType::WithdrawBalanceContract,
TronRawContractType::TriggerSmartContract,
TronRawContractType::FreezeBalanceV2Contract,
TronRawContractType::UnfreezeBalanceV2Contract,
@@ -3554,10 +3720,11 @@ pub mod tron_raw_transaction {
let index = match self {
TronRawContractType::TransferContract => 0,
TronRawContractType::VoteWitnessContract => 1,
- TronRawContractType::TriggerSmartContract => 2,
- TronRawContractType::FreezeBalanceV2Contract => 3,
- TronRawContractType::UnfreezeBalanceV2Contract => 4,
- TronRawContractType::WithdrawExpireUnfreezeContract => 5,
+ TronRawContractType::WithdrawBalanceContract => 2,
+ TronRawContractType::TriggerSmartContract => 3,
+ TronRawContractType::FreezeBalanceV2Contract => 4,
+ TronRawContractType::UnfreezeBalanceV2Contract => 5,
+ TronRawContractType::WithdrawExpireUnfreezeContract => 6,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -3671,27 +3838,28 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x07balance\x18\x02\x20\x02(\x04R\x07balance\x12P\n\x08resource\x18\x03\
\x20\x01(\x0e2).hw.trezor.messages.tron.TronResourceCode:\tBANDWIDTHR\
\x08resource\";\n\x14TronWithdrawUnfreeze\x12#\n\rowner_address\x18\x01\
- \x20\x02(\x0cR\x0cownerAddress\"-\n\rTronSignature\x12\x1c\n\tsignature\
- \x18\x01\x20\x02(\x0cR\tsignature\"\x95\x06\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.tr\
- on.TronRawTransaction.TronRawContractR\x08contract\x12\x1c\n\ttimestamp\
- \x18\x0e\x20\x02(\x04R\ttimestamp\x12\x1b\n\tfee_limit\x18\x12\x20\x01(\
- \x04R\x08feeLimit\x1a\xe8\x03\n\x0fTronRawContract\x12c\n\x04type\x18\
- \x01\x20\x02(\x0e2O.hw.trezor.messages.tron.TronRawTransaction.TronRawCo\
- ntract.TronRawContractTypeR\x04type\x12j\n\tparameter\x18\x02\x20\x02(\
- \x0b2L.hw.trezor.messages.tron.TronRawTransaction.TronRawContract.TronRa\
- wParameterR\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\"\xbe\x01\n\x13TronRawContractType\x12\x14\n\x10TransferContra\
- ct\x10\x01\x12\x17\n\x13VoteWitnessContract\x10\x04\x12\x18\n\x14Trigger\
- SmartContract\x10\x1f\x12\x1b\n\x17FreezeBalanceV2Contract\x106\x12\x1d\
- \n\x19UnfreezeBalanceV2Contract\x107\x12\"\n\x1eWithdrawExpireUnfreezeCo\
- ntract\x108*-\n\x10TronResourceCode\x12\r\n\tBANDWIDTH\x10\0\x12\n\n\x06\
- ENERGY\x10\x01B8\n#com.satoshilabs.trezor.lib.protobufB\x11TrezorMessage\
- Tron\
+ \x20\x02(\x0cR\x0cownerAddress\":\n\x13TronWithdrawBalance\x12#\n\rowner\
+ _address\x18\x01\x20\x02(\x0cR\x0cownerAddress\"-\n\rTronSignature\x12\
+ \x1c\n\tsignature\x18\x01\x20\x02(\x0cR\tsignature\"\xb2\x06\n\x12TronRa\
+ wTransaction\x12&\n\x0fref_block_bytes\x18\x01\x20\x02(\x0cR\rrefBlockBy\
+ tes\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;.h\
+ w.trezor.messages.tron.TronRawTransaction.TronRawContractR\x08contract\
+ \x12\x1c\n\ttimestamp\x18\x0e\x20\x02(\x04R\ttimestamp\x12\x1b\n\tfee_li\
+ mit\x18\x12\x20\x01(\x04R\x08feeLimit\x1a\x85\x04\n\x0fTronRawContract\
+ \x12c\n\x04type\x18\x01\x20\x02(\x0e2O.hw.trezor.messages.tron.TronRawTr\
+ ansaction.TronRawContract.TronRawContractTypeR\x04type\x12j\n\tparameter\
+ \x18\x02\x20\x02(\x0b2L.hw.trezor.messages.tron.TronRawTransaction.TronR\
+ awContract.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\"\xdb\x01\n\x13TronRawContractType\x12\x14\n\
+ \x10TransferContract\x10\x01\x12\x17\n\x13VoteWitnessContract\x10\x04\
+ \x12\x1b\n\x17WithdrawBalanceContract\x10\r\x12\x18\n\x14TriggerSmartCon\
+ tract\x10\x1f\x12\x1b\n\x17FreezeBalanceV2Contract\x106\x12\x1d\n\x19Unf\
+ reezeBalanceV2Contract\x107\x12\"\n\x1eWithdrawExpireUnfreezeContract\
+ \x108*-\n\x10TronResourceCode\x12\r\n\tBANDWIDTH\x10\0\x12\n\n\x06ENERGY\
+ \x10\x01B8\n#com.satoshilabs.trezor.lib.protobufB\x11TrezorMessageTron\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -3709,7 +3877,7 @@ 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(15);
+ let mut messages = ::std::vec::Vec::with_capacity(16);
messages.push(TronGetAddress::generated_message_descriptor_data());
messages.push(TronAddress::generated_message_descriptor_data());
messages.push(TronSignTx::generated_message_descriptor_data());
@@ -3720,6 +3888,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
messages.push(TronFreezeBalanceV2Contract::generated_message_descriptor_data());
messages.push(TronUnfreezeBalanceV2Contract::generated_message_descriptor_data());
messages.push(TronWithdrawUnfreeze::generated_message_descriptor_data());
+ messages.push(TronWithdrawBalance::generated_message_descriptor_data());
messages.push(TronSignature::generated_message_descriptor_data());
messages.push(TronRawTransaction::generated_message_descriptor_data());
messages.push(tron_vote_witness_contract::TronVote::generated_message_descriptor_data());
Why this scored 15/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.