From c1e6c2784749483568b2e5debf924a35830b0550 Mon Sep 17 00:00:00 2001 From: cedwies Date: Wed, 25 Feb 2026 15:29:16 +0100 Subject: [PATCH 1/2] regenerate protobuf files --- api/firmware/messages/antiklepto.pb.go | 4 +- api/firmware/messages/backup_commands.pb.go | 4 +- api/firmware/messages/bitbox02_system.pb.go | 4 +- api/firmware/messages/bluetooth.pb.go | 4 +- api/firmware/messages/btc.pb.go | 298 ++++++++++++++---- api/firmware/messages/btc.proto | 14 + api/firmware/messages/cardano.pb.go | 4 +- api/firmware/messages/common.pb.go | 4 +- api/firmware/messages/eth.pb.go | 4 +- api/firmware/messages/hww.pb.go | 4 +- api/firmware/messages/keystore.pb.go | 4 +- api/firmware/messages/mnemonic.pb.go | 4 +- .../messages/perform_attestation.pb.go | 4 +- api/firmware/messages/system.pb.go | 4 +- 14 files changed, 272 insertions(+), 88 deletions(-) diff --git a/api/firmware/messages/antiklepto.pb.go b/api/firmware/messages/antiklepto.pb.go index 9b0c918..9913cb3 100644 --- a/api/firmware/messages/antiklepto.pb.go +++ b/api/firmware/messages/antiklepto.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: antiklepto.proto package messages diff --git a/api/firmware/messages/backup_commands.pb.go b/api/firmware/messages/backup_commands.pb.go index 8ba9ceb..ac810f3 100644 --- a/api/firmware/messages/backup_commands.pb.go +++ b/api/firmware/messages/backup_commands.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: backup_commands.proto package messages diff --git a/api/firmware/messages/bitbox02_system.pb.go b/api/firmware/messages/bitbox02_system.pb.go index 259d20b..933bd27 100644 --- a/api/firmware/messages/bitbox02_system.pb.go +++ b/api/firmware/messages/bitbox02_system.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: bitbox02_system.proto package messages diff --git a/api/firmware/messages/bluetooth.pb.go b/api/firmware/messages/bluetooth.pb.go index dcd965f..c3e6f93 100644 --- a/api/firmware/messages/bluetooth.pb.go +++ b/api/firmware/messages/bluetooth.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: bluetooth.proto package messages diff --git a/api/firmware/messages/btc.pb.go b/api/firmware/messages/btc.pb.go index 9326a03..9827230 100644 --- a/api/firmware/messages/btc.pb.go +++ b/api/firmware/messages/btc.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: btc.proto package messages @@ -2397,6 +2397,7 @@ type BTCPaymentRequestRequest_Memo struct { // Types that are valid to be assigned to Memo: // // *BTCPaymentRequestRequest_Memo_TextMemo_ + // *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_ Memo isBTCPaymentRequestRequest_Memo_Memo `protobuf_oneof:"memo"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -2448,6 +2449,15 @@ func (x *BTCPaymentRequestRequest_Memo) GetTextMemo() *BTCPaymentRequestRequest_ return nil } +func (x *BTCPaymentRequestRequest_Memo) GetCoinPurchaseMemo() *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo { + if x != nil { + if x, ok := x.Memo.(*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_); ok { + return x.CoinPurchaseMemo + } + } + return nil +} + type isBTCPaymentRequestRequest_Memo_Memo interface { isBTCPaymentRequestRequest_Memo_Memo() } @@ -2456,8 +2466,14 @@ type BTCPaymentRequestRequest_Memo_TextMemo_ struct { TextMemo *BTCPaymentRequestRequest_Memo_TextMemo `protobuf:"bytes,1,opt,name=text_memo,json=textMemo,proto3,oneof"` } +type BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_ struct { + CoinPurchaseMemo *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo `protobuf:"bytes,2,opt,name=coin_purchase_memo,json=coinPurchaseMemo,proto3,oneof"` +} + func (*BTCPaymentRequestRequest_Memo_TextMemo_) isBTCPaymentRequestRequest_Memo_Memo() {} +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_) isBTCPaymentRequestRequest_Memo_Memo() {} + type BTCPaymentRequestRequest_Memo_TextMemo struct { state protoimpl.MessageState `protogen:"open.v1"` Note string `protobuf:"bytes,1,opt,name=note,proto3" json:"note,omitempty"` @@ -2502,6 +2518,143 @@ func (x *BTCPaymentRequestRequest_Memo_TextMemo) GetNote() string { return "" } +type BTCPaymentRequestRequest_Memo_CoinPurchaseMemo struct { + state protoimpl.MessageState `protogen:"open.v1"` + CoinType uint32 `protobuf:"varint,1,opt,name=coin_type,json=coinType,proto3" json:"coin_type,omitempty"` // SLIP-44 coin type + Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` // Human-readable amount (e.g. "0.25 ETH") + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` // Address to send the purchased coins to + // Types that are valid to be assigned to AddressDerivation: + // + // *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_Eth + AddressDerivation isBTCPaymentRequestRequest_Memo_CoinPurchaseMemo_AddressDerivation `protobuf_oneof:"address_derivation"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) Reset() { + *x = BTCPaymentRequestRequest_Memo_CoinPurchaseMemo{} + mi := &file_btc_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) ProtoMessage() {} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) ProtoReflect() protoreflect.Message { + mi := &file_btc_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BTCPaymentRequestRequest_Memo_CoinPurchaseMemo.ProtoReflect.Descriptor instead. +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) Descriptor() ([]byte, []int) { + return file_btc_proto_rawDescGZIP(), []int{16, 0, 1} +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) GetCoinType() uint32 { + if x != nil { + return x.CoinType + } + return 0 +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) GetAmount() string { + if x != nil { + return x.Amount + } + return "" +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) GetAddressDerivation() isBTCPaymentRequestRequest_Memo_CoinPurchaseMemo_AddressDerivation { + if x != nil { + return x.AddressDerivation + } + return nil +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo) GetEth() *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation { + if x != nil { + if x, ok := x.AddressDerivation.(*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_Eth); ok { + return x.Eth + } + } + return nil +} + +type isBTCPaymentRequestRequest_Memo_CoinPurchaseMemo_AddressDerivation interface { + isBTCPaymentRequestRequest_Memo_CoinPurchaseMemo_AddressDerivation() +} + +type BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_Eth struct { + Eth *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation `protobuf:"bytes,4,opt,name=eth,proto3,oneof"` +} + +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_Eth) isBTCPaymentRequestRequest_Memo_CoinPurchaseMemo_AddressDerivation() { +} + +// Derivation info for verifying address ownership. +// NOT part of the SLIP-24 sighash. +type BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation struct { + state protoimpl.MessageState `protogen:"open.v1"` + Keypath []uint32 `protobuf:"varint,1,rep,packed,name=keypath,proto3" json:"keypath,omitempty"` // Keypath to the address + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) Reset() { + *x = BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation{} + mi := &file_btc_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) ProtoMessage() {} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) ProtoReflect() protoreflect.Message { + mi := &file_btc_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation.ProtoReflect.Descriptor instead. +func (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) Descriptor() ([]byte, []int) { + return file_btc_proto_rawDescGZIP(), []int{16, 0, 1, 0} +} + +func (x *BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation) GetKeypath() []uint32 { + if x != nil { + return x.Keypath + } + return nil +} + var File_btc_proto protoreflect.FileDescriptor const file_btc_proto_rawDesc = "" + @@ -2654,17 +2807,26 @@ const file_btc_proto_rawDesc = "" + "\bsequence\x18\x04 \x01(\rR\bsequence\"S\n" + "\x16BTCPrevTxOutputRequest\x12\x14\n" + "\x05value\x18\x01 \x01(\x04R\x05value\x12#\n" + - "\rpubkey_script\x18\x02 \x01(\fR\fpubkeyScript\"\xf1\x02\n" + + "\rpubkey_script\x18\x02 \x01(\fR\fpubkeyScript\"\x82\x06\n" + "\x18BTCPaymentRequestRequest\x12%\n" + "\x0erecipient_name\x18\x01 \x01(\tR\rrecipientName\x12I\n" + "\x05memos\x18\x02 \x03(\v23.shiftcrypto.bitbox02.BTCPaymentRequestRequest.MemoR\x05memos\x12\x14\n" + "\x05nonce\x18\x03 \x01(\fR\x05nonce\x12!\n" + "\ftotal_amount\x18\x04 \x01(\x04R\vtotalAmount\x12\x1c\n" + - "\tsignature\x18\x05 \x01(\fR\tsignature\x1a\x8b\x01\n" + + "\tsignature\x18\x05 \x01(\fR\tsignature\x1a\x9c\x04\n" + "\x04Memo\x12[\n" + - "\ttext_memo\x18\x01 \x01(\v2<.shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemoH\x00R\btextMemo\x1a\x1e\n" + + "\ttext_memo\x18\x01 \x01(\v2<.shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemoH\x00R\btextMemo\x12t\n" + + "\x12coin_purchase_memo\x18\x02 \x01(\v2D.shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemoH\x00R\x10coinPurchaseMemo\x1a\x1e\n" + "\bTextMemo\x12\x12\n" + - "\x04note\x18\x01 \x01(\tR\x04noteB\x06\n" + + "\x04note\x18\x01 \x01(\tR\x04note\x1a\x98\x02\n" + + "\x10CoinPurchaseMemo\x12\x1b\n" + + "\tcoin_type\x18\x01 \x01(\rR\bcoinType\x12\x16\n" + + "\x06amount\x18\x02 \x01(\tR\x06amount\x12\x18\n" + + "\aaddress\x18\x03 \x01(\tR\aaddress\x12m\n" + + "\x03eth\x18\x04 \x01(\v2Y.shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo.EthAddressDerivationH\x00R\x03eth\x1a0\n" + + "\x14EthAddressDerivation\x12\x18\n" + + "\akeypath\x18\x01 \x03(\rR\akeypathB\x14\n" + + "\x12address_derivationB\x06\n" + "\x04memo\"\x9c\x02\n" + "\x15BTCSignMessageRequest\x121\n" + "\x04coin\x18\x01 \x01(\x0e2\x1d.shiftcrypto.bitbox02.BTCCoinR\x04coin\x12U\n" + @@ -2724,50 +2886,52 @@ func file_btc_proto_rawDescGZIP() []byte { } var file_btc_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_btc_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_btc_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_btc_proto_goTypes = []any{ - (BTCCoin)(0), // 0: shiftcrypto.bitbox02.BTCCoin - (BTCOutputType)(0), // 1: shiftcrypto.bitbox02.BTCOutputType - (BTCScriptConfig_SimpleType)(0), // 2: shiftcrypto.bitbox02.BTCScriptConfig.SimpleType - (BTCScriptConfig_Multisig_ScriptType)(0), // 3: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.ScriptType - (BTCPubRequest_XPubType)(0), // 4: shiftcrypto.bitbox02.BTCPubRequest.XPubType - (BTCXpubsRequest_XPubType)(0), // 5: shiftcrypto.bitbox02.BTCXpubsRequest.XPubType - (BTCSignInitRequest_FormatUnit)(0), // 6: shiftcrypto.bitbox02.BTCSignInitRequest.FormatUnit - (BTCSignNextResponse_Type)(0), // 7: shiftcrypto.bitbox02.BTCSignNextResponse.Type - (BTCRegisterScriptConfigRequest_XPubType)(0), // 8: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.XPubType - (*BTCScriptConfig)(nil), // 9: shiftcrypto.bitbox02.BTCScriptConfig - (*BTCPubRequest)(nil), // 10: shiftcrypto.bitbox02.BTCPubRequest - (*BTCXpubsRequest)(nil), // 11: shiftcrypto.bitbox02.BTCXpubsRequest - (*BTCScriptConfigWithKeypath)(nil), // 12: shiftcrypto.bitbox02.BTCScriptConfigWithKeypath - (*BTCSignInitRequest)(nil), // 13: shiftcrypto.bitbox02.BTCSignInitRequest - (*BTCSignNextResponse)(nil), // 14: shiftcrypto.bitbox02.BTCSignNextResponse - (*BTCSignInputRequest)(nil), // 15: shiftcrypto.bitbox02.BTCSignInputRequest - (*BTCSignOutputRequest)(nil), // 16: shiftcrypto.bitbox02.BTCSignOutputRequest - (*BTCScriptConfigRegistration)(nil), // 17: shiftcrypto.bitbox02.BTCScriptConfigRegistration - (*BTCSuccess)(nil), // 18: shiftcrypto.bitbox02.BTCSuccess - (*BTCIsScriptConfigRegisteredRequest)(nil), // 19: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest - (*BTCIsScriptConfigRegisteredResponse)(nil), // 20: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredResponse - (*BTCRegisterScriptConfigRequest)(nil), // 21: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest - (*BTCPrevTxInitRequest)(nil), // 22: shiftcrypto.bitbox02.BTCPrevTxInitRequest - (*BTCPrevTxInputRequest)(nil), // 23: shiftcrypto.bitbox02.BTCPrevTxInputRequest - (*BTCPrevTxOutputRequest)(nil), // 24: shiftcrypto.bitbox02.BTCPrevTxOutputRequest - (*BTCPaymentRequestRequest)(nil), // 25: shiftcrypto.bitbox02.BTCPaymentRequestRequest - (*BTCSignMessageRequest)(nil), // 26: shiftcrypto.bitbox02.BTCSignMessageRequest - (*BTCSignMessageResponse)(nil), // 27: shiftcrypto.bitbox02.BTCSignMessageResponse - (*BTCRequest)(nil), // 28: shiftcrypto.bitbox02.BTCRequest - (*BTCResponse)(nil), // 29: shiftcrypto.bitbox02.BTCResponse - (*BTCScriptConfig_Multisig)(nil), // 30: shiftcrypto.bitbox02.BTCScriptConfig.Multisig - (*BTCScriptConfig_Policy)(nil), // 31: shiftcrypto.bitbox02.BTCScriptConfig.Policy - (*BTCSignOutputRequest_SilentPayment)(nil), // 32: shiftcrypto.bitbox02.BTCSignOutputRequest.SilentPayment - (*BTCPaymentRequestRequest_Memo)(nil), // 33: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo - (*BTCPaymentRequestRequest_Memo_TextMemo)(nil), // 34: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo - (*Keypath)(nil), // 35: shiftcrypto.bitbox02.Keypath - (*AntiKleptoSignerCommitment)(nil), // 36: shiftcrypto.bitbox02.AntiKleptoSignerCommitment - (*AntiKleptoHostNonceCommitment)(nil), // 37: shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment - (*AntiKleptoSignatureRequest)(nil), // 38: shiftcrypto.bitbox02.AntiKleptoSignatureRequest - (*PubsResponse)(nil), // 39: shiftcrypto.bitbox02.PubsResponse - (*XPub)(nil), // 40: shiftcrypto.bitbox02.XPub - (*KeyOriginInfo)(nil), // 41: shiftcrypto.bitbox02.KeyOriginInfo + (BTCCoin)(0), // 0: shiftcrypto.bitbox02.BTCCoin + (BTCOutputType)(0), // 1: shiftcrypto.bitbox02.BTCOutputType + (BTCScriptConfig_SimpleType)(0), // 2: shiftcrypto.bitbox02.BTCScriptConfig.SimpleType + (BTCScriptConfig_Multisig_ScriptType)(0), // 3: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.ScriptType + (BTCPubRequest_XPubType)(0), // 4: shiftcrypto.bitbox02.BTCPubRequest.XPubType + (BTCXpubsRequest_XPubType)(0), // 5: shiftcrypto.bitbox02.BTCXpubsRequest.XPubType + (BTCSignInitRequest_FormatUnit)(0), // 6: shiftcrypto.bitbox02.BTCSignInitRequest.FormatUnit + (BTCSignNextResponse_Type)(0), // 7: shiftcrypto.bitbox02.BTCSignNextResponse.Type + (BTCRegisterScriptConfigRequest_XPubType)(0), // 8: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.XPubType + (*BTCScriptConfig)(nil), // 9: shiftcrypto.bitbox02.BTCScriptConfig + (*BTCPubRequest)(nil), // 10: shiftcrypto.bitbox02.BTCPubRequest + (*BTCXpubsRequest)(nil), // 11: shiftcrypto.bitbox02.BTCXpubsRequest + (*BTCScriptConfigWithKeypath)(nil), // 12: shiftcrypto.bitbox02.BTCScriptConfigWithKeypath + (*BTCSignInitRequest)(nil), // 13: shiftcrypto.bitbox02.BTCSignInitRequest + (*BTCSignNextResponse)(nil), // 14: shiftcrypto.bitbox02.BTCSignNextResponse + (*BTCSignInputRequest)(nil), // 15: shiftcrypto.bitbox02.BTCSignInputRequest + (*BTCSignOutputRequest)(nil), // 16: shiftcrypto.bitbox02.BTCSignOutputRequest + (*BTCScriptConfigRegistration)(nil), // 17: shiftcrypto.bitbox02.BTCScriptConfigRegistration + (*BTCSuccess)(nil), // 18: shiftcrypto.bitbox02.BTCSuccess + (*BTCIsScriptConfigRegisteredRequest)(nil), // 19: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest + (*BTCIsScriptConfigRegisteredResponse)(nil), // 20: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredResponse + (*BTCRegisterScriptConfigRequest)(nil), // 21: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest + (*BTCPrevTxInitRequest)(nil), // 22: shiftcrypto.bitbox02.BTCPrevTxInitRequest + (*BTCPrevTxInputRequest)(nil), // 23: shiftcrypto.bitbox02.BTCPrevTxInputRequest + (*BTCPrevTxOutputRequest)(nil), // 24: shiftcrypto.bitbox02.BTCPrevTxOutputRequest + (*BTCPaymentRequestRequest)(nil), // 25: shiftcrypto.bitbox02.BTCPaymentRequestRequest + (*BTCSignMessageRequest)(nil), // 26: shiftcrypto.bitbox02.BTCSignMessageRequest + (*BTCSignMessageResponse)(nil), // 27: shiftcrypto.bitbox02.BTCSignMessageResponse + (*BTCRequest)(nil), // 28: shiftcrypto.bitbox02.BTCRequest + (*BTCResponse)(nil), // 29: shiftcrypto.bitbox02.BTCResponse + (*BTCScriptConfig_Multisig)(nil), // 30: shiftcrypto.bitbox02.BTCScriptConfig.Multisig + (*BTCScriptConfig_Policy)(nil), // 31: shiftcrypto.bitbox02.BTCScriptConfig.Policy + (*BTCSignOutputRequest_SilentPayment)(nil), // 32: shiftcrypto.bitbox02.BTCSignOutputRequest.SilentPayment + (*BTCPaymentRequestRequest_Memo)(nil), // 33: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo + (*BTCPaymentRequestRequest_Memo_TextMemo)(nil), // 34: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo + (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo)(nil), // 35: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo + (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_EthAddressDerivation)(nil), // 36: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo.EthAddressDerivation + (*Keypath)(nil), // 37: shiftcrypto.bitbox02.Keypath + (*AntiKleptoSignerCommitment)(nil), // 38: shiftcrypto.bitbox02.AntiKleptoSignerCommitment + (*AntiKleptoHostNonceCommitment)(nil), // 39: shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + (*AntiKleptoSignatureRequest)(nil), // 40: shiftcrypto.bitbox02.AntiKleptoSignatureRequest + (*PubsResponse)(nil), // 41: shiftcrypto.bitbox02.PubsResponse + (*XPub)(nil), // 42: shiftcrypto.bitbox02.XPub + (*KeyOriginInfo)(nil), // 43: shiftcrypto.bitbox02.KeyOriginInfo } var file_btc_proto_depIdxs = []int32{ 2, // 0: shiftcrypto.bitbox02.BTCScriptConfig.simple_type:type_name -> shiftcrypto.bitbox02.BTCScriptConfig.SimpleType @@ -2778,15 +2942,15 @@ var file_btc_proto_depIdxs = []int32{ 9, // 5: shiftcrypto.bitbox02.BTCPubRequest.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfig 0, // 6: shiftcrypto.bitbox02.BTCXpubsRequest.coin:type_name -> shiftcrypto.bitbox02.BTCCoin 5, // 7: shiftcrypto.bitbox02.BTCXpubsRequest.xpub_type:type_name -> shiftcrypto.bitbox02.BTCXpubsRequest.XPubType - 35, // 8: shiftcrypto.bitbox02.BTCXpubsRequest.keypaths:type_name -> shiftcrypto.bitbox02.Keypath + 37, // 8: shiftcrypto.bitbox02.BTCXpubsRequest.keypaths:type_name -> shiftcrypto.bitbox02.Keypath 9, // 9: shiftcrypto.bitbox02.BTCScriptConfigWithKeypath.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfig 0, // 10: shiftcrypto.bitbox02.BTCSignInitRequest.coin:type_name -> shiftcrypto.bitbox02.BTCCoin 12, // 11: shiftcrypto.bitbox02.BTCSignInitRequest.script_configs:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath 6, // 12: shiftcrypto.bitbox02.BTCSignInitRequest.format_unit:type_name -> shiftcrypto.bitbox02.BTCSignInitRequest.FormatUnit 12, // 13: shiftcrypto.bitbox02.BTCSignInitRequest.output_script_configs:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath 7, // 14: shiftcrypto.bitbox02.BTCSignNextResponse.type:type_name -> shiftcrypto.bitbox02.BTCSignNextResponse.Type - 36, // 15: shiftcrypto.bitbox02.BTCSignNextResponse.anti_klepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment - 37, // 16: shiftcrypto.bitbox02.BTCSignInputRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + 38, // 15: shiftcrypto.bitbox02.BTCSignNextResponse.anti_klepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment + 39, // 16: shiftcrypto.bitbox02.BTCSignInputRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment 1, // 17: shiftcrypto.bitbox02.BTCSignOutputRequest.type:type_name -> shiftcrypto.bitbox02.BTCOutputType 32, // 18: shiftcrypto.bitbox02.BTCSignOutputRequest.silent_payment:type_name -> shiftcrypto.bitbox02.BTCSignOutputRequest.SilentPayment 0, // 19: shiftcrypto.bitbox02.BTCScriptConfigRegistration.coin:type_name -> shiftcrypto.bitbox02.BTCCoin @@ -2797,31 +2961,33 @@ var file_btc_proto_depIdxs = []int32{ 33, // 24: shiftcrypto.bitbox02.BTCPaymentRequestRequest.memos:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo 0, // 25: shiftcrypto.bitbox02.BTCSignMessageRequest.coin:type_name -> shiftcrypto.bitbox02.BTCCoin 12, // 26: shiftcrypto.bitbox02.BTCSignMessageRequest.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath - 37, // 27: shiftcrypto.bitbox02.BTCSignMessageRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + 39, // 27: shiftcrypto.bitbox02.BTCSignMessageRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment 19, // 28: shiftcrypto.bitbox02.BTCRequest.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest 21, // 29: shiftcrypto.bitbox02.BTCRequest.register_script_config:type_name -> shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest 22, // 30: shiftcrypto.bitbox02.BTCRequest.prevtx_init:type_name -> shiftcrypto.bitbox02.BTCPrevTxInitRequest 23, // 31: shiftcrypto.bitbox02.BTCRequest.prevtx_input:type_name -> shiftcrypto.bitbox02.BTCPrevTxInputRequest 24, // 32: shiftcrypto.bitbox02.BTCRequest.prevtx_output:type_name -> shiftcrypto.bitbox02.BTCPrevTxOutputRequest 26, // 33: shiftcrypto.bitbox02.BTCRequest.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageRequest - 38, // 34: shiftcrypto.bitbox02.BTCRequest.antiklepto_signature:type_name -> shiftcrypto.bitbox02.AntiKleptoSignatureRequest + 40, // 34: shiftcrypto.bitbox02.BTCRequest.antiklepto_signature:type_name -> shiftcrypto.bitbox02.AntiKleptoSignatureRequest 25, // 35: shiftcrypto.bitbox02.BTCRequest.payment_request:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest 11, // 36: shiftcrypto.bitbox02.BTCRequest.xpubs:type_name -> shiftcrypto.bitbox02.BTCXpubsRequest 18, // 37: shiftcrypto.bitbox02.BTCResponse.success:type_name -> shiftcrypto.bitbox02.BTCSuccess 20, // 38: shiftcrypto.bitbox02.BTCResponse.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredResponse 14, // 39: shiftcrypto.bitbox02.BTCResponse.sign_next:type_name -> shiftcrypto.bitbox02.BTCSignNextResponse 27, // 40: shiftcrypto.bitbox02.BTCResponse.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageResponse - 36, // 41: shiftcrypto.bitbox02.BTCResponse.antiklepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment - 39, // 42: shiftcrypto.bitbox02.BTCResponse.pubs:type_name -> shiftcrypto.bitbox02.PubsResponse - 40, // 43: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.xpubs:type_name -> shiftcrypto.bitbox02.XPub + 38, // 41: shiftcrypto.bitbox02.BTCResponse.antiklepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment + 41, // 42: shiftcrypto.bitbox02.BTCResponse.pubs:type_name -> shiftcrypto.bitbox02.PubsResponse + 42, // 43: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.xpubs:type_name -> shiftcrypto.bitbox02.XPub 3, // 44: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.script_type:type_name -> shiftcrypto.bitbox02.BTCScriptConfig.Multisig.ScriptType - 41, // 45: shiftcrypto.bitbox02.BTCScriptConfig.Policy.keys:type_name -> shiftcrypto.bitbox02.KeyOriginInfo + 43, // 45: shiftcrypto.bitbox02.BTCScriptConfig.Policy.keys:type_name -> shiftcrypto.bitbox02.KeyOriginInfo 34, // 46: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.text_memo:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo - 47, // [47:47] is the sub-list for method output_type - 47, // [47:47] is the sub-list for method input_type - 47, // [47:47] is the sub-list for extension type_name - 47, // [47:47] is the sub-list for extension extendee - 0, // [0:47] is the sub-list for field type_name + 35, // 47: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.coin_purchase_memo:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo + 36, // 48: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo.eth:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.CoinPurchaseMemo.EthAddressDerivation + 49, // [49:49] is the sub-list for method output_type + 49, // [49:49] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_btc_proto_init() } @@ -2862,6 +3028,10 @@ func file_btc_proto_init() { } file_btc_proto_msgTypes[24].OneofWrappers = []any{ (*BTCPaymentRequestRequest_Memo_TextMemo_)(nil), + (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_)(nil), + } + file_btc_proto_msgTypes[26].OneofWrappers = []any{ + (*BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_Eth)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -2869,7 +3039,7 @@ func file_btc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_btc_proto_rawDesc), len(file_btc_proto_rawDesc)), NumEnums: 9, - NumMessages: 26, + NumMessages: 28, NumExtensions: 0, NumServices: 0, }, diff --git a/api/firmware/messages/btc.proto b/api/firmware/messages/btc.proto index bee46ad..97ed257 100644 --- a/api/firmware/messages/btc.proto +++ b/api/firmware/messages/btc.proto @@ -246,8 +246,22 @@ message BTCPaymentRequestRequest { message TextMemo { string note = 1; } + message CoinPurchaseMemo { + uint32 coin_type = 1; // SLIP-44 coin type + string amount = 2; // Human-readable amount (e.g. "0.25 ETH") + string address = 3; // Address to send the purchased coins to + // Derivation info for verifying address ownership. + // NOT part of the SLIP-24 sighash. + message EthAddressDerivation { + repeated uint32 keypath = 1; // Keypath to the address + } + oneof address_derivation { + EthAddressDerivation eth = 4; + } + } oneof memo { TextMemo text_memo = 1; + CoinPurchaseMemo coin_purchase_memo = 2; } } diff --git a/api/firmware/messages/cardano.pb.go b/api/firmware/messages/cardano.pb.go index 0bf1c78..53b75dc 100644 --- a/api/firmware/messages/cardano.pb.go +++ b/api/firmware/messages/cardano.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: cardano.proto package messages diff --git a/api/firmware/messages/common.pb.go b/api/firmware/messages/common.pb.go index 21459b7..82b264d 100644 --- a/api/firmware/messages/common.pb.go +++ b/api/firmware/messages/common.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: common.proto package messages diff --git a/api/firmware/messages/eth.pb.go b/api/firmware/messages/eth.pb.go index 23beb82..eac94a1 100644 --- a/api/firmware/messages/eth.pb.go +++ b/api/firmware/messages/eth.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: eth.proto package messages diff --git a/api/firmware/messages/hww.pb.go b/api/firmware/messages/hww.pb.go index 8f38d28..315d52f 100644 --- a/api/firmware/messages/hww.pb.go +++ b/api/firmware/messages/hww.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: hww.proto package messages diff --git a/api/firmware/messages/keystore.pb.go b/api/firmware/messages/keystore.pb.go index ef2563d..e608ec1 100644 --- a/api/firmware/messages/keystore.pb.go +++ b/api/firmware/messages/keystore.pb.go @@ -5,8 +5,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: keystore.proto package messages diff --git a/api/firmware/messages/mnemonic.pb.go b/api/firmware/messages/mnemonic.pb.go index ca26bc6..d63955d 100644 --- a/api/firmware/messages/mnemonic.pb.go +++ b/api/firmware/messages/mnemonic.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: mnemonic.proto package messages diff --git a/api/firmware/messages/perform_attestation.pb.go b/api/firmware/messages/perform_attestation.pb.go index 1c3ed23..c1eb511 100644 --- a/api/firmware/messages/perform_attestation.pb.go +++ b/api/firmware/messages/perform_attestation.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: perform_attestation.proto package messages diff --git a/api/firmware/messages/system.pb.go b/api/firmware/messages/system.pb.go index 28b16b4..3f6623b 100644 --- a/api/firmware/messages/system.pb.go +++ b/api/firmware/messages/system.pb.go @@ -2,8 +2,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 +// protoc-gen-go v1.36.10 +// protoc v6.33.1 // source: system.proto package messages From 7231f9c2d66e712b8845168ce4236b718227ea10 Mon Sep 17 00:00:00 2001 From: cedwies Date: Thu, 26 Feb 2026 10:04:36 +0100 Subject: [PATCH 2/2] Add coin purchase memo support --- api/firmware/paymentrequests.go | 8 +++++ api/firmware/paymentrequests_test.go | 48 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 api/firmware/paymentrequests_test.go diff --git a/api/firmware/paymentrequests.go b/api/firmware/paymentrequests.go index 00bc730..e4558bc 100644 --- a/api/firmware/paymentrequests.go +++ b/api/firmware/paymentrequests.go @@ -44,6 +44,14 @@ func ComputePaymentRequestSighash( case *messages.BTCPaymentRequestRequest_Memo_TextMemo_: _ = binary.Write(sighash, binary.LittleEndian, uint32(1)) hashDataLenPrefixed(sighash, []byte(m.TextMemo.Note)) + case *messages.BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_: + // CoinPurchaseMemo type = 3 in SLIP-24 (not the protobuf field number!) + _ = binary.Write(sighash, binary.LittleEndian, uint32(3)) + // Hash the SLIP-24 fields: coin_type, amount, address + _ = binary.Write(sighash, binary.LittleEndian, m.CoinPurchaseMemo.CoinType) + hashDataLenPrefixed(sighash, []byte(m.CoinPurchaseMemo.Amount)) + hashDataLenPrefixed(sighash, []byte(m.CoinPurchaseMemo.Address)) + // Note: address_derivation field is NOT hashed. default: return nil, errors.New("unsupported memo type") } diff --git a/api/firmware/paymentrequests_test.go b/api/firmware/paymentrequests_test.go new file mode 100644 index 0000000..9e6ef9d --- /dev/null +++ b/api/firmware/paymentrequests_test.go @@ -0,0 +1,48 @@ +package firmware + +import ( + "encoding/hex" + "testing" + + "github.com/BitBoxSwiss/bitbox02-api-go/api/firmware/messages" + "github.com/stretchr/testify/require" +) + +// TODO: Add integration test for CoinPurchaseMemo once the firmware UI is implemented. +// potentially in psbt_test.go + +func TestComputePaymentRequestSighash_CoinPurchaseMemo(t *testing.T) { + // This test verifies that our Go sighash computation matches the firmware's Rust implementation. + // The expected hash comes from a firmware test. + paymentRequest := &messages.BTCPaymentRequestRequest{ + RecipientName: "Merchant", + Memos: []*messages.BTCPaymentRequestRequest_Memo{ + { + Memo: &messages.BTCPaymentRequestRequest_Memo_CoinPurchaseMemo_{ + CoinPurchaseMemo: &messages.BTCPaymentRequestRequest_Memo_CoinPurchaseMemo{ + CoinType: 60, // Ethereum + Amount: "0.25 ETH", + Address: "0xabc1234567890", + // address_derivation is intentionally nil, since it's not part of the sighash + }, + }, + }, + }, + Nonce: []byte{}, + TotalAmount: 123456, + Signature: []byte{}, + } + + sighash, err := ComputePaymentRequestSighash( + paymentRequest, + 1, // SLIP-44 coin type for Bitcoin Testnet + 123456, + "tb1q2q0j6gmfxynj40p0kxsr9jkagcvgpuqvqynnup", + ) + require.NoError(t, err) + + expectedHash := "1806caf7c518aad69eb38f25fd418d507c6a3e01719a7d77be94cd50a2790872" + actualHash := hex.EncodeToString(sighash) + + require.Equal(t, expectedHash, actualHash, "Sighash mismatch: Go implementation doesn't match firmware") +}