feat(clear_signing): adding some more simple types.
What changed, and why it matters
This commit adds support for more Ethereum data types in Trezor's clear signing feature. It introduces parsing for signed 160-bit integers (int160) and fixed-size byte arrays of various lengths (bytes4, bytes8, bytes16, bytes20, bytes32). The code also refactors existing parsers to use shared factory functions. The changes are primarily feature additions with built-in validation checks, and there is no direct evidence in the commit of a security vulnerability or fix.
No immediate security action required. Treat as routine feature expansion. If auditing, verify that make_int_parser and make_fixed_bytes_parser correctly reject all malformed ABI-encoded inputs, particularly around sign-extension bits for intN types and right-padding for bytesN types.
Security signals we found
New parser factory functions include explicit bounds and padding validation
Signed integer parser checks two's complement sign-extension padding
Fixed-bytes parser validates trailing zero padding per Solidity ABI spec
No changelog entry and commit is framed as a feature addition
No vendor disclosure, CVE, or researcher attribution present in commit materials
Evidence from the diff
The commit extends the Ethereum clear signing parser to support ABI_INT160 and ABI_BYTES20 enum values across protobuf definitions, Python enums, and generated Rust/Python bindings. It replaces hardcoded uintN parsers with make_uint_parser(), adds make_fixed_bytes_parser() for bytesN types with right-padding validation, and adds make_int_parser() for signed integer types with two’s complement decoding and range/sign-extension checks. Tests are added for bytesN parsing, int160 parsing, and int256 edge cases. The changes are defensive in nature, adding input validation rather than removing it.
Changed components
common/protob/messages-definitions.protocore/src/apps/ethereum/clear_signing.pycore/src/apps/ethereum/clear_signing_definitions.pycore/src/trezor/enums/EthereumABIType.pycore/src/trezor/enums/__init__.pycore/tests/test_apps.ethereum.clear_signing.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_definitions.rsInspect captured patch +181 / −57
diff --git a/common/protob/messages-definitions.proto b/common/protob/messages-definitions.proto
index c1410490..d9d81366 100644
--- a/common/protob/messages-definitions.proto
+++ b/common/protob/messages-definitions.proto
@@ -92,10 +92,12 @@ enum EthereumABIType {
ABI_UINT16 = 14;
ABI_UINT8 = 15;
ABI_BOOL = 16;
+ ABI_INT160 = 17;
ABI_BYTES32 = 20;
ABI_BYTES16 = 21;
ABI_BYTES8 = 22;
ABI_BYTES4 = 23;
+ ABI_BYTES20 = 24;
// dynamic types
ABI_BYTES = 30;
diff --git a/core/src/apps/ethereum/clear_signing.py b/core/src/apps/ethereum/clear_signing.py
index ab30d18d..171ff166 100644
--- a/core/src/apps/ethereum/clear_signing.py
+++ b/core/src/apps/ethereum/clear_signing.py
@@ -49,6 +49,7 @@ if TYPE_CHECKING:
SC_FUNC_SIG_BYTES = const(4)
_EVM_WORD_SIZE = const(32) # in bytes
+_EVM_WORD_BITS = const(8 * _EVM_WORD_SIZE)
class ClearSigningFailed(Exception):
@@ -108,13 +109,13 @@ def parse_address(raw_data: memoryview) -> Value:
return bytes(raw_data[_EVM_WORD_SIZE - _ZERO_PADDING :])
-def parse_uint256(raw_data: memoryview) -> Value:
+def parse_uint256(raw_data: memoryview) -> int:
if len(raw_data) < _EVM_WORD_SIZE:
raise OutOfBounds
return int.from_bytes(raw_data, "big")
-def _make_uint_parser(bit_width: int) -> "Parser":
+def make_uint_parser(bit_width: int) -> "Parser":
byte_width = bit_width // 8
def parser(raw_data: memoryview) -> Value:
@@ -126,26 +127,39 @@ def _make_uint_parser(bit_width: int) -> "Parser":
return parser
-parse_uint248 = _make_uint_parser(248)
-parse_uint160 = _make_uint_parser(160)
-parse_uint128 = _make_uint_parser(128)
-parse_uint120 = _make_uint_parser(120)
-parse_uint112 = _make_uint_parser(112)
-parse_uint96 = _make_uint_parser(96)
-parse_uint72 = _make_uint_parser(72)
-parse_uint64 = _make_uint_parser(64)
-parse_uint48 = _make_uint_parser(48)
-parse_uint40 = _make_uint_parser(40)
-parse_uint32 = _make_uint_parser(32)
-parse_uint24 = _make_uint_parser(24)
-parse_uint16 = _make_uint_parser(16)
-parse_uint8 = _make_uint_parser(8)
+def make_fixed_bytes_parser(byte_width: int) -> "Parser":
+ """bytesN values are left-aligned in the word: the padding to check
+ for zeroes is on the right, unlike the numeric types.
+ See "bytes<M>: enc(X) is the sequence of bytes in X padded with
+ trailing zero-bytes to a length of 32 bytes" in
+ https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding
+ """
+ def parser(raw_data: memoryview) -> Value:
+ if len(raw_data) < _EVM_WORD_SIZE:
+ raise OutOfBounds
+ if any(raw_data[byte_width:_EVM_WORD_SIZE]):
+ raise ValueOverflow
+ return bytes(raw_data[:byte_width])
-def parse_bytes32(raw_data: memoryview) -> Value:
- if len(raw_data) < _EVM_WORD_SIZE:
- raise OutOfBounds
- return bytes(raw_data[:_EVM_WORD_SIZE])
+ return parser
+
+
+def make_int_parser(bit_width: int) -> Parser:
+ if not 0 < bit_width <= _EVM_WORD_BITS:
+ raise InvalidFormatDefinition
+
+ def parser(raw_data: memoryview) -> Value:
+ value = parse_uint256(raw_data)
+ # Two's complement.
+ if value >= 1 << (_EVM_WORD_BITS - 1):
+ value -= 1 << _EVM_WORD_BITS
+ # the range check doubles as the sign-extension padding check
+ if not -(1 << (bit_width - 1)) <= value < 1 << (bit_width - 1):
+ raise ValueOverflow
+ return value
+
+ return parser
def parse_bool(raw_data: memoryview) -> Value:
@@ -186,37 +200,47 @@ def _get_parser(t: int, is_dynamic: bool) -> Parser:
elif t == T.ABI_UINT256:
return parse_uint256
elif t == T.ABI_UINT248:
- return parse_uint248
+ return make_uint_parser(248)
elif t == T.ABI_UINT160:
- return parse_uint160
+ return make_uint_parser(160)
elif t == T.ABI_UINT128:
- return parse_uint128
+ return make_uint_parser(128)
elif t == T.ABI_UINT120:
- return parse_uint120
+ return make_uint_parser(120)
elif t == T.ABI_UINT112:
- return parse_uint112
+ return make_uint_parser(112)
elif t == T.ABI_UINT96:
- return parse_uint96
+ return make_uint_parser(96)
elif t == T.ABI_UINT72:
- return parse_uint72
+ return make_uint_parser(72)
elif t == T.ABI_UINT64:
- return parse_uint64
+ return make_uint_parser(64)
elif t == T.ABI_UINT48:
- return parse_uint48
+ return make_uint_parser(48)
elif t == T.ABI_UINT40:
- return parse_uint40
+ return make_uint_parser(40)
elif t == T.ABI_UINT32:
- return parse_uint32
+ return make_uint_parser(32)
elif t == T.ABI_UINT24:
- return parse_uint24
+ return make_uint_parser(24)
elif t == T.ABI_UINT16:
- return parse_uint16
+ return make_uint_parser(16)
elif t == T.ABI_UINT8:
- return parse_uint8
+ return make_uint_parser(8)
elif t == T.ABI_BOOL:
return parse_bool
+ elif t == T.ABI_INT160:
+ return make_int_parser(160)
elif t == T.ABI_BYTES32:
- return parse_bytes32
+ return make_fixed_bytes_parser(32)
+ elif t == T.ABI_BYTES20:
+ return make_fixed_bytes_parser(20)
+ elif t == T.ABI_BYTES16:
+ return make_fixed_bytes_parser(16)
+ elif t == T.ABI_BYTES8:
+ return make_fixed_bytes_parser(8)
+ elif t == T.ABI_BYTES4:
+ return make_fixed_bytes_parser(4)
raise InvalidFormatDefinition
diff --git a/core/src/apps/ethereum/clear_signing_definitions.py b/core/src/apps/ethereum/clear_signing_definitions.py
index 6cbcbfc1..2b994105 100644
--- a/core/src/apps/ethereum/clear_signing_definitions.py
+++ b/core/src/apps/ethereum/clear_signing_definitions.py
@@ -64,14 +64,17 @@ def all_display_formats() -> Generator[DisplayFormat, None, None]:
RawFormatter,
Tuple,
UnitFormatter,
+ make_fixed_bytes_parser,
+ make_uint_parser,
parse_bool,
parse_bytes,
- parse_bytes32,
parse_string,
- parse_uint24,
- parse_uint160,
)
+ parse_bytes32 = make_fixed_bytes_parser(32)
+ parse_uint24 = make_uint_parser(24)
+ parse_uint160 = make_uint_parser(160)
+
yield APPROVE_DISPLAY_FORMAT
yield TRANSFER_DISPLAY_FORMAT
diff --git a/core/src/trezor/enums/EthereumABIType.py b/core/src/trezor/enums/EthereumABIType.py
index 8946b6d4..9f14c86f 100644
--- a/core/src/trezor/enums/EthereumABIType.py
+++ b/core/src/trezor/enums/EthereumABIType.py
@@ -19,9 +19,11 @@ ABI_UINT24 = 13
ABI_UINT16 = 14
ABI_UINT8 = 15
ABI_BOOL = 16
+ABI_INT160 = 17
ABI_BYTES32 = 20
ABI_BYTES16 = 21
ABI_BYTES8 = 22
ABI_BYTES4 = 23
+ABI_BYTES20 = 24
ABI_BYTES = 30
ABI_STRING = 31
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 32206bd9..d7ad02de 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -315,10 +315,12 @@ if TYPE_CHECKING:
ABI_UINT16 = 14
ABI_UINT8 = 15
ABI_BOOL = 16
+ ABI_INT160 = 17
ABI_BYTES32 = 20
ABI_BYTES16 = 21
ABI_BYTES8 = 22
ABI_BYTES4 = 23
+ ABI_BYTES20 = 24
ABI_BYTES = 30
ABI_STRING = 31
diff --git a/core/tests/test_apps.ethereum.clear_signing.py b/core/tests/test_apps.ethereum.clear_signing.py
index 0f7208c8..964598be 100644
--- a/core/tests/test_apps.ethereum.clear_signing.py
+++ b/core/tests/test_apps.ethereum.clear_signing.py
@@ -24,15 +24,24 @@ if not utils.BITCOIN_ONLY:
Tuple,
ValueOverflow,
_format_field_value,
+ make_fixed_bytes_parser,
+ make_int_parser,
+ make_uint_parser,
parse_address,
parse_bool,
- parse_bytes32,
parse_string,
- parse_uint24,
- parse_uint160,
parse_uint256,
)
+ parse_bytes4 = make_fixed_bytes_parser(4)
+ parse_bytes8 = make_fixed_bytes_parser(8)
+ parse_bytes16 = make_fixed_bytes_parser(16)
+ parse_bytes20 = make_fixed_bytes_parser(20)
+ parse_bytes32 = make_fixed_bytes_parser(32)
+ parse_int160 = make_int_parser(160)
+ parse_uint24 = make_uint_parser(24)
+ parse_uint160 = make_uint_parser(160)
+
# We use these to pad bytes we are trying to parse left and right
# so that we don't always start parsing from offset 0 which is a special case
FIVE_RANDOM_BYTES = b"\x1a\xf2\x03\x99\x10"
@@ -396,6 +405,73 @@ class TestEthereumClearSigning(unittest.TestCase):
with self.assertRaises(OutOfBounds):
atomic_bytes32.parse(memoryview(b"\x00" * 20), 0)
+ def test_fixed_bytes_parsing(self):
+ # bytesN is left-aligned in the word: value first, zero padding after
+ for parser, width in (
+ (parse_bytes4, 4),
+ (parse_bytes8, 8),
+ (parse_bytes16, 16),
+ (parse_bytes20, 20),
+ ):
+ atomic = Atomic(parser)
+
+ value = bytes(range(1, width + 1))
+ word = value + b"\x00" * (32 - width)
+ data = memoryview(FIVE_RANDOM_BYTES + word + SEVEN_RANDOM_BYTES)
+ parsed, consumed = atomic.parse(data, len(FIVE_RANDOM_BYTES))
+ self.assertEqual(parsed, value)
+ self.assertEqual(consumed, 32)
+
+ # dirty right padding (a stray bit just past the value)
+ dirty_word = value + b"\x01" + b"\x00" * (32 - width - 1)
+ dirty_data = memoryview(FIVE_RANDOM_BYTES + dirty_word + SEVEN_RANDOM_BYTES)
+ with self.assertRaises(ValueOverflow):
+ atomic.parse(dirty_data, len(FIVE_RANDOM_BYTES))
+
+ with self.assertRaises(OutOfBounds):
+ atomic.parse(memoryview(b"\x00" * 20), 0)
+
+ def test_int160_parsing(self):
+ atomic_int160 = Atomic(parse_int160)
+
+ def signed_word(v: int) -> bytes:
+ return (v & ((1 << 256) - 1)).to_bytes(32, "big")
+
+ for val in (0, 1, -1, 2**159 - 1, -(2**159), -123456789):
+ data = memoryview(SEVEN_RANDOM_BYTES + signed_word(val) + FIVE_RANDOM_BYTES)
+ parsed, consumed = atomic_int160.parse(data, len(SEVEN_RANDOM_BYTES))
+ self.assertEqual(parsed, val)
+ self.assertEqual(consumed, 32)
+
+ # out of int160 range (both directions), including a value with
+ # dirty sign-extension bits
+ for invalid in (2**159, -(2**159) - 1, 2**200):
+ invalid_data = memoryview(
+ SEVEN_RANDOM_BYTES + signed_word(invalid) + FIVE_RANDOM_BYTES
+ )
+ with self.assertRaises(ValueOverflow):
+ atomic_int160.parse(invalid_data, len(SEVEN_RANDOM_BYTES))
+
+ with self.assertRaises(OutOfBounds):
+ atomic_int160.parse(memoryview(b"\x00" * 20), 0)
+
+ def test_int256_parsing(self):
+ # int256 is the full word width, so every bit pattern is in range
+ # (no sign-extension padding to check).
+ atomic_int256 = Atomic(make_int_parser(256))
+
+ def signed_word(v: int) -> bytes:
+ return (v & ((1 << 256) - 1)).to_bytes(32, "big")
+
+ for val in (0, 1, -1, 2**255 - 1, -(2**255), -123456789):
+ data = memoryview(SEVEN_RANDOM_BYTES + signed_word(val) + FIVE_RANDOM_BYTES)
+ parsed, consumed = atomic_int256.parse(data, len(SEVEN_RANDOM_BYTES))
+ self.assertEqual(parsed, val)
+ self.assertEqual(consumed, 32)
+
+ with self.assertRaises(OutOfBounds):
+ atomic_int256.parse(memoryview(b"\x00" * 20), 0)
+
def test_array_of_arrays_of_bytes32(self):
# bytes32[][] = [[b0, b1], [b2]]
nested_array_parser = Array(Array(Atomic(parse_bytes32)))
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index fe940ab4..e8a5a208 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -357,10 +357,12 @@ class EthereumABIType(IntEnum):
ABI_UINT16 = 14
ABI_UINT8 = 15
ABI_BOOL = 16
+ ABI_INT160 = 17
ABI_BYTES32 = 20
ABI_BYTES16 = 21
ABI_BYTES8 = 22
ABI_BYTES4 = 23
+ ABI_BYTES20 = 24
ABI_BYTES = 30
ABI_STRING = 31
diff --git a/rust/trezor-client/src/protos/generated/messages_definitions.rs b/rust/trezor-client/src/protos/generated/messages_definitions.rs
index dd754c67..bf9853ae 100644
--- a/rust/trezor-client/src/protos/generated/messages_definitions.rs
+++ b/rust/trezor-client/src/protos/generated/messages_definitions.rs
@@ -2588,6 +2588,8 @@ pub enum EthereumABIType {
ABI_UINT8 = 15,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BOOL)
ABI_BOOL = 16,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_INT160)
+ ABI_INT160 = 17,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BYTES32)
ABI_BYTES32 = 20,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BYTES16)
@@ -2596,6 +2598,8 @@ pub enum EthereumABIType {
ABI_BYTES8 = 22,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BYTES4)
ABI_BYTES4 = 23,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BYTES20)
+ ABI_BYTES20 = 24,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_BYTES)
ABI_BYTES = 30,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.definitions.EthereumABIType.ABI_STRING)
@@ -2628,10 +2632,12 @@ impl ::protobuf::Enum for EthereumABIType {
14 => ::std::option::Option::Some(EthereumABIType::ABI_UINT16),
15 => ::std::option::Option::Some(EthereumABIType::ABI_UINT8),
16 => ::std::option::Option::Some(EthereumABIType::ABI_BOOL),
+ 17 => ::std::option::Option::Some(EthereumABIType::ABI_INT160),
20 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES32),
21 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES16),
22 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES8),
23 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES4),
+ 24 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES20),
30 => ::std::option::Option::Some(EthereumABIType::ABI_BYTES),
31 => ::std::option::Option::Some(EthereumABIType::ABI_STRING),
_ => ::std::option::Option::None
@@ -2657,10 +2663,12 @@ impl ::protobuf::Enum for EthereumABIType {
"ABI_UINT16" => ::std::option::Option::Some(EthereumABIType::ABI_UINT16),
"ABI_UINT8" => ::std::option::Option::Some(EthereumABIType::ABI_UINT8),
"ABI_BOOL" => ::std::option::Option::Some(EthereumABIType::ABI_BOOL),
+ "ABI_INT160" => ::std::option::Option::Some(EthereumABIType::ABI_INT160),
"ABI_BYTES32" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES32),
"ABI_BYTES16" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES16),
"ABI_BYTES8" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES8),
"ABI_BYTES4" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES4),
+ "ABI_BYTES20" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES20),
"ABI_BYTES" => ::std::option::Option::Some(EthereumABIType::ABI_BYTES),
"ABI_STRING" => ::std::option::Option::Some(EthereumABIType::ABI_STRING),
_ => ::std::option::Option::None
@@ -2685,10 +2693,12 @@ impl ::protobuf::Enum for EthereumABIType {
EthereumABIType::ABI_UINT16,
EthereumABIType::ABI_UINT8,
EthereumABIType::ABI_BOOL,
+ EthereumABIType::ABI_INT160,
EthereumABIType::ABI_BYTES32,
EthereumABIType::ABI_BYTES16,
EthereumABIType::ABI_BYTES8,
EthereumABIType::ABI_BYTES4,
+ EthereumABIType::ABI_BYTES20,
EthereumABIType::ABI_BYTES,
EthereumABIType::ABI_STRING,
];
@@ -2719,12 +2729,14 @@ impl ::protobuf::EnumFull for EthereumABIType {
EthereumABIType::ABI_UINT16 => 14,
EthereumABIType::ABI_UINT8 => 15,
EthereumABIType::ABI_BOOL => 16,
- EthereumABIType::ABI_BYTES32 => 17,
- EthereumABIType::ABI_BYTES16 => 18,
- EthereumABIType::ABI_BYTES8 => 19,
- EthereumABIType::ABI_BYTES4 => 20,
- EthereumABIType::ABI_BYTES => 21,
- EthereumABIType::ABI_STRING => 22,
+ EthereumABIType::ABI_INT160 => 17,
+ EthereumABIType::ABI_BYTES32 => 18,
+ EthereumABIType::ABI_BYTES16 => 19,
+ EthereumABIType::ABI_BYTES8 => 20,
+ EthereumABIType::ABI_BYTES4 => 21,
+ EthereumABIType::ABI_BYTES20 => 22,
+ EthereumABIType::ABI_BYTES => 23,
+ EthereumABIType::ABI_STRING => 24,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -2940,7 +2952,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x12#\n\rprovider_name\x18\x07\x20\x01(\tR\x0cproviderName*i\n\x0eDefini\
tionType\x12\x14\n\x10ETHEREUM_NETWORK\x10\0\x12\x12\n\x0eETHEREUM_TOKEN\
\x10\x01\x12\x10\n\x0cSOLANA_TOKEN\x10\x02\x12\x1b\n\x17ETHEREUM_DISPLAY\
- _FORMAT\x10\x03*\x86\x03\n\x0fEthereumABIType\x12\x0f\n\x0bABI_ADDRESS\
+ _FORMAT\x10\x03*\xa7\x03\n\x0fEthereumABIType\x12\x0f\n\x0bABI_ADDRESS\
\x10\0\x12\x0f\n\x0bABI_UINT256\x10\x01\x12\x0f\n\x0bABI_UINT248\x10\x02\
\x12\x0f\n\x0bABI_UINT160\x10\x03\x12\x0f\n\x0bABI_UINT128\x10\x04\x12\
\x0f\n\x0bABI_UINT120\x10\x05\x12\x0f\n\x0bABI_UINT112\x10\x06\x12\x0e\n\
@@ -2948,15 +2960,16 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x10\t\x12\x0e\n\nABI_UINT48\x10\n\x12\x0e\n\nABI_UINT40\x10\x0b\x12\x0e\
\n\nABI_UINT32\x10\x0c\x12\x0e\n\nABI_UINT24\x10\r\x12\x0e\n\nABI_UINT16\
\x10\x0e\x12\r\n\tABI_UINT8\x10\x0f\x12\x0c\n\x08ABI_BOOL\x10\x10\x12\
- \x0f\n\x0bABI_BYTES32\x10\x14\x12\x0f\n\x0bABI_BYTES16\x10\x15\x12\x0e\n\
- \nABI_BYTES8\x10\x16\x12\x0e\n\nABI_BYTES4\x10\x17\x12\r\n\tABI_BYTES\
- \x10\x1e\x12\x0e\n\nABI_STRING\x10\x1f*\xac\x01\n!EthereumERC7730FieldFo\
- rmatterType\x12\x1a\n\x16FORMATTER_ADDRESS_NAME\x10\0\x12\x14\n\x10FORMA\
- TTER_AMOUNT\x10\x01\x12\x1a\n\x16FORMATTER_TOKEN_AMOUNT\x10\x02\x12\x12\
- \n\x0eFORMATTER_UNIT\x10\x03\x12\x11\n\rFORMATTER_RAW\x10\x04\x12\x12\n\
- \x0eFORMATTER_DATE\x10\x05*;\n\x1cEthereumERC7730ContainerPath\x12\x08\n\
- \x04FROM\x10\x01\x12\t\n\x05VALUE\x10\x02\x12\x06\n\x02TO\x10\x03B?\n#co\
- m.satoshilabs.trezor.lib.protobufB\x18TrezorMessageDefinitions\
+ \x0e\n\nABI_INT160\x10\x11\x12\x0f\n\x0bABI_BYTES32\x10\x14\x12\x0f\n\
+ \x0bABI_BYTES16\x10\x15\x12\x0e\n\nABI_BYTES8\x10\x16\x12\x0e\n\nABI_BYT\
+ ES4\x10\x17\x12\x0f\n\x0bABI_BYTES20\x10\x18\x12\r\n\tABI_BYTES\x10\x1e\
+ \x12\x0e\n\nABI_STRING\x10\x1f*\xac\x01\n!EthereumERC7730FieldFormatterT\
+ ype\x12\x1a\n\x16FORMATTER_ADDRESS_NAME\x10\0\x12\x14\n\x10FORMATTER_AMO\
+ UNT\x10\x01\x12\x1a\n\x16FORMATTER_TOKEN_AMOUNT\x10\x02\x12\x12\n\x0eFOR\
+ MATTER_UNIT\x10\x03\x12\x11\n\rFORMATTER_RAW\x10\x04\x12\x12\n\x0eFORMAT\
+ TER_DATE\x10\x05*;\n\x1cEthereumERC7730ContainerPath\x12\x08\n\x04FROM\
+ \x10\x01\x12\t\n\x05VALUE\x10\x02\x12\x06\n\x02TO\x10\x03B?\n#com.satosh\
+ ilabs.trezor.lib.protobufB\x18TrezorMessageDefinitions\
";
/// `FileDescriptorProto` object which was a source for this generated file
Why this scored 32/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.