@metalabel/dfos-protocol 0.27.0 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,19 +26,25 @@ import { createJws, dagCborCanonicalEncode, verifyJws } from '@metalabel/dfos-pr
26
26
 
27
27
  ## Subpath Exports
28
28
 
29
- | Export | Description |
30
- | -------------------------------------- | ---------------------------------------------------------------------------------------- |
31
- | `@metalabel/dfos-protocol/chain` | Identity & content chains, services, artifacts, countersigns, revocations, credit claims |
32
- | `@metalabel/dfos-protocol/credentials` | Auth tokens (DID-signed JWT) and DFOS credentials for authorization |
33
- | `@metalabel/dfos-protocol/crypto` | Ed25519, JWS, JWT, dag-cbor, base64url, ID generation |
29
+ | Export | Description |
30
+ | -------------------------------------- | ------------------------------------------------------------------------------------------------------- |
31
+ | `@metalabel/dfos-protocol/chain` | Identity & content chains, services, artifacts, countersigns, revocations, credit claims, sign requests |
32
+ | `@metalabel/dfos-protocol/credentials` | Auth tokens (DID-signed JWT) and DFOS credentials for authorization |
33
+ | `@metalabel/dfos-protocol/crypto` | Ed25519, JWS, JWT, dag-cbor, base64url, ID generation |
34
+ | `@metalabel/dfos-protocol/fold` | Canonical linearization and LWW-map folds for index documents |
34
35
 
35
36
  ## Specifications
36
37
 
37
- | Document | Description |
38
- | ------------------------------------------------ | -------------------------------------------------------------- |
39
- | [PROTOCOL.md](../../specs/PROTOCOL.md) | Core protocol — chains, signatures, verification, test vectors |
40
- | [DID-METHOD.md](../../specs/DID-METHOD.md) | W3C DID method specification for `did:dfos` |
41
- | [CONTENT-MODEL.md](../../specs/CONTENT-MODEL.md) | Standard content schemas (post, profile) |
38
+ | Document | Description |
39
+ | ------------------------------------------------ | --------------------------------------------------------------------------------- |
40
+ | [PROTOCOL.md](../../specs/PROTOCOL.md) | Core protocol — chains, signatures, verification, test vectors |
41
+ | [DID-METHOD.md](../../specs/DID-METHOD.md) | W3C DID method specification for `did:dfos` |
42
+ | [CONTENT-MODEL.md](../../specs/CONTENT-MODEL.md) | Standard content schemas (post, profile) |
43
+ | [CREDENTIALS.md](../../specs/CREDENTIALS.md) | UCAN-style authorization credentials for the DFOS protocol |
44
+ | [CREDITS.md](../../specs/CREDITS.md) | Verifiable attribution for DFOS content |
45
+ | [SIGNING.md](../../specs/SIGNING.md) | A transport-agnostic way for one party to ask another to produce a DFOS signature |
46
+
47
+ Release history lives at https://github.com/metalabel/dfos/releases.
42
48
 
43
49
  ## Examples
44
50
 
@@ -1,5 +1,5 @@
1
- import { I as IdentityOperation, t as Signer, v as VerifiedIdentity, S as ServiceEntry, d as ContentOperation, R as RevocationChecker, e as CountersignPayload, a as ArtifactPayload } from '../dfos-credential-DFZRl0FD.js';
2
- export { A as ARTIFACT_CID_ANCHOR_RE, C as CONTENT_ID_ANCHOR_RE, g as CreditClaimPayload, h as Iso8601, M as MAX_ARTIFACT_PAYLOAD_SIZE, j as MAX_CREDIT_CLAIM_SIZE, k as MAX_OPERATION_SIZE, l as MAX_SERVICES_ENTRIES, m as MAX_SERVICES_PAYLOAD_SIZE, n as MAX_SIGN_REQUEST_PAYLOAD_SIZE, o as MAX_SIGN_REQUEST_SIZE, p as MultikeyPublicKey, q as RevocationPayload, r as ServicesArray, s as SignRequestPayload, B as parseProtocolTimestampUnix } from '../dfos-credential-DFZRl0FD.js';
1
+ import { I as IdentityOperation, t as Signer, v as VerifiedIdentity, S as ServiceEntry, d as ContentOperation, R as RevocationChecker, e as CountersignPayload, a as ArtifactPayload } from '../dfos-credential-DU7WvoHE.js';
2
+ export { A as ARTIFACT_CID_ANCHOR_RE, C as CONTENT_ID_ANCHOR_RE, g as CreditClaimPayload, h as Iso8601, M as MAX_ARTIFACT_PAYLOAD_SIZE, j as MAX_CREDIT_CLAIM_SIZE, k as MAX_OPERATION_SIZE, l as MAX_SERVICES_ENTRIES, m as MAX_SERVICES_PAYLOAD_SIZE, n as MAX_SIGN_REQUEST_PAYLOAD_SIZE, o as MAX_SIGN_REQUEST_SIZE, p as MultikeyPublicKey, q as RevocationPayload, r as ServicesArray, s as SignRequestPayload, B as parseProtocolTimestampUnix } from '../dfos-credential-DU7WvoHE.js';
3
3
  import 'zod';
