diff --git a/api/firmware/btc.go b/api/firmware/btc.go index bd16773..cd715b2 100644 --- a/api/firmware/btc.go +++ b/api/firmware/btc.go @@ -256,6 +256,16 @@ type BTCTxInput struct { // PrevTx must be the transaction referenced by Input.PrevOutHash. Can be nil if // `BTCSignNeedsPrevTxs()` returns false. PrevTx *BTCPrevTx + // Required for silent payment address verification. + // + // Public key according to + // https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki#user-content-Inputs_For_Shared_Secret_Derivation. + // Must be 33 bytes for a regular pubkey, and 32 bytes in case of a Taproot x-only output + // pubkey. + // + // IMPORTANT: for Taproot inputs, you must provide the 32 byte x-only pubkey, not a 33 byte + // pubkey, otherwise the parity of the Y coordinate could be wrong. + BIP352Pubkey []byte } // BTCTx is the data needed to sign a btc transaction. @@ -276,31 +286,41 @@ func (device *Device) BTCSign( scriptConfigs []*messages.BTCScriptConfigWithKeypath, tx *BTCTx, formatUnit messages.BTCSignInitRequest_FormatUnit, -) ([][]byte, error) { +) ([][]byte, map[int][]byte, error) { + generatedOutputs := map[int][]byte{} if !device.version.AtLeast(semver.NewSemVer(9, 10, 0)) { for _, sc := range scriptConfigs { if isTaproot(sc) { - return nil, UnsupportedError("9.10.0") + return nil, nil, UnsupportedError("9.10.0") } } } supportsAntiklepto := device.version.AtLeast(semver.NewSemVer(9, 4, 0)) + containsSilentPaymentOutputs := false + for _, output := range tx.Outputs { + if output.SilentPayment != nil { + containsSilentPaymentOutputs = true + break + } + } + signatures := make([][]byte, len(tx.Inputs)) next, err := device.queryBtcSign(&messages.Request{ Request: &messages.Request_BtcSignInit{ BtcSignInit: &messages.BTCSignInitRequest{ - Coin: coin, - ScriptConfigs: scriptConfigs, - Version: tx.Version, - NumInputs: uint32(len(tx.Inputs)), - NumOutputs: uint32(len(tx.Outputs)), - Locktime: tx.Locktime, - FormatUnit: formatUnit, + Coin: coin, + ScriptConfigs: scriptConfigs, + Version: tx.Version, + NumInputs: uint32(len(tx.Inputs)), + NumOutputs: uint32(len(tx.Outputs)), + Locktime: tx.Locktime, + FormatUnit: formatUnit, + ContainsSilentPaymentOutputs: containsSilentPaymentOutputs, }}}) if err != nil { - return nil, err + return nil, nil, err } isInputsPass2 := false @@ -319,7 +339,7 @@ func (device *Device) BTCSign( if performAntiklepto { nonce, err := generateHostNonce() if err != nil { - return nil, err + return nil, nil, err } hostNonce = nonce input.HostNonceCommitment = &messages.AntiKleptoHostNonceCommitment{ @@ -331,12 +351,12 @@ func (device *Device) BTCSign( BtcSignInput: input, }}) if err != nil { - return nil, err + return nil, nil, err } if performAntiklepto { if next.Type != messages.BTCSignNextResponse_HOST_NONCE || next.AntiKleptoSignerCommitment == nil { - return nil, errp.New("unexpected response; expected signer nonce commitment") + return nil, nil, errp.New("unexpected response; expected signer nonce commitment") } signerCommitment := next.AntiKleptoSignerCommitment.Commitment next, err = device.nestedQueryBtcSign( @@ -348,7 +368,7 @@ func (device *Device) BTCSign( }, }) if err != nil { - return nil, err + return nil, nil, err } err := antikleptoVerify( hostNonce, @@ -356,12 +376,12 @@ func (device *Device) BTCSign( next.Signature, ) if err != nil { - return nil, err + return nil, nil, err } } if isInputsPass2 { if !next.HasSignature { - return nil, errp.New("unexpected response; expected signature") + return nil, nil, errp.New("unexpected response; expected signature") } signatures[inputIndex] = next.Signature } @@ -383,7 +403,7 @@ func (device *Device) BTCSign( }, }) if err != nil { - return nil, err + return nil, nil, err } case messages.BTCSignNextResponse_PREVTX_INPUT: prevtxInput := tx.Inputs[next.Index].PrevTx.Inputs[next.PrevIndex] @@ -394,7 +414,7 @@ func (device *Device) BTCSign( }, }) if err != nil { - return nil, err + return nil, nil, err } case messages.BTCSignNextResponse_PREVTX_OUTPUT: prevtxOutput := tx.Inputs[next.Index].PrevTx.Outputs[next.PrevIndex] @@ -405,7 +425,7 @@ func (device *Device) BTCSign( }, }) if err != nil { - return nil, err + return nil, nil, err } case messages.BTCSignNextResponse_OUTPUT: outputIndex := next.Index @@ -414,12 +434,24 @@ func (device *Device) BTCSign( BtcSignOutput: tx.Outputs[outputIndex], }}) if err != nil { - return nil, err + return nil, nil, err + } + if next.GeneratedOutputPkscript != nil { + generatedOutputs[int(outputIndex)] = next.GeneratedOutputPkscript + err := silentPaymentOutputVerify( + tx, + int(outputIndex), + next.SilentPaymentDleqProof, + next.GeneratedOutputPkscript, + ) + if err != nil { + return nil, nil, err + } } case messages.BTCSignNextResponse_PAYMENT_REQUEST: paymentRequestIndex := next.Index if int(paymentRequestIndex) >= len(tx.PaymentRequests) { - return nil, errp.New("payment request index out of bounds") + return nil, nil, errp.New("payment request index out of bounds") } paymentRequest := tx.PaymentRequests[paymentRequestIndex] next, err = device.nestedQueryBtcSign( @@ -430,10 +462,10 @@ func (device *Device) BTCSign( }, ) if err != nil { - return nil, err + return nil, nil, err } case messages.BTCSignNextResponse_DONE: - return signatures, nil + return signatures, generatedOutputs, nil } } } diff --git a/api/firmware/btc_test.go b/api/firmware/btc_test.go index 5cf0572..1d35884 100644 --- a/api/firmware/btc_test.go +++ b/api/firmware/btc_test.go @@ -23,6 +23,7 @@ import ( "github.com/BitBoxSwiss/bitbox02-api-go/util/semver" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/hdkeychain" "github.com/btcsuite/btcd/chaincfg" @@ -330,12 +331,12 @@ func TestBTCSignMessage(t *testing.T) { }) } -func makeTaprootOutput(t *testing.T, pubkey *btcec.PublicKey) []byte { +func makeTaprootOutput(t *testing.T, pubkey *btcec.PublicKey) (*btcec.PublicKey, []byte) { t.Helper() outputKey := txscript.ComputeTaprootKeyNoScript(pubkey) outputPkScript, err := txscript.PayToTaprootScript(outputKey) require.NoError(t, err) - return outputPkScript + return outputKey, outputPkScript } // Test signing; all inputs are BIP86 Taproot keyspends. @@ -348,8 +349,8 @@ func TestSimulatorBTCSignTaprootKeySpend(t *testing.T) { input2Keypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart, 0, 1} changeKeypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart, 1, 0} - input1PkScript := makeTaprootOutput(t, simulatorPub(t, device, inputKeypath...)) - input2PkScript := makeTaprootOutput(t, simulatorPub(t, device, input2Keypath...)) + _, input1PkScript := makeTaprootOutput(t, simulatorPub(t, device, inputKeypath...)) + _, input2PkScript := makeTaprootOutput(t, simulatorPub(t, device, input2Keypath...)) prevTx := &wire.MsgTx{ Version: 2, @@ -381,7 +382,7 @@ func TestSimulatorBTCSignTaprootKeySpend(t *testing.T) { require.False(t, BTCSignNeedsPrevTxs(scriptConfigs)) prevTxHash := prevTx.TxHash() - _, err := device.BTCSign( + _, _, err := device.BTCSign( coin, scriptConfigs, &BTCTx{ @@ -452,7 +453,8 @@ func TestSimulatorBTCSignMixed(t *testing.T) { { Value: 100_000_000, PkScript: func() []byte { - return makeTaprootOutput(t, simulatorPub(t, device, input0Keypath...)) + _, script := makeTaprootOutput(t, simulatorPub(t, device, input0Keypath...)) + return script }(), }, { @@ -508,7 +510,7 @@ func TestSimulatorBTCSignMixed(t *testing.T) { require.True(t, BTCSignNeedsPrevTxs(scriptConfigs)) prevTxHash := prevTx.TxHash() - _, err := device.BTCSign( + _, _, err := device.BTCSign( coin, scriptConfigs, &BTCTx{ @@ -567,3 +569,105 @@ func TestSimulatorBTCSignMixed(t *testing.T) { require.NoError(t, err) }) } + +// Test that we can send to a silent payment output (generated by the BitBox) and verify the +// corresponding DLEQ proof on the host that the output was generated correctly. +func TestSimulatorBTCSignSilentPayment(t *testing.T) { + testInitializedSimulators(t, func(t *testing.T, device *Device) { + t.Helper() + coin := messages.BTCCoin_BTC + accountKeypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart} + input1Keypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart, 0, 0} + input2Keypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart, 0, 1} + changeKeypath := []uint32{86 + hardenedKeyStart, 0 + hardenedKeyStart, 0 + hardenedKeyStart, 1, 0} + input1Pubkey := simulatorPub(t, device, input1Keypath...) + input2Pubkey := simulatorPub(t, device, input2Keypath...) + input1OutputKey, input1PkScript := makeTaprootOutput(t, input1Pubkey) + input2OutputKey, input2PkScript := makeTaprootOutput(t, input2Pubkey) + + prevTx := &wire.MsgTx{ + Version: 2, + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: *mustOutpoint("3131313131313131313131313131313131313131313131313131313131313131:0"), + Sequence: 0xFFFFFFFF, + }, + }, + TxOut: []*wire.TxOut{ + { + Value: 60_000_000, + PkScript: input1PkScript, + }, + { + Value: 40_000_000, + PkScript: input2PkScript, + }, + }, + LockTime: 0, + } + prevTxHash := prevTx.TxHash() + _, generatedOutputs, err := device.BTCSign( + coin, + []*messages.BTCScriptConfigWithKeypath{ + { + ScriptConfig: NewBTCScriptConfigSimple(messages.BTCScriptConfig_P2TR), + Keypath: accountKeypath, + }, + }, + &BTCTx{ + Version: 2, + Inputs: []*BTCTxInput{ + { + Input: &messages.BTCSignInputRequest{ + PrevOutHash: prevTxHash[:], + PrevOutIndex: 0, + PrevOutValue: uint64(prevTx.TxOut[0].Value), + Sequence: 0xFFFFFFFF, + Keypath: input1Keypath, + ScriptConfigIndex: 0, + }, + BIP352Pubkey: schnorr.SerializePubKey(input1OutputKey), + }, + { + Input: &messages.BTCSignInputRequest{ + PrevOutHash: prevTxHash[:], + PrevOutIndex: 1, + PrevOutValue: uint64(prevTx.TxOut[1].Value), + Sequence: 0xFFFFFFFF, + Keypath: input2Keypath, + ScriptConfigIndex: 0, + }, + BIP352Pubkey: schnorr.SerializePubKey(input2OutputKey), + }, + }, + Outputs: []*messages.BTCSignOutputRequest{ + { + Ours: true, + Value: 70_000_000, + Keypath: changeKeypath, + }, + { + Value: 20_000_000, + SilentPayment: &messages.BTCSignOutputRequest_SilentPayment{ + Address: "sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv", + }, + }, + }, + Locktime: 0, + }, + messages.BTCSignInitRequest_DEFAULT, + ) + + if device.version.AtLeast(semver.NewSemVer(9, 21, 0)) { + require.NoError(t, err) + require.Equal(t, + map[int][]byte{ + 1: unhex("5120f99b8e8d97aa7b068dd7b4e7ae31f51784f5c2a0cae280748cfd23832b7dcba7"), + }, + generatedOutputs, + ) + } else { + require.Error(t, err) + } + }) +} diff --git a/api/firmware/messages/antiklepto.pb.go b/api/firmware/messages/antiklepto.pb.go index 652b4ad..773931d 100644 --- a/api/firmware/messages/antiklepto.pb.go +++ b/api/firmware/messages/antiklepto.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: antiklepto.proto package messages diff --git a/api/firmware/messages/backup_commands.pb.go b/api/firmware/messages/backup_commands.pb.go index 93b1cad..8fcf58e 100644 --- a/api/firmware/messages/backup_commands.pb.go +++ b/api/firmware/messages/backup_commands.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // 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 003337f..05a575a 100644 --- a/api/firmware/messages/bitbox02_system.pb.go +++ b/api/firmware/messages/bitbox02_system.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: bitbox02_system.proto package messages diff --git a/api/firmware/messages/btc.pb.go b/api/firmware/messages/btc.pb.go index 792e0e9..d80ba25 100644 --- a/api/firmware/messages/btc.pb.go +++ b/api/firmware/messages/btc.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: btc.proto package messages @@ -734,12 +734,13 @@ type BTCSignInitRequest struct { Coin BTCCoin `protobuf:"varint,1,opt,name=coin,proto3,enum=shiftcrypto.bitbox02.BTCCoin" json:"coin,omitempty"` // used script configs in inputs and changes - ScriptConfigs []*BTCScriptConfigWithKeypath `protobuf:"bytes,2,rep,name=script_configs,json=scriptConfigs,proto3" json:"script_configs,omitempty"` - Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` // must be 1 or 2 - NumInputs uint32 `protobuf:"varint,5,opt,name=num_inputs,json=numInputs,proto3" json:"num_inputs,omitempty"` - NumOutputs uint32 `protobuf:"varint,6,opt,name=num_outputs,json=numOutputs,proto3" json:"num_outputs,omitempty"` - Locktime uint32 `protobuf:"varint,7,opt,name=locktime,proto3" json:"locktime,omitempty"` // must be <500000000 - FormatUnit BTCSignInitRequest_FormatUnit `protobuf:"varint,8,opt,name=format_unit,json=formatUnit,proto3,enum=shiftcrypto.bitbox02.BTCSignInitRequest_FormatUnit" json:"format_unit,omitempty"` + ScriptConfigs []*BTCScriptConfigWithKeypath `protobuf:"bytes,2,rep,name=script_configs,json=scriptConfigs,proto3" json:"script_configs,omitempty"` + Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` // must be 1 or 2 + NumInputs uint32 `protobuf:"varint,5,opt,name=num_inputs,json=numInputs,proto3" json:"num_inputs,omitempty"` + NumOutputs uint32 `protobuf:"varint,6,opt,name=num_outputs,json=numOutputs,proto3" json:"num_outputs,omitempty"` + Locktime uint32 `protobuf:"varint,7,opt,name=locktime,proto3" json:"locktime,omitempty"` // must be <500000000 + FormatUnit BTCSignInitRequest_FormatUnit `protobuf:"varint,8,opt,name=format_unit,json=formatUnit,proto3,enum=shiftcrypto.bitbox02.BTCSignInitRequest_FormatUnit" json:"format_unit,omitempty"` + ContainsSilentPaymentOutputs bool `protobuf:"varint,9,opt,name=contains_silent_payment_outputs,json=containsSilentPaymentOutputs,proto3" json:"contains_silent_payment_outputs,omitempty"` } func (x *BTCSignInitRequest) Reset() { @@ -823,6 +824,13 @@ func (x *BTCSignInitRequest) GetFormatUnit() BTCSignInitRequest_FormatUnit { return BTCSignInitRequest_DEFAULT } +func (x *BTCSignInitRequest) GetContainsSilentPaymentOutputs() bool { + if x != nil { + return x.ContainsSilentPaymentOutputs + } + return false +} + type BTCSignNextResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -837,6 +845,9 @@ type BTCSignNextResponse struct { // Previous tx's input/output index in case of PREV_INPUT or PREV_OUTPUT, for the input at `index`. PrevIndex uint32 `protobuf:"varint,5,opt,name=prev_index,json=prevIndex,proto3" json:"prev_index,omitempty"` AntiKleptoSignerCommitment *AntiKleptoSignerCommitment `protobuf:"bytes,6,opt,name=anti_klepto_signer_commitment,json=antiKleptoSignerCommitment,proto3" json:"anti_klepto_signer_commitment,omitempty"` + // Generated output. The host *must* verify its correctness using silent_payment_dleq_proof. + GeneratedOutputPkscript []byte `protobuf:"bytes,7,opt,name=generated_output_pkscript,json=generatedOutputPkscript,proto3" json:"generated_output_pkscript,omitempty"` + SilentPaymentDleqProof []byte `protobuf:"bytes,8,opt,name=silent_payment_dleq_proof,json=silentPaymentDleqProof,proto3" json:"silent_payment_dleq_proof,omitempty"` } func (x *BTCSignNextResponse) Reset() { @@ -913,6 +924,20 @@ func (x *BTCSignNextResponse) GetAntiKleptoSignerCommitment() *AntiKleptoSignerC return nil } +func (x *BTCSignNextResponse) GetGeneratedOutputPkscript() []byte { + if x != nil { + return x.GeneratedOutputPkscript + } + return nil +} + +func (x *BTCSignNextResponse) GetSilentPaymentDleqProof() []byte { + if x != nil { + return x.SilentPaymentDleqProof + } + return nil +} + type BTCSignInputRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1023,6 +1048,9 @@ type BTCSignOutputRequest struct { // If ours is true. References a script config from BTCSignInitRequest ScriptConfigIndex uint32 `protobuf:"varint,6,opt,name=script_config_index,json=scriptConfigIndex,proto3" json:"script_config_index,omitempty"` PaymentRequestIndex *uint32 `protobuf:"varint,7,opt,name=payment_request_index,json=paymentRequestIndex,proto3,oneof" json:"payment_request_index,omitempty"` + // If provided, `type` and `payload` is ignored. The generated output pkScript is returned in + // BTCSignNextResponse. `contains_silent_payment_outputs` in the init request must be true. + SilentPayment *BTCSignOutputRequest_SilentPayment `protobuf:"bytes,8,opt,name=silent_payment,json=silentPayment,proto3" json:"silent_payment,omitempty"` } func (x *BTCSignOutputRequest) Reset() { @@ -1106,6 +1134,13 @@ func (x *BTCSignOutputRequest) GetPaymentRequestIndex() uint32 { return 0 } +func (x *BTCSignOutputRequest) GetSilentPayment() *BTCSignOutputRequest_SilentPayment { + if x != nil { + return x.SilentPayment + } + return nil +} + type BTCScriptConfigRegistration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2181,6 +2216,54 @@ func (x *BTCScriptConfig_Policy) GetKeys() []*KeyOriginInfo { return nil } +// https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki +type BTCSignOutputRequest_SilentPayment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (x *BTCSignOutputRequest_SilentPayment) Reset() { + *x = BTCSignOutputRequest_SilentPayment{} + if protoimpl.UnsafeEnabled { + mi := &file_btc_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BTCSignOutputRequest_SilentPayment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BTCSignOutputRequest_SilentPayment) ProtoMessage() {} + +func (x *BTCSignOutputRequest_SilentPayment) ProtoReflect() protoreflect.Message { + mi := &file_btc_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BTCSignOutputRequest_SilentPayment.ProtoReflect.Descriptor instead. +func (*BTCSignOutputRequest_SilentPayment) Descriptor() ([]byte, []int) { + return file_btc_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *BTCSignOutputRequest_SilentPayment) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + type BTCPaymentRequestRequest_Memo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2195,7 +2278,7 @@ type BTCPaymentRequestRequest_Memo struct { func (x *BTCPaymentRequestRequest_Memo) Reset() { *x = BTCPaymentRequestRequest_Memo{} if protoimpl.UnsafeEnabled { - mi := &file_btc_proto_msgTypes[22] + mi := &file_btc_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2208,7 +2291,7 @@ func (x *BTCPaymentRequestRequest_Memo) String() string { func (*BTCPaymentRequestRequest_Memo) ProtoMessage() {} func (x *BTCPaymentRequestRequest_Memo) ProtoReflect() protoreflect.Message { - mi := &file_btc_proto_msgTypes[22] + mi := &file_btc_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2259,7 +2342,7 @@ type BTCPaymentRequestRequest_Memo_TextMemo struct { func (x *BTCPaymentRequestRequest_Memo_TextMemo) Reset() { *x = BTCPaymentRequestRequest_Memo_TextMemo{} if protoimpl.UnsafeEnabled { - mi := &file_btc_proto_msgTypes[23] + mi := &file_btc_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2272,7 +2355,7 @@ func (x *BTCPaymentRequestRequest_Memo_TextMemo) String() string { func (*BTCPaymentRequestRequest_Memo_TextMemo) ProtoMessage() {} func (x *BTCPaymentRequestRequest_Memo_TextMemo) ProtoReflect() protoreflect.Message { - mi := &file_btc_proto_msgTypes[23] + mi := &file_btc_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2379,7 +2462,7 @@ var file_btc_proto_rawDesc = []byte{ 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, - 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x22, 0x90, 0x03, 0x0a, 0x12, 0x42, 0x54, 0x43, 0x53, 0x69, + 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x22, 0xd7, 0x03, 0x0a, 0x12, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, @@ -2402,279 +2485,299 @@ var file_btc_proto_rawDesc = []byte{ 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x55, 0x6e, 0x69, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x55, - 0x6e, 0x69, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x53, 0x41, 0x54, 0x10, 0x01, 0x22, 0xcb, 0x03, 0x0a, 0x13, 0x42, 0x54, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x5f, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0a, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, + 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x41, 0x54, 0x10, 0x01, + 0x22, 0xc2, 0x04, 0x0a, 0x13, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x78, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2e, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, - 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x65, - 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x68, - 0x61, 0x73, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x73, 0x0a, - 0x1d, 0x61, 0x6e, 0x74, 0x69, 0x5f, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x5f, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, - 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, - 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x82, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x4e, 0x50, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, - 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x50, 0x52, 0x45, 0x56, 0x54, 0x58, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, - 0x0c, 0x50, 0x52, 0x45, 0x56, 0x54, 0x58, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, - 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x45, 0x56, 0x54, 0x58, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, - 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x4f, 0x53, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x43, 0x45, - 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, - 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x07, 0x22, 0xce, 0x02, 0x0a, 0x13, 0x42, 0x54, 0x43, 0x53, - 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x65, - 0x76, 0x4f, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x67, 0x0a, 0x15, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, - 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x13, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x14, 0x42, 0x54, 0x43, - 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x13, 0x70, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x88, 0x01, - 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xb6, 0x01, 0x0a, 0x1b, + 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x73, 0x0a, 0x1d, 0x61, 0x6e, 0x74, 0x69, 0x5f, 0x6b, 0x6c, 0x65, + 0x70, 0x74, 0x6f, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, + 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, + 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x6b, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x17, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x6b, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x5f, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6c, 0x65, 0x71, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x6c, 0x65, 0x71, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0x82, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x50, + 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, + 0x45, 0x56, 0x54, 0x58, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, + 0x52, 0x45, 0x56, 0x54, 0x58, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x11, 0x0a, + 0x0d, 0x50, 0x52, 0x45, 0x56, 0x54, 0x58, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x10, 0x05, + 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x4f, 0x53, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x10, 0x06, + 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x45, 0x53, 0x54, 0x10, 0x07, 0x22, 0xce, 0x02, 0x0a, 0x13, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, + 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, + 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, + 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x67, 0x0a, + 0x15, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, + 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x13, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xbc, 0x03, 0x0a, 0x14, 0x42, 0x54, 0x43, 0x53, 0x69, + 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, + 0x75, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, + 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, + 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x13, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x88, 0x01, 0x01, 0x12, + 0x5f, 0x0a, 0x0e, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, + 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0d, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x1a, 0x29, 0x0a, 0x0d, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xb6, 0x01, 0x0a, 0x1b, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x43, 0x6f, + 0x69, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, + 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x22, 0x0c, + 0x0a, 0x0a, 0x42, 0x54, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x7b, 0x0a, 0x22, + 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x55, 0x0a, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x63, - 0x6f, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, 0x68, 0x69, 0x66, - 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, - 0x2e, 0x42, 0x54, 0x43, 0x43, 0x6f, 0x69, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x12, 0x4a, - 0x0a, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, - 0x79, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6b, 0x65, 0x79, - 0x70, 0x61, 0x74, 0x68, 0x22, 0x0c, 0x0a, 0x0a, 0x42, 0x54, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x22, 0x7b, 0x0a, 0x22, 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x0c, 0x72, 0x65, 0x67, 0x69, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x23, 0x42, 0x54, 0x43, + 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x1e, 0x42, 0x54, 0x43, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x4a, 0x0a, 0x23, 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, - 0x73, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x1e, - 0x42, 0x54, 0x43, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, - 0x0a, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x09, 0x78, 0x70, 0x75, - 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x73, - 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x58, 0x50, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x78, 0x70, 0x75, - 0x62, 0x54, 0x79, 0x70, 0x65, 0x22, 0x31, 0x0a, 0x08, 0x58, 0x50, 0x75, 0x62, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x52, - 0x55, 0x4d, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x58, 0x50, 0x55, - 0x42, 0x5f, 0x54, 0x50, 0x55, 0x42, 0x10, 0x01, 0x22, 0x8c, 0x01, 0x0a, 0x14, 0x42, 0x54, 0x43, - 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x6e, 0x75, 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x6e, 0x75, 0x6d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x42, 0x54, 0x43, 0x50, - 0x72, 0x65, 0x76, 0x54, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, - 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, - 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x22, 0x53, 0x0a, 0x16, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xf1, 0x02, 0x0a, 0x18, 0x42, 0x54, 0x43, 0x50, + 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x09, 0x78, 0x70, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, + 0x43, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x50, 0x75, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x78, 0x70, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x22, + 0x31, 0x0a, 0x08, 0x58, 0x50, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x41, + 0x55, 0x54, 0x4f, 0x5f, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x52, 0x55, 0x4d, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x58, 0x50, 0x55, 0x42, 0x5f, 0x54, 0x50, 0x55, 0x42, + 0x10, 0x01, 0x22, 0x8c, 0x01, 0x0a, 0x14, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, + 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x53, 0x0a, 0x16, + 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x22, 0xf1, 0x02, 0x0a, 0x18, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, - 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x68, 0x69, - 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, - 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, - 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x1a, 0x8b, 0x01, - 0x0a, 0x04, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x5b, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, 0x68, 0x69, 0x66, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x1a, 0x8b, 0x01, 0x0a, 0x04, 0x4d, 0x65, 0x6d, 0x6f, + 0x12, 0x5b, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6d, + 0x6f, 0x48, 0x00, 0x52, 0x08, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x1a, 0x1e, 0x0a, + 0x08, 0x54, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x06, 0x0a, + 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x22, 0x9c, 0x02, 0x0a, 0x15, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, + 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, + 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x43, 0x6f, 0x69, 0x6e, 0x52, 0x04, 0x63, 0x6f, + 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, - 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x2e, 0x54, - 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x48, 0x00, 0x52, 0x08, 0x74, 0x65, 0x78, 0x74, 0x4d, - 0x65, 0x6d, 0x6f, 0x1a, 0x1e, 0x0a, 0x08, 0x54, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x6f, 0x74, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x22, 0x9c, 0x02, 0x0a, 0x15, - 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x43, 0x6f, - 0x69, 0x6e, 0x52, 0x04, 0x63, 0x6f, 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x0d, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, - 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x57, 0x69, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x70, 0x61, 0x74, - 0x68, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, - 0x67, 0x12, 0x67, 0x0a, 0x15, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, - 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, - 0x74, 0x6f, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x13, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x36, 0x0a, 0x16, 0x42, 0x54, - 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x22, 0x8a, 0x06, 0x0a, 0x0a, 0x42, 0x54, 0x43, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x79, 0x0a, 0x1b, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, + 0x2e, 0x42, 0x54, 0x43, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x57, 0x69, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x70, 0x61, 0x74, 0x68, 0x52, 0x0c, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x67, 0x0a, 0x15, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, + 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x48, 0x6f, 0x73, 0x74, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x13, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x36, 0x0a, 0x16, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x8a, 0x06, 0x0a, + 0x0a, 0x42, 0x54, 0x43, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x79, 0x0a, 0x1b, 0x69, + 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, + 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x18, 0x69, 0x73, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x6c, 0x0a, 0x16, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, - 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x18, 0x69, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x6c, 0x0a, 0x16, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, + 0x43, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, + 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x49, + 0x6e, 0x69, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x5f, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, + 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0b, 0x70, 0x72, - 0x65, 0x76, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, - 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, - 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x76, 0x74, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x70, 0x72, 0x65, - 0x76, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, - 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, - 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x70, - 0x72, 0x65, 0x76, 0x74, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, - 0x76, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x74, 0x78, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x50, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, - 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x65, 0x0a, 0x14, 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, - 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, - 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, - 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x13, 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x59, 0x0a, 0x0f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xe6, 0x03, 0x0a, 0x0b, 0x42, 0x54, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3c, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, - 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x7a, 0x0a, - 0x1b, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x18, 0x69, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, + 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x72, 0x65, 0x76, 0x54, 0x78, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, + 0x65, 0x76, 0x74, 0x78, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x73, 0x69, + 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, + 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x65, 0x0a, 0x14, + 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, + 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x13, + 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x59, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x4e, - 0x65, 0x78, 0x74, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x68, 0x69, 0x66, - 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, - 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x74, 0x0a, 0x1c, 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, - 0x65, 0x70, 0x74, 0x6f, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, + 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x09, + 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x0b, 0x42, 0x54, + 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, + 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x7a, 0x0a, 0x1b, 0x69, 0x73, 0x5f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x1a, 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2f, 0x0a, 0x07, 0x42, 0x54, 0x43, 0x43, - 0x6f, 0x69, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x54, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, - 0x54, 0x42, 0x54, 0x43, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x43, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x54, 0x4c, 0x54, 0x43, 0x10, 0x03, 0x2a, 0x52, 0x0a, 0x0d, 0x42, 0x54, 0x43, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x32, 0x50, 0x4b, 0x48, - 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x32, 0x53, 0x48, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, - 0x50, 0x32, 0x57, 0x50, 0x4b, 0x48, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x32, 0x57, 0x53, - 0x48, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x32, 0x54, 0x52, 0x10, 0x05, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x49, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x69, 0x73, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, + 0x43, 0x53, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x12, 0x51, 0x0a, + 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x42, 0x54, 0x43, 0x53, 0x69, + 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x74, 0x0a, 0x1c, 0x61, 0x6e, 0x74, 0x69, 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x5f, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x62, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x30, 0x32, 0x2e, 0x41, 0x6e, + 0x74, 0x69, 0x4b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x61, 0x6e, 0x74, 0x69, + 0x6b, 0x6c, 0x65, 0x70, 0x74, 0x6f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2a, 0x2f, 0x0a, 0x07, 0x42, 0x54, 0x43, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x07, 0x0a, + 0x03, 0x42, 0x54, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x42, 0x54, 0x43, 0x10, 0x01, + 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x43, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x4c, 0x54, + 0x43, 0x10, 0x03, 0x2a, 0x52, 0x0a, 0x0d, 0x42, 0x54, 0x43, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x32, 0x50, 0x4b, 0x48, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x50, 0x32, 0x53, 0x48, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x32, 0x57, 0x50, 0x4b, 0x48, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x32, 0x57, 0x53, 0x48, 0x10, 0x04, 0x12, 0x08, 0x0a, + 0x04, 0x50, 0x32, 0x54, 0x52, 0x10, 0x05, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2690,7 +2793,7 @@ func file_btc_proto_rawDescGZIP() []byte { } var file_btc_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_btc_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_btc_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_btc_proto_goTypes = []any{ (BTCCoin)(0), // 0: shiftcrypto.bitbox02.BTCCoin (BTCOutputType)(0), // 1: shiftcrypto.bitbox02.BTCOutputType @@ -2722,13 +2825,14 @@ var file_btc_proto_goTypes = []any{ (*BTCResponse)(nil), // 27: shiftcrypto.bitbox02.BTCResponse (*BTCScriptConfig_Multisig)(nil), // 28: shiftcrypto.bitbox02.BTCScriptConfig.Multisig (*BTCScriptConfig_Policy)(nil), // 29: shiftcrypto.bitbox02.BTCScriptConfig.Policy - (*BTCPaymentRequestRequest_Memo)(nil), // 30: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo - (*BTCPaymentRequestRequest_Memo_TextMemo)(nil), // 31: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo - (*AntiKleptoSignerCommitment)(nil), // 32: shiftcrypto.bitbox02.AntiKleptoSignerCommitment - (*AntiKleptoHostNonceCommitment)(nil), // 33: shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment - (*AntiKleptoSignatureRequest)(nil), // 34: shiftcrypto.bitbox02.AntiKleptoSignatureRequest - (*XPub)(nil), // 35: shiftcrypto.bitbox02.XPub - (*KeyOriginInfo)(nil), // 36: shiftcrypto.bitbox02.KeyOriginInfo + (*BTCSignOutputRequest_SilentPayment)(nil), // 30: shiftcrypto.bitbox02.BTCSignOutputRequest.SilentPayment + (*BTCPaymentRequestRequest_Memo)(nil), // 31: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo + (*BTCPaymentRequestRequest_Memo_TextMemo)(nil), // 32: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo + (*AntiKleptoSignerCommitment)(nil), // 33: shiftcrypto.bitbox02.AntiKleptoSignerCommitment + (*AntiKleptoHostNonceCommitment)(nil), // 34: shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + (*AntiKleptoSignatureRequest)(nil), // 35: shiftcrypto.bitbox02.AntiKleptoSignatureRequest + (*XPub)(nil), // 36: shiftcrypto.bitbox02.XPub + (*KeyOriginInfo)(nil), // 37: shiftcrypto.bitbox02.KeyOriginInfo } var file_btc_proto_depIdxs = []int32{ 2, // 0: shiftcrypto.bitbox02.BTCScriptConfig.simple_type:type_name -> shiftcrypto.bitbox02.BTCScriptConfig.SimpleType @@ -2742,40 +2846,41 @@ var file_btc_proto_depIdxs = []int32{ 10, // 8: shiftcrypto.bitbox02.BTCSignInitRequest.script_configs:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath 5, // 9: shiftcrypto.bitbox02.BTCSignInitRequest.format_unit:type_name -> shiftcrypto.bitbox02.BTCSignInitRequest.FormatUnit 6, // 10: shiftcrypto.bitbox02.BTCSignNextResponse.type:type_name -> shiftcrypto.bitbox02.BTCSignNextResponse.Type - 32, // 11: shiftcrypto.bitbox02.BTCSignNextResponse.anti_klepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment - 33, // 12: shiftcrypto.bitbox02.BTCSignInputRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + 33, // 11: shiftcrypto.bitbox02.BTCSignNextResponse.anti_klepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment + 34, // 12: shiftcrypto.bitbox02.BTCSignInputRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment 1, // 13: shiftcrypto.bitbox02.BTCSignOutputRequest.type:type_name -> shiftcrypto.bitbox02.BTCOutputType - 0, // 14: shiftcrypto.bitbox02.BTCScriptConfigRegistration.coin:type_name -> shiftcrypto.bitbox02.BTCCoin - 8, // 15: shiftcrypto.bitbox02.BTCScriptConfigRegistration.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfig - 15, // 16: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest.registration:type_name -> shiftcrypto.bitbox02.BTCScriptConfigRegistration - 15, // 17: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.registration:type_name -> shiftcrypto.bitbox02.BTCScriptConfigRegistration - 7, // 18: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.xpub_type:type_name -> shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.XPubType - 30, // 19: shiftcrypto.bitbox02.BTCPaymentRequestRequest.memos:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo - 0, // 20: shiftcrypto.bitbox02.BTCSignMessageRequest.coin:type_name -> shiftcrypto.bitbox02.BTCCoin - 10, // 21: shiftcrypto.bitbox02.BTCSignMessageRequest.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath - 33, // 22: shiftcrypto.bitbox02.BTCSignMessageRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment - 17, // 23: shiftcrypto.bitbox02.BTCRequest.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest - 19, // 24: shiftcrypto.bitbox02.BTCRequest.register_script_config:type_name -> shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest - 20, // 25: shiftcrypto.bitbox02.BTCRequest.prevtx_init:type_name -> shiftcrypto.bitbox02.BTCPrevTxInitRequest - 21, // 26: shiftcrypto.bitbox02.BTCRequest.prevtx_input:type_name -> shiftcrypto.bitbox02.BTCPrevTxInputRequest - 22, // 27: shiftcrypto.bitbox02.BTCRequest.prevtx_output:type_name -> shiftcrypto.bitbox02.BTCPrevTxOutputRequest - 24, // 28: shiftcrypto.bitbox02.BTCRequest.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageRequest - 34, // 29: shiftcrypto.bitbox02.BTCRequest.antiklepto_signature:type_name -> shiftcrypto.bitbox02.AntiKleptoSignatureRequest - 23, // 30: shiftcrypto.bitbox02.BTCRequest.payment_request:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest - 16, // 31: shiftcrypto.bitbox02.BTCResponse.success:type_name -> shiftcrypto.bitbox02.BTCSuccess - 18, // 32: shiftcrypto.bitbox02.BTCResponse.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredResponse - 12, // 33: shiftcrypto.bitbox02.BTCResponse.sign_next:type_name -> shiftcrypto.bitbox02.BTCSignNextResponse - 25, // 34: shiftcrypto.bitbox02.BTCResponse.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageResponse - 32, // 35: shiftcrypto.bitbox02.BTCResponse.antiklepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment - 35, // 36: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.xpubs:type_name -> shiftcrypto.bitbox02.XPub - 3, // 37: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.script_type:type_name -> shiftcrypto.bitbox02.BTCScriptConfig.Multisig.ScriptType - 36, // 38: shiftcrypto.bitbox02.BTCScriptConfig.Policy.keys:type_name -> shiftcrypto.bitbox02.KeyOriginInfo - 31, // 39: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.text_memo:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo - 40, // [40:40] is the sub-list for method output_type - 40, // [40:40] is the sub-list for method input_type - 40, // [40:40] is the sub-list for extension type_name - 40, // [40:40] is the sub-list for extension extendee - 0, // [0:40] is the sub-list for field type_name + 30, // 14: shiftcrypto.bitbox02.BTCSignOutputRequest.silent_payment:type_name -> shiftcrypto.bitbox02.BTCSignOutputRequest.SilentPayment + 0, // 15: shiftcrypto.bitbox02.BTCScriptConfigRegistration.coin:type_name -> shiftcrypto.bitbox02.BTCCoin + 8, // 16: shiftcrypto.bitbox02.BTCScriptConfigRegistration.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfig + 15, // 17: shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest.registration:type_name -> shiftcrypto.bitbox02.BTCScriptConfigRegistration + 15, // 18: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.registration:type_name -> shiftcrypto.bitbox02.BTCScriptConfigRegistration + 7, // 19: shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.xpub_type:type_name -> shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest.XPubType + 31, // 20: shiftcrypto.bitbox02.BTCPaymentRequestRequest.memos:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo + 0, // 21: shiftcrypto.bitbox02.BTCSignMessageRequest.coin:type_name -> shiftcrypto.bitbox02.BTCCoin + 10, // 22: shiftcrypto.bitbox02.BTCSignMessageRequest.script_config:type_name -> shiftcrypto.bitbox02.BTCScriptConfigWithKeypath + 34, // 23: shiftcrypto.bitbox02.BTCSignMessageRequest.host_nonce_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoHostNonceCommitment + 17, // 24: shiftcrypto.bitbox02.BTCRequest.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredRequest + 19, // 25: shiftcrypto.bitbox02.BTCRequest.register_script_config:type_name -> shiftcrypto.bitbox02.BTCRegisterScriptConfigRequest + 20, // 26: shiftcrypto.bitbox02.BTCRequest.prevtx_init:type_name -> shiftcrypto.bitbox02.BTCPrevTxInitRequest + 21, // 27: shiftcrypto.bitbox02.BTCRequest.prevtx_input:type_name -> shiftcrypto.bitbox02.BTCPrevTxInputRequest + 22, // 28: shiftcrypto.bitbox02.BTCRequest.prevtx_output:type_name -> shiftcrypto.bitbox02.BTCPrevTxOutputRequest + 24, // 29: shiftcrypto.bitbox02.BTCRequest.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageRequest + 35, // 30: shiftcrypto.bitbox02.BTCRequest.antiklepto_signature:type_name -> shiftcrypto.bitbox02.AntiKleptoSignatureRequest + 23, // 31: shiftcrypto.bitbox02.BTCRequest.payment_request:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest + 16, // 32: shiftcrypto.bitbox02.BTCResponse.success:type_name -> shiftcrypto.bitbox02.BTCSuccess + 18, // 33: shiftcrypto.bitbox02.BTCResponse.is_script_config_registered:type_name -> shiftcrypto.bitbox02.BTCIsScriptConfigRegisteredResponse + 12, // 34: shiftcrypto.bitbox02.BTCResponse.sign_next:type_name -> shiftcrypto.bitbox02.BTCSignNextResponse + 25, // 35: shiftcrypto.bitbox02.BTCResponse.sign_message:type_name -> shiftcrypto.bitbox02.BTCSignMessageResponse + 33, // 36: shiftcrypto.bitbox02.BTCResponse.antiklepto_signer_commitment:type_name -> shiftcrypto.bitbox02.AntiKleptoSignerCommitment + 36, // 37: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.xpubs:type_name -> shiftcrypto.bitbox02.XPub + 3, // 38: shiftcrypto.bitbox02.BTCScriptConfig.Multisig.script_type:type_name -> shiftcrypto.bitbox02.BTCScriptConfig.Multisig.ScriptType + 37, // 39: shiftcrypto.bitbox02.BTCScriptConfig.Policy.keys:type_name -> shiftcrypto.bitbox02.KeyOriginInfo + 32, // 40: shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.text_memo:type_name -> shiftcrypto.bitbox02.BTCPaymentRequestRequest.Memo.TextMemo + 41, // [41:41] is the sub-list for method output_type + 41, // [41:41] is the sub-list for method input_type + 41, // [41:41] is the sub-list for extension type_name + 41, // [41:41] is the sub-list for extension extendee + 0, // [0:41] is the sub-list for field type_name } func init() { file_btc_proto_init() } @@ -3051,7 +3156,7 @@ func file_btc_proto_init() { } } file_btc_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*BTCPaymentRequestRequest_Memo); i { + switch v := v.(*BTCSignOutputRequest_SilentPayment); i { case 0: return &v.state case 1: @@ -3063,6 +3168,18 @@ func file_btc_proto_init() { } } file_btc_proto_msgTypes[23].Exporter = func(v any, i int) any { + switch v := v.(*BTCPaymentRequestRequest_Memo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_btc_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*BTCPaymentRequestRequest_Memo_TextMemo); i { case 0: return &v.state @@ -3102,7 +3219,7 @@ func file_btc_proto_init() { (*BTCResponse_SignMessage)(nil), (*BTCResponse_AntikleptoSignerCommitment)(nil), } - file_btc_proto_msgTypes[22].OneofWrappers = []any{ + file_btc_proto_msgTypes[23].OneofWrappers = []any{ (*BTCPaymentRequestRequest_Memo_TextMemo_)(nil), } type x struct{} @@ -3111,7 +3228,7 @@ func file_btc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_btc_proto_rawDesc, NumEnums: 8, - NumMessages: 24, + NumMessages: 25, NumExtensions: 0, NumServices: 0, }, diff --git a/api/firmware/messages/btc.proto b/api/firmware/messages/btc.proto index b37c06b..67db4db 100644 --- a/api/firmware/messages/btc.proto +++ b/api/firmware/messages/btc.proto @@ -112,6 +112,7 @@ message BTCSignInitRequest { SAT = 1; } FormatUnit format_unit = 8; + bool contains_silent_payment_outputs = 9; } message BTCSignNextResponse { @@ -135,6 +136,9 @@ message BTCSignNextResponse { // Previous tx's input/output index in case of PREV_INPUT or PREV_OUTPUT, for the input at `index`. uint32 prev_index = 5; AntiKleptoSignerCommitment anti_klepto_signer_commitment = 6; + // Generated output. The host *must* verify its correctness using silent_payment_dleq_proof. + bytes generated_output_pkscript = 7; + bytes silent_payment_dleq_proof = 8; } message BTCSignInputRequest { @@ -158,6 +162,10 @@ enum BTCOutputType { } message BTCSignOutputRequest { + // https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki + message SilentPayment { + string address = 1; + } bool ours = 1; BTCOutputType type = 2; // if ours is false // 20 bytes for p2pkh, p2sh, pw2wpkh. 32 bytes for p2wsh. @@ -167,6 +175,9 @@ message BTCSignOutputRequest { // If ours is true. References a script config from BTCSignInitRequest uint32 script_config_index = 6; optional uint32 payment_request_index = 7; + // If provided, `type` and `payload` is ignored. The generated output pkScript is returned in + // BTCSignNextResponse. `contains_silent_payment_outputs` in the init request must be true. + SilentPayment silent_payment = 8; } message BTCScriptConfigRegistration { diff --git a/api/firmware/messages/cardano.pb.go b/api/firmware/messages/cardano.pb.go index bc8ed13..6b73916 100644 --- a/api/firmware/messages/cardano.pb.go +++ b/api/firmware/messages/cardano.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: cardano.proto package messages diff --git a/api/firmware/messages/common.pb.go b/api/firmware/messages/common.pb.go index 5a5d747..b4ad0ec 100644 --- a/api/firmware/messages/common.pb.go +++ b/api/firmware/messages/common.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: common.proto package messages diff --git a/api/firmware/messages/eth.pb.go b/api/firmware/messages/eth.pb.go index 9901a7f..f5b35f5 100644 --- a/api/firmware/messages/eth.pb.go +++ b/api/firmware/messages/eth.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: eth.proto package messages diff --git a/api/firmware/messages/hww.pb.go b/api/firmware/messages/hww.pb.go index 607ecaf..891fc3b 100644 --- a/api/firmware/messages/hww.pb.go +++ b/api/firmware/messages/hww.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: hww.proto package messages diff --git a/api/firmware/messages/keystore.pb.go b/api/firmware/messages/keystore.pb.go index 0125a9e..820fd8f 100644 --- a/api/firmware/messages/keystore.pb.go +++ b/api/firmware/messages/keystore.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: keystore.proto package messages diff --git a/api/firmware/messages/mnemonic.pb.go b/api/firmware/messages/mnemonic.pb.go index b6b9653..f189455 100644 --- a/api/firmware/messages/mnemonic.pb.go +++ b/api/firmware/messages/mnemonic.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: mnemonic.proto package messages diff --git a/api/firmware/messages/perform_attestation.pb.go b/api/firmware/messages/perform_attestation.pb.go index d8db698..14b6f12 100644 --- a/api/firmware/messages/perform_attestation.pb.go +++ b/api/firmware/messages/perform_attestation.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: perform_attestation.proto package messages diff --git a/api/firmware/messages/system.pb.go b/api/firmware/messages/system.pb.go index c83dbcb..5b70a42 100644 --- a/api/firmware/messages/system.pb.go +++ b/api/firmware/messages/system.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc v3.21.12 // source: system.proto package messages diff --git a/api/firmware/secp256k1.go b/api/firmware/secp256k1.go index fc124f6..afdef5d 100644 --- a/api/firmware/secp256k1.go +++ b/api/firmware/secp256k1.go @@ -15,6 +15,7 @@ package firmware import ( + "bytes" "crypto/sha256" "math/big" @@ -57,3 +58,75 @@ func antikleptoVerify(hostNonce, signerCommitment, signature []byte) error { } return nil } + +func pubkeyAdd(a, b *btcec.PublicKey) *btcec.PublicKey { + x, y := btcec.S256().Add(a.X(), a.Y(), b.X(), b.Y()) + return toPub(x, y) +} + +func scalarBaseMult(s []byte) *btcec.PublicKey { + x, y := btcec.S256().ScalarBaseMult(s) + return toPub(x, y) +} + +func scalarMult(s []byte, pk *btcec.PublicKey) *btcec.PublicKey { + x, y := btcec.S256().ScalarMult(pk.X(), pk.Y(), s) + return toPub(x, y) +} + +func toPub(x, y *big.Int) *btcec.PublicKey { + var xx, yy btcec.FieldVal + xx.SetByteSlice(x.Bytes()) + yy.SetByteSlice(y.Bytes()) + return btcec.NewPublicKey(&xx, &yy) +} + +func negatePub(pk *btcec.PublicKey) *btcec.PublicKey { + return toPub(pk.X(), new(big.Int).Sub(btcec.S256().P, pk.Y())) +} + +// Verifies a DLEQ proof. +// +// A DLEQ (discrete log equivalence) proof proves that the discrete log of p1 to the secp256k1 base +// G is the same as the discrete log of p2 to another base gen2. +// +// Same as +// https://github.com/BlockstreamResearch/secp256k1-zkp/blob/6152622613fdf1c5af6f31f74c427c4e9ee120ce/src/modules/ecdsa_adaptor/dleq_impl.h#L129 +// with default noncefp and ndata==NULL). +func dleqVerify(proof []byte, p1, gen2, p2 *btcec.PublicKey) error { + if len(proof) != 64 { + return errp.New("proof must be 64 bytes") + } + s := proof[:32] + e := proof[32:] + curve := btcec.S256() + + // R1 = s*G - e*P1 + sPub := scalarBaseMult(s) + eP1 := scalarMult(e, p1) + r1Pub := pubkeyAdd(sPub, negatePub(eP1)) + + /* R2 = s*gen2 - e*P2 */ + sGen2 := scalarMult(s, gen2) + eP2 := scalarMult(e, p2) + r2Pub := pubkeyAdd(sGen2, negatePub(eP2)) + challenge := func() *big.Int { + var b bytes.Buffer + b.Write(p1.SerializeCompressed()) + b.Write(gen2.SerializeCompressed()) + b.Write(p2.SerializeCompressed()) + b.Write(r1Pub.SerializeCompressed()) + b.Write(r2Pub.SerializeCompressed()) + hash := taggedSha256([]byte("DLEQ"), b.Bytes()) + return new(big.Int).SetBytes(hash) + } + modEqual := func(x, y, n *big.Int) bool { + return new(big.Int).Mod(x, n).Cmp(new(big.Int).Mod(y, n)) == 0 + } + eExpected := challenge() + eInt := new(big.Int).SetBytes(e) + if !modEqual(eExpected, eInt, curve.N) { + return errp.New("DLEQ proof verification failed") + } + return nil +} diff --git a/api/firmware/secp256k1_test.go b/api/firmware/secp256k1_test.go index ada828e..b55c00c 100644 --- a/api/firmware/secp256k1_test.go +++ b/api/firmware/secp256k1_test.go @@ -3,6 +3,7 @@ package firmware import ( "testing" + "github.com/btcsuite/btcd/btcec/v2" "github.com/stretchr/testify/require" ) @@ -48,3 +49,22 @@ func TestAntikleptoVerify(t *testing.T) { require.Error(t, antikleptoVerify(test.hostNonce, test.signerCommitment, test.signature)) } } + +func TestDLEQVerify(t *testing.T) { + // secret key sk=077eb75a52eca24cdedf058c92f1ca8b9d4841771fd6baa3d27885fb5b49fba2 + // is the secret key in pubKey=sk*G and otherPubKey=sk*otherBase. + // + // Test fixture created by running dleq_verify() in + // https://github.com/BlockstreamResearch/secp256k1-zkp/blob/6152622613fdf1c5af6f31f74c427c4e9ee120ce/src/modules/ecdsa_adaptor/dleq_impl.h + // with the above secret key, p1 being sk*G, + // 0389140f7bb852f020f154e55908fe3699dc9f65153e681527f0d55aabed937f4b for gen2, and p2=sk*gen2. + + proof := unhex("6c885f825f6ce7565bc6d0bfda90506b11e2682dfe943f5a85badf1c8a96edc5f5e03f5ee2c58bf979646fbada920f9f1c5bd92805fb5b01534b42d26a550f79") + pubKey, err := btcec.ParsePubKey(unhex("021b8594084a12da837a78f9337e3d29169025a8ddbe9f9933a131607c6e62d21e")) + require.NoError(t, err) + otherBase, err := btcec.ParsePubKey(unhex("0389140f7bb852f020f154e55908fe3699dc9f65153e681527f0d55aabed937f4b")) + require.NoError(t, err) + otherPubKey, err := btcec.ParsePubKey(unhex("03019807775b92c83d24e3001b55f60373e0bdc7d7cc7bc86befecf5bb987b54ac")) + require.NoError(t, err) + require.NoError(t, dleqVerify(proof, pubKey, otherBase, otherPubKey)) +} diff --git a/api/firmware/silentpayments.go b/api/firmware/silentpayments.go new file mode 100644 index 0000000..702ff0e --- /dev/null +++ b/api/firmware/silentpayments.go @@ -0,0 +1,158 @@ +// Copyright 2024 Shift Crypto AG +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package firmware + +import ( + "bytes" + "encoding/binary" + + "github.com/BitBoxSwiss/bitbox02-api-go/util/errp" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/btcutil/bech32" + "github.com/btcsuite/btcd/txscript" +) + +func bip352SmallestOutpointHash(tx *BTCTx, aPubSum *btcec.PublicKey) []byte { + var smallestOutpoint []byte + for _, input := range tx.Inputs { + var serialized bytes.Buffer + serialized.Write(input.Input.PrevOutHash) + _ = binary.Write(&serialized, binary.LittleEndian, input.Input.PrevOutIndex) + + if smallestOutpoint == nil || bytes.Compare(serialized.Bytes(), smallestOutpoint) == -1 { + smallestOutpoint = serialized.Bytes() + } + } + + var msg bytes.Buffer + msg.Write(smallestOutpoint) + msg.Write(aPubSum.SerializeCompressed()) + return taggedSha256([]byte("BIP0352/Inputs"), msg.Bytes()) +} + +// DecodeSilentPaymentAddress decodes a slient payment address, returning the bech32 HRP and the +// scan/spend pubkeys. +func DecodeSilentPaymentAddress(address string) (string, *btcec.PublicKey, *btcec.PublicKey, error) { + hrp, data, err := bech32.DecodeNoLimit(address) + if err != nil { + return "", nil, nil, errp.WithStack(err) + } + version, data := data[0], data[1:] + if version != 0 { + return "", nil, nil, errp.New("unexpected silent payment address version") + } + regrouped, err := bech32.ConvertBits(data, 5, 8, false) + if err != nil { + return "", nil, nil, errp.WithStack(err) + } + if len(regrouped) != 66 { + return "", nil, nil, errp.New("unexpected silent payment payload length") + } + scanPubKey, err := btcec.ParsePubKey(regrouped[:33]) + if err != nil { + return "", nil, nil, errp.WithStack(err) + } + spendPubKey, err := btcec.ParsePubKey(regrouped[33:]) + if err != nil { + return "", nil, nil, errp.WithStack(err) + } + return hrp, scanPubKey, spendPubKey, nil +} + +func bip352InputSum(tx *BTCTx) (*btcec.PublicKey, error) { + var aPubSum *btcec.PublicKey + for _, inp := range tx.Inputs { + var pubkey *btcec.PublicKey + switch len(inp.BIP352Pubkey) { + case btcec.PubKeyBytesLenCompressed: + var err error + pubkey, err = btcec.ParsePubKey(inp.BIP352Pubkey) + if err != nil { + return nil, err + } + case schnorr.PubKeyBytesLen: + var err error + pubkey, err = schnorr.ParsePubKey(inp.BIP352Pubkey) + if err != nil { + return nil, err + } + default: + return nil, errp.New("BIP352PubKey of each input must be present") + } + if aPubSum == nil { + aPubSum = pubkey + } else { + aPubSum = pubkeyAdd(aPubSum, pubkey) + } + } + return aPubSum, nil +} + +// t_k = hash_"BIP0352/SharedSecret"(serP(ecdh_shared_secret) || ser32(k)) +// See https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki#creating-outputs +func bip352CalculateTk(ecdhSharedSecret *btcec.PublicKey, k uint32) []byte { + var tkMsg bytes.Buffer + tkMsg.Write(ecdhSharedSecret.SerializeCompressed()) + _ = binary.Write(&tkMsg, binary.LittleEndian, k) + return taggedSha256([]byte("BIP0352/SharedSecret"), tkMsg.Bytes()) + +} + +func silentPaymentOutputVerify(tx *BTCTx, outputIndex int, proof []byte, generatedOutputPkscript []byte) error { + if len(proof) != 33+64 { + return errp.New("wrong DLEQ proof size ") + } + cPub, err := btcec.ParsePubKey(proof[:33]) + if err != nil { + return errp.WithStack(err) + } + dleqProof := proof[33:] + + output := tx.Outputs[outputIndex] + if output.SilentPayment == nil { + return errp.New("silent payment address missing") + } + _, scanPubKey, spendPubKey, err := DecodeSilentPaymentAddress(output.SilentPayment.Address) + if err != nil { + return err + } + + aPubSum, err := bip352InputSum(tx) + if err != nil { + return err + } + if err := dleqVerify(dleqProof, aPubSum, scanPubKey, cPub); err != nil { + return err + } + + inputsHash := bip352SmallestOutpointHash(tx, aPubSum) + // ecdh_shared_secret = input_hash·a·B_scan = input_hash*C + ecdhSharedSecret := scalarMult(inputsHash, cPub) + tk := bip352CalculateTk(ecdhSharedSecret, 0) + // T_k = t_k*G + tkPub := scalarBaseMult(tk) + // B_m + T_k + expectedOutputKey := pubkeyAdd(spendPubKey, tkPub) + + expectedPkScript, err := txscript.PayToTaprootScript(expectedOutputKey) + if err != nil { + return errp.WithStack(err) + } + if !bytes.Equal(expectedPkScript, generatedOutputPkscript) { + return errp.New("incorrect silent payment output") + } + return nil +} diff --git a/cmd/miniscript/main.go b/cmd/miniscript/main.go index ac94be6..a50767a 100644 --- a/cmd/miniscript/main.go +++ b/cmd/miniscript/main.go @@ -329,7 +329,7 @@ func main() { } accountKeypath := keyOriginInfo.Keypath mp := multipaths[i] - signatures, err := device.BTCSign( + signatures, _, err := device.BTCSign( coin, []*messages.BTCScriptConfigWithKeypath{ { diff --git a/cmd/paymentrequest/main.go b/cmd/paymentrequest/main.go index 8b7f2df..c9e21a4 100644 --- a/cmd/paymentrequest/main.go +++ b/cmd/paymentrequest/main.go @@ -165,7 +165,7 @@ func main() { errpanic(err) paymentRequest.Signature = signature[1:] - _, err = device.BTCSign( + _, _, err = device.BTCSign( messages.BTCCoin_TBTC, []*messages.BTCScriptConfigWithKeypath{ { diff --git a/cmd/playground/main.go b/cmd/playground/main.go index d2823f8..16d7607 100644 --- a/cmd/playground/main.go +++ b/cmd/playground/main.go @@ -151,7 +151,7 @@ func signFromTxID(device *firmware.Device, txID string) { Value: outp.Value, }) } - _, err := device.BTCSign( + _, _, err := device.BTCSign( messages.BTCCoin_TBTC, []*messages.BTCScriptConfigWithKeypath{ {