async def get_box_ids_json(self) -> str:
LOGGER.debug('<STR_LIT>')<EOL>cd_ids = [d for d in listdir(self._dir_tails)<EOL>if isdir(join(self._dir_tails, d)) and d.startswith('<STR_LIT>'.format(self.did))]<EOL>s_ids = []<EOL>for cd_id in cd_ids:<EOL><INDENT>try:<EOL><INDENT>s_ids.append(json.loads(await self.get_schema(cred_def_id2seq_no(cd_id)))['<STR_LIT:id>'])<EOL><DEDENT>except AbsentSchema:<EOL><INDENT>LOGGER.error(<EOL>'<STR_LIT>',<EOL>self.wallet.name,<EOL>cd_id)<EOL><DEDENT><DEDENT>rr_ids = [basename(link) for link in Tails.links(self._dir_tails, self.did)]<EOL>rv = json.dumps({<EOL>'<STR_LIT>': s_ids,<EOL>'<STR_LIT>': cd_ids,<EOL>'<STR_LIT>': rr_ids<EOL>})<EOL>LOGGER.debug('<STR_LIT>', rv)<EOL>return rv<EOL>
Return json object on lists of all unique box identifiers (schema identifiers,
credential definition identifiers, and revocation registry identifiers) for
all credential definitions and credentials issued; e.g.,

::

{
    "schema_id": [
        "R17v42T4pk...:2:tombstone:1.2",
        ...
    ],
    "cred_def_id": [
        "R17v42T4pk...:3:CL:19:0",
        ...
    ]
    "rev_reg_id": [
        "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:0:CL_ACCUM:0",
        "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:0:CL_ACCUM:1",
        ...
    ]
}

An issuer must issue a credential definition to include its schema identifier
in the returned values; the schema identifier in isolation belongs properly
to an Origin, not necessarily to an Issuer.

The operation may be useful for a Verifier agent going off-line to seed its
cache before doing so.

:return: tuple of sets for schema ids, cred def ids, rev reg ids