code: def is_catchup_needed_during_view_change(self) -> bool:
          
          if self.caught_up_for_current_view():
              logger.info('{} is caught up for the current view {}'.format(self, self.viewNo))
              return False
          logger.info('{} is not caught up for the current view {}'.format(self, self.viewNo))
  
          if self.num_txns_caught_up_in_last_catchup() == 0:
              if self.has_ordered_till_last_prepared_certificate():
                  logger.info('{} ordered till last prepared certificate'.format(self))
                  return False
  
          if self.is_catch_up_limit(self.config.MIN_TIMEOUT_CATCHUPS_DONE_DURING_VIEW_CHANGE):
              # No more 3PC messages will be processed since maximum catchup
              # rounds have been done
              self.master_replica.last_prepared_before_view_change = None
              return False
  
          return True
docs: Check if received a quorum of view change done messages and if yes
          check if caught up till the
          Check if all requests ordered till last prepared certificate
          Check if last catchup resulted in no txns