@metalabel/dfos-protocol 0.9.0 → 0.11.0

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.
@@ -2,12 +2,46 @@ import { z } from 'zod';
2
2
 
3
3
  /** Function that signs a byte array and returns a signature */
4
4
  type Signer = (message: Uint8Array) => Promise<Uint8Array>;
5
+ /** Max number of service entries in an identity's services state */
6
+ declare const MAX_SERVICES_ENTRIES = 16;
7
+ /** Max CBOR-encoded size of the services array (bytes) — protocol constant */
8
+ declare const MAX_SERVICES_PAYLOAD_SIZE = 8192;
5
9
  declare const MultikeyPublicKey: z.ZodObject<{
6
10
  id: z.ZodString;
7
11
  type: z.ZodLiteral<"Multikey">;
8
12
  publicKeyMultibase: z.ZodString;
9
13
  }, z.core.$strict>;
10
14
  type MultikeyPublicKey = z.infer<typeof MultikeyPublicKey>;
15
+ /**
16
+ * Anchor target shapes — a ContentAnchor references a STABLE content
17
+ * identifier, dispatched by structural form:
18
+ * - 31-char contentId (content chain) → mutable, gateable
19
+ * - CIDv1 base32 (artifact) → immutable, public
20
+ * Both are stable; a chain HEAD CID (also base32 but resolves to a non-artifact
21
+ * op) is rejected by the shape-dispatch + resolution type check, never anchored.
22
+ */
23
+ declare const CONTENT_ID_ANCHOR_RE: RegExp;
24
+ declare const ARTIFACT_CID_ANCHOR_RE: RegExp;
25
+ /**
26
+ * Service entry — discovery vocabulary in identity-chain state.
27
+ *
28
+ * Open namespace: `type` is an arbitrary bounded string. Recognized types
29
+ * (`DfosRelay`, `ContentAnchor`) are structurally validated; UNRECOGNIZED types
30
+ * are preserved verbatim and ignored (MUST-ignore-unknown) — only the common
31
+ * envelope (id + type) and the byte cap apply. New service types therefore
32
+ * never require a protocol/cross-language change.
33
+ */
34
+ declare const ServiceEntry: z.ZodObject<{
35
+ id: z.ZodString;
36
+ type: z.ZodString;
37
+ }, z.core.$catchall<z.ZodUnknown>>;
38
+ type ServiceEntry = z.infer<typeof ServiceEntry>;
39
+ /** Identity services state — full-state, bounded, unique entry ids */
40
+ declare const ServicesArray: z.ZodArray<z.ZodObject<{
41
+ id: z.ZodString;
42
+ type: z.ZodString;
43
+ }, z.core.$catchall<z.ZodUnknown>>>;
44
+ type ServicesArray = z.infer<typeof ServicesArray>;
11
45
  declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
12
46
  version: z.ZodLiteral<1>;
13
47
  type: z.ZodLiteral<"create">;
@@ -26,6 +60,10 @@ declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
26
60
  type: z.ZodLiteral<"Multikey">;
27
61
  publicKeyMultibase: z.ZodString;
28
62
  }, z.core.$strict>>;
63
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
64
+ id: z.ZodString;
65
+ type: z.ZodString;
66
+ }, z.core.$catchall<z.ZodUnknown>>>>;
29
67
  createdAt: z.ZodISODateTime;
30
68
  }, z.core.$strict>, z.ZodObject<{
31
69
  version: z.ZodLiteral<1>;
@@ -46,6 +84,10 @@ declare const IdentityOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
46
84
  type: z.ZodLiteral<"Multikey">;
47
85
  publicKeyMultibase: z.ZodString;
48
86
  }, z.core.$strict>>;
87
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
88
+ id: z.ZodString;
89
+ type: z.ZodString;
90
+ }, z.core.$catchall<z.ZodUnknown>>>>;
49
91
  createdAt: z.ZodISODateTime;
50
92
  }, z.core.$strict>, z.ZodObject<{
51
93
  version: z.ZodLiteral<1>;
@@ -72,6 +114,10 @@ declare const VerifiedIdentity: z.ZodObject<{
72
114
  type: z.ZodLiteral<"Multikey">;
73
115
  publicKeyMultibase: z.ZodString;
74
116
  }, z.core.$strict>>;
117
+ services: z.ZodArray<z.ZodObject<{
118
+ id: z.ZodString;
119
+ type: z.ZodString;
120
+ }, z.core.$catchall<z.ZodUnknown>>>;
75
121
  }, z.core.$strict>;
76
122
  type VerifiedIdentity = z.infer<typeof VerifiedIdentity>;
77
123
  declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -91,7 +137,6 @@ declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
91
137
  baseDocumentCID: z.ZodNullable<z.ZodString>;
92
138
  createdAt: z.ZodISODateTime;
93
139
  note: z.ZodNullable<z.ZodString>;
94
- /** DFOS credential authorizing this operation when signer is not the chain creator */
95
140
  authorization: z.ZodOptional<z.ZodString>;
96
141
  }, z.core.$strict>, z.ZodObject<{
97
142
  version: z.ZodLiteral<1>;
@@ -100,19 +145,9 @@ declare const ContentOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
100
145
  previousOperationCID: z.ZodString;
101
146
  createdAt: z.ZodISODateTime;
102
147
  note: z.ZodNullable<z.ZodString>;
103
- /** DFOS credential authorizing this operation when signer is not the chain creator */
104
148
  authorization: z.ZodOptional<z.ZodString>;
105
149
  }, z.core.$strict>], "type">;
106
150
  type ContentOperation = z.infer<typeof ContentOperation>;
107
- /** Beacon: floating signed manifest pointer announcement */
108
- declare const BeaconPayload: z.ZodObject<{
109
- version: z.ZodLiteral<1>;
110
- type: z.ZodLiteral<"beacon">;
111
- did: z.ZodString;
112
- manifestContentId: z.ZodString;
113
- createdAt: z.ZodISODateTime;
114
- }, z.core.$strict>;
115
- type BeaconPayload = z.infer<typeof BeaconPayload>;
116
151
  /** Max CBOR-encoded payload size for artifacts (bytes) — protocol constant */
