<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def issueClaim(self, schemaId: ID, claimRequest: ClaimRequest, iA=None, i=None) -> (Claims, Dict[str, ClaimAttributeValues]):
 """ Issue a claim for the given user and schema. :param schemaId: The schema ID (reference to claim definition schema) :param claimRequest: A claim request containing prover ID and prover-generated values :param iA: accumulator ID :param i: claim's sequence number within accumulator :return: The claim (both primary and non-revocation) """


        schemaKey = (await self.wallet.getSchema(schemaId)).getKey()
        attributes = self._attrRepo.getAttributes(schemaKey,
                                                  claimRequest.userId)

        # TODO re-enable when revocation registry is implemented
        # iA = iA if iA else (await self.wallet.getAccumulator(schemaId)).iA

        # TODO this has un-obvious side-effects
        await self._genContxt(schemaId, iA, claimRequest.userId)

        (c1, claim) = await self._issuePrimaryClaim(schemaId, attributes,
                                                    claimRequest.U)
        # TODO re-enable when revocation registry is fully implemented
        c2 = await self._issueNonRevocationClaim(schemaId, claimRequest.Ur,
                                                 iA,
                                                 i) if claimRequest.Ur else None

        signature = Claims(primaryClaim=c1, nonRevocClaim=c2)

        return (signature, claim)