async def create_proof(self, proof_req: dict, creds: dict, requested_creds: dict) -> str:
LOGGER.debug(<EOL>'<STR_LIT>',<EOL>proof_req,<EOL>creds,<EOL>requested_creds)<EOL>self._assert_link_secret('<STR_LIT>')<EOL>x_uuids = [attr_uuid for attr_uuid in creds['<STR_LIT>'] if len(creds['<STR_LIT>'][attr_uuid]) != <NUM_LIT:1>]<EOL>if x_uuids:<EOL><INDENT>LOGGER.debug('<STR_LIT>')<EOL>raise CredentialFocus('<STR_LIT>'.format(x_uuids))<EOL><DEDENT>s_id2schema = {}  <EOL>cd_id2cred_def = {}  <EOL>rr_id2timestamp = {}  <EOL>rr_id2cr_id = {}  <EOL>for referents in {**creds['<STR_LIT>'], **creds['<STR_LIT>']}.values():<EOL><INDENT>interval = referents[<NUM_LIT:0>].get('<STR_LIT>', None)<EOL>cred_info = referents[<NUM_LIT:0>]['<STR_LIT>']<EOL>s_id = cred_info['<STR_LIT>']<EOL>if s_id not in s_id2schema:<EOL><INDENT>schema = json.loads(await self.get_schema(s_id))  <EOL>if not schema:<EOL><INDENT>LOGGER.debug(<EOL>'<STR_LIT>',<EOL>s_id)<EOL>raise AbsentSchema(<EOL>'<STR_LIT>'.format(s_id))<EOL><DEDENT>s_id2schema[s_id] = schema<EOL><DEDENT>cd_id = cred_info['<STR_LIT>']<EOL>if cd_id not in cd_id2cred_def:<EOL><INDENT>cred_def = json.loads(await self.get_cred_def(cd_id))  <EOL>cd_id2cred_def[cd_id] = cred_def<EOL><DEDENT>rr_id = cred_info['<STR_LIT>']<EOL>if rr_id:<EOL><INDENT>await self._sync_revoc(rr_id)  <EOL>if interval:<EOL><INDENT>if rr_id not in rr_id2timestamp:<EOL><INDENT>if interval['<STR_LIT:to>'] > int(time()):<EOL><INDENT>LOGGER.debug(<EOL>'<STR_LIT>',<EOL>interval['<STR_LIT:to>'],<EOL>rr_id)<EOL>raise BadRevStateTime('<STR_LIT>'.format(<EOL>rr_id,<EOL>interval['<STR_LIT:to>']))<EOL><DEDENT>rr_id2timestamp[rr_id] = interval['<STR_LIT:to>']<EOL><DEDENT><DEDENT>elif '<STR_LIT>' in cd_id2cred_def[cd_id]['<STR_LIT:value>']:<EOL><INDENT>LOGGER.debug(<EOL>'<STR_LIT>',<EOL>cd_id)<EOL>raise AbsentInterval('<STR_LIT>'.format(cd_id))<EOL><DEDENT>if rr_id in rr_id2cr_id:<EOL><INDENT>continue<EOL><DEDENT>rr_id2cr_id[rr_id] = cred_info['<STR_LIT>']<EOL><DEDENT><DEDENT>rr_id2rev_state = {}  <EOL>with REVO_CACHE.lock:<EOL><INDENT>for rr_id in rr_id2timestamp:<EOL><INDENT>revo_cache_entry = REVO_CACHE.get(rr_id, None)<EOL>tails = revo_cache_entry.tails if revo_cache_entry else None<EOL>if tails is None:  <EOL><INDENT>LOGGER.debug('<STR_LIT>', rr_id)<EOL>raise AbsentTails('<STR_LIT>'.format(rr_id))<EOL><DEDENT>rr_def_json = await self._get_rev_reg_def(rr_id)<EOL>(rr_delta_json, ledger_timestamp) = await revo_cache_entry.get_delta_json(<EOL>self._build_rr_delta_json,<EOL>rr_id2timestamp[rr_id],<EOL>rr_id2timestamp[rr_id])<EOL>rr_state_json = await anoncreds.create_revocation_state(<EOL>tails.reader_handle,<EOL>rr_def_json,<EOL>rr_delta_json,<EOL>ledger_timestamp,<EOL>rr_id2cr_id[rr_id])<EOL>rr_id2rev_state[rr_id] = {<EOL>rr_id2timestamp[rr_id]: json.loads(rr_state_json)<EOL>}<EOL><DEDENT><DEDENT>rv = await anoncreds.prover_create_proof(<EOL>self.wallet.handle,<EOL>json.dumps(proof_req),<EOL>json.dumps(requested_creds),<EOL>self._link_secret,<EOL>json.dumps(s_id2schema),<EOL>json.dumps(cd_id2cred_def),<EOL>json.dumps(rr_id2rev_state))<EOL>LOGGER.debug('<STR_LIT>', rv)<EOL>return rv<EOL>
Create proof as HolderProver.

Raise:
    * AbsentLinkSecret if link secret not set
    * CredentialFocus on attempt to create proof on no creds or multiple creds for a credential definition
    * AbsentTails if missing required tails file
    * BadRevStateTime if a timestamp for a revocation registry state in the proof request
      occurs before revocation registry creation
    * IndyError for any other indy-sdk error.
    * AbsentInterval if creds missing non-revocation interval, but cred def supports revocation

:param proof_req: proof request as per get_creds() above
:param creds: credentials to prove
:param requested_creds: data structure with self-attested attribute info, requested attribute info
    and requested predicate info, assembled from get_creds() and filtered for content of interest. I.e.,

::

    {
        'self_attested_attributes': {},
        'requested_attributes': {
            'attr0_uuid': {
                'cred_id': string,
                'timestamp': integer,  # for revocation state
                'revealed': bool
            },
            ...
        },
        'requested_predicates': {
            'predicate0_uuid': {
                'cred_id': string,
                'timestamp': integer  # for revocation state
            }
        }
    }

:return: proof json