117
152
  declare const MAX_ARTIFACT_PAYLOAD_SIZE = 16384;
118
153
  /** Artifact: standalone signed inline document, immutable, CID-addressable */
@@ -126,16 +161,25 @@ declare const ArtifactPayload: z.ZodObject<{
126
161
  createdAt: z.ZodISODateTime;
127
162
  }, z.core.$strict>;
128
163
  type ArtifactPayload = z.infer<typeof ArtifactPayload>;
129
- /** Countersign: standalone witness attestation referencing a target operation by CID */
164
+ /**
165
+ * Countersign: standalone witness attestation referencing a target operation by CID.
166
+ *
167
+ * `relation` is an OPEN-namespace tag naming the nature of the attestation
168
+ * (e.g. `coauthors`, `endorses`, `witnessed`, `holds`, `received`). It is an
169
+ * arbitrary bounded string — recognized values carry social meaning to clients,
170
+ * unrecognized values MUST be preserved and ignored. Optional, so a bare witness
171
+ * attestation (no relation) encodes identically (CID-neutral).
172
+ */
130
173
  declare const CountersignPayload: z.ZodObject<{
131
174
  version: z.ZodLiteral<1>;
132
175
  type: z.ZodLiteral<"countersign">;
133
176
  did: z.ZodString;
134
177
  targetCID: z.ZodString;
178
+ relation: z.ZodOptional<z.ZodString>;
135
179
  createdAt: z.ZodISODateTime;
136
180
  }, z.core.$strict>;
137
181
  type CountersignPayload = z.infer<typeof CountersignPayload>;
