diff --git a/Proto/Utxorpc/V1alpha/Sync/Sync.hs b/Proto/Utxorpc/V1alpha/Sync/Sync.hs
--- a/Proto/Utxorpc/V1alpha/Sync/Sync.hs
+++ b/Proto/Utxorpc/V1alpha/Sync/Sync.hs
@@ -9,7 +9,8 @@
         DumpHistoryResponse(), FetchBlockRequest(), FetchBlockResponse(),
         FollowTipRequest(), FollowTipResponse(),
         FollowTipResponse'Action(..), _FollowTipResponse'Apply,
-        _FollowTipResponse'Undo, _FollowTipResponse'Reset
+        _FollowTipResponse'Undo, _FollowTipResponse'Reset,
+        ReadTipRequest(), ReadTipResponse()
     ) where
 import qualified Data.ProtoLens.Runtime.Control.DeepSeq as Control.DeepSeq
 import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Prism as Data.ProtoLens.Prism
@@ -1599,20 +1600,207 @@
          -> case p__ of
               (FollowTipResponse'Reset p__val) -> Prelude.Just p__val
               _otherwise -> Prelude.Nothing)
+{- | Fields :
+      -}
+data ReadTipRequest
+  = ReadTipRequest'_constructor {_ReadTipRequest'_unknownFields :: !Data.ProtoLens.FieldSet}
+  deriving stock (Prelude.Eq, Prelude.Ord)
+instance Prelude.Show ReadTipRequest where
+  showsPrec _ __x __s
+    = Prelude.showChar
+        '{'
+        (Prelude.showString
+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))
+instance Data.ProtoLens.Message ReadTipRequest where
+  messageName _
+    = Data.Text.pack "utxorpc.v1alpha.sync.ReadTipRequest"
+  packedMessageDescriptor _
+    = "\n\
+      \\SOReadTipRequest"
+  packedFileDescriptor _ = packedFileDescriptor
+  fieldsByTag = let in Data.Map.fromList []
+  unknownFields
+    = Lens.Family2.Unchecked.lens
+        _ReadTipRequest'_unknownFields
+        (\ x__ y__ -> x__ {_ReadTipRequest'_unknownFields = y__})
+  defMessage
+    = ReadTipRequest'_constructor {_ReadTipRequest'_unknownFields = []}
+  parseMessage
+    = let
+        loop ::
+          ReadTipRequest
+          -> Data.ProtoLens.Encoding.Bytes.Parser ReadTipRequest
+        loop x
+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd
+               if end then
+                   do (let missing = []
+                       in
+                         if Prelude.null missing then
+                             Prelude.return ()
+                         else
+                             Prelude.fail
+                               ((Prelude.++)
+                                  "Missing required fields: "
+                                  (Prelude.show (missing :: [Prelude.String]))))
+                      Prelude.return
+                        (Lens.Family2.over
+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)
+               else
+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt
+                      case tag of
+                        wire
+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire
+                                        wire
+                                loop
+                                  (Lens.Family2.over
+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)
+      in
+        (Data.ProtoLens.Encoding.Bytes.<?>)
+          (do loop Data.ProtoLens.defMessage) "ReadTipRequest"
+  buildMessage
+    = \ _x
+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet
+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)
+instance Control.DeepSeq.NFData ReadTipRequest where
+  rnf
+    = \ x__
+        -> Control.DeepSeq.deepseq (_ReadTipRequest'_unknownFields x__) ()
+{- | Fields :
+     
+         * 'Proto.Utxorpc.V1alpha.Sync.Sync_Fields.tip' @:: Lens' ReadTipResponse BlockRef@
+         * 'Proto.Utxorpc.V1alpha.Sync.Sync_Fields.maybe'tip' @:: Lens' ReadTipResponse (Prelude.Maybe BlockRef)@ -}
+data ReadTipResponse
+  = ReadTipResponse'_constructor {_ReadTipResponse'tip :: !(Prelude.Maybe BlockRef),
+                                  _ReadTipResponse'_unknownFields :: !Data.ProtoLens.FieldSet}
+  deriving stock (Prelude.Eq, Prelude.Ord)
+instance Prelude.Show ReadTipResponse where
+  showsPrec _ __x __s
+    = Prelude.showChar
+        '{'
+        (Prelude.showString
+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))
+instance Data.ProtoLens.Field.HasField ReadTipResponse "tip" BlockRef where
+  fieldOf _
+    = (Prelude..)
+        (Lens.Family2.Unchecked.lens
+           _ReadTipResponse'tip
+           (\ x__ y__ -> x__ {_ReadTipResponse'tip = y__}))
+        (Data.ProtoLens.maybeLens Data.ProtoLens.defMessage)
+instance Data.ProtoLens.Field.HasField ReadTipResponse "maybe'tip" (Prelude.Maybe BlockRef) where
+  fieldOf _
+    = (Prelude..)
+        (Lens.Family2.Unchecked.lens
+           _ReadTipResponse'tip
+           (\ x__ y__ -> x__ {_ReadTipResponse'tip = y__}))
+        Prelude.id
+instance Data.ProtoLens.Message ReadTipResponse where
+  messageName _
+    = Data.Text.pack "utxorpc.v1alpha.sync.ReadTipResponse"
+  packedMessageDescriptor _
+    = "\n\
+      \\SIReadTipResponse\DC20\n\
+      \\ETXtip\CAN\SOH \SOH(\v2\RS.utxorpc.v1alpha.sync.BlockRefR\ETXtip"
+  packedFileDescriptor _ = packedFileDescriptor
+  fieldsByTag
+    = let
+        tip__field_descriptor
+          = Data.ProtoLens.FieldDescriptor
+              "tip"
+              (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::
+                 Data.ProtoLens.FieldTypeDescriptor BlockRef)
+              (Data.ProtoLens.OptionalField
+                 (Data.ProtoLens.Field.field @"maybe'tip")) ::
+              Data.ProtoLens.FieldDescriptor ReadTipResponse
+      in
+        Data.Map.fromList [(Data.ProtoLens.Tag 1, tip__field_descriptor)]
+  unknownFields
+    = Lens.Family2.Unchecked.lens
+        _ReadTipResponse'_unknownFields
+        (\ x__ y__ -> x__ {_ReadTipResponse'_unknownFields = y__})
+  defMessage
+    = ReadTipResponse'_constructor
+        {_ReadTipResponse'tip = Prelude.Nothing,
+         _ReadTipResponse'_unknownFields = []}
+  parseMessage
+    = let
+        loop ::
+          ReadTipResponse
+          -> Data.ProtoLens.Encoding.Bytes.Parser ReadTipResponse
+        loop x
+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd
+               if end then
+                   do (let missing = []
+                       in
+                         if Prelude.null missing then
+                             Prelude.return ()
+                         else
+                             Prelude.fail
+                               ((Prelude.++)
+                                  "Missing required fields: "
+                                  (Prelude.show (missing :: [Prelude.String]))))
+                      Prelude.return
+                        (Lens.Family2.over
+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)
+               else
+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt
+                      case tag of
+                        10
+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)
+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt
+                                           Data.ProtoLens.Encoding.Bytes.isolate
+                                             (Prelude.fromIntegral len) Data.ProtoLens.parseMessage)
+                                       "tip"
+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"tip") y x)
+                        wire
+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire
+                                        wire
+                                loop
+                                  (Lens.Family2.over
+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)
+      in
+        (Data.ProtoLens.Encoding.Bytes.<?>)
+          (do loop Data.ProtoLens.defMessage) "ReadTipResponse"
+  buildMessage
+    = \ _x
+        -> (Data.Monoid.<>)
+             (case
+                  Lens.Family2.view (Data.ProtoLens.Field.field @"maybe'tip") _x
+              of
+                Prelude.Nothing -> Data.Monoid.mempty
+                (Prelude.Just _v)
+                  -> (Data.Monoid.<>)
+                       (Data.ProtoLens.Encoding.Bytes.putVarInt 10)
+                       ((Prelude..)
+                          (\ bs
+                             -> (Data.Monoid.<>)
+                                  (Data.ProtoLens.Encoding.Bytes.putVarInt
+                                     (Prelude.fromIntegral (Data.ByteString.length bs)))
+                                  (Data.ProtoLens.Encoding.Bytes.putBytes bs))
+                          Data.ProtoLens.encodeMessage _v))
+             (Data.ProtoLens.Encoding.Wire.buildFieldSet
+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))
+instance Control.DeepSeq.NFData ReadTipResponse where
+  rnf
+    = \ x__
+        -> Control.DeepSeq.deepseq
+             (_ReadTipResponse'_unknownFields x__)
+             (Control.DeepSeq.deepseq (_ReadTipResponse'tip x__) ())
 data SyncService = SyncService {}
 instance Data.ProtoLens.Service.Types.Service SyncService where
   type ServiceName SyncService = "SyncService"
   type ServicePackage SyncService = "utxorpc.v1alpha.sync"
   type ServiceMethods SyncService = '["dumpHistory",
                                       "fetchBlock",
-                                      "followTip"]
+                                      "followTip",
+                                      "readTip"]
   packedServiceDescriptor _
     = "\n\
       \\vSyncService\DC2_\n\
       \\n\
       \FetchBlock\DC2'.utxorpc.v1alpha.sync.FetchBlockRequest\SUB(.utxorpc.v1alpha.sync.FetchBlockResponse\DC2b\n\
       \\vDumpHistory\DC2(.utxorpc.v1alpha.sync.DumpHistoryRequest\SUB).utxorpc.v1alpha.sync.DumpHistoryResponse\DC2^\n\
-      \\tFollowTip\DC2&.utxorpc.v1alpha.sync.FollowTipRequest\SUB'.utxorpc.v1alpha.sync.FollowTipResponse0\SOH"
+      \\tFollowTip\DC2&.utxorpc.v1alpha.sync.FollowTipRequest\SUB'.utxorpc.v1alpha.sync.FollowTipResponse0\SOH\DC2V\n\
+      \\aReadTip\DC2$.utxorpc.v1alpha.sync.ReadTipRequest\SUB%.utxorpc.v1alpha.sync.ReadTipResponse"
 instance Data.ProtoLens.Service.Types.HasMethodImpl SyncService "fetchBlock" where
   type MethodName SyncService "fetchBlock" = "FetchBlock"
   type MethodInput SyncService "fetchBlock" = FetchBlockRequest
@@ -1628,6 +1816,11 @@
   type MethodInput SyncService "followTip" = FollowTipRequest
   type MethodOutput SyncService "followTip" = FollowTipResponse
   type MethodStreamingType SyncService "followTip" = 'Data.ProtoLens.Service.Types.ServerStreaming
+instance Data.ProtoLens.Service.Types.HasMethodImpl SyncService "readTip" where
+  type MethodName SyncService "readTip" = "ReadTip"
+  type MethodInput SyncService "readTip" = ReadTipRequest
+  type MethodOutput SyncService "readTip" = ReadTipResponse
+  type MethodStreamingType SyncService "readTip" = 'Data.ProtoLens.Service.Types.NonStreaming
 packedFileDescriptor :: Data.ByteString.ByteString
 packedFileDescriptor
   = "\n\
@@ -1663,14 +1856,18 @@
     \\ENQapply\CAN\SOH \SOH(\v2#.utxorpc.v1alpha.sync.AnyChainBlockH\NULR\ENQapply\DC29\n\
     \\EOTundo\CAN\STX \SOH(\v2#.utxorpc.v1alpha.sync.AnyChainBlockH\NULR\EOTundo\DC26\n\
     \\ENQreset\CAN\ETX \SOH(\v2\RS.utxorpc.v1alpha.sync.BlockRefH\NULR\ENQresetB\b\n\
-    \\ACKaction2\178\STX\n\
+    \\ACKaction\"\DLE\n\
+    \\SOReadTipRequest\"C\n\
+    \\SIReadTipResponse\DC20\n\
+    \\ETXtip\CAN\SOH \SOH(\v2\RS.utxorpc.v1alpha.sync.BlockRefR\ETXtip2\138\ETX\n\
     \\vSyncService\DC2_\n\
     \\n\
     \FetchBlock\DC2'.utxorpc.v1alpha.sync.FetchBlockRequest\SUB(.utxorpc.v1alpha.sync.FetchBlockResponse\DC2b\n\
     \\vDumpHistory\DC2(.utxorpc.v1alpha.sync.DumpHistoryRequest\SUB).utxorpc.v1alpha.sync.DumpHistoryResponse\DC2^\n\
-    \\tFollowTip\DC2&.utxorpc.v1alpha.sync.FollowTipRequest\SUB'.utxorpc.v1alpha.sync.FollowTipResponse0\SOHB\203\SOH\n\
-    \\CANcom.utxorpc.v1alpha.syncB\tSyncProtoP\SOHZ2github.com/utxorpc/go-codegen/utxorpc/v1alpha/sync\162\STX\ETXUVS\170\STX\DC4Utxorpc.V1alpha.Sync\202\STX\DC4Utxorpc\\V1alpha\\Sync\226\STX Utxorpc\\V1alpha\\Sync\\GPBMetadata\234\STX\SYNUtxorpc::V1alpha::SyncJ\170\DC4\n\
-    \\ACK\DC2\EOT\NUL\NUL@\SOH\n\
+    \\tFollowTip\DC2&.utxorpc.v1alpha.sync.FollowTipRequest\SUB'.utxorpc.v1alpha.sync.FollowTipResponse0\SOH\DC2V\n\
+    \\aReadTip\DC2$.utxorpc.v1alpha.sync.ReadTipRequest\SUB%.utxorpc.v1alpha.sync.ReadTipResponseB\203\SOH\n\
+    \\CANcom.utxorpc.v1alpha.syncB\tSyncProtoP\SOHZ2github.com/utxorpc/go-codegen/utxorpc/v1alpha/sync\162\STX\ETXUVS\170\STX\DC4Utxorpc.V1alpha.Sync\202\STX\DC4Utxorpc\\V1alpha\\Sync\226\STX Utxorpc\\V1alpha\\Sync\\GPBMetadata\234\STX\SYNUtxorpc::V1alpha::SyncJ\136\ETB\n\
+    \\ACK\DC2\EOT\NUL\NULI\SOH\n\
     \\b\n\
     \\SOH\f\DC2\ETX\NUL\NUL\DC2\n\
     \\b\n\
@@ -1906,38 +2103,69 @@
     \\ENQ\EOT\a\STX\STX\SOH\DC2\ETX7\r\DC2\n\
     \\f\n\
     \\ENQ\EOT\a\STX\STX\ETX\DC2\ETX7\NAK\SYN\n\
+    \?\n\
+    \\STX\EOT\b\DC2\ETX<\NUL\EM\SUB4 Request to read the current tip of the blockchain.\n\
+    \\n\
+    \\n\
+    \\n\
+    \\ETX\EOT\b\SOH\DC2\ETX<\b\SYN\n\
+    \D\n\
+    \\STX\EOT\t\DC2\EOT?\NULA\SOH\SUB8 Response containing the current tip of the blockchain.\n\
+    \\n\
+    \\n\
+    \\n\
+    \\ETX\EOT\t\SOH\DC2\ETX?\b\ETB\n\
+    \1\n\
+    \\EOT\EOT\t\STX\NUL\DC2\ETX@\STX\DC3\"$ The current tip of the blockchain.\n\
+    \\n\
+    \\f\n\
+    \\ENQ\EOT\t\STX\NUL\ACK\DC2\ETX@\STX\n\
+    \\n\
+    \\f\n\
+    \\ENQ\EOT\t\STX\NUL\SOH\DC2\ETX@\v\SO\n\
+    \\f\n\
+    \\ENQ\EOT\t\STX\NUL\ETX\DC2\ETX@\DC1\DC2\n\
     \8\n\
-    \\STX\ACK\NUL\DC2\EOT<\NUL@\SOH\SUB, Service definition for syncing chain data.\n\
+    \\STX\ACK\NUL\DC2\EOTD\NULI\SOH\SUB, Service definition for syncing chain data.\n\
     \\n\
     \\n\
     \\n\
-    \\ETX\ACK\NUL\SOH\DC2\ETX<\b\DC3\n\
+    \\ETX\ACK\NUL\SOH\DC2\ETXD\b\DC3\n\
     \.\n\
-    \\EOT\ACK\NUL\STX\NUL\DC2\ETX=\STXA\"! Fetch a block by its reference.\n\
+    \\EOT\ACK\NUL\STX\NUL\DC2\ETXE\STXA\"! Fetch a block by its reference.\n\
     \\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\NUL\SOH\DC2\ETX=\ACK\DLE\n\
+    \\ENQ\ACK\NUL\STX\NUL\SOH\DC2\ETXE\ACK\DLE\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\NUL\STX\DC2\ETX=\DC1\"\n\
+    \\ENQ\ACK\NUL\STX\NUL\STX\DC2\ETXE\DC1\"\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\NUL\ETX\DC2\ETX=-?\n\
+    \\ENQ\ACK\NUL\STX\NUL\ETX\DC2\ETXE-?\n\
     \&\n\
-    \\EOT\ACK\NUL\STX\SOH\DC2\ETX>\STXD\"\EM Dump the block history.\n\
+    \\EOT\ACK\NUL\STX\SOH\DC2\ETXF\STXD\"\EM Dump the block history.\n\
     \\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\SOH\SOH\DC2\ETX>\ACK\DC1\n\
+    \\ENQ\ACK\NUL\STX\SOH\SOH\DC2\ETXF\ACK\DC1\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\SOH\STX\DC2\ETX>\DC2$\n\
+    \\ENQ\ACK\NUL\STX\SOH\STX\DC2\ETXF\DC2$\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\SOH\ETX\DC2\ETX>/B\n\
+    \\ENQ\ACK\NUL\STX\SOH\ETX\DC2\ETXF/B\n\
     \0\n\
-    \\EOT\ACK\NUL\STX\STX\DC2\ETX?\STXE\"# Follow the tip of the blockchain.\n\
+    \\EOT\ACK\NUL\STX\STX\DC2\ETXG\STXE\"# Follow the tip of the blockchain.\n\
     \\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\STX\SOH\DC2\ETX?\ACK\SI\n\
+    \\ENQ\ACK\NUL\STX\STX\SOH\DC2\ETXG\ACK\SI\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\STX\STX\DC2\ETX?\DLE \n\
+    \\ENQ\ACK\NUL\STX\STX\STX\DC2\ETXG\DLE \n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\STX\ACK\DC2\ETX?+1\n\
+    \\ENQ\ACK\NUL\STX\STX\ACK\DC2\ETXG+1\n\
     \\f\n\
-    \\ENQ\ACK\NUL\STX\STX\ETX\DC2\ETX?2Cb\ACKproto3"
+    \\ENQ\ACK\NUL\STX\STX\ETX\DC2\ETXG2C\n\
+    \6\n\
+    \\EOT\ACK\NUL\STX\ETX\DC2\ETXH\STX8\") Read the current tip of the blockchain.\n\
+    \\n\
+    \\f\n\
+    \\ENQ\ACK\NUL\STX\ETX\SOH\DC2\ETXH\ACK\r\n\
+    \\f\n\
+    \\ENQ\ACK\NUL\STX\ETX\STX\DC2\ETXH\SO\FS\n\
+    \\f\n\
+    \\ENQ\ACK\NUL\STX\ETX\ETX\DC2\ETXH'6b\ACKproto3"
diff --git a/Proto/Utxorpc/V1alpha/Sync/Sync_Fields.hs b/Proto/Utxorpc/V1alpha/Sync/Sync_Fields.hs
--- a/Proto/Utxorpc/V1alpha/Sync/Sync_Fields.hs
+++ b/Proto/Utxorpc/V1alpha/Sync/Sync_Fields.hs
@@ -120,6 +120,12 @@
    Data.ProtoLens.Field.HasField s "maybe'startToken" a) =>
   Lens.Family2.LensLike' f s a
 maybe'startToken = Data.ProtoLens.Field.field @"maybe'startToken"
+maybe'tip ::
+  forall f s a.
+  (Prelude.Functor f,
+   Data.ProtoLens.Field.HasField s "maybe'tip" a) =>
+  Lens.Family2.LensLike' f s a
+maybe'tip = Data.ProtoLens.Field.field @"maybe'tip"
 maybe'undo ::
   forall f s a.
   (Prelude.Functor f,
@@ -154,6 +160,11 @@
    Data.ProtoLens.Field.HasField s "startToken" a) =>
   Lens.Family2.LensLike' f s a
 startToken = Data.ProtoLens.Field.field @"startToken"
+tip ::
+  forall f s a.
+  (Prelude.Functor f, Data.ProtoLens.Field.HasField s "tip" a) =>
+  Lens.Family2.LensLike' f s a
+tip = Data.ProtoLens.Field.field @"tip"
 undo ::
   forall f s a.
   (Prelude.Functor f, Data.ProtoLens.Field.HasField s "undo" a) =>
diff --git a/utxorpc.cabal b/utxorpc.cabal
--- a/utxorpc.cabal
+++ b/utxorpc.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 
 name:           utxorpc
-version:        0.0.11.0
+version:        0.0.12.0
 synopsis:       Generated code for a gRPC interface for UTxO Blockchains
 description:    [UTxO RPC](https://utxorpc.org/) (u5c for short) is an interface tailored for interactions with UTxO-based blockchains, prioritizing performance and developer experience. By providing a common contract, a range of SDKs, and thorough documentation, UTxO RPC aims to facilitate:
 
