async def revoke(self, schemaId: ID, i) -> (Accumulator, TimestampType):
        accum = await self._wallet.getAccumulator(schemaId)
        tails = await self._wallet.getTails(schemaId)

        accum.V.discard(i)
        accum.acc /= tails.gprime[accum.L + 1 - i]

        ts = currentTimestampMillisec()

        return accum, ts
    async def issueNonRevocationClaim(self, schemaId: ID, Ur, iA, i) -> (
            NonRevocationClaim, Accumulator, TimestampType):
        accum = await self._wallet.getAccumulator(schemaId)
        pkR = await self._wallet.getPublicKeyRevocation(schemaId)
        skR = await self._wallet.getSecretKeyRevocation(schemaId)
        g = await self._wallet.getTails(schemaId)
        skAccum = await self._wallet.getSecretKeyAccumulator(schemaId)
        m2 = await self._wallet.getContextAttr(schemaId)

        if accum.isFull():
            raise ValueError("Accumulator is full. New one must be issued.")

        # TODO: currently all revo creds are issued sequentially
        group = cmod.PairingGroup(
            PAIRING_GROUP)  # super singular curve, 1024 bits

        i = i if i else accum.currentI
        accum.currentI += 1
        vrPrimeprime = group.random(cmod.ZR)
        c = group.random(cmod.ZR)

        m2 = group.init(cmod.ZR, int(m2))
        sigma = (pkR.h0 * (pkR.h1 ** m2) * Ur * g[i] * (
            pkR.h2 ** vrPrimeprime)) ** (1 / (skR.x + c))
        omega = groupIdentityG1()
        for j in accum.V:
            omega *= g[accum.L + 1 - j + i]

        sigmai = pkR.g ** (1 / (skR.sk + (skAccum.gamma ** i)))
        ui = pkR.u ** (skAccum.gamma ** i)

        accum.acc *= g[accum.L + 1 - i]
        accum.V.add(i)

        witness = Witness(sigmai, ui, g[i], omega, accum.V.copy())

        ts = currentTimestampMillisec()
        return (
            NonRevocationClaim(accum.iA, sigma, c, vrPrimeprime, witness, g[i],
                               i,
                               m2), accum, ts)