Skip to content

Commit

Permalink
feat(claims): enable on chain enrolment without previous request
Browse files Browse the repository at this point in the history
there is on chain an off chain erolment possibility with off chain as default one.
  • Loading branch information
Passerino committed Jan 19, 2022
1 parent fd6f140 commit b80446d
Show file tree
Hide file tree
Showing 6 changed files with 285 additions and 67 deletions.
42 changes: 32 additions & 10 deletions docs/api/classes/ClaimsService.md
Expand Up @@ -27,6 +27,7 @@
- [publishPublicClaim](ClaimsService.md#publishpublicclaim)
- [registerOnchain](ClaimsService.md#registeronchain)
- [rejectClaimRequest](ClaimsService.md#rejectclaimrequest)
- [validatePublishPublicClaimRequest](ClaimsService.md#validatepublishpublicclaimrequest)
- [create](ClaimsService.md#create)

## Constructors
Expand Down Expand Up @@ -112,11 +113,9 @@ ___

### createSelfSignedClaim

**createSelfSignedClaim**(`__namedParameters`): `Promise`<`string`\>
**createSelfSignedClaim**(`__namedParameters`): `Promise`<`undefined` \| `string`\>

createSelfSignedClaim

**`description`** creates self signed claim and upload the data to ipfs
**`description`** Creates claim with `data` and adds it to `subject` document. Signer must own or control subject

#### Parameters

Expand All @@ -128,7 +127,9 @@ createSelfSignedClaim

#### Returns

`Promise`<`string`\>
`Promise`<`undefined` \| `string`\>

claim url

___

Expand Down Expand Up @@ -318,7 +319,7 @@ ___

### issueClaim

**issueClaim**(`__namedParameters`): `Promise`<`string`\>
**issueClaim**(`__namedParameters`): `Promise`<`undefined` \| `string`\>

#### Parameters

Expand All @@ -329,11 +330,12 @@ ___
| `__namedParameters.claim.claimType` | `string` |
| `__namedParameters.claim.claimTypeVersion` | `number` |
| `__namedParameters.claim.issuerFields` | { `key`: `string` ; `value`: `string` \| `number` }[] |
| `__namedParameters.registrationTypes` | [`RegistrationTypes`](../enums/RegistrationTypes.md)[] |
| `__namedParameters.subject` | `string` |

#### Returns

`Promise`<`string`\>
`Promise`<`undefined` \| `string`\>

___

Expand Down Expand Up @@ -365,7 +367,7 @@ ___

### publishPublicClaim

**publishPublicClaim**(`__namedParameters`): `Promise`<`string`\>
**publishPublicClaim**(`__namedParameters`): `Promise`<`undefined` \| `string`\>

publishPublicClaim

Expand All @@ -376,11 +378,13 @@ publishPublicClaim
| Name | Type |
| :------ | :------ |
| `__namedParameters` | `Object` |
| `__namedParameters.token` | `string` |
| `__namedParameters.claimType?` | `string` |
| `__namedParameters.registrationTypes?` | [`RegistrationTypes`](../enums/RegistrationTypes.md)[] |
| `__namedParameters.token?` | `string` |

#### Returns

`Promise`<`string`\>
`Promise`<`undefined` \| `string`\>

ulr to ipfs

Expand Down Expand Up @@ -423,6 +427,24 @@ ___

___

### validatePublishPublicClaimRequest

**validatePublishPublicClaimRequest**(`registrationTypes`, `token?`, `claimType?`): `void`

#### Parameters

| Name | Type |
| :------ | :------ |
| `registrationTypes` | [`RegistrationTypes`](../enums/RegistrationTypes.md)[] |
| `token?` | `string` |
| `claimType?` | `string` |

#### Returns

`void`

___

### create

`Static` **create**(`signerService`, `domainsService`, `cacheClient`, `didRegistry`): `Promise`<[`ClaimsService`](ClaimsService.md)\>
Expand Down
14 changes: 14 additions & 0 deletions docs/api/interfaces/IClaimIssuance.md
Expand Up @@ -12,6 +12,8 @@

- [acceptedBy](IClaimIssuance.md#acceptedby)
- [claimIssuer](IClaimIssuance.md#claimissuer)
- [claimType](IClaimIssuance.md#claimtype)
- [claimTypeVersion](IClaimIssuance.md#claimtypeversion)
- [id](IClaimIssuance.md#id)
- [issuedToken](IClaimIssuance.md#issuedtoken)
- [onChainProof](IClaimIssuance.md#onchainproof)
Expand All @@ -35,6 +37,18 @@ ___

___

### claimType

`Optional` **claimType**: `string`

___

### claimTypeVersion

`Optional` **claimTypeVersion**: `string`

___

### id

**id**: `string`
Expand Down
4 changes: 2 additions & 2 deletions docs/api/modules.md
Expand Up @@ -653,7 +653,7 @@ ___

### readyToBeRegisteredOnchain

`Const` **readyToBeRegisteredOnchain**(`claim`): claim is Required<Pick<Claim, "token" \| "subjectAgreement" \| "onChainProof" \| "acceptedBy"\>\>
`Const` **readyToBeRegisteredOnchain**(`claim`): claim is Required<Pick<Claim, "subjectAgreement" \| "onChainProof" \| "acceptedBy"\>\>

#### Parameters

Expand All @@ -663,7 +663,7 @@ ___

#### Returns

claim is Required<Pick<Claim, "token" \| "subjectAgreement" \| "onChainProof" \| "acceptedBy"\>\>
claim is Required<Pick<Claim, "subjectAgreement" \| "onChainProof" \| "acceptedBy"\>\>

___

Expand Down
97 changes: 92 additions & 5 deletions e2e/claims.service.e2e.ts
Expand Up @@ -20,8 +20,8 @@ import {
} from '../src';
import { replenish, root, rpcUrl, setupENS } from './utils/setup_contracts';
import { ClaimManager__factory } from '../ethers/factories/ClaimManager__factory';
import { ClaimManager } from '../ethers/ClaimManager';
import { ProofVerifier } from '@ew-did-registry/claims';
import { ClaimManager } from '../ethers/ClaimManager';

const { namehash } = utils;

Expand Down Expand Up @@ -220,6 +220,82 @@ describe('Enrollment claim tests', () => {
return issuedClaim;
}

async function enrolAndIssueWithoutRequest(
requestSigner: Required<ethers.Signer>,
issueSigner: Required<ethers.Signer>,
{
subjectDID,
claimType,
registrationTypes = [RegistrationTypes.OnChain],
issuerFields,
}: {
subjectDID: string;
claimType: string;
registrationTypes?: RegistrationTypes[];
publishOnChain?: boolean;
issuerFields?: { key: string; value: string | number }[];
}
) {
await signerService.connect(issueSigner, ProviderType.PrivateKey);
const requesterDID = subjectDID;
const issuerDID = signerService.did;
const requestorFields = [{ key: 'temperature', value: 36 }];

await claimsService.issueClaim({
subject: subjectDID,
registrationTypes,
claim: {
claimType,
claimTypeVersion: version,
issuerFields: issuerFields || [],
},
});

const [did, issuedClaim] = <[string, Required<IClaimIssuance>]>(
mockIssueClaim.mock.calls.pop()
);

expect(did).toBe(issuerDID);

const { issuedToken, requester, claimIssuer, onChainProof, acceptedBy } = issuedClaim;

if (registrationTypes.includes(RegistrationTypes.OffChain)) {
expect(issuedToken).toBeDefined();

const { claimData, signer, did } = (await didRegistry.decodeJWTToken({
token: issuedToken,
})) as { [key: string]: string };

expect(claimData).toEqual({
claimType,
claimTypeVersion: version,
issuerFields,
requestorFields,
});

expect(signer).toBe(issuerDID);
expect(did).toBe(requesterDID);
}
if (registrationTypes.includes(RegistrationTypes.OnChain)) {
expect(onChainProof).toHaveLength(132);
await signerService.connect(requestSigner, ProviderType.PrivateKey);
const mockedClaim = {
claimType,
isApproved: true,
onChainProof,
claimTypeVersion: version,
acceptedBy: issuerDID,
};
mockGetClaimsBySubject.mockReset().mockImplementationOnce(() => [mockedClaim]);
await claimsService.publishPublicClaim({ claimType, registrationTypes });
}
expect(requester).toEqual(subjectDID);
expect(claimIssuer).toEqual([issuerDID]);
expect(acceptedBy).toBe(issuerDID);

return issuedClaim;
}

test('enrollment by issuer of type DID', async () => {
const requester = rootOwner;
const issuer = staticIssuer;
Expand Down Expand Up @@ -352,6 +428,17 @@ describe('Enrollment claim tests', () => {
expect(await claimsService.hasOnChainRole(rootOwnerDID, claimType, version)).toBe(true);
});

test('should be able to issue and publish onchain without request', async () => {
mockGetClaimsBySubject.mockImplementationOnce(() => [role1Claim]); // to verify requesting

await enrolAndIssueWithoutRequest(rootOwner, staticIssuer, {
subjectDID: rootOwnerDID,
claimType,
registrationTypes,
});
expect(await claimsService.hasOnChainRole(rootOwnerDID, claimType, version)).toBe(true);
});

test('should be able to issue without publishing onchain', async () => {
mockGetClaimsBySubject.mockImplementationOnce(() => [role1Claim]);

Expand Down Expand Up @@ -413,10 +500,10 @@ describe('Enrollment claim tests', () => {

describe('Selfsigned claim tests', () => {
test('Selfsigned claim should be verified', async () => {
const claimUrl = await claimsService.createSelfSignedClaim({
const claimUrl = (await claimsService.createSelfSignedClaim({
data: { claimType: roleName1 },
subject: rootOwnerDID,
});
})) as string;
const claim = await didRegistry.ipfsStore.get(claimUrl);

const document = await didRegistry.getDidDocument();
Expand All @@ -434,10 +521,10 @@ describe('Enrollment claim tests', () => {
{ document: { id: assetDID }, id: assetDID },
]);
const claimType = 'test claim';
const claimUrl = await claimsService.createSelfSignedClaim({
const claimUrl = (await claimsService.createSelfSignedClaim({
data: { claimType },
subject: assetDID,
});
})) as string;
const claim = await didRegistry.ipfsStore.get(claimUrl);

const ownerDoc = await didRegistry.getDidDocument({ did: rootOwnerDID, includeClaims: true });
Expand Down

0 comments on commit b80446d

Please sign in to comment.