138
- /** Revocation: signed credential revocation artifact, gossiped like beacons */
182
+ /** Revocation: signed credential revocation artifact, gossiped on the proof plane */
139
183
  declare const RevocationPayload: z.ZodObject<{
140
184
  version: z.ZodLiteral<1>;
141
185
  type: z.ZodLiteral<"revocation">;
@@ -145,4 +189,4 @@ declare const RevocationPayload: z.ZodObject<{
145
189
  }, z.core.$strict>;
146
190
  type RevocationPayload = z.infer<typeof RevocationPayload>;
147
191
 
148
- export { ArtifactPayload as A, BeaconPayload as B, ContentOperation as C, IdentityOperation as I, MAX_ARTIFACT_PAYLOAD_SIZE as M, RevocationPayload as R, type Signer as S, VerifiedIdentity as V, CountersignPayload as a, MultikeyPublicKey as b };
192
+ export { ARTIFACT_CID_ANCHOR_RE as A, CONTENT_ID_ANCHOR_RE as C, IdentityOperation as I, MAX_ARTIFACT_PAYLOAD_SIZE as M, RevocationPayload as R, ServiceEntry as S, VerifiedIdentity as V, ArtifactPayload as a, ContentOperation as b, CountersignPayload as c, MAX_SERVICES_ENTRIES as d, MAX_SERVICES_PAYLOAD_SIZE as e, MultikeyPublicKey as f, ServicesArray as g, type Signer as h };
@@ -2,8 +2,8 @@
2
2
  "description": "Content chain: creator signs genesis, delegate signs update with write credential",
3
3
  "type": "content-delegated",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MTA6MDAuMDAwWiIsIm5vdGUiOm51bGx9.oanyS9rbkqrxd1j8T172jVG4ILKFwW2t1JhkQLxsFqHMMURqA5Hl-0GzGFrfSkQT02Nq5RMYXzhcToqbjoV8AQ",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpuemtmODM4ZWZyNDI0NDMzcm4ycnprI2tleV9hOHIyNzQzNGFhcjc2YWU3MmM4NzdmIiwiY2lkIjoiYmFmeXJlaWE1M3JheWl5djNuY2Z6ZnNmdzJ2cXczeG5sZ2ZibGFiNjNnN2xrbG9laXFhb2Jxc25yenEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlmbml5bmQ2aGV2NjQ2dW9hamFjM2VnYWs3cDJxZmhyaGhvNG1mbXBwYTNydGNqcGV0Z2RlIiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjExOjAwLjAwMFoiLCJub3RlIjoiZGVsZWdhdGVkIGVkaXQgYnkga2V5MyIsImF1dGhvcml6YXRpb24iOiJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SW1ScFpEcGtabTl6T21OeVpXUmxiblJwWVd3aUxDSnJhV1FpT2lKa2FXUTZaR1p2Y3pwbE0zWjJkR05yTkRKa05HVmhZMlJ1ZW5aMGNtNDJJMnRsZVY5eU9XVjJNelJtZG1NeU0zbzVPVGwyWldGaFpuUTRJaXdpWTJsa0lqb2lZbUZtZVhKbGFXVnNjemRvYmpkd2NXWjRlV1JvZFhWbmJXWnFiV2t5WTJWb2QyTjNiV3R1WVRJM2IyUjFhWGxvTm5VMmJYcHZaR051YnpRaWZRLmV5SjJaWEp6YVc5dUlqb3hMQ0owZVhCbElqb2lSRVpQVTBOeVpXUmxiblJwWVd3aUxDSnBjM01pT2lKa2FXUTZaR1p2Y3pwbE0zWjJkR05yTkRKa05HVmhZMlJ1ZW5aMGNtNDJJaXdpWVhWa0lqb2laR2xrT21SbWIzTTZibnByWmpnek9HVm1jalF5TkRRek0zSnVNbko2YXlJc0ltRjBkQ0k2VzNzaWNtVnpiM1Z5WTJVaU9pSmphR0ZwYmpwaFl6STJlamg2YTJ0bE5qZDZORGhoWmpOeWFHZzVJaXdpWVdOMGFXOXVJam9pZDNKcGRHVWlmVjBzSW5CeVppSTZXMTBzSW1WNGNDSTZNVGM1T0RjMk1UWXdNQ3dpYVdGMElqb3hOemN5T0RReE5qQXdmUS41ak5SeWdvSUNvX05iMWhoR3JTRkU0c2JEaWgzQU92dWhVVUFVNzBZOThDejdkaEkzakVNclJqZGZpbHh5OTgtOEJBU2VzbEpsMGtEd0ZJc1VUM0lEdyJ9.pmlU0CwctVJJL4eUlrrkUQ52266UtGnV1liETpZ6N-Ui8K-Aob58LdPbAJsk_NpiiFmyeyRiJfUnp-ADCkWqAQ"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWRkc2pnZGk3dmZib2tlejVyZWl4enRmcm9kNnhjbmh0Ymc0NmI3dnZmZGRwb2Z4czVtaXkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWRyd2V4NWRjYjJ1c3NqNmJ0eGJjMzQyM3U1d2VzNnJyd29tbXhhemt1bHRzcG9oN2EzdGkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MTA6MDAuMDAwWiIsIm5vdGUiOm51bGx9.cxfEOGZ08zCQVuqiiljZNCxZudQi3CGqANtFnWLVyh0m9Sdq2yFk_fl4jCcw_4lTDvkYOkMgEOm_VvkpnqdMDA",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczo5NGFoNzk2M24yMjNrOGM5ODg0aGgyN2VraDQybmVhI2tleV9hOHIyNzQzNGFhcjc2YWU3MmM4NzdmYTQ3a2FyOHJuIiwiY2lkIjoiYmFmeXJlaWd3ZjI0aGhkN2N3dGlhMndocWl3bDVndHZwbGRxNnZtZmozY2ZvdGV5cmJpdjNxMmJhbGkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWRkc2pnZGk3dmZib2tlejVyZWl4enRmcm9kNnhjbmh0Ymc0NmI3dnZmZGRwb2Z4czVtaXkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWllanNzaWhrZGZsamphYmRhbWhrdXlpYm1jNzQzaG4zaTM2YTdmbnV6c2plb2FydHBlNXdhIiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWRyd2V4NWRjYjJ1c3NqNmJ0eGJjMzQyM3U1d2VzNnJyd29tbXhhemt1bHRzcG9oN2EzdGkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjExOjAwLjAwMFoiLCJub3RlIjoiZGVsZWdhdGVkIGVkaXQgYnkga2V5MyIsImF1dGhvcml6YXRpb24iOiJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SW1ScFpEcGtabTl6T21OeVpXUmxiblJwWVd3aUxDSnJhV1FpT2lKa2FXUTZaR1p2Y3pwamJtNXVablE1WmpoaE1uSnVPVE00WkRadWEzb3pPSEk0TkRkMk1tdHlJMnRsZVY5eU9XVjJNelJtZG1NeU0zbzVPVGwyWldGaFpuUTRNMjV1TWpsNmRtaGxJaXdpWTJsa0lqb2lZbUZtZVhKbGFXUmtaVzkyZFRJeVpYTjVhSE5pTlRaa2FHRTJaVFJ4TkhZeU5tbHVObmQ1YjNsMGRYbDJjVFV5TlhjMWFqTnlZMlp0Tm1raWZRLmV5SjJaWEp6YVc5dUlqb3hMQ0owZVhCbElqb2lSRVpQVTBOeVpXUmxiblJwWVd3aUxDSnBjM01pT2lKa2FXUTZaR1p2Y3pwamJtNXVablE1WmpoaE1uSnVPVE00WkRadWEzb3pPSEk0TkRkMk1tdHlJaXdpWVhWa0lqb2laR2xrT21SbWIzTTZPVFJoYURjNU5qTnVNakl6YXpoak9UZzROR2hvTWpkbGEyZzBNbTVsWVNJc0ltRjBkQ0k2VzNzaWNtVnpiM1Z5WTJVaU9pSmphR0ZwYmpvemNqSTBNMmczTnpsbGEzSnVjbUZoWTJVMk16ZzRNbVoyT0dRNE16ZzVJaXdpWVdOMGFXOXVJam9pZDNKcGRHVWlmVjBzSW5CeVppSTZXMTBzSW1WNGNDSTZNVGM1T0RjMk1UWXdNQ3dpYVdGMElqb3hOemN5T0RReE5qQXdmUS5oWko1LXpLTXNKR0tQaEtVdjVCaEt4QnJYLWlaUjNJazNJNTB2b1NEUTVrbWFLOXlvNkI3MTZBY05ibnhlc01tclpXX0FfNzJuZDVYQ29iSTZUbFJBZyJ9.0eNH6RC6O-OkFDBLEWk3YugPUzc9WGtZnG8wRzEEjz0SEwTx5z4FkNoP8Fygu7nd9DZbel9flZL-f0Lg_yD6BA"
7
7
  ],
8
8
  "creatorPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
9
9
  "delegatePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
@@ -14,10 +14,10 @@
14
14
  "format": "short-post",
15
15
  "title": "Original Post",
16
16
  "body": "Content created by the chain owner.",
17
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
17
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
18
18
  },
19
19
  "baseDocumentCID": null,
20
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
20
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
21
21
  "createdAt": "2026-03-07T00:10:00.000Z"
22
22
  },
23
23
  {
@@ -26,19 +26,19 @@
26
26
  "format": "short-post",
27
27
  "title": "Delegated Edit",
28
28
  "body": "Content updated by an authorized delegate.",
29
- "createdByDID": "did:dfos:nzkf838efr424433rn2rzk"
29
+ "createdByDID": "did:dfos:94ah7963n223k8c9884hh27ekh42nea"
30
30
  },
31
- "baseDocumentCID": "bafyreign7gfuu54wo2geg3tf5tepeplblktahjfzqjpujizc7a2boeycca",
32
- "createdByDID": "did:dfos:nzkf838efr424433rn2rzk",
31
+ "baseDocumentCID": "bafyreidrwex5dcb2ussj6btxbc3423u5wes6rrwommxazkultspoh7a3ti",
32
+ "createdByDID": "did:dfos:94ah7963n223k8c9884hh27ekh42nea",
33
33
  "createdAt": "2026-03-07T00:11:00.000Z"
34
34
  }
35
35
  ],
