From 931ed750a13445825d5ac9840854bb31e57c5bd3 Mon Sep 17 00:00:00 2001 From: habibitcoin Date: Mon, 5 Jun 2023 15:54:41 +0400 Subject: [PATCH 1/4] taprpc + itest: use string everywhere for blockhash taprpc: use string everywhere for blockhash itest: update for anchor blockhash given as a string --- itest/assertions.go | 2 +- itest/assets_test.go | 2 +- rpcserver.go | 2 +- taprpc/taprootassets.proto | 2 +- taprpc/taprootassets.swagger.json | 1 - 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/itest/assertions.go b/itest/assertions.go index 72b06c011..577c9a8a7 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -68,7 +68,7 @@ func assetAnchorCheck(txid, blockHash chainhash.Hash) assetCheck { txid[:]) } - if !bytes.Equal(a.ChainAnchor.AnchorBlockHash, blockHash[:]) { + if a.ChainAnchor.AnchorBlockHash != blockHash.String() { return fmt.Errorf("unexpected asset anchor block "+ "hash, got %x wanted %x", a.ChainAnchor.AnchorBlockHash, blockHash[:]) diff --git a/itest/assets_test.go b/itest/assets_test.go index 6f0d4e559..181f87df5 100644 --- a/itest/assets_test.go +++ b/itest/assets_test.go @@ -253,7 +253,7 @@ func transferAssetProofs(t *harnessTest, src, dst *tapdHarness, existingAsset.ChainAnchor.AnchorTxid, ) require.NoError(t.t, err) - anchorBlockHash, err := chainhash.NewHash( + anchorBlockHash, err := chainhash.NewHashFromStr( existingAsset.ChainAnchor.AnchorBlockHash, ) require.NoError(t.t, err) diff --git a/rpcserver.go b/rpcserver.go index aa49cb03d..3458a323f 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -565,7 +565,7 @@ func (r *rpcServer) marshalChainAsset(ctx context.Context, a *tapdb.ChainAsset, rpcAsset.ChainAnchor = &taprpc.AnchorInfo{ AnchorTx: anchorTxBytes, AnchorTxid: a.AnchorTxid.String(), - AnchorBlockHash: a.AnchorBlockHash[:], + AnchorBlockHash: a.AnchorBlockHash.String(), AnchorOutpoint: a.AnchorOutpoint.String(), InternalKey: a.AnchorInternalKey.SerializeCompressed(), MerkleRoot: a.AnchorMerkleRoot, diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 0b2b0d371..f04a73b15 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -170,7 +170,7 @@ message AnchorInfo { string anchor_txid = 2; // The block hash the contains the anchor transaction above. - bytes anchor_block_hash = 3; + string anchor_block_hash = 3; // The outpoint (txid:vout) that stores the Taproot Asset commitment. string anchor_outpoint = 4; diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index a4c79455d..27d6791cb 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -816,7 +816,6 @@ }, "anchor_block_hash": { "type": "string", - "format": "byte", "description": "The block hash the contains the anchor transaction above." }, "anchor_outpoint": { From 510450153d08bed9e556ef344f9e00d7d0ae05ef Mon Sep 17 00:00:00 2001 From: habibitcoin Date: Thu, 15 Jun 2023 18:12:21 -0400 Subject: [PATCH 2/4] taprpc + rpc: implement DecodeProof methods and update VerifyProof taprpc: create DecodeProofRequest and DecodeProofResponse objects rpc: Implement DecodeProof + include into VerifyProof --- perms/perms.go | 4 + rpcserver.go | 145 ++- taprpc/taprootassets.pb.go | 1114 ++++++++++++++-------- taprpc/taprootassets.pb.gw.go | 81 ++ taprpc/taprootassets.pb.json.go | 25 + taprpc/taprootassets.proto | 72 +- taprpc/taprootassets.swagger.json | 144 ++- taprpc/taprootassets.yaml | 4 + taprpc/taprootassets_grpc.pb.go | 52 +- taprpc/universerpc/universe.swagger.json | 1 - 10 files changed, 1246 insertions(+), 396 deletions(-) diff --git a/perms/perms.go b/perms/perms.go index 7d66c5675..99ebf11c5 100644 --- a/perms/perms.go +++ b/perms/perms.go @@ -60,6 +60,10 @@ var ( Entity: "proofs", Action: "read", }}, + "/taprpc.TaprootAssets/DecodeProof": {{ + Entity: "proofs", + Action: "read", + }}, "/taprpc.TaprootAssets/ExportProof": {{ Entity: "proofs", Action: "read", diff --git a/rpcserver.go b/rpcserver.go index 3458a323f..6a32e8a6e 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1061,7 +1061,7 @@ func (r *rpcServer) DecodeAddr(_ context.Context, // VerifyProof attempts to verify a given proof file that claims to be anchored // at the specified genesis point. func (r *rpcServer) VerifyProof(ctx context.Context, - in *taprpc.ProofFile) (*taprpc.ProofVerifyResponse, error) { + in *taprpc.ProofFile) (*taprpc.VerifyProofResponse, error) { if len(in.RawProof) == 0 { return nil, fmt.Errorf("proof file must be specified") @@ -1079,12 +1079,145 @@ func (r *rpcServer) VerifyProof(ctx context.Context, ) valid := err == nil - // TODO(roasbeef): also show additional final resting anchor - // information, etc? + decodedProof, err := r.marshalProofFile(ctx, proofFile, 0, false, false) + if err != nil { + return nil, fmt.Errorf("unable to marshal proof: %w", err) + } + + return &taprpc.VerifyProofResponse{ + Valid: valid, + DecodedProof: decodedProof, + }, nil +} + +// DecodeProof attempts to decode a given proof file that claims to be anchored +// at the specified genesis point. +func (r *rpcServer) DecodeProof(ctx context.Context, + in *taprpc.DecodeProofRequest) (*taprpc.DecodeProofResponse, error) { + + if len(in.RawProof) == 0 { + return nil, fmt.Errorf("proof file must be specified") + } + + var proofFile proof.File + if err := proofFile.Decode(bytes.NewReader(in.RawProof)); err != nil { + return nil, fmt.Errorf("unable to decode proof file: %w", err) + } + + latestProofIndex := uint32(proofFile.NumProofs() - 1) + + if in.ProofAtDepth > latestProofIndex { + return nil, fmt.Errorf("invalid depth %d is greater than "+ + "latest proof index of %d", in.ProofAtDepth, + latestProofIndex) + } + + // Default to latest proof. + depth := latestProofIndex - in.ProofAtDepth + + decodedProof, err := r.marshalProofFile( + ctx, proofFile, depth, in.WithPrevWitnesses, in.WithMetaReveal, + ) + if err != nil { + return nil, fmt.Errorf("unable to marshal proof: %w", err) + } + + return &taprpc.DecodeProofResponse{ + DecodedProof: decodedProof, + }, nil +} + +// marshalProofFile turns a proof file into an RPC DecodedProof. +func (r *rpcServer) marshalProofFile(ctx context.Context, proofFile proof.File, + depth uint32, withPrevWitnesses, withMetaReveal bool) (*taprpc.DecodedProof, + error) { + + decodedProof, err := proofFile.ProofAt(depth) + if err != nil { + return nil, err + } + + var ( + finalAsset = decodedProof.Asset + rpcMeta *taprpc.AssetMeta + anchorOutpoint = wire.OutPoint{ + Hash: decodedProof.AnchorTx.TxHash(), + Index: decodedProof.InclusionProof.OutputIndex, + } + txMerkleProof = decodedProof.TxMerkleProof + inclusionProof = decodedProof.InclusionProof + splitRootProof = decodedProof.SplitRootProof + ) + + var txMerkleProofBuf bytes.Buffer + if err := txMerkleProof.Encode(&txMerkleProofBuf); err != nil { + return nil, fmt.Errorf("unable to encode serialized Bitcoin "+ + "merkle proof: %w", err) + } + + var inclusionProofBuf bytes.Buffer + if err := inclusionProof.Encode(&inclusionProofBuf); err != nil { + return nil, fmt.Errorf("unable to encode inclusion proof: %w", + err) + } + + var exclusionProofs [][]byte + for _, exclusionProof := range decodedProof.ExclusionProofs { + var exclusionProofBuf bytes.Buffer + if err := exclusionProof.Encode(&exclusionProofBuf); err != nil { + return nil, fmt.Errorf("unable to encode exclusion "+ + "proofs: %w", err) + } + exclusionProofBytes := exclusionProofBuf.Bytes() + + exclusionProofs = append(exclusionProofs, exclusionProofBytes) + } + + var splitRootProofBuf bytes.Buffer + if splitRootProof != nil { + if err := splitRootProof.Encode(&splitRootProofBuf); err != nil { + return nil, fmt.Errorf("unable to encode split root proof: %w", + err) + } + } + + rpcAsset, err := r.marshalChainAsset(ctx, &tapdb.ChainAsset{ + Asset: &finalAsset, + AnchorTx: &decodedProof.AnchorTx, + AnchorTxid: decodedProof.AnchorTx.TxHash(), + AnchorBlockHash: decodedProof.BlockHeader.BlockHash(), + AnchorOutpoint: anchorOutpoint, + AnchorInternalKey: decodedProof.InclusionProof.InternalKey, + }, withPrevWitnesses) + if err != nil { + return nil, err + } + + if withMetaReveal { + if len(rpcAsset.AssetGenesis.MetaHash) == 0 { + return nil, fmt.Errorf("asset does not contain meta data") + } + rpcMeta, err = r.FetchAssetMeta(ctx, &taprpc.FetchAssetMetaRequest{ + Asset: &taprpc.FetchAssetMetaRequest_MetaHash{ + MetaHash: rpcAsset.AssetGenesis.MetaHash, + }, + }) + if err != nil { + return nil, err + } + } - // TODO(roasbeef): show the final resting place of the asset? - return &taprpc.ProofVerifyResponse{ - Valid: valid, + return &taprpc.DecodedProof{ + ProofAtDepth: depth, + NumberOfProofs: uint32(proofFile.NumProofs()), + Asset: rpcAsset, + MetaReveal: rpcMeta, + TxMerkleProof: txMerkleProofBuf.Bytes(), + InclusionProof: inclusionProofBuf.Bytes(), + ExclusionProofs: exclusionProofs, + SplitRootProof: splitRootProofBuf.Bytes(), + NumAdditionalInputs: uint32(len(decodedProof.AdditionalInputs)), + ChallengeWitness: decodedProof.ChallengeWitness, }, nil } diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index c96fe083a..6d9ceb145 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -372,7 +372,7 @@ type AnchorInfo struct { // The txid of the above transaction. AnchorTxid string `protobuf:"bytes,2,opt,name=anchor_txid,json=anchorTxid,proto3" json:"anchor_txid,omitempty"` // The block hash the contains the anchor transaction above. - AnchorBlockHash []byte `protobuf:"bytes,3,opt,name=anchor_block_hash,json=anchorBlockHash,proto3" json:"anchor_block_hash,omitempty"` + AnchorBlockHash string `protobuf:"bytes,3,opt,name=anchor_block_hash,json=anchorBlockHash,proto3" json:"anchor_block_hash,omitempty"` // The outpoint (txid:vout) that stores the Taproot Asset commitment. AnchorOutpoint string `protobuf:"bytes,4,opt,name=anchor_outpoint,json=anchorOutpoint,proto3" json:"anchor_outpoint,omitempty"` // The raw internal key that was used to create the anchor Taproot output key. @@ -433,11 +433,11 @@ func (x *AnchorInfo) GetAnchorTxid() string { return "" } -func (x *AnchorInfo) GetAnchorBlockHash() []byte { +func (x *AnchorInfo) GetAnchorBlockHash() string { if x != nil { return x.AnchorBlockHash } - return nil + return "" } func (x *AnchorInfo) GetAnchorOutpoint() string { @@ -2895,16 +2895,46 @@ func (x *ProofFile) GetGenesisPoint() string { return "" } -type ProofVerifyResponse struct { +type DecodedProof struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *ProofVerifyResponse) Reset() { - *x = ProofVerifyResponse{} + // The index depth of the decoded proof, with 0 being the latest proof. + ProofAtDepth uint32 `protobuf:"varint,1,opt,name=proof_at_depth,json=proofAtDepth,proto3" json:"proof_at_depth,omitempty"` + // The total number of proofs contained in the raw proof. + NumberOfProofs uint32 `protobuf:"varint,2,opt,name=number_of_proofs,json=numberOfProofs,proto3" json:"number_of_proofs,omitempty"` + // The asset referenced in the proof. + Asset *Asset `protobuf:"bytes,3,opt,name=asset,proto3" json:"asset,omitempty"` + // The reveal meta data associated with the proof, if available. + MetaReveal *AssetMeta `protobuf:"bytes,4,opt,name=meta_reveal,json=metaReveal,proto3" json:"meta_reveal,omitempty"` + // The merkle proof for AnchorTx used to prove its + // inclusion within BlockHeader. + TxMerkleProof []byte `protobuf:"bytes,5,opt,name=tx_merkle_proof,json=txMerkleProof,proto3" json:"tx_merkle_proof,omitempty"` + // The TaprootProof proving the new inclusion of the + // resulting asset within AnchorTx. + InclusionProof []byte `protobuf:"bytes,6,opt,name=inclusion_proof,json=inclusionProof,proto3" json:"inclusion_proof,omitempty"` + // The set of TaprootProofs proving the exclusion of + // the resulting asset from all other Taproot outputs within AnchorTx. + ExclusionProofs [][]byte `protobuf:"bytes,7,rep,name=exclusion_proofs,json=exclusionProofs,proto3" json:"exclusion_proofs,omitempty"` + // An optional TaprootProof needed if this asset is + // the result of a split. SplitRootProof proves inclusion of the root + // asset of the split. + SplitRootProof []byte `protobuf:"bytes,8,opt,name=split_root_proof,json=splitRootProof,proto3" json:"split_root_proof,omitempty"` + // The number of additional nested full proofs for any inputs found within + // the resulting asset. + NumAdditionalInputs uint32 `protobuf:"varint,9,opt,name=num_additional_inputs,json=numAdditionalInputs,proto3" json:"num_additional_inputs,omitempty"` + // ChallengeWitness is an optional virtual transaction witness that serves + // as an ownership proof for the asset. If this is non-nil, then it is a + // valid transfer witness for a 1-input, 1-output virtual transaction that + // spends the asset in this proof and sends it to the NUMS key, to prove + // that the creator of the proof is able to produce a valid signature to + // spend the asset. + ChallengeWitness [][]byte `protobuf:"bytes,10,rep,name=challenge_witness,json=challengeWitness,proto3" json:"challenge_witness,omitempty"` +} + +func (x *DecodedProof) Reset() { + *x = DecodedProof{} if protoimpl.UnsafeEnabled { mi := &file_taprootassets_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2912,13 +2942,13 @@ func (x *ProofVerifyResponse) Reset() { } } -func (x *ProofVerifyResponse) String() string { +func (x *DecodedProof) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProofVerifyResponse) ProtoMessage() {} +func (*DecodedProof) ProtoMessage() {} -func (x *ProofVerifyResponse) ProtoReflect() protoreflect.Message { +func (x *DecodedProof) ProtoReflect() protoreflect.Message { mi := &file_taprootassets_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2930,18 +2960,258 @@ func (x *ProofVerifyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProofVerifyResponse.ProtoReflect.Descriptor instead. -func (*ProofVerifyResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DecodedProof.ProtoReflect.Descriptor instead. +func (*DecodedProof) Descriptor() ([]byte, []int) { return file_taprootassets_proto_rawDescGZIP(), []int{39} } -func (x *ProofVerifyResponse) GetValid() bool { +func (x *DecodedProof) GetProofAtDepth() uint32 { + if x != nil { + return x.ProofAtDepth + } + return 0 +} + +func (x *DecodedProof) GetNumberOfProofs() uint32 { + if x != nil { + return x.NumberOfProofs + } + return 0 +} + +func (x *DecodedProof) GetAsset() *Asset { + if x != nil { + return x.Asset + } + return nil +} + +func (x *DecodedProof) GetMetaReveal() *AssetMeta { + if x != nil { + return x.MetaReveal + } + return nil +} + +func (x *DecodedProof) GetTxMerkleProof() []byte { + if x != nil { + return x.TxMerkleProof + } + return nil +} + +func (x *DecodedProof) GetInclusionProof() []byte { + if x != nil { + return x.InclusionProof + } + return nil +} + +func (x *DecodedProof) GetExclusionProofs() [][]byte { + if x != nil { + return x.ExclusionProofs + } + return nil +} + +func (x *DecodedProof) GetSplitRootProof() []byte { + if x != nil { + return x.SplitRootProof + } + return nil +} + +func (x *DecodedProof) GetNumAdditionalInputs() uint32 { + if x != nil { + return x.NumAdditionalInputs + } + return 0 +} + +func (x *DecodedProof) GetChallengeWitness() [][]byte { + if x != nil { + return x.ChallengeWitness + } + return nil +} + +type VerifyProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + DecodedProof *DecodedProof `protobuf:"bytes,2,opt,name=decoded_proof,json=decodedProof,proto3" json:"decoded_proof,omitempty"` +} + +func (x *VerifyProofResponse) Reset() { + *x = VerifyProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_taprootassets_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VerifyProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyProofResponse) ProtoMessage() {} + +func (x *VerifyProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_taprootassets_proto_msgTypes[40] + 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 VerifyProofResponse.ProtoReflect.Descriptor instead. +func (*VerifyProofResponse) Descriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{40} +} + +func (x *VerifyProofResponse) GetValid() bool { if x != nil { return x.Valid } return false } +func (x *VerifyProofResponse) GetDecodedProof() *DecodedProof { + if x != nil { + return x.DecodedProof + } + return nil +} + +type DecodeProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The raw proof in bytes to decode, which may contain multiple proofs. + RawProof []byte `protobuf:"bytes,1,opt,name=raw_proof,json=rawProof,proto3" json:"raw_proof,omitempty"` + // The index depth of the decoded proof, with 0 being the latest proof. + ProofAtDepth uint32 `protobuf:"varint,2,opt,name=proof_at_depth,json=proofAtDepth,proto3" json:"proof_at_depth,omitempty"` + // An option to include previous witnesses in decoding. + WithPrevWitnesses bool `protobuf:"varint,3,opt,name=with_prev_witnesses,json=withPrevWitnesses,proto3" json:"with_prev_witnesses,omitempty"` + // An option to attempt to retrieve the meta data associated with the proof. + WithMetaReveal bool `protobuf:"varint,4,opt,name=with_meta_reveal,json=withMetaReveal,proto3" json:"with_meta_reveal,omitempty"` +} + +func (x *DecodeProofRequest) Reset() { + *x = DecodeProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_taprootassets_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DecodeProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DecodeProofRequest) ProtoMessage() {} + +func (x *DecodeProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_taprootassets_proto_msgTypes[41] + 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 DecodeProofRequest.ProtoReflect.Descriptor instead. +func (*DecodeProofRequest) Descriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{41} +} + +func (x *DecodeProofRequest) GetRawProof() []byte { + if x != nil { + return x.RawProof + } + return nil +} + +func (x *DecodeProofRequest) GetProofAtDepth() uint32 { + if x != nil { + return x.ProofAtDepth + } + return 0 +} + +func (x *DecodeProofRequest) GetWithPrevWitnesses() bool { + if x != nil { + return x.WithPrevWitnesses + } + return false +} + +func (x *DecodeProofRequest) GetWithMetaReveal() bool { + if x != nil { + return x.WithMetaReveal + } + return false +} + +type DecodeProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DecodedProof *DecodedProof `protobuf:"bytes,1,opt,name=decoded_proof,json=decodedProof,proto3" json:"decoded_proof,omitempty"` +} + +func (x *DecodeProofResponse) Reset() { + *x = DecodeProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_taprootassets_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DecodeProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DecodeProofResponse) ProtoMessage() {} + +func (x *DecodeProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_taprootassets_proto_msgTypes[42] + 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 DecodeProofResponse.ProtoReflect.Descriptor instead. +func (*DecodeProofResponse) Descriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{42} +} + +func (x *DecodeProofResponse) GetDecodedProof() *DecodedProof { + if x != nil { + return x.DecodedProof + } + return nil +} + type ExportProofRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2954,7 +3224,7 @@ type ExportProofRequest struct { func (x *ExportProofRequest) Reset() { *x = ExportProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[40] + mi := &file_taprootassets_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2967,7 +3237,7 @@ func (x *ExportProofRequest) String() string { func (*ExportProofRequest) ProtoMessage() {} func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[40] + mi := &file_taprootassets_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2980,7 +3250,7 @@ func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportProofRequest.ProtoReflect.Descriptor instead. func (*ExportProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{40} + return file_taprootassets_proto_rawDescGZIP(), []int{43} } func (x *ExportProofRequest) GetAssetId() []byte { @@ -3009,7 +3279,7 @@ type ImportProofRequest struct { func (x *ImportProofRequest) Reset() { *x = ImportProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[41] + mi := &file_taprootassets_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3022,7 +3292,7 @@ func (x *ImportProofRequest) String() string { func (*ImportProofRequest) ProtoMessage() {} func (x *ImportProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[41] + mi := &file_taprootassets_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3035,7 +3305,7 @@ func (x *ImportProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportProofRequest.ProtoReflect.Descriptor instead. func (*ImportProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{41} + return file_taprootassets_proto_rawDescGZIP(), []int{44} } func (x *ImportProofRequest) GetProofFile() []byte { @@ -3061,7 +3331,7 @@ type ImportProofResponse struct { func (x *ImportProofResponse) Reset() { *x = ImportProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[42] + mi := &file_taprootassets_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3074,7 +3344,7 @@ func (x *ImportProofResponse) String() string { func (*ImportProofResponse) ProtoMessage() {} func (x *ImportProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[42] + mi := &file_taprootassets_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3087,7 +3357,7 @@ func (x *ImportProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportProofResponse.ProtoReflect.Descriptor instead. func (*ImportProofResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{42} + return file_taprootassets_proto_rawDescGZIP(), []int{45} } type AddrEvent struct { @@ -3120,7 +3390,7 @@ type AddrEvent struct { func (x *AddrEvent) Reset() { *x = AddrEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3133,7 +3403,7 @@ func (x *AddrEvent) String() string { func (*AddrEvent) ProtoMessage() {} func (x *AddrEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3146,7 +3416,7 @@ func (x *AddrEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrEvent.ProtoReflect.Descriptor instead. func (*AddrEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{43} + return file_taprootassets_proto_rawDescGZIP(), []int{46} } func (x *AddrEvent) GetCreationTimeUnixSeconds() uint64 { @@ -3219,7 +3489,7 @@ type AddrReceivesRequest struct { func (x *AddrReceivesRequest) Reset() { *x = AddrReceivesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3232,7 +3502,7 @@ func (x *AddrReceivesRequest) String() string { func (*AddrReceivesRequest) ProtoMessage() {} func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3245,7 +3515,7 @@ func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesRequest.ProtoReflect.Descriptor instead. func (*AddrReceivesRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{44} + return file_taprootassets_proto_rawDescGZIP(), []int{47} } func (x *AddrReceivesRequest) GetFilterAddr() string { @@ -3274,7 +3544,7 @@ type AddrReceivesResponse struct { func (x *AddrReceivesResponse) Reset() { *x = AddrReceivesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3557,7 @@ func (x *AddrReceivesResponse) String() string { func (*AddrReceivesResponse) ProtoMessage() {} func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3570,7 @@ func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesResponse.ProtoReflect.Descriptor instead. func (*AddrReceivesResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{45} + return file_taprootassets_proto_rawDescGZIP(), []int{48} } func (x *AddrReceivesResponse) GetEvents() []*AddrEvent { @@ -3321,7 +3591,7 @@ type SendAssetRequest struct { func (x *SendAssetRequest) Reset() { *x = SendAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3334,7 +3604,7 @@ func (x *SendAssetRequest) String() string { func (*SendAssetRequest) ProtoMessage() {} func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3347,7 +3617,7 @@ func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetRequest.ProtoReflect.Descriptor instead. func (*SendAssetRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{46} + return file_taprootassets_proto_rawDescGZIP(), []int{49} } func (x *SendAssetRequest) GetTapAddrs() []string { @@ -3371,7 +3641,7 @@ type PrevInputAsset struct { func (x *PrevInputAsset) Reset() { *x = PrevInputAsset{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3384,7 +3654,7 @@ func (x *PrevInputAsset) String() string { func (*PrevInputAsset) ProtoMessage() {} func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3397,7 +3667,7 @@ func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use PrevInputAsset.ProtoReflect.Descriptor instead. func (*PrevInputAsset) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{47} + return file_taprootassets_proto_rawDescGZIP(), []int{50} } func (x *PrevInputAsset) GetAnchorPoint() string { @@ -3439,7 +3709,7 @@ type SendAssetResponse struct { func (x *SendAssetResponse) Reset() { *x = SendAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3452,7 +3722,7 @@ func (x *SendAssetResponse) String() string { func (*SendAssetResponse) ProtoMessage() {} func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3465,7 +3735,7 @@ func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetResponse.ProtoReflect.Descriptor instead. func (*SendAssetResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{48} + return file_taprootassets_proto_rawDescGZIP(), []int{51} } func (x *SendAssetResponse) GetTransfer() *AssetTransfer { @@ -3484,7 +3754,7 @@ type GetInfoRequest struct { func (x *GetInfoRequest) Reset() { *x = GetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3497,7 +3767,7 @@ func (x *GetInfoRequest) String() string { func (*GetInfoRequest) ProtoMessage() {} func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3510,7 +3780,7 @@ func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoRequest.ProtoReflect.Descriptor instead. func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{49} + return file_taprootassets_proto_rawDescGZIP(), []int{52} } type GetInfoResponse struct { @@ -3526,7 +3796,7 @@ type GetInfoResponse struct { func (x *GetInfoResponse) Reset() { *x = GetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3539,7 +3809,7 @@ func (x *GetInfoResponse) String() string { func (*GetInfoResponse) ProtoMessage() {} func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3552,7 +3822,7 @@ func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoResponse.ProtoReflect.Descriptor instead. func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{50} + return file_taprootassets_proto_rawDescGZIP(), []int{53} } func (x *GetInfoResponse) GetVersion() string { @@ -3585,7 +3855,7 @@ type SubscribeSendAssetEventNtfnsRequest struct { func (x *SubscribeSendAssetEventNtfnsRequest) Reset() { *x = SubscribeSendAssetEventNtfnsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3598,7 +3868,7 @@ func (x *SubscribeSendAssetEventNtfnsRequest) String() string { func (*SubscribeSendAssetEventNtfnsRequest) ProtoMessage() {} func (x *SubscribeSendAssetEventNtfnsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3611,7 +3881,7 @@ func (x *SubscribeSendAssetEventNtfnsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use SubscribeSendAssetEventNtfnsRequest.ProtoReflect.Descriptor instead. func (*SubscribeSendAssetEventNtfnsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{51} + return file_taprootassets_proto_rawDescGZIP(), []int{54} } type SendAssetEvent struct { @@ -3629,7 +3899,7 @@ type SendAssetEvent struct { func (x *SendAssetEvent) Reset() { *x = SendAssetEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3642,7 +3912,7 @@ func (x *SendAssetEvent) String() string { func (*SendAssetEvent) ProtoMessage() {} func (x *SendAssetEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3655,7 +3925,7 @@ func (x *SendAssetEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetEvent.ProtoReflect.Descriptor instead. func (*SendAssetEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{52} + return file_taprootassets_proto_rawDescGZIP(), []int{55} } func (m *SendAssetEvent) GetEvent() isSendAssetEvent_Event { @@ -3712,7 +3982,7 @@ type ExecuteSendStateEvent struct { func (x *ExecuteSendStateEvent) Reset() { *x = ExecuteSendStateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3725,7 +3995,7 @@ func (x *ExecuteSendStateEvent) String() string { func (*ExecuteSendStateEvent) ProtoMessage() {} func (x *ExecuteSendStateEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3738,7 +4008,7 @@ func (x *ExecuteSendStateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteSendStateEvent.ProtoReflect.Descriptor instead. func (*ExecuteSendStateEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{53} + return file_taprootassets_proto_rawDescGZIP(), []int{56} } func (x *ExecuteSendStateEvent) GetTimestamp() int64 { @@ -3773,7 +4043,7 @@ type ReceiverProofBackoffWaitEvent struct { func (x *ReceiverProofBackoffWaitEvent) Reset() { *x = ReceiverProofBackoffWaitEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3786,7 +4056,7 @@ func (x *ReceiverProofBackoffWaitEvent) String() string { func (*ReceiverProofBackoffWaitEvent) ProtoMessage() {} func (x *ReceiverProofBackoffWaitEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3799,7 +4069,7 @@ func (x *ReceiverProofBackoffWaitEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ReceiverProofBackoffWaitEvent.ProtoReflect.Descriptor instead. func (*ReceiverProofBackoffWaitEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{54} + return file_taprootassets_proto_rawDescGZIP(), []int{57} } func (x *ReceiverProofBackoffWaitEvent) GetTimestamp() int64 { @@ -3838,7 +4108,7 @@ type FetchAssetMetaRequest struct { func (x *FetchAssetMetaRequest) Reset() { *x = FetchAssetMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3851,7 +4121,7 @@ func (x *FetchAssetMetaRequest) String() string { func (*FetchAssetMetaRequest) ProtoMessage() {} func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3864,7 +4134,7 @@ func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchAssetMetaRequest.ProtoReflect.Descriptor instead. func (*FetchAssetMetaRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{55} + return file_taprootassets_proto_rawDescGZIP(), []int{58} } func (m *FetchAssetMetaRequest) GetAsset() isFetchAssetMetaRequest_Asset { @@ -3929,7 +4199,7 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, @@ -4273,222 +4543,275 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x22, 0x2b, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x4e, 0x0a, - 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x58, 0x0a, - 0x12, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd0, - 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, - 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, - 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, - 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, - 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, - 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2f, 0x0a, 0x10, 0x53, 0x65, - 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x0e, - 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, - 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x6c, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x25, 0x0a, 0x23, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x4e, 0x74, 0x66, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, 0x01, 0x0a, - 0x0e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x58, 0x0a, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x22, 0xbe, 0x03, 0x0a, 0x0c, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, + 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, + 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, + 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, + 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, + 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, + 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, + 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, + 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, + 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x4e, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, + 0x58, 0x0a, 0x12, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, + 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, + 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, + 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2f, 0x0a, 0x10, + 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x73, 0x22, 0x85, 0x01, + 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x66, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x25, 0x0a, 0x23, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4e, 0x74, 0x66, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, + 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x58, 0x0a, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x6e, + 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x71, 0x0a, 0x21, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, 0x63, + 0x6b, 0x6f, 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, + 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x15, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x71, 0x0a, 0x21, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x61, 0x63, 0x6b, - 0x6f, 0x66, 0x66, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, 0x63, 0x6b, 0x6f, - 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, 0x63, 0x6b, - 0x6f, 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x15, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x7c, 0x0a, + 0x1d, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, + 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x7c, 0x0a, 0x1d, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x61, 0x63, 0x6b, - 0x6f, 0x66, 0x66, 0x57, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, - 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, 0x61, 0x63, - 0x6b, 0x6f, 0x66, 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x5c, 0x0a, 0x15, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x42, 0x07, - 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, - 0x01, 0x2a, 0x25, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x2a, 0x89, 0x01, 0x0a, 0x0a, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, - 0x1a, 0x0a, 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x4f, - 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x49, - 0x56, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x53, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, - 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x41, 0x53, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, - 0x4f, 0x54, 0x10, 0x03, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, 0x52, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, 0x43, 0x45, - 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x32, 0xd4, 0x09, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, - 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, + 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, + 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x5c, 0x0a, 0x15, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, + 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, + 0x45, 0x10, 0x01, 0x2a, 0x25, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x2a, 0x89, 0x01, 0x0a, 0x0a, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, + 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x12, 0x23, 0x0a, + 0x1f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x53, + 0x53, 0x49, 0x56, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x53, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, + 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x03, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, + 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, + 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, + 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x32, 0x9c, 0x0a, 0x0a, 0x0d, 0x54, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, - 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, - 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, - 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, - 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, - 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, - 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, - 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x46, 0x0a, - 0x0b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, + 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, + 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x74, 0x66, 0x6e, 0x73, 0x12, 0x2b, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x74, - 0x66, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x74, 0x66, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x30, - 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, - 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -4504,7 +4827,7 @@ func file_taprootassets_proto_rawDescGZIP() []byte { } var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 60) +var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 63) var file_taprootassets_proto_goTypes = []interface{}{ (AssetType)(0), // 0: taprpc.AssetType (AssetMetaType)(0), // 1: taprpc.AssetMetaType @@ -4549,27 +4872,30 @@ var file_taprootassets_proto_goTypes = []interface{}{ (*KeyDescriptor)(nil), // 40: taprpc.KeyDescriptor (*DecodeAddrRequest)(nil), // 41: taprpc.DecodeAddrRequest (*ProofFile)(nil), // 42: taprpc.ProofFile - (*ProofVerifyResponse)(nil), // 43: taprpc.ProofVerifyResponse - (*ExportProofRequest)(nil), // 44: taprpc.ExportProofRequest - (*ImportProofRequest)(nil), // 45: taprpc.ImportProofRequest - (*ImportProofResponse)(nil), // 46: taprpc.ImportProofResponse - (*AddrEvent)(nil), // 47: taprpc.AddrEvent - (*AddrReceivesRequest)(nil), // 48: taprpc.AddrReceivesRequest - (*AddrReceivesResponse)(nil), // 49: taprpc.AddrReceivesResponse - (*SendAssetRequest)(nil), // 50: taprpc.SendAssetRequest - (*PrevInputAsset)(nil), // 51: taprpc.PrevInputAsset - (*SendAssetResponse)(nil), // 52: taprpc.SendAssetResponse - (*GetInfoRequest)(nil), // 53: taprpc.GetInfoRequest - (*GetInfoResponse)(nil), // 54: taprpc.GetInfoResponse - (*SubscribeSendAssetEventNtfnsRequest)(nil), // 55: taprpc.SubscribeSendAssetEventNtfnsRequest - (*SendAssetEvent)(nil), // 56: taprpc.SendAssetEvent - (*ExecuteSendStateEvent)(nil), // 57: taprpc.ExecuteSendStateEvent - (*ReceiverProofBackoffWaitEvent)(nil), // 58: taprpc.ReceiverProofBackoffWaitEvent - (*FetchAssetMetaRequest)(nil), // 59: taprpc.FetchAssetMetaRequest - nil, // 60: taprpc.ListUtxosResponse.ManagedUtxosEntry - nil, // 61: taprpc.ListGroupsResponse.GroupsEntry - nil, // 62: taprpc.ListBalancesResponse.AssetBalancesEntry - nil, // 63: taprpc.ListBalancesResponse.AssetGroupBalancesEntry + (*DecodedProof)(nil), // 43: taprpc.DecodedProof + (*VerifyProofResponse)(nil), // 44: taprpc.VerifyProofResponse + (*DecodeProofRequest)(nil), // 45: taprpc.DecodeProofRequest + (*DecodeProofResponse)(nil), // 46: taprpc.DecodeProofResponse + (*ExportProofRequest)(nil), // 47: taprpc.ExportProofRequest + (*ImportProofRequest)(nil), // 48: taprpc.ImportProofRequest + (*ImportProofResponse)(nil), // 49: taprpc.ImportProofResponse + (*AddrEvent)(nil), // 50: taprpc.AddrEvent + (*AddrReceivesRequest)(nil), // 51: taprpc.AddrReceivesRequest + (*AddrReceivesResponse)(nil), // 52: taprpc.AddrReceivesResponse + (*SendAssetRequest)(nil), // 53: taprpc.SendAssetRequest + (*PrevInputAsset)(nil), // 54: taprpc.PrevInputAsset + (*SendAssetResponse)(nil), // 55: taprpc.SendAssetResponse + (*GetInfoRequest)(nil), // 56: taprpc.GetInfoRequest + (*GetInfoResponse)(nil), // 57: taprpc.GetInfoResponse + (*SubscribeSendAssetEventNtfnsRequest)(nil), // 58: taprpc.SubscribeSendAssetEventNtfnsRequest + (*SendAssetEvent)(nil), // 59: taprpc.SendAssetEvent + (*ExecuteSendStateEvent)(nil), // 60: taprpc.ExecuteSendStateEvent + (*ReceiverProofBackoffWaitEvent)(nil), // 61: taprpc.ReceiverProofBackoffWaitEvent + (*FetchAssetMetaRequest)(nil), // 62: taprpc.FetchAssetMetaRequest + nil, // 63: taprpc.ListUtxosResponse.ManagedUtxosEntry + nil, // 64: taprpc.ListGroupsResponse.GroupsEntry + nil, // 65: taprpc.ListBalancesResponse.AssetBalancesEntry + nil, // 66: taprpc.ListBalancesResponse.AssetGroupBalancesEntry } var file_taprootassets_proto_depIdxs = []int32{ 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType @@ -4578,19 +4904,19 @@ var file_taprootassets_proto_depIdxs = []int32{ 8, // 3: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup 6, // 4: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo 10, // 5: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness - 51, // 6: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset + 54, // 6: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset 11, // 7: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment 9, // 8: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset 9, // 9: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset 9, // 10: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset - 60, // 11: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry + 63, // 11: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry 0, // 12: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType 17, // 13: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable - 61, // 14: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry + 64, // 14: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry 7, // 15: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo 0, // 16: taprpc.AssetBalance.asset_type:type_name -> taprpc.AssetType - 62, // 17: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry - 63, // 18: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry + 65, // 17: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry + 66, // 18: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry 26, // 19: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer 27, // 20: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput 29, // 21: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput @@ -4602,58 +4928,64 @@ var file_taprootassets_proto_depIdxs = []int32{ 40, // 27: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor 40, // 28: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor 39, // 29: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator - 34, // 30: taprpc.AddrEvent.addr:type_name -> taprpc.Addr - 3, // 31: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus - 3, // 32: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus - 47, // 33: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent - 26, // 34: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 57, // 35: taprpc.SendAssetEvent.execute_send_state_event:type_name -> taprpc.ExecuteSendStateEvent - 58, // 36: taprpc.SendAssetEvent.receiver_proof_backoff_wait_event:type_name -> taprpc.ReceiverProofBackoffWaitEvent - 14, // 37: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 18, // 38: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 21, // 39: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 22, // 40: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 5, // 41: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 13, // 42: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 16, // 43: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 20, // 44: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 24, // 45: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 30, // 46: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 32, // 47: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 35, // 48: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 37, // 49: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 41, // 50: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 48, // 51: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 42, // 52: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 44, // 53: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 45, // 54: taprpc.TaprootAssets.ImportProof:input_type -> taprpc.ImportProofRequest - 50, // 55: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 53, // 56: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 55, // 57: taprpc.TaprootAssets.SubscribeSendAssetEventNtfns:input_type -> taprpc.SubscribeSendAssetEventNtfnsRequest - 59, // 58: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 12, // 59: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 15, // 60: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 19, // 61: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 23, // 62: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 25, // 63: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 31, // 64: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 33, // 65: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 36, // 66: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 34, // 67: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 34, // 68: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 49, // 69: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 43, // 70: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.ProofVerifyResponse - 42, // 71: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 46, // 72: taprpc.TaprootAssets.ImportProof:output_type -> taprpc.ImportProofResponse - 52, // 73: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 54, // 74: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 56, // 75: taprpc.TaprootAssets.SubscribeSendAssetEventNtfns:output_type -> taprpc.SendAssetEvent - 4, // 76: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta - 59, // [59:77] is the sub-list for method output_type - 41, // [41:59] 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 + 9, // 30: taprpc.DecodedProof.asset:type_name -> taprpc.Asset + 4, // 31: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta + 43, // 32: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 43, // 33: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 34, // 34: taprpc.AddrEvent.addr:type_name -> taprpc.Addr + 3, // 35: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus + 3, // 36: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus + 50, // 37: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent + 26, // 38: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 60, // 39: taprpc.SendAssetEvent.execute_send_state_event:type_name -> taprpc.ExecuteSendStateEvent + 61, // 40: taprpc.SendAssetEvent.receiver_proof_backoff_wait_event:type_name -> taprpc.ReceiverProofBackoffWaitEvent + 14, // 41: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 18, // 42: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 21, // 43: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 22, // 44: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 5, // 45: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 13, // 46: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 16, // 47: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 20, // 48: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 24, // 49: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 30, // 50: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 32, // 51: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 35, // 52: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 37, // 53: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 41, // 54: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 51, // 55: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 42, // 56: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 45, // 57: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 47, // 58: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 48, // 59: taprpc.TaprootAssets.ImportProof:input_type -> taprpc.ImportProofRequest + 53, // 60: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 56, // 61: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 58, // 62: taprpc.TaprootAssets.SubscribeSendAssetEventNtfns:input_type -> taprpc.SubscribeSendAssetEventNtfnsRequest + 62, // 63: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 12, // 64: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 15, // 65: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 19, // 66: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 23, // 67: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 25, // 68: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 31, // 69: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 33, // 70: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 36, // 71: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 34, // 72: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 34, // 73: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 52, // 74: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 44, // 75: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 46, // 76: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 42, // 77: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 49, // 78: taprpc.TaprootAssets.ImportProof:output_type -> taprpc.ImportProofResponse + 55, // 79: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 57, // 80: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 59, // 81: taprpc.TaprootAssets.SubscribeSendAssetEventNtfns:output_type -> taprpc.SendAssetEvent + 4, // 82: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta + 64, // [64:83] is the sub-list for method output_type + 45, // [45:64] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } @@ -5131,7 +5463,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofVerifyResponse); i { + switch v := v.(*DecodedProof); i { case 0: return &v.state case 1: @@ -5143,7 +5475,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportProofRequest); i { + switch v := v.(*VerifyProofResponse); i { case 0: return &v.state case 1: @@ -5155,7 +5487,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportProofRequest); i { + switch v := v.(*DecodeProofRequest); i { case 0: return &v.state case 1: @@ -5167,7 +5499,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportProofResponse); i { + switch v := v.(*DecodeProofResponse); i { case 0: return &v.state case 1: @@ -5179,7 +5511,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddrEvent); i { + switch v := v.(*ExportProofRequest); i { case 0: return &v.state case 1: @@ -5191,7 +5523,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddrReceivesRequest); i { + switch v := v.(*ImportProofRequest); i { case 0: return &v.state case 1: @@ -5203,7 +5535,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddrReceivesResponse); i { + switch v := v.(*ImportProofResponse); i { case 0: return &v.state case 1: @@ -5215,7 +5547,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendAssetRequest); i { + switch v := v.(*AddrEvent); i { case 0: return &v.state case 1: @@ -5227,7 +5559,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrevInputAsset); i { + switch v := v.(*AddrReceivesRequest); i { case 0: return &v.state case 1: @@ -5239,7 +5571,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendAssetResponse); i { + switch v := v.(*AddrReceivesResponse); i { case 0: return &v.state case 1: @@ -5251,7 +5583,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInfoRequest); i { + switch v := v.(*SendAssetRequest); i { case 0: return &v.state case 1: @@ -5263,7 +5595,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInfoResponse); i { + switch v := v.(*PrevInputAsset); i { case 0: return &v.state case 1: @@ -5275,7 +5607,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeSendAssetEventNtfnsRequest); i { + switch v := v.(*SendAssetResponse); i { case 0: return &v.state case 1: @@ -5287,7 +5619,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendAssetEvent); i { + switch v := v.(*GetInfoRequest); i { case 0: return &v.state case 1: @@ -5299,7 +5631,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecuteSendStateEvent); i { + switch v := v.(*GetInfoResponse); i { case 0: return &v.state case 1: @@ -5311,7 +5643,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReceiverProofBackoffWaitEvent); i { + switch v := v.(*SubscribeSendAssetEventNtfnsRequest); i { case 0: return &v.state case 1: @@ -5323,6 +5655,42 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendAssetEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_taprootassets_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteSendStateEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_taprootassets_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReceiverProofBackoffWaitEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_taprootassets_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchAssetMetaRequest); i { case 0: return &v.state @@ -5339,11 +5707,11 @@ func file_taprootassets_proto_init() { (*ListBalancesRequest_AssetId)(nil), (*ListBalancesRequest_GroupKey)(nil), } - file_taprootassets_proto_msgTypes[52].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[55].OneofWrappers = []interface{}{ (*SendAssetEvent_ExecuteSendStateEvent)(nil), (*SendAssetEvent_ReceiverProofBackoffWaitEvent)(nil), } - file_taprootassets_proto_msgTypes[55].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[58].OneofWrappers = []interface{}{ (*FetchAssetMetaRequest_AssetId)(nil), (*FetchAssetMetaRequest_MetaHash)(nil), } @@ -5353,7 +5721,7 @@ func file_taprootassets_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_taprootassets_proto_rawDesc, NumEnums: 4, - NumMessages: 60, + NumMessages: 63, NumExtensions: 0, NumServices: 1, }, diff --git a/taprpc/taprootassets.pb.gw.go b/taprpc/taprootassets.pb.gw.go index 1e1786076..42e2e3258 100644 --- a/taprpc/taprootassets.pb.gw.go +++ b/taprpc/taprootassets.pb.gw.go @@ -397,6 +397,40 @@ func local_request_TaprootAssets_VerifyProof_0(ctx context.Context, marshaler ru } +func request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DecodeProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DecodeProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler runtime.Marshaler, server TaprootAssetsServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DecodeProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DecodeProof(ctx, &protoReq) + return msg, metadata, err + +} + func request_TaprootAssets_ExportProof_0(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ExportProofRequest var metadata runtime.ServerMetadata @@ -876,6 +910,29 @@ func RegisterTaprootAssetsHandlerServer(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("POST", pattern_TaprootAssets_DecodeProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/taprpc.TaprootAssets/DecodeProof", runtime.WithHTTPPathPattern("/v1/taproot-assets/proofs/decode")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TaprootAssets_DecodeProof_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TaprootAssets_DecodeProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_TaprootAssets_ExportProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1279,6 +1336,26 @@ func RegisterTaprootAssetsHandlerClient(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("POST", pattern_TaprootAssets_DecodeProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/taprpc.TaprootAssets/DecodeProof", runtime.WithHTTPPathPattern("/v1/taproot-assets/proofs/decode")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TaprootAssets_DecodeProof_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TaprootAssets_DecodeProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_TaprootAssets_ExportProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1427,6 +1504,8 @@ var ( pattern_TaprootAssets_VerifyProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "taproot-assets", "proofs", "verify"}, "")) + pattern_TaprootAssets_DecodeProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "taproot-assets", "proofs", "decode"}, "")) + pattern_TaprootAssets_ExportProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "taproot-assets", "proofs", "export"}, "")) pattern_TaprootAssets_ImportProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "taproot-assets", "proofs", "import"}, "")) @@ -1465,6 +1544,8 @@ var ( forward_TaprootAssets_VerifyProof_0 = runtime.ForwardResponseMessage + forward_TaprootAssets_DecodeProof_0 = runtime.ForwardResponseMessage + forward_TaprootAssets_ExportProof_0 = runtime.ForwardResponseMessage forward_TaprootAssets_ImportProof_0 = runtime.ForwardResponseMessage diff --git a/taprpc/taprootassets.pb.json.go b/taprpc/taprootassets.pb.json.go index bf046f651..bf0254f30 100644 --- a/taprpc/taprootassets.pb.json.go +++ b/taprpc/taprootassets.pb.json.go @@ -321,6 +321,31 @@ func RegisterTaprootAssetsJSONCallbacks(registry map[string]func(ctx context.Con callback(string(respBytes), nil) } + registry["taprpc.TaprootAssets.DecodeProof"] = func(ctx context.Context, + conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { + + req := &DecodeProofRequest{} + err := marshaler.Unmarshal([]byte(reqJSON), req) + if err != nil { + callback("", err) + return + } + + client := NewTaprootAssetsClient(conn) + resp, err := client.DecodeProof(ctx, req) + if err != nil { + callback("", err) + return + } + + respBytes, err := marshaler.Marshal(resp) + if err != nil { + callback("", err) + return + } + callback(string(respBytes), nil) + } + registry["taprpc.TaprootAssets.ExportProof"] = func(ctx context.Context, conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index f04a73b15..4599a64a6 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -73,7 +73,13 @@ service TaprootAssets { VerifyProof attempts to verify a given proof file that claims to be anchored at the specified genesis point. */ - rpc VerifyProof (ProofFile) returns (ProofVerifyResponse); + rpc VerifyProof (ProofFile) returns (VerifyProofResponse); + + /* tarocli: `proofs decode` + DecodeProof attempts to decode a given proof file into human readable + format. + */ + rpc DecodeProof (DecodeProofRequest) returns (DecodeProofResponse); /* tapcli: `proofs export` ExportProof exports the latest raw proof file anchored at the specified @@ -668,8 +674,70 @@ message ProofFile { string genesis_point = 2; } -message ProofVerifyResponse { +message DecodedProof { + // The index depth of the decoded proof, with 0 being the latest proof. + uint32 proof_at_depth = 1; + + // The total number of proofs contained in the raw proof. + uint32 number_of_proofs = 2; + + // The asset referenced in the proof. + Asset asset = 3; + + // The reveal meta data associated with the proof, if available. + AssetMeta meta_reveal = 4; + + // The merkle proof for AnchorTx used to prove its + // inclusion within BlockHeader. + bytes tx_merkle_proof = 5; + + // The TaprootProof proving the new inclusion of the + // resulting asset within AnchorTx. + bytes inclusion_proof = 6; + + // The set of TaprootProofs proving the exclusion of + // the resulting asset from all other Taproot outputs within AnchorTx. + repeated bytes exclusion_proofs = 7; + + // An optional TaprootProof needed if this asset is + // the result of a split. SplitRootProof proves inclusion of the root + // asset of the split. + bytes split_root_proof = 8; + + // The number of additional nested full proofs for any inputs found within + // the resulting asset. + uint32 num_additional_inputs = 9; + + // ChallengeWitness is an optional virtual transaction witness that serves + // as an ownership proof for the asset. If this is non-nil, then it is a + // valid transfer witness for a 1-input, 1-output virtual transaction that + // spends the asset in this proof and sends it to the NUMS key, to prove + // that the creator of the proof is able to produce a valid signature to + // spend the asset. + repeated bytes challenge_witness = 10; +} + +message VerifyProofResponse { bool valid = 1; + DecodedProof decoded_proof = 2; +} + +message DecodeProofRequest { + // The raw proof in bytes to decode, which may contain multiple proofs. + bytes raw_proof = 1; + + // The index depth of the decoded proof, with 0 being the latest proof. + uint32 proof_at_depth = 2; + + // An option to include previous witnesses in decoding. + bool with_prev_witnesses = 3; + + // An option to attempt to retrieve the meta data associated with the proof. + bool with_meta_reveal = 4; +} + +message DecodeProofResponse { + DecodedProof decoded_proof = 1; } message ExportProofRequest { diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index 27d6791cb..5cb63af4b 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -438,6 +438,39 @@ ] } }, + "/v1/taproot-assets/proofs/decode": { + "post": { + "summary": "tarocli: `proofs decode`\nDecodeProof attempts to decode a given proof file into human readable\nformat.", + "operationId": "TaprootAssets_DecodeProof", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/taprpcDecodeProofResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/taprpcDecodeProofRequest" + } + } + ], + "tags": [ + "TaprootAssets" + ] + } + }, "/v1/taproot-assets/proofs/export": { "post": { "summary": "tapcli: `proofs export`\nExportProof exports the latest raw proof file anchored at the specified\nscript_key.", @@ -512,7 +545,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/taprpcProofVerifyResponse" + "$ref": "#/definitions/taprpcVerifyProofResponse" } }, "default": { @@ -1095,6 +1128,96 @@ } } }, + "taprpcDecodeProofRequest": { + "type": "object", + "properties": { + "raw_proof": { + "type": "string", + "format": "byte", + "description": "The raw proof in bytes to decode, which may contain multiple proofs." + }, + "proof_at_depth": { + "type": "integer", + "format": "int64", + "description": "The index depth of the decoded proof, with 0 being the latest proof." + }, + "with_prev_witnesses": { + "type": "boolean", + "description": "An option to include previous witnesses in decoding." + }, + "with_meta_reveal": { + "type": "boolean", + "description": "An option to attempt to retrieve the meta data associated with the proof." + } + } + }, + "taprpcDecodeProofResponse": { + "type": "object", + "properties": { + "decoded_proof": { + "$ref": "#/definitions/taprpcDecodedProof" + } + } + }, + "taprpcDecodedProof": { + "type": "object", + "properties": { + "proof_at_depth": { + "type": "integer", + "format": "int64", + "description": "The index depth of the decoded proof, with 0 being the latest proof." + }, + "number_of_proofs": { + "type": "integer", + "format": "int64", + "description": "The total number of proofs contained in the raw proof." + }, + "asset": { + "$ref": "#/definitions/taprpcAsset", + "description": "The asset referenced in the proof." + }, + "meta_reveal": { + "$ref": "#/definitions/taprpcAssetMeta", + "description": "The reveal meta data associated with the proof, if available." + }, + "tx_merkle_proof": { + "type": "string", + "format": "byte", + "description": "The merkle proof for AnchorTx used to prove its\ninclusion within BlockHeader." + }, + "inclusion_proof": { + "type": "string", + "format": "byte", + "description": "The TaprootProof proving the new inclusion of the\nresulting asset within AnchorTx." + }, + "exclusion_proofs": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "The set of TaprootProofs proving the exclusion of\nthe resulting asset from all other Taproot outputs within AnchorTx." + }, + "split_root_proof": { + "type": "string", + "format": "byte", + "description": "An optional TaprootProof needed if this asset is\nthe result of a split. SplitRootProof proves inclusion of the root\nasset of the split." + }, + "num_additional_inputs": { + "type": "integer", + "format": "int64", + "description": "The number of additional nested full proofs for any inputs found within\nthe resulting asset." + }, + "challenge_witness": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "ChallengeWitness is an optional virtual transaction witness that serves\nas an ownership proof for the asset. If this is non-nil, then it is a\nvalid transfer witness for a 1-input, 1-output virtual transaction that\nspends the asset in this proof and sends it to the NUMS key, to prove\nthat the creator of the proof is able to produce a valid signature to\nspend the asset." + } + } + }, "taprpcExecuteSendStateEvent": { "type": "object", "properties": { @@ -1415,14 +1538,6 @@ } } }, - "taprpcProofVerifyResponse": { - "type": "object", - "properties": { - "valid": { - "type": "boolean" - } - } - }, "taprpcQueryAddrResponse": { "type": "object", "properties": { @@ -1608,6 +1723,17 @@ "format": "int64" } } + }, + "taprpcVerifyProofResponse": { + "type": "object", + "properties": { + "valid": { + "type": "boolean" + }, + "decoded_proof": { + "$ref": "#/definitions/taprpcDecodedProof" + } + } } } } diff --git a/taprpc/taprootassets.yaml b/taprpc/taprootassets.yaml index ac237ef55..d83dd0362 100644 --- a/taprpc/taprootassets.yaml +++ b/taprpc/taprootassets.yaml @@ -37,6 +37,10 @@ http: post: "/v1/taproot-assets/proofs/verify" body: "*" + - selector: taprpc.TaprootAssets.DecodeProof + post: "/v1/taproot-assets/proofs/decode" + body: "*" + - selector: taprpc.TaprootAssets.ExportProof post: "/v1/taproot-assets/proofs/export" body: "*" diff --git a/taprpc/taprootassets_grpc.pb.go b/taprpc/taprootassets_grpc.pb.go index f2cd0a137..e0910e39c 100644 --- a/taprpc/taprootassets_grpc.pb.go +++ b/taprpc/taprootassets_grpc.pb.go @@ -63,7 +63,11 @@ type TaprootAssetsClient interface { // tapcli: `proofs verify` // VerifyProof attempts to verify a given proof file that claims to be anchored // at the specified genesis point. - VerifyProof(ctx context.Context, in *ProofFile, opts ...grpc.CallOption) (*ProofVerifyResponse, error) + VerifyProof(ctx context.Context, in *ProofFile, opts ...grpc.CallOption) (*VerifyProofResponse, error) + // tarocli: `proofs decode` + // DecodeProof attempts to decode a given proof file into human readable + // format. + DecodeProof(ctx context.Context, in *DecodeProofRequest, opts ...grpc.CallOption) (*DecodeProofResponse, error) // tapcli: `proofs export` // ExportProof exports the latest raw proof file anchored at the specified // script_key. @@ -197,8 +201,8 @@ func (c *taprootAssetsClient) AddrReceives(ctx context.Context, in *AddrReceives return out, nil } -func (c *taprootAssetsClient) VerifyProof(ctx context.Context, in *ProofFile, opts ...grpc.CallOption) (*ProofVerifyResponse, error) { - out := new(ProofVerifyResponse) +func (c *taprootAssetsClient) VerifyProof(ctx context.Context, in *ProofFile, opts ...grpc.CallOption) (*VerifyProofResponse, error) { + out := new(VerifyProofResponse) err := c.cc.Invoke(ctx, "/taprpc.TaprootAssets/VerifyProof", in, out, opts...) if err != nil { return nil, err @@ -206,6 +210,15 @@ func (c *taprootAssetsClient) VerifyProof(ctx context.Context, in *ProofFile, op return out, nil } +func (c *taprootAssetsClient) DecodeProof(ctx context.Context, in *DecodeProofRequest, opts ...grpc.CallOption) (*DecodeProofResponse, error) { + out := new(DecodeProofResponse) + err := c.cc.Invoke(ctx, "/taprpc.TaprootAssets/DecodeProof", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *taprootAssetsClient) ExportProof(ctx context.Context, in *ExportProofRequest, opts ...grpc.CallOption) (*ProofFile, error) { out := new(ProofFile) err := c.cc.Invoke(ctx, "/taprpc.TaprootAssets/ExportProof", in, out, opts...) @@ -332,7 +345,11 @@ type TaprootAssetsServer interface { // tapcli: `proofs verify` // VerifyProof attempts to verify a given proof file that claims to be anchored // at the specified genesis point. - VerifyProof(context.Context, *ProofFile) (*ProofVerifyResponse, error) + VerifyProof(context.Context, *ProofFile) (*VerifyProofResponse, error) + // tarocli: `proofs decode` + // DecodeProof attempts to decode a given proof file into human readable + // format. + DecodeProof(context.Context, *DecodeProofRequest) (*DecodeProofResponse, error) // tapcli: `proofs export` // ExportProof exports the latest raw proof file anchored at the specified // script_key. @@ -397,9 +414,12 @@ func (UnimplementedTaprootAssetsServer) DecodeAddr(context.Context, *DecodeAddrR func (UnimplementedTaprootAssetsServer) AddrReceives(context.Context, *AddrReceivesRequest) (*AddrReceivesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AddrReceives not implemented") } -func (UnimplementedTaprootAssetsServer) VerifyProof(context.Context, *ProofFile) (*ProofVerifyResponse, error) { +func (UnimplementedTaprootAssetsServer) VerifyProof(context.Context, *ProofFile) (*VerifyProofResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyProof not implemented") } +func (UnimplementedTaprootAssetsServer) DecodeProof(context.Context, *DecodeProofRequest) (*DecodeProofResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DecodeProof not implemented") +} func (UnimplementedTaprootAssetsServer) ExportProof(context.Context, *ExportProofRequest) (*ProofFile, error) { return nil, status.Errorf(codes.Unimplemented, "method ExportProof not implemented") } @@ -647,6 +667,24 @@ func _TaprootAssets_VerifyProof_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _TaprootAssets_DecodeProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DecodeProofRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TaprootAssetsServer).DecodeProof(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/taprpc.TaprootAssets/DecodeProof", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TaprootAssetsServer).DecodeProof(ctx, req.(*DecodeProofRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TaprootAssets_ExportProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ExportProofRequest) if err := dec(in); err != nil { @@ -813,6 +851,10 @@ var TaprootAssets_ServiceDesc = grpc.ServiceDesc{ MethodName: "VerifyProof", Handler: _TaprootAssets_VerifyProof_Handler, }, + { + MethodName: "DecodeProof", + Handler: _TaprootAssets_DecodeProof_Handler, + }, { MethodName: "ExportProof", Handler: _TaprootAssets_ExportProof_Handler, diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json index c59e9a102..98b6d6759 100644 --- a/taprpc/universerpc/universe.swagger.json +++ b/taprpc/universerpc/universe.swagger.json @@ -923,7 +923,6 @@ }, "anchor_block_hash": { "type": "string", - "format": "byte", "description": "The block hash the contains the anchor transaction above." }, "anchor_outpoint": { From c05ad13afef0a415a3c57a51b4bf2cad804647cf Mon Sep 17 00:00:00 2001 From: habibitcoin Date: Sun, 28 May 2023 01:08:39 -0400 Subject: [PATCH 3/4] itest: Update verifyProofBlob() to include DecodeProof() assertions --- itest/assertions.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/itest/assertions.go b/itest/assertions.go index 577c9a8a7..b9197bc80 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -218,6 +218,13 @@ func verifyProofBlob(t *testing.T, tapd *tapdHarness, require.NoError(t, err) require.True(t, verifyResp.Valid) + // Also make sure that the RPC can decode the proof as well. + decodeResp, err := tapd.DecodeProof(ctxt, &taprpc.DecodeProofRequest{ + RawProof: blob, + }) + require.NoError(t, err) + require.NotEmpty(t, decodeResp.DecodedProof.Asset) + headerVerifier := func(blockHeader wire.BlockHeader) error { hash := blockHeader.BlockHash() req := &chainrpc.GetBlockRequest{ From dc1f762df1fc3f58432ed0ff05c86b587b90586d Mon Sep 17 00:00:00 2001 From: habibitcoin Date: Thu, 15 Jun 2023 18:14:34 -0400 Subject: [PATCH 4/4] tapcli: implement proof decode command --- cmd/tapcli/proofs.go | 74 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/cmd/tapcli/proofs.go b/cmd/tapcli/proofs.go index ad4497e60..ebd46c6ca 100644 --- a/cmd/tapcli/proofs.go +++ b/cmd/tapcli/proofs.go @@ -21,6 +21,7 @@ var proofCommands = []cli.Command{ Category: "Proofs", Subcommands: []cli.Command{ verifyProofCommand, + decodeProofCommand, exportProofCommand, importProofCommand, proveOwnershipCommand, @@ -31,6 +32,10 @@ var proofCommands = []cli.Command{ const ( proofPathName = "proof_file" + + proofAtDepthName = "proof_at_depth" + withPrevWitnessesName = "latest_proof" + withMetaRevealName = "meta_reveal" ) var verifyProofCommand = cli.Command{ @@ -81,6 +86,75 @@ func verifyProof(ctx *cli.Context) error { return nil } +var decodeProofCommand = cli.Command{ + Name: "decode", + ShortName: "d", + Usage: "decode a Taproot Asset proof", + Description: ` + Decode a taproot asset proof that contains the full provenance of an + asset into human readable format. Such a proof proves the existence + of an asset, but does not prove that the creator of the proof can + actually also spend the asset. To verify ownership, use the + "verifyownership" command with a separate ownership proof. +`, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: proofPathName, + Usage: "the path to the proof file on disk; use the " + + "dash character (-) to read from stdin instead", + }, + cli.Int64Flag{ + Name: proofAtDepthName, + Value: 0, + Usage: "the index depth of the decoded proof to fetch " + + "with 0 being the latest proof", + }, + cli.BoolFlag{ + Name: withPrevWitnessesName, + Usage: "if true, previous witnesses will be returned", + }, + cli.BoolFlag{ + Name: withMetaRevealName, + Usage: "if true, will attempt to reveal the meta data " + + "associated with the proof", + }, + }, + Action: decodeProof, +} + +func decodeProof(ctx *cli.Context) error { + ctxc := getContext() + client, cleanUp := getClient(ctx) + defer cleanUp() + + switch { + case !ctx.IsSet(proofPathName): + _ = cli.ShowCommandHelp(ctx, "decode") + return nil + } + + filePath := lncfg.CleanAndExpandPath(ctx.String(proofPathName)) + rawFile, err := readFile(filePath) + if err != nil { + return fmt.Errorf("unable to read proof file: %w", err) + } + + req := &taprpc.DecodeProofRequest{ + RawProof: rawFile, + ProofAtDepth: uint32(ctx.Uint(proofAtDepthName)), + WithPrevWitnesses: ctx.Bool(withPrevWitnessesName), + WithMetaReveal: ctx.Bool(withMetaRevealName), + } + + resp, err := client.DecodeProof(ctxc, req) + if err != nil { + return fmt.Errorf("unable to verify file: %w", err) + } + + printRespJSON(resp) + return nil +} + var verifyOwnershipCommand = cli.Command{ Name: "verifyownership", ShortName: "vo",