@originals/sdk 1.8.0 → 1.8.2

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 (145) hide show
  1. package/dist/utils/hash.js +1 -0
  2. package/package.json +6 -5
  3. package/src/adapters/FeeOracleMock.ts +9 -0
  4. package/src/adapters/index.ts +5 -0
  5. package/src/adapters/providers/OrdHttpProvider.ts +126 -0
  6. package/src/adapters/providers/OrdMockProvider.ts +101 -0
  7. package/src/adapters/types.ts +66 -0
  8. package/src/bitcoin/BitcoinManager.ts +329 -0
  9. package/src/bitcoin/BroadcastClient.ts +54 -0
  10. package/src/bitcoin/OrdinalsClient.ts +120 -0
  11. package/src/bitcoin/PSBTBuilder.ts +106 -0
  12. package/src/bitcoin/fee-calculation.ts +38 -0
  13. package/src/bitcoin/providers/OrdNodeProvider.ts +92 -0
  14. package/src/bitcoin/providers/OrdinalsProvider.ts +56 -0
  15. package/src/bitcoin/providers/types.ts +59 -0
  16. package/src/bitcoin/transactions/commit.ts +465 -0
  17. package/src/bitcoin/transactions/index.ts +13 -0
  18. package/src/bitcoin/transfer.ts +43 -0
  19. package/src/bitcoin/utxo-selection.ts +322 -0
  20. package/src/bitcoin/utxo.ts +113 -0
  21. package/src/cel/ExternalReferenceManager.ts +87 -0
  22. package/src/cel/OriginalsCel.ts +460 -0
  23. package/src/cel/algorithms/createEventLog.ts +68 -0
  24. package/src/cel/algorithms/deactivateEventLog.ts +109 -0
  25. package/src/cel/algorithms/index.ts +11 -0
  26. package/src/cel/algorithms/updateEventLog.ts +99 -0
  27. package/src/cel/algorithms/verifyEventLog.ts +306 -0
  28. package/src/cel/algorithms/witnessEvent.ts +87 -0
  29. package/src/cel/cli/create.ts +330 -0
  30. package/src/cel/cli/index.ts +383 -0
  31. package/src/cel/cli/inspect.ts +549 -0
  32. package/src/cel/cli/migrate.ts +473 -0
  33. package/src/cel/cli/verify.ts +249 -0
  34. package/src/cel/hash.ts +71 -0
  35. package/src/cel/index.ts +16 -0
  36. package/src/cel/layers/BtcoCelManager.ts +408 -0
  37. package/src/cel/layers/PeerCelManager.ts +371 -0
  38. package/src/cel/layers/WebVHCelManager.ts +361 -0
  39. package/src/cel/layers/index.ts +27 -0
  40. package/src/cel/serialization/cbor.ts +189 -0
  41. package/src/cel/serialization/index.ts +10 -0
  42. package/src/cel/serialization/json.ts +209 -0
  43. package/src/cel/types.ts +160 -0
  44. package/src/cel/witnesses/BitcoinWitness.ts +184 -0
  45. package/src/cel/witnesses/HttpWitness.ts +241 -0
  46. package/src/cel/witnesses/WitnessService.ts +51 -0
  47. package/src/cel/witnesses/index.ts +11 -0
  48. package/src/contexts/credentials-v1.json +237 -0
  49. package/src/contexts/credentials-v2-examples.json +5 -0
  50. package/src/contexts/credentials-v2.json +340 -0
  51. package/src/contexts/credentials.json +237 -0
  52. package/src/contexts/data-integrity-v2.json +81 -0
  53. package/src/contexts/dids.json +58 -0
  54. package/src/contexts/ed255192020.json +93 -0
  55. package/src/contexts/ordinals-plus.json +23 -0
  56. package/src/contexts/originals.json +22 -0
  57. package/src/core/OriginalsSDK.ts +420 -0
  58. package/src/crypto/Multikey.ts +194 -0
  59. package/src/crypto/Signer.ts +262 -0
  60. package/src/crypto/noble-init.ts +138 -0
  61. package/src/did/BtcoDidResolver.ts +231 -0
  62. package/src/did/DIDManager.ts +705 -0
  63. package/src/did/Ed25519Verifier.ts +68 -0
  64. package/src/did/KeyManager.ts +239 -0
  65. package/src/did/WebVHManager.ts +499 -0
  66. package/src/did/createBtcoDidDocument.ts +60 -0
  67. package/src/did/providers/OrdinalsClientProviderAdapter.ts +68 -0
  68. package/src/events/EventEmitter.ts +222 -0
  69. package/src/events/index.ts +19 -0
  70. package/src/events/types.ts +331 -0
  71. package/src/examples/basic-usage.ts +78 -0
  72. package/src/examples/create-module-original.ts +435 -0
  73. package/src/examples/full-lifecycle-flow.ts +514 -0
  74. package/src/examples/run.ts +60 -0
  75. package/src/index.ts +204 -0
  76. package/src/kinds/KindRegistry.ts +320 -0
  77. package/src/kinds/index.ts +74 -0
  78. package/src/kinds/types.ts +470 -0
  79. package/src/kinds/validators/AgentValidator.ts +257 -0
  80. package/src/kinds/validators/AppValidator.ts +211 -0
  81. package/src/kinds/validators/DatasetValidator.ts +242 -0
  82. package/src/kinds/validators/DocumentValidator.ts +311 -0
  83. package/src/kinds/validators/MediaValidator.ts +269 -0
  84. package/src/kinds/validators/ModuleValidator.ts +225 -0
  85. package/src/kinds/validators/base.ts +276 -0
  86. package/src/kinds/validators/index.ts +12 -0
  87. package/src/lifecycle/BatchOperations.ts +381 -0
  88. package/src/lifecycle/LifecycleManager.ts +2156 -0
  89. package/src/lifecycle/OriginalsAsset.ts +524 -0
  90. package/src/lifecycle/ProvenanceQuery.ts +280 -0
  91. package/src/lifecycle/ResourceVersioning.ts +163 -0
  92. package/src/migration/MigrationManager.ts +587 -0
  93. package/src/migration/audit/AuditLogger.ts +176 -0
  94. package/src/migration/checkpoint/CheckpointManager.ts +112 -0
  95. package/src/migration/checkpoint/CheckpointStorage.ts +101 -0
  96. package/src/migration/index.ts +33 -0
  97. package/src/migration/operations/BaseMigration.ts +126 -0
  98. package/src/migration/operations/PeerToBtcoMigration.ts +105 -0
  99. package/src/migration/operations/PeerToWebvhMigration.ts +62 -0
  100. package/src/migration/operations/WebvhToBtcoMigration.ts +105 -0
  101. package/src/migration/rollback/RollbackManager.ts +170 -0
  102. package/src/migration/state/StateMachine.ts +92 -0
  103. package/src/migration/state/StateTracker.ts +156 -0
  104. package/src/migration/types.ts +356 -0
  105. package/src/migration/validation/BitcoinValidator.ts +107 -0
  106. package/src/migration/validation/CredentialValidator.ts +62 -0
  107. package/src/migration/validation/DIDCompatibilityValidator.ts +151 -0
  108. package/src/migration/validation/LifecycleValidator.ts +64 -0
  109. package/src/migration/validation/StorageValidator.ts +79 -0
  110. package/src/migration/validation/ValidationPipeline.ts +213 -0
  111. package/src/resources/ResourceManager.ts +655 -0
  112. package/src/resources/index.ts +21 -0
  113. package/src/resources/types.ts +202 -0
  114. package/src/storage/LocalStorageAdapter.ts +64 -0
  115. package/src/storage/MemoryStorageAdapter.ts +29 -0
  116. package/src/storage/StorageAdapter.ts +25 -0
  117. package/src/storage/index.ts +3 -0
  118. package/src/types/bitcoin.ts +98 -0
  119. package/src/types/common.ts +92 -0
  120. package/src/types/credentials.ts +89 -0
  121. package/src/types/did.ts +31 -0
  122. package/src/types/external-shims.d.ts +53 -0
  123. package/src/types/index.ts +7 -0
  124. package/src/types/network.ts +178 -0
  125. package/src/utils/EventLogger.ts +298 -0
  126. package/src/utils/Logger.ts +324 -0
  127. package/src/utils/MetricsCollector.ts +358 -0
  128. package/src/utils/bitcoin-address.ts +132 -0
  129. package/src/utils/cbor.ts +31 -0
  130. package/src/utils/encoding.ts +135 -0
  131. package/src/utils/hash.ts +12 -0
  132. package/src/utils/retry.ts +46 -0
  133. package/src/utils/satoshi-validation.ts +196 -0
  134. package/src/utils/serialization.ts +102 -0
  135. package/src/utils/telemetry.ts +44 -0
  136. package/src/utils/validation.ts +123 -0
  137. package/src/vc/CredentialManager.ts +955 -0
  138. package/src/vc/Issuer.ts +105 -0
  139. package/src/vc/Verifier.ts +54 -0
  140. package/src/vc/cryptosuites/bbs.ts +253 -0
  141. package/src/vc/cryptosuites/bbsSimple.ts +21 -0
  142. package/src/vc/cryptosuites/eddsa.ts +99 -0
  143. package/src/vc/documentLoader.ts +81 -0
  144. package/src/vc/proofs/data-integrity.ts +33 -0
  145. package/src/vc/utils/jsonld.ts +18 -0
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Verify Command
4
+ *
5
+ * Verifies a CEL event log by checking all proofs and the hash chain integrity.
6
+ * Outputs event-by-event breakdown with witness attestation details.
7
+ *
8
+ * Usage: originals-cel verify --log <path> [options]
9
+ */
10
+
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import type { EventLog, VerificationResult, DataIntegrityProof, WitnessProof } from '../types';
14
+ import { verifyEventLog } from '../algorithms/verifyEventLog';
15
+ import { parseEventLogJson } from '../serialization/json';
16
+ import { parseEventLogCbor } from '../serialization/cbor';
17
+
18
+ /**
19
+ * Flags parsed from command line arguments
20
+ */
21
+ export interface VerifyFlags {
22
+ log?: string;
23
+ help?: boolean;
24
+ h?: boolean;
25
+ }
26
+
27
+ /**
28
+ * Result of the verify command
29
+ */
30
+ export interface VerifyResult {
31
+ success: boolean;
32
+ message: string;
33
+ verified?: boolean;
34
+ result?: VerificationResult;
35
+ }
36
+
37
+ /**
38
+ * Check if a proof is a WitnessProof (has witnessedAt field)
39
+ */
40
+ function isWitnessProof(proof: DataIntegrityProof | WitnessProof): proof is WitnessProof {
41
+ return 'witnessedAt' in proof && typeof (proof as WitnessProof).witnessedAt === 'string';
42
+ }
43
+
44
+ /**
45
+ * Loads and parses an event log from a file
46
+ * Supports both JSON (.json) and CBOR (.cbor) formats
47
+ */
48
+ function loadEventLog(filePath: string): EventLog {
49
+ if (!fs.existsSync(filePath)) {
50
+ throw new Error(`File not found: ${filePath}`);
51
+ }
52
+
53
+ const ext = path.extname(filePath).toLowerCase();
54
+ const content = fs.readFileSync(filePath);
55
+
56
+ if (ext === '.cbor') {
57
+ // Parse as CBOR binary
58
+ return parseEventLogCbor(new Uint8Array(content));
59
+ } else {
60
+ // Default to JSON parsing
61
+ return parseEventLogJson(content.toString('utf-8'));
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Format a timestamp for display
67
+ */
68
+ function formatTimestamp(timestamp: string): string {
69
+ try {
70
+ const date = new Date(timestamp);
71
+ return date.toISOString();
72
+ } catch {
73
+ return timestamp;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Format proof details for display
79
+ */
80
+ function formatProofDetails(proof: DataIntegrityProof | WitnessProof, indent: string = ' '): string {
81
+ const lines: string[] = [];
82
+ lines.push(`${indent}Cryptosuite: ${proof.cryptosuite}`);
83
+ lines.push(`${indent}Created: ${formatTimestamp(proof.created)}`);
84
+ lines.push(`${indent}Verification Method: ${proof.verificationMethod}`);
85
+ lines.push(`${indent}Proof Purpose: ${proof.proofPurpose}`);
86
+
87
+ // Truncate proof value for display
88
+ const truncatedProof = proof.proofValue.length > 60
89
+ ? `${proof.proofValue.substring(0, 57)}...`
90
+ : proof.proofValue;
91
+ lines.push(`${indent}Proof Value: ${truncatedProof}`);
92
+
93
+ // Add witness-specific info
94
+ if (isWitnessProof(proof)) {
95
+ lines.push(`${indent}🕐 Witnessed At: ${formatTimestamp(proof.witnessedAt)}`);
96
+ }
97
+
98
+ return lines.join('\n');
99
+ }
100
+
101
+ /**
102
+ * Output verification result to stdout
103
+ */
104
+ function outputResult(log: EventLog, result: VerificationResult): void {
105
+ console.log('\n═══════════════════════════════════════════════════════');
106
+ console.log(' CEL Event Log Verification Report');
107
+ console.log('═══════════════════════════════════════════════════════\n');
108
+
109
+ // Overall result
110
+ if (result.verified) {
111
+ console.log('✅ VERIFICATION PASSED\n');
112
+ } else {
113
+ console.log('❌ VERIFICATION FAILED\n');
114
+ }
115
+
116
+ // Summary
117
+ console.log(`📊 Summary:`);
118
+ console.log(` Total Events: ${result.events.length}`);
119
+ const proofsPassed = result.events.filter(e => e.proofValid).length;
120
+ const chainPassed = result.events.filter(e => e.chainValid).length;
121
+ console.log(` Proofs Valid: ${proofsPassed}/${result.events.length}`);
122
+ console.log(` Chain Valid: ${chainPassed}/${result.events.length}`);
123
+
124
+ // Count witness proofs
125
+ let totalWitnessProofs = 0;
126
+ for (const event of log.events) {
127
+ for (const proof of event.proof) {
128
+ if (isWitnessProof(proof)) {
129
+ totalWitnessProofs++;
130
+ }
131
+ }
132
+ }
133
+ if (totalWitnessProofs > 0) {
134
+ console.log(` Witness Attestations: ${totalWitnessProofs}`);
135
+ }
136
+ console.log('');
137
+
138
+ // Event-by-event breakdown
139
+ console.log('📋 Event-by-Event Breakdown:');
140
+ console.log('───────────────────────────────────────────────────────');
141
+
142
+ for (let i = 0; i < result.events.length; i++) {
143
+ const eventResult = result.events[i];
144
+ const event = log.events[i];
145
+
146
+ const proofIcon = eventResult.proofValid ? '✅' : '❌';
147
+ const chainIcon = eventResult.chainValid ? '✅' : '❌';
148
+
149
+ console.log(`\n Event ${i + 1} (${eventResult.type})`);
150
+ console.log(` ├─ Proof: ${proofIcon} ${eventResult.proofValid ? 'Valid' : 'Invalid'}`);
151
+ console.log(` └─ Chain: ${chainIcon} ${eventResult.chainValid ? 'Valid' : 'Invalid'}`);
152
+
153
+ // Show proof details
154
+ if (event.proof && event.proof.length > 0) {
155
+ console.log(`\n Proofs (${event.proof.length}):`);
156
+
157
+ for (let j = 0; j < event.proof.length; j++) {
158
+ const proof = event.proof[j];
159
+ const isWitness = isWitnessProof(proof);
160
+ const proofLabel = isWitness ? '🔏 Witness Proof' : '🔐 Controller Proof';
161
+
162
+ console.log(`\n [${j + 1}] ${proofLabel}`);
163
+ console.log(formatProofDetails(proof, ' '));
164
+ }
165
+ }
166
+
167
+ // Show errors for this event
168
+ if (eventResult.errors && eventResult.errors.length > 0) {
169
+ console.log(`\n ⚠️ Errors:`);
170
+ for (const error of eventResult.errors) {
171
+ console.log(` - ${error}`);
172
+ }
173
+ }
174
+ }
175
+
176
+ // Show global errors if any
177
+ if (result.errors && result.errors.length > 0) {
178
+ console.log('\n───────────────────────────────────────────────────────');
179
+ console.log('⚠️ All Errors:');
180
+ for (const error of result.errors) {
181
+ console.log(` - ${error}`);
182
+ }
183
+ }
184
+
185
+ console.log('\n═══════════════════════════════════════════════════════\n');
186
+ }
187
+
188
+ /**
189
+ * Execute the verify command
190
+ */
191
+ export async function verifyCommand(flags: VerifyFlags): Promise<VerifyResult> {
192
+ // Check for help flag
193
+ if (flags.help || flags.h) {
194
+ return {
195
+ success: true,
196
+ message: 'Use --help with the main CLI for full help text',
197
+ };
198
+ }
199
+
200
+ // Validate required arguments
201
+ if (!flags.log) {
202
+ return {
203
+ success: false,
204
+ message: 'Error: --log is required. Usage: originals-cel verify --log <path>',
205
+ };
206
+ }
207
+
208
+ // Load the event log
209
+ let eventLog: EventLog;
210
+ try {
211
+ eventLog = loadEventLog(flags.log);
212
+ } catch (e) {
213
+ return {
214
+ success: false,
215
+ message: `Error: Failed to load event log: ${(e as Error).message}`,
216
+ };
217
+ }
218
+
219
+ // Verify the event log
220
+ let result: VerificationResult;
221
+ try {
222
+ result = await verifyEventLog(eventLog);
223
+ } catch (e) {
224
+ return {
225
+ success: false,
226
+ message: `Error: Verification failed: ${(e as Error).message}`,
227
+ };
228
+ }
229
+
230
+ // Output the result
231
+ outputResult(eventLog, result);
232
+
233
+ // Return result with exit code information
234
+ if (result.verified) {
235
+ return {
236
+ success: true,
237
+ verified: true,
238
+ message: 'Verification passed: All proofs valid and hash chain intact',
239
+ result,
240
+ };
241
+ } else {
242
+ return {
243
+ success: true, // Command ran successfully, but verification failed
244
+ verified: false,
245
+ message: `Verification failed: ${result.errors.length} error(s) found`,
246
+ result,
247
+ };
248
+ }
249
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * CEL Hash Utilities
3
+ *
4
+ * Computes and verifies Multibase-encoded Multihash digests as specified
5
+ * in the CEL specification for external references.
6
+ *
7
+ * @see https://w3c-ccg.github.io/cel-spec/
8
+ */
9
+
10
+ import { sha256 } from '@noble/hashes/sha2.js';
11
+ import { multibase } from '../utils/encoding';
12
+
13
+ /**
14
+ * Computes a CEL-compliant digestMultibase from content.
15
+ *
16
+ * Uses sha2-256 hash algorithm and encodes as Multibase base64url-nopad (prefix 'u').
17
+ *
18
+ * @param content - The raw bytes to hash
19
+ * @returns Multibase-encoded digest string (e.g., "uEiDm9F...")
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const digest = computeDigestMultibase(new TextEncoder().encode("hello"));
24
+ * // Returns: "uLCA..."
25
+ * ```
26
+ */
27
+ export function computeDigestMultibase(content: Uint8Array): string {
28
+ // Compute SHA-256 hash
29
+ const hash = sha256(content);
30
+
31
+ // Encode as Multibase base64url-nopad (prefix 'u')
32
+ return multibase.encode(hash, 'base64url');
33
+ }
34
+
35
+ /**
36
+ * Verifies that content matches a given digestMultibase.
37
+ *
38
+ * @param content - The raw bytes to verify
39
+ * @param digest - The expected digestMultibase string
40
+ * @returns True if the content hash matches the digest, false otherwise
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const content = new TextEncoder().encode("hello");
45
+ * const digest = computeDigestMultibase(content);
46
+ * const isValid = verifyDigestMultibase(content, digest); // true
47
+ * ```
48
+ */
49
+ export function verifyDigestMultibase(content: Uint8Array, digest: string): boolean {
50
+ try {
51
+ // Compute hash of content
52
+ const computedDigest = computeDigestMultibase(content);
53
+
54
+ // Compare with expected digest
55
+ return computedDigest === digest;
56
+ } catch {
57
+ // Invalid digest format or encoding error
58
+ return false;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Decodes a digestMultibase string back to raw hash bytes.
64
+ *
65
+ * @param digest - The Multibase-encoded digest string
66
+ * @returns The raw SHA-256 hash bytes
67
+ * @throws Error if the digest is not a valid Multibase base64url string
68
+ */
69
+ export function decodeDigestMultibase(digest: string): Uint8Array {
70
+ return multibase.decode(digest);
71
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CEL (Cryptographic Event Log) Module
3
+ *
4
+ * Implements W3C CCG CEL Specification for Originals Protocol
5
+ * @see https://w3c-ccg.github.io/cel-spec/
6
+ */
7
+
8
+ export * from './types';
9
+ export * from './hash';
10
+ export * from './algorithms';
11
+ export * from './witnesses';
12
+ export * from './serialization';
13
+ export * from './ExternalReferenceManager';
14
+ export * from './layers';
15
+ export * from './OriginalsCel';
16
+ export { main as celCli } from './cli/index';