@cef-ebsi/cli 0.0.0-alpha.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.
Files changed (159) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +32 -0
  3. package/bin/cli.js +13 -0
  4. package/dist/abi/pilot/DidRegistry-old.json +2192 -0
  5. package/dist/abi/pilot/DidRegistry.json +1081 -0
  6. package/dist/abi/pilot/DidRegistryV3.json +1081 -0
  7. package/dist/abi/pilot/SchemaSCRegistry.json +972 -0
  8. package/dist/abi/pilot/SchemaSCRegistryV2.json +473 -0
  9. package/dist/abi/pilot/Tar.json +1394 -0
  10. package/dist/abi/pilot/TarV3.json +1107 -0
  11. package/dist/abi/pilot/Timestamp.json +1091 -0
  12. package/dist/abi/pilot/TimestampV2.json +1127 -0
  13. package/dist/abi/pilot/Tir.json +896 -0
  14. package/dist/abi/pilot/TirV3.json +495 -0
  15. package/dist/abi/pilot/Tpr.json +1267 -0
  16. package/dist/abi/pilot/TprV2.json +888 -0
  17. package/dist/abi/test/DidRegistry-old.json +2192 -0
  18. package/dist/abi/test/DidRegistry.json +1081 -0
  19. package/dist/abi/test/DidRegistryV3.json +1088 -0
  20. package/dist/abi/test/SchemaSCRegistry.json +972 -0
  21. package/dist/abi/test/SchemaSCRegistryV2.json +473 -0
  22. package/dist/abi/test/Tar.json +1394 -0
  23. package/dist/abi/test/TarV3.json +1107 -0
  24. package/dist/abi/test/Timestamp.json +1091 -0
  25. package/dist/abi/test/TimestampV2.json +1127 -0
  26. package/dist/abi/test/Tir.json +896 -0
  27. package/dist/abi/test/TirV3.json +495 -0
  28. package/dist/abi/test/Tpr.json +1267 -0
  29. package/dist/abi/test/TprV2.json +888 -0
  30. package/dist/app.js +1205 -0
  31. package/dist/app.js.map +1 -0
  32. package/dist/buildParam/did.js +355 -0
  33. package/dist/buildParam/did.js.map +1 -0
  34. package/dist/buildParam/didOld.js +275 -0
  35. package/dist/buildParam/didOld.js.map +1 -0
  36. package/dist/buildParam/didV3.js +353 -0
  37. package/dist/buildParam/didV3.js.map +1 -0
  38. package/dist/buildParam/index.js +54 -0
  39. package/dist/buildParam/index.js.map +1 -0
  40. package/dist/buildParam/tar.js +240 -0
  41. package/dist/buildParam/tar.js.map +1 -0
  42. package/dist/buildParam/tarV3.js +193 -0
  43. package/dist/buildParam/tarV3.js.map +1 -0
  44. package/dist/buildParam/timestamp.js +323 -0
  45. package/dist/buildParam/timestamp.js.map +1 -0
  46. package/dist/buildParam/timestampV2.js +317 -0
  47. package/dist/buildParam/timestampV2.js.map +1 -0
  48. package/dist/buildParam/tir.js +200 -0
  49. package/dist/buildParam/tir.js.map +1 -0
  50. package/dist/buildParam/tirV3.js +104 -0
  51. package/dist/buildParam/tirV3.js.map +1 -0
  52. package/dist/buildParam/tpr.js +167 -0
  53. package/dist/buildParam/tpr.js.map +1 -0
  54. package/dist/buildParam/tprV2.js +82 -0
  55. package/dist/buildParam/tprV2.js.map +1 -0
  56. package/dist/buildParam/tsr.js +149 -0
  57. package/dist/buildParam/tsr.js.map +1 -0
  58. package/dist/buildParam/tsrV2.js +110 -0
  59. package/dist/buildParam/tsrV2.js.map +1 -0
  60. package/dist/cli.js +10 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/commands/authorisation-v3.js +98 -0
  63. package/dist/commands/authorisation-v3.js.map +1 -0
  64. package/dist/commands/authorisation-v4.js +221 -0
  65. package/dist/commands/authorisation-v4.js.map +1 -0
  66. package/dist/commands/compute.js +374 -0
  67. package/dist/commands/compute.js.map +1 -0
  68. package/dist/commands/conformance-v3.js +745 -0
  69. package/dist/commands/conformance-v3.js.map +1 -0
  70. package/dist/commands/conformance-v4.js +767 -0
  71. package/dist/commands/conformance-v4.js.map +1 -0
  72. package/dist/commands/index.js +9 -0
  73. package/dist/commands/index.js.map +1 -0
  74. package/dist/commands/ledger-v3.js +189 -0
  75. package/dist/commands/ledger-v3.js.map +1 -0
  76. package/dist/commands/ledger-v4.js +188 -0
  77. package/dist/commands/ledger-v4.js.map +1 -0
  78. package/dist/commands/view.js +62 -0
  79. package/dist/commands/view.js.map +1 -0
  80. package/dist/config.js +910 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/index.js +7 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/interfaces/authorisation/authorisation.interface.js +2 -0
  85. package/dist/interfaces/authorisation/authorisation.interface.js.map +1 -0
  86. package/dist/interfaces/authorisation/index.js +2 -0
  87. package/dist/interfaces/authorisation/index.js.map +1 -0
  88. package/dist/interfaces/context.js +2 -0
  89. package/dist/interfaces/context.js.map +1 -0
  90. package/dist/interfaces/index.js +10 -0
  91. package/dist/interfaces/index.js.map +1 -0
  92. package/dist/interfaces/ledger/besu.interface.js +2 -0
  93. package/dist/interfaces/ledger/besu.interface.js.map +1 -0
  94. package/dist/interfaces/ledger/index.js +2 -0
  95. package/dist/interfaces/ledger/index.js.map +1 -0
  96. package/dist/interfaces/notifications/index.js +2 -0
  97. package/dist/interfaces/notifications/index.js.map +1 -0
  98. package/dist/interfaces/notifications/notifications.interface.js +2 -0
  99. package/dist/interfaces/notifications/notifications.interface.js.map +1 -0
  100. package/dist/interfaces/proxy-data-hub/attributes.interface.js +2 -0
  101. package/dist/interfaces/proxy-data-hub/attributes.interface.js.map +1 -0
  102. package/dist/interfaces/proxy-data-hub/index.js +2 -0
  103. package/dist/interfaces/proxy-data-hub/index.js.map +1 -0
  104. package/dist/interfaces/shared/index.js +5 -0
  105. package/dist/interfaces/shared/index.js.map +1 -0
  106. package/dist/interfaces/shared/jsonrpc.interface.js +2 -0
  107. package/dist/interfaces/shared/jsonrpc.interface.js.map +1 -0
  108. package/dist/interfaces/shared/paginated-list.interface.js +2 -0
  109. package/dist/interfaces/shared/paginated-list.interface.js.map +1 -0
  110. package/dist/interfaces/shared/unsigned-transaction.interface.js +2 -0
  111. package/dist/interfaces/shared/unsigned-transaction.interface.js.map +1 -0
  112. package/dist/interfaces/shared/utils.interface.js +2 -0
  113. package/dist/interfaces/shared/utils.interface.js.map +1 -0
  114. package/dist/interfaces/timestamp/hash-algorithms.interface.js +2 -0
  115. package/dist/interfaces/timestamp/hash-algorithms.interface.js.map +1 -0
  116. package/dist/interfaces/timestamp/index.js +4 -0
  117. package/dist/interfaces/timestamp/index.js.map +1 -0
  118. package/dist/interfaces/timestamp/records.interface.js +2 -0
  119. package/dist/interfaces/timestamp/records.interface.js.map +1 -0
  120. package/dist/interfaces/timestamp/timestamps.interface.js +2 -0
  121. package/dist/interfaces/timestamp/timestamps.interface.js.map +1 -0
  122. package/dist/interfaces/trusted-apps-registry/apps.interface.js +2 -0
  123. package/dist/interfaces/trusted-apps-registry/apps.interface.js.map +1 -0
  124. package/dist/interfaces/trusted-apps-registry/index.js +3 -0
  125. package/dist/interfaces/trusted-apps-registry/index.js.map +1 -0
  126. package/dist/interfaces/trusted-apps-registry/policies.interface.js +2 -0
  127. package/dist/interfaces/trusted-apps-registry/policies.interface.js.map +1 -0
  128. package/dist/interfaces/trusted-issuers-registry/index.js +2 -0
  129. package/dist/interfaces/trusted-issuers-registry/index.js.map +1 -0
  130. package/dist/interfaces/trusted-issuers-registry/issuers.interface.js +2 -0
  131. package/dist/interfaces/trusted-issuers-registry/issuers.interface.js.map +1 -0
  132. package/dist/interfaces/users-onboarding/authentication.js +2 -0
  133. package/dist/interfaces/users-onboarding/authentication.js.map +1 -0
  134. package/dist/interfaces/users-onboarding/index.js +2 -0
  135. package/dist/interfaces/users-onboarding/index.js.map +1 -0
  136. package/dist/programs/appRegistration.js +65 -0
  137. package/dist/programs/appRegistration.js.map +1 -0
  138. package/dist/tsconfig.tsbuildinfo +1 -0
  139. package/dist/utils/Client.js +176 -0
  140. package/dist/utils/Client.js.map +1 -0
  141. package/dist/utils/authorisation.js +118 -0
  142. package/dist/utils/authorisation.js.map +1 -0
  143. package/dist/utils/http.js +128 -0
  144. package/dist/utils/http.js.map +1 -0
  145. package/dist/utils/index.js +10 -0
  146. package/dist/utils/index.js.map +1 -0
  147. package/dist/utils/jsonrpc.js +33 -0
  148. package/dist/utils/jsonrpc.js.map +1 -0
  149. package/dist/utils/notification.js +51 -0
  150. package/dist/utils/notification.js.map +1 -0
  151. package/dist/utils/print.js +57 -0
  152. package/dist/utils/print.js.map +1 -0
  153. package/dist/utils/storage.js +97 -0
  154. package/dist/utils/storage.js.map +1 -0
  155. package/dist/utils/utils.js +161 -0
  156. package/dist/utils/utils.js.map +1 -0
  157. package/dist/utils/verifiablePresentation.js +43 -0
  158. package/dist/utils/verifiablePresentation.js.map +1 -0
  159. package/package.json +113 -0