36
- "authorization": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWVsczdobjdwcWZ4eWRodXVnbWZqbWkyY2Vod2N3bWtuYTI3b2R1aXloNnU2bXpvZGNubzQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42IiwiYXVkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjphYzI2ejh6a2tlNjd6NDhhZjNyaGg5IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.5jNRygoICo_Nb1hhGrSFE4sbDih3AOvuhUUAU70Y98Cz7dhI3jEMrRjdfilxy98-8BASeslJl0kDwFIsUT3IDw",
36
+ "authorization": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWRkZW92dTIyZXN5aHNiNTZkaGE2ZTRxNHYyNmluNnd5b3l0dXl2cTUyNXc1ajNyY2ZtNmkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjozcjI0M2g3Nzlla3JucmFhY2U2Mzg4MmZ2OGQ4Mzg5IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.hZJ5-zKMsJGKPhKUv5BhKxBrX-iZR3Ik3I50voSDQ5kmaK9yo6B716AcNbnxesMmrZW_A_72nd5XCobI6TlRAg",
37
37
  "expected": {
38
- "contentId": "ac26z8zkke67z48af3rhh9",
39
- "creatorDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
38
+ "contentId": "3r243h779ekrnraace63882fv8d8389",
39
+ "creatorDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
40
40
  "isDeleted": false,
41
- "currentDocumentCID": "bafyreifniynd6hev646uoajac3egak7p2qfhrhho4mfmppa3rtcjpetgde",
41
+ "currentDocumentCID": "bafyreiejssihkdfljjabdamhkuyibmc743hn3i36a7fnuzsjeoartpe5wa",
42
42
  "length": 2
43
43
  }
44
44
  }
@@ -2,8 +2,8 @@
2
2
  "description": "Content chain: create + delete",
3
3
  "type": "content",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWQydjUyN2lxMzZ2dnUyNWc3b3BjczJudjRjbmRhcWdrd29naHEzdHB3Z215cnBxZWVuZ2EifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoicmVtb3ZpbmcgY29udGVudCJ9.9DTnVeYjVV6Kc971etvWeNn9iMme7RnrRZRmYBO0iaYeePJDblL_p2uuEIuxtAQQp1bATpsQ475zpK6N2A0eAg"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.POTcvRbYb5r_P6ZpJRNAufCkEHmfebUyc1jb_USg7xdG8bwq520HMsg6wWjfrhU8Y-7_86IcLwpldD03_L0-Ag",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFsaXlvenNqaW4yaTd4NHl4ejJwcmJnaGIybGU1YzYycGxsbWxhc3YyaGlhZ3l5ZnZjc2kifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoicmVtb3ZpbmcgY29udGVudCJ9.k_zTEiRy1aPc1d39SQJOCf8yCVaRoYhenun4RJTxBsmDu6TZ5EvBAvXnbFS0DYLE3X1wV1G6YQG6rpxYElG_Ag"
7
7
  ],
8
8
  "signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
9
9
  "documents": [
@@ -13,15 +13,15 @@
13
13
  "format": "short-post",
14
14
  "title": "Hello World",
15
15
  "body": "First post on the protocol.",
16
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
16
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
17
17
  },
18
18
  "baseDocumentCID": null,
19
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
19
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
20
20
  "createdAt": "2026-03-07T00:02:00.000Z"
21
21
  }
22
22
  ],
23
23
  "expected": {
24
- "contentId": "a82z92a3hndk6c97thcrn8",
24
+ "contentId": "cv7n8vkvr64cctf3294h9k4eanhff8z",
25
25
  "isDeleted": true,
26
26
  "currentDocumentCID": null,
27
27
  "length": 2
@@ -2,8 +2,8 @@
2
2
  "description": "Content chain: create + update (with both documents)",
3
3
  "type": "content",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWg2ZTVjYmppdHBvemh6aGdtZmt0bWlvaG14eW4zdWN3aHFkM21qaXhpenZ3bWxodjdobTQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlkaDdlMzZjdnd5M3V3NXlwaXRjcWs3dW9rdGJra2tqN2U2aHhoa3k0bzc1cnhuN2t4aWx1IiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.46H3WBKigCzUrIOvS2ekYJFdK1OeLhqvcZTj8FBqFNKO1ivs3oC0ui_hzTKkKO-8uevMjf9-k0GOjyw2u16PDA"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.POTcvRbYb5r_P6ZpJRNAufCkEHmfebUyc1jb_USg7xdG8bwq520HMsg6wWjfrhU8Y-7_86IcLwpldD03_L0-Ag",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwiY2lkIjoiYmFmeXJlaWJweDRjZ2I0ajZuM216NzY0cHlscmRnNnE3YTQ2bmpuaHg2cDRjcTJybGdldWUzczNldnEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFxYXRnZGd3Z2d1Zmd5NHRzejZldXJ3dWR0ZHh5Z3V6dHQ3bnE1d2dkN3FpNDQ1bnY1NnkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlmZXRwdXRreTRmbnp2N3NyZzdsN3luaWg2ajR5dHplcWlicmNwNXVpZXB2b2x4cWhjYmN5IiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.yTkJOiiCsjIBHmR7773W1pdjC5in_Fl3WUXHl8Y_Hyb47RgfiWVufPirIolnuI-IOOl6zHNNmDfmy6kFROwOAg"
7
7
  ],
8
8
  "signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
9
9
  "documents": [
@@ -13,10 +13,10 @@
13
13
  "format": "short-post",
14
14
  "title": "Hello World",
15
15
  "body": "First post on the protocol.",
16
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
16
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
17
17
  },
18
18
  "baseDocumentCID": null,
19
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
19
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
20
20
  "createdAt": "2026-03-07T00:02:00.000Z"
21
21
  },
22
22
  {
@@ -25,17 +25,17 @@
25
25
  "format": "short-post",
26
26
  "title": "Hello World (edited)",
27
27
  "body": "Updated content.",
28
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
28
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr"
29
29
  },
