@forgesworn/fold-kit 0.8.0 → 0.10.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.
@@ -0,0 +1,675 @@
1
+ {
2
+ "protocolVersion": "kithmoot/v1",
3
+ "generatedBy": "scripts/generate-destruct.mjs (forgesworn/fold-kit)",
4
+ "nostrToolsVersion": "2.25.0",
5
+ "groups": {
6
+ "destruct": [
7
+ {
8
+ "name": "destruct-invitation",
9
+ "kind": "positive",
10
+ "note": "A kind-1463 group invitation for a conference room that self-destructs: `\"destruct\": true` inside the encrypted body, after `ends` and before `relays` (body order v, room, secret, ends, destruct, relays), and never as a tag, so a relay cannot tell it from any other invitation. A reader accepts the flag only as `true` (see `destruct-invitation-malformed`) and reports it as `destruct: true` on the admission. `randomHex`: the body nonce, the aux-rand. `unflagged` is the same invitation with the same draws and no flag, which is every invitation before 0.9.0: its body is `bodyJson` without `\"destruct\":true,`. `oldReader` is what a 0.8.0 reader makes of the flagged event: the same admission without `destruct`, so an old client joins and ends the room the old way.",
11
+ "input": {
12
+ "invitation": {
13
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
14
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
15
+ "persistent": true
16
+ },
17
+ "inviterSkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
18
+ "roomSecretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
19
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
20
+ "createdAt": 1800000000,
21
+ "endsAt": 1800086400,
22
+ "relays": [
23
+ "wss://relay.example.com/"
24
+ ],
25
+ "event": {
26
+ "id": "526ed7535a2ead66313654f6b97a86af4d827af11b005ce2d248c675097d5c78",
27
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
28
+ "created_at": 1800000000,
29
+ "kind": 1463,
30
+ "tags": [
31
+ [
32
+ "d",
33
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
34
+ ],
35
+ [
36
+ "expiration",
37
+ "1800086400"
38
+ ]
39
+ ],
40
+ "content": "AhKIoHqYG4uOcnjHZ/7EHKpG1oknjFfGX/gvvT2u9PAIJYXCDlIPSvR5TutkG+Nx5hGvco9Z/C40vaXhVi4PNy7fETWGqCb+hFLpnZokAB2a2111Zc42hFUOrLnmahl6LXJdVtkgesGXnYe9LrskUR+PekcO+GazVPxDc7TOZRaCPd6tWLB37U+1o7w+jhyBPHZvurz59i7EqCK4cYgQox03i7JlXxOvT9I6ebQJJM5f1Z6zYmvuPIWMklHJEnJAGFFQ9JkhX3yQlTlYjhRn3e+B1ct3mAxFL5qoWBWXZ4TtTo4bINzqVBHWpnLmvZjhXBhGTVDJc6H8+azqOVhEqktzvIcn+TAGzVX5rywXlR3ZgNVLORtp/k70KakDt1dkKIp5",
41
+ "sig": "3db32e6460f29f804c3502a4156bec06d00ee4fa3f6e29c57193149d50d3c71075cfa930a981f89dd9919791d073c795a0f039a0061f0c1e9b18e19ea44f2afd"
42
+ },
43
+ "randomHex": [
44
+ "1288a07a981b8b8e7278c767fec41caa46d689278c57c65ff82fbd3daef4f008",
45
+ "e70b320ea3f8ea2efc3b6120d3a07908ee32f1d438332c02513ef5dde2d30d7e"
46
+ ],
47
+ "unflagged": {
48
+ "event": {
49
+ "id": "5b31789aca6f969e7472688636bd8ad236eb79a572f2b80793bfc1ac75288870",
50
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
51
+ "created_at": 1800000000,
52
+ "kind": 1463,
53
+ "tags": [
54
+ [
55
+ "d",
56
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
57
+ ],
58
+ [
59
+ "expiration",
60
+ "1800086400"
61
+ ]
62
+ ],
63
+ "content": "AhKIoHqYG4uOcnjHZ/7EHKpG1oknjFfGX/gvvT2u9PAIJZXCDlIPSvR5TutkG+Nx5hGvco9Z/C40vaXhVi4PNy7fETWGqCb+hFLpnZokAB2a2111Zc42hFUOrLnmahl6LXJdVtkgesGXnYe9LrskUR+PekcO+GazVPxDc7TOZRaCPd6tWLB37U+1o7w+jhyBPHZvurz59i7EqCK4cYgQox03i7JlXxOvT9I6ebQJJM5f1Z6zYmvuPIWMklHJEmRAB0Rb8thvJmSTlD8HjRln3e+B1ZYw2jYKKIW+TFnXeM6jcopWJM9Fcgn6nvuxBCDzIw8Cd4g8OKdKXeX9664RPqCRCA==",
64
+ "sig": "36a5dc73f330985626d91edaabd1a2fa6f3a27b885834fa6d8f4895f04a6dfe772feff95b79be0c20b15e878869844acf32189968191cbf209767622367824e0"
65
+ },
66
+ "randomHex": [
67
+ "1288a07a981b8b8e7278c767fec41caa46d689278c57c65ff82fbd3daef4f008",
68
+ "e70b320ea3f8ea2efc3b6120d3a07908ee32f1d438332c02513ef5dde2d30d7e"
69
+ ]
70
+ }
71
+ },
72
+ "output": {
73
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"ends\":1800086400,\"destruct\":true,\"relays\":[\"wss://relay.example.com/\"]}",
74
+ "unflaggedBodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"ends\":1800086400,\"relays\":[\"wss://relay.example.com/\"]}",
75
+ "admission": {
76
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
77
+ "persistent": true,
78
+ "epoch": 0,
79
+ "endsAt": 1800086400,
80
+ "relays": [
81
+ "wss://relay.example.com/"
82
+ ],
83
+ "destruct": true
84
+ },
85
+ "unflaggedAdmission": {
86
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
87
+ "persistent": true,
88
+ "epoch": 0,
89
+ "endsAt": 1800086400,
90
+ "relays": [
91
+ "wss://relay.example.com/"
92
+ ]
93
+ },
94
+ "oldReader": {
95
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
96
+ "persistent": true,
97
+ "epoch": 0,
98
+ "endsAt": 1800086400,
99
+ "relays": [
100
+ "wss://relay.example.com/"
101
+ ]
102
+ }
103
+ }
104
+ },
105
+ {
106
+ "name": "destruct-invitation-no-end",
107
+ "kind": "positive",
108
+ "note": "A group invitation with `destruct` and no `ends`: valid. The room has no fixed end and self-destructs when its authority closes it. No expiration tag, as for any group with no end. `randomHex`: the body nonce, the aux-rand.",
109
+ "input": {
110
+ "invitation": {
111
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
112
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
113
+ "persistent": true
114
+ },
115
+ "inviterSkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
116
+ "roomSecretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
117
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
118
+ "createdAt": 1800000000,
119
+ "event": {
120
+ "id": "824d7c025cda000955e697611ac8715cd04260bb71ac2b189325d421f5cc977b",
121
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
122
+ "created_at": 1800000000,
123
+ "kind": 1463,
124
+ "tags": [
125
+ [
126
+ "d",
127
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
128
+ ]
129
+ ],
130
+ "content": "Ar2/gSpXQYq/bOeYByDqnIjpXz+MkD5ZeS3d/zm3xXgfbKpwDAY4YHFki6YgOB91OIoom0qFYQ/7L3hykgYI+5sjoFHReBK5T4tdM2RZsUsuNGztNC6PHuCuxWoR3t1+li3Xk0GW1s5RjbGjWAHFMl/3/HGj9zTaLwgfwy1T61bLlcLYxhtRkF6IHHsNegpjRP6fiq3cGY661hG3+PkcOTjIDtSZdvzPG7KbvZmuFXBJ611pApyK8VfZICk+mC2ls9Gj609S2guZoBntEnQdAmsSK9st+UXeVtMR18850DlKLgY=",
131
+ "sig": "c576a3a1e3149b723136ced230d5934e2f1fb18abaaba95a88069f9db0f62edc92472881a772e133a580b264d3ad64e3242afaca0114ee7b22a9117825c341b3"
132
+ },
133
+ "randomHex": [
134
+ "bdbf812a57418abf6ce7980720ea9c88e95f3f8c903e59792dddff39b7c5781f",
135
+ "556b37bc374f271443b645f473fe0fc07ef5384c628e3a14cc936136f8dccb3d"
136
+ ]
137
+ },
138
+ "output": {
139
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"destruct\":true}",
140
+ "admission": {
141
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
142
+ "persistent": true,
143
+ "epoch": 0,
144
+ "destruct": true
145
+ },
146
+ "oldReader": {
147
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
148
+ "persistent": true,
149
+ "epoch": 0
150
+ }
151
+ }
152
+ },
153
+ {
154
+ "name": "destruct-invitation-malformed",
155
+ "kind": "negative",
156
+ "note": "Group invitations signed by the inviter whose body carries `destruct` as something other than `true`: `false`, the string `\"true\"`, `1`, `null`. Built by hand (`bodyJson`, then `randomHex`: the body nonce, the aux-rand). A reader refuses each envelope outright (null), as it refuses a malformed `ends`. A 0.8.0 reader, which never looks at the field, still admits each one (`oldReader`).",
157
+ "input": {
158
+ "invitation": {
159
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
160
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
161
+ "persistent": true
162
+ },
163
+ "inviterSkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
164
+ "roomSecretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
165
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
166
+ "cases": {
167
+ "false": {
168
+ "event": {
169
+ "id": "99bb8b1f573f4c0bf83a43e7f9d22fb3d5798dc1c6f34a897afd0e5c33341482",
170
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
171
+ "created_at": 1800000000,
172
+ "kind": 1463,
173
+ "tags": [
174
+ [
175
+ "d",
176
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
177
+ ]
178
+ ],
179
+ "content": "Auri0a+JHb2EUxVXoLZ7pCtFilbL6S8+xF0q5zBJKVpeaRq0c86+ZnMcHmfp+5tm/DX+XdKXmX9yOMLz8mkKt3n2ZJg+GgnC/t1L0LlokgaVH4CPGT8+C7yTiJFIFdNF6c76Ta+t2cZuatA+PQTHruBDafFG8BvTYpWeEHlyiYrdbRplFg4jso37JisPZB2g48GLKwQQHR1qjyfKd+nKPqFbG3mDVe82ISAntabZz855S3fqzMW+roGKb8tksDe4SS2Zqvg0pozhgxCaTw1gC92loFh6DSDltz/vyZR9pYcMwQ0=",
180
+ "sig": "614e6bd4dd94ce5569c157bd00f3afdac875656eb0beac417aa7544c82673eafd4c7941a1bace18268a4e374e2ed3e2231df32d15e5d63633347bd3e62a2bc53"
181
+ },
182
+ "randomHex": [
183
+ "eae2d1af891dbd84531557a0b67ba42b458a56cbe92f3ec45d2ae73049295a5e",
184
+ "ced40f26ae7e9c2907fbdce2991a8daacefb7739c0780b4e186f4d07f2775ea8"
185
+ ],
186
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"destruct\":false}"
187
+ },
188
+ "string": {
189
+ "event": {
190
+ "id": "e00d2125c88e132c21ce1519d17cdd541467240210dc4c5fc9520b2c495a8f96",
191
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
192
+ "created_at": 1800000000,
193
+ "kind": 1463,
194
+ "tags": [
195
+ [
196
+ "d",
197
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
198
+ ]
199
+ ],
200
+ "content": "AoSjS3R7pOmM6LqSsTwJC38zSylOxll/zIGx620jEFSMCxtmiegakh9oyofzUB5yncm6wHTAC9xjNh9PrfN2U3L3XHo0Wi5RcqKT6kPvYLKFzbKlXefM1V3uxiaFLsAW3sErkOIWKbC7+4ZVW8LDQv58PKeXPY9E68qxq78Wbbd9i1RW1dSdmZzBhGDIQB5xRP+sZXwtXEhnaL84lE4vXwGJI87eWMC0iC8vAiKiiuQfldgDqzyhHYZjE3IHAYX2nAqmD0PdEwOBj1fsjrb7g0hs+LPnXqNiP22SsyEIlqk1OH8=",
201
+ "sig": "fc52b06b5d089bb6837f6cb4fd501927abcd5cf8973f0a48946ee0912e74ad63c9a8588a47f328b6e1030a1204333a37ce6d8d6d72b114893a85392b2426253f"
202
+ },
203
+ "randomHex": [
204
+ "84a34b747ba4e98ce8ba92b13c090b7f334b294ec6597fcc81b1eb6d2310548c",
205
+ "b4114d68af4779911af998dd2d43e56db75fd2e686e8bf63e43cdabc2755ed1d"
206
+ ],
207
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"destruct\":\"true\"}"
208
+ },
209
+ "number": {
210
+ "event": {
211
+ "id": "f97f3de9b8b1227b9fe5f911dfaab269f5a6927df6f612688b9fd934ca87cc09",
212
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
213
+ "created_at": 1800000000,
214
+ "kind": 1463,
215
+ "tags": [
216
+ [
217
+ "d",
218
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
219
+ ]
220
+ ],
221
+ "content": "AmHcx8yLgRa/Oa+sIw47P4MwMV2AuEORn1XSQQWV+oz4Fgbj3HSNanTE2MC8iV4j4w3UmHrLA62SV7Plti2xjDwhYJTW+XJMLu2on/PS/lt/Kl2XvAHXnHrJ/gNSma+JpJyL/YIW3aNbaWp/yHQossFjr+t7A7Ej3oz6tHdrdaaQpH1vfyg44hC+T0dlKr+0xZg23Is4Uf0TsM287oNru2JhV6+CqET4MGpUaFvxKulSRQpvX+tZPHwSQHplf+lFvHvZUpErDzqhS8tmH34VEIhCPnT25mpu8NKBr3HN0xyrl+8=",
222
+ "sig": "cd714956b3e96a6deccc1654ff823de404cfb85d548c0f9b478c35e0507dff960b146a56f41a34ccf59192d255ca488a216edc3c4b261508fe86c2e1fc5f4133"
223
+ },
224
+ "randomHex": [
225
+ "61dcc7cc8b8116bf39afac230e3b3f8330315d80b843919f55d2410595fa8cf8",
226
+ "cc4d068aff3fa914a212bf68ed39d9b402c2f7bc8c540acb490b3d017f476ac9"
227
+ ],
228
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"destruct\":1}"
229
+ },
230
+ "null": {
231
+ "event": {
232
+ "id": "a31ba9cf7106813bd2d01de861e7f612be29adcbc84879fed99bb3b0b98d536e",
233
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
234
+ "created_at": 1800000000,
235
+ "kind": 1463,
236
+ "tags": [
237
+ [
238
+ "d",
239
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
240
+ ]
241
+ ],
242
+ "content": "AsvyriQzQy6dRH/yC3e8fNvxU5i/lR8OixB3yVytXzq7+3SYS4KZzKfQYNzSndix9QQYHUgO2S5euVOTo19DMCbpC1IrnIL4UfFWgSx4XqzFfQGQ4UtXO9S+gRJjzkyJHrvNETeIrotXcAABG1Mo/gr6nHhhAMw1+YiPH9RJMFwb8djuBjfVriwEQwq6IFn8IctDDy9DA8Ami8zNVxcX9Fn1Iw0JHZsLpMN7xC4DMEW35IxUHg0kRB2sLPTfv8+DChAmWHj4vk737sIQqJ1cSuuBm7G1w6Olo0ybM7eJAt9YWhI=",
243
+ "sig": "f828a69d9e58c976180f848142d154faf4c0338d09cf74fb92597ab89a63a49cd12f38f145658dc3ce84e80a1df83c083263da5d548debfd6bdf744a763a4001"
244
+ },
245
+ "randomHex": [
246
+ "cbf2ae2433432e9d447ff20b77bc7cdbf15398bf951f0e8b1077c95cad5f3abb",
247
+ "006a1daf9bd649cd57d2e5cbf4c51a8549fb5bfbd0035fdbac1d89be0a76b3e2"
248
+ ],
249
+ "bodyJson": "{\"v\":3,\"room\":\"629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6\",\"secret\":\"dtp2VlDxGbZKTJCMSQmS0SVia9JyyQuLM2IBCJI1big\",\"destruct\":null}"
250
+ }
251
+ }
252
+ },
253
+ "output": {
254
+ "admission": {
255
+ "false": null,
256
+ "string": null,
257
+ "number": null,
258
+ "null": null
259
+ },
260
+ "oldReader": {
261
+ "false": {
262
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
263
+ "persistent": true,
264
+ "epoch": 0
265
+ },
266
+ "string": {
267
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
268
+ "persistent": true,
269
+ "epoch": 0
270
+ },
271
+ "number": {
272
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
273
+ "persistent": true,
274
+ "epoch": 0
275
+ },
276
+ "null": {
277
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
278
+ "persistent": true,
279
+ "epoch": 0
280
+ }
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "name": "destruct-invitation-copies",
286
+ "kind": "positive",
287
+ "note": "Two signed copies of one group invitation that disagree: `older` (created_at NOW) self-destructs, `newer` (NOW + 60) names the room relays and has no flag. `requestPersistentRoomAdmission` hears both and admits with `destruct: true` in either order (`olderFirst`, `newerFirst`; `alone` is each copy read by itself): self-destruct is sticky, as the earlier `ends` is, so a stale or careless copy can never keep a room's content alive. The relays still come from the newest copy that names any. `randomHex` on each: the body nonce, the aux-rand.",
288
+ "input": {
289
+ "invitation": {
290
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
291
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
292
+ "persistent": true
293
+ },
294
+ "inviterSkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
295
+ "roomSecretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
296
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
297
+ "older": {
298
+ "event": {
299
+ "id": "bf927b24f6956b3b51c4db990fb34e194e33efe3e1c9c43aa51653e41c52f9db",
300
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
301
+ "created_at": 1800000000,
302
+ "kind": 1463,
303
+ "tags": [
304
+ [
305
+ "d",
306
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
307
+ ]
308
+ ],
309
+ "content": "AjHpz19NgPNarY9R7eWHpy4k3zsjLXvATwVknx+DPW05EKLaaWW/XgjOw8aPMVwqt1ZaolyOMT6s2gUerWCaEIp38NjKsirkNmpKCw3cd3Ouzzu2nn5+QgGJAMH3OaZSRu4Zu9b/VqO/HhMrWQ92XILwuutTn+BrrwoJmG4V571RpS866L0XM9JE2Mkup/zuzZvmhoqQC30fwUMqlNvWilAuJF9MVW0nzw0+nVBXQkf3mQZmDAa053Jfpi4UJ3ENu1TMZ73r/LDlgFlavIhC7eS7DRwb3/Kl75hVhdfFv1O7R6A=",
310
+ "sig": "ab8d460d5d571859ad59d7ec17675f2a9c63abed76c09837626c7ef548f455959ca63168af56ab9122ffa54e8a84ecdb176ca252822f48d7b7faa511c9cb61e3"
311
+ },
312
+ "randomHex": [
313
+ "31e9cf5f4d80f35aad8f51ede587a72e24df3b232d7bc04f05649f1f833d6d39",
314
+ "aed5df214155aefbdd54cdf7eb415014ba000d9a4f1f787e09f17ec5d03cd3f4"
315
+ ]
316
+ },
317
+ "newer": {
318
+ "event": {
319
+ "id": "50457bca51dd68b0d15cb16c5d3ebe7c5e748e3ea460edf204900f73de9dd074",
320
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
321
+ "created_at": 1800000060,
322
+ "kind": 1463,
323
+ "tags": [
324
+ [
325
+ "d",
326
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
327
+ ]
328
+ ],
329
+ "content": "AiSsGzVre7NuU2R1ilNei7Np9z/Rg1ijlatOwpbs8s31YE9g/IDAm9iTlkZlezUCRz4et94GEr1h38NGMjTWbQzLYn10jhxy0+o4sUXP1DNLVIBkIMShLReqDxQC7sC/pDHxplHslGnB8CBxfEafsMQLv8A8UxWp7NZio7sGCNe6a95ZazFqokLImMrmJpjkqCbIFqzGzoH6HElvEVKMWTSS4YpGLYk2tjH7h8KlJYoxr3jPV5dAOKLCwAGMJ2LWGs9DLfIjWmdPnSPQPdQK214ZsNuPst1ObckGmb88UozIpW/ppOr5uS7q7eFSyYq/tJVJAlmQUVuih6pi4L7ZBJC0AQ==",
330
+ "sig": "450526ef0933591e9e3af2cddaf7936dc43247f8ab5427bd65fbd55c2b62a0710aabc25e70515f4216c41df14a636c0cf6a3d3006f8750c1ef43c680d2f6aafb"
331
+ },
332
+ "randomHex": [
333
+ "24ac1b356b7bb36e5364758a535e8bb369f73fd18358a395ab4ec296ecf2cdf5",
334
+ "f7c71d2ef1e5e0ca0962d40476ace63fb43012c671ba6e6a7c9130060beda77b"
335
+ ]
336
+ }
337
+ },
338
+ "output": {
339
+ "olderFirst": {
340
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
341
+ "persistent": true,
342
+ "epoch": 0,
343
+ "relays": [
344
+ "wss://relay.example.com/"
345
+ ],
346
+ "destruct": true
347
+ },
348
+ "newerFirst": {
349
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
350
+ "persistent": true,
351
+ "epoch": 0,
352
+ "relays": [
353
+ "wss://relay.example.com/"
354
+ ],
355
+ "destruct": true
356
+ },
357
+ "alone": {
358
+ "older": {
359
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
360
+ "persistent": true,
361
+ "epoch": 0,
362
+ "destruct": true
363
+ },
364
+ "newer": {
365
+ "secretHex": "76da765650f119b64a4c908c490992d125626bd272c90b8b3362010892356e28",
366
+ "persistent": true,
367
+ "epoch": 0,
368
+ "relays": [
369
+ "wss://relay.example.com/"
370
+ ]
371
+ }
372
+ }
373
+ }
374
+ },
375
+ {
376
+ "name": "destruct-retirement",
377
+ "kind": "positive",
378
+ "note": "A kind-1461 retirement of the invitation above, saying the room was ended and self-destructs: content `{\"v\":1,\"ended\":true,\"destruct\":true}`. This content is plain JSON, not encrypted, as `ended` always was; the `d` tag is the invitation id, which nobody without the link can tie to a room. A reader reports `{ ended: true, destruct: true }`. `randomHex`: the aux-rand. `unflagged` is the same retirement with the same draw and no flag (0.8.0's `ended` retirement). `oldReader`: a 0.8.0 reader sees an ordinary ended room.",
379
+ "input": {
380
+ "invitation": {
381
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
382
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
383
+ "persistent": true
384
+ },
385
+ "inviterSkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
386
+ "createdAt": 1800003600,
387
+ "event": {
388
+ "id": "88503f949adc9ef36f283cb5956f6d6e19267c9c3873508dafb4f1e07178b1ff",
389
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
390
+ "created_at": 1800003600,
391
+ "kind": 1461,
392
+ "tags": [
393
+ [
394
+ "d",
395
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
396
+ ]
397
+ ],
398
+ "content": "{\"v\":1,\"ended\":true,\"destruct\":true}",
399
+ "sig": "e71b9f81f82c7c683ffc0d52d97396a6d5780e78163b84bfd5ede41b3ec126e11811a555b30382fe544add45eaf149a83f58f8011dacdb0fae3ee0e0070d5e91"
400
+ },
401
+ "randomHex": [
402
+ "a949d71b4873256ad433d5d1de0e9551b2f44fa63becdfef2554843e8dcc9b2e"
403
+ ],
404
+ "unflagged": {
405
+ "event": {
406
+ "id": "f7cba6d0721398ba9b6f5d79e16600da534c990f223db68291e68dc1e30e3c98",
407
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
408
+ "created_at": 1800003600,
409
+ "kind": 1461,
410
+ "tags": [
411
+ [
412
+ "d",
413
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
414
+ ]
415
+ ],
416
+ "content": "{\"v\":1,\"ended\":true}",
417
+ "sig": "e299e745d62ac489a69566d557584bccabbe932aaaba15ad2ce53f7251317c3e8393c334a15f76e2746a5e310f5070f78b109d10317f326dd11f04a6c23d7067"
418
+ },
419
+ "randomHex": [
420
+ "a949d71b4873256ad433d5d1de0e9551b2f44fa63becdfef2554843e8dcc9b2e"
421
+ ]
422
+ }
423
+ },
424
+ "output": {
425
+ "notice": {
426
+ "ended": true,
427
+ "destruct": true
428
+ },
429
+ "unflaggedNotice": {
430
+ "ended": true
431
+ },
432
+ "oldReader": {
433
+ "ended": true
434
+ }
435
+ }
436
+ },
437
+ {
438
+ "name": "destruct-retirement-not-ended",
439
+ "kind": "negative",
440
+ "note": "A retirement signed by the inviter whose content is `{\"v\":1,\"destruct\":true}`: a flag without `ended`. The encoder refuses it (`encoder`), so it is built by hand (`randomHex`: the aux-rand). A reader still honours the retirement, since a retired link must stay retired, and does not believe the flag: `{ ended: false }`.",
441
+ "input": {
442
+ "invitation": {
443
+ "bearerHex": "63da81a93ddf0a90ae34ed2b24bb91e664383e117bcacec5cc05e0da5d3d2612",
444
+ "inviter": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
445
+ "persistent": true
446
+ },
447
+ "event": {
448
+ "id": "65c29f31e3520b2ee8ea981904a48edb8ee75a39b841710d68a9f124b1caa08b",
449
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
450
+ "created_at": 1800003600,
451
+ "kind": 1461,
452
+ "tags": [
453
+ [
454
+ "d",
455
+ "3bbaca427676d0f5a796278a86bf2166d8f66e7abd09d40caa6581f1e7454914"
456
+ ]
457
+ ],
458
+ "content": "{\"v\":1,\"destruct\":true}",
459
+ "sig": "519018291651ba182de5f1d34355539fdaed555f35863e97030a2613a4b536700481a83b6aeecf4acbbdb74e28b2a3ba73a8ab7996e5a15b506ac19792bde684"
460
+ },
461
+ "randomHex": [
462
+ "7e483c437263f98c287eb2c2a76ab6ad25f2c306cfeaa5e2d86f0c4a6b93931d"
463
+ ],
464
+ "bodyJson": "{\"v\":1,\"destruct\":true}"
465
+ },
466
+ "output": {
467
+ "encoder": "refused",
468
+ "notice": {
469
+ "ended": false
470
+ }
471
+ }
472
+ },
473
+ {
474
+ "name": "destruct-closure",
475
+ "kind": "positive",
476
+ "note": "A kind-1462 rekey from epoch 1 to 2 that closes the room and self-destructs it: `\"closed\": true, \"destruct\": true` inside the body encrypted to epoch 1 (body order v, epoch, removed, closed, destruct, keys), and never as a tag. A closure seals the new secret to nobody, so `keys` is empty and the only draws are `randomHex`: the body nonce, the aux-rand. `unflagged` is the same closure with the same draws and no flag (every closure before 0.9.0). `notice` is `decodeRekeyEvent`, `evidence` is `readRekeyEvidence`; both report `destruct`. `oldReader`: a 0.8.0 reader sees an ordinary close.",
477
+ "input": {
478
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
479
+ "authority": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
480
+ "authoritySkHex": "a090036fcabc0a442fc1eaa5afc5c7ddda6f95c6bf8fe1f7b3b69589e621d643",
481
+ "previous": {
482
+ "epoch": 1,
483
+ "secretHex": "0f01eb2bc987461c1d130d1fd592156e3098a2f970dfd67057f5eeaa4bf812e4"
484
+ },
485
+ "next": {
486
+ "epoch": 2,
487
+ "secretHex": "9fdaac66de22f73960879abf83e9065bc882ba84440800c96418b27e4dfaec05"
488
+ },
489
+ "recipients": [
490
+ "b7229740b568be30f7307667afc9d23a292b9efa8dffbc6dbfc4a014048fb797"
491
+ ],
492
+ "deviceSkHex": "2ace7e7b383f931a0d45b2bc74df1262d356ec4a7137d88792e89b664828d698",
493
+ "createdAt": 1800003600,
494
+ "event": {
495
+ "id": "37458191b69ad786b091c3b695507a52a0b8596431f286d7a44daf91b7a7398a",
496
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
497
+ "created_at": 1800003600,
498
+ "kind": 1462,
499
+ "tags": [
500
+ [
501
+ "d",
502
+ "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6"
503
+ ],
504
+ [
505
+ "epoch",
506
+ "2"
507
+ ]
508
+ ],
509
+ "content": "AhOnbBRNMDzM9miIeGKbl2Dua0UpbT7Ifq5pljxTcm/R4wocpZDmpbWrmCHysCzurnZABNn7QFp3ZzwJzSRv7zyQlWFjWaNHEi0W4yYV3cjp3EE4Sfq+iPy8bKAmXjq2VDqlnVoiV1VMSsJN3pivf/gviJ3SJX18QZUR0XHMN0hZ0C41InAxa5whdgycHfKNHoRP7cVh6Gan3JBRU06GCAQcSQ==",
510
+ "sig": "781c78fc9fc9ec22b9b0eb37110a4794f27fef05bba9ae0c99323bed3c6f61c546dee16dc19fb37382c93e0dff3345c28f1cb2f4e9411c61811d820c1dbe6f1d"
511
+ },
512
+ "randomHex": [
513
+ "13a76c144d303cccf6688878629b9760ee6b45296d3ec87eae69963c53726fd1",
514
+ "3b0382104a935d062308889ecba5aca4d961b92670de5a7c0940e1415d0c7c30"
515
+ ],
516
+ "unflagged": {
517
+ "event": {
518
+ "id": "88c5d00afcdba39ed0f771642f18ff390168509116cedf1e6bf6f3993fc79290",
519
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
520
+ "created_at": 1800003600,
521
+ "kind": 1462,
522
+ "tags": [
523
+ [
524
+ "d",
525
+ "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6"
526
+ ],
527
+ [
528
+ "epoch",
529
+ "2"
530
+ ]
531
+ ],
532
+ "content": "AhOnbBRNMDzM9miIeGKbl2Dua0UpbT7Ifq5pljxTcm/R43ocpZDmpbWrmCHysCzurnZABNn7QFp3ZzwJzSRv7zyQlWFjWaNHEi0W4yYV3cjm3Es/GbWmgaOGGNJTOxaUP1/cxa5YK7MiGMSmucDORDd1IQZy1aTeyii0eGDaRCofQvA=",
533
+ "sig": "cd0c9a216f9d46ffca874bf5aed2c64d5216b2e36b87b0900c588fcd00d833bbe0698f2e7cc46ef96e9988277beaa1028f777cd6d59f8bfb2c4fb4d570ab69d2"
534
+ },
535
+ "randomHex": [
536
+ "13a76c144d303cccf6688878629b9760ee6b45296d3ec87eae69963c53726fd1",
537
+ "3b0382104a935d062308889ecba5aca4d961b92670de5a7c0940e1415d0c7c30"
538
+ ]
539
+ }
540
+ },
541
+ "output": {
542
+ "bodyJson": "{\"v\":1,\"epoch\":2,\"removed\":[],\"closed\":true,\"destruct\":true,\"keys\":{}}",
543
+ "unflaggedBodyJson": "{\"v\":1,\"epoch\":2,\"removed\":[],\"closed\":true,\"keys\":{}}",
544
+ "notice": {
545
+ "epoch": 2,
546
+ "removed": [],
547
+ "closed": true,
548
+ "destruct": true,
549
+ "at": 1800003600
550
+ },
551
+ "evidence": {
552
+ "epoch": 2,
553
+ "removed": [],
554
+ "closed": true,
555
+ "destruct": true
556
+ },
557
+ "unflaggedNotice": {
558
+ "epoch": 2,
559
+ "removed": [],
560
+ "closed": true,
561
+ "at": 1800003600
562
+ },
563
+ "oldReader": {
564
+ "epoch": 2,
565
+ "removed": [],
566
+ "closed": true,
567
+ "at": 1800003600
568
+ }
569
+ }
570
+ },
571
+ {
572
+ "name": "destruct-rekey-open",
573
+ "kind": "negative",
574
+ "note": "Two rekeys from epoch 1 to 2, signed by the authority, whose bodies carry `destruct` without `closed`: beside a removal (`withRemoval`) and beside the scheduled marker (`withScheduled`). The encoder refuses both (`encoder`), so they are built by hand (`bodyJson`, then `randomHex`: the body nonce, the aux-rand). A reader still reads each rekey, so the removal is announced and the device moves on, and does not believe the flag: it is absent from `notice` and `evidence`.",
575
+ "input": {
576
+ "roomId": "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6",
577
+ "authority": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
578
+ "previous": {
579
+ "epoch": 1,
580
+ "secretHex": "0f01eb2bc987461c1d130d1fd592156e3098a2f970dfd67057f5eeaa4bf812e4"
581
+ },
582
+ "deviceSkHex": "2ace7e7b383f931a0d45b2bc74df1262d356ec4a7137d88792e89b664828d698",
583
+ "withRemoval": {
584
+ "event": {
585
+ "id": "86e6fd76b5ffd82d455130760697f4b81022123750803cfa2d40a6751579ec88",
586
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
587
+ "created_at": 1800000000,
588
+ "kind": 1462,
589
+ "tags": [
590
+ [
591
+ "d",
592
+ "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6"
593
+ ],
594
+ [
595
+ "epoch",
596
+ "2"
597
+ ]
598
+ ],
599
+ "content": "Apee+KxMVIt4qxTDWlRzJE+t5N2mWq+KOdlTakLIH3L2Z6ibR4g0cAOAuPPHVtmavPV9m5xySfg3jBwV3bG6mdoSTKbzURzy0WvBRNjVKL8xovNTae2nMMxN5Pe6G27gnHpJ7Rd/zQtiTT0VlLLvPpuxLZAhuPhMGh73N8Lx3qeuCquspdQ7vab5Y3qAOEHTNIzN5gMYao9m7+zNjDjPp7HfeeWuA1wbe4XAz/xYEacvP2UypRVIL8UtOhJggFHzbIKB",
600
+ "sig": "8d4f94c1500929bacbb060760e5eadecabdb04ef15ae88de97af3ca3fc10803346d5de8baf2c3afd2087cc341d9ceed8c0bb2de40cf51eabaff950a35d81dd65"
601
+ },
602
+ "randomHex": [
603
+ "979ef8ac4c548b78ab14c35a5473244fade4dda65aaf8a39d9536a42c81f72f6",
604
+ "9749a08bd8414bac8d9cd070954da2e0f3e879b0221a0da9506576e56ab0e04c"
605
+ ],
606
+ "bodyJson": "{\"v\":1,\"epoch\":2,\"removed\":[\"e795ed3fc0ba9cd6635f68e50a6123c15fb0b947b4030ae40b2768b08e27b827\"],\"destruct\":true,\"keys\":{}}"
607
+ },
608
+ "withScheduled": {
609
+ "event": {
610
+ "id": "ec2c2987c0a28287e39b35de0ff7bf247640e061c46fd8a049ebb76932e1e584",
611
+ "pubkey": "66df4b7febed3972515d9f663fe00a8ef9b2c69fbcb6bee3f5587b5d0b96605e",
612
+ "created_at": 1800000000,
613
+ "kind": 1462,
614
+ "tags": [
615
+ [
616
+ "d",
617
+ "629cb9accf2af03a0da629f4cf0e2a8a88d2e127208116f0e849c107e21c51f6"
618
+ ],
619
+ [
620
+ "epoch",
621
+ "2"
622
+ ]
623
+ ],
624
+ "content": "AoH8yCso6ZNKjV9SGxSnVlzR7LBTCbHgXvGBp1BdAEwp67WbwBnUhdIYTE3OJMrwTRKpkbHSAbSL/HuLaXKNQ6QauW0MGXITkcOTX6ASQM2LMMtHHI7qP0xh8aAxUUzZWlB2M6k9A0Zdp1g0XQDo1Zq5ag4XEHoPmz++SnbM1APZs+ymM6U2bGEcgb4HZ9FVpGxZ/+LgM09t7uv+NQgLlwIwIA==",
625
+ "sig": "816c0323a3dbd9a5d7a40096b500bf62534b4a8909c14723ea27469a9c10be613b89d83e0176729c3cf45494b62d89e809c112e5385518d3ca0085e0cad44018"
626
+ },
627
+ "randomHex": [
628
+ "81fcc82b28e9934a8d5f521b14a7565cd1ecb05309b1e05ef181a7505d004c29",
629
+ "bb35e9d71648525a76693a2eb68580502684d0456c67c66d37eb0136343d9911"
630
+ ],
631
+ "bodyJson": "{\"v\":1,\"epoch\":2,\"removed\":[],\"destruct\":true,\"scheduled\":true,\"keys\":{}}"
632
+ }
633
+ },
634
+ "output": {
635
+ "encoder": {
636
+ "withRemoval": "refused",
637
+ "withScheduled": "refused"
638
+ },
639
+ "withRemoval": {
640
+ "notice": {
641
+ "epoch": 2,
642
+ "removed": [
643
+ "e795ed3fc0ba9cd6635f68e50a6123c15fb0b947b4030ae40b2768b08e27b827"
644
+ ],
645
+ "closed": false,
646
+ "at": 1800000000
647
+ },
648
+ "evidence": {
649
+ "epoch": 2,
650
+ "removed": [
651
+ "e795ed3fc0ba9cd6635f68e50a6123c15fb0b947b4030ae40b2768b08e27b827"
652
+ ],
653
+ "closed": false
654
+ }
655
+ },
656
+ "withScheduled": {
657
+ "notice": {
658
+ "epoch": 2,
659
+ "removed": [],
660
+ "closed": false,
661
+ "scheduled": true,
662
+ "at": 1800000000
663
+ },
664
+ "evidence": {
665
+ "epoch": 2,
666
+ "removed": [],
667
+ "closed": false,
668
+ "scheduled": true
669
+ }
670
+ }
671
+ }
672
+ }
673
+ ]
674
+ }
675
+ }