docs: async def get_box_ids_held(self) -> str:
          """
          Return json object on lists of all unique box identifiers for credentials in wallet, as
          evidenced by tails directory content:
  
          * schema identifiers
          * credential definition identifiers
          * revocation registry identifiers.
  
          E.g.,
  
          ::
  
              {
                  "schema_id": [
                      "R17v42T4pk...:2:tombstone:1.2",
                      "9cHbp54C8n...:2:business:2.0",
                      ...
                  ],
                  "cred_def_id": [
                      "R17v42T4pk...:3:CL:19:tag",
                      "9cHbp54C8n...:3:CL:37:tag",
                      ...
                  ]
                  "rev_reg_id": [
                      "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:tag:CL_ACCUM:0",
                      "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:tag:CL_ACCUM:1",
                      "9cHbp54C8n...:4:9cHbp54C8n...:3:CL:37:tag:CL_ACCUM:0",
                      "9cHbp54C8n...:4:9cHbp54C8n...:3:CL:37:tag:CL_ACCUM:1",
                      "9cHbp54C8n...:4:9cHbp54C8n...:3:CL:37:tag:CL_ACCUM:2",
                      ...
                  ]
              }
  
          Raise WalletState if wallet is closed.
  
          :return: tuple of sets for schema ids, cred def ids, rev reg ids
          """
  
          LOGGER.debug('HolderProver.get_box_ids_held >>>')
  
          if not self.wallet.handle:
              LOGGER.debug('HolderProver.get_box_ids_held <!< Wallet %s is closed', self.name)
              raise WalletState('Wallet {} is closed'.format(self.name))
  
          rr_ids = {basename(link) for link in Tails.links(self._dir_tails)}
  
          un_rr_ids = set()
          for rr_id in rr_ids:
              if not json.loads(await self.get_cred_infos_by_q(json.dumps({'rev_reg_id': rr_id}), 1)):
                  un_rr_ids.add(rr_id)
          rr_ids -= un_rr_ids
  
          cd_ids = {cd_id for cd_id in listdir(self._dir_tails)
              if isdir(join(self._dir_tails, cd_id)) and ok_cred_def_id(cd_id)}
          s_ids = set()
          for cd_id in cd_ids:
              s_ids.add(json.loads(await self.get_schema(cred_def_id2seq_no(cd_id)))['id'])
  
          un_cd_ids = set()
          for cd_id in cd_ids:
              if not json.loads(await self.get_cred_infos_by_q(json.dumps({'cred_def_id': cd_id}), 1)):
                  un_cd_ids.add(cd_id)
          cd_ids -= un_cd_ids
  
          un_s_ids = set()
          for s_id in s_ids:
              if not json.loads(await self.get_cred_infos_by_q(json.dumps({'schema_id': s_id}), 1)):
                  un_s_ids.add(s_id)
          s_ids -= un_s_ids
  
          rv = json.dumps({
              'schema_id': list(s_ids),
              'cred_def_id': list(cd_ids),
              'rev_reg_id': list(rr_ids)
          })
          LOGGER.debug('HolderProver.get_box_ids_held <<< %s', rv)
          return rv