30
- "baseDocumentCID": "bafyreihzwuoupfg3dxip6xmgzmxsywyii2jeoxxzbgx3zxm2in7knoi3g4",
31
- "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
30
+ "baseDocumentCID": "bafyreievcqrmvtz2pis5tdizt7sjotoqqogl6vrrqga64w2tnwkq2rnudy",
31
+ "createdByDID": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
32
32
  "createdAt": "2026-03-07T00:03:00.000Z"
33
33
  }
34
34
  ],
35
35
  "expected": {
36
- "contentId": "a82z92a3hndk6c97thcrn8",
36
+ "contentId": "cv7n8vkvr64cctf3294h9k4eanhff8z",
37
37
  "isDeleted": false,
38
- "currentDocumentCID": "bafyreidh7e36cvwy3uw5ypitcqk7uoktbkkkj7e6hxhky4o75rxn7kxilu",
38
+ "currentDocumentCID": "bafyreifetputky4fnzv7srg7l7ynih6j4ytzeqibrcp5uiepvolxqhcbcy",
39
39
  "length": 2
40
40
  }
41
41
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "description": "DFOS credential: read access",
3
3
  "type": "credential",
4
- "credential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWMzbmJxemFicmxtbnl2a3o3cXI3Znk2cGd4NGFwdm52eWJvNWtzaGN6bXViaXFzemdod2EifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42IiwiYXVkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoicmVhZCJ9XSwicHJmIjpbXSwiZXhwIjoxNzk4NzYxNjAwLCJpYXQiOjE3NzI4NDE2MDB9.QB-qK89S-sYXaDUkJJSF5ZbsV2djFFvRQlHCj6UDyl-47LZI-ISwwyqRV-zi6MEGdHb0seSkPxpE4if6HHvvCw",
4
+ "credential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWN0aGNiaXp4dmdlbXN4djdrc2NvbzdhcGllYWFsM2Z5ZTM3bzQ1Zmt5a25lN2I0aG9icmEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoicmVhZCJ9XSwicHJmIjpbXSwiZXhwIjoxNzk4NzYxNjAwLCJpYXQiOjE3NzI4NDE2MDB9.UvTItuWFriA39FZIdB5TuXa_b07eyNLc-iR0cej2litSkjBYAZaLlDJUmyDQ-3dB7TmNVXDbB3SMbpvLnWW9Dw",
5
5
  "issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
6
6
  "audiencePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
7
7
  "expected": {
8
- "iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
9
- "aud": "did:dfos:nzkf838efr424433rn2rzk"
8
+ "iss": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
9
+ "aud": "did:dfos:94ah7963n223k8c9884hh27ekh42nea"
10
10
  }
11
11
  }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "description": "DFOS credential: write access (broad + narrowed)",
3
3
  "type": "credential",
4
- "broadCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWh6dDV3Nmt4YnlsZWZ1N2R3ZDRmbnZxdnlueHphNnhud3N6bXpoYml6anVjNnhjeHFkNmEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42IiwiYXVkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.brsN3WSdTLhN5-c0mhDriiKa2FuDD3eW5Mlj3KJYcj0cKQH0RDSACMp3qLeN2DGop-kfOtqtxlS7SAMIuCZGAw",
5
- "narrowCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWFreDQ1ZTJnZm5udmF2a25la3YzMnJleTU3a2lybXA3cTV2YW5teHZ0ajc0NjRqbWJpcXUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42IiwiYXVkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjphODJ6OTJhM2huZGs2Yzk3dGhjcm44IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.ep3NgoKLuKQBohx0Gn6FmroBxEJiV1A3PzKWoBqIJAt6UZqw6f2sLOFNSTb8t9PnONHh5aXuG99OmF7Fyv4mBA",
4
+ "broadCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWZ5aW5ieGhicml0NTZtM2FhdjY2bXc0eGQ2YWRxamFzdmNmaG11NjZnNnRudXFncnljbG0ifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjoqIiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.A-EygURAN2bALVwI2AZKFEuy30ZnWJFBaD4jCTf1d7A90rYELStjTWJ1iI7OulihTCfaVtlvj5HtX6Dwv1VxAg",
5
+ "narrowCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNyZWRlbnRpYWwiLCJraWQiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyI2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwiY2lkIjoiYmFmeXJlaWNiNGVoZWl6eHNrM3N6Ymgyb2dvbXU0cmV1NGd0a2kycHB4NjR6ZW8zeGFrMnh1bWZ2dWkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiREZPU0NyZWRlbnRpYWwiLCJpc3MiOiJkaWQ6ZGZvczpjbm5uZnQ5ZjhhMnJuOTM4ZDZua3ozOHI4NDd2MmtyIiwiYXVkIjoiZGlkOmRmb3M6OTRhaDc5NjNuMjIzazhjOTg4NGhoMjdla2g0Mm5lYSIsImF0dCI6W3sicmVzb3VyY2UiOiJjaGFpbjpjdjduOHZrdnI2NGNjdGYzMjk0aDlrNGVhbmhmZjh6IiwiYWN0aW9uIjoid3JpdGUifV0sInByZiI6W10sImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwfQ.xwsGleofAr78xbT4jCrK402PEI8G_OzvxJITvAjL5ltr7_2bdkX4sCjmZbnjl9m9QcEXnWyWbBgYO8KFl2r8CQ",
6
6
  "issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
7
7
  "audiencePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
8
8
  "expected": {
9
- "iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
10
- "aud": "did:dfos:nzkf838efr424433rn2rzk",
11
- "narrowContentId": "a82z92a3hndk6c97thcrn8"
9
+ "iss": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
10
+ "aud": "did:dfos:94ah7963n223k8c9884hh27ekh42nea",
11
+ "narrowContentId": "cv7n8vkvr64cctf3294h9k4eanhff8z"
12
12
  }
13
13
  }
@@ -2,15 +2,15 @@
2
2
  "description": "Identity chain: genesis + delete (terminal)",
