From 046147eb1de6e6c023ef74317b0bb11953d605f7 Mon Sep 17 00:00:00 2001
From: Jeffrey Picard <jeff@jeffreypicard.com>
Date: Sat, 24 Jul 2021 04:55:11 -0400
Subject: [PATCH] updates for fields

---
 lbry/extras/daemon/daemon.py         |   5 +-
 lbry/schema/types/v2/hub_pb2.py      | 239 +++++++++++++++---
 lbry/schema/types/v2/hub_pb2_grpc.py | 298 ++++++++++++++++++++++
 lbry/schema/types/v2/result_pb2.py   | 354 +++++++++++++++++++++------
 lbry/wallet/orchstr8/__init__.py     |   2 +-
 5 files changed, 780 insertions(+), 118 deletions(-)

diff --git a/lbry/extras/daemon/daemon.py b/lbry/extras/daemon/daemon.py
index c3a18d464..50ab9580d 100644
--- a/lbry/extras/daemon/daemon.py
+++ b/lbry/extras/daemon/daemon.py
@@ -173,7 +173,7 @@ def paginate_list(items: List, page: Optional[int], page_size: Optional[int]):
 
 
 def fix_kwargs_for_hub(**kwargs):
-    repeated_fields = {"name", "claim_name", "normalized_name", "reposted_claim_id", "_id", "public_key_id",
+    repeated_fields = {"name", "claim_name", "normalized_name", "reposted_claim_id", "_id", # "public_key_id",
                        "public_key_bytes", "signature_digest", "signature", "tx_id", "channel_id",
                        "fee_currency", "media_type", "stream_type", "claim_type", "description", "author", "title",
                        "canonical_url", "short_url", "claim_id"}
@@ -184,6 +184,9 @@ def fix_kwargs_for_hub(**kwargs):
     for key in list(kwargs.keys()):
         value = kwargs[key]
 
+        if key == "reposted":
+            kwargs["repost_count"] = kwargs.pop("reposted")
+            key = "repost_count"
         if key == "txid":
             kwargs["tx_id"] = kwargs.pop("txid")
             key = "tx_id"
diff --git a/lbry/schema/types/v2/hub_pb2.py b/lbry/schema/types/v2/hub_pb2.py
index 48ec97f64..a17e2aaee 100644
--- a/lbry/schema/types/v2/hub_pb2.py
+++ b/lbry/schema/types/v2/hub_pb2.py
@@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z$github.com/lbryio/hub/protobuf/go/pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\thub.proto\x12\x02pb\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x0cresult.proto\"0\n\x0fInvertibleField\x12\x0e\n\x06invert\x18\x01 \x01(\x08\x12\r\n\x05value\x18\x02 \x03(\t\"j\n\nRangeField\x12\x1d\n\x02op\x18\x01 \x01(\x0e\x32\x11.pb.RangeField.Op\x12\r\n\x05value\x18\x02 \x03(\t\".\n\x02Op\x12\x06\n\x02\x45Q\x10\x00\x12\x07\n\x03LTE\x10\x01\x12\x07\n\x03GTE\x10\x02\x12\x06\n\x02LT\x10\x03\x12\x06\n\x02GT\x10\x04\"\xc3\x10\n\rSearchRequest\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x03(\t\x12\x31\n\x0c\x61mount_order\x18\x03 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x05limit\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x10\n\x08order_by\x18\x05 \x03(\t\x12+\n\x06offset\x18\x06 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x32\n\x0eis_controlling\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x1d\n\x15last_take_over_height\x18\x13 \x01(\t\x12%\n\x08\x63laim_id\x18\x14 \x01(\x0b\x32\x13.pb.InvertibleField\x12\x12\n\nclaim_name\x18\x16 \x03(\t\x12\x12\n\nnormalized\x18\x17 \x03(\t\x12#\n\x0btx_position\x18\x18 \x01(\x0b\x32\x0e.pb.RangeField\x12\x1e\n\x06\x61mount\x18\x19 \x01(\x0b\x32\x0e.pb.RangeField\x12!\n\ttimestamp\x18\x1a \x01(\x0b\x32\x0e.pb.RangeField\x12*\n\x12\x63reation_timestamp\x18\x1b \x01(\x0b\x32\x0e.pb.RangeField\x12\x1e\n\x06height\x18\x1c \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\x0f\x63reation_height\x18\x1d \x01(\x0b\x32\x0e.pb.RangeField\x12)\n\x11\x61\x63tivation_height\x18\x1e \x01(\x0b\x32\x0e.pb.RangeField\x12)\n\x11\x65xpiration_height\x18\x1f \x01(\x0b\x32\x0e.pb.RangeField\x12$\n\x0crelease_time\x18  \x01(\x0b\x32\x0e.pb.RangeField\x12\x11\n\tshort_url\x18! \x03(\t\x12\x15\n\rcanonical_url\x18\" \x03(\t\x12\r\n\x05title\x18# \x03(\t\x12\x0e\n\x06\x61uthor\x18$ \x03(\t\x12\x13\n\x0b\x64\x65scription\x18% \x03(\t\x12\x12\n\nclaim_type\x18& \x03(\t\x12 \n\x08reposted\x18\' \x01(\x0b\x32\x0e.pb.RangeField\x12\x13\n\x0bstream_type\x18( \x03(\t\x12\x12\n\nmedia_type\x18) \x03(\t\x12\"\n\nfee_amount\x18* \x01(\x0b\x32\x0e.pb.RangeField\x12\x14\n\x0c\x66\x65\x65_currency\x18+ \x03(\t\x12 \n\x08\x64uration\x18, \x01(\x0b\x32\x0e.pb.RangeField\x12\x1b\n\x13reposted_claim_hash\x18- \x01(\t\x12#\n\x0b\x63\x65nsor_type\x18. \x01(\x0b\x32\x0e.pb.RangeField\x12\x19\n\x11\x63laims_in_channel\x18/ \x01(\t\x12$\n\x0c\x63hannel_join\x18\x30 \x01(\x0b\x32\x0e.pb.RangeField\x12\x33\n\x0fsignature_valid\x18\x31 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12(\n\x10\x65\x66\x66\x65\x63tive_amount\x18\x33 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0esupport_amount\x18\x34 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_group\x18\x35 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_mixed\x18\x36 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_local\x18\x37 \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\x0ftrending_global\x18\x38 \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\nchannel_id\x18\x39 \x01(\x0b\x32\x13.pb.InvertibleField\x12(\n\x0b\x63hannel_ids\x18: \x01(\x0b\x32\x13.pb.InvertibleField\x12\r\n\x05tx_id\x18; \x03(\t\x12,\n\x07tx_nout\x18< \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x11\n\tsignature\x18= \x03(\t\x12\x18\n\x10signature_digest\x18> \x03(\t\x12\x18\n\x10public_key_bytes\x18? \x03(\t\x12\x17\n\x0fpublic_key_hash\x18@ \x03(\t\x12\x15\n\rpublic_key_id\x18\x41 \x01(\t\x12\x0b\n\x03_id\x18\x42 \x03(\x0c\x12\x10\n\x08\x61ny_tags\x18\x43 \x03(\t\x12\x10\n\x08\x61ll_tags\x18\x44 \x03(\t\x12\x10\n\x08not_tags\x18\x45 \x03(\t\x12\x19\n\x11reposted_claim_id\x18\x46 \x03(\t\x12\x39\n\x15has_channel_signature\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nhas_source\x18H \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x18limit_claims_per_channel\x18I \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x15\n\rany_languages\x18J \x03(\t\x12\x15\n\rall_languages\x18K \x03(\t\x12\x35\n\x11remove_duplicates\x18L \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tno_totals\x18M \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x16\n\x0esearch_indices\x18N \x03(\t21\n\x03Hub\x12*\n\x06Search\x12\x11.pb.SearchRequest\x1a\x0b.pb.Outputs\"\x00\x42&Z$github.com/lbryio/hub/protobuf/go/pbb\x06proto3'
+  serialized_pb=b'\n\thub.proto\x12\x02pb\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x0cresult.proto\"\x15\n\x13NoParamsThisIsSilly\"0\n\x0fInvertibleField\x12\x0e\n\x06invert\x18\x01 \x01(\x08\x12\r\n\x05value\x18\x02 \x03(\t\"j\n\nRangeField\x12\x1d\n\x02op\x18\x01 \x01(\x0e\x32\x11.pb.RangeField.Op\x12\r\n\x05value\x18\x02 \x03(\t\".\n\x02Op\x12\x06\n\x02\x45Q\x10\x00\x12\x07\n\x03LTE\x10\x01\x12\x07\n\x03GTE\x10\x02\x12\x06\n\x02LT\x10\x03\x12\x06\n\x02GT\x10\x04\"\xb6\x10\n\rSearchRequest\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x03(\t\x12\x31\n\x0c\x61mount_order\x18\x03 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x05limit\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x10\n\x08order_by\x18\x05 \x03(\t\x12+\n\x06offset\x18\x06 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x32\n\x0eis_controlling\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x1d\n\x15last_take_over_height\x18\x13 \x01(\t\x12%\n\x08\x63laim_id\x18\x14 \x01(\x0b\x32\x13.pb.InvertibleField\x12\x12\n\nclaim_name\x18\x16 \x03(\t\x12\x17\n\x0fnormalized_name\x18\x17 \x03(\t\x12#\n\x0btx_position\x18\x18 \x01(\x0b\x32\x0e.pb.RangeField\x12\x1e\n\x06\x61mount\x18\x19 \x01(\x0b\x32\x0e.pb.RangeField\x12!\n\ttimestamp\x18\x1a \x01(\x0b\x32\x0e.pb.RangeField\x12*\n\x12\x63reation_timestamp\x18\x1b \x01(\x0b\x32\x0e.pb.RangeField\x12\x1e\n\x06height\x18\x1c \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\x0f\x63reation_height\x18\x1d \x01(\x0b\x32\x0e.pb.RangeField\x12)\n\x11\x61\x63tivation_height\x18\x1e \x01(\x0b\x32\x0e.pb.RangeField\x12)\n\x11\x65xpiration_height\x18\x1f \x01(\x0b\x32\x0e.pb.RangeField\x12$\n\x0crelease_time\x18  \x01(\x0b\x32\x0e.pb.RangeField\x12\x11\n\tshort_url\x18! \x03(\t\x12\x15\n\rcanonical_url\x18\" \x03(\t\x12\r\n\x05title\x18# \x03(\t\x12\x0e\n\x06\x61uthor\x18$ \x03(\t\x12\x13\n\x0b\x64\x65scription\x18% \x03(\t\x12\x12\n\nclaim_type\x18& \x03(\t\x12$\n\x0crepost_count\x18\' \x01(\x0b\x32\x0e.pb.RangeField\x12\x13\n\x0bstream_type\x18( \x03(\t\x12\x12\n\nmedia_type\x18) \x03(\t\x12\"\n\nfee_amount\x18* \x01(\x0b\x32\x0e.pb.RangeField\x12\x14\n\x0c\x66\x65\x65_currency\x18+ \x03(\t\x12 \n\x08\x64uration\x18, \x01(\x0b\x32\x0e.pb.RangeField\x12\x1b\n\x13reposted_claim_hash\x18- \x01(\t\x12#\n\x0b\x63\x65nsor_type\x18. \x01(\x0b\x32\x0e.pb.RangeField\x12\x19\n\x11\x63laims_in_channel\x18/ \x01(\t\x12$\n\x0c\x63hannel_join\x18\x30 \x01(\x0b\x32\x0e.pb.RangeField\x12\x36\n\x12is_signature_valid\x18\x31 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12(\n\x10\x65\x66\x66\x65\x63tive_amount\x18\x33 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0esupport_amount\x18\x34 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_group\x18\x35 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_mixed\x18\x36 \x01(\x0b\x32\x0e.pb.RangeField\x12&\n\x0etrending_local\x18\x37 \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\x0ftrending_global\x18\x38 \x01(\x0b\x32\x0e.pb.RangeField\x12\'\n\nchannel_id\x18\x39 \x01(\x0b\x32\x13.pb.InvertibleField\x12(\n\x0b\x63hannel_ids\x18: \x01(\x0b\x32\x13.pb.InvertibleField\x12\r\n\x05tx_id\x18; \x03(\t\x12,\n\x07tx_nout\x18< \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x11\n\tsignature\x18= \x03(\t\x12\x18\n\x10signature_digest\x18> \x03(\t\x12\x18\n\x10public_key_bytes\x18? \x03(\t\x12\x15\n\rpublic_key_id\x18\x41 \x01(\t\x12\x0b\n\x03_id\x18\x42 \x03(\x0c\x12\x10\n\x08\x61ny_tags\x18\x43 \x03(\t\x12\x10\n\x08\x61ll_tags\x18\x44 \x03(\t\x12\x10\n\x08not_tags\x18\x45 \x03(\t\x12\x19\n\x11reposted_claim_id\x18\x46 \x03(\t\x12\x39\n\x15has_channel_signature\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nhas_source\x18H \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x18limit_claims_per_channel\x18I \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x15\n\rany_languages\x18J \x03(\t\x12\x15\n\rall_languages\x18K \x03(\t\x12\x35\n\x11remove_duplicates\x18L \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tno_totals\x18M \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x16\n\x0esearch_indices\x18N \x03(\t\"2\n\x0c\x42lockRequest\x12\x11\n\tblockhash\x18\x01 \x01(\t\x12\x0f\n\x07verbose\x18\x02 \x01(\x08\x32\xf7\x04\n\x03Hub\x12?\n\x10SubscribeHeaders\x12\x10.pb.BlockRequest\x1a\x15.pb.BlockHeaderOutput\"\x00\x30\x01\x12*\n\x06Search\x12\x11.pb.SearchRequest\x1a\x0b.pb.Outputs\"\x00\x12/\n\x08GetBlock\x12\x10.pb.BlockRequest\x1a\x0f.pb.BlockOutput\"\x00\x12;\n\x0eGetBlockHeader\x12\x10.pb.BlockRequest\x1a\x15.pb.BlockHeaderOutput\"\x00\x12J\n\x0fGetServerHeight\x12\x17.pb.NoParamsThisIsSilly\x1a\x1c.google.protobuf.UInt64Value\"\x00\x12\x39\n\nGetHeaders\x12\x10.pb.BlockRequest\x1a\x15.pb.BlockHeaderOutput\"\x00\x30\x01\x12?\n\x04Ping\x12\x17.pb.NoParamsThisIsSilly\x1a\x1c.google.protobuf.StringValue\"\x00\x12\x42\n\x07Version\x12\x17.pb.NoParamsThisIsSilly\x1a\x1c.google.protobuf.StringValue\"\x00\x12\x43\n\x08\x46\x65\x61tures\x12\x17.pb.NoParamsThisIsSilly\x1a\x1c.google.protobuf.StringValue\"\x00\x12\x44\n\tBroadcast\x12\x17.pb.NoParamsThisIsSilly\x1a\x1c.google.protobuf.UInt64Value\"\x00\x42&Z$github.com/lbryio/hub/protobuf/go/pbb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,result__pb2.DESCRIPTOR,])
 
@@ -62,12 +62,37 @@ _RANGEFIELD_OP = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=173,
-  serialized_end=219,
+  serialized_start=196,
+  serialized_end=242,
 )
 _sym_db.RegisterEnumDescriptor(_RANGEFIELD_OP)
 
 
