async def revoke_cred(self, rr_id: str, cr_id) -> int:
LOGGER.debug('<STR_LIT>', rr_id, cr_id)<EOL>tails_reader_handle = (await Tails(<EOL>self._dir_tails,<EOL>*rev_reg_id2cred_def_id__tag(rr_id)).open()).reader_handle<EOL>try:<EOL><INDENT>rrd_json = await anoncreds.issuer_revoke_credential(<EOL>self.wallet.handle,<EOL>tails_reader_handle,<EOL>rr_id,<EOL>cr_id)<EOL><DEDENT>except IndyError as x_indy:<EOL><INDENT>LOGGER.debug(<EOL>'<STR_LIT>',<EOL>rr_id,<EOL>cr_id,<EOL>x_indy.error_code)<EOL>raise BadRevocation(<EOL>'<STR_LIT>'.format(<EOL>rr_id,<EOL>cr_id,<EOL>x_indy.error_code))<EOL><DEDENT>rre_req_json = await ledger.build_revoc_reg_entry_request(self.did, rr_id, '<STR_LIT>', rrd_json)<EOL>resp_json = await self._sign_submit(rre_req_json)<EOL>resp = json.loads(resp_json)<EOL>rv = resp['<STR_LIT:result>']['<STR_LIT>']['<STR_LIT>']<EOL>LOGGER.debug('<STR_LIT>', rv)<EOL>return rv<EOL>
Revoke credential that input revocation registry identifier and
credential revocation identifier specify.

Return (epoch seconds) time of revocation.

Raise AbsentTails if no tails file is available for input
revocation registry identifier. Raise BadRevocation if issuer cannot
revoke specified credential for any other reason (e.g., did not issue it,
already revoked it).

:param rr_id: revocation registry identifier
:param cr_id: credential revocation identifier
:return: time of revocation, in epoch seconds