From 4795a215798e6b4d220ff6517c72e73f5f7e2a3d Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Mon, 19 Feb 2024 16:11:34 +0100 Subject: [PATCH] multi: add CommitVirtualPsbts RPC --- perms/perms.go | 4 + rpcserver.go | 416 ++++++++- taprpc/assetwalletrpc/assetwallet.pb.go | 790 ++++++++++++------ taprpc/assetwalletrpc/assetwallet.pb.gw.go | 81 ++ taprpc/assetwalletrpc/assetwallet.pb.json.go | 25 + taprpc/assetwalletrpc/assetwallet.proto | 88 ++ .../assetwalletrpc/assetwallet.swagger.json | 100 +++ taprpc/assetwalletrpc/assetwallet.yaml | 4 + taprpc/assetwalletrpc/assetwallet_grpc.pb.go | 44 + 9 files changed, 1287 insertions(+), 265 deletions(-) diff --git a/perms/perms.go b/perms/perms.go index ea718f967..482bff94a 100644 --- a/perms/perms.go +++ b/perms/perms.go @@ -100,6 +100,10 @@ var ( Entity: "assets", Action: "write", }}, + "/assetwalletrpc.AssetWallet/CommitVirtualPsbts": {{ + Entity: "assets", + Action: "write", + }}, "/assetwalletrpc.AssetWallet/NextInternalKey": {{ Entity: "assets", Action: "write", diff --git a/rpcserver.go b/rpcserver.go index 87e07c272..e837100d6 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -43,6 +43,7 @@ import ( "github.com/lightningnetwork/lnd/build" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnrpc" + "github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/signal" "golang.org/x/time/rate" @@ -57,6 +58,10 @@ var ( // ServerMaxMsgReceiveSize is the largest message our server will // receive. ServerMaxMsgReceiveSize = grpc.MaxRecvMsgSize(lnrpc.MaxGrpcMsgSize) + + // P2TrChangeType is the type of change address that should be used for + // funding PSBTs, as we'll always want to use P2TR change addresses. + P2TrChangeType = walletrpc.ChangeAddressType_CHANGE_ADDRESS_TYPE_P2TR ) const ( @@ -1874,6 +1879,345 @@ func (r *rpcServer) AnchorVirtualPsbts(ctx context.Context, }, nil } +// CommitVirtualPsbts creates the output commitments and proofs for the given +// virtual transactions by committing them to the BTC level anchor transaction. +// In addition, the BTC level anchor transaction is funded and prepared up to +// the point where it is ready to be signed. +func (r *rpcServer) CommitVirtualPsbts(ctx context.Context, + req *wrpc.CommitVirtualPsbtsRequest) (*wrpc.CommitVirtualPsbtsResponse, + error) { + + if len(req.VirtualPsbts) == 0 { + return nil, fmt.Errorf("no virtual PSBTs specified") + } + + pkt, err := psbt.NewFromRawBytes(bytes.NewReader(req.AnchorPsbt), false) + if err != nil { + return nil, fmt.Errorf("error decoding packet: %w", err) + } + + vPackets := make([]*tappsbt.VPacket, len(req.VirtualPsbts)) + for idx := range req.VirtualPsbts { + vPackets[idx], err = tappsbt.Decode(req.VirtualPsbts[idx]) + if err != nil { + return nil, fmt.Errorf("error decoding virtual "+ + "packet at index %d: %w", idx, err) + } + } + + // Make sure we decorate all asset inputs with the correct internal key + // derivation path (if it's indeed a key this daemon owns). + for idx := range pkt.Inputs { + pIn := &pkt.Inputs[idx] + + // We only care about asset inputs which always specify a + // Taproot merkle root. + if len(pIn.TaprootMerkleRoot) == 0 { + continue + } + + // We can't query the internal key if there is none specified. + if len(pIn.TaprootInternalKey) != schnorr.PubKeyBytesLen { + continue + } + + // If we already have the derivation info, we can skip this + // input. + if len(pIn.TaprootBip32Derivation) > 0 { + continue + } + + // Let's query our node for the internal key information now. + internalKey, keyLocator, err := r.querySchnorrInternalKey( + ctx, pIn.TaprootInternalKey, + ) + + switch { + case errors.Is(err, address.ErrInternalKeyNotFound): + // If the internal key is not known, we can't add the + // derivation info. Most likely this asset input is not + // owned by this daemon but another party. + continue + + case err != nil: + return nil, fmt.Errorf("error querying internal key: "+ + "%w", err) + } + + keyDesc := keychain.KeyDescriptor{ + PubKey: internalKey, + KeyLocator: keyLocator, + } + derivation, trDerivation := tappsbt.Bip32DerivationFromKeyDesc( + keyDesc, r.cfg.ChainParams.HDCoinType, + ) + pIn.Bip32Derivation = []*psbt.Bip32Derivation{derivation} + pIn.TaprootBip32Derivation = []*psbt.TaprootBip32Derivation{ + trDerivation, + } + } + + // TODO(guggero): Validate inputs/outputs by going through all vPSBTs. + + // We're ready to attempt to fund the transaction now. For that we first + // need to re-serialize our packet. + var buf bytes.Buffer + err = pkt.Serialize(&buf) + if err != nil { + return nil, fmt.Errorf("error serializing packet: %w", err) + } + + // The change output and fee parameters of this RPC are identical to the + // walletrpc.FundPsbt, so we just map them 1:1 and let lnd do the + // validation. + coinSelect := &walletrpc.PsbtCoinSelect{ + Psbt: buf.Bytes(), + } + fundRequest := &walletrpc.FundPsbtRequest{ + Template: &walletrpc.FundPsbtRequest_CoinSelect{ + CoinSelect: coinSelect, + }, + MinConfs: 1, + ChangeType: P2TrChangeType, + } + + // Unfortunately we can't use the same RPC types, so we have to do a + // 1:1 mapping to the walletrpc types for the anchor change output and + // fee "oneof" fields. + type existingIndex = walletrpc.PsbtCoinSelect_ExistingOutputIndex + switch change := req.AnchorChangeOutput.(type) { + case *wrpc.CommitVirtualPsbtsRequest_ExistingOutputIndex: + coinSelect.ChangeOutput = &existingIndex{ + ExistingOutputIndex: change.ExistingOutputIndex, + } + + case *wrpc.CommitVirtualPsbtsRequest_Add: + coinSelect.ChangeOutput = &walletrpc.PsbtCoinSelect_Add{ + Add: change.Add, + } + + default: + return nil, fmt.Errorf("unknown change output type") + } + + switch fee := req.Fees.(type) { + case *wrpc.CommitVirtualPsbtsRequest_TargetConf: + fundRequest.Fees = &walletrpc.FundPsbtRequest_TargetConf{ + TargetConf: fee.TargetConf, + } + + case *wrpc.CommitVirtualPsbtsRequest_SatPerVbyte: + fundRequest.Fees = &walletrpc.FundPsbtRequest_SatPerVbyte{ + SatPerVbyte: fee.SatPerVbyte, + } + + default: + return nil, fmt.Errorf("unknown fee type") + } + + lndWallet := r.cfg.Lnd.WalletKit + fundedPacket, changeIndex, lockedUTXO, err := lndWallet.FundPsbt( + ctx, fundRequest, + ) + if err != nil { + return nil, fmt.Errorf("error funding packet: %w", err) + } + + // Validate the actual fee rate of the transaction. + txFees, err := fundedPacket.GetTxFee() + if err != nil { + return nil, fmt.Errorf("error calculating transaction fees: %w", + err) + } + + // TODO(guggero): Create a defer that unlocks the UTXOs if we error out + // anywhere below. + lockedOutpoints := fn.Map( + lockedUTXO, func(utxo *walletrpc.UtxoLease) wire.OutPoint { + var hash chainhash.Hash + copy(hash[:], utxo.Outpoint.TxidBytes) + return wire.OutPoint{ + Hash: hash, + Index: utxo.Outpoint.OutputIndex, + } + }, + ) + + // We can now update the anchor outputs as we have the final + // commitments. + anchorCommitments := make(map[uint32]*commitment.TapCommitment) + for pIdx := range vPackets { + vPacket := vPackets[pIdx] + + inputCommitments := make(tappsbt.InputCommitments) + for inIdx := range vPacket.Inputs { + vIn := vPacket.Inputs[inIdx] + + newCommitment, err := commitment.FromAssets(vIn.Asset()) + if err != nil { + return nil, fmt.Errorf("unable to create "+ + "input commitment: %w", err) + } + + existingCommitment, ok := inputCommitments[vIn.PrevID] + if !ok { + inputCommitments[vIn.PrevID] = newCommitment + + continue + } + + err = existingCommitment.Merge(newCommitment) + if err != nil { + return nil, fmt.Errorf("unable to merge "+ + "input commitments: %w", err) + } + + } + + outputCommitments, err := tapsend.CreateOutputCommitments( + []*tappsbt.VPacket{vPacket}, + ) + if err != nil { + return nil, fmt.Errorf("unable to create new "+ + "output commitments: %w", err) + } + + for oIdx := range outputCommitments { + outputCommitment := outputCommitments[oIdx] + anchorIndex := vPacket.Outputs[oIdx].AnchorOutputIndex + + anchorCommitment, ok := anchorCommitments[anchorIndex] + if ok { + err := anchorCommitment.Merge(outputCommitment) + if err != nil { + return nil, fmt.Errorf("cannot merge "+ + "output commitments: %w", err) + } + } else { + anchorCommitment = outputCommitment + } + anchorCommitments[anchorIndex] = anchorCommitment + } + } + + // TODO(guggero): Check somehow that we've got all the commitments from + // the given inputs? Or check our DB if we have passive assets? + + // Update the anchor outputs with the merged commitments. + for anchorIndex := range anchorCommitments { + // The external output index cannot be out of bounds of the + // actual TX outputs. This should be checked earlier and is just + // a final safeguard here. + if anchorIndex >= uint32(len(fundedPacket.Outputs)) { + return nil, tapsend.ErrInvalidOutputIndexes + } + + btcOut := fundedPacket.Outputs[anchorIndex] + internalKey, err := schnorr.ParsePubKey( + btcOut.TaprootInternalKey, + ) + if err != nil { + return nil, err + } + + // Prepare the anchor output's tapscript sibling, if there is + // one. + _, siblingHash, err := commitment.MaybeDecodeTapscriptPreimage( + btcOut.TaprootTapTree, + ) + if err != nil { + return nil, err + } + + // Create the scripts corresponding to the receiver's + // TapCommitment. + anchorCommitment := anchorCommitments[anchorIndex] + + tapsend.LogCommitment( + "Output", int(anchorIndex), anchorCommitment, + internalKey, nil, nil, + ) + + script, err := tapscript.PayToAddrScript( + *internalKey, siblingHash, *anchorCommitment, + ) + if err != nil { + return nil, err + } + + btcTxOut := fundedPacket.UnsignedTx.TxOut[anchorIndex] + btcTxOut.PkScript = script + } + + // We're done creating the output commitments, we can now create the + // transition proof suffixes. + fundingPacket := &tapsend.AnchorTransaction{ + FundedPsbt: &tapsend.FundedPsbt{ + Pkt: fundedPacket, + ChangeOutputIndex: changeIndex, + ChainFees: int64(txFees), + LockedUTXOs: lockedOutpoints, + }, + FinalTx: fundedPacket.UnsignedTx, + ChainFees: int64(txFees), + OutputCommitments: anchorCommitments, + } + for idx := range vPackets { + vPacket := vPackets[idx] + + for vOutIdx := range vPacket.Outputs { + proofSuffix, err := tapsend.CreateProofSuffix( + fundingPacket, vPacket, vOutIdx, vPackets, + ) + if err != nil { + return nil, fmt.Errorf("unable to create "+ + "proof suffix for output %d of vPSBT "+ + "%d: %w", vOutIdx, idx, err) + } + + vPacket.Outputs[vOutIdx].ProofSuffix = proofSuffix + } + } + + // We can now prepare the full answer, beginning with the serialized + // final packet. + response := &wrpc.CommitVirtualPsbtsResponse{ + ChangeOutputIndex: changeIndex, + } + + buf.Reset() + err = fundedPacket.Serialize(&buf) + if err != nil { + return nil, fmt.Errorf("error serializing packet: %w", err) + } + + response.AnchorPsbt = buf.Bytes() + + // Serialize the final virtual packets. + response.VirtualPsbts = make([][]byte, len(vPackets)) + for idx := range vPackets { + response.VirtualPsbts[idx], err = tappsbt.Encode(vPackets[idx]) + if err != nil { + return nil, fmt.Errorf("error serializing packet: %w", + err) + } + } + + // And finally, we need to also return the locked UTXOs. We just return + // the outpoint, as any additional information can be fetched from the + // lnd wallet directly (we don't want to create pass-through RPCs for + // all those methods). + response.LndLockedUtxos = make([]*taprpc.OutPoint, len(lockedOutpoints)) + for idx := range lockedOutpoints { + response.LndLockedUtxos[idx] = &taprpc.OutPoint{ + Txid: lockedOutpoints[idx].Hash[:], + OutputIndex: lockedOutpoints[idx].Index, + } + } + + return response, nil +} + // NextInternalKey derives the next internal key for the given key family and // stores it as an internal key in the database to make sure it is identified // as a local key later on when importing proofs. While an internal key can @@ -1961,34 +2305,11 @@ func (r *rpcServer) QueryInternalKey(ctx context.Context, } case len(req.InternalKey) == 32: - internalKey, err = schnorr.ParsePubKey(req.InternalKey) - if err != nil { - return nil, fmt.Errorf("error parsing internal key: %w", - err) - } - - keyLocator, err = r.cfg.AssetWallet.FetchInternalKeyLocator( - ctx, internalKey, + internalKey, keyLocator, err = r.querySchnorrInternalKey( + ctx, req.InternalKey, ) - - switch { - // If the key can't be found with the even parity, we'll try - // the odd parity. - case errors.Is(err, address.ErrInternalKeyNotFound): - internalKey = tapscript.FlipParity(internalKey) - - keyLocator, err = r.cfg.AssetWallet.FetchInternalKeyLocator( - ctx, internalKey, - ) - if err != nil { - return nil, fmt.Errorf("error fetching "+ - "internal key: %w", err) - } - - // For any other error from above, we'll return it to the user. - case err != nil: - return nil, fmt.Errorf("error fetching internal key: "+ - "%w", err) + if err != nil { + return nil, err } default: @@ -2003,6 +2324,47 @@ func (r *rpcServer) QueryInternalKey(ctx context.Context, }, nil } +// querySchnorrInternalKey returns the key descriptor for the given internal +// key. This is a special method for the case where the key is a Schnorr key, +// and we need to try both parities. +func (r *rpcServer) querySchnorrInternalKey(ctx context.Context, + schnorrKey []byte) (*btcec.PublicKey, keychain.KeyLocator, error) { + + var keyLocator keychain.KeyLocator + + internalKey, err := schnorr.ParsePubKey(schnorrKey) + if err != nil { + return nil, keyLocator, fmt.Errorf("error parsing internal "+ + "key: %w", err) + } + + keyLocator, err = r.cfg.AssetWallet.FetchInternalKeyLocator( + ctx, internalKey, + ) + + switch { + // If the key can't be found with the even parity, we'll try + // the odd parity. + case errors.Is(err, address.ErrInternalKeyNotFound): + internalKey = tapscript.FlipParity(internalKey) + + keyLocator, err = r.cfg.AssetWallet.FetchInternalKeyLocator( + ctx, internalKey, + ) + if err != nil { + return nil, keyLocator, fmt.Errorf("error fetching "+ + "internal key: %w", err) + } + + // For any other error from above, we'll return it to the user. + case err != nil: + return nil, keyLocator, fmt.Errorf("error fetching internal "+ + "key: %w", err) + } + + return internalKey, keyLocator, nil +} + // QueryScriptKey returns the full script key descriptor for the given tweaked // script key. func (r *rpcServer) QueryScriptKey(ctx context.Context, diff --git a/taprpc/assetwalletrpc/assetwallet.pb.go b/taprpc/assetwalletrpc/assetwallet.pb.go index 572e42f94..61bc39658 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.go @@ -451,6 +451,248 @@ func (x *AnchorVirtualPsbtsRequest) GetVirtualPsbts() [][]byte { return nil } +type CommitVirtualPsbtsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of virtual transactions that should be mapped to the given BTC + // level anchor transaction template. The virtual transactions are expected to + // be signed (or use ASSET_VERSION_V1 with segregated witness to allow for + // signing after committing) and ready to be committed to the anchor + // transaction. + VirtualPsbts [][]byte `protobuf:"bytes,1,rep,name=virtual_psbts,json=virtualPsbts,proto3" json:"virtual_psbts,omitempty"` + // The template of the BTC level anchor transaction that the virtual + // transactions should be mapped to. The template is expected to already + // contain all asset related inputs and outputs corresponding to the virtual + // transactions given above. This can be achieved by using + // tapfreighter.PrepareAnchoringTemplate for example. + AnchorPsbt []byte `protobuf:"bytes,2,opt,name=anchor_psbt,json=anchorPsbt,proto3" json:"anchor_psbt,omitempty"` + // Types that are assignable to AnchorChangeOutput: + // + // *CommitVirtualPsbtsRequest_ExistingOutputIndex + // *CommitVirtualPsbtsRequest_Add + AnchorChangeOutput isCommitVirtualPsbtsRequest_AnchorChangeOutput `protobuf_oneof:"anchor_change_output"` + // Types that are assignable to Fees: + // + // *CommitVirtualPsbtsRequest_TargetConf + // *CommitVirtualPsbtsRequest_SatPerVbyte + Fees isCommitVirtualPsbtsRequest_Fees `protobuf_oneof:"fees"` +} + +func (x *CommitVirtualPsbtsRequest) Reset() { + *x = CommitVirtualPsbtsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommitVirtualPsbtsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommitVirtualPsbtsRequest) ProtoMessage() {} + +func (x *CommitVirtualPsbtsRequest) ProtoReflect() protoreflect.Message { + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[7] + 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 CommitVirtualPsbtsRequest.ProtoReflect.Descriptor instead. +func (*CommitVirtualPsbtsRequest) Descriptor() ([]byte, []int) { + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{7} +} + +func (x *CommitVirtualPsbtsRequest) GetVirtualPsbts() [][]byte { + if x != nil { + return x.VirtualPsbts + } + return nil +} + +func (x *CommitVirtualPsbtsRequest) GetAnchorPsbt() []byte { + if x != nil { + return x.AnchorPsbt + } + return nil +} + +func (m *CommitVirtualPsbtsRequest) GetAnchorChangeOutput() isCommitVirtualPsbtsRequest_AnchorChangeOutput { + if m != nil { + return m.AnchorChangeOutput + } + return nil +} + +func (x *CommitVirtualPsbtsRequest) GetExistingOutputIndex() int32 { + if x, ok := x.GetAnchorChangeOutput().(*CommitVirtualPsbtsRequest_ExistingOutputIndex); ok { + return x.ExistingOutputIndex + } + return 0 +} + +func (x *CommitVirtualPsbtsRequest) GetAdd() bool { + if x, ok := x.GetAnchorChangeOutput().(*CommitVirtualPsbtsRequest_Add); ok { + return x.Add + } + return false +} + +func (m *CommitVirtualPsbtsRequest) GetFees() isCommitVirtualPsbtsRequest_Fees { + if m != nil { + return m.Fees + } + return nil +} + +func (x *CommitVirtualPsbtsRequest) GetTargetConf() uint32 { + if x, ok := x.GetFees().(*CommitVirtualPsbtsRequest_TargetConf); ok { + return x.TargetConf + } + return 0 +} + +func (x *CommitVirtualPsbtsRequest) GetSatPerVbyte() uint64 { + if x, ok := x.GetFees().(*CommitVirtualPsbtsRequest_SatPerVbyte); ok { + return x.SatPerVbyte + } + return 0 +} + +type isCommitVirtualPsbtsRequest_AnchorChangeOutput interface { + isCommitVirtualPsbtsRequest_AnchorChangeOutput() +} + +type CommitVirtualPsbtsRequest_ExistingOutputIndex struct { + // Use the existing output within the anchor PSBT with the specified + // index ax the change output. Any leftover change will be added to the + // already specified amount of that output. To add a new change output to + // the PSBT, set the "add" field below instead. + ExistingOutputIndex int32 `protobuf:"varint,3,opt,name=existing_output_index,json=existingOutputIndex,proto3,oneof"` +} + +type CommitVirtualPsbtsRequest_Add struct { + // Add a new P2TR change output to the PSBT if required. + Add bool `protobuf:"varint,4,opt,name=add,proto3,oneof"` +} + +func (*CommitVirtualPsbtsRequest_ExistingOutputIndex) isCommitVirtualPsbtsRequest_AnchorChangeOutput() { +} + +func (*CommitVirtualPsbtsRequest_Add) isCommitVirtualPsbtsRequest_AnchorChangeOutput() {} + +type isCommitVirtualPsbtsRequest_Fees interface { + isCommitVirtualPsbtsRequest_Fees() +} + +type CommitVirtualPsbtsRequest_TargetConf struct { + // The target number of blocks that the transaction should be confirmed in. + TargetConf uint32 `protobuf:"varint,5,opt,name=target_conf,json=targetConf,proto3,oneof"` +} + +type CommitVirtualPsbtsRequest_SatPerVbyte struct { + // The fee rate, expressed in sat/vbyte, that should be used to fund the + // BTC level anchor transaction. + SatPerVbyte uint64 `protobuf:"varint,6,opt,name=sat_per_vbyte,json=satPerVbyte,proto3,oneof"` +} + +func (*CommitVirtualPsbtsRequest_TargetConf) isCommitVirtualPsbtsRequest_Fees() {} + +func (*CommitVirtualPsbtsRequest_SatPerVbyte) isCommitVirtualPsbtsRequest_Fees() {} + +type CommitVirtualPsbtsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The funded BTC level anchor transaction with all outputs updated to commit + // to the virtual transactions given. The transaction is ready to be signed, + // unless some of the asset inputs don't belong to this daemon, in which case + // the anchor input derivation info must be added to those inputs first. + AnchorPsbt []byte `protobuf:"bytes,1,opt,name=anchor_psbt,json=anchorPsbt,proto3" json:"anchor_psbt,omitempty"` + // The updated virtual transactions that now contain the state transition + // proofs for being committed to the BTC level anchor transaction above. If the + // assets in the virtual transaction outputs are ASSET_VERSION_V1 and not yet + // signed, then the proofs need to be updated to include the witness before + // they become fully valid. + VirtualPsbts [][]byte `protobuf:"bytes,2,rep,name=virtual_psbts,json=virtualPsbts,proto3" json:"virtual_psbts,omitempty"` + // The index of the (added) change output or -1 if no change was left over. + ChangeOutputIndex int32 `protobuf:"varint,3,opt,name=change_output_index,json=changeOutputIndex,proto3" json:"change_output_index,omitempty"` + // The list of UTXO lock leases that were acquired for the inputs in the funded + // PSBT packet from lnd. Only inputs added to the PSBT by this RPC are locked, + // inputs that were already present in the PSBT are not locked. + LndLockedUtxos []*taprpc.OutPoint `protobuf:"bytes,4,rep,name=lnd_locked_utxos,json=lndLockedUtxos,proto3" json:"lnd_locked_utxos,omitempty"` +} + +func (x *CommitVirtualPsbtsResponse) Reset() { + *x = CommitVirtualPsbtsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommitVirtualPsbtsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommitVirtualPsbtsResponse) ProtoMessage() {} + +func (x *CommitVirtualPsbtsResponse) ProtoReflect() protoreflect.Message { + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[8] + 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 CommitVirtualPsbtsResponse.ProtoReflect.Descriptor instead. +func (*CommitVirtualPsbtsResponse) Descriptor() ([]byte, []int) { + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{8} +} + +func (x *CommitVirtualPsbtsResponse) GetAnchorPsbt() []byte { + if x != nil { + return x.AnchorPsbt + } + return nil +} + +func (x *CommitVirtualPsbtsResponse) GetVirtualPsbts() [][]byte { + if x != nil { + return x.VirtualPsbts + } + return nil +} + +func (x *CommitVirtualPsbtsResponse) GetChangeOutputIndex() int32 { + if x != nil { + return x.ChangeOutputIndex + } + return 0 +} + +func (x *CommitVirtualPsbtsResponse) GetLndLockedUtxos() []*taprpc.OutPoint { + if x != nil { + return x.LndLockedUtxos + } + return nil +} + type NextInternalKeyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -462,7 +704,7 @@ type NextInternalKeyRequest struct { func (x *NextInternalKeyRequest) Reset() { *x = NextInternalKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[7] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -475,7 +717,7 @@ func (x *NextInternalKeyRequest) String() string { func (*NextInternalKeyRequest) ProtoMessage() {} func (x *NextInternalKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[7] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -488,7 +730,7 @@ func (x *NextInternalKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NextInternalKeyRequest.ProtoReflect.Descriptor instead. func (*NextInternalKeyRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{7} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{9} } func (x *NextInternalKeyRequest) GetKeyFamily() uint32 { @@ -509,7 +751,7 @@ type NextInternalKeyResponse struct { func (x *NextInternalKeyResponse) Reset() { *x = NextInternalKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[8] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -522,7 +764,7 @@ func (x *NextInternalKeyResponse) String() string { func (*NextInternalKeyResponse) ProtoMessage() {} func (x *NextInternalKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[8] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -535,7 +777,7 @@ func (x *NextInternalKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NextInternalKeyResponse.ProtoReflect.Descriptor instead. func (*NextInternalKeyResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{8} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{10} } func (x *NextInternalKeyResponse) GetInternalKey() *taprpc.KeyDescriptor { @@ -556,7 +798,7 @@ type NextScriptKeyRequest struct { func (x *NextScriptKeyRequest) Reset() { *x = NextScriptKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[9] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -569,7 +811,7 @@ func (x *NextScriptKeyRequest) String() string { func (*NextScriptKeyRequest) ProtoMessage() {} func (x *NextScriptKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[9] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -582,7 +824,7 @@ func (x *NextScriptKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NextScriptKeyRequest.ProtoReflect.Descriptor instead. func (*NextScriptKeyRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{9} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{11} } func (x *NextScriptKeyRequest) GetKeyFamily() uint32 { @@ -603,7 +845,7 @@ type NextScriptKeyResponse struct { func (x *NextScriptKeyResponse) Reset() { *x = NextScriptKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[10] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -616,7 +858,7 @@ func (x *NextScriptKeyResponse) String() string { func (*NextScriptKeyResponse) ProtoMessage() {} func (x *NextScriptKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[10] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -629,7 +871,7 @@ func (x *NextScriptKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NextScriptKeyResponse.ProtoReflect.Descriptor instead. func (*NextScriptKeyResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{10} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{12} } func (x *NextScriptKeyResponse) GetScriptKey() *taprpc.ScriptKey { @@ -652,7 +894,7 @@ type QueryInternalKeyRequest struct { func (x *QueryInternalKeyRequest) Reset() { *x = QueryInternalKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[11] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -665,7 +907,7 @@ func (x *QueryInternalKeyRequest) String() string { func (*QueryInternalKeyRequest) ProtoMessage() {} func (x *QueryInternalKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[11] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -678,7 +920,7 @@ func (x *QueryInternalKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryInternalKeyRequest.ProtoReflect.Descriptor instead. func (*QueryInternalKeyRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{11} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{13} } func (x *QueryInternalKeyRequest) GetInternalKey() []byte { @@ -699,7 +941,7 @@ type QueryInternalKeyResponse struct { func (x *QueryInternalKeyResponse) Reset() { *x = QueryInternalKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[12] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -712,7 +954,7 @@ func (x *QueryInternalKeyResponse) String() string { func (*QueryInternalKeyResponse) ProtoMessage() {} func (x *QueryInternalKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[12] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -725,7 +967,7 @@ func (x *QueryInternalKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryInternalKeyResponse.ProtoReflect.Descriptor instead. func (*QueryInternalKeyResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{12} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{14} } func (x *QueryInternalKeyResponse) GetInternalKey() *taprpc.KeyDescriptor { @@ -749,7 +991,7 @@ type QueryScriptKeyRequest struct { func (x *QueryScriptKeyRequest) Reset() { *x = QueryScriptKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[13] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -762,7 +1004,7 @@ func (x *QueryScriptKeyRequest) String() string { func (*QueryScriptKeyRequest) ProtoMessage() {} func (x *QueryScriptKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[13] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -775,7 +1017,7 @@ func (x *QueryScriptKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryScriptKeyRequest.ProtoReflect.Descriptor instead. func (*QueryScriptKeyRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{13} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{15} } func (x *QueryScriptKeyRequest) GetTweakedScriptKey() []byte { @@ -796,7 +1038,7 @@ type QueryScriptKeyResponse struct { func (x *QueryScriptKeyResponse) Reset() { *x = QueryScriptKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[14] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -809,7 +1051,7 @@ func (x *QueryScriptKeyResponse) String() string { func (*QueryScriptKeyResponse) ProtoMessage() {} func (x *QueryScriptKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[14] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -822,7 +1064,7 @@ func (x *QueryScriptKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryScriptKeyResponse.ProtoReflect.Descriptor instead. func (*QueryScriptKeyResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{14} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{16} } func (x *QueryScriptKeyResponse) GetScriptKey() *taprpc.ScriptKey { @@ -845,7 +1087,7 @@ type ProveAssetOwnershipRequest struct { func (x *ProveAssetOwnershipRequest) Reset() { *x = ProveAssetOwnershipRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[15] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -858,7 +1100,7 @@ func (x *ProveAssetOwnershipRequest) String() string { func (*ProveAssetOwnershipRequest) ProtoMessage() {} func (x *ProveAssetOwnershipRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[15] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -871,7 +1113,7 @@ func (x *ProveAssetOwnershipRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProveAssetOwnershipRequest.ProtoReflect.Descriptor instead. func (*ProveAssetOwnershipRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{15} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{17} } func (x *ProveAssetOwnershipRequest) GetAssetId() []byte { @@ -906,7 +1148,7 @@ type ProveAssetOwnershipResponse struct { func (x *ProveAssetOwnershipResponse) Reset() { *x = ProveAssetOwnershipResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[16] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -919,7 +1161,7 @@ func (x *ProveAssetOwnershipResponse) String() string { func (*ProveAssetOwnershipResponse) ProtoMessage() {} func (x *ProveAssetOwnershipResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[16] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -932,7 +1174,7 @@ func (x *ProveAssetOwnershipResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProveAssetOwnershipResponse.ProtoReflect.Descriptor instead. func (*ProveAssetOwnershipResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{16} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{18} } func (x *ProveAssetOwnershipResponse) GetProofWithWitness() []byte { @@ -953,7 +1195,7 @@ type VerifyAssetOwnershipRequest struct { func (x *VerifyAssetOwnershipRequest) Reset() { *x = VerifyAssetOwnershipRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[17] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -966,7 +1208,7 @@ func (x *VerifyAssetOwnershipRequest) String() string { func (*VerifyAssetOwnershipRequest) ProtoMessage() {} func (x *VerifyAssetOwnershipRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[17] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -979,7 +1221,7 @@ func (x *VerifyAssetOwnershipRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyAssetOwnershipRequest.ProtoReflect.Descriptor instead. func (*VerifyAssetOwnershipRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{17} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{19} } func (x *VerifyAssetOwnershipRequest) GetProofWithWitness() []byte { @@ -1000,7 +1242,7 @@ type VerifyAssetOwnershipResponse struct { func (x *VerifyAssetOwnershipResponse) Reset() { *x = VerifyAssetOwnershipResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[18] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1013,7 +1255,7 @@ func (x *VerifyAssetOwnershipResponse) String() string { func (*VerifyAssetOwnershipResponse) ProtoMessage() {} func (x *VerifyAssetOwnershipResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[18] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1026,7 +1268,7 @@ func (x *VerifyAssetOwnershipResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyAssetOwnershipResponse.ProtoReflect.Descriptor instead. func (*VerifyAssetOwnershipResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{18} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{20} } func (x *VerifyAssetOwnershipResponse) GetValidProof() bool { @@ -1048,7 +1290,7 @@ type RemoveUTXOLeaseRequest struct { func (x *RemoveUTXOLeaseRequest) Reset() { *x = RemoveUTXOLeaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[19] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1061,7 +1303,7 @@ func (x *RemoveUTXOLeaseRequest) String() string { func (*RemoveUTXOLeaseRequest) ProtoMessage() {} func (x *RemoveUTXOLeaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[19] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1074,7 +1316,7 @@ func (x *RemoveUTXOLeaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveUTXOLeaseRequest.ProtoReflect.Descriptor instead. func (*RemoveUTXOLeaseRequest) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{19} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{21} } func (x *RemoveUTXOLeaseRequest) GetOutpoint() *taprpc.OutPoint { @@ -1093,7 +1335,7 @@ type RemoveUTXOLeaseResponse struct { func (x *RemoveUTXOLeaseResponse) Reset() { *x = RemoveUTXOLeaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[20] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1106,7 +1348,7 @@ func (x *RemoveUTXOLeaseResponse) String() string { func (*RemoveUTXOLeaseResponse) ProtoMessage() {} func (x *RemoveUTXOLeaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[20] + mi := &file_assetwalletrpc_assetwallet_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1119,7 +1361,7 @@ func (x *RemoveUTXOLeaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveUTXOLeaseResponse.ProtoReflect.Descriptor instead. func (*RemoveUTXOLeaseResponse) Descriptor() ([]byte, []int) { - return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{20} + return file_assetwalletrpc_assetwallet_proto_rawDescGZIP(), []int{22} } var File_assetwalletrpc_assetwallet_proto protoreflect.FileDescriptor @@ -1175,140 +1417,177 @@ var file_assetwalletrpc_assetwallet_proto_rawDesc = []byte{ 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x22, 0x37, - 0x0a, 0x16, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, - 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, - 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, - 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x35, 0x0a, 0x14, - 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, - 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, - 0x69, 0x6c, 0x79, 0x22, 0x49, 0x0a, 0x15, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x3c, - 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x54, 0x0a, 0x18, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x22, 0x45, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x74, - 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x4a, 0x0a, 0x16, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 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, 0x12, 0x2c, - 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x1b, - 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x57, 0x69, - 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x4b, 0x0a, 0x1b, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, 0x68, 0x57, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x3f, 0x0a, 0x1c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x46, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, - 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x82, 0x08, 0x0a, 0x0b, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x62, 0x0a, 0x0f, 0x46, 0x75, - 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, 0x26, 0x2e, + 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x22, 0x94, + 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, + 0x62, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x00, 0x52, 0x13, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x21, 0x0a, 0x0b, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x48, 0x01, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0b, 0x73, 0x61, 0x74, 0x50, 0x65, 0x72, + 0x56, 0x62, 0x79, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x06, 0x0a, + 0x04, 0x66, 0x65, 0x65, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x1a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, + 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, + 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, + 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x22, 0x37, 0x0a, 0x16, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, + 0x53, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x35, 0x0a, 0x14, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x49, 0x0a, 0x15, 0x4e, + 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x3c, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x54, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x45, 0x0a, 0x15, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x10, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x22, 0x4a, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x84, 0x01, + 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 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, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x22, 0x4b, 0x0a, 0x1b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, + 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x3f, + 0x0a, 0x1c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x46, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, + 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x32, 0xef, 0x08, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x12, 0x62, 0x0a, 0x0f, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, - 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, - 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, - 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x12, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, - 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 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, 0x62, - 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, - 0x79, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x65, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, + 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x12, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, + 0x12, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, + 0x73, 0x62, 0x74, 0x73, 0x52, 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, 0x6b, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, - 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, - 0x2a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, - 0x12, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x26, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, - 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x3f, 0x5a, 0x3d, 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, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, + 0x13, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x12, 0x2a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, + 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, + 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x62, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, + 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, + 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3f, 0x5a, 0x3d, 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, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1323,7 +1602,7 @@ func file_assetwalletrpc_assetwallet_proto_rawDescGZIP() []byte { return file_assetwalletrpc_assetwallet_proto_rawDescData } -var file_assetwalletrpc_assetwallet_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_assetwalletrpc_assetwallet_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_assetwalletrpc_assetwallet_proto_goTypes = []interface{}{ (*FundVirtualPsbtRequest)(nil), // 0: assetwalletrpc.FundVirtualPsbtRequest (*FundVirtualPsbtResponse)(nil), // 1: assetwalletrpc.FundVirtualPsbtResponse @@ -1332,62 +1611,67 @@ var file_assetwalletrpc_assetwallet_proto_goTypes = []interface{}{ (*SignVirtualPsbtRequest)(nil), // 4: assetwalletrpc.SignVirtualPsbtRequest (*SignVirtualPsbtResponse)(nil), // 5: assetwalletrpc.SignVirtualPsbtResponse (*AnchorVirtualPsbtsRequest)(nil), // 6: assetwalletrpc.AnchorVirtualPsbtsRequest - (*NextInternalKeyRequest)(nil), // 7: assetwalletrpc.NextInternalKeyRequest - (*NextInternalKeyResponse)(nil), // 8: assetwalletrpc.NextInternalKeyResponse - (*NextScriptKeyRequest)(nil), // 9: assetwalletrpc.NextScriptKeyRequest - (*NextScriptKeyResponse)(nil), // 10: assetwalletrpc.NextScriptKeyResponse - (*QueryInternalKeyRequest)(nil), // 11: assetwalletrpc.QueryInternalKeyRequest - (*QueryInternalKeyResponse)(nil), // 12: assetwalletrpc.QueryInternalKeyResponse - (*QueryScriptKeyRequest)(nil), // 13: assetwalletrpc.QueryScriptKeyRequest - (*QueryScriptKeyResponse)(nil), // 14: assetwalletrpc.QueryScriptKeyResponse - (*ProveAssetOwnershipRequest)(nil), // 15: assetwalletrpc.ProveAssetOwnershipRequest - (*ProveAssetOwnershipResponse)(nil), // 16: assetwalletrpc.ProveAssetOwnershipResponse - (*VerifyAssetOwnershipRequest)(nil), // 17: assetwalletrpc.VerifyAssetOwnershipRequest - (*VerifyAssetOwnershipResponse)(nil), // 18: assetwalletrpc.VerifyAssetOwnershipResponse - (*RemoveUTXOLeaseRequest)(nil), // 19: assetwalletrpc.RemoveUTXOLeaseRequest - (*RemoveUTXOLeaseResponse)(nil), // 20: assetwalletrpc.RemoveUTXOLeaseResponse - nil, // 21: assetwalletrpc.TxTemplate.RecipientsEntry - (*taprpc.OutPoint)(nil), // 22: taprpc.OutPoint - (*taprpc.KeyDescriptor)(nil), // 23: taprpc.KeyDescriptor - (*taprpc.ScriptKey)(nil), // 24: taprpc.ScriptKey - (*taprpc.SendAssetResponse)(nil), // 25: taprpc.SendAssetResponse + (*CommitVirtualPsbtsRequest)(nil), // 7: assetwalletrpc.CommitVirtualPsbtsRequest + (*CommitVirtualPsbtsResponse)(nil), // 8: assetwalletrpc.CommitVirtualPsbtsResponse + (*NextInternalKeyRequest)(nil), // 9: assetwalletrpc.NextInternalKeyRequest + (*NextInternalKeyResponse)(nil), // 10: assetwalletrpc.NextInternalKeyResponse + (*NextScriptKeyRequest)(nil), // 11: assetwalletrpc.NextScriptKeyRequest + (*NextScriptKeyResponse)(nil), // 12: assetwalletrpc.NextScriptKeyResponse + (*QueryInternalKeyRequest)(nil), // 13: assetwalletrpc.QueryInternalKeyRequest + (*QueryInternalKeyResponse)(nil), // 14: assetwalletrpc.QueryInternalKeyResponse + (*QueryScriptKeyRequest)(nil), // 15: assetwalletrpc.QueryScriptKeyRequest + (*QueryScriptKeyResponse)(nil), // 16: assetwalletrpc.QueryScriptKeyResponse + (*ProveAssetOwnershipRequest)(nil), // 17: assetwalletrpc.ProveAssetOwnershipRequest + (*ProveAssetOwnershipResponse)(nil), // 18: assetwalletrpc.ProveAssetOwnershipResponse + (*VerifyAssetOwnershipRequest)(nil), // 19: assetwalletrpc.VerifyAssetOwnershipRequest + (*VerifyAssetOwnershipResponse)(nil), // 20: assetwalletrpc.VerifyAssetOwnershipResponse + (*RemoveUTXOLeaseRequest)(nil), // 21: assetwalletrpc.RemoveUTXOLeaseRequest + (*RemoveUTXOLeaseResponse)(nil), // 22: assetwalletrpc.RemoveUTXOLeaseResponse + nil, // 23: assetwalletrpc.TxTemplate.RecipientsEntry + (*taprpc.OutPoint)(nil), // 24: taprpc.OutPoint + (*taprpc.KeyDescriptor)(nil), // 25: taprpc.KeyDescriptor + (*taprpc.ScriptKey)(nil), // 26: taprpc.ScriptKey + (*taprpc.SendAssetResponse)(nil), // 27: taprpc.SendAssetResponse } var file_assetwalletrpc_assetwallet_proto_depIdxs = []int32{ 2, // 0: assetwalletrpc.FundVirtualPsbtRequest.raw:type_name -> assetwalletrpc.TxTemplate 3, // 1: assetwalletrpc.TxTemplate.inputs:type_name -> assetwalletrpc.PrevId - 21, // 2: assetwalletrpc.TxTemplate.recipients:type_name -> assetwalletrpc.TxTemplate.RecipientsEntry - 22, // 3: assetwalletrpc.PrevId.outpoint:type_name -> taprpc.OutPoint - 23, // 4: assetwalletrpc.NextInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor - 24, // 5: assetwalletrpc.NextScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey - 23, // 6: assetwalletrpc.QueryInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor - 24, // 7: assetwalletrpc.QueryScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey - 22, // 8: assetwalletrpc.ProveAssetOwnershipRequest.outpoint:type_name -> taprpc.OutPoint - 22, // 9: assetwalletrpc.RemoveUTXOLeaseRequest.outpoint:type_name -> taprpc.OutPoint - 0, // 10: assetwalletrpc.AssetWallet.FundVirtualPsbt:input_type -> assetwalletrpc.FundVirtualPsbtRequest - 4, // 11: assetwalletrpc.AssetWallet.SignVirtualPsbt:input_type -> assetwalletrpc.SignVirtualPsbtRequest - 6, // 12: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:input_type -> assetwalletrpc.AnchorVirtualPsbtsRequest - 7, // 13: assetwalletrpc.AssetWallet.NextInternalKey:input_type -> assetwalletrpc.NextInternalKeyRequest - 9, // 14: assetwalletrpc.AssetWallet.NextScriptKey:input_type -> assetwalletrpc.NextScriptKeyRequest - 11, // 15: assetwalletrpc.AssetWallet.QueryInternalKey:input_type -> assetwalletrpc.QueryInternalKeyRequest - 13, // 16: assetwalletrpc.AssetWallet.QueryScriptKey:input_type -> assetwalletrpc.QueryScriptKeyRequest - 15, // 17: assetwalletrpc.AssetWallet.ProveAssetOwnership:input_type -> assetwalletrpc.ProveAssetOwnershipRequest - 17, // 18: assetwalletrpc.AssetWallet.VerifyAssetOwnership:input_type -> assetwalletrpc.VerifyAssetOwnershipRequest - 19, // 19: assetwalletrpc.AssetWallet.RemoveUTXOLease:input_type -> assetwalletrpc.RemoveUTXOLeaseRequest - 1, // 20: assetwalletrpc.AssetWallet.FundVirtualPsbt:output_type -> assetwalletrpc.FundVirtualPsbtResponse - 5, // 21: assetwalletrpc.AssetWallet.SignVirtualPsbt:output_type -> assetwalletrpc.SignVirtualPsbtResponse - 25, // 22: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:output_type -> taprpc.SendAssetResponse - 8, // 23: assetwalletrpc.AssetWallet.NextInternalKey:output_type -> assetwalletrpc.NextInternalKeyResponse - 10, // 24: assetwalletrpc.AssetWallet.NextScriptKey:output_type -> assetwalletrpc.NextScriptKeyResponse - 12, // 25: assetwalletrpc.AssetWallet.QueryInternalKey:output_type -> assetwalletrpc.QueryInternalKeyResponse - 14, // 26: assetwalletrpc.AssetWallet.QueryScriptKey:output_type -> assetwalletrpc.QueryScriptKeyResponse - 16, // 27: assetwalletrpc.AssetWallet.ProveAssetOwnership:output_type -> assetwalletrpc.ProveAssetOwnershipResponse - 18, // 28: assetwalletrpc.AssetWallet.VerifyAssetOwnership:output_type -> assetwalletrpc.VerifyAssetOwnershipResponse - 20, // 29: assetwalletrpc.AssetWallet.RemoveUTXOLease:output_type -> assetwalletrpc.RemoveUTXOLeaseResponse - 20, // [20:30] is the sub-list for method output_type - 10, // [10:20] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 23, // 2: assetwalletrpc.TxTemplate.recipients:type_name -> assetwalletrpc.TxTemplate.RecipientsEntry + 24, // 3: assetwalletrpc.PrevId.outpoint:type_name -> taprpc.OutPoint + 24, // 4: assetwalletrpc.CommitVirtualPsbtsResponse.lnd_locked_utxos:type_name -> taprpc.OutPoint + 25, // 5: assetwalletrpc.NextInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor + 26, // 6: assetwalletrpc.NextScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey + 25, // 7: assetwalletrpc.QueryInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor + 26, // 8: assetwalletrpc.QueryScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey + 24, // 9: assetwalletrpc.ProveAssetOwnershipRequest.outpoint:type_name -> taprpc.OutPoint + 24, // 10: assetwalletrpc.RemoveUTXOLeaseRequest.outpoint:type_name -> taprpc.OutPoint + 0, // 11: assetwalletrpc.AssetWallet.FundVirtualPsbt:input_type -> assetwalletrpc.FundVirtualPsbtRequest + 4, // 12: assetwalletrpc.AssetWallet.SignVirtualPsbt:input_type -> assetwalletrpc.SignVirtualPsbtRequest + 6, // 13: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:input_type -> assetwalletrpc.AnchorVirtualPsbtsRequest + 7, // 14: assetwalletrpc.AssetWallet.CommitVirtualPsbts:input_type -> assetwalletrpc.CommitVirtualPsbtsRequest + 9, // 15: assetwalletrpc.AssetWallet.NextInternalKey:input_type -> assetwalletrpc.NextInternalKeyRequest + 11, // 16: assetwalletrpc.AssetWallet.NextScriptKey:input_type -> assetwalletrpc.NextScriptKeyRequest + 13, // 17: assetwalletrpc.AssetWallet.QueryInternalKey:input_type -> assetwalletrpc.QueryInternalKeyRequest + 15, // 18: assetwalletrpc.AssetWallet.QueryScriptKey:input_type -> assetwalletrpc.QueryScriptKeyRequest + 17, // 19: assetwalletrpc.AssetWallet.ProveAssetOwnership:input_type -> assetwalletrpc.ProveAssetOwnershipRequest + 19, // 20: assetwalletrpc.AssetWallet.VerifyAssetOwnership:input_type -> assetwalletrpc.VerifyAssetOwnershipRequest + 21, // 21: assetwalletrpc.AssetWallet.RemoveUTXOLease:input_type -> assetwalletrpc.RemoveUTXOLeaseRequest + 1, // 22: assetwalletrpc.AssetWallet.FundVirtualPsbt:output_type -> assetwalletrpc.FundVirtualPsbtResponse + 5, // 23: assetwalletrpc.AssetWallet.SignVirtualPsbt:output_type -> assetwalletrpc.SignVirtualPsbtResponse + 27, // 24: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:output_type -> taprpc.SendAssetResponse + 8, // 25: assetwalletrpc.AssetWallet.CommitVirtualPsbts:output_type -> assetwalletrpc.CommitVirtualPsbtsResponse + 10, // 26: assetwalletrpc.AssetWallet.NextInternalKey:output_type -> assetwalletrpc.NextInternalKeyResponse + 12, // 27: assetwalletrpc.AssetWallet.NextScriptKey:output_type -> assetwalletrpc.NextScriptKeyResponse + 14, // 28: assetwalletrpc.AssetWallet.QueryInternalKey:output_type -> assetwalletrpc.QueryInternalKeyResponse + 16, // 29: assetwalletrpc.AssetWallet.QueryScriptKey:output_type -> assetwalletrpc.QueryScriptKeyResponse + 18, // 30: assetwalletrpc.AssetWallet.ProveAssetOwnership:output_type -> assetwalletrpc.ProveAssetOwnershipResponse + 20, // 31: assetwalletrpc.AssetWallet.VerifyAssetOwnership:output_type -> assetwalletrpc.VerifyAssetOwnershipResponse + 22, // 32: assetwalletrpc.AssetWallet.RemoveUTXOLease:output_type -> assetwalletrpc.RemoveUTXOLeaseResponse + 22, // [22:33] is the sub-list for method output_type + 11, // [11:22] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_assetwalletrpc_assetwallet_proto_init() } @@ -1481,7 +1765,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextInternalKeyRequest); i { + switch v := v.(*CommitVirtualPsbtsRequest); i { case 0: return &v.state case 1: @@ -1493,7 +1777,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextInternalKeyResponse); i { + switch v := v.(*CommitVirtualPsbtsResponse); i { case 0: return &v.state case 1: @@ -1505,7 +1789,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextScriptKeyRequest); i { + switch v := v.(*NextInternalKeyRequest); i { case 0: return &v.state case 1: @@ -1517,7 +1801,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextScriptKeyResponse); i { + switch v := v.(*NextInternalKeyResponse); i { case 0: return &v.state case 1: @@ -1529,7 +1813,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryInternalKeyRequest); i { + switch v := v.(*NextScriptKeyRequest); i { case 0: return &v.state case 1: @@ -1541,7 +1825,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryInternalKeyResponse); i { + switch v := v.(*NextScriptKeyResponse); i { case 0: return &v.state case 1: @@ -1553,7 +1837,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryScriptKeyRequest); i { + switch v := v.(*QueryInternalKeyRequest); i { case 0: return &v.state case 1: @@ -1565,7 +1849,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryScriptKeyResponse); i { + switch v := v.(*QueryInternalKeyResponse); i { case 0: return &v.state case 1: @@ -1577,7 +1861,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProveAssetOwnershipRequest); i { + switch v := v.(*QueryScriptKeyRequest); i { case 0: return &v.state case 1: @@ -1589,7 +1873,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProveAssetOwnershipResponse); i { + switch v := v.(*QueryScriptKeyResponse); i { case 0: return &v.state case 1: @@ -1601,7 +1885,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyAssetOwnershipRequest); i { + switch v := v.(*ProveAssetOwnershipRequest); i { case 0: return &v.state case 1: @@ -1613,7 +1897,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyAssetOwnershipResponse); i { + switch v := v.(*ProveAssetOwnershipResponse); i { case 0: return &v.state case 1: @@ -1625,7 +1909,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveUTXOLeaseRequest); i { + switch v := v.(*VerifyAssetOwnershipRequest); i { case 0: return &v.state case 1: @@ -1637,6 +1921,30 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } file_assetwalletrpc_assetwallet_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VerifyAssetOwnershipResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_assetwalletrpc_assetwallet_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveUTXOLeaseRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_assetwalletrpc_assetwallet_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveUTXOLeaseResponse); i { case 0: return &v.state @@ -1653,13 +1961,19 @@ func file_assetwalletrpc_assetwallet_proto_init() { (*FundVirtualPsbtRequest_Psbt)(nil), (*FundVirtualPsbtRequest_Raw)(nil), } + file_assetwalletrpc_assetwallet_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*CommitVirtualPsbtsRequest_ExistingOutputIndex)(nil), + (*CommitVirtualPsbtsRequest_Add)(nil), + (*CommitVirtualPsbtsRequest_TargetConf)(nil), + (*CommitVirtualPsbtsRequest_SatPerVbyte)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_assetwalletrpc_assetwallet_proto_rawDesc, NumEnums: 0, - NumMessages: 22, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/taprpc/assetwalletrpc/assetwallet.pb.gw.go b/taprpc/assetwalletrpc/assetwallet.pb.gw.go index 9abd65fba..c2a55bb1e 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.gw.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.gw.go @@ -133,6 +133,40 @@ func local_request_AssetWallet_AnchorVirtualPsbts_0(ctx context.Context, marshal } +func request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshaler runtime.Marshaler, client AssetWalletClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommitVirtualPsbtsRequest + 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.CommitVirtualPsbts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshaler runtime.Marshaler, server AssetWalletServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CommitVirtualPsbtsRequest + 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.CommitVirtualPsbts(ctx, &protoReq) + return msg, metadata, err + +} + func request_AssetWallet_NextInternalKey_0(ctx context.Context, marshaler runtime.Marshaler, client AssetWalletClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq NextInternalKeyRequest var metadata runtime.ServerMetadata @@ -482,6 +516,29 @@ func RegisterAssetWalletHandlerServer(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_AssetWallet_CommitVirtualPsbts_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, "/assetwalletrpc.AssetWallet/CommitVirtualPsbts", runtime.WithHTTPPathPattern("/v1/taproot-assets/wallet/virtual-psbt/commit")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AssetWallet_CommitVirtualPsbts_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_AssetWallet_CommitVirtualPsbts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_AssetWallet_NextInternalKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -744,6 +801,26 @@ func RegisterAssetWalletHandlerClient(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_AssetWallet_CommitVirtualPsbts_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, "/assetwalletrpc.AssetWallet/CommitVirtualPsbts", runtime.WithHTTPPathPattern("/v1/taproot-assets/wallet/virtual-psbt/commit")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AssetWallet_CommitVirtualPsbts_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AssetWallet_CommitVirtualPsbts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_AssetWallet_NextInternalKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -894,6 +971,8 @@ var ( pattern_AssetWallet_AnchorVirtualPsbts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "taproot-assets", "wallet", "virtual-psbt", "anchor"}, "")) + pattern_AssetWallet_CommitVirtualPsbts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "taproot-assets", "wallet", "virtual-psbt", "commit"}, "")) + pattern_AssetWallet_NextInternalKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "taproot-assets", "wallet", "internal-key", "next"}, "")) pattern_AssetWallet_NextScriptKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "taproot-assets", "wallet", "script-key", "next"}, "")) @@ -916,6 +995,8 @@ var ( forward_AssetWallet_AnchorVirtualPsbts_0 = runtime.ForwardResponseMessage + forward_AssetWallet_CommitVirtualPsbts_0 = runtime.ForwardResponseMessage + forward_AssetWallet_NextInternalKey_0 = runtime.ForwardResponseMessage forward_AssetWallet_NextScriptKey_0 = runtime.ForwardResponseMessage diff --git a/taprpc/assetwalletrpc/assetwallet.pb.json.go b/taprpc/assetwalletrpc/assetwallet.pb.json.go index c5c17fbc4..34ee84be4 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.json.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.json.go @@ -96,6 +96,31 @@ func RegisterAssetWalletJSONCallbacks(registry map[string]func(ctx context.Conte callback(string(respBytes), nil) } + registry["assetwalletrpc.AssetWallet.CommitVirtualPsbts"] = func(ctx context.Context, + conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { + + req := &CommitVirtualPsbtsRequest{} + err := marshaler.Unmarshal([]byte(reqJSON), req) + if err != nil { + callback("", err) + return + } + + client := NewAssetWalletClient(conn) + resp, err := client.CommitVirtualPsbts(ctx, req) + if err != nil { + callback("", err) + return + } + + respBytes, err := marshaler.Marshal(resp) + if err != nil { + callback("", err) + return + } + callback(string(respBytes), nil) + } + registry["assetwalletrpc.AssetWallet.NextInternalKey"] = func(ctx context.Context, conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { diff --git a/taprpc/assetwalletrpc/assetwallet.proto b/taprpc/assetwalletrpc/assetwallet.proto index c4d21d34b..f89a86208 100644 --- a/taprpc/assetwalletrpc/assetwallet.proto +++ b/taprpc/assetwalletrpc/assetwallet.proto @@ -31,6 +31,15 @@ service AssetWallet { rpc AnchorVirtualPsbts (AnchorVirtualPsbtsRequest) returns (taprpc.SendAssetResponse); + /* + CommitVirtualPsbts creates the output commitments and proofs for the given + virtual transactions by committing them to the BTC level anchor transaction. + In addition, the BTC level anchor transaction is funded and prepared up to + the point where it is ready to be signed. + */ + rpc CommitVirtualPsbts (CommitVirtualPsbtsRequest) + returns (CommitVirtualPsbtsResponse); + /* NextInternalKey derives the next internal key for the given key family and stores it as an internal key in the database to make sure it is identified @@ -180,6 +189,85 @@ message AnchorVirtualPsbtsRequest { repeated bytes virtual_psbts = 1; } +message CommitVirtualPsbtsRequest { + /* + The list of virtual transactions that should be mapped to the given BTC + level anchor transaction template. The virtual transactions are expected to + be signed (or use ASSET_VERSION_V1 with segregated witness to allow for + signing after committing) and ready to be committed to the anchor + transaction. + */ + repeated bytes virtual_psbts = 1; + + /* + The template of the BTC level anchor transaction that the virtual + transactions should be mapped to. The template is expected to already + contain all asset related inputs and outputs corresponding to the virtual + transactions given above. This can be achieved by using + tapfreighter.PrepareAnchoringTemplate for example. + */ + bytes anchor_psbt = 2; + + oneof anchor_change_output { + /* + Use the existing output within the anchor PSBT with the specified + index ax the change output. Any leftover change will be added to the + already specified amount of that output. To add a new change output to + the PSBT, set the "add" field below instead. + */ + int32 existing_output_index = 3; + + /* + Add a new P2TR change output to the PSBT if required. + */ + bool add = 4; + } + + oneof fees { + /* + The target number of blocks that the transaction should be confirmed in. + */ + uint32 target_conf = 5; + + /* + The fee rate, expressed in sat/vbyte, that should be used to fund the + BTC level anchor transaction. + */ + uint64 sat_per_vbyte = 6; + } +} + +message CommitVirtualPsbtsResponse { + /* + The funded BTC level anchor transaction with all outputs updated to commit + to the virtual transactions given. The transaction is ready to be signed, + unless some of the asset inputs don't belong to this daemon, in which case + the anchor input derivation info must be added to those inputs first. + */ + bytes anchor_psbt = 1; + + /* + The updated virtual transactions that now contain the state transition + proofs for being committed to the BTC level anchor transaction above. If the + assets in the virtual transaction outputs are ASSET_VERSION_V1 and not yet + signed, then the proofs need to be updated to include the witness before + they become fully valid. + */ + repeated bytes virtual_psbts = 2; + + /* + The index of the (added) change output or -1 if no change was left over. + */ + int32 change_output_index = 3; + + /* + The list of UTXO lock leases that were acquired for the inputs in the funded + PSBT packet from lnd. Only inputs added to the PSBT by this RPC are locked, + inputs that were already present in the PSBT are not locked. + */ + repeated taprpc.OutPoint lnd_locked_utxos = 4; +} + message NextInternalKeyRequest { uint32 key_family = 1; } diff --git a/taprpc/assetwalletrpc/assetwallet.swagger.json b/taprpc/assetwalletrpc/assetwallet.swagger.json index 6ba3c19b3..93a887f84 100644 --- a/taprpc/assetwalletrpc/assetwallet.swagger.json +++ b/taprpc/assetwalletrpc/assetwallet.swagger.json @@ -281,6 +281,39 @@ ] } }, + "/v1/taproot-assets/wallet/virtual-psbt/commit": { + "post": { + "summary": "CommitVirtualPsbts creates the output commitments and proofs for the given\nvirtual transactions by committing them to the BTC level anchor transaction.\nIn addition, the BTC level anchor transaction is funded and prepared up to\nthe point where it is ready to be signed.", + "operationId": "AssetWallet_CommitVirtualPsbts", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/assetwalletrpcCommitVirtualPsbtsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/assetwalletrpcCommitVirtualPsbtsRequest" + } + } + ], + "tags": [ + "AssetWallet" + ] + } + }, "/v1/taproot-assets/wallet/virtual-psbt/fund": { "post": { "summary": "FundVirtualPsbt selects inputs from the available asset commitments to fund\na virtual transaction matching the template.", @@ -362,6 +395,73 @@ } } }, + "assetwalletrpcCommitVirtualPsbtsRequest": { + "type": "object", + "properties": { + "virtual_psbts": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "The list of virtual transactions that should be mapped to the given BTC\nlevel anchor transaction template. The virtual transactions are expected to\nbe signed (or use ASSET_VERSION_V1 with segregated witness to allow for\nsigning after committing) and ready to be committed to the anchor\ntransaction." + }, + "anchor_psbt": { + "type": "string", + "format": "byte", + "description": "The template of the BTC level anchor transaction that the virtual\ntransactions should be mapped to. The template is expected to already\ncontain all asset related inputs and outputs corresponding to the virtual\ntransactions given above. This can be achieved by using\ntapfreighter.PrepareAnchoringTemplate for example." + }, + "existing_output_index": { + "type": "integer", + "format": "int32", + "description": "Use the existing output within the anchor PSBT with the specified\nindex ax the change output. Any leftover change will be added to the\nalready specified amount of that output. To add a new change output to\nthe PSBT, set the \"add\" field below instead." + }, + "add": { + "type": "boolean", + "description": "Add a new P2TR change output to the PSBT if required." + }, + "target_conf": { + "type": "integer", + "format": "int64", + "description": "The target number of blocks that the transaction should be confirmed in." + }, + "sat_per_vbyte": { + "type": "string", + "format": "uint64", + "description": "The fee rate, expressed in sat/vbyte, that should be used to fund the\nBTC level anchor transaction." + } + } + }, + "assetwalletrpcCommitVirtualPsbtsResponse": { + "type": "object", + "properties": { + "anchor_psbt": { + "type": "string", + "format": "byte", + "description": "The funded BTC level anchor transaction with all outputs updated to commit\nto the virtual transactions given. The transaction is ready to be signed,\nunless some of the asset inputs don't belong to this daemon, in which case\nthe anchor input derivation info must be added to those inputs first." + }, + "virtual_psbts": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "The updated virtual transactions that now contain the state transition\nproofs for being committed to the BTC level anchor transaction above. If the\nassets in the virtual transaction outputs are ASSET_VERSION_V1 and not yet\nsigned, then the proofs need to be updated to include the witness before\nthey become fully valid." + }, + "change_output_index": { + "type": "integer", + "format": "int32", + "description": "The index of the (added) change output or -1 if no change was left over." + }, + "lnd_locked_utxos": { + "type": "array", + "items": { + "$ref": "#/definitions/taprpcOutPoint" + }, + "description": "The list of UTXO lock leases that were acquired for the inputs in the funded\nPSBT packet from lnd. Only inputs added to the PSBT by this RPC are locked,\ninputs that were already present in the PSBT are not locked." + } + } + }, "assetwalletrpcFundVirtualPsbtRequest": { "type": "object", "properties": { diff --git a/taprpc/assetwalletrpc/assetwallet.yaml b/taprpc/assetwalletrpc/assetwallet.yaml index 74426670a..c50402561 100644 --- a/taprpc/assetwalletrpc/assetwallet.yaml +++ b/taprpc/assetwalletrpc/assetwallet.yaml @@ -15,6 +15,10 @@ http: post: "/v1/taproot-assets/wallet/virtual-psbt/anchor" body: "*" + - selector: assetwalletrpc.AssetWallet.CommitVirtualPsbts + post: "/v1/taproot-assets/wallet/virtual-psbt/commit" + body: "*" + - selector: assetwalletrpc.AssetWallet.NextInternalKey post: "/v1/taproot-assets/wallet/internal-key/next" body: "*" diff --git a/taprpc/assetwalletrpc/assetwallet_grpc.pb.go b/taprpc/assetwalletrpc/assetwallet_grpc.pb.go index c49a0ebcf..3d117d485 100644 --- a/taprpc/assetwalletrpc/assetwallet_grpc.pb.go +++ b/taprpc/assetwalletrpc/assetwallet_grpc.pb.go @@ -31,6 +31,11 @@ type AssetWalletClient interface { // TODO(guggero): Actually implement accepting and merging multiple // transactions. AnchorVirtualPsbts(ctx context.Context, in *AnchorVirtualPsbtsRequest, opts ...grpc.CallOption) (*taprpc.SendAssetResponse, error) + // CommitVirtualPsbts creates the output commitments and proofs for the given + // virtual transactions by committing them to the BTC level anchor transaction. + // In addition, the BTC level anchor transaction is funded and prepared up to + // the point where it is ready to be signed. + CommitVirtualPsbts(ctx context.Context, in *CommitVirtualPsbtsRequest, opts ...grpc.CallOption) (*CommitVirtualPsbtsResponse, error) // NextInternalKey derives the next internal key for the given key family and // stores it as an internal key in the database to make sure it is identified // as a local key later on when importing proofs. While an internal key can @@ -97,6 +102,15 @@ func (c *assetWalletClient) AnchorVirtualPsbts(ctx context.Context, in *AnchorVi return out, nil } +func (c *assetWalletClient) CommitVirtualPsbts(ctx context.Context, in *CommitVirtualPsbtsRequest, opts ...grpc.CallOption) (*CommitVirtualPsbtsResponse, error) { + out := new(CommitVirtualPsbtsResponse) + err := c.cc.Invoke(ctx, "/assetwalletrpc.AssetWallet/CommitVirtualPsbts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *assetWalletClient) NextInternalKey(ctx context.Context, in *NextInternalKeyRequest, opts ...grpc.CallOption) (*NextInternalKeyResponse, error) { out := new(NextInternalKeyResponse) err := c.cc.Invoke(ctx, "/assetwalletrpc.AssetWallet/NextInternalKey", in, out, opts...) @@ -176,6 +190,11 @@ type AssetWalletServer interface { // TODO(guggero): Actually implement accepting and merging multiple // transactions. AnchorVirtualPsbts(context.Context, *AnchorVirtualPsbtsRequest) (*taprpc.SendAssetResponse, error) + // CommitVirtualPsbts creates the output commitments and proofs for the given + // virtual transactions by committing them to the BTC level anchor transaction. + // In addition, the BTC level anchor transaction is funded and prepared up to + // the point where it is ready to be signed. + CommitVirtualPsbts(context.Context, *CommitVirtualPsbtsRequest) (*CommitVirtualPsbtsResponse, error) // NextInternalKey derives the next internal key for the given key family and // stores it as an internal key in the database to make sure it is identified // as a local key later on when importing proofs. While an internal key can @@ -221,6 +240,9 @@ func (UnimplementedAssetWalletServer) SignVirtualPsbt(context.Context, *SignVirt func (UnimplementedAssetWalletServer) AnchorVirtualPsbts(context.Context, *AnchorVirtualPsbtsRequest) (*taprpc.SendAssetResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AnchorVirtualPsbts not implemented") } +func (UnimplementedAssetWalletServer) CommitVirtualPsbts(context.Context, *CommitVirtualPsbtsRequest) (*CommitVirtualPsbtsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CommitVirtualPsbts not implemented") +} func (UnimplementedAssetWalletServer) NextInternalKey(context.Context, *NextInternalKeyRequest) (*NextInternalKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NextInternalKey not implemented") } @@ -309,6 +331,24 @@ func _AssetWallet_AnchorVirtualPsbts_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _AssetWallet_CommitVirtualPsbts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CommitVirtualPsbtsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AssetWalletServer).CommitVirtualPsbts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/assetwalletrpc.AssetWallet/CommitVirtualPsbts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AssetWalletServer).CommitVirtualPsbts(ctx, req.(*CommitVirtualPsbtsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AssetWallet_NextInternalKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NextInternalKeyRequest) if err := dec(in); err != nil { @@ -454,6 +494,10 @@ var AssetWallet_ServiceDesc = grpc.ServiceDesc{ MethodName: "AnchorVirtualPsbts", Handler: _AssetWallet_AnchorVirtualPsbts_Handler, }, + { + MethodName: "CommitVirtualPsbts", + Handler: _AssetWallet_CommitVirtualPsbts_Handler, + }, { MethodName: "NextInternalKey", Handler: _AssetWallet_NextInternalKey_Handler,