3
3
  "type": "identity",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJjaWQiOiJiYWZ5cmVpYmFuanBnY3FmZmNmaHI0c3B0empmdGhoNXN6b2hoYm81dGpmdWxlbWt3N3VoZGVuNXVxeSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.EDryDK1uvtix-17cHun9t6MacFIx2rMmMF1QLzfD5TFlSsOvMcue97pCgGn3CXeLVFtVxgpCoh0kGSXioKKzAw",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0OCIsImNpZCI6ImJhZnlyZWloZ214ZmlnY2JvZjQ2czRrcGtteXhicXJ3dGxybmE0b2NibmxybzNzN29wanljYW15b3g0In0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpYmFuanBnY3FmZmNmaHI0c3B0empmdGhoNXN6b2hoYm81dGpmdWxlbWt3N3VoZGVuNXVxeSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDE6MDAuMDAwWiJ9.l3X4ojfmfSd2N2tcLL4LlQbP2iaNrsxrgJ-1Wh2T3xNeZ77jgoWYIN6NHI-oYfi9GnwHBPKsOPKoBOoEFUPlAw"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0ODNubjI5enZoZSIsImNpZCI6ImJhZnlyZWlnaWJ5anN2bGt0ZTQ2Zzd6NHIydXd5eHA2eDU1b3RlbzRmcjVuZGE3emFvbHFvbDIyM3hhIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDE6MDAuMDAwWiJ9.7SNEk43hmCoN4vpUELfHNMsHO_H1QBPurEFPH3n2xf3cVR3EvJ1A7-xwf8_f3AmawFNI712jMQTpj9r4jQvQCg"
7
7
  ],