4
4
 
5
5
  /** Ed25519 public key multicodec value */
@@ -49,7 +49,7 @@ import {
49
49
  verifyIdentityExtensionFromTrustedState,
50
50
  verifyRevocation,
51
51
  verifySignRequest
52
- } from "../chunk-Q376VG5Z.js";
52
+ } from "../chunk-W4ESJVMO.js";
53
53
  import {
54
54
  ED25519_PRIV_MULTICODEC,
55
55
  ED25519_PUB_MULTICODEC,
@@ -96,10 +96,17 @@ var IdentityDelete = z.looseObject({
96
96
  previousOperationCID: CIDString,
97
97
  createdAt: Iso8601
98
98
  });
99
+ var IdentityRestore = z.looseObject({
100
+ version: z.literal(1),
101
+ type: z.literal("restore"),
102
+ previousOperationCID: CIDString,
103
+ createdAt: Iso8601
104
+ });
99
105
  var IdentityOperation = z.discriminatedUnion("type", [
100
106
  IdentityCreate,
101
107
  IdentityUpdate,
102
- IdentityDelete
108
+ IdentityDelete,
109
+ IdentityRestore
103
110
  ]);
104
111
  var VerifiedIdentity = z.strictObject({
105
112
  did: z.string(),
@@ -257,7 +264,12 @@ var verifyIdentityChain = async (input) => {
257
264
  if (decoded.header.typ !== "did:dfos:identity-op") {
258
265
  throw new Error(`log[${idx}]: invalid typ: ${decoded.header.typ}`);
259
266
  }
260
- if (state.isDeleted) throw new Error(`log[${idx}]: cannot modify a deleted identity`);
267
+ if (state.isDeleted && op.type !== "restore") {
268
+ throw new Error(`log[${idx}]: cannot modify a deleted identity`);
269
+ }
270
+ if (!state.isDeleted && op.type === "restore") {
271
+ throw new Error(`log[${idx}]: restore must immediately follow delete`);
272
+ }
261
273
  if (idx === 0 && op.type !== "create") {
262
274
  throw new Error(`log[${idx}]: first operation must be create`);
263
275
  }
@@ -273,7 +285,7 @@ var verifyIdentityChain = async (input) => {
273
285
  state.controllerKeys = op.controllerKeys;
274
286
  state.services = op.services ?? [];
275
287
  }
276
- if (op.type === "update" || op.type === "delete") {
288
+ if (op.type !== "create") {
277
289
  if (op.previousOperationCID !== state.previousOperationCID) {
278
290
  throw new Error(`log[${idx}]: previousCID is incorrect`);
279
291
  }
@@ -370,6 +382,9 @@ var verifyIdentityChain = async (input) => {
370
382
  case "delete":
371
383
  state.isDeleted = true;
372
384
  break;
385
+ case "restore":
386
+ state.isDeleted = false;
387
+ break;
373
388
  }
374
389
  }
375
390
  if (!state.did) throw new Error("did is not set");
@@ -384,9 +399,6 @@ var verifyIdentityChain = async (input) => {
384
399
  };
385
400
  var verifyIdentityExtensionFromTrustedState = async (input) => {
386
401
  const { currentState, headCID, lastCreatedAt, newOp } = input;
387
- if (currentState.isDeleted) {
388
- throw new Error("cannot extend a deleted identity");
389
- }
390
402
  const decoded = decodeJwsUnsafe(newOp);
391
403
  if (!decoded) throw new Error("failed to decode JWS");
392
404
  const result = IdentityOperation.safeParse(decoded.payload);
@@ -395,6 +407,12 @@ var verifyIdentityExtensionFromTrustedState = async (input) => {
395
407
  throw new Error(messages);
396
408
  }
397
409
  const op = result.data;
410
+ if (currentState.isDeleted && op.type !== "restore") {
411
+ throw new Error("cannot extend a deleted identity");
412
+ }
413
+ if (!currentState.isDeleted && op.type === "restore") {
414
+ throw new Error("restore must immediately follow delete");
415
+ }
398
416
  if (decoded.header.typ !== "did:dfos:identity-op") {
399
417
  throw new Error(`invalid typ: ${decoded.header.typ}`);
400
418
  }
@@ -443,21 +461,37 @@ var verifyIdentityExtensionFromTrustedState = async (input) => {
443
461
  });
444
462
  if (op.services) await assertServicesWithinCap(op.services);
445
463
  }
446
- const newState = op.type === "update" ? {
447
- did: currentState.did,
448
- isDeleted: false,
449
- authKeys: op.authKeys,
450
- assertKeys: op.assertKeys,
451
- controllerKeys: op.controllerKeys,
452
- services: op.services ?? []
453
- } : {
454
- did: currentState.did,
455
- isDeleted: true,
456
- authKeys: currentState.authKeys,
457
- assertKeys: currentState.assertKeys,
458
- controllerKeys: currentState.controllerKeys,
459
- services: currentState.services
460
- };
464
+ const newState = (() => {
465
+ switch (op.type) {
466
+ case "update":
467
+ return {
468
+ did: currentState.did,
469
+ isDeleted: false,
470
+ authKeys: op.authKeys,
471
+ assertKeys: op.assertKeys,
472
+ controllerKeys: op.controllerKeys,
473
+ services: op.services ?? []
474
+ };
475
+ case "delete":
476
+ return {
477
+ did: currentState.did,
478
+ isDeleted: true,
479
+ authKeys: currentState.authKeys,
480
+ assertKeys: currentState.assertKeys,
481
+ controllerKeys: currentState.controllerKeys,
482
+ services: currentState.services
483
+ };
484
+ case "restore":
485
+ return {
486
+ did: currentState.did,
487
+ isDeleted: false,
488
+ authKeys: currentState.authKeys,
489
+ assertKeys: currentState.assertKeys,
490
+ controllerKeys: currentState.controllerKeys,
491
+ services: currentState.services
492
+ };
493
+ }
494
+ })();
461
495
  return { state: newState, operationCID, createdAt: op.createdAt };
462
496
  };
463
497
 
@@ -1,4 +1,4 @@
1
- export { b as Attenuation, c as AuthTokenClaims, f as CredentialVerificationError, D as DFOSCredentialPayload, i as MAX_CREDENTIAL_SIZE, R as RevocationChecker, V as VerifiedDFOSCredential, u as VerifiedDelegationChain, w as createDFOSCredential, x as decodeDFOSCredentialUnsafe, y as isAttenuated, z as matchesResource, E as verifyDFOSCredential, F as verifyDelegationChain } from '../dfos-credential-DFZRl0FD.js';
1
+ export { b as Attenuation, c as AuthTokenClaims, f as CredentialVerificationError, D as DFOSCredentialPayload, i as MAX_CREDENTIAL_SIZE, R as RevocationChecker, V as VerifiedDFOSCredential, u as VerifiedDelegationChain, w as createDFOSCredential, x as decodeDFOSCredentialUnsafe, y as isAttenuated, z as matchesResource, E as verifyDFOSCredential, F as verifyDelegationChain } from '../dfos-credential-DU7WvoHE.js';
2
2
  import 'zod';
3
3
 
4
4
  interface AuthTokenCreateOptions {
@@ -148,6 +148,11 @@ declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
148
148
  type: z.ZodLiteral<"delete">;
149
149
  previousOperationCID: z.ZodString;
150
150
  createdAt: z.ZodISODateTime;
151
+ }, z.core.$loose>, z.ZodObject<{
152
+ version: z.ZodLiteral<1>;
153
+ type: z.ZodLiteral<"restore">;
154
+ previousOperationCID: z.ZodString;
155
+ createdAt: z.ZodISODateTime;
151
156
  }, z.core.$loose>], "type">;
152
157
  type IdentityOperation = z.infer<typeof IdentityOperation>;
153
158
  declare const VerifiedIdentity: z.ZodObject<{
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { JwsHeader, JwsVerificationError, JwtClaims, JwtCreateOptions, JwtHeader, JwtVerificationError, JwtVerifyOptions, PrefixedID, assertJwsProfile, base64urlDecode, base64urlEncode, createJws, createJwt, createNewEd25519Keypair, dagCborCanonicalEncode, decodeJwsUnsafe, decodeJwtUnsafe, generateId, generateIdNoPrefix, importEd25519Keypair, isCanonicallyEqual, isValidEd25519Signature, isValidId, normalizedId, parseDagCborCID, signPayloadEd25519, verifyJws, verifyJwt } from './crypto/index.js';
2
- export { A as ARTIFACT_CID_ANCHOR_RE, a as ArtifactPayload, b as Attenuation, c as AuthTokenClaims, C as CONTENT_ID_ANCHOR_RE, d as ContentOperation, e as CountersignPayload, f as CredentialVerificationError, g as CreditClaimPayload, D as DFOSCredentialPayload, I as IdentityOperation, h as Iso8601, M as MAX_ARTIFACT_PAYLOAD_SIZE, i as MAX_CREDENTIAL_SIZE, j as MAX_CREDIT_CLAIM_SIZE, k as MAX_OPERATION_SIZE, l as MAX_SERVICES_ENTRIES, m as MAX_SERVICES_PAYLOAD_SIZE, n as MAX_SIGN_REQUEST_PAYLOAD_SIZE, o as MAX_SIGN_REQUEST_SIZE, p as MultikeyPublicKey, R as RevocationChecker, q as RevocationPayload, S as ServiceEntry, r as ServicesArray, s as SignRequestPayload, t as Signer, V as VerifiedDFOSCredential, u as VerifiedDelegationChain, v as VerifiedIdentity, w as createDFOSCredential, x as decodeDFOSCredentialUnsafe, y as isAttenuated, z as matchesResource, B as parseProtocolTimestampUnix, E as verifyDFOSCredential, F as verifyDelegationChain } from './dfos-credential-DFZRl0FD.js';
2
+ export { A as ARTIFACT_CID_ANCHOR_RE, a as ArtifactPayload, b as Attenuation, c as AuthTokenClaims, C as CONTENT_ID_ANCHOR_RE, d as ContentOperation, e as CountersignPayload, f as CredentialVerificationError, g as CreditClaimPayload, D as DFOSCredentialPayload, I as IdentityOperation, h as Iso8601, M as MAX_ARTIFACT_PAYLOAD_SIZE, i as MAX_CREDENTIAL_SIZE, j as MAX_CREDIT_CLAIM_SIZE, k as MAX_OPERATION_SIZE, l as MAX_SERVICES_ENTRIES, m as MAX_SERVICES_PAYLOAD_SIZE, n as MAX_SIGN_REQUEST_PAYLOAD_SIZE, o as MAX_SIGN_REQUEST_SIZE, p as MultikeyPublicKey, R as RevocationChecker, q as RevocationPayload, S as ServiceEntry, r as ServicesArray, s as SignRequestPayload, t as Signer, V as VerifiedDFOSCredential, u as VerifiedDelegationChain, v as VerifiedIdentity, w as createDFOSCredential, x as decodeDFOSCredentialUnsafe, y as isAttenuated, z as matchesResource, B as parseProtocolTimestampUnix, E as verifyDFOSCredential, F as verifyDelegationChain } from './dfos-credential-DU7WvoHE.js';
3
3
  export { AnchorKind, CreditClaimFailureReason, CreditClaimVerifyError, CreditEntry, CreditEntryState, ED25519_PRIV_MULTICODEC, ED25519_PUB_MULTICODEC, RECOGNIZED_SERVICE_TYPES, SignRequestFailureReason, SignRequestVerifyError, VerifiedArtifact, VerifiedContentChain, VerifiedCountersignature, VerifiedCreditClaim, VerifiedCreditEntry, VerifiedRevocation, VerifiedSignRequest, anchorsByLabel, assertCanonicalSignRequestPayload, assertServicesWithinCap, buildSignRequest, classifyAnchor, decodeMultikey, deriveChainIdentifier, deriveContentId, encodeEd25519Multikey, isRecognizedServiceType, relayEndpoints, signArtifact, signContentOperation, signCountersignature, signCreditClaim, signIdentityOperation, signRevocation, verifyArtifact, verifyContentChain, verifyContentExtensionFromTrustedState, verifyCountersignature, verifyCreditClaim, verifyCreditEntry, verifyIdentityChain, verifyIdentityExtensionFromTrustedState, verifyRevocation, verifySignRequest } from './chain/index.js';
4
4
  export { AuthTokenCreateOptions, AuthTokenVerificationError, AuthTokenVerifyOptions, VerifiedAuthToken, createAuthToken, verifyAuthToken } from './credentials/index.js';
5
5
  export { FoldOperation, INDEX_V1_SCHEMA, IndexDelta, IndexDocument, IndexEntry, LwwDelta, OrderKey, byteCompare, compareHeadPreference, compareLinear, foldIndexV1, foldLwwMap, linearize } from './fold/index.js';
package/dist/index.js CHANGED
@@ -49,7 +49,7 @@ import {
49
49
  verifyIdentityExtensionFromTrustedState,
50
50
  verifyRevocation,
51
51
  verifySignRequest
52
- } from "./chunk-Q376VG5Z.js";
52
+ } from "./chunk-W4ESJVMO.js";
53
53
  import {
54
54
  Attenuation,
55
55
  AuthTokenClaims,
@@ -0,0 +1,21 @@
1
+ {
2
+ "description": "Identity chain: genesis + key rotation + delete + restore",
3
+ "type": "identity",
4
+ "chain": [
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0ODNubjI5enZoZSIsImNpZCI6ImJhZnlyZWliZnVoNjN1djMzaTJpNWVvb2UzYm9pdDJydXlqZWh1YnNyeWVtdXV6Nm1ydGxlajI2cmVpIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSIsImF1dGhLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJhc3NlcnRLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJjb250cm9sbGVyS2V5cyI6W3siaWQiOiJrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZG43ejZ6cmN0OCIsInR5cGUiOiJNdWx0aWtleSIsInB1YmxpY0tleU11bHRpYmFzZSI6Ino2TWtmVWQ2NUpyQWhmZGdGdU1DY2NVOVRoUXZqQjJmSkFNVUhrdXVhakY5OTJnSyJ9XSwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowMTowMC4wMDBaIn0.7fqvWGEVYW9atA1uqpp7lIUOWp4dATLpLjOmFWzJN-8gTL-QnXDCeyGcBu5AXhHzO52fauwUavh1KrB6wBYuCw",
7
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZG43ejZ6cmN0OCIsImNpZCI6ImJhZnlyZWljbDNhMnQ2dmh6NXZndnM1b2pkdzV3Y3dnb3ozdGF4cXF3ZXhwYnBsdG0yZ2gzcTQyenlpIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpYmZ1aDYzdXYzM2kyaTVlb29lM2JvaXQycnV5amVodWJzcnllbXV1ejZtcnRsZWoyNnJlaSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiJ9.00Dy7qeK7I0hC3P1yvERLJINBLNiEV9LhG8BXdUMIGGLTsxuMcuhn3Yquq96SQa8mzl-BztzD5LMxBohYZxQAg",
8
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZG43ejZ6cmN0OCIsImNpZCI6ImJhZnlyZWlleWF2dWU2dnh6dDYzdWxrcXB3ZXRmd3F2Znpka2VxNnQzcTNnd3JqbnFnaG1panJneWJhIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoicmVzdG9yZSIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWNsM2EydDZ2aHo1dmd2czVvamR3NXdjd2dvejN0YXhxcXdleHBicGx0bTJnaDNxNDJ6eWkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoifQ.lVKZj34IGmyf-0Un7TELSPP3i57gWMe8j5d4d06gFnh8r4hpf5_1VHMUrwwkt7CFnWcd4Ui4CdeXPKS8jpIeAg"
9
+ ],
10
+ "expected": {
11
+ "did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
12
+ "isDeleted": false,
13
+ "controllerKeys": [
14
+ {
15
+ "id": "key_ez9a874tckr3dv933d3ckdn7z6zrct8",
16
+ "type": "Multikey",
17
+ "publicKeyMultibase": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK"
18
+ }
19
+ ]
20
+ }
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metalabel/dfos-protocol",
3
- "version": "0.27.0",
3
+ "version": "0.28.1",
4
4
  "type": "module",
5
5
  "description": "DFOS Protocol — Ed25519 signed chain primitives, services, credentials, and verification",
6
6
  "license": "MIT",