+_NOPARAMSTHISISSILLY = _descriptor.Descriptor(
+  name='NoParamsThisIsSilly',
+  full_name='pb.NoParamsThisIsSilly',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=63,
+  serialized_end=84,
+)
+
+
 _INVERTIBLEFIELD = _descriptor.Descriptor(
   name='InvertibleField',
   full_name='pb.InvertibleField',
@@ -102,8 +127,8 @@ _INVERTIBLEFIELD = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=63,
-  serialized_end=111,
+  serialized_start=86,
+  serialized_end=134,
 )
 
 
@@ -142,8 +167,8 @@ _RANGEFIELD = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=113,
-  serialized_end=219,
+  serialized_start=136,
+  serialized_end=242,
 )
 
 
@@ -226,7 +251,7 @@ _SEARCHREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='normalized', full_name='pb.SearchRequest.normalized', index=10,
+      name='normalized_name', full_name='pb.SearchRequest.normalized_name', index=10,
       number=23, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -338,7 +363,7 @@ _SEARCHREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='reposted', full_name='pb.SearchRequest.reposted', index=26,
+      name='repost_count', full_name='pb.SearchRequest.repost_count', index=26,
       number=39, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -408,7 +433,7 @@ _SEARCHREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='signature_valid', full_name='pb.SearchRequest.signature_valid', index=36,
