code: async def get_state_json(
              self,
              rr_state_builder: Callable[['Verifier', str, int], Awaitable[Tuple[str, int]]],
              fro: int,
              to: int) -> (str, int):
          
  
          LOGGER.debug(
              'RevoCacheEntry.get_state_json >>> rr_state_builder: %s, fro: %s, to: %s',
              rr_state_builder.__name__,
              fro,
              to)
  
          rv = await self._get_update(rr_state_builder, fro, to, False)
          LOGGER.debug('RevoCacheEntry.get_state_json <<< %s', rv)
          return rv
docs: Get rev reg state json, and its timestamp on the distributed ledger,
          from cached rev reg state frames list or distributed ledger,
          updating cache as necessary.
  
          Raise BadRevStateTime if caller asks for a state in the future.
  
          On return of any previously existing rev reg state frame, always update its query time beforehand.
  
          :param rr_state_builder: callback to build rev reg state if need be (specify anchor instance's
              _build_rr_state())
          :param fro: least time (epoch seconds) of interest; lower-bounds 'to' on frame housing return data
          :param to: greatest time (epoch seconds) of interest; upper-bounds returned revocation state timestamp
          :return: rev reg state json and ledger timestamp (epoch seconds)