docs: def processLedger(self) -> None:
          """
          Checks ledger for planned but not yet performed upgrades
          and schedules upgrade for the most recent one
  
          Assumption: Only version is enough to identify a release, no hash
          checking is done
          :return:
          """
          logger.debug(
              '{} processing config ledger for any upgrades'.format(self))
          last_pool_upgrade_txn_start = self.get_upgrade_txn(
              lambda txn: get_type(txn) == POOL_UPGRADE and get_payload_data(txn)[ACTION] == START, reverse=True)
          if last_pool_upgrade_txn_start:
              logger.info('{} found upgrade START txn {}'.format(
                  self, last_pool_upgrade_txn_start))
              last_pool_upgrade_txn_seq_no = get_seq_no(last_pool_upgrade_txn_start)
  
              # searching for CANCEL for this upgrade submitted after START txn
              last_pool_upgrade_txn_cancel = self.get_upgrade_txn(
                  lambda txn:
                  get_type(txn) == POOL_UPGRADE and get_payload_data(txn)[ACTION] == CANCEL and
                  get_payload_data(txn)[VERSION] == get_payload_data(last_pool_upgrade_txn_start)[VERSION],
                  start_no=last_pool_upgrade_txn_seq_no + 1)
              if last_pool_upgrade_txn_cancel:
                  logger.info('{} found upgrade CANCEL txn {}'.format(
                      self, last_pool_upgrade_txn_cancel))
                  return
  
              self.handleUpgradeTxn(last_pool_upgrade_txn_start)