+      name='is_signature_valid', full_name='pb.SearchRequest.is_signature_valid', index=36,
       number=49, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -506,105 +531,98 @@ _SEARCHREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='public_key_hash', full_name='pb.SearchRequest.public_key_hash', index=50,
-      number=64, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='public_key_id', full_name='pb.SearchRequest.public_key_id', index=51,
+      name='public_key_id', full_name='pb.SearchRequest.public_key_id', index=50,
       number=65, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='_id', full_name='pb.SearchRequest._id', index=52,
+      name='_id', full_name='pb.SearchRequest._id', index=51,
       number=66, type=12, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='any_tags', full_name='pb.SearchRequest.any_tags', index=53,
+      name='any_tags', full_name='pb.SearchRequest.any_tags', index=52,
       number=67, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='all_tags', full_name='pb.SearchRequest.all_tags', index=54,
+      name='all_tags', full_name='pb.SearchRequest.all_tags', index=53,
       number=68, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='not_tags', full_name='pb.SearchRequest.not_tags', index=55,
+      name='not_tags', full_name='pb.SearchRequest.not_tags', index=54,
       number=69, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='reposted_claim_id', full_name='pb.SearchRequest.reposted_claim_id', index=56,
+      name='reposted_claim_id', full_name='pb.SearchRequest.reposted_claim_id', index=55,
       number=70, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='has_channel_signature', full_name='pb.SearchRequest.has_channel_signature', index=57,
+      name='has_channel_signature', full_name='pb.SearchRequest.has_channel_signature', index=56,
       number=71, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='has_source', full_name='pb.SearchRequest.has_source', index=58,
+      name='has_source', full_name='pb.SearchRequest.has_source', index=57,
       number=72, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='limit_claims_per_channel', full_name='pb.SearchRequest.limit_claims_per_channel', index=59,
+      name='limit_claims_per_channel', full_name='pb.SearchRequest.limit_claims_per_channel', index=58,
       number=73, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='any_languages', full_name='pb.SearchRequest.any_languages', index=60,
+      name='any_languages', full_name='pb.SearchRequest.any_languages', index=59,
       number=74, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='all_languages', full_name='pb.SearchRequest.all_languages', index=61,
+      name='all_languages', full_name='pb.SearchRequest.all_languages', index=60,
       number=75, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='remove_duplicates', full_name='pb.SearchRequest.remove_duplicates', index=62,
+      name='remove_duplicates', full_name='pb.SearchRequest.remove_duplicates', index=61,
       number=76, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='no_totals', full_name='pb.SearchRequest.no_totals', index=63,
+      name='no_totals', full_name='pb.SearchRequest.no_totals', index=62,
       number=77, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='search_indices', full_name='pb.SearchRequest.search_indices', index=64,