8
8
  "expected": {
9
- "did": "did:dfos:e3vvtck42d4eacdnzvtrn6",
9
+ "did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
10
10
  "isDeleted": true,
11
11
  "controllerKeys": [
12
12
  {
13
- "id": "key_r9ev34fvc23z999veaaft8",
13
+ "id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
14
14
  "type": "Multikey",
15
15
  "publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
16
16
  }
@@ -2,14 +2,14 @@
2
2
  "description": "Identity chain: genesis (single create operation)",
3
3
  "type": "identity",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJjaWQiOiJiYWZ5cmVpYmFuanBnY3FmZmNmaHI0c3B0empmdGhoNXN6b2hoYm81dGpmdWxlbWt3N3VoZGVuNXVxeSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.EDryDK1uvtix-17cHun9t6MacFIx2rMmMF1QLzfD5TFlSsOvMcue97pCgGn3CXeLVFtVxgpCoh0kGSXioKKzAw"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg"
6
6
  ],
7
7
  "expected": {
8
- "did": "did:dfos:e3vvtck42d4eacdnzvtrn6",
8
+ "did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
9
9
  "isDeleted": false,
10
10
  "controllerKeys": [
11
11
  {
12
- "id": "key_r9ev34fvc23z999veaaft8",
12
+ "id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
13
13
  "type": "Multikey",
14
14
  "publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
15
15
  }
@@ -2,15 +2,15 @@
2
2
  "description": "Identity chain: genesis + key rotation",
3
3
  "type": "identity",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJjaWQiOiJiYWZ5cmVpYmFuanBnY3FmZmNmaHI0c3B0empmdGhoNXN6b2hoYm81dGpmdWxlbWt3N3VoZGVuNXVxeSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.EDryDK1uvtix-17cHun9t6MacFIx2rMmMF1QLzfD5TFlSsOvMcue97pCgGn3CXeLVFtVxgpCoh0kGSXioKKzAw",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0OCIsImNpZCI6ImJhZnlyZWljeW00Y3lpZWRubGQ3M3NtYngzMnN6YWVpN3hkdWxxbjRnM3N0ZTVlMncydWxhanIzb3FtIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpYmFuanBnY3FmZmNmaHI0c3B0empmdGhoNXN6b2hoYm81dGpmdWxlbWt3N3VoZGVuNXVxeSIsImF1dGhLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJhc3NlcnRLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJjb250cm9sbGVyS2V5cyI6W3siaWQiOiJrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZCIsInR5cGUiOiJNdWx0aWtleSIsInB1YmxpY0tleU11bHRpYmFzZSI6Ino2TWtmVWQ2NUpyQWhmZGdGdU1DY2NVOVRoUXZqQjJmSkFNVUhrdXVhakY5OTJnSyJ9XSwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowMTowMC4wMDBaIn0.MScuoBlgOK3j5QX9tFcw1ou0o4LgJziGJEsZ5pvqiBr1SagAyAv5h-wajQhtg8IP7dLlM0U4leW2iRra945cDg"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAwOjAwLjAwMFoifQ.TeznHnzrtKOGTr0FzkDL2z-luMWnAbKXrmDbi-Exgw_xMPCnYwGHORMjw-BM28f0RoTirIAeD7d20W5RSuGuBg",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoiZGlkOmRmb3M6Y25ubmZ0OWY4YTJybjkzOGQ2bmt6MzhyODQ3djJrciNrZXlfcjlldjM0ZnZjMjN6OTk5dmVhYWZ0ODNubjI5enZoZSIsImNpZCI6ImJhZnlyZWliZnVoNjN1djMzaTJpNWVvb2UzYm9pdDJydXlqZWh1YnNyeWVtdXV6Nm1ydGxlajI2cmVpIn0.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpY29naHZqem52bGl1bG94eG1iZjU0dHB6cXdhaG5xcGlsazduY3hlcGppbmVkcGtnYTNuZSIsImF1dGhLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJhc3NlcnRLZXlzIjpbeyJpZCI6ImtleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkbjd6NnpyY3Q4IiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa2ZVZDY1SnJBaGZkZ0Z1TUNjY1U5VGhRdmpCMmZKQU1VSGt1dWFqRjk5MmdLIn1dLCJjb250cm9sbGVyS2V5cyI6W3siaWQiOiJrZXlfZXo5YTg3NHRja3IzZHY5MzNkM2NrZG43ejZ6cmN0OCIsInR5cGUiOiJNdWx0aWtleSIsInB1YmxpY0tleU11bHRpYmFzZSI6Ino2TWtmVWQ2NUpyQWhmZGdGdU1DY2NVOVRoUXZqQjJmSkFNVUhrdXVhakY5OTJnSyJ9XSwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowMTowMC4wMDBaIn0.7fqvWGEVYW9atA1uqpp7lIUOWp4dATLpLjOmFWzJN-8gTL-QnXDCeyGcBu5AXhHzO52fauwUavh1KrB6wBYuCw"
7
7
  ],
8
8
  "expected": {
9
- "did": "did:dfos:e3vvtck42d4eacdnzvtrn6",
9
+ "did": "did:dfos:cnnnft9f8a2rn938d6nkz38r847v2kr",
10
10
  "isDeleted": false,
11
11
  "controllerKeys": [
12
12
  {
13
- "id": "key_ez9a874tckr3dv933d3ckd",
13
+ "id": "key_ez9a874tckr3dv933d3ckdn7z6zrct8",
14
14
  "type": "Multikey",
15
15
  "publicKeyMultibase": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK"
16
16
  }
@@ -0,0 +1,38 @@
1
+ {
2
+ "description": "Identity chain: genesis publishing a services set (relay locator + content/artifact anchors)",
3
+ "type": "identity",
4
+ "chain": [
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmlkZW50aXR5LW9wIiwia2lkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJjaWQiOiJiYWZ5cmVpZGkzcXBzM3F0dHFwMjJtM3kzM2JkYmYyaXlrYnE1cjQ1ampod2EzN21nZXNvdjdzZGd6ZSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiYXV0aEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImFzc2VydEtleXMiOlt7ImlkIjoia2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgzbm4yOXp2aGUiLCJ0eXBlIjoiTXVsdGlrZXkiLCJwdWJsaWNLZXlNdWx0aWJhc2UiOiJ6Nk1rcnpMTU53b0pTVjRQM1ljY1djYnRrOHZkOUx0Z01LbkxlYURMVXFMdUFTamIifV0sImNvbnRyb2xsZXJLZXlzIjpbeyJpZCI6ImtleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4M25uMjl6dmhlIiwidHlwZSI6Ik11bHRpa2V5IiwicHVibGljS2V5TXVsdGliYXNlIjoiejZNa3J6TE1Od29KU1Y0UDNZY2NXY2J0azh2ZDlMdGdNS25MZWFETFVxTHVBU2piIn1dLCJzZXJ2aWNlcyI6W3siaWQiOiJyZWxheSIsInR5cGUiOiJEZm9zUmVsYXkiLCJlbmRwb2ludCI6Imh0dHBzOi8vcmVsYXkuZGZvcy5jb20ifSx7ImlkIjoicHJvZmlsZSIsInR5cGUiOiJDb250ZW50QW5jaG9yIiwibGFiZWwiOiJwcm9maWxlIiwiYW5jaG9yIjoiY3Y3bjh2a3ZyNjRjY3RmMzI5NGg5azRlYW5oZmY4eiJ9LHsiaWQiOiJhdmF0YXIiLCJ0eXBlIjoiQ29udGVudEFuY2hvciIsImxhYmVsIjoiYXZhdGFyIiwiYW5jaG9yIjoiYmFmeXJlaWV2Y3FybXZ0ejJwaXM1dGRpenQ3c2pvdG9xcW9nbDZ2cnJxZ2E2NHcydG53a3Eycm51ZHkifV0sImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDU6MDAuMDAwWiJ9.HCzVJXcUzL62lxtC8omBlit1JNSWk4b4kQKjjjWT00honzZ9-k3dKusIRuhTV6gjT1M74bLVZYUxPb8kJvhHAw"
6
+ ],
7
+ "controllerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
8
+ "expected": {
9
+ "did": "did:dfos:zhkrrzrd7z623ha8tt7dt699de8r3ar",
10
+ "isDeleted": false,
11
+ "controllerKeys": [
12
+ {
13
+ "id": "key_r9ev34fvc23z999veaaft83nn29zvhe",
14
+ "type": "Multikey",
15
+ "publicKeyMultibase": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb"
16
+ }
17
+ ],
18
+ "services": [
19
+ {
20
+ "id": "relay",
21
+ "type": "DfosRelay",
22
+ "endpoint": "https://relay.dfos.com"
23
+ },
24
+ {
25
+ "id": "profile",
26
+ "type": "ContentAnchor",
27
+ "label": "profile",
28
+ "anchor": "cv7n8vkvr64cctf3294h9k4eanhff8z"
29
+ },
30
+ {
31
+ "id": "avatar",
32
+ "type": "ContentAnchor",
33
+ "label": "avatar",
34
+ "anchor": "bafyreievcqrmvtz2pis5tdizt7sjotoqqogl6vrrqga64w2tnwkq2rnudy"
35
+ }
36
+ ]
37
+ }
38
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@metalabel/dfos-protocol",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
- "description": "DFOS Protocol — Ed25519 signed chain primitives, beacons, merkle trees, and verification",
5
+ "description": "DFOS Protocol — Ed25519 signed chain primitives, services, credentials, and verification",
6
6
  "license": "MIT",
7
7
  "author": "Metalabel <hello@metalabel.com> (https://metalabel.com)",
8
8
  "repository": {
@@ -37,10 +37,6 @@
37
37
  "import": "./dist/chain/index.js",
38
38
  "types": "./dist/chain/index.d.ts"
39
39
  },
40
- "./merkle": {
41
- "import": "./dist/merkle/index.js",
42
- "types": "./dist/merkle/index.d.ts"
43
- },
44
40
  "./credentials": {
45
41
  "import": "./dist/credentials/index.js",
46
42
  "types": "./dist/credentials/index.d.ts"
@@ -54,19 +50,19 @@
54
50
  "README.md"
55
51
  ],
56
52
  "dependencies": {
57
- "@ipld/dag-cbor": "^9.2.5",
58
- "@noble/curves": "^2.0.1",
59
- "@noble/hashes": "^2.0.1",
60
- "multiformats": "^13.4.2",
61
- "zod": "^4.3.6"
53
+ "@ipld/dag-cbor": "^10.0.1",
54
+ "@noble/curves": "^2.2.0",
55
+ "@noble/hashes": "^2.2.0",
56
+ "multiformats": "^14.0.0",
57
+ "zod": "^4.4.3"
62
58
  },
63
59
  "devDependencies": {
64
60
  "@types/node": "^24.10.4",
65
- "ajv": "^8.18.0",
61
+ "ajv": "^8.20.0",
66
62
  "ajv-formats": "^3.0.1",
67
63
  "tsup": "^8.5.1",
68
- "tsx": "^4.21.0",
69
- "vitest": "^4.1.2"
64
+ "tsx": "^4.22.4",
65
+ "vitest": "^4.1.8"
70
66
  },
71
67
  "scripts": {
72
68
  "build": "tsup",
@@ -1,99 +0,0 @@
1
- // src/merkle/tree.ts
2
- var sha256 = async (data) => {
3
- const buf = await crypto.subtle.digest("SHA-256", data);
4
- return new Uint8Array(buf);
5
- };
6
- var toHex = (bytes) => {
7
- return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
8
- };
9
- var hexToBytes = (hex) => {
10
- const bytes = new Uint8Array(hex.length / 2);
11
- for (let i = 0; i < hex.length; i += 2) {
12
- bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
13
- }
14
- return bytes;
15
- };
16
- var concat = (a, b) => {
17
- const result = new Uint8Array(a.length + b.length);
18
- result.set(a, 0);
19
- result.set(b, a.length);
20
- return result;
21
- };
22
- var hashLeaf = async (contentId) => {
23
- return sha256(new TextEncoder().encode(contentId));
24
- };
25
- var hashInterior = async (left, right) => {
26
- return sha256(concat(left, right));
27
- };
28
- var buildMerkleTree = async (contentIds) => {
29
- const sorted = [...new Set(contentIds)].sort();
30
- if (sorted.length === 0) return { root: null, leafCount: 0 };
31
- let level = await Promise.all(sorted.map(hashLeaf));
32
- while (level.length > 1) {
33
- const nextLevel = [];
34
- for (let i = 0; i < level.length; i += 2) {
35
- if (i + 1 < level.length) {
36
- nextLevel.push(await hashInterior(level[i], level[i + 1]));
37
- } else {
38
- nextLevel.push(level[i]);
39
- }
40
- }
41
- level = nextLevel;
42
- }
43
- return { root: toHex(level[0]), leafCount: sorted.length };
44
- };
45
-
46
- // src/merkle/proof.ts
47
- var generateMerkleProof = async (contentIds, targetId) => {
48
- const sorted = [...new Set(contentIds)].sort();
49
- const targetIdx = sorted.indexOf(targetId);
50
- if (targetIdx < 0) return null;
51
- const { root } = await buildMerkleTree(sorted);
52
- if (!root) return null;
53
- const leaves = await Promise.all(sorted.map(hashLeaf));
54
- const path = [];
55
- let level = leaves;
56
- let idx = targetIdx;
57
- while (level.length > 1) {
58
- const nextLevel = [];
59
- const nextIdx = Math.floor(idx / 2);
60
- for (let i = 0; i < level.length; i += 2) {
61
- if (i + 1 < level.length) {
62
- if (i === idx || i + 1 === idx) {
63
- const siblingIdx = i === idx ? i + 1 : i;
64
- path.push({
65
- hash: toHex(level[siblingIdx]),
66
- position: siblingIdx < idx ? "left" : "right"
67
- });
68
- }
69
- const interior = await sha256(concat(level[i], level[i + 1]));
70
- nextLevel.push(interior);
71
- } else {
72
- nextLevel.push(level[i]);
73
- }
74
- }
75
- level = nextLevel;
76
- idx = nextIdx;
77
- }
78
- return { contentId: targetId, root, path };
79
- };
80
- var verifyMerkleProof = async (proof) => {
81
- let current = await hashLeaf(proof.contentId);
82
- for (const step of proof.path) {
83
- const sibling = hexToBytes(step.hash);
84
- if (step.position === "left") {
85
- current = await sha256(concat(sibling, current));
86
- } else {
87
- current = await sha256(concat(current, sibling));
88
- }
89
- }
90
- return toHex(current) === proof.root;
91
- };
92
-
93
- export {
94
- hexToBytes,
95
- hashLeaf,
96
- buildMerkleTree,
97
- generateMerkleProof,
98
- verifyMerkleProof
99
- };
@@ -1,45 +0,0 @@
1
- declare const hexToBytes: (hex: string) => Uint8Array;
2
- /**
3
- * Hash a leaf node — SHA-256 of UTF-8 encoded contentId
4
- */
5
- declare const hashLeaf: (contentId: string) => Promise<Uint8Array>;
6
- /**
7
- * Build a sorted binary Merkle tree over content identifiers
8
- *
9
- * ContentIds are sorted lexicographically, hashed to leaves, then paired
10
- * and hashed up to the root. Odd nodes are promoted to the next level.
11
- *
12
- * Returns null root for empty input. Deduplicates contentIds.
13
- */
14
- declare const buildMerkleTree: (contentIds: string[]) => Promise<{
15
- root: string | null;
16
- leafCount: number;
17
- }>;
18
-
19
- interface MerkleProof {
20
- /** The contentId being proven */
21
- contentId: string;
22
- /** Hex SHA-256 root of the tree */
23
- root: string;
24
- /** Sibling hashes along the path from leaf to root */
25
- path: Array<{
26
- /** Hex SHA-256 of sibling node */
27
- hash: string;
28
- /** Position of the sibling relative to the current node */
29
- position: 'left' | 'right';
30
- }>;
31
- }
32
- /**
33
- * Generate an inclusion proof for a contentId in the set
34
- *
35
- * Returns null if the contentId is not in the set.
36
- */
37
- declare const generateMerkleProof: (contentIds: string[], targetId: string) => Promise<MerkleProof | null>;
38
- /**
39
- * Verify a Merkle inclusion proof
40
- *
41
- * Recomputes the root from the leaf and proof path, compares to the claimed root.
42
- */
43
- declare const verifyMerkleProof: (proof: MerkleProof) => Promise<boolean>;
44
-
45
- export { type MerkleProof, buildMerkleTree, generateMerkleProof, hashLeaf, hexToBytes, verifyMerkleProof };