@@ -0,0 +1,323 @@
1
+ import crypto from "node:crypto";
2
+ import { ethers } from "ethers";
3
+ import Multihash from "multihashes";
4
+ import Joi from "joi";
5
+ import { multibaseEncode, fromHexString } from "../utils/index.js";
6
+ const { sha256 } = ethers.utils;
7
+ export function buildParamTimestamp(method, client, inputs) {
8
+ switch (method) {
9
+ case "setTrustedPoliciesRegistryAddress": {
10
+ return {
11
+ info: { title: "initialization", data: method },
12
+ param: {},
13
+ };
14
+ }
15
+ case "timestampRecordHashes": {
16
+ const [inputData, inputInfo] = inputs;
17
+ Joi.assert(inputData, Joi.object().optional());
18
+ Joi.assert(inputInfo, Joi.object().optional());
19
+ const data = typeof inputData === "object"
20
+ ? inputData
21
+ : { test: crypto.randomBytes(12).toString("hex") };
22
+ const buffer = Buffer.from(JSON.stringify(data));
23
+ const info = typeof inputInfo === "object"
24
+ ? inputInfo
25
+ : {
26
+ info: crypto.randomBytes(12).toString("hex"),
27
+ };
28
+ const timestamp = {
29
+ hash: {
30
+ id: 1,
31
+ value: sha256(buffer),
32
+ },
33
+ data: `0x${buffer.toString("hex")}`,
34
+ };
35
+ return {
36
+ info: {
37
+ title: "Timestamp record hashes. Record Id:",
38
+ data: { hashValue: timestamp.hash.value },
39
+ },
40
+ param: {
41
+ hashAlgorithmIds: [timestamp.hash.id],
42
+ hashValues: [timestamp.hash.value],
43
+ timestampData: [timestamp.data],
44
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
45
+ },
46
+ };
47
+ }
48
+ case "timestampVersionHashes": {
49
+ const [versionHash, inputData, inputInfo] = inputs;
50
+ Joi.assert(versionHash, Joi.string());
51
+ Joi.assert(inputData, Joi.object().optional());
52
+ Joi.assert(inputInfo, Joi.object().optional());
53
+ const data = typeof inputData === "object"
54
+ ? inputData
55
+ : { test: crypto.randomBytes(12).toString("hex") };
56
+ const buffer = Buffer.from(JSON.stringify(data));
57
+ const info = typeof inputInfo === "object"
58
+ ? inputInfo
59
+ : {
60
+ info: crypto.randomBytes(12).toString("hex"),
61
+ };
62
+ const timestamp = {
63
+ hash: {
64
+ id: 1,
65
+ value: sha256(buffer),
66
+ },
67
+ data: `0x${buffer.toString("hex")}`,
68
+ };
69
+ return {
70
+ info: {
71
+ title: "Timestamp record version hashes",
72
+ data: { data, info },
73
+ },
74
+ param: {
75
+ versionHash,
76
+ hashAlgorithmIds: [timestamp.hash.id],
77
+ hashValues: [timestamp.hash.value],
78
+ timestampData: [timestamp.data],
79
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
80
+ },
81
+ };
82
+ }
83
+ case "timestampRecordVersionHashes": {
84
+ const [recordId, inputData, inputInfo] = inputs;
85
+ Joi.assert(recordId, Joi.string());
86
+ Joi.assert(inputData, Joi.object().optional());
87
+ Joi.assert(inputInfo, Joi.object().optional());
88
+ const data = typeof inputData === "object"
89
+ ? inputData
90
+ : { test: crypto.randomBytes(12).toString("hex") };
91
+ const buffer = Buffer.from(JSON.stringify(data));
92
+ const info = typeof inputInfo === "object"
93
+ ? inputInfo
94
+ : {
95
+ info: crypto.randomBytes(12).toString("hex"),
96
+ };
97
+ const timestamp = {
98
+ hash: {
99
+ id: 1,
100
+ value: sha256(buffer),
101
+ },
102
+ data: `0x${buffer.toString("hex")}`,
103
+ };
104
+ return {
105
+ info: {
106
+ title: "Timestamp record version hashes",
107
+ data: { data, info },
108
+ },
109
+ param: {
110
+ recordId,
111
+ hashAlgorithmIds: [timestamp.hash.id],
112
+ hashValues: [timestamp.hash.value],
113
+ timestampData: [timestamp.data],
114
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
115
+ },
116
+ };
117
+ }
118
+ case "insertRecordOwner": {
119
+ const [recordId, ownerId, inputNotBefore, inputNotAfter] = inputs;
120
+ Joi.assert(recordId, Joi.string());
121
+ Joi.assert(ownerId, Joi.string());
122
+ Joi.assert(inputNotBefore, Joi.string().optional());
123
+ Joi.assert(inputNotAfter, Joi.string().optional());
124
+ const now = Math.round(Date.now() / 1000);
125
+ const notBefore = inputNotBefore || now;
126
+ const notAfter = inputNotAfter || 0;
127
+ return {
128
+ info: {
129
+ title: "Insert Record Owner",
130
+ data: ownerId,
131
+ },
132
+ param: {
133
+ recordId,
134
+ ownerId,
135
+ notBefore,
136
+ notAfter,
137
+ },
138
+ };
139
+ }
140
+ case "revokeRecordOwner": {
141
+ const [recordId, ownerId] = inputs;
142
+ Joi.assert(recordId, Joi.string());
143
+ Joi.assert(ownerId, Joi.string());
144
+ return {
145
+ info: {
146
+ title: "Revoke Record Owner",
147
+ data: ownerId,
148
+ },
149
+ param: {
150
+ recordId,
151
+ ownerId,
152
+ },
153
+ };
154
+ }
155
+ case "insertRecordVersionInfo": {
156
+ const [recordId, inputVersionId, inputInfo] = inputs;
157
+ Joi.assert(recordId, Joi.string());
158
+ Joi.assert(inputVersionId, Joi.string());
159
+ Joi.assert(inputInfo, Joi.object().optional());
160
+ const versionId = Number(inputVersionId);
161
+ const info = typeof inputInfo === "object"
162
+ ? inputInfo
163
+ : {
164
+ info: crypto.randomBytes(12).toString("hex"),
165
+ };
166
+ return {
167
+ info: {
168
+ title: "Insert Record Version Info",
169
+ data: { recordId, versionId, info },
170
+ },
171
+ param: {
172
+ recordId,
173
+ versionId,
174
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
175
+ },
176
+ };
177
+ }
178
+ case "detachRecordVersionHash": {
179
+ const [recordId, inputVersionId, hashValue] = inputs;
180
+ Joi.assert(recordId, Joi.string());
181
+ Joi.assert(inputVersionId, Joi.string());
182
+ Joi.assert(hashValue, Joi.string());
183
+ const versionId = Number(inputVersionId);
184
+ return {
185
+ info: {
186
+ title: "Detach Record Version Hash",
187
+ data: { recordId, versionId, hashValue },
188
+ },
189
+ param: {
190
+ recordId,
191
+ versionId,
192
+ hashValue,
193
+ },
194
+ };
195
+ }
196
+ case "appendRecordVersionHashes": {
197
+ const [recordId, inputVersionId, inputData, inputInfo] = inputs;
198
+ Joi.assert(recordId, Joi.string());
199
+ Joi.assert(inputVersionId, Joi.string());
200
+ Joi.assert(inputData, Joi.object().optional());
201
+ Joi.assert(inputInfo, Joi.object().optional());
202
+ const versionId = Number(inputVersionId);
203
+ const data = typeof inputData === "object"
204
+ ? inputData
205
+ : { test: crypto.randomBytes(12).toString("hex") };
206
+ const buffer = Buffer.from(JSON.stringify(data));
207
+ const info = typeof inputInfo === "object"
208
+ ? inputInfo
209
+ : {
210
+ info: crypto.randomBytes(12).toString("hex"),
211
+ };
212
+ const timestamp = {
213
+ hash: {
214
+ id: 1,
215
+ value: sha256(buffer),
216
+ },
217
+ data: `0x${buffer.toString("hex")}`,
218
+ };
219
+ return {
220
+ info: {
221
+ title: "Append record version hashes",
222
+ data: { data, info },
223
+ },
224
+ param: {
225
+ recordId,
226
+ versionId,
227
+ hashAlgorithmIds: [timestamp.hash.id],
228
+ hashValues: [timestamp.hash.value],
229
+ timestampData: [timestamp.data],
230
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
231
+ },
232
+ };
233
+ }
234
+ case "timestampHashes": {
235
+ const [inputData] = inputs;
236
+ Joi.assert(inputData, Joi.object().optional());
237
+ const data = typeof inputData === "object"
238
+ ? inputData
239
+ : { test: crypto.randomBytes(12).toString("hex") };
240
+ const buffer = Buffer.from(JSON.stringify(data));
241
+ const timestamp = {
242
+ hash: {
243
+ id: 1,
244
+ value: sha256(buffer),
245
+ },
246
+ data: `0x${buffer.toString("hex")}`,
247
+ };
248
+ const hashBuffer = fromHexString(sha256(timestamp.hash.value));
249
+ const multihash = Multihash.encode(hashBuffer, "sha2-256", 32);
250
+ const id = multibaseEncode("base64url", multihash);
251
+ return {
252
+ info: {
253
+ title: "Timestamp hashes",
254
+ data: { data, id },
255
+ },
256
+ param: {
257
+ hashAlgorithmIds: [timestamp.hash.id],
258
+ hashValues: [timestamp.hash.value],
259
+ timestampData: [timestamp.data],
260
+ },
261
+ };
262
+ }
263
+ case "insertHashAlgorithm": {
264
+ const [inputOutputLength, inputIanaName, inputOid, inputStatus, inputMultihash,] = inputs;
265
+ Joi.assert(inputOutputLength, Joi.string().optional());
266
+ Joi.assert(inputIanaName, Joi.string().optional());
267
+ Joi.assert(inputOid, Joi.string().optional());
268
+ Joi.assert(inputStatus, Joi.string().optional());
269
+ Joi.assert(inputMultihash, Joi.string().optional());
270
+ const outputLength = Number(inputOutputLength) || 1;
271
+ const ianaName = inputIanaName || "undefined";
272
+ const oid = inputOid || "undefined";
273
+ const status = Number(inputStatus) || 1;
274
+ const multihash = inputMultihash || ianaName;
275
+ return {
276
+ info: {
277
+ title: "Hash Algorithm",
278
+ data: ianaName,
279
+ },
280
+ param: {
281
+ outputLength,
282
+ ianaName,
283
+ oid,
284
+ status,
285
+ multihash,
286
+ },
287
+ };
288
+ }
289
+ case "updateHashAlgorithm": {
290
+ const [inputHashAlgorithmId, inputOutputLength, inputIanaName, inputOid, inputStatus, inputMultihash,] = inputs;
291
+ Joi.assert(inputHashAlgorithmId, Joi.string());
292
+ Joi.assert(inputOutputLength, Joi.string().optional());
293
+ Joi.assert(inputIanaName, Joi.string().optional());
294
+ Joi.assert(inputOid, Joi.string().optional());
295
+ Joi.assert(inputStatus, Joi.string().optional());
296
+ Joi.assert(inputMultihash, Joi.string().optional());
297
+ const hashAlgorithmId = Number(inputHashAlgorithmId);
298
+ const outputLength = Number(inputOutputLength) || 1;
299
+ const ianaName = inputIanaName || "undefined";
300
+ const oid = inputOid || "undefined";
301
+ const status = Number(inputStatus) || 1;
302
+ const multihash = inputMultihash || ianaName;
303
+ return {
304
+ info: {
305
+ title: "Hash Algorithm",
306
+ data: ianaName,
307
+ },
308
+ param: {
309
+ hashAlgorithmId,
310
+ outputLength,
311
+ ianaName,
312
+ oid,
313
+ status,
314
+ multihash,
315
+ },
316
+ };
317
+ }
318
+ default:
319
+ throw new Error(`Invalid method '${method}'`);
320
+ }
321
+ }
322
+ export default buildParamTimestamp;
323
+ //# sourceMappingURL=timestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/buildParam/timestamp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ import crypto from "node:crypto";
2
+ import { ethers } from "ethers";
3
+ import Multihash from "multihashes";
4
+ import Joi from "joi";
5
+ import { multibaseEncode, fromHexString } from "../utils/index.js";
6
+ const { sha256 } = ethers.utils;
7
+ export function buildParamTimestampV2(method, client, inputs) {
8
+ switch (method) {
9
+ case "timestampRecordHashes": {
10
+ const [inputData, inputInfo] = inputs;
11
+ Joi.assert(inputData, Joi.object().optional());
12
+ Joi.assert(inputInfo, Joi.object().optional());
13
+ const data = typeof inputData === "object"
14
+ ? inputData
15
+ : { test: crypto.randomBytes(12).toString("hex") };
16
+ const buffer = Buffer.from(JSON.stringify(data));
17
+ const info = typeof inputInfo === "object"
18
+ ? inputInfo
19
+ : {
20
+ info: crypto.randomBytes(12).toString("hex"),
21
+ };
22
+ const timestamp = {
23
+ hash: {
24
+ id: 0,
25
+ value: sha256(buffer),
26
+ },
27
+ data: `0x${buffer.toString("hex")}`,
28
+ };
29
+ return {
30
+ info: {
31
+ title: "Timestamp record hashes. Record Id:",
32
+ data: { hashValue: timestamp.hash.value },
33
+ },
34
+ param: {
35
+ hashAlgorithmIds: [timestamp.hash.id],
36
+ hashValues: [timestamp.hash.value],
37
+ timestampData: [timestamp.data],
38
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
39
+ },
40
+ };
41
+ }
42
+ case "timestampVersionHashes": {
43
+ const [versionHash, inputData, inputInfo] = inputs;
44
+ Joi.assert(versionHash, Joi.string());
45
+ Joi.assert(inputData, Joi.object().optional());
46
+ Joi.assert(inputInfo, Joi.object().optional());
47
+ const data = typeof inputData === "object"
48
+ ? inputData
49
+ : { test: crypto.randomBytes(12).toString("hex") };
50
+ const buffer = Buffer.from(JSON.stringify(data));
51
+ const info = typeof inputInfo === "object"
52
+ ? inputInfo
53
+ : {
54
+ info: crypto.randomBytes(12).toString("hex"),
55
+ };
56
+ const timestamp = {
57
+ hash: {
58
+ id: 0,
59
+ value: sha256(buffer),
60
+ },
61
+ data: `0x${buffer.toString("hex")}`,
62
+ };
63
+ return {
64
+ info: {
65
+ title: "Timestamp record version hashes",
66
+ data: { data, info },
67
+ },
68
+ param: {
69
+ versionHash,
70
+ hashAlgorithmIds: [timestamp.hash.id],
71
+ hashValues: [timestamp.hash.value],
72
+ timestampData: [timestamp.data],
73
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
74
+ },
75
+ };
76
+ }
77
+ case "timestampRecordVersionHashes": {
78
+ const [recordId, inputData, inputInfo] = inputs;
79
+ Joi.assert(recordId, Joi.string());
80
+ Joi.assert(inputData, Joi.object().optional());
81
+ Joi.assert(inputInfo, Joi.object().optional());
82
+ const data = typeof inputData === "object"
83
+ ? inputData
84
+ : { test: crypto.randomBytes(12).toString("hex") };
85
+ const buffer = Buffer.from(JSON.stringify(data));
86
+ const info = typeof inputInfo === "object"
87
+ ? inputInfo
88
+ : {
89
+ info: crypto.randomBytes(12).toString("hex"),
90
+ };
91
+ const timestamp = {
92
+ hash: {
93
+ id: 0,
94
+ value: sha256(buffer),
95
+ },
96
+ data: `0x${buffer.toString("hex")}`,
97
+ };
98
+ return {
99
+ info: {
100
+ title: "Timestamp record version hashes",
101
+ data: { data, info },
102
+ },
103
+ param: {
104
+ recordId,
105
+ hashAlgorithmIds: [timestamp.hash.id],
106
+ hashValues: [timestamp.hash.value],
107
+ timestampData: [timestamp.data],
108
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
109
+ },
110
+ };
111
+ }
112
+ case "insertRecordOwner": {
113
+ const [recordId, ownerId, inputNotBefore, inputNotAfter] = inputs;
114
+ Joi.assert(recordId, Joi.string());
115
+ Joi.assert(ownerId, Joi.string());
116
+ Joi.assert(inputNotBefore, Joi.string().optional());
117
+ Joi.assert(inputNotAfter, Joi.string().optional());
118
+ const now = Math.round(Date.now() / 1000);
119
+ const notBefore = inputNotBefore || now;
120
+ const notAfter = inputNotAfter || 0;
121
+ return {
122
+ info: {
123
+ title: "Insert Record Owner",
124
+ data: ownerId,
125
+ },
126
+ param: {
127
+ recordId,
128
+ ownerId,
129
+ notBefore,
130
+ notAfter,
131
+ },
132
+ };
133
+ }
134
+ case "revokeRecordOwner": {
135
+ const [recordId, ownerId] = inputs;
136
+ Joi.assert(recordId, Joi.string());
137
+ Joi.assert(ownerId, Joi.string());
138
+ return {
139
+ info: {
140
+ title: "Revoke Record Owner",
141
+ data: ownerId,
142
+ },
143
+ param: {
144
+ recordId,
145
+ ownerId,
146
+ },
147
+ };
148
+ }
149
+ case "insertRecordVersionInfo": {
150
+ const [recordId, inputVersionId, inputInfo] = inputs;
151
+ Joi.assert(recordId, Joi.string());
152
+ Joi.assert(inputVersionId, Joi.string());
153
+ Joi.assert(inputInfo, Joi.object().optional());
154
+ const versionId = Number(inputVersionId);
155
+ const info = typeof inputInfo === "object"
156
+ ? inputInfo
157
+ : {
158
+ info: crypto.randomBytes(12).toString("hex"),
159
+ };
160
+ return {
161
+ info: {
162
+ title: "Insert Record Version Info",
163
+ data: { recordId, versionId, info },
164
+ },
165
+ param: {
166
+ recordId,
167
+ versionId,
168
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
169
+ },
170
+ };
171
+ }
172
+ case "detachRecordVersionHash": {
173
+ const [recordId, inputVersionId, hashValue] = inputs;
174
+ Joi.assert(recordId, Joi.string());
175
+ Joi.assert(inputVersionId, Joi.string());
176
+ Joi.assert(hashValue, Joi.string());
177
+ const versionId = Number(inputVersionId);
178
+ return {
179
+ info: {
180
+ title: "Detach Record Version Hash",
181
+ data: { recordId, versionId, hashValue },
182
+ },
183
+ param: {
184
+ recordId,
185
+ versionId,
186
+ hashValue,
187
+ },
188
+ };
189
+ }
190
+ case "appendRecordVersionHashes": {
191
+ const [recordId, inputVersionId, inputData, inputInfo] = inputs;
192
+ Joi.assert(recordId, Joi.string());
193
+ Joi.assert(inputVersionId, Joi.string());
194
+ Joi.assert(inputData, Joi.object().optional());
195
+ Joi.assert(inputInfo, Joi.object().optional());
196
+ const versionId = Number(inputVersionId);
197
+ const data = typeof inputData === "object"
198
+ ? inputData
199
+ : { test: crypto.randomBytes(12).toString("hex") };
200
+ const buffer = Buffer.from(JSON.stringify(data));
201
+ const info = typeof inputInfo === "object"
202
+ ? inputInfo
203
+ : {
204
+ info: crypto.randomBytes(12).toString("hex"),
205
+ };
206
+ const timestamp = {
207
+ hash: {
208
+ id: 0,
209
+ value: sha256(buffer),
210
+ },
211
+ data: `0x${buffer.toString("hex")}`,
212
+ };
213
+ return {
214
+ info: {
215
+ title: "Append record version hashes",
216
+ data: { data, info },
217
+ },
218
+ param: {
219
+ recordId,
220
+ versionId,
221
+ hashAlgorithmIds: [timestamp.hash.id],
222
+ hashValues: [timestamp.hash.value],
223
+ timestampData: [timestamp.data],
224
+ versionInfo: `0x${Buffer.from(JSON.stringify(info)).toString("hex")}`,
225
+ },
226
+ };
227
+ }
228
+ case "timestampHashes": {
229
+ const [inputData] = inputs;
230
+ Joi.assert(inputData, Joi.object().optional());
231
+ const data = typeof inputData === "object"
232
+ ? inputData
233
+ : { test: crypto.randomBytes(12).toString("hex") };
234
+ const buffer = Buffer.from(JSON.stringify(data));
235
+ const timestamp = {
236
+ hash: {
237
+ id: 0,
238
+ value: sha256(buffer),
239
+ },
240
+ data: `0x${buffer.toString("hex")}`,
241
+ };
242
+ const hashBuffer = fromHexString(sha256(timestamp.hash.value));
243
+ const multihash = Multihash.encode(hashBuffer, "sha2-256", 32);
244
+ const id = multibaseEncode("base64url", multihash);
245
+ return {
246
+ info: {
247
+ title: "Timestamp hashes",
248
+ data: { data, id },
249
+ },
250
+ param: {
251
+ hashAlgorithmIds: [timestamp.hash.id],
252
+ hashValues: [timestamp.hash.value],
253
+ timestampData: [timestamp.data],
254
+ },
255
+ };
256
+ }
257
+ case "insertHashAlgorithm": {
258
+ const [inputOutputLength, inputIanaName, inputOid, inputStatus, inputMultihash,] = inputs;
259
+ Joi.assert(inputOutputLength, Joi.string().optional());
260
+ Joi.assert(inputIanaName, Joi.string().optional());
261
+ Joi.assert(inputOid, Joi.string().optional());
262
+ Joi.assert(inputStatus, Joi.string().optional());
263
+ Joi.assert(inputMultihash, Joi.string().optional());
264
+ const outputLength = Number(inputOutputLength) || 1;
265
+ const ianaName = inputIanaName || "undefined";
266
+ const oid = inputOid || "undefined";
267
+ const status = Number(inputStatus) || 1;
268
+ const multihash = inputMultihash || ianaName;
269
+ return {
270
+ info: {
271
+ title: "Hash Algorithm",
272
+ data: ianaName,
273
+ },
274
+ param: {
275
+ outputLength,
276
+ ianaName,
277
+ oid,
278
+ status,
279
+ multihash,
280
+ },
281
+ };
282
+ }
283
+ case "updateHashAlgorithm": {
284
+ const [inputHashAlgorithmId, inputOutputLength, inputIanaName, inputOid, inputStatus, inputMultihash,] = inputs;
285
+ Joi.assert(inputHashAlgorithmId, Joi.string());
286
+ Joi.assert(inputOutputLength, Joi.string().optional());
287
+ Joi.assert(inputIanaName, Joi.string().optional());
288
+ Joi.assert(inputOid, Joi.string().optional());
289
+ Joi.assert(inputStatus, Joi.string().optional());
290
+ Joi.assert(inputMultihash, Joi.string().optional());
291
+ const hashAlgorithmId = Number(inputHashAlgorithmId);
292
+ const outputLength = Number(inputOutputLength) || 1;
293
+ const ianaName = inputIanaName || "undefined";
294
+ const oid = inputOid || "undefined";
295
+ const status = Number(inputStatus) || 1;
296
+ const multihash = inputMultihash || ianaName;
297
+ return {
298
+ info: {
299
+ title: "Hash Algorithm",
300
+ data: ianaName,
301
+ },
302
+ param: {
303
+ hashAlgorithmId,
304
+ outputLength,
305
+ ianaName,
306
+ oid,
307
+ status,
308
+ multihash,
309
+ },
310
+ };
311
+ }
312
+ default:
313
+ throw new Error(`Invalid method '${method}'`);
314
+ }
315
+ }
316
+ export default buildParamTimestampV2;
317
+ //# sourceMappingURL=timestampV2.js.map