feat(common,core,python,tests): migrate Soroban authorization to SOROBAN_CREDENTIALS_ADDRESS_V2.
What changed, and why it matters
This commit updates Trezor's Stellar/Soroban smart-contract support to match a newer Stellar protocol version (Protocol 27). It renames the credential type from the older SOROBAN_CREDENTIALS_ADDRESS to SOROBAN_CREDENTIALS_ADDRESS_V2 and updates the related field name from address to address_v2 across the firmware, Python library, Rust client, and tests. The older credential type is intentionally no longer supported. There is no direct evidence in the commit of a security vulnerability being fixed; it reads as a routine protocol compatibility update.
Treat as a normal feature/protocol-compatibility update. Reviewers should verify that the legacy SOROBAN_CREDENTIALS_ADDRESS type is correctly rejected by both firmware and host library, and that test vectors cover the new ADDRESS_V2 serialization and confirmation path. No immediate security response is indicated by the commit content alone.
Security signals we found
Protocol version bump for Stellar Soroban authorization (v27)
Legacy SOROBAN_CREDENTIALS_ADDRESS (value 1) marked reserved and unsupported
Field rename address -> address_v2 across protobuf, core, python, rust
Dependency bump stellar-sdk >=15 for Protocol 27 XDR support
UI confirmation path updated to display ADDRESS_V2 credentials
Evidence from the diff
The change is a protocol migration for Stellar Soroban authorization. The protobuf definition reserves enum value 1 (legacy SOROBAN_CREDENTIALS_ADDRESS) and introduces SOROBAN_CREDENTIALS_ADDRESS_V2 = 2, with the nested address field renamed to address_v2. Core firmware serialization and UI confirmation code are updated to handle the new type/field. The Python trezorlib adds a runtime capability check (HAVE_STELLAR_SDK_PROTOCOL_27) and bumps the stellar-sdk dependency to >=15 on Python 3.10+. Test vectors and generated protobuf bindings are refreshed accordingly. The commit message and comments explicitly frame this as Protocol 27 support and note that the legacy type is deprecated and unsupported.
Changed components
common/protob/messages-stellar.protocore/src/apps/stellar/operations/layout.pycore/src/apps/stellar/operations/serialize.pycore/src/trezor/enums/StellarSorobanCredentialsType.pycore/src/trezor/messages.pypython/src/trezorlib/messages.pypython/src/trezorlib/stellar.pyrust/trezor-client/src/protos/generated/messages_stellar.rspython/pyproject.tomlpyproject.tomluv.lockInspect captured patch +111 / −72
diff --git a/common/protob/messages-stellar.proto b/common/protob/messages-stellar.proto
index 461bd089..8d68748c 100644
--- a/common/protob/messages-stellar.proto
+++ b/common/protob/messages-stellar.proto
@@ -442,16 +442,19 @@ message StellarSorobanAddressCredentials {
}
/**
- * https://github.com/stellar/stellar-xdr/blob/v26.0/Stellar-transaction.x#L578
+ * https://github.com/stellar/stellar-xdr/blob/v27.0/Stellar-transaction.x#L593
* @embed
*/
message StellarSorobanCredentials {
required StellarSorobanCredentialsType type = 1;
- optional StellarSorobanAddressCredentials address = 2;
+ optional StellarSorobanAddressCredentials address_v2 = 2;
enum StellarSorobanCredentialsType {
SOROBAN_CREDENTIALS_SOURCE_ACCOUNT = 0;
- SOROBAN_CREDENTIALS_ADDRESS = 1;
+ // 1 is the legacy SOROBAN_CREDENTIALS_ADDRESS, which is due to be
+ // deprecated in Protocol 28 and is intentionally not supported
+ reserved 1;
+ SOROBAN_CREDENTIALS_ADDRESS_V2 = 2;
};
}
diff --git a/common/tests/fixtures/stellar/sign_tx.json b/common/tests/fixtures/stellar/sign_tx.json
index b45c6cae..fa0b3c14 100644
--- a/common/tests/fixtures/stellar/sign_tx.json
+++ b/common/tests/fixtures/stellar/sign_tx.json
@@ -1425,7 +1425,7 @@
{
"name": "StellarInvokeHostFunction-auth-tree",
"parameters": {
- "xdr": "AAAAAgAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAw7QAAAAAAAAH0QAAAAEAAAAAAAAAAAAAAABw29iAAAAAAAAAAAEAAAAAAAAAGAAAAAAAAAABAwoRGB8mLTQ7QklQV15lbHN6gYiPlp2kq7K5wMfO1dwAAAAGc3VibWl0AAAAAAACAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAAKAAAAAAAAAAAAAAAAAExLQAAAAAMAAAAAAAAAAAAAAAEDChEYHyYtNDtCSVBXXmVsc3qBiI+WnaSrsrnAx87V3AAAAAZzdWJtaXQAAAAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAoAAAAAAAAAAAAAAAAATEtAAAAAAgAAAAAAAAAEAg0YIy45RE9aZXB7hpGcp7K9yNPe6fT/ChUgKzZBTFcAAAAIdHJhbnNmZXIAAAADAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAASAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAACgAAAAAAAAAAAAAAAABMS0AAAAABAAAAAAAAAAMAAAAACQwPEhUYGx4hJCcqLTAzNjk8P0JFSEtOUVRXWl1gY2YAAAAEYnVybgAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAoAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAACoaarsLW6v8QBBgsQFRofJCkuMzg9QkdMUVZbYGVqb3R5foOIjZKXnAAAAAdhcHByb3ZlAAAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAMAAAAHAAAAAAAAAAAAAAAAAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAABHN3YXAAAAACAAAADwAAAAhleGFjdF9pbgAAAAoAAAAAAAAAAAAAAAAAAADIAAAAAQAAAAAAAAAEAg0YIy45RE9aZXB7hpGcp7K9yNPe6fT/ChUgKzZBTFcAAAAFcm91dGUAAAAAAAABAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAAAAAAAAQAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpJ//////////wAB4kAAAAANAAAAQAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAAAAAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAAB2RlcG9zaXQAAAAAAgAAABIAAAAAAAAAAC8iucYvCLd08+vm3W59uTw+wsveAnlWGj2cUiW4wyKSAAAACgAAAAAAAAAAAAAAAAAAA+cAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNQAAAAAA==",
+ "xdr": "AAAAAgAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAw7QAAAAAAAAH0QAAAAEAAAAAAAAAAAAAAABw29iAAAAAAAAAAAEAAAAAAAAAGAAAAAAAAAABAwoRGB8mLTQ7QklQV15lbHN6gYiPlp2kq7K5wMfO1dwAAAAGc3VibWl0AAAAAAACAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAAKAAAAAAAAAAAAAAAAAExLQAAAAAMAAAAAAAAAAAAAAAEDChEYHyYtNDtCSVBXXmVsc3qBiI+WnaSrsrnAx87V3AAAAAZzdWJtaXQAAAAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAoAAAAAAAAAAAAAAAAATEtAAAAAAgAAAAAAAAAEAg0YIy45RE9aZXB7hpGcp7K9yNPe6fT/ChUgKzZBTFcAAAAIdHJhbnNmZXIAAAADAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAASAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAACgAAAAAAAAAAAAAAAABMS0AAAAABAAAAAAAAAAMAAAAACQwPEhUYGx4hJCcqLTAzNjk8P0JFSEtOUVRXWl1gY2YAAAAEYnVybgAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAoAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAACoaarsLW6v8QBBgsQFRofJCkuMzg9QkdMUVZbYGVqb3R5foOIjZKXnAAAAAdhcHByb3ZlAAAAAAIAAAASAAAAAAAAAAAvIrnGLwi3dPPr5t1ufbk8PsLL3gJ5Vho9nFIluMMikgAAAAMAAAAHAAAAAAAAAAAAAAAAAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAABHN3YXAAAAACAAAADwAAAAhleGFjdF9pbgAAAAoAAAAAAAAAAAAAAAAAAADIAAAAAQAAAAAAAAAEAg0YIy45RE9aZXB7hpGcp7K9yNPe6fT/ChUgKzZBTFcAAAAFcm91dGUAAAAAAAABAAAAEgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpIAAAAAAAAAAgAAAAAAAAAALyK5xi8It3Tz6+bdbn25PD7Cy94CeVYaPZxSJbjDIpJ//////////wAB4kAAAAANAAAAQAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAAAAAAAAAQMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXcAAAAB2RlcG9zaXQAAAAAAgAAABIAAAAAAAAAAC8iucYvCLd08+vm3W59uTw+wsveAnlWGj2cUiW4wyKSAAAACgAAAAAAAAAAAAAAAAAAA+cAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNQAAAAAA==",
"address_n": "m/44'/148'/0'",
"network_passphrase": "Test SDF Network ; September 2015",
"tx": {
@@ -1604,8 +1604,8 @@
},
{
"credentials": {
- "type": "SOROBAN_CREDENTIALS_ADDRESS",
- "address": {
+ "type": "SOROBAN_CREDENTIALS_ADDRESS_V2",
+ "address_v2": {
"address": "GAXSFOOGF4ELO5HT5PTN23T5XE6D5QWL3YBHSVQ2HWOFEJNYYMRJENBV",
"nonce": 9223372036854775807,
"signature_expiration_ledger": 123456,
@@ -1648,7 +1648,7 @@
},
"result": {
"public_key": "2f22b9c62f08b774f3ebe6dd6e7db93c3ec2cbde0279561a3d9c5225b8c32292",
- "signature": "/di5nlkauUooBg83iKXOkEWG1X1cQ4/IraU/dIx9a0vviKXMCRORXZm0vV2F9FG+1hKWcY3qCFDzdGKahzVWAA=="
+ "signature": "HEKTfULTbT06zn289ZG/Jh/zNB0UKGbPfBInkUdqpx9r+YdK4CVH2FnTdGi1f1UCigm233z0237rbyroX6CGAA=="
},
"skip_models": ["t1b1"]
},
diff --git a/core/src/apps/stellar/operations/layout.py b/core/src/apps/stellar/operations/layout.py
index f9b87a5e..a41f5100 100644
--- a/core/src/apps/stellar/operations/layout.py
+++ b/core/src/apps/stellar/operations/layout.py
@@ -518,13 +518,11 @@ async def confirm_invoke_host_function_op(op: StellarInvokeHostFunctionOp) -> No
# produces over the transaction envelope. Approving that signature approves
# these entries, so we must always show them for confirmation.
#
- # - ADDRESS credentials are authorized by a separate signature over the
- # ENVELOPE_TYPE_SOROBAN_AUTHORIZATION preimage, which this device does not
+ # - ADDRESS_V2 credentials are authorized by a separate signature over the
+ # ENVELOPE_TYPE_SOROBAN_AUTHORIZATION_WITH_ADDRESS preimage, which this device does not
# produce. They are hidden behind an opt-in and only shown for information;
# the user does not need to review them to sign safely.
- # NOTE: signing ADDRESS credentials for our own account may be added later.
-
shown = 0
non_src_entries = []
@@ -560,13 +558,13 @@ async def _confirm_auth_entry(
creds = auth.credentials
- if creds.type == StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS:
- if creds.address is None:
- raise DataError("Stellar: missing address credentials")
+ if creds.type == StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS_V2:
+ if creds.address_v2 is None:
+ raise DataError("Stellar: missing address_v2 credentials")
await confirm_address(
f"{TR.words__authorization} {position}",
- creds.address.address,
+ creds.address_v2.address,
description=TR.words__address,
br_name="op_auth_entry_address",
)
diff --git a/core/src/apps/stellar/operations/serialize.py b/core/src/apps/stellar/operations/serialize.py
index da4002e5..9b3ec81a 100644
--- a/core/src/apps/stellar/operations/serialize.py
+++ b/core/src/apps/stellar/operations/serialize.py
@@ -453,10 +453,10 @@ def _write_soroban_credentials(w: Writer, msg: StellarSorobanCredentials) -> Non
write_uint32(w, msg.type)
if msg.type == StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_SOURCE_ACCOUNT:
pass # void
- elif msg.type == StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS:
- if msg.address is None:
+ elif msg.type == StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS_V2:
+ if msg.address_v2 is None:
raise DataError("Stellar: missing address credentials")
- _write_soroban_address_credentials(w, msg.address)
+ _write_soroban_address_credentials(w, msg.address_v2)
else:
raise ProcessError("Stellar: unsupported credentials type")
diff --git a/core/src/trezor/enums/StellarSorobanCredentialsType.py b/core/src/trezor/enums/StellarSorobanCredentialsType.py
index fa2a1ac9..97ec808e 100644
--- a/core/src/trezor/enums/StellarSorobanCredentialsType.py
+++ b/core/src/trezor/enums/StellarSorobanCredentialsType.py
@@ -3,4 +3,4 @@
# isort:skip_file
SOROBAN_CREDENTIALS_SOURCE_ACCOUNT = 0
-SOROBAN_CREDENTIALS_ADDRESS = 1
+SOROBAN_CREDENTIALS_ADDRESS_V2 = 2
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index d7ad02de..689d50b1 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -414,7 +414,7 @@ if TYPE_CHECKING:
class StellarSorobanCredentialsType(IntEnum):
SOROBAN_CREDENTIALS_SOURCE_ACCOUNT = 0
- SOROBAN_CREDENTIALS_ADDRESS = 1
+ SOROBAN_CREDENTIALS_ADDRESS_V2 = 2
class TezosContractType(IntEnum):
Implicit = 0
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 9f2a32bd..543ded65 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -6738,13 +6738,13 @@ if TYPE_CHECKING:
class StellarSorobanCredentials(protobuf.MessageType):
type: "StellarSorobanCredentialsType"
- address: "StellarSorobanAddressCredentials | None"
+ address_v2: "StellarSorobanAddressCredentials | None"
def __init__(
self,
*,
type: "StellarSorobanCredentialsType",
- address: "StellarSorobanAddressCredentials | None" = None,
+ address_v2: "StellarSorobanAddressCredentials | None" = None,
) -> None:
pass
diff --git a/pyproject.toml b/pyproject.toml
index 4281fcdc..e624680d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -73,6 +73,10 @@ dev = [
[tool.uv]
package = false
exclude-newer = "30 days"
+# Exempt stellar-sdk from the 30-day rule so the freshly released 15.0.0
+# final (needed for Protocol 27 support, see python/pyproject.toml) can be
+# resolved in the workspace lockfile.
+exclude-newer-package = { stellar-sdk = "3000-01-01" }
[tool.uv.sources]
trezor = { path = "./python", editable = true }
diff --git a/python/pyproject.toml b/python/pyproject.toml
index fd722100..539ea992 100644
--- a/python/pyproject.toml
+++ b/python/pyproject.toml
@@ -40,14 +40,23 @@ hidapi = ["hidapi>=0.7.99.post20"]
ethereum = ["web3>=5"]
qt-widgets = ["PyQt5"]
extra = ["Pillow>=10"]
-stellar = ["stellar-sdk>=13"]
+stellar = [
+ "stellar-sdk>=13; python_version < '3.10'",
+ # Protocol 27 support (SOROBAN_CREDENTIALS_ADDRESS_V2 etc.) requires
+ # stellar-sdk 15, which dropped Python 3.9. stellar-sdk is exempted from
+ # the `exclude-newer = "30 days"` uv policy below (see
+ # `exclude-newer-package`) so the 15.0.0 final can be used right away.
+ "stellar-sdk>=15; python_version >= '3.10'",
+]
ble = ["bleak>=1.1.0"]
full = [
"hidapi>=0.7.99.post20",
"web3>=5",
"PyQt5",
"Pillow>=10",
- "stellar-sdk>=13",
+ "stellar-sdk>=13; python_version < '3.10'",
+ # stellar-sdk>=15 floor: see the stellar extra above
+ "stellar-sdk>=15; python_version >= '3.10'",
"bleak>=1.1.0",
]
@@ -66,6 +75,10 @@ build-backend = "flit_core.buildapi"
[tool.uv]
package = true
exclude-newer = "30 days"
+# Exempt stellar-sdk from the 30-day rule so the freshly released 15.0.0
+# final (needed for Protocol 27 support) can be resolved.
+# TODO: remove after 2026-08-04
+exclude-newer-package = { stellar-sdk = "2026-07-05" }
[tool.flit.module]
name = "trezorlib"
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 4c6a2a59..4e6c743d 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -471,7 +471,7 @@ class StellarHostFunctionType(IntEnum):
class StellarSorobanCredentialsType(IntEnum):
SOROBAN_CREDENTIALS_SOURCE_ACCOUNT = 0
- SOROBAN_CREDENTIALS_ADDRESS = 1
+ SOROBAN_CREDENTIALS_ADDRESS_V2 = 2
class TezosContractType(IntEnum):
@@ -8649,17 +8649,17 @@ class StellarSorobanCredentials(protobuf.MessageType):
MESSAGE_WIRE_TYPE = None
FIELDS = {
1: protobuf.Field("type", "StellarSorobanCredentialsType", repeated=False, required=True),
- 2: protobuf.Field("address", "StellarSorobanAddressCredentials", repeated=False, required=False, default=None),
+ 2: protobuf.Field("address_v2", "StellarSorobanAddressCredentials", repeated=False, required=False, default=None),
}
def __init__(
self,
*,
type: "StellarSorobanCredentialsType",
- address: Optional["StellarSorobanAddressCredentials"] = None,
+ address_v2: Optional["StellarSorobanAddressCredentials"] = None,
) -> None:
self.type = type
- self.address = address
+ self.address_v2 = address_v2
class StellarSorobanAuthorizationEntry(protobuf.MessageType):
diff --git a/python/src/trezorlib/stellar.py b/python/src/trezorlib/stellar.py
index 64fb0119..1701cf56 100644
--- a/python/src/trezorlib/stellar.py
+++ b/python/src/trezorlib/stellar.py
@@ -77,10 +77,17 @@ try:
)
HAVE_STELLAR_SDK = True
+ # Protocol 27 XDR (SOROBAN_CREDENTIALS_ADDRESS_V2 etc.) is only available
+ # in stellar-sdk >= 15; on Python 3.9 the `stellar` extra installs
+ # stellar-sdk 13 (see pyproject.toml), which lacks it.
+ HAVE_STELLAR_SDK_PROTOCOL_27 = hasattr(
+ xdr.SorobanCredentialsType, "SOROBAN_CREDENTIALS_ADDRESS_V2"
+ )
DEFAULT_NETWORK_PASSPHRASE = Network.PUBLIC_NETWORK_PASSPHRASE
except ImportError:
HAVE_STELLAR_SDK = False
+ HAVE_STELLAR_SDK_PROTOCOL_27 = False
DEFAULT_NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015"
DEFAULT_BIP32_PATH = "m/44h/148h/0h"
@@ -576,12 +583,18 @@ def _read_credentials(
return messages.StellarSorobanCredentials(
type=messages.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_SOURCE_ACCOUNT
)
- elif credentials.type == xdr.SorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS:
+ elif (
+ HAVE_STELLAR_SDK_PROTOCOL_27
+ and credentials.type
+ == xdr.SorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS_V2
+ ):
return messages.StellarSorobanCredentials(
- type=messages.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS,
- address=_read_address_credentials(credentials.address),
+ type=messages.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS_V2,
+ address_v2=_read_address_credentials(credentials.address_v2),
)
else:
+ # The legacy, to-be-deprecated SOROBAN_CREDENTIALS_ADDRESS is
+ # intentionally not supported.
raise ValueError(f"Unsupported SorobanCredentials type: {credentials.type}")
diff --git a/rust/trezor-client/src/protos/generated/messages_stellar.rs b/rust/trezor-client/src/protos/generated/messages_stellar.rs
index 57757839..3a1fe05d 100644
--- a/rust/trezor-client/src/protos/generated/messages_stellar.rs
+++ b/rust/trezor-client/src/protos/generated/messages_stellar.rs
@@ -9384,8 +9384,8 @@ pub struct StellarSorobanCredentials {
// message fields
// @@protoc_insertion_point(field:hw.trezor.messages.stellar.StellarSorobanCredentials.type)
pub type_: ::std::option::Option<::protobuf::EnumOrUnknown<stellar_soroban_credentials::StellarSorobanCredentialsType>>,
- // @@protoc_insertion_point(field:hw.trezor.messages.stellar.StellarSorobanCredentials.address)
- pub address: ::protobuf::MessageField<StellarSorobanAddressCredentials>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.stellar.StellarSorobanCredentials.address_v2)
+ pub address_v2: ::protobuf::MessageField<StellarSorobanAddressCredentials>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.stellar.StellarSorobanCredentials.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -9433,9 +9433,9 @@ impl StellarSorobanCredentials {
|m: &mut StellarSorobanCredentials| { &mut m.type_ },
));
fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, StellarSorobanAddressCredentials>(
- "address",
- |m: &StellarSorobanCredentials| { &m.address },
- |m: &mut StellarSorobanCredentials| { &mut m.address },
+ "address_v2",
+ |m: &StellarSorobanCredentials| { &m.address_v2 },
+ |m: &mut StellarSorobanCredentials| { &mut m.address_v2 },
));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<StellarSorobanCredentials>(
"StellarSorobanCredentials",
@@ -9452,7 +9452,7 @@ impl ::protobuf::Message for StellarSorobanCredentials {
if self.type_.is_none() {
return false;
}
- for v in &self.address {
+ for v in &self.address_v2 {
if !v.is_initialized() {
return false;
}
@@ -9467,7 +9467,7 @@ impl ::protobuf::Message for StellarSorobanCredentials {
self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
},
18 => {
- ::protobuf::rt::read_singular_message_into_field(is, &mut self.address)?;
+ ::protobuf::rt::read_singular_message_into_field(is, &mut self.address_v2)?;
},
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
@@ -9484,7 +9484,7 @@ impl ::protobuf::Message for StellarSorobanCredentials {
if let Some(v) = self.type_ {
my_size += ::protobuf::rt::int32_size(1, v.value());
}
- if let Some(v) = self.address.as_ref() {
+ if let Some(v) = self.address_v2.as_ref() {
let len = v.compute_size();
my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
}
@@ -9497,7 +9497,7 @@ impl ::protobuf::Message for StellarSorobanCredentials {
if let Some(v) = self.type_ {
os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
}
- if let Some(v) = self.address.as_ref() {
+ if let Some(v) = self.address_v2.as_ref() {
::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;
}
os.write_unknown_fields(self.special_fields.unknown_fields())?;
@@ -9518,14 +9518,14 @@ impl ::protobuf::Message for StellarSorobanCredentials {
fn clear(&mut self) {
self.type_ = ::std::option::Option::None;
- self.address.clear();
+ self.address_v2.clear();
self.special_fields.clear();
}
fn default_instance() -> &'static StellarSorobanCredentials {
static instance: StellarSorobanCredentials = StellarSorobanCredentials {
type_: ::std::option::Option::None,
- address: ::protobuf::MessageField::none(),
+ address_v2: ::protobuf::MessageField::none(),
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -9556,8 +9556,8 @@ pub mod stellar_soroban_credentials {
pub enum StellarSorobanCredentialsType {
// @@protoc_insertion_point(enum_value:hw.trezor.messages.stellar.StellarSorobanCredentials.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_SOURCE_ACCOUNT)
SOROBAN_CREDENTIALS_SOURCE_ACCOUNT = 0,
- // @@protoc_insertion_point(enum_value:hw.trezor.messages.stellar.StellarSorobanCredentials.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS)
- SOROBAN_CREDENTIALS_ADDRESS = 1,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.stellar.StellarSorobanCredentials.StellarSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS_V2)
+ SOROBAN_CREDENTIALS_ADDRESS_V2 = 2,
}
impl ::protobuf::Enum for StellarSorobanCredentialsType {
@@ -9570,7 +9570,7 @@ pub mod stellar_soroban_credentials {
fn from_i32(value: i32) -> ::std::option::Option<StellarSorobanCredentialsType> {
match value {
0 => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_SOURCE_ACCOUNT),
- 1 => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS),
+ 2 => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS_V2),
_ => ::std::option::Option::None
}
}
@@ -9578,14 +9578,14 @@ pub mod stellar_soroban_credentials {
fn from_str(str: &str) -> ::std::option::Option<StellarSorobanCredentialsType> {
match str {
"SOROBAN_CREDENTIALS_SOURCE_ACCOUNT" => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_SOURCE_ACCOUNT),
- "SOROBAN_CREDENTIALS_ADDRESS" => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS),
+ "SOROBAN_CREDENTIALS_ADDRESS_V2" => ::std::option::Option::Some(StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS_V2),
_ => ::std::option::Option::None
}
}
const VALUES: &'static [StellarSorobanCredentialsType] = &[
StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_SOURCE_ACCOUNT,
- StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS,
+ StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS_V2,
];
}
@@ -9596,7 +9596,10 @@ pub mod stellar_soroban_credentials {
}
fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {
- let index = *self as usize;
+ let index = match self {
+ StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_SOURCE_ACCOUNT => 0,
+ StellarSorobanCredentialsType::SOROBAN_CREDENTIALS_ADDRESS_V2 => 1,
+ };
Self::enum_descriptor().value_by_index(index)
}
}
@@ -10515,26 +10518,26 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x02(\tR\x07address\x12\x14\n\x05nonce\x18\x02\x20\x02(\x12R\x05nonce\
\x12>\n\x1bsignature_expiration_ledger\x18\x03\x20\x02(\rR\x19signatureE\
xpirationLedger\x12F\n\tsignature\x18\x04\x20\x02(\x0b2(.hw.trezor.messa\
- ges.stellar.StellarSCValR\tsignature\"\xc6\x02\n\x19StellarSorobanCreden\
+ ges.stellar.StellarSCValR\tsignature\"\xd4\x02\n\x19StellarSorobanCreden\
tials\x12g\n\x04type\x18\x01\x20\x02(\x0e2S.hw.trezor.messages.stellar.S\
- tellarSorobanCredentials.StellarSorobanCredentialsTypeR\x04type\x12V\n\
- \x07address\x18\x02\x20\x01(\x0b2<.hw.trezor.messages.stellar.StellarSor\
- obanAddressCredentialsR\x07address\"h\n\x1dStellarSorobanCredentialsType\
- \x12&\n\"SOROBAN_CREDENTIALS_SOURCE_ACCOUNT\x10\0\x12\x1f\n\x1bSOROBAN_C\
- REDENTIALS_ADDRESS\x10\x01\"\xe4\x01\n\x20StellarSorobanAuthorizationEnt\
- ry\x12W\n\x0bcredentials\x18\x01\x20\x02(\x0b25.hw.trezor.messages.stell\
- ar.StellarSorobanCredentialsR\x0bcredentials\x12g\n\x0froot_invocation\
- \x18\x02\x20\x02(\x0b2>.hw.trezor.messages.stellar.StellarSorobanAuthori\
- zedInvocationR\x0erootInvocation\"\xe3\x01\n\x1bStellarInvokeHostFunctio\
- nOp\x12%\n\x0esource_account\x18\x01\x20\x01(\tR\rsourceAccount\x12K\n\
- \x08function\x18\x02\x20\x02(\x0b2/.hw.trezor.messages.stellar.StellarHo\
- stFunctionR\x08function\x12P\n\x04auth\x18\x03\x20\x03(\x0b2<.hw.trezor.\
- messages.stellar.StellarSorobanAuthorizationEntryR\x04auth\"\x15\n\x13St\
- ellarTxExtRequest\"?\n\x0cStellarTxExt\x12\x0c\n\x01v\x18\x01\x20\x02(\
- \x11R\x01v\x12!\n\x0csoroban_data\x18\x02\x20\x01(\x0cR\x0bsorobanData*=\
- \n\x10StellarAssetType\x12\n\n\x06NATIVE\x10\0\x12\r\n\tALPHANUM4\x10\
- \x01\x12\x0e\n\nALPHANUM12\x10\x02B;\n#com.satoshilabs.trezor.lib.protob\
- ufB\x14TrezorMessageStellar\
+ tellarSorobanCredentials.StellarSorobanCredentialsTypeR\x04type\x12[\n\n\
+ address_v2\x18\x02\x20\x01(\x0b2<.hw.trezor.messages.stellar.StellarSoro\
+ banAddressCredentialsR\taddressV2\"q\n\x1dStellarSorobanCredentialsType\
+ \x12&\n\"SOROBAN_CREDENTIALS_SOURCE_ACCOUNT\x10\0\x12\"\n\x1eSOROBAN_CRE\
+ DENTIALS_ADDRESS_V2\x10\x02\"\x04\x08\x01\x10\x01\"\xe4\x01\n\x20Stellar\
+ SorobanAuthorizationEntry\x12W\n\x0bcredentials\x18\x01\x20\x02(\x0b25.h\
+ w.trezor.messages.stellar.StellarSorobanCredentialsR\x0bcredentials\x12g\
+ \n\x0froot_invocation\x18\x02\x20\x02(\x0b2>.hw.trezor.messages.stellar.\
+ StellarSorobanAuthorizedInvocationR\x0erootInvocation\"\xe3\x01\n\x1bSte\
+ llarInvokeHostFunctionOp\x12%\n\x0esource_account\x18\x01\x20\x01(\tR\rs\
+ ourceAccount\x12K\n\x08function\x18\x02\x20\x02(\x0b2/.hw.trezor.message\
+ s.stellar.StellarHostFunctionR\x08function\x12P\n\x04auth\x18\x03\x20\
+ \x03(\x0b2<.hw.trezor.messages.stellar.StellarSorobanAuthorizationEntryR\
+ \x04auth\"\x15\n\x13StellarTxExtRequest\"?\n\x0cStellarTxExt\x12\x0c\n\
+ \x01v\x18\x01\x20\x02(\x11R\x01v\x12!\n\x0csoroban_data\x18\x02\x20\x01(\
+ \x0cR\x0bsorobanData*=\n\x10StellarAssetType\x12\n\n\x06NATIVE\x10\0\x12\
+ \r\n\tALPHANUM4\x10\x01\x12\x0e\n\nALPHANUM12\x10\x02B;\n#com.satoshilab\
+ s.trezor.lib.protobufB\x14TrezorMessageStellar\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/uv.lock b/uv.lock
index d0c09510..034b4c40 100644
--- a/uv.lock
+++ b/uv.lock
@@ -9,9 +9,12 @@ resolution-markers = [
]
[options]
-exclude-newer = "2026-06-23T14:29:15.012809185Z"
+exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values.
exclude-newer-span = "P30D"
+[options.exclude-newer-package]
+stellar-sdk = "3000-01-01T23:00:00Z"
+
[[package]]
name = "astroid"
version = "3.3.11"
@@ -698,7 +701,7 @@ name = "exceptiongroup"
version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
wheels = [
@@ -826,7 +829,7 @@ name = "importlib-metadata"
version = "8.7.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "zipp", marker = "python_full_version < '3.12'" },
+ { name = "zipp" },
]
sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" }
wheels = [
@@ -2122,8 +2125,10 @@ requires-dist = [
{ name = "requests", specifier = ">=2.4.0" },
{ name = "shamir-mnemonic", specifier = ">=0.3.0" },
{ name = "slip10", specifier = ">=1.0.1" },
- { name = "stellar-sdk", marker = "extra == 'full'", specifier = ">=13" },
- { name = "stellar-sdk", marker = "extra == 'stellar'", specifier = ">=13" },
+ { name = "stellar-sdk", marker = "python_full_version >= '3.10' and extra == 'full'", specifier = ">=15" },
+ { name = "stellar-sdk", marker = "python_full_version >= '3.10' and extra == 'stellar'", specifier = ">=15" },
+ { name = "stellar-sdk", marker = "python_full_version < '3.10' and extra == 'full'", specifier = ">=13" },
+ { name = "stellar-sdk", marker = "python_full_version < '3.10' and extra == 'stellar'", specifier = ">=13" },
{ name = "typing-extensions", specifier = ">=4.7.1" },
{ name = "web3", marker = "extra == 'ethereum'", specifier = ">=5" },
{ name = "web3", marker = "extra == 'full'", specifier = ">=5" },
Why this scored 29/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.