+      name='search_indices', full_name='pb.SearchRequest.search_indices', index=63,
       number=78, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -622,8 +640,47 @@ _SEARCHREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=222,
-  serialized_end=2337,
+  serialized_start=245,
+  serialized_end=2347,
+)
+
+
+_BLOCKREQUEST = _descriptor.Descriptor(
+  name='BlockRequest',
+  full_name='pb.BlockRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='blockhash', full_name='pb.BlockRequest.blockhash', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='verbose', full_name='pb.BlockRequest.verbose', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2349,
+  serialized_end=2399,
 )
 
 _RANGEFIELD.fields_by_name['op'].enum_type = _RANGEFIELD_OP
@@ -642,12 +699,12 @@ _SEARCHREQUEST.fields_by_name['creation_height'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['activation_height'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['expiration_height'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['release_time'].message_type = _RANGEFIELD
-_SEARCHREQUEST.fields_by_name['reposted'].message_type = _RANGEFIELD
+_SEARCHREQUEST.fields_by_name['repost_count'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['fee_amount'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['duration'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['censor_type'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['channel_join'].message_type = _RANGEFIELD
-_SEARCHREQUEST.fields_by_name['signature_valid'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_SEARCHREQUEST.fields_by_name['is_signature_valid'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
 _SEARCHREQUEST.fields_by_name['effective_amount'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['support_amount'].message_type = _RANGEFIELD
 _SEARCHREQUEST.fields_by_name['trending_group'].message_type = _RANGEFIELD
@@ -662,11 +719,20 @@ _SEARCHREQUEST.fields_by_name['has_source'].message_type = google_dot_protobuf_d
 _SEARCHREQUEST.fields_by_name['limit_claims_per_channel'].message_type = google_dot_protobuf_dot_wrappers__pb2._INT32VALUE
 _SEARCHREQUEST.fields_by_name['remove_duplicates'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
 _SEARCHREQUEST.fields_by_name['no_totals'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+DESCRIPTOR.message_types_by_name['NoParamsThisIsSilly'] = _NOPARAMSTHISISSILLY
 DESCRIPTOR.message_types_by_name['InvertibleField'] = _INVERTIBLEFIELD
 DESCRIPTOR.message_types_by_name['RangeField'] = _RANGEFIELD
 DESCRIPTOR.message_types_by_name['SearchRequest'] = _SEARCHREQUEST
+DESCRIPTOR.message_types_by_name['BlockRequest'] = _BLOCKREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
+NoParamsThisIsSilly = _reflection.GeneratedProtocolMessageType('NoParamsThisIsSilly', (_message.Message,), {
+  'DESCRIPTOR' : _NOPARAMSTHISISSILLY,
+  '__module__' : 'hub_pb2'
+  # @@protoc_insertion_point(class_scope:pb.NoParamsThisIsSilly)
+  })
+_sym_db.RegisterMessage(NoParamsThisIsSilly)
+
 InvertibleField = _reflection.GeneratedProtocolMessageType('InvertibleField', (_message.Message,), {
   'DESCRIPTOR' : _INVERTIBLEFIELD,
   '__module__' : 'hub_pb2'
@@ -688,6 +754,13 @@ SearchRequest = _reflection.GeneratedProtocolMessageType('SearchRequest', (_mess
   })
 _sym_db.RegisterMessage(SearchRequest)
 
+BlockRequest = _reflection.GeneratedProtocolMessageType('BlockRequest', (_message.Message,), {
+  'DESCRIPTOR' : _BLOCKREQUEST,
+  '__module__' : 'hub_pb2'
+  # @@protoc_insertion_point(class_scope:pb.BlockRequest)
+  })
+_sym_db.RegisterMessage(BlockRequest)
+
 
 DESCRIPTOR._options = None
 
@@ -698,19 +771,109 @@ _HUB = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2339,
-  serialized_end=2388,
+  serialized_start=2402,
+  serialized_end=3033,
   methods=[
+  _descriptor.MethodDescriptor(
+    name='SubscribeHeaders',
+    full_name='pb.Hub.SubscribeHeaders',
+    index=0,
+    containing_service=None,
+    input_type=_BLOCKREQUEST,
+    output_type=result__pb2._BLOCKHEADEROUTPUT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
   _descriptor.MethodDescriptor(
     name='Search',
     full_name='pb.Hub.Search',
-    index=0,
+    index=1,
     containing_service=None,
     input_type=_SEARCHREQUEST,
     output_type=result__pb2._OUTPUTS,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='GetBlock',
+    full_name='pb.Hub.GetBlock',
+    index=2,
+    containing_service=None,
+    input_type=_BLOCKREQUEST,
+    output_type=result__pb2._BLOCKOUTPUT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetBlockHeader',
+    full_name='pb.Hub.GetBlockHeader',
+    index=3,
+    containing_service=None,
+    input_type=_BLOCKREQUEST,
+    output_type=result__pb2._BLOCKHEADEROUTPUT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetServerHeight',
+    full_name='pb.Hub.GetServerHeight',
+    index=4,
+    containing_service=None,
+    input_type=_NOPARAMSTHISISSILLY,
+    output_type=google_dot_protobuf_dot_wrappers__pb2._UINT64VALUE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetHeaders',
+    full_name='pb.Hub.GetHeaders',
+    index=5,
+    containing_service=None,
+    input_type=_BLOCKREQUEST,
+    output_type=result__pb2._BLOCKHEADEROUTPUT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Ping',
+    full_name='pb.Hub.Ping',
+    index=6,
+    containing_service=None,
+    input_type=_NOPARAMSTHISISSILLY,
+    output_type=google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Version',
+    full_name='pb.Hub.Version',
+    index=7,
+    containing_service=None,
+    input_type=_NOPARAMSTHISISSILLY,
+    output_type=google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Features',
+    full_name='pb.Hub.Features',
+    index=8,
+    containing_service=None,
+    input_type=_NOPARAMSTHISISSILLY,
+    output_type=google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Broadcast',
+    full_name='pb.Hub.Broadcast',
+    index=9,
+    containing_service=None,
+    input_type=_NOPARAMSTHISISSILLY,
+    output_type=google_dot_protobuf_dot_wrappers__pb2._UINT64VALUE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_HUB)
 
diff --git a/lbry/schema/types/v2/hub_pb2_grpc.py b/lbry/schema/types/v2/hub_pb2_grpc.py
index 501c003ec..10ef0da39 100644
--- a/lbry/schema/types/v2/hub_pb2_grpc.py
+++ b/lbry/schema/types/v2/hub_pb2_grpc.py
@@ -2,6 +2,7 @@
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
+from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
 import lbry.schema.types.v2.hub_pb2 as hub__pb2
 import lbry.schema.types.v2.result_pb2 as result__pb2
 
@@ -15,30 +16,174 @@ class HubStub(object):
         Args:
             channel: A grpc.Channel.
         """
+        self.SubscribeHeaders = channel.unary_stream(
+                '/pb.Hub/SubscribeHeaders',
+                request_serializer=hub__pb2.BlockRequest.SerializeToString,
+                response_deserializer=result__pb2.BlockHeaderOutput.FromString,
+                )
         self.Search = channel.unary_unary(
                 '/pb.Hub/Search',
                 request_serializer=hub__pb2.SearchRequest.SerializeToString,
                 response_deserializer=result__pb2.Outputs.FromString,
                 )
+        self.GetBlock = channel.unary_unary(
+                '/pb.Hub/GetBlock',
+                request_serializer=hub__pb2.BlockRequest.SerializeToString,
+                response_deserializer=result__pb2.BlockOutput.FromString,
+                )
+        self.GetBlockHeader = channel.unary_unary(
+                '/pb.Hub/GetBlockHeader',
+                request_serializer=hub__pb2.BlockRequest.SerializeToString,
+                response_deserializer=result__pb2.BlockHeaderOutput.FromString,
+                )
+        self.GetServerHeight = channel.unary_unary(
+                '/pb.Hub/GetServerHeight',
+                request_serializer=hub__pb2.NoParamsThisIsSilly.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_wrappers__pb2.UInt64Value.FromString,
+                )
+        self.GetHeaders = channel.unary_stream(
+                '/pb.Hub/GetHeaders',
+                request_serializer=hub__pb2.BlockRequest.SerializeToString,
+                response_deserializer=result__pb2.BlockHeaderOutput.FromString,
+                )
+        self.Ping = channel.unary_unary(
+                '/pb.Hub/Ping',
+                request_serializer=hub__pb2.NoParamsThisIsSilly.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+                )
+        self.Version = channel.unary_unary(
+                '/pb.Hub/Version',
+                request_serializer=hub__pb2.NoParamsThisIsSilly.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+                )
+        self.Features = channel.unary_unary(
+                '/pb.Hub/Features',
+                request_serializer=hub__pb2.NoParamsThisIsSilly.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+                )
+        self.Broadcast = channel.unary_unary(
+                '/pb.Hub/Broadcast',
+                request_serializer=hub__pb2.NoParamsThisIsSilly.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_wrappers__pb2.UInt64Value.FromString,
+                )
 
 
 class HubServicer(object):
     """Missing associated documentation comment in .proto file."""
 
+    def SubscribeHeaders(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def Search(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def GetBlock(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetBlockHeader(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetServerHeight(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetHeaders(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Ping(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Version(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Features(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Broadcast(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_HubServicer_to_server(servicer, server):
     rpc_method_handlers = {
+            'SubscribeHeaders': grpc.unary_stream_rpc_method_handler(
+                    servicer.SubscribeHeaders,
+                    request_deserializer=hub__pb2.BlockRequest.FromString,
+                    response_serializer=result__pb2.BlockHeaderOutput.SerializeToString,
+            ),
             'Search': grpc.unary_unary_rpc_method_handler(
                     servicer.Search,
                     request_deserializer=hub__pb2.SearchRequest.FromString,
                     response_serializer=result__pb2.Outputs.SerializeToString,
             ),
+            'GetBlock': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetBlock,
+                    request_deserializer=hub__pb2.BlockRequest.FromString,
+                    response_serializer=result__pb2.BlockOutput.SerializeToString,
+            ),
+            'GetBlockHeader': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetBlockHeader,
+                    request_deserializer=hub__pb2.BlockRequest.FromString,
+                    response_serializer=result__pb2.BlockHeaderOutput.SerializeToString,
+            ),
+            'GetServerHeight': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetServerHeight,
+                    request_deserializer=hub__pb2.NoParamsThisIsSilly.FromString,
+                    response_serializer=google_dot_protobuf_dot_wrappers__pb2.UInt64Value.SerializeToString,
+            ),
+            'GetHeaders': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetHeaders,
+                    request_deserializer=hub__pb2.BlockRequest.FromString,
+                    response_serializer=result__pb2.BlockHeaderOutput.SerializeToString,
+            ),
+            'Ping': grpc.unary_unary_rpc_method_handler(
+                    servicer.Ping,
+                    request_deserializer=hub__pb2.NoParamsThisIsSilly.FromString,
+                    response_serializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.SerializeToString,
+            ),
+            'Version': grpc.unary_unary_rpc_method_handler(
+                    servicer.Version,
+                    request_deserializer=hub__pb2.NoParamsThisIsSilly.FromString,
+                    response_serializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.SerializeToString,
+            ),
+            'Features': grpc.unary_unary_rpc_method_handler(
+                    servicer.Features,
+                    request_deserializer=hub__pb2.NoParamsThisIsSilly.FromString,
+                    response_serializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.SerializeToString,
+            ),
+            'Broadcast': grpc.unary_unary_rpc_method_handler(
+                    servicer.Broadcast,
+                    request_deserializer=hub__pb2.NoParamsThisIsSilly.FromString,
+                    response_serializer=google_dot_protobuf_dot_wrappers__pb2.UInt64Value.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'pb.Hub', rpc_method_handlers)
@@ -49,6 +194,23 @@ def add_HubServicer_to_server(servicer, server):
 class Hub(object):
     """Missing associated documentation comment in .proto file."""
 
+    @staticmethod
+    def SubscribeHeaders(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/pb.Hub/SubscribeHeaders',
+            hub__pb2.BlockRequest.SerializeToString,
+            result__pb2.BlockHeaderOutput.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
     @staticmethod
     def Search(request,
             target,
@@ -65,3 +227,139 @@ class Hub(object):
             result__pb2.Outputs.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetBlock(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/GetBlock',
+            hub__pb2.BlockRequest.SerializeToString,
+            result__pb2.BlockOutput.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetBlockHeader(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/GetBlockHeader',
+            hub__pb2.BlockRequest.SerializeToString,
+            result__pb2.BlockHeaderOutput.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetServerHeight(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/GetServerHeight',
+            hub__pb2.NoParamsThisIsSilly.SerializeToString,
+            google_dot_protobuf_dot_wrappers__pb2.UInt64Value.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetHeaders(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/pb.Hub/GetHeaders',
+            hub__pb2.BlockRequest.SerializeToString,
+            result__pb2.BlockHeaderOutput.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Ping(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/Ping',
+            hub__pb2.NoParamsThisIsSilly.SerializeToString,
+            google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Version(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/Version',
+            hub__pb2.NoParamsThisIsSilly.SerializeToString,
+            google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Features(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/Features',
+            hub__pb2.NoParamsThisIsSilly.SerializeToString,
+            google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Broadcast(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pb.Hub/Broadcast',
+            hub__pb2.NoParamsThisIsSilly.SerializeToString,
+            google_dot_protobuf_dot_wrappers__pb2.UInt64Value.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/lbry/schema/types/v2/result_pb2.py b/lbry/schema/types/v2/result_pb2.py
index 3bcd13b00..bb609d7f1 100644
--- a/lbry/schema/types/v2/result_pb2.py
+++ b/lbry/schema/types/v2/result_pb2.py
@@ -1,13 +1,11 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: result.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -19,9 +17,10 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='result.proto',
   package='pb',
   syntax='proto3',
-  serialized_pb=_b('\n\x0cresult.proto\x12\x02pb\"\x97\x01\n\x07Outputs\x12\x18\n\x04txos\x18\x01 \x03(\x0b\x32\n.pb.Output\x12\x1e\n\nextra_txos\x18\x02 \x03(\x0b\x32\n.pb.Output\x12\r\n\x05total\x18\x03 \x01(\r\x12\x0e\n\x06offset\x18\x04 \x01(\r\x12\x1c\n\x07\x62locked\x18\x05 \x03(\x0b\x32\x0b.pb.Blocked\x12\x15\n\rblocked_total\x18\x06 \x01(\r\"{\n\x06Output\x12\x0f\n\x07tx_hash\x18\x01 \x01(\x0c\x12\x0c\n\x04nout\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x1e\n\x05\x63laim\x18\x07 \x01(\x0b\x32\r.pb.ClaimMetaH\x00\x12\x1a\n\x05\x65rror\x18\x0f \x01(\x0b\x32\t.pb.ErrorH\x00\x42\x06\n\x04meta\"\xaf\x03\n\tClaimMeta\x12\x1b\n\x07\x63hannel\x18\x01 \x01(\x0b\x32\n.pb.Output\x12\x1a\n\x06repost\x18\x02 \x01(\x0b\x32\n.pb.Output\x12\x11\n\tshort_url\x18\x03 \x01(\t\x12\x15\n\rcanonical_url\x18\x04 \x01(\t\x12\x16\n\x0eis_controlling\x18\x05 \x01(\x08\x12\x18\n\x10take_over_height\x18\x06 \x01(\r\x12\x17\n\x0f\x63reation_height\x18\x07 \x01(\r\x12\x19\n\x11\x61\x63tivation_height\x18\x08 \x01(\r\x12\x19\n\x11\x65xpiration_height\x18\t \x01(\r\x12\x19\n\x11\x63laims_in_channel\x18\n \x01(\r\x12\x10\n\x08reposted\x18\x0b \x01(\r\x12\x18\n\x10\x65\x66\x66\x65\x63tive_amount\x18\x14 \x01(\x04\x12\x16\n\x0esupport_amount\x18\x15 \x01(\x04\x12\x16\n\x0etrending_group\x18\x16 \x01(\r\x12\x16\n\x0etrending_mixed\x18\x17 \x01(\x02\x12\x16\n\x0etrending_local\x18\x18 \x01(\x02\x12\x17\n\x0ftrending_global\x18\x19 \x01(\x02\"\x94\x01\n\x05\x45rror\x12\x1c\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0e.pb.Error.Code\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x1c\n\x07\x62locked\x18\x03 \x01(\x0b\x32\x0b.pb.Blocked\"A\n\x04\x43ode\x12\x10\n\x0cUNKNOWN_CODE\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07INVALID\x10\x02\x12\x0b\n\x07\x42LOCKED\x10\x03\"5\n\x07\x42locked\x12\r\n\x05\x63ount\x18\x01 \x01(\r\x12\x1b\n\x07\x63hannel\x18\x02 \x01(\x0b\x32\n.pb.Outputb\x06proto3')
+  serialized_options=b'Z$github.com/lbryio/hub/protobuf/go/pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x0cresult.proto\x12\x02pb\"\x97\x01\n\x07Outputs\x12\x18\n\x04txos\x18\x01 \x03(\x0b\x32\n.pb.Output\x12\x1e\n\nextra_txos\x18\x02 \x03(\x0b\x32\n.pb.Output\x12\r\n\x05total\x18\x03 \x01(\r\x12\x0e\n\x06offset\x18\x04 \x01(\r\x12\x1c\n\x07\x62locked\x18\x05 \x03(\x0b\x32\x0b.pb.Blocked\x12\x15\n\rblocked_total\x18\x06 \x01(\r\"{\n\x06Output\x12\x0f\n\x07tx_hash\x18\x01 \x01(\x0c\x12\x0c\n\x04nout\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x1e\n\x05\x63laim\x18\x07 \x01(\x0b\x32\r.pb.ClaimMetaH\x00\x12\x1a\n\x05\x65rror\x18\x0f \x01(\x0b\x32\t.pb.ErrorH\x00\x42\x06\n\x04meta\"\xaf\x03\n\tClaimMeta\x12\x1b\n\x07\x63hannel\x18\x01 \x01(\x0b\x32\n.pb.Output\x12\x1a\n\x06repost\x18\x02 \x01(\x0b\x32\n.pb.Output\x12\x11\n\tshort_url\x18\x03 \x01(\t\x12\x15\n\rcanonical_url\x18\x04 \x01(\t\x12\x16\n\x0eis_controlling\x18\x05 \x01(\x08\x12\x18\n\x10take_over_height\x18\x06 \x01(\r\x12\x17\n\x0f\x63reation_height\x18\x07 \x01(\r\x12\x19\n\x11\x61\x63tivation_height\x18\x08 \x01(\r\x12\x19\n\x11\x65xpiration_height\x18\t \x01(\r\x12\x19\n\x11\x63laims_in_channel\x18\n \x01(\r\x12\x10\n\x08reposted\x18\x0b \x01(\r\x12\x18\n\x10\x65\x66\x66\x65\x63tive_amount\x18\x14 \x01(\x04\x12\x16\n\x0esupport_amount\x18\x15 \x01(\x04\x12\x16\n\x0etrending_group\x18\x16 \x01(\r\x12\x16\n\x0etrending_mixed\x18\x17 \x01(\x02\x12\x16\n\x0etrending_local\x18\x18 \x01(\x02\x12\x17\n\x0ftrending_global\x18\x19 \x01(\x02\"\x94\x01\n\x05\x45rror\x12\x1c\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0e.pb.Error.Code\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x1c\n\x07\x62locked\x18\x03 \x01(\x0b\x32\x0b.pb.Blocked\"A\n\x04\x43ode\x12\x10\n\x0cUNKNOWN_CODE\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07INVALID\x10\x02\x12\x0b\n\x07\x42LOCKED\x10\x03\"5\n\x07\x42locked\x12\r\n\x05\x63ount\x18\x01 \x01(\r\x12\x1b\n\x07\x63hannel\x18\x02 \x01(\x0b\x32\n.pb.Output\"2\n\x0b\x42lockOutput\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x15\n\rconfirmations\x18\x02 \x01(\x05\"\xa6\x02\n\x11\x42lockHeaderOutput\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x15\n\rconfirmations\x18\x02 \x01(\x03\x12\x0e\n\x06height\x18\x03 \x01(\x03\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x12\n\nversionHex\x18\x05 \x01(\t\x12\x12\n\nmerkleroot\x18\x06 \x01(\t\x12\x0c\n\x04time\x18\x07 \x01(\x03\x12\x12\n\nmediantime\x18\x08 \x01(\x03\x12\r\n\x05nonce\x18\t \x01(\x03\x12\x0c\n\x04\x62its\x18\n \x01(\t\x12\x12\n\ndifficulty\x18\x0b \x01(\x01\x12\x11\n\tchainwork\x18\x0c \x01(\t\x12\x0b\n\x03nTx\x18\r \x01(\x03\x12\x19\n\x11previousblockhash\x18\x0e \x01(\t\x12\x15\n\rnextblockhash\x18\x0f \x01(\tB&Z$github.com/lbryio/hub/protobuf/go/pbb\x06proto3'
 )
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 
 
@@ -30,26 +29,31 @@ _ERROR_CODE = _descriptor.EnumDescriptor(
   full_name='pb.Error.Code',
   filename=None,
   file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
   values=[
     _descriptor.EnumValueDescriptor(
       name='UNKNOWN_CODE', index=0, number=0,
-      options=None,
-      type=None),
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='NOT_FOUND', index=1, number=1,
-      options=None,
-      type=None),
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='INVALID', index=2, number=2,
-      options=None,
-      type=None),
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='BLOCKED', index=3, number=3,
-      options=None,
-      type=None),
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
-  options=None,
+  serialized_options=None,
   serialized_start=817,
   serialized_end=882,
 )
@@ -62,6 +66,7 @@ _OUTPUTS = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='txos', full_name='pb.Outputs.txos', index=0,
@@ -69,49 +74,49 @@ _OUTPUTS = _descriptor.Descriptor(
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='extra_txos', full_name='pb.Outputs.extra_txos', index=1,
       number=2, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='total', full_name='pb.Outputs.total', index=2,
       number=3, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='offset', full_name='pb.Outputs.offset', index=3,
       number=4, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='blocked', full_name='pb.Outputs.blocked', index=4,
       number=5, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='blocked_total', full_name='pb.Outputs.blocked_total', index=5,
       number=6, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
   ],
-  options=None,
+  serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
@@ -128,56 +133,59 @@ _OUTPUT = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tx_hash', full_name='pb.Output.tx_hash', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
+      has_default_value=False, default_value=b"",
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='nout', full_name='pb.Output.nout', index=1,
       number=2, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='height', full_name='pb.Output.height', index=2,
       number=3, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='claim', full_name='pb.Output.claim', index=3,
       number=7, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='error', full_name='pb.Output.error', index=4,
       number=15, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
   ],
-  options=None,
+  serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
     _descriptor.OneofDescriptor(
       name='meta', full_name='pb.Output.meta',
-      index=0, containing_type=None, fields=[]),
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
   ],
   serialized_start=174,
   serialized_end=297,
@@ -190,6 +198,7 @@ _CLAIMMETA = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='channel', full_name='pb.ClaimMeta.channel', index=0,
@@ -197,126 +206,126 @@ _CLAIMMETA = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='repost', full_name='pb.ClaimMeta.repost', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='short_url', full_name='pb.ClaimMeta.short_url', index=2,
       number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='canonical_url', full_name='pb.ClaimMeta.canonical_url', index=3,
       number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='is_controlling', full_name='pb.ClaimMeta.is_controlling', index=4,
       number=5, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='take_over_height', full_name='pb.ClaimMeta.take_over_height', index=5,
       number=6, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='creation_height', full_name='pb.ClaimMeta.creation_height', index=6,
       number=7, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='activation_height', full_name='pb.ClaimMeta.activation_height', index=7,
       number=8, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='expiration_height', full_name='pb.ClaimMeta.expiration_height', index=8,
       number=9, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='claims_in_channel', full_name='pb.ClaimMeta.claims_in_channel', index=9,
       number=10, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='reposted', full_name='pb.ClaimMeta.reposted', index=10,
       number=11, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='effective_amount', full_name='pb.ClaimMeta.effective_amount', index=11,
       number=20, type=4, cpp_type=4, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='support_amount', full_name='pb.ClaimMeta.support_amount', index=12,
       number=21, type=4, cpp_type=4, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='trending_group', full_name='pb.ClaimMeta.trending_group', index=13,
       number=22, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='trending_mixed', full_name='pb.ClaimMeta.trending_mixed', index=14,
       number=23, type=2, cpp_type=6, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='trending_local', full_name='pb.ClaimMeta.trending_local', index=15,
       number=24, type=2, cpp_type=6, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='trending_global', full_name='pb.ClaimMeta.trending_global', index=16,
       number=25, type=2, cpp_type=6, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
   ],
-  options=None,
+  serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
@@ -333,6 +342,7 @@ _ERROR = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='code', full_name='pb.Error.code', index=0,
@@ -340,21 +350,21 @@ _ERROR = _descriptor.Descriptor(
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='text', full_name='pb.Error.text', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='blocked', full_name='pb.Error.blocked', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -362,7 +372,7 @@ _ERROR = _descriptor.Descriptor(
   enum_types=[
     _ERROR_CODE,
   ],
-  options=None,
+  serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
@@ -379,6 +389,7 @@ _BLOCKED = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='count', full_name='pb.Blocked.count', index=0,
@@ -386,21 +397,21 @@ _BLOCKED = _descriptor.Descriptor(
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='channel', full_name='pb.Blocked.channel', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
   ],
-  options=None,
+  serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
@@ -410,6 +421,175 @@ _BLOCKED = _descriptor.Descriptor(
   serialized_end=937,
 )
 
+
+_BLOCKOUTPUT = _descriptor.Descriptor(
+  name='BlockOutput',
+  full_name='pb.BlockOutput',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hash', full_name='pb.BlockOutput.hash', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='confirmations', full_name='pb.BlockOutput.confirmations', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=939,
+  serialized_end=989,
+)
+
+
+_BLOCKHEADEROUTPUT = _descriptor.Descriptor(
+  name='BlockHeaderOutput',
+  full_name='pb.BlockHeaderOutput',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hash', full_name='pb.BlockHeaderOutput.hash', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='confirmations', full_name='pb.BlockHeaderOutput.confirmations', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='height', full_name='pb.BlockHeaderOutput.height', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='version', full_name='pb.BlockHeaderOutput.version', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='versionHex', full_name='pb.BlockHeaderOutput.versionHex', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='merkleroot', full_name='pb.BlockHeaderOutput.merkleroot', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='time', full_name='pb.BlockHeaderOutput.time', index=6,
+      number=7, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mediantime', full_name='pb.BlockHeaderOutput.mediantime', index=7,
+      number=8, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='nonce', full_name='pb.BlockHeaderOutput.nonce', index=8,
+      number=9, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='bits', full_name='pb.BlockHeaderOutput.bits', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='difficulty', full_name='pb.BlockHeaderOutput.difficulty', index=10,
+      number=11, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='chainwork', full_name='pb.BlockHeaderOutput.chainwork', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='nTx', full_name='pb.BlockHeaderOutput.nTx', index=12,
+      number=13, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='previousblockhash', full_name='pb.BlockHeaderOutput.previousblockhash', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='nextblockhash', full_name='pb.BlockHeaderOutput.nextblockhash', index=14,
+      number=15, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=992,
+  serialized_end=1286,
+)
+
 _OUTPUTS.fields_by_name['txos'].message_type = _OUTPUT
 _OUTPUTS.fields_by_name['extra_txos'].message_type = _OUTPUT
 _OUTPUTS.fields_by_name['blocked'].message_type = _BLOCKED
@@ -432,41 +612,59 @@ DESCRIPTOR.message_types_by_name['Output'] = _OUTPUT
 DESCRIPTOR.message_types_by_name['ClaimMeta'] = _CLAIMMETA
 DESCRIPTOR.message_types_by_name['Error'] = _ERROR
 DESCRIPTOR.message_types_by_name['Blocked'] = _BLOCKED
+DESCRIPTOR.message_types_by_name['BlockOutput'] = _BLOCKOUTPUT
+DESCRIPTOR.message_types_by_name['BlockHeaderOutput'] = _BLOCKHEADEROUTPUT
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Outputs = _reflection.GeneratedProtocolMessageType('Outputs', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUTS,
-  __module__ = 'result_pb2'
+Outputs = _reflection.GeneratedProtocolMessageType('Outputs', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUTS,
+  '__module__' : 'result_pb2'
   # @@protoc_insertion_point(class_scope:pb.Outputs)
-  ))
+  })
 _sym_db.RegisterMessage(Outputs)
 
-Output = _reflection.GeneratedProtocolMessageType('Output', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUT,
-  __module__ = 'result_pb2'
+Output = _reflection.GeneratedProtocolMessageType('Output', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUT,
+  '__module__' : 'result_pb2'
   # @@protoc_insertion_point(class_scope:pb.Output)
-  ))
+  })
 _sym_db.RegisterMessage(Output)
 
-ClaimMeta = _reflection.GeneratedProtocolMessageType('ClaimMeta', (_message.Message,), dict(
-  DESCRIPTOR = _CLAIMMETA,
-  __module__ = 'result_pb2'
+ClaimMeta = _reflection.GeneratedProtocolMessageType('ClaimMeta', (_message.Message,), {
+  'DESCRIPTOR' : _CLAIMMETA,
+  '__module__' : 'result_pb2'
   # @@protoc_insertion_point(class_scope:pb.ClaimMeta)
-  ))
+  })
 _sym_db.RegisterMessage(ClaimMeta)
 
-Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), dict(
-  DESCRIPTOR = _ERROR,
-  __module__ = 'result_pb2'
+Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), {
+  'DESCRIPTOR' : _ERROR,
+  '__module__' : 'result_pb2'
   # @@protoc_insertion_point(class_scope:pb.Error)
-  ))
+  })
 _sym_db.RegisterMessage(Error)
 
-Blocked = _reflection.GeneratedProtocolMessageType('Blocked', (_message.Message,), dict(
-  DESCRIPTOR = _BLOCKED,
-  __module__ = 'result_pb2'
+Blocked = _reflection.GeneratedProtocolMessageType('Blocked', (_message.Message,), {
+  'DESCRIPTOR' : _BLOCKED,
+  '__module__' : 'result_pb2'
   # @@protoc_insertion_point(class_scope:pb.Blocked)
-  ))
+  })
 _sym_db.RegisterMessage(Blocked)
 
+BlockOutput = _reflection.GeneratedProtocolMessageType('BlockOutput', (_message.Message,), {
+  'DESCRIPTOR' : _BLOCKOUTPUT,
+  '__module__' : 'result_pb2'
+  # @@protoc_insertion_point(class_scope:pb.BlockOutput)
+  })
+_sym_db.RegisterMessage(BlockOutput)
 
+BlockHeaderOutput = _reflection.GeneratedProtocolMessageType('BlockHeaderOutput', (_message.Message,), {
+  'DESCRIPTOR' : _BLOCKHEADEROUTPUT,
+  '__module__' : 'result_pb2'
+  # @@protoc_insertion_point(class_scope:pb.BlockHeaderOutput)
+  })
+_sym_db.RegisterMessage(BlockHeaderOutput)
+
+
+DESCRIPTOR._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/lbry/wallet/orchstr8/__init__.py b/lbry/wallet/orchstr8/__init__.py
index 2d047f9a5..a2379007c 100644
--- a/lbry/wallet/orchstr8/__init__.py
+++ b/lbry/wallet/orchstr8/__init__.py
@@ -1,5 +1,5 @@
 __hub_url__ = (
-    "https://github.com/lbryio/hub/releases/download/v0.2021.06.14-beta/hub"
+    "https://github.com/lbryio/hub/releases/download/v0.2021.07.24-beta/hub"
 )
 from .node import Conductor
 from .service import ConductorService