messages: add eth payment request fields
What changed, and why it matters
This commit adds a new optional 'payment request' field to Ethereum EIP-1559 signing requests in the BitBox02 firmware's protocol definitions and generated code. It does not contain any actual implementation of how that field is processed, validated, or shown to the user. Based only on the code changed here, there is no identifiable security vulnerability.
No immediate action is required for this commit alone. When the corresponding feature implementation is reviewed, ensure the payment request field is strictly validated, its contents are clearly displayed to the user for confirmation, and it cannot be used to bypass existing transaction-approval controls.
Security signals we found
New optional protobuf field added to a signing request message
No validation or processing logic for the new field visible in the diff
Only test fixtures updated to include the new field as None
Evidence from the diff
The change extends the ETHSignEIP1559Request protobuf message to include an optional BTCPaymentRequestRequest sub-message (field 13). It updates the .proto file, regenerated Python bindings, Python type stubs, and Rust prost-generated structs. The only Rust source change is in test code, where existing test request builders now set payment_request: None. No parsing, validation, UI, or signing logic for this new field is present in the diff.
Changed components
messages/eth.protopy/bitbox02/bitbox02/communication/generated/eth_pb2.pypy/bitbox02/bitbox02/communication/generated/eth_pb2.pyisrc/rust/bitbox02-rust/src/shiftcrypto.bitbox02.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs (tests only)Inspect captured patch +63 / −43
diff --git a/messages/eth.proto b/messages/eth.proto
index 02c5c00..05f0663 100644
--- a/messages/eth.proto
+++ b/messages/eth.proto
@@ -5,6 +5,7 @@ package shiftcrypto.bitbox02;
import "common.proto";
import "antiklepto.proto";
+import "btc.proto";
// Kept for backwards compatibility. Use chain_id instead, introduced in v9.10.0.
enum ETHCoin {
@@ -70,6 +71,7 @@ message ETHSignEIP1559Request {
ETHAddressCase address_case = 11;
// For streaming: if non-zero, data field should be empty and data will be requested in chunks
uint32 data_length = 12;
+ BTCPaymentRequestRequest payment_request = 13;
}
message ETHSignDataRequestChunkResponse {
diff --git a/py/bitbox02/bitbox02/communication/generated/eth_pb2.py b/py/bitbox02/bitbox02/communication/generated/eth_pb2.py
index d4d4aaf..46699fd 100644
--- a/py/bitbox02/bitbox02/communication/generated/eth_pb2.py
+++ b/py/bitbox02/bitbox02/communication/generated/eth_pb2.py
@@ -13,53 +13,54 @@ _sym_db = _symbol_database.Default()
from . import common_pb2 as common__pb2
from . import antiklepto_pb2 as antiklepto__pb2
+from . import btc_pb2 as btc__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\teth.proto\x12\x14shiftcrypto.bitbox02\x1a\x0c\x63ommon.proto\x1a\x10\x61ntiklepto.proto\"\xf4\x01\n\rETHPubRequest\x12\x0f\n\x07keypath\x18\x01 \x03(\r\x12+\n\x04\x63oin\x18\x02 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x43\n\x0boutput_type\x18\x03 \x01(\x0e\x32..shiftcrypto.bitbox02.ETHPubRequest.OutputType\x12\x0f\n\x07\x64isplay\x18\x04 \x01(\x08\x12\x18\n\x10\x63ontract_address\x18\x05 \x01(\x0c\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\x04\"#\n\nOutputType\x12\x0b\n\x07\x41\x44\x44RESS\x10\x00\x12\x08\n\x04XPUB\x10\x01\"\xea\x02\n\x0e\x45THSignRequest\x12+\n\x04\x63oin\x18\x01 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\r\n\x05nonce\x18\x03 \x01(\x0c\x12\x11\n\tgas_price\x18\x04 \x01(\x0c\x12\x11\n\tgas_limit\x18\x05 \x01(\x0c\x12\x11\n\trecipient\x18\x06 \x01(\x0c\x12\r\n\x05value\x18\x07 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x08 \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\t \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12\x10\n\x08\x63hain_id\x18\n \x01(\x04\x12:\n\x0c\x61\x64\x64ress_case\x18\x0b \x01(\x0e\x32$.shiftcrypto.bitbox02.ETHAddressCase\x12\x13\n\x0b\x64\x61ta_length\x18\x0c \x01(\r\"\xec\x02\n\x15\x45THSignEIP1559Request\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\x04\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\r\n\x05nonce\x18\x03 \x01(\x0c\x12 \n\x18max_priority_fee_per_gas\x18\x04 \x01(\x0c\x12\x17\n\x0fmax_fee_per_gas\x18\x05 \x01(\x0c\x12\x11\n\tgas_limit\x18\x06 \x01(\x0c\x12\x11\n\trecipient\x18\x07 \x01(\x0c\x12\r\n\x05value\x18\x08 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\t \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\n \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12:\n\x0c\x61\x64\x64ress_case\x18\x0b \x01(\x0e\x32$.shiftcrypto.bitbox02.ETHAddressCase\x12\x13\n\x0b\x64\x61ta_length\x18\x0c \x01(\r\"A\n\x1f\x45THSignDataRequestChunkResponse\x12\x0e\n\x06offset\x18\x01 \x01(\r\x12\x0e\n\x06length\x18\x02 \x01(\r\"0\n\x1f\x45THSignDataResponseChunkRequest\x12\r\n\x05\x63hunk\x18\x01 \x01(\x0c\"\xc8\x01\n\x15\x45THSignMessageRequest\x12+\n\x04\x63oin\x18\x01 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\x0b\n\x03msg\x18\x03 \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\x04 \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12\x10\n\x08\x63hain_id\x18\x05 \x01(\x04\"$\n\x0f\x45THSignResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\"\xfb\x05\n\x1a\x45THSignTypedMessageRequest\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\x04\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12J\n\x05types\x18\x03 \x03(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.StructType\x12\x14\n\x0cprimary_type\x18\x04 \x01(\t\x12R\n\x15host_nonce_commitment\x18\x05 \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x1a\xc9\x01\n\nMemberType\x12G\n\x04type\x18\x01 \x01(\x0e\x32\x39.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.DataType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bstruct_name\x18\x03 \x01(\t\x12O\n\narray_type\x18\x04 \x01(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.MemberType\x1a\x61\n\x06Member\x12\x0c\n\x04name\x18\x01 \x01(\t\x12I\n\x04type\x18\x02 \x01(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.MemberType\x1a\x64\n\nStructType\x12\x0c\n\x04name\x18\x01 \x01(\t\x12H\n\x07members\x18\x02 \x03(\x0b\x32\x37.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.Member\"o\n\x08\x44\x61taType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x08\n\x04UINT\x10\x02\x12\x07\n\x03INT\x10\x03\x12\x08\n\x04\x42OOL\x10\x04\x12\x0b\n\x07\x41\x44\x44RESS\x10\x05\x12\n\n\x06STRING\x10\x06\x12\t\n\x05\x41RRAY\x10\x07\x12\n\n\x06STRUCT\x10\x08\"\xb4\x01\n\x1c\x45THTypedMessageValueResponse\x12R\n\x0broot_object\x18\x01 \x01(\x0e\x32=.shiftcrypto.bitbox02.ETHTypedMessageValueResponse.RootObject\x12\x0c\n\x04path\x18\x02 \x03(\r\"2\n\nRootObject\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x44OMAIN\x10\x01\x12\x0b\n\x07MESSAGE\x10\x02\"A\n\x1b\x45THTypedMessageValueRequest\x12\r\n\x05value\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x61ta_length\x18\x02 \x01(\r\"\xc9\x04\n\nETHRequest\x12\x32\n\x03pub\x18\x01 \x01(\x0b\x32#.shiftcrypto.bitbox02.ETHPubRequestH\x00\x12\x34\n\x04sign\x18\x02 \x01(\x0b\x32$.shiftcrypto.bitbox02.ETHSignRequestH\x00\x12?\n\x08sign_msg\x18\x03 \x01(\x0b\x32+.shiftcrypto.bitbox02.ETHSignMessageRequestH\x00\x12P\n\x14\x61ntiklepto_signature\x18\x04 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.AntiKleptoSignatureRequestH\x00\x12J\n\x0esign_typed_msg\x18\x05 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.ETHSignTypedMessageRequestH\x00\x12L\n\x0ftyped_msg_value\x18\x06 \x01(\x0b\x32\x31.shiftcrypto.bitbox02.ETHTypedMessageValueRequestH\x00\x12\x43\n\x0csign_eip1559\x18\x07 \x01(\x0b\x32+.shiftcrypto.bitbox02.ETHSignEIP1559RequestH\x00\x12T\n\x13\x64\x61ta_response_chunk\x18\x08 \x01(\x0b\x32\x35.shiftcrypto.bitbox02.ETHSignDataResponseChunkRequestH\x00\x42\t\n\x07request\"\x80\x03\n\x0b\x45THResponse\x12\x30\n\x03pub\x18\x01 \x01(\x0b\x32!.shiftcrypto.bitbox02.PubResponseH\x00\x12\x35\n\x04sign\x18\x02 \x01(\x0b\x32%.shiftcrypto.bitbox02.ETHSignResponseH\x00\x12X\n\x1c\x61ntiklepto_signer_commitment\x18\x03 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.AntiKleptoSignerCommitmentH\x00\x12M\n\x0ftyped_msg_value\x18\x04 \x01(\x0b\x32\x32.shiftcrypto.bitbox02.ETHTypedMessageValueResponseH\x00\x12S\n\x12\x64\x61ta_request_chunk\x18\x05 \x01(\x0b\x32\x35.shiftcrypto.bitbox02.ETHSignDataRequestChunkResponseH\x00\x42\n\n\x08response*2\n\x07\x45THCoin\x12\x07\n\x03\x45TH\x10\x00\x12\x0e\n\nRopstenETH\x10\x01\x12\x0e\n\nRinkebyETH\x10\x02*d\n\x0e\x45THAddressCase\x12\x1a\n\x16\x45TH_ADDRESS_CASE_MIXED\x10\x00\x12\x1a\n\x16\x45TH_ADDRESS_CASE_UPPER\x10\x01\x12\x1a\n\x16\x45TH_ADDRESS_CASE_LOWER\x10\x02\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\teth.proto\x12\x14shiftcrypto.bitbox02\x1a\x0c\x63ommon.proto\x1a\x10\x61ntiklepto.proto\x1a\tbtc.proto\"\xf4\x01\n\rETHPubRequest\x12\x0f\n\x07keypath\x18\x01 \x03(\r\x12+\n\x04\x63oin\x18\x02 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x43\n\x0boutput_type\x18\x03 \x01(\x0e\x32..shiftcrypto.bitbox02.ETHPubRequest.OutputType\x12\x0f\n\x07\x64isplay\x18\x04 \x01(\x08\x12\x18\n\x10\x63ontract_address\x18\x05 \x01(\x0c\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\x04\"#\n\nOutputType\x12\x0b\n\x07\x41\x44\x44RESS\x10\x00\x12\x08\n\x04XPUB\x10\x01\"\xea\x02\n\x0e\x45THSignRequest\x12+\n\x04\x63oin\x18\x01 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\r\n\x05nonce\x18\x03 \x01(\x0c\x12\x11\n\tgas_price\x18\x04 \x01(\x0c\x12\x11\n\tgas_limit\x18\x05 \x01(\x0c\x12\x11\n\trecipient\x18\x06 \x01(\x0c\x12\r\n\x05value\x18\x07 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x08 \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\t \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12\x10\n\x08\x63hain_id\x18\n \x01(\x04\x12:\n\x0c\x61\x64\x64ress_case\x18\x0b \x01(\x0e\x32$.shiftcrypto.bitbox02.ETHAddressCase\x12\x13\n\x0b\x64\x61ta_length\x18\x0c \x01(\r\"\xb5\x03\n\x15\x45THSignEIP1559Request\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\x04\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\r\n\x05nonce\x18\x03 \x01(\x0c\x12 \n\x18max_priority_fee_per_gas\x18\x04 \x01(\x0c\x12\x17\n\x0fmax_fee_per_gas\x18\x05 \x01(\x0c\x12\x11\n\tgas_limit\x18\x06 \x01(\x0c\x12\x11\n\trecipient\x18\x07 \x01(\x0c\x12\r\n\x05value\x18\x08 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\t \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\n \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12:\n\x0c\x61\x64\x64ress_case\x18\x0b \x01(\x0e\x32$.shiftcrypto.bitbox02.ETHAddressCase\x12\x13\n\x0b\x64\x61ta_length\x18\x0c \x01(\r\x12G\n\x0fpayment_request\x18\r \x01(\x0b\x32..shiftcrypto.bitbox02.BTCPaymentRequestRequest\"A\n\x1f\x45THSignDataRequestChunkResponse\x12\x0e\n\x06offset\x18\x01 \x01(\r\x12\x0e\n\x06length\x18\x02 \x01(\r\"0\n\x1f\x45THSignDataResponseChunkRequest\x12\r\n\x05\x63hunk\x18\x01 \x01(\x0c\"\xc8\x01\n\x15\x45THSignMessageRequest\x12+\n\x04\x63oin\x18\x01 \x01(\x0e\x32\x1d.shiftcrypto.bitbox02.ETHCoin\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12\x0b\n\x03msg\x18\x03 \x01(\x0c\x12R\n\x15host_nonce_commitment\x18\x04 \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x12\x10\n\x08\x63hain_id\x18\x05 \x01(\x04\"$\n\x0f\x45THSignResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\"\xfb\x05\n\x1a\x45THSignTypedMessageRequest\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\x04\x12\x0f\n\x07keypath\x18\x02 \x03(\r\x12J\n\x05types\x18\x03 \x03(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.StructType\x12\x14\n\x0cprimary_type\x18\x04 \x01(\t\x12R\n\x15host_nonce_commitment\x18\x05 \x01(\x0b\x32\x33.shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment\x1a\xc9\x01\n\nMemberType\x12G\n\x04type\x18\x01 \x01(\x0e\x32\x39.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.DataType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bstruct_name\x18\x03 \x01(\t\x12O\n\narray_type\x18\x04 \x01(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.MemberType\x1a\x61\n\x06Member\x12\x0c\n\x04name\x18\x01 \x01(\t\x12I\n\x04type\x18\x02 \x01(\x0b\x32;.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.MemberType\x1a\x64\n\nStructType\x12\x0c\n\x04name\x18\x01 \x01(\t\x12H\n\x07members\x18\x02 \x03(\x0b\x32\x37.shiftcrypto.bitbox02.ETHSignTypedMessageRequest.Member\"o\n\x08\x44\x61taType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x08\n\x04UINT\x10\x02\x12\x07\n\x03INT\x10\x03\x12\x08\n\x04\x42OOL\x10\x04\x12\x0b\n\x07\x41\x44\x44RESS\x10\x05\x12\n\n\x06STRING\x10\x06\x12\t\n\x05\x41RRAY\x10\x07\x12\n\n\x06STRUCT\x10\x08\"\xb4\x01\n\x1c\x45THTypedMessageValueResponse\x12R\n\x0broot_object\x18\x01 \x01(\x0e\x32=.shiftcrypto.bitbox02.ETHTypedMessageValueResponse.RootObject\x12\x0c\n\x04path\x18\x02 \x03(\r\"2\n\nRootObject\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x44OMAIN\x10\x01\x12\x0b\n\x07MESSAGE\x10\x02\"A\n\x1b\x45THTypedMessageValueRequest\x12\r\n\x05value\x18\x01 \x01(\x0c\x12\x13\n\x0b\x64\x61ta_length\x18\x02 \x01(\r\"\xc9\x04\n\nETHRequest\x12\x32\n\x03pub\x18\x01 \x01(\x0b\x32#.shiftcrypto.bitbox02.ETHPubRequestH\x00\x12\x34\n\x04sign\x18\x02 \x01(\x0b\x32$.shiftcrypto.bitbox02.ETHSignRequestH\x00\x12?\n\x08sign_msg\x18\x03 \x01(\x0b\x32+.shiftcrypto.bitbox02.ETHSignMessageRequestH\x00\x12P\n\x14\x61ntiklepto_signature\x18\x04 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.AntiKleptoSignatureRequestH\x00\x12J\n\x0esign_typed_msg\x18\x05 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.ETHSignTypedMessageRequestH\x00\x12L\n\x0ftyped_msg_value\x18\x06 \x01(\x0b\x32\x31.shiftcrypto.bitbox02.ETHTypedMessageValueRequestH\x00\x12\x43\n\x0csign_eip1559\x18\x07 \x01(\x0b\x32+.shiftcrypto.bitbox02.ETHSignEIP1559RequestH\x00\x12T\n\x13\x64\x61ta_response_chunk\x18\x08 \x01(\x0b\x32\x35.shiftcrypto.bitbox02.ETHSignDataResponseChunkRequestH\x00\x42\t\n\x07request\"\x80\x03\n\x0b\x45THResponse\x12\x30\n\x03pub\x18\x01 \x01(\x0b\x32!.shiftcrypto.bitbox02.PubResponseH\x00\x12\x35\n\x04sign\x18\x02 \x01(\x0b\x32%.shiftcrypto.bitbox02.ETHSignResponseH\x00\x12X\n\x1c\x61ntiklepto_signer_commitment\x18\x03 \x01(\x0b\x32\x30.shiftcrypto.bitbox02.AntiKleptoSignerCommitmentH\x00\x12M\n\x0ftyped_msg_value\x18\x04 \x01(\x0b\x32\x32.shiftcrypto.bitbox02.ETHTypedMessageValueResponseH\x00\x12S\n\x12\x64\x61ta_request_chunk\x18\x05 \x01(\x0b\x32\x35.shiftcrypto.bitbox02.ETHSignDataRequestChunkResponseH\x00\x42\n\n\x08response*2\n\x07\x45THCoin\x12\x07\n\x03\x45TH\x10\x00\x12\x0e\n\nRopstenETH\x10\x01\x12\x0e\n\nRinkebyETH\x10\x02*d\n\x0e\x45THAddressCase\x12\x1a\n\x16\x45TH_ADDRESS_CASE_MIXED\x10\x00\x12\x1a\n\x16\x45TH_ADDRESS_CASE_UPPER\x10\x01\x12\x1a\n\x16\x45TH_ADDRESS_CASE_LOWER\x10\x02\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'eth_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
- _ETHCOIN._serialized_start=3395
- _ETHCOIN._serialized_end=3445
- _ETHADDRESSCASE._serialized_start=3447
- _ETHADDRESSCASE._serialized_end=3547
- _ETHPUBREQUEST._serialized_start=68
- _ETHPUBREQUEST._serialized_end=312
- _ETHPUBREQUEST_OUTPUTTYPE._serialized_start=277
- _ETHPUBREQUEST_OUTPUTTYPE._serialized_end=312
- _ETHSIGNREQUEST._serialized_start=315
- _ETHSIGNREQUEST._serialized_end=677
- _ETHSIGNEIP1559REQUEST._serialized_start=680
- _ETHSIGNEIP1559REQUEST._serialized_end=1044
- _ETHSIGNDATAREQUESTCHUNKRESPONSE._serialized_start=1046
- _ETHSIGNDATAREQUESTCHUNKRESPONSE._serialized_end=1111
- _ETHSIGNDATARESPONSECHUNKREQUEST._serialized_start=1113
- _ETHSIGNDATARESPONSECHUNKREQUEST._serialized_end=1161
- _ETHSIGNMESSAGEREQUEST._serialized_start=1164
- _ETHSIGNMESSAGEREQUEST._serialized_end=1364
- _ETHSIGNRESPONSE._serialized_start=1366
- _ETHSIGNRESPONSE._serialized_end=1402
- _ETHSIGNTYPEDMESSAGEREQUEST._serialized_start=1405
- _ETHSIGNTYPEDMESSAGEREQUEST._serialized_end=2168
- _ETHSIGNTYPEDMESSAGEREQUEST_MEMBERTYPE._serialized_start=1653
- _ETHSIGNTYPEDMESSAGEREQUEST_MEMBERTYPE._serialized_end=1854
- _ETHSIGNTYPEDMESSAGEREQUEST_MEMBER._serialized_start=1856
- _ETHSIGNTYPEDMESSAGEREQUEST_MEMBER._serialized_end=1953
- _ETHSIGNTYPEDMESSAGEREQUEST_STRUCTTYPE._serialized_start=1955
- _ETHSIGNTYPEDMESSAGEREQUEST_STRUCTTYPE._serialized_end=2055
- _ETHSIGNTYPEDMESSAGEREQUEST_DATATYPE._serialized_start=2057
- _ETHSIGNTYPEDMESSAGEREQUEST_DATATYPE._serialized_end=2168
- _ETHTYPEDMESSAGEVALUERESPONSE._serialized_start=2171
- _ETHTYPEDMESSAGEVALUERESPONSE._serialized_end=2351
- _ETHTYPEDMESSAGEVALUERESPONSE_ROOTOBJECT._serialized_start=2301
- _ETHTYPEDMESSAGEVALUERESPONSE_ROOTOBJECT._serialized_end=2351
- _ETHTYPEDMESSAGEVALUEREQUEST._serialized_start=2353
- _ETHTYPEDMESSAGEVALUEREQUEST._serialized_end=2418
- _ETHREQUEST._serialized_start=2421
- _ETHREQUEST._serialized_end=3006
- _ETHRESPONSE._serialized_start=3009
- _ETHRESPONSE._serialized_end=3393
+ _ETHCOIN._serialized_start=3479
+ _ETHCOIN._serialized_end=3529
+ _ETHADDRESSCASE._serialized_start=3531
+ _ETHADDRESSCASE._serialized_end=3631
+ _ETHPUBREQUEST._serialized_start=79
+ _ETHPUBREQUEST._serialized_end=323
+ _ETHPUBREQUEST_OUTPUTTYPE._serialized_start=288
+ _ETHPUBREQUEST_OUTPUTTYPE._serialized_end=323
+ _ETHSIGNREQUEST._serialized_start=326
+ _ETHSIGNREQUEST._serialized_end=688
+ _ETHSIGNEIP1559REQUEST._serialized_start=691
+ _ETHSIGNEIP1559REQUEST._serialized_end=1128
+ _ETHSIGNDATAREQUESTCHUNKRESPONSE._serialized_start=1130
+ _ETHSIGNDATAREQUESTCHUNKRESPONSE._serialized_end=1195
+ _ETHSIGNDATARESPONSECHUNKREQUEST._serialized_start=1197
+ _ETHSIGNDATARESPONSECHUNKREQUEST._serialized_end=1245
+ _ETHSIGNMESSAGEREQUEST._serialized_start=1248
+ _ETHSIGNMESSAGEREQUEST._serialized_end=1448
+ _ETHSIGNRESPONSE._serialized_start=1450
+ _ETHSIGNRESPONSE._serialized_end=1486
+ _ETHSIGNTYPEDMESSAGEREQUEST._serialized_start=1489
+ _ETHSIGNTYPEDMESSAGEREQUEST._serialized_end=2252
+ _ETHSIGNTYPEDMESSAGEREQUEST_MEMBERTYPE._serialized_start=1737
+ _ETHSIGNTYPEDMESSAGEREQUEST_MEMBERTYPE._serialized_end=1938
+ _ETHSIGNTYPEDMESSAGEREQUEST_MEMBER._serialized_start=1940
+ _ETHSIGNTYPEDMESSAGEREQUEST_MEMBER._serialized_end=2037
+ _ETHSIGNTYPEDMESSAGEREQUEST_STRUCTTYPE._serialized_start=2039
+ _ETHSIGNTYPEDMESSAGEREQUEST_STRUCTTYPE._serialized_end=2139
+ _ETHSIGNTYPEDMESSAGEREQUEST_DATATYPE._serialized_start=2141
+ _ETHSIGNTYPEDMESSAGEREQUEST_DATATYPE._serialized_end=2252
+ _ETHTYPEDMESSAGEVALUERESPONSE._serialized_start=2255
+ _ETHTYPEDMESSAGEVALUERESPONSE._serialized_end=2435
+ _ETHTYPEDMESSAGEVALUERESPONSE_ROOTOBJECT._serialized_start=2385
+ _ETHTYPEDMESSAGEVALUERESPONSE_ROOTOBJECT._serialized_end=2435
+ _ETHTYPEDMESSAGEVALUEREQUEST._serialized_start=2437
+ _ETHTYPEDMESSAGEVALUEREQUEST._serialized_end=2502
+ _ETHREQUEST._serialized_start=2505
+ _ETHREQUEST._serialized_end=3090
+ _ETHRESPONSE._serialized_start=3093
+ _ETHRESPONSE._serialized_end=3477
# @@protoc_insertion_point(module_scope)
diff --git a/py/bitbox02/bitbox02/communication/generated/eth_pb2.pyi b/py/bitbox02/bitbox02/communication/generated/eth_pb2.pyi
index 5b1bb65..e6aebca 100644
--- a/py/bitbox02/bitbox02/communication/generated/eth_pb2.pyi
+++ b/py/bitbox02/bitbox02/communication/generated/eth_pb2.pyi
@@ -4,6 +4,7 @@ isort:skip_file
SPDX-License-Identifier: Apache-2.0"""
from . import antiklepto_pb2
+from . import btc_pb2
import builtins
import collections.abc
from . import common_pb2
@@ -185,6 +186,7 @@ class ETHSignEIP1559Request(google.protobuf.message.Message):
HOST_NONCE_COMMITMENT_FIELD_NUMBER: builtins.int
ADDRESS_CASE_FIELD_NUMBER: builtins.int
DATA_LENGTH_FIELD_NUMBER: builtins.int
+ PAYMENT_REQUEST_FIELD_NUMBER: builtins.int
chain_id: builtins.int
nonce: builtins.bytes
"""smallest big endian serialization, max. 16 bytes"""
@@ -206,6 +208,8 @@ class ETHSignEIP1559Request(google.protobuf.message.Message):
def keypath(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ...
@property
def host_nonce_commitment(self) -> antiklepto_pb2.AntiKleptoHostNonceCommitment: ...
+ @property
+ def payment_request(self) -> btc_pb2.BTCPaymentRequestRequest: ...
def __init__(
self,
*,
@@ -221,9 +225,10 @@ class ETHSignEIP1559Request(google.protobuf.message.Message):
host_nonce_commitment: antiklepto_pb2.AntiKleptoHostNonceCommitment | None = ...,
address_case: global___ETHAddressCase.ValueType = ...,
data_length: builtins.int = ...,
+ payment_request: btc_pb2.BTCPaymentRequestRequest | None = ...,
) -> None: ...
- def HasField(self, field_name: typing.Literal["host_nonce_commitment", b"host_nonce_commitment"]) -> builtins.bool: ...
- def ClearField(self, field_name: typing.Literal["address_case", b"address_case", "chain_id", b"chain_id", "data", b"data", "data_length", b"data_length", "gas_limit", b"gas_limit", "host_nonce_commitment", b"host_nonce_commitment", "keypath", b"keypath", "max_fee_per_gas", b"max_fee_per_gas", "max_priority_fee_per_gas", b"max_priority_fee_per_gas", "nonce", b"nonce", "recipient", b"recipient", "value", b"value"]) -> None: ...
+ def HasField(self, field_name: typing.Literal["host_nonce_commitment", b"host_nonce_commitment", "payment_request", b"payment_request"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing.Literal["address_case", b"address_case", "chain_id", b"chain_id", "data", b"data", "data_length", b"data_length", "gas_limit", b"gas_limit", "host_nonce_commitment", b"host_nonce_commitment", "keypath", b"keypath", "max_fee_per_gas", b"max_fee_per_gas", "max_priority_fee_per_gas", b"max_priority_fee_per_gas", "nonce", b"nonce", "payment_request", b"payment_request", "recipient", b"recipient", "value", b"value"]) -> None: ...
global___ETHSignEIP1559Request = ETHSignEIP1559Request
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
index 57d04f3..2ba70a6 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
@@ -629,6 +629,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}))),
Ok(Response::Sign(pb::EthSignResponse {
signature: hex!("289111770dc067895780de3e9b30454e331ba6661f046e9e26431576d7f08a496ffe6deffb07dd8d4713d8c523b6c33b53dd6ef2dc9c394d6e21f64307d2bcf001")
@@ -724,6 +725,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
})
))
.is_ok()
@@ -903,6 +905,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}))),
Ok(Response::Sign(pb::EthSignResponse {
signature: hex!("c5d9639a778a3415f63a11c03a58bede6b3cafff4f2ce6ea16411e76fba946f72166f09e313c07e78b7b1fff87450c4321170c02df2d36c44c3a021abf20546001")
@@ -1015,6 +1018,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}))),
Ok(Response::Sign(pb::EthSignResponse {
signature: hex!("3162487880abdea1f352d9a4e3d56066f122f04ff112117c8ca3cd220f1666302dacd5e5e8da4cd39704e33443a9a7f32602d332bb52567c2e34aafe9ed48feb01")
@@ -1088,6 +1092,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}))),
Ok(Response::Sign(pb::EthSignResponse {
signature: hex!("8203d80b600dce8e77cdcb119d45db7f60d7ca34e7369140e92d93919221f85a0a119d2464dfab65833095c12763fed37c072feb29610e1437f388958d77562801")
@@ -1266,6 +1271,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
};
{
@@ -1436,6 +1442,7 @@ mod tests {
chain_id: 137,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}),
))
.unwrap();
@@ -1528,6 +1535,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 0,
+ payment_request: None,
}),
));
@@ -1549,6 +1557,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 4000,
+ payment_request: None,
}),
));
clear_chunk_responder();
@@ -1695,6 +1704,7 @@ mod tests {
chain_id: 1,
address_case: pb::EthAddressCase::Mixed as _,
data_length: 12000,
+ payment_request: None,
}),
)),
Ok(Response::Sign(pb::EthSignResponse {
diff --git a/src/rust/bitbox02-rust/src/shiftcrypto.bitbox02.rs b/src/rust/bitbox02-rust/src/shiftcrypto.bitbox02.rs
index be8a9f1..2e90ef2 100644
--- a/src/rust/bitbox02-rust/src/shiftcrypto.bitbox02.rs
+++ b/src/rust/bitbox02-rust/src/shiftcrypto.bitbox02.rs
@@ -1590,6 +1590,8 @@ pub struct EthSignEip1559Request {
/// For streaming: if non-zero, data field should be empty and data will be requested in chunks
#[prost(uint32, tag = "12")]
pub data_length: u32,
+ #[prost(message, optional, tag = "13")]
+ pub payment_request: ::core::option::Option<BtcPaymentRequestRequest>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
Why this scored 17/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.