Repository: google/trillian
Pull request #2436 (2021-03-30 08:45:53)

Remove QueueLeaves from the log API.
Part of #2245.

<!---
Describe your changes in detail here.
If this fixes an issue, please write "Fixes #123", substituting the issue number.
-->

### Checklist

<!---
Go over all the following points, and put an `x` in all the boxes that apply.
Feel free to not tick any boxes that don't apply to this PR (e.g. refactoring may not need a CHANGELOG update).
If you're unsure about any of these, don't hesitate to ask. We're here to help!
-->

- [X] I have updated the [CHANGELOG](CHANGELOG.md).
- [X] I have updated [documentation](docs/) accordingly (including the [feature implementation matrix](docs/Feature_Implementation_Matrix.md)).


codecov[bot]: # [Codecov](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=h1) Report
> Merging [#2436](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=desc) (ae3f013) into [master](https://codecov.io/gh/google/trillian/commit/1fc8246459502ea610ca547569a95b51eb16b4ef?el=desc) (1fc8246) will **decrease** coverage by `0.06%`.
> The diff coverage is `72.72%`.

[![Impacted file tree graph](https://codecov.io/gh/google/trillian/pull/2436/graphs/tree.svg?width=650&height=150&src=pr&token=QwofUwmvAs)](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #2436      +/-   ##
==========================================
- Coverage   65.95%   65.88%   -0.07%     
==========================================
  Files         104      104              
  Lines        7263     7240      -23     
==========================================
- Hits         4790     4770      -20     
+ Misses       1964     1956       -8     
- Partials      509      514       +5     
```


| [Impacted Files](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [server/interceptor/interceptor.go](https://codecov.io/gh/google/trillian/pull/2436/diff?src=pr&el=tree#diff-c2VydmVyL2ludGVyY2VwdG9yL2ludGVyY2VwdG9yLmdv) | `84.86% <ø> (-0.56%)` | :arrow_down: |
| [server/log\_rpc\_server.go](https://codecov.io/gh/google/trillian/pull/2436/diff?src=pr&el=tree#diff-c2VydmVyL2xvZ19ycGNfc2VydmVyLmdv) | `84.75% <72.72%> (+0.74%)` | :arrow_up: |
| [server/validate.go](https://codecov.io/gh/google/trillian/pull/2436/diff?src=pr&el=tree#diff-c2VydmVyL3ZhbGlkYXRlLmdv) | `85.45% <0.00%> (-7.28%)` | :arrow_down: |
| [log/operation\_manager.go](https://codecov.io/gh/google/trillian/pull/2436/diff?src=pr&el=tree#diff-bG9nL29wZXJhdGlvbl9tYW5hZ2VyLmdv) | `88.35% <0.00%> (+1.05%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=footer). Last update [1fc8246...ae3f013](https://codecov.io/gh/google/trillian/pull/2436?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0208c348..9b9abfa7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,8 +12,10 @@
 ### Cleanup
  * Removed the deprecated crypto.NewSHA256Signer function.
  * Finish removing the `LogMetadata.GetUnsequencedCounts()` method.
- * Removed `TrillianLog.GetLeavesByHash` and `TrillianLog.GetLeavesByIndex`
-   API.
+ * Removed the following APIs:
+   - `TrillianLog.GetLeavesByHash`
+   - `TrillianLog.GetLeavesByIndex`
+   - `TrillianLog.QueueLeaves`
 
 ### Storage refactoring
  * `NodeReader.GetMerkleNodes` does not accept revisions anymore. The
diff --git a/README.md b/README.md
index f2da7b50..a6b0ca6a 100644
--- a/README.md
+++ b/README.md
@@ -289,7 +289,7 @@ similar to those available for Certificate Transparency logs
    signature.
  - `GetLeavesByRange` returns leaf information for particular leaves,
    specified by their index in the log.
- - `QueueLeaves` requests inclusion of specified items into the log.
+ - `QueueLeaf` requests inclusion of the specified item into the log.
      - For a pre-ordered log, `AddSequencedLeaves` requests the inclusion of
        specified items into the log at specified places in the tree.
  - `GetInclusionProof`, `GetInclusionProofByHash` and `GetConsistencyProof`
diff --git a/docs/api.md b/docs/api.md
index 55f39ab1..c22d74e4 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -24,8 +24,6 @@
     - [LogLeaf](#trillian.LogLeaf)
     - [QueueLeafRequest](#trillian.QueueLeafRequest)
     - [QueueLeafResponse](#trillian.QueueLeafResponse)
-    - [QueueLeavesRequest](#trillian.QueueLeavesRequest)
-    - [QueueLeavesResponse](#trillian.QueueLeavesResponse)
     - [QueuedLogLeaf](#trillian.QueuedLogLeaf)
   
     - [TrillianLog](#trillian.TrillianLog)
@@ -105,7 +103,7 @@ be checked and charged.
 | ----- | ---- | ----- | ----------- |
 | user | [string](#string) | repeated | user is a list of personality-defined strings. Trillian will treat them as /User/%{user}/... keys when checking and charging quota. If one or more of the specified users has insufficient quota, the request will be denied.
 
-As an example, a Certificate Transparency frontend might set the following user strings when sending a QueueLeaves request to the Trillian log: - The requesting IP address. This would limit the number of requests per IP. - The &#34;intermediate-&lt;hash&gt;&#34; for each of the intermediate certificates in the submitted chain. This would have the effect of limiting the rate of submissions under a given intermediate/root. |
+As an example, a Certificate Transparency frontend might set the following user strings when sending a QueueLeaf request to the Trillian log: - The requesting IP address. This would limit the number of requests per IP. - The &#34;intermediate-&lt;hash&gt;&#34; for each of the intermediate certificates in the submitted chain. This would have the effect of limiting the rate of submissions under a given intermediate/root. |
 
 
 
@@ -417,38 +415,6 @@ TODO(pavelkalinnikov): Consider instead using `H(cert)` and allowing identity ha
 
 
 
-<a name="trillian.QueueLeavesRequest"></a>
-
-### QueueLeavesRequest
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| log_id | [int64](#int64) |  |  |
-| leaves | [LogLeaf](#trillian.LogLeaf) | repeated |  |
-| charge_to | [ChargeTo](#trillian.ChargeTo) |  |  |
-
-
-
-
-
-
-<a name="trillian.QueueLeavesResponse"></a>
-
-### QueueLeavesResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| queued_leaves | [QueuedLogLeaf](#trillian.QueuedLogLeaf) | repeated | Same number and order as in the corresponding request. |
-
-
-
-
-
-
 <a name="trillian.QueuedLogLeaf"></a>
 
 ### QueuedLogLeaf
@@ -523,7 +489,6 @@ If the earlier tree size is larger than the server is aware of, an InvalidArgume
 
 If the requested tree size is unavailable but the leaf is in scope for the current tree, the returned proof will be for the current tree size rather than the requested tree size. |
 | InitLog | [InitLogRequest](#trillian.InitLogRequest) | [InitLogResponse](#trillian.InitLogResponse) | InitLog initializes a particular tree, creating the initial signed log root (which will be of size 0). |
-| QueueLeaves | [QueueLeavesRequest](#trillian.QueueLeavesRequest) | [QueueLeavesResponse](#trillian.QueueLeavesResponse) | QueueLeaf adds a batch of leaves to the queue of pending leaves for a normal log. |
 | AddSequencedLeaves | [AddSequencedLeavesRequest](#trillian.AddSequencedLeavesRequest) | [AddSequencedLeavesResponse](#trillian.AddSequencedLeavesResponse) | AddSequencedLeaves adds a batch of leaves with assigned sequence numbers to a pre-ordered log. The indices of the provided leaves must be contiguous. |
 | GetLeavesByRange | [GetLeavesByRangeRequest](#trillian.GetLeavesByRangeRequest) | [GetLeavesByRangeResponse](#trillian.GetLeavesByRangeResponse) | GetLeavesByRange returns a batch of leaves whose leaf indices are in a sequential range. |
 
diff --git a/quota/doc.go b/quota/doc.go
index 38732220..81ec928f 100644
--- a/quota/doc.go
+++ b/quota/doc.go
@@ -20,7 +20,7 @@
 //
 // Each Trillian request, be it either a read or write request, requires certain tokens to be
 // allowed to continue. Tokens exist at multiple layers: per-user, per-tree and global tokens.
-// For example, a TrillianLog.QueueLeaves request consumes a Write token from User, Tree and Global
+// For example, a TrillianLog.QueueLeaf request consumes a Write token from User, Tree and Global
 // quotas. If any of those quotas is out of tokens, the request is denied with a ResourceExhausted
 // error code.
 //
diff --git a/server/interceptor/interceptor.go b/server/interceptor/interceptor.go
index d0c4da0f..7e404ca3 100644
--- a/server/interceptor/interceptor.go
+++ b/server/interceptor/interceptor.go
@@ -222,8 +222,8 @@ func (tp *trillianProcessor) After(ctx context.Context, resp interface{}, method
 	// be replenished:
 	// * Invalid requests (a bad request shouldn't spend sequencing-based tokens, as it won't
 	//   cause a corresponding sequencing to happen)
-	// * Requests that filter out duplicates (e.g., QueueLeaf and QueueLeaves, for the same
-	//   reason as above: duplicates aren't queued for sequencing)
+	// * Requests that filter out duplicates (e.g., QueueLeaf, for the same reason as above:
+	//   duplicates aren't queued for sequencing)
 	// These are only applied for Refundable specs.
 	refunds := make([]quota.Spec, 0)
 	for _, s := range tp.info.specs {
@@ -251,12 +251,6 @@ func (tp *trillianProcessor) After(ctx context.Context, resp interface{}, method
 					tokens++
 				}
 			}
-		case *trillian.QueueLeavesResponse:
-			for _, leaf := range resp.GetQueuedLeaves() {
-				if !isLeafOK(leaf) {
-					tokens++
-				}
-			}
 		}
 	}
 	if tokens > 0 {
@@ -399,10 +393,6 @@ func newRPCInfoForRequest(req interface{}) (*rpcInfo, error) {
 		info.readonly = false
 		info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG}
 		info.tokens = 1
-	case *trillian.QueueLeavesRequest:
-		info.readonly = false
-		info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG}
-		info.tokens = len(req.GetLeaves())
 
 	// Pre-ordered Log / readwrite
 	case *trillian.AddSequencedLeavesRequest:
diff --git a/server/log_rpc_server.go b/server/log_rpc_server.go
index 2fbf9e90..3c5215ca 100644
--- a/server/log_rpc_server.go
+++ b/server/log_rpc_server.go
@@ -129,41 +129,6 @@ func hashLeaves(leaves []*trillian.LogLeaf, hasher hashers.LogHasher) {
 	}
 }
 
-// QueueLeaves submits a batch of leaves to the log for later integration into the underlying tree.
-func (t *TrillianLogRPCServer) QueueLeaves(ctx context.Context, req *trillian.QueueLeavesRequest) (*trillian.QueueLeavesResponse, error) {
-	ctx, spanEnd := spanFor(ctx, "QueueLeaves")
-	defer spanEnd()
-	if err := validateLogLeaves(req.Leaves, "QueueLeavesRequest"); err != nil {
-		return nil, err
-	}
-	logID := req.LogId
-
-	tree, hasher, err := t.getTreeAndHasher(ctx, logID, optsLogWrite)
-	if err != nil {
-		return nil, err
-	}
-
-	ctx = trees.NewContext(ctx, tree)
-
-	hashLeaves(req.Leaves, hasher)
-
-	ret, err := t.registry.LogStorage.QueueLeaves(ctx, tree, req.Leaves, t.timeSource.Now())
-	if err != nil {
-		return nil, err
-	}
-
-	label := strconv.FormatInt(logID, 10)
-	for _, l := range ret {
-		if l.Status == nil || l.Status.Code == int32(codes.OK) {
-			t.leafCounter.Inc(label, "queued")
-		} else if l.Status.Code == int32(codes.AlreadyExists) {
-			t.leafCounter.Inc(label, "duplicate")
-		}
-	}
-
-	return &trillian.QueueLeavesResponse{QueuedLeaves: ret}, nil
-}
-
 // AddSequencedLeaves submits a batch of sequenced leaves to a pre-ordered log
 // for later integration into its underlying tree.
 func (t *TrillianLogRPCServer) AddSequencedLeaves(ctx context.Context, req *trillian.AddSequencedLeavesRequest) (*trillian.AddSequencedLeavesResponse, error) {
diff --git a/trillian_log_api.pb.go b/trillian_log_api.pb.go
index 1bf81bb8..21fbf333 100644
--- a/trillian_log_api.pb.go
+++ b/trillian_log_api.pb.go
@@ -59,7 +59,7 @@ type ChargeTo struct {
 	// request will be denied.
 	//
 	// As an example, a Certificate Transparency frontend might set the following
-	// user strings when sending a QueueLeaves request to the Trillian log:
+	// user strings when sending a QueueLeaf request to the Trillian log:
 	//   - The requesting IP address.
 	//     This would limit the number of requests per IP.
 	//   - The "intermediate-<hash>" for each of the intermediate certificates in
@@ -985,117 +985,6 @@ func (x *InitLogResponse) GetCreated() *SignedLogRoot {
 	return nil
 }
 
-type QueueLeavesRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	LogId    int64      `protobuf:"varint,1,opt,name=log_id,json=logId,proto3" json:"log_id,omitempty"`
-	Leaves   []*LogLeaf `protobuf:"bytes,2,rep,name=leaves,proto3" json:"leaves,omitempty"`
-	ChargeTo *ChargeTo  `protobuf:"bytes,3,opt,name=charge_to,json=chargeTo,proto3" json:"charge_to,omitempty"`
-}
-
-func (x *QueueLeavesRequest) Reset() {
-	*x = QueueLeavesRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[15]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *QueueLeavesRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*QueueLeavesRequest) ProtoMessage() {}
-
-func (x *QueueLeavesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[15]
-	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 QueueLeavesRequest.ProtoReflect.Descriptor instead.
-func (*QueueLeavesRequest) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{15}
-}
-
-func (x *QueueLeavesRequest) GetLogId() int64 {
-	if x != nil {
-		return x.LogId
-	}
-	return 0
-}
-
-func (x *QueueLeavesRequest) GetLeaves() []*LogLeaf {
-	if x != nil {
-		return x.Leaves
-	}
-	return nil
-}
-
-func (x *QueueLeavesRequest) GetChargeTo() *ChargeTo {
-	if x != nil {
-		return x.ChargeTo
-	}
-	return nil
-}
-
-type QueueLeavesResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Same number and order as in the corresponding request.
-	QueuedLeaves []*QueuedLogLeaf `protobuf:"bytes,2,rep,name=queued_leaves,json=queuedLeaves,proto3" json:"queued_leaves,omitempty"`
-}
-
-func (x *QueueLeavesResponse) Reset() {
-	*x = QueueLeavesResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[16]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *QueueLeavesResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*QueueLeavesResponse) ProtoMessage() {}
-
-func (x *QueueLeavesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[16]
-	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 QueueLeavesResponse.ProtoReflect.Descriptor instead.
-func (*QueueLeavesResponse) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{16}
-}
-
-func (x *QueueLeavesResponse) GetQueuedLeaves() []*QueuedLogLeaf {
-	if x != nil {
-		return x.QueuedLeaves
-	}
-	return nil
-}
-
 type AddSequencedLeavesRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1109,7 +998,7 @@ type AddSequencedLeavesRequest struct {
 func (x *AddSequencedLeavesRequest) Reset() {
 	*x = AddSequencedLeavesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[17]
+		mi := &file_trillian_log_api_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1122,7 +1011,7 @@ func (x *AddSequencedLeavesRequest) String() string {
 func (*AddSequencedLeavesRequest) ProtoMessage() {}
 
 func (x *AddSequencedLeavesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[17]
+	mi := &file_trillian_log_api_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1135,7 +1024,7 @@ func (x *AddSequencedLeavesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AddSequencedLeavesRequest.ProtoReflect.Descriptor instead.
 func (*AddSequencedLeavesRequest) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{17}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *AddSequencedLeavesRequest) GetLogId() int64 {
@@ -1171,7 +1060,7 @@ type AddSequencedLeavesResponse struct {
 func (x *AddSequencedLeavesResponse) Reset() {
 	*x = AddSequencedLeavesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[18]
+		mi := &file_trillian_log_api_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1184,7 +1073,7 @@ func (x *AddSequencedLeavesResponse) String() string {
 func (*AddSequencedLeavesResponse) ProtoMessage() {}
 
 func (x *AddSequencedLeavesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[18]
+	mi := &file_trillian_log_api_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1197,7 +1086,7 @@ func (x *AddSequencedLeavesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AddSequencedLeavesResponse.ProtoReflect.Descriptor instead.
 func (*AddSequencedLeavesResponse) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{18}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *AddSequencedLeavesResponse) GetResults() []*QueuedLogLeaf {
@@ -1221,7 +1110,7 @@ type GetLeavesByRangeRequest struct {
 func (x *GetLeavesByRangeRequest) Reset() {
 	*x = GetLeavesByRangeRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[19]
+		mi := &file_trillian_log_api_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1234,7 +1123,7 @@ func (x *GetLeavesByRangeRequest) String() string {
 func (*GetLeavesByRangeRequest) ProtoMessage() {}
 
 func (x *GetLeavesByRangeRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[19]
+	mi := &file_trillian_log_api_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1247,7 +1136,7 @@ func (x *GetLeavesByRangeRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetLeavesByRangeRequest.ProtoReflect.Descriptor instead.
 func (*GetLeavesByRangeRequest) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{19}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *GetLeavesByRangeRequest) GetLogId() int64 {
@@ -1294,7 +1183,7 @@ type GetLeavesByRangeResponse struct {
 func (x *GetLeavesByRangeResponse) Reset() {
 	*x = GetLeavesByRangeResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[20]
+		mi := &file_trillian_log_api_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1307,7 +1196,7 @@ func (x *GetLeavesByRangeResponse) String() string {
 func (*GetLeavesByRangeResponse) ProtoMessage() {}
 
 func (x *GetLeavesByRangeResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[20]
+	mi := &file_trillian_log_api_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1320,7 +1209,7 @@ func (x *GetLeavesByRangeResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetLeavesByRangeResponse.ProtoReflect.Descriptor instead.
 func (*GetLeavesByRangeResponse) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{20}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *GetLeavesByRangeResponse) GetLeaves() []*LogLeaf {
@@ -1362,7 +1251,7 @@ type QueuedLogLeaf struct {
 func (x *QueuedLogLeaf) Reset() {
 	*x = QueuedLogLeaf{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[21]
+		mi := &file_trillian_log_api_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1375,7 +1264,7 @@ func (x *QueuedLogLeaf) String() string {
 func (*QueuedLogLeaf) ProtoMessage() {}
 
 func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[21]
+	mi := &file_trillian_log_api_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1388,7 +1277,7 @@ func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueuedLogLeaf.ProtoReflect.Descriptor instead.
 func (*QueuedLogLeaf) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{21}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *QueuedLogLeaf) GetLeaf() *LogLeaf {
@@ -1479,7 +1368,7 @@ type LogLeaf struct {
 func (x *LogLeaf) Reset() {
 	*x = LogLeaf{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[22]
+		mi := &file_trillian_log_api_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1492,7 +1381,7 @@ func (x *LogLeaf) String() string {
 func (*LogLeaf) ProtoMessage() {}
 
 func (x *LogLeaf) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[22]
+	mi := &file_trillian_log_api_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1505,7 +1394,7 @@ func (x *LogLeaf) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LogLeaf.ProtoReflect.Descriptor instead.
 func (*LogLeaf) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{22}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *LogLeaf) GetMerkleLeafHash() []byte {
@@ -1690,145 +1579,126 @@ var file_trillian_log_api_proto_rawDesc = []byte{
 	0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x72,
 	0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72,
 	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67,
-	0x52, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x87, 0x01,
-	0x0a, 0x12, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x6c,
-	0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72,
-	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06,
-	0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65,
-	0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x6c,
-	0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x08, 0x63,
-	0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x53, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x75, 0x65,
-	0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c,
-	0x0a, 0x0d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18,
-	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e,
-	0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x0c,
-	0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x8e, 0x01, 0x0a,
-	0x19, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61,
-	0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x6f,
-	0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49,
-	0x64, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67,
-	0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x09,
-	0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x12, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67,
-	0x65, 0x54, 0x6f, 0x52, 0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x4f, 0x0a,
-	0x1a, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61,
-	0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f,
-	0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98,
-	0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61,
-	0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x6f,
-	0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49,
-	0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64,
-	0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72,
-	0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72,
-	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52,
-	0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x18, 0x47, 0x65,
+	0x52, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x8e, 0x01,
+	0x0a, 0x19, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65,
+	0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c,
+	0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67,
+	0x49, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f,
+	0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x2f, 0x0a,
+	0x09, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72,
+	0x67, 0x65, 0x54, 0x6f, 0x52, 0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x4f,
+	0x0a, 0x1a, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65,
+	0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07,
+	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c,
+	0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22,
+	0x98, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52,
+	0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c,
+	0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67,
+	0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, 0x61,
+	0x72, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f,
+	0x52, 0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x18, 0x47,
+	0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69,
+	0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76,
+	0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67,
+	0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67,
+	0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52,
+	0x6f, 0x6f, 0x74, 0x22, 0x62, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67,
+	0x4c, 0x65, 0x61, 0x66, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f,
+	0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x2a, 0x0a, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c,
+	0x65, 0x61, 0x66, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x6c, 0x65,
+	0x61, 0x66, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d,
+	0x65, 0x72, 0x6b, 0x6c, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a,
+	0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0c, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
+	0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6c,
+	0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65,
+	0x61, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x74, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x71, 0x75, 0x65, 0x75,
+	0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x71,
+	0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a,
+	0x13, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
+	0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0xdb, 0x06, 0x0a, 0x0b, 0x54,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x46, 0x0a, 0x09, 0x51, 0x75,
+	0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69,
+	0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51,
+	0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69,
+	0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69,
+	0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50,
+	0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73,
+	0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x70, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69,
+	0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c,
+	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69,
+	0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50,
+	0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69,
+	0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73,
+	0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x25, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74,
+	0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x16, 0x47, 0x65,
+	0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67,
+	0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
+	0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c,
+	0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65,
+	0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x21, 0x2e,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x07, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f,
+	0x67, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69,
+	0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x53,
+	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x23,
+	0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71,
+	0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41,
+	0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47,
+	0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12,
+	0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65,
+	0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
 	0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65,
-	0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x5f,
-	0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52,
-	0x6f, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f,
-	0x6f, 0x74, 0x22, 0x62, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c,
-	0x65, 0x61, 0x66, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67,
-	0x4c, 0x65, 0x61, 0x66, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x65,
-	0x61, 0x66, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x61,
-	0x66, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65,
-	0x72, 0x6b, 0x6c, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a,
-	0x6c, 0x65, 0x61, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c,
-	0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65,
-	0x78, 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52,
-	0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65,
-	0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
-	0x6c, 0x65, 0x61, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x61,
-	0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74,
-	0x69, 0x74, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65,
-	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x71, 0x75,
-	0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x13,
-	0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0xa9, 0x07, 0x0a, 0x0b, 0x54, 0x72,
-	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x46, 0x0a, 0x09, 0x51, 0x75, 0x65,
-	0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75,
-	0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x5e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f,
-	0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72,
-	0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69,
-	0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x70, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f,
-	0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75,
-	0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72,
-	0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73,
-	0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74,
-	0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x25, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43,
-	0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x16, 0x47, 0x65, 0x74,
-	0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52,
-	0x6f, 0x6f, 0x74, 0x12, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47,
-	0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f,
-	0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73,
-	0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45,
-	0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x21, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79,
-	0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e,
-	0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x07, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67,
-	0x12, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74,
-	0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x75, 0x65,
-	0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
-	0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75,
-	0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x74, 0x72,
-	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
-	0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53,
-	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c,
-	0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65,
-	0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65,
-	0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x42, 0x13, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x41,
-	0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x13, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c,
+	0x6f, 0x67, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1843,7 +1713,7 @@ func file_trillian_log_api_proto_rawDescGZIP() []byte {
 	return file_trillian_log_api_proto_rawDescData
 }
 
-var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
+var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
 var file_trillian_log_api_proto_goTypes = []interface{}{
 	(*ChargeTo)(nil),                        // 0: trillian.ChargeTo
 	(*QueueLeafRequest)(nil),                // 1: trillian.QueueLeafRequest
@@ -1860,79 +1730,72 @@ var file_trillian_log_api_proto_goTypes = []interface{}{
 	(*GetEntryAndProofResponse)(nil),        // 12: trillian.GetEntryAndProofResponse
 	(*InitLogRequest)(nil),                  // 13: trillian.InitLogRequest
 	(*InitLogResponse)(nil),                 // 14: trillian.InitLogResponse
-	(*QueueLeavesRequest)(nil),              // 15: trillian.QueueLeavesRequest
-	(*QueueLeavesResponse)(nil),             // 16: trillian.QueueLeavesResponse
-	(*AddSequencedLeavesRequest)(nil),       // 17: trillian.AddSequencedLeavesRequest
-	(*AddSequencedLeavesResponse)(nil),      // 18: trillian.AddSequencedLeavesResponse
-	(*GetLeavesByRangeRequest)(nil),         // 19: trillian.GetLeavesByRangeRequest
-	(*GetLeavesByRangeResponse)(nil),        // 20: trillian.GetLeavesByRangeResponse
-	(*QueuedLogLeaf)(nil),                   // 21: trillian.QueuedLogLeaf
-	(*LogLeaf)(nil),                         // 22: trillian.LogLeaf
-	(*Proof)(nil),                           // 23: trillian.Proof
-	(*SignedLogRoot)(nil),                   // 24: trillian.SignedLogRoot
-	(*status.Status)(nil),                   // 25: google.rpc.Status
-	(*timestamp.Timestamp)(nil),             // 26: google.protobuf.Timestamp
+	(*AddSequencedLeavesRequest)(nil),       // 15: trillian.AddSequencedLeavesRequest
+	(*AddSequencedLeavesResponse)(nil),      // 16: trillian.AddSequencedLeavesResponse
+	(*GetLeavesByRangeRequest)(nil),         // 17: trillian.GetLeavesByRangeRequest
+	(*GetLeavesByRangeResponse)(nil),        // 18: trillian.GetLeavesByRangeResponse
+	(*QueuedLogLeaf)(nil),                   // 19: trillian.QueuedLogLeaf
+	(*LogLeaf)(nil),                         // 20: trillian.LogLeaf
+	(*Proof)(nil),                           // 21: trillian.Proof
+	(*SignedLogRoot)(nil),                   // 22: trillian.SignedLogRoot
+	(*status.Status)(nil),                   // 23: google.rpc.Status
+	(*timestamp.Timestamp)(nil),             // 24: google.protobuf.Timestamp
 }
 var file_trillian_log_api_proto_depIdxs = []int32{
-	22, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf
+	20, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf
 	0,  // 1: trillian.QueueLeafRequest.charge_to:type_name -> trillian.ChargeTo
-	21, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf
+	19, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf
 	0,  // 3: trillian.GetInclusionProofRequest.charge_to:type_name -> trillian.ChargeTo
-	23, // 4: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof
-	24, // 5: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	21, // 4: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof
+	22, // 5: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 6: trillian.GetInclusionProofByHashRequest.charge_to:type_name -> trillian.ChargeTo
-	23, // 7: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof
-	24, // 8: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	21, // 7: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof
+	22, // 8: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 9: trillian.GetConsistencyProofRequest.charge_to:type_name -> trillian.ChargeTo
-	23, // 10: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof
-	24, // 11: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	21, // 10: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof
+	22, // 11: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 12: trillian.GetLatestSignedLogRootRequest.charge_to:type_name -> trillian.ChargeTo
-	24, // 13: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot
-	23, // 14: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof
+	22, // 13: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	21, // 14: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof
 	0,  // 15: trillian.GetEntryAndProofRequest.charge_to:type_name -> trillian.ChargeTo
-	23, // 16: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof
-	22, // 17: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf
-	24, // 18: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	21, // 16: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof
+	20, // 17: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf
+	22, // 18: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 19: trillian.InitLogRequest.charge_to:type_name -> trillian.ChargeTo
-	24, // 20: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot
-	22, // 21: trillian.QueueLeavesRequest.leaves:type_name -> trillian.LogLeaf
-	0,  // 22: trillian.QueueLeavesRequest.charge_to:type_name -> trillian.ChargeTo
-	21, // 23: trillian.QueueLeavesResponse.queued_leaves:type_name -> trillian.QueuedLogLeaf
-	22, // 24: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf
-	0,  // 25: trillian.AddSequencedLeavesRequest.charge_to:type_name -> trillian.ChargeTo
-	21, // 26: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf
-	0,  // 27: trillian.GetLeavesByRangeRequest.charge_to:type_name -> trillian.ChargeTo
-	22, // 28: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf
-	24, // 29: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot
-	22, // 30: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf
-	25, // 31: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status
-	26, // 32: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp
-	26, // 33: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp
-	1,  // 34: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest
-	3,  // 35: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest
-	5,  // 36: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest
-	7,  // 37: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest
-	9,  // 38: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest
-	11, // 39: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest
-	13, // 40: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest
-	15, // 41: trillian.TrillianLog.QueueLeaves:input_type -> trillian.QueueLeavesRequest
-	17, // 42: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest
-	19, // 43: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest
-	2,  // 44: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse
-	4,  // 45: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse
-	6,  // 46: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse
-	8,  // 47: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse
-	10, // 48: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse
-	12, // 49: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse
-	14, // 50: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse
-	16, // 51: trillian.TrillianLog.QueueLeaves:output_type -> trillian.QueueLeavesResponse
-	18, // 52: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse
-	20, // 53: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse
-	44, // [44:54] is the sub-list for method output_type
-	34, // [34:44] is the sub-list for method input_type
-	34, // [34:34] is the sub-list for extension type_name
-	34, // [34:34] is the sub-list for extension extendee
-	0,  // [0:34] is the sub-list for field type_name
+	22, // 20: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot
+	20, // 21: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf
+	0,  // 22: trillian.AddSequencedLeavesRequest.charge_to:type_name -> trillian.ChargeTo
+	19, // 23: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf
+	0,  // 24: trillian.GetLeavesByRangeRequest.charge_to:type_name -> trillian.ChargeTo
+	20, // 25: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf
+	22, // 26: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	20, // 27: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf
+	23, // 28: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status
+	24, // 29: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp
+	24, // 30: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp
+	1,  // 31: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest
+	3,  // 32: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest
+	5,  // 33: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest
+	7,  // 34: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest
+	9,  // 35: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest
+	11, // 36: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest
+	13, // 37: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest
+	15, // 38: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest
+	17, // 39: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest
+	2,  // 40: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse
+	4,  // 41: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse
+	6,  // 42: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse
+	8,  // 43: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse
+	10, // 44: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse
+	12, // 45: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse
+	14, // 46: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse
+	16, // 47: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse
+	18, // 48: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse
+	40, // [40:49] is the sub-list for method output_type
+	31, // [31:40] is the sub-list for method input_type
+	31, // [31:31] is the sub-list for extension type_name
+	31, // [31:31] is the sub-list for extension extendee
+	0,  // [0:31] is the sub-list for field type_name
 }
 
 func init() { file_trillian_log_api_proto_init() }
@@ -2123,30 +1986,6 @@ func file_trillian_log_api_proto_init() {
 			}
 		}
 		file_trillian_log_api_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueueLeavesRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_trillian_log_api_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueueLeavesResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_trillian_log_api_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*AddSequencedLeavesRequest); i {
 			case 0:
 				return &v.state
@@ -2158,7 +1997,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*AddSequencedLeavesResponse); i {
 			case 0:
 				return &v.state
@@ -2170,7 +2009,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GetLeavesByRangeRequest); i {
 			case 0:
 				return &v.state
@@ -2182,7 +2021,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GetLeavesByRangeResponse); i {
 			case 0:
 				return &v.state
@@ -2194,7 +2033,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*QueuedLogLeaf); i {
 			case 0:
 				return &v.state
@@ -2206,7 +2045,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*LogLeaf); i {
 			case 0:
 				return &v.state
@@ -2225,7 +2064,7 @@ func file_trillian_log_api_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_trillian_log_api_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   23,
+			NumMessages:   21,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
@@ -2289,9 +2128,6 @@ type TrillianLogClient interface {
 	// InitLog initializes a particular tree, creating the initial signed log
 	// root (which will be of size 0).
 	InitLog(ctx context.Context, in *InitLogRequest, opts ...grpc.CallOption) (*InitLogResponse, error)
-	// QueueLeaf adds a batch of leaves to the queue of pending leaves for a
-	// normal log.
-	QueueLeaves(ctx context.Context, in *QueueLeavesRequest, opts ...grpc.CallOption) (*QueueLeavesResponse, error)
 	// AddSequencedLeaves adds a batch of leaves with assigned sequence numbers
 	// to a pre-ordered log.  The indices of the provided leaves must be contiguous.
 	AddSequencedLeaves(ctx context.Context, in *AddSequencedLeavesRequest, opts ...grpc.CallOption) (*AddSequencedLeavesResponse, error)
@@ -2371,15 +2207,6 @@ func (c *trillianLogClient) InitLog(ctx context.Context, in *InitLogRequest, opt
 	return out, nil
 }
 
-func (c *trillianLogClient) QueueLeaves(ctx context.Context, in *QueueLeavesRequest, opts ...grpc.CallOption) (*QueueLeavesResponse, error) {
-	out := new(QueueLeavesResponse)
-	err := c.cc.Invoke(ctx, "/trillian.TrillianLog/QueueLeaves", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 func (c *trillianLogClient) AddSequencedLeaves(ctx context.Context, in *AddSequencedLeavesRequest, opts ...grpc.CallOption) (*AddSequencedLeavesResponse, error) {
 	out := new(AddSequencedLeavesResponse)
 	err := c.cc.Invoke(ctx, "/trillian.TrillianLog/AddSequencedLeaves", in, out, opts...)
@@ -2438,9 +2265,6 @@ type TrillianLogServer interface {
 	// InitLog initializes a particular tree, creating the initial signed log
 	// root (which will be of size 0).
 	InitLog(context.Context, *InitLogRequest) (*InitLogResponse, error)
-	// QueueLeaf adds a batch of leaves to the queue of pending leaves for a
-	// normal log.
-	QueueLeaves(context.Context, *QueueLeavesRequest) (*QueueLeavesResponse, error)
 	// AddSequencedLeaves adds a batch of leaves with assigned sequence numbers
 	// to a pre-ordered log.  The indices of the provided leaves must be contiguous.
 	AddSequencedLeaves(context.Context, *AddSequencedLeavesRequest) (*AddSequencedLeavesResponse, error)
@@ -2474,9 +2298,6 @@ func (*UnimplementedTrillianLogServer) GetEntryAndProof(context.Context, *GetEnt
 func (*UnimplementedTrillianLogServer) InitLog(context.Context, *InitLogRequest) (*InitLogResponse, error) {
 	return nil, status1.Errorf(codes.Unimplemented, "method InitLog not implemented")
 }
-func (*UnimplementedTrillianLogServer) QueueLeaves(context.Context, *QueueLeavesRequest) (*QueueLeavesResponse, error) {
-	return nil, status1.Errorf(codes.Unimplemented, "method QueueLeaves not implemented")
-}
 func (*UnimplementedTrillianLogServer) AddSequencedLeaves(context.Context, *AddSequencedLeavesRequest) (*AddSequencedLeavesResponse, error) {
 	return nil, status1.Errorf(codes.Unimplemented, "method AddSequencedLeaves not implemented")
 }
@@ -2614,24 +2435,6 @@ func _TrillianLog_InitLog_Handler(srv interface{}, ctx context.Context, dec func
 	return interceptor(ctx, in, info, handler)
 }
 
-func _TrillianLog_QueueLeaves_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(QueueLeavesRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(TrillianLogServer).QueueLeaves(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/trillian.TrillianLog/QueueLeaves",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(TrillianLogServer).QueueLeaves(ctx, req.(*QueueLeavesRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 func _TrillianLog_AddSequencedLeaves_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(AddSequencedLeavesRequest)
 	if err := dec(in); err != nil {
@@ -2700,10 +2503,6 @@ var _TrillianLog_serviceDesc = grpc.ServiceDesc{
 			MethodName: "InitLog",
 			Handler:    _TrillianLog_InitLog_Handler,
 		},
-		{
-			MethodName: "QueueLeaves",
-			Handler:    _TrillianLog_QueueLeaves_Handler,
-		},
 		{
 			MethodName: "AddSequencedLeaves",
 			Handler:    _TrillianLog_AddSequencedLeaves_Handler,
diff --git a/trillian_log_api.proto b/trillian_log_api.proto
index 9f335772..e8056d9a 100644
--- a/trillian_log_api.proto
+++ b/trillian_log_api.proto
@@ -105,10 +105,6 @@ service TrillianLog {
   rpc InitLog(InitLogRequest) returns (InitLogResponse) {}
 
 
-  // QueueLeaf adds a batch of leaves to the queue of pending leaves for a
-  // normal log.
-  rpc QueueLeaves(QueueLeavesRequest) returns (QueueLeavesResponse) {}
-
   // AddSequencedLeaves adds a batch of leaves with assigned sequence numbers
   // to a pre-ordered log.  The indices of the provided leaves must be contiguous.
   rpc AddSequencedLeaves(AddSequencedLeavesRequest)
@@ -130,7 +126,7 @@ message ChargeTo {
   // request will be denied.
   //
   // As an example, a Certificate Transparency frontend might set the following
-  // user strings when sending a QueueLeaves request to the Trillian log:
+  // user strings when sending a QueueLeaf request to the Trillian log:
   //   - The requesting IP address.
   //     This would limit the number of requests per IP.
   //   - The "intermediate-<hash>" for each of the intermediate certificates in
@@ -247,17 +243,6 @@ message InitLogResponse {
   SignedLogRoot created = 1;
 }
 
-message QueueLeavesRequest {
-  int64 log_id = 1;
-  repeated LogLeaf leaves = 2;
-  ChargeTo charge_to = 3;
-}
-
-message QueueLeavesResponse {
-  // Same number and order as in the corresponding request.
-  repeated QueuedLogLeaf queued_leaves = 2;
-}
-
 message AddSequencedLeavesRequest {
   int64 log_id = 1;
   repeated LogLeaf leaves = 2;


Test patch:
diff --git a/server/interceptor/interceptor_test.go b/server/interceptor/interceptor_test.go
index 98fc692f..7b0f1459 100644
--- a/server/interceptor/interceptor_test.go
+++ b/server/interceptor/interceptor_test.go
@@ -276,27 +276,6 @@ func TestTrillianInterceptor_QuotaInterception(t *testing.T) {
 			},
 			wantTokens: 1,
 		},
-		{
-			desc:   "emptyBatchRequest",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  logTree.TreeId,
-				Leaves: nil,
-			},
-		},
-		{
-			desc:   "batchLogLeavesRequest",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  logTree.TreeId,
-				Leaves: []*trillian.LogLeaf{{}, {}, {}},
-			},
-			specs: []quota.Spec{
-				{Group: quota.Tree, Kind: quota.Write, TreeID: logTree.TreeId},
-				{Group: quota.Global, Kind: quota.Write, Refundable: true},
-			},
-			wantTokens: 3,
-		},
 		{
 			desc:   "batchSequencedLogLeavesRequest",
 			method: "/trillian.TrillianLog/AddSequencedLeaves",
@@ -311,11 +290,11 @@ func TestTrillianInterceptor_QuotaInterception(t *testing.T) {
 			wantTokens: 3,
 		},
 		{
-			desc:   "batchLogLeavesRequest with charges",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
+			desc:   "QueueLeafRequest with charges",
+			method: "/trillian.TrillianLog/QueueLeaf",
+			req: &trillian.QueueLeafRequest{
 				LogId:    logTree.TreeId,
-				Leaves:   []*trillian.LogLeaf{{}, {}, {}},
+				Leaf:     &trillian.LogLeaf{},
 				ChargeTo: charges,
 			},
 			specs: []quota.Spec{
@@ -324,7 +303,7 @@ func TestTrillianInterceptor_QuotaInterception(t *testing.T) {
 				{Group: quota.Tree, Kind: quota.Write, TreeID: logTree.TreeId},
 				{Group: quota.Global, Kind: quota.Write, Refundable: true},
 			},
-			wantTokens: 3,
+			wantTokens: 1,
 		},
 		{
 			desc:   "quotaError",
@@ -436,58 +415,6 @@ func TestTrillianInterceptor_QuotaInterception_ReturnsTokens(t *testing.T) {
 			wantGetTokens: 1,
 			wantPutTokens: 1,
 		},
-		{
-			desc:   "newLeaves",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  logTree.TreeId,
-				Leaves: []*trillian.LogLeaf{{}, {}, {}},
-			},
-			resp: &trillian.QueueLeavesResponse{
-				QueuedLeaves: []*trillian.QueuedLogLeaf{{}, {}, {}}, // No explicit Status means OK
-			},
-			specs: []quota.Spec{
-				{Group: quota.Tree, Kind: quota.Write, TreeID: logTree.TreeId},
-				{Group: quota.Global, Kind: quota.Write, Refundable: true},
-			},
-			wantGetTokens: 3,
-		},
-		{
-			desc:   "duplicateLeaves",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  logTree.TreeId,
-				Leaves: []*trillian.LogLeaf{{}, {}, {}},
-			},
-			resp: &trillian.QueueLeavesResponse{
-				QueuedLeaves: []*trillian.QueuedLogLeaf{
-					{Status: status.New(codes.AlreadyExists, "duplicate leaf").Proto()},
-					{Status: status.New(codes.AlreadyExists, "duplicate leaf").Proto()},
-					{},
-				},
-			},
-			specs: []quota.Spec{
-				{Group: quota.Tree, Kind: quota.Write, TreeID: logTree.TreeId},
-				{Group: quota.Global, Kind: quota.Write, Refundable: true},
-			},
-			wantGetTokens: 3,
-			wantPutTokens: 2,
-		},
-		{
-			desc:   "badQueueLeavesRequest",
-			method: "/trillian.TrillianLog/QueueLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  logTree.TreeId,
-				Leaves: []*trillian.LogLeaf{{}, {}, {}},
-			},
-			specs: []quota.Spec{
-				{Group: quota.Tree, Kind: quota.Write, TreeID: logTree.TreeId},
-				{Group: quota.Global, Kind: quota.Write, Refundable: true},
-			},
-			handlerErr:    errors.New("bad request"),
-			wantGetTokens: 3,
-			wantPutTokens: 3,
-		},
 	}
 
 	defer func(timeout time.Duration) {
diff --git a/server/log_rpc_server_test.go b/server/log_rpc_server_test.go
index 99a0b9e0..f6b82af2 100644
--- a/server/log_rpc_server_test.go
+++ b/server/log_rpc_server_test.go
@@ -82,8 +82,8 @@ var (
 	leafHash2 = []byte("\x05\x37\xd4\x81\xf7\x3a\x75\x73\x34\x32\x80\x52\xda\x3a\xf9\x62\x6c\xed\x97\x02\x8e\x20\xb8\x49\xf6\x11\x5c\x22\xcd\x76\x51\x97")
 	leaf3     = newTestLeaf([]byte("value3"), []byte("extra3"), 3)
 
-	queueRequest0     = trillian.QueueLeavesRequest{LogId: logID1, Leaves: []*trillian.LogLeaf{leaf1}}
-	queueRequest0Log2 = trillian.QueueLeavesRequest{LogId: logID2, Leaves: []*trillian.LogLeaf{leaf1}}
+	queueRequest0     = trillian.QueueLeafRequest{LogId: logID1, Leaf: leaf1}
+	queueRequest0Log2 = trillian.QueueLeafRequest{LogId: logID2, Leaf: leaf1}
 
 	addSeqRequest0 = trillian.AddSequencedLeavesRequest{LogId: logID3, Leaves: []*trillian.LogLeaf{leaf1}}
 
@@ -271,30 +271,30 @@ func TestGetLeavesByRange(t *testing.T) {
 	}
 }
 
-func TestQueueLeavesStorageError(t *testing.T) {
+func TestQueueLeafStorageError(t *testing.T) {
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
 
-	test := newParameterizedTest(ctrl, "QueueLeaves", noTX,
+	test := newParameterizedTest(ctrl, "QueueLeaf", noTX,
 		func(s *stestonly.FakeLogStorage) {
 			s.QueueLeavesErr = errors.New("STORAGE")
 		},
 		nopTX,
 		func(s *TrillianLogRPCServer) error {
-			_, err := s.QueueLeaves(context.Background(), &queueRequest0)
+			_, err := s.QueueLeaf(context.Background(), &queueRequest0)
 			return err
 		})
 
 	test.executeStorageFailureTest(t, queueRequest0.LogId)
 }
 
-func TestQueueLeavesInvalidLogId(t *testing.T) {
+func TestQueueLeafInvalidLogId(t *testing.T) {
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
 
-	test := newParameterizedTest(ctrl, "QueueLeaves", noTX, nopStorage, nopTX,
+	test := newParameterizedTest(ctrl, "QueueLeaf", noTX, nopStorage, nopTX,
 		func(s *TrillianLogRPCServer) error {
-			_, err := s.QueueLeaves(context.Background(), &queueRequest0Log2)
+			_, err := s.QueueLeaf(context.Background(), &queueRequest0Log2)
 			return err
 		})
 
@@ -315,7 +315,7 @@ func dupeQueuedLeaf(l *trillian.LogLeaf) *trillian.QueuedLogLeaf {
 	}
 }
 
-func TestQueueLeaves(t *testing.T) {
+func TestQueueLeaf(t *testing.T) {
 	ctx := context.Background()
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
@@ -330,41 +330,39 @@ func TestQueueLeaves(t *testing.T) {
 	}
 	server := NewTrillianLogRPCServer(registry, fakeTimeSource)
 
-	rsp, err := server.QueueLeaves(ctx, &queueRequest0)
+	rsp, err := server.QueueLeaf(ctx, &queueRequest0)
 	if err != nil {
 		t.Fatalf("Failed to queue leaf: %v", err)
 	}
-	if len(rsp.QueuedLeaves) != 1 {
-		t.Errorf("QueueLeaves() returns %d leaves; want 1", len(rsp.QueuedLeaves))
+	if rsp.QueuedLeaf == nil {
+		t.Error("QueueLeaf() returned nil leaf; want non-nil")
 	}
-	queuedLeaf := rsp.QueuedLeaves[0]
-	if queuedLeaf.Status.Code != int32(code.Code_OK) {
-		t.Errorf("QueueLeaves().Status=%d,nil; want %d,nil", queuedLeaf.Status.Code, code.Code_OK)
+	if rsp.QueuedLeaf.Status.Code != int32(code.Code_OK) {
+		t.Errorf("QueueLeaf().Status=%d,nil; want %d,nil", rsp.QueuedLeaf.Status.Code, code.Code_OK)
 	}
-	if !proto.Equal(queueRequest0.Leaves[0], queuedLeaf.Leaf) {
-		diff := cmp.Diff(queueRequest0.Leaves[0], queuedLeaf.Leaf)
-		t.Errorf("post-QueueLeaves() diff:\n%v", diff)
+	if !proto.Equal(queueRequest0.Leaf, rsp.QueuedLeaf.Leaf) {
+		diff := cmp.Diff(queueRequest0.Leaf, rsp.QueuedLeaf.Leaf)
+		t.Errorf("post-QueueLeaf() diff:\n%v", diff)
 	}
 
 	// Repeating the operation gives ALREADY_EXISTS.
-	rsp, err = server.QueueLeaves(ctx, &queueRequest0)
+	rsp, err = server.QueueLeaf(ctx, &queueRequest0)
 	if err != nil {
 		t.Fatalf("Failed to re-queue leaf: %v", err)
 	}
-	if len(rsp.QueuedLeaves) != 1 {
-		t.Errorf("QueueLeaves() returns %d leaves; want 1", len(rsp.QueuedLeaves))
+	if rsp.QueuedLeaf == nil {
+		t.Error("QueueLeaf() returned nil leaf; want non-nil")
 	}
-	queuedLeaf = rsp.QueuedLeaves[0]
-	if queuedLeaf.Status == nil || queuedLeaf.Status.Code != int32(code.Code_ALREADY_EXISTS) {
+	if rsp.QueuedLeaf.Status == nil || rsp.QueuedLeaf.Status.Code != int32(code.Code_ALREADY_EXISTS) {
 		sc := "nil"
-		if queuedLeaf.Status != nil {
-			sc = fmt.Sprintf("%v", queuedLeaf.Status.Code)
+		if rsp.QueuedLeaf.Status != nil {
+			sc = fmt.Sprintf("%v", rsp.QueuedLeaf.Status.Code)
 		}
-		t.Errorf("QueueLeaves().Status=%v,nil; want %v,nil", sc, code.Code_ALREADY_EXISTS)
+		t.Errorf("QueueLeaf().Status=%v,nil; want %v,nil", sc, code.Code_ALREADY_EXISTS)
 	}
-	if !proto.Equal(queueRequest0.Leaves[0], queuedLeaf.Leaf) {
-		diff := cmp.Diff(queueRequest0.Leaves[0], queuedLeaf.Leaf)
-		t.Errorf("post-QueueLeaves() diff:\n%v", diff)
+	if !proto.Equal(queueRequest0.Leaf, rsp.QueuedLeaf.Leaf) {
+		diff := cmp.Diff(queueRequest0.Leaf, rsp.QueuedLeaf.Leaf)
+		t.Errorf("post-QueueLeaf() diff:\n%v", diff)
 	}
 }
 
@@ -1539,64 +1537,6 @@ func TestTrillianLogRPCServer_QueueLeafErrors(t *testing.T) {
 	}
 }
 
-func TestTrillianLogRPCServer_QueueLeavesErrors(t *testing.T) {
-	leafValue := []byte("leaf value")
-	goodLeaf := &trillian.LogLeaf{
-		LeafValue: leafValue,
-	}
-
-	tests := []struct {
-		desc string
-		req  *trillian.QueueLeavesRequest
-	}{
-		{
-			desc: "nilLeaves",
-			req: &trillian.QueueLeavesRequest{
-				LogId: 1,
-			},
-		},
-		{
-			desc: "nilLeaf",
-			req: &trillian.QueueLeavesRequest{
-				LogId:  1,
-				Leaves: []*trillian.LogLeaf{goodLeaf, nil},
-			},
-		},
-		{
-			desc: "nilLeafValue",
-			req: &trillian.QueueLeavesRequest{
-				LogId: 1,
-				Leaves: []*trillian.LogLeaf{
-					goodLeaf,
-					{},
-				},
-			},
-		},
-		{
-			desc: "badLeafIndex",
-			req: &trillian.QueueLeavesRequest{
-				LogId: 1,
-				Leaves: []*trillian.LogLeaf{
-					goodLeaf,
-					{
-						LeafValue: leafValue,
-						LeafIndex: -10,
-					},
-				},
-			},
-		},
-	}
-
-	logServer := NewTrillianLogRPCServer(extension.Registry{}, fakeTimeSource)
-	ctx := context.Background()
-	for _, test := range tests {
-		_, err := logServer.QueueLeaves(ctx, test.req)
-		if s, ok := status.FromError(err); !ok || s.Code() != codes.InvalidArgument {
-			t.Errorf("%v: QueueLeaves() returned err = %v, wantCode = %s", test.desc, err, codes.InvalidArgument)
-		}
-	}
-}
-
 func TestInitLog(t *testing.T) {
 	ctx := context.Background()
 	// A non-empty log root
diff --git a/testonly/tmock/mock_log_server.go b/testonly/tmock/mock_log_server.go
index bd58c2e3..95af3ddc 100644
--- a/testonly/tmock/mock_log_server.go
+++ b/testonly/tmock/mock_log_server.go
@@ -169,18 +169,3 @@ func (mr *MockTrillianLogServerMockRecorder) QueueLeaf(arg0, arg1 interface{}) *
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueueLeaf", reflect.TypeOf((*MockTrillianLogServer)(nil).QueueLeaf), arg0, arg1)
 }
-
-// QueueLeaves mocks base method.
-func (m *MockTrillianLogServer) QueueLeaves(arg0 context.Context, arg1 *trillian.QueueLeavesRequest) (*trillian.QueueLeavesResponse, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "QueueLeaves", arg0, arg1)
-	ret0, _ := ret[0].(*trillian.QueueLeavesResponse)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// QueueLeaves indicates an expected call of QueueLeaves.
-func (mr *MockTrillianLogServerMockRecorder) QueueLeaves(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueueLeaves", reflect.TypeOf((*MockTrillianLogServer)(nil).QueueLeaves), arg0, arg1)
-}