@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,68 @@
1
+ import { verifyAsync } from '@noble/ed25519';
2
+ import type { ExternalVerifier } from '../types/common.js';
3
+
4
+ /**
5
+ * Ed25519Verifier - A simple Ed25519 verifier for DID operations
6
+ * Compatible with didwebvh-ts resolveDIDFromLog
7
+ */
8
+ export class Ed25519Verifier implements ExternalVerifier {
9
+ private verificationMethodId?: string;
10
+ private publicKey?: Uint8Array;
11
+
12
+ constructor(verificationMethodId?: string, publicKey?: Uint8Array) {
13
+ this.verificationMethodId = verificationMethodId;
14
+ this.publicKey = publicKey;
15
+ }
16
+
17
+ /**
18
+ * Verify a signature using Ed25519
19
+ * @param signature - The signature bytes
20
+ * @param message - The message bytes that were signed
21
+ * @param publicKey - The public key bytes (can be different from constructor publicKey)
22
+ * @returns True if the signature is valid
23
+ */
24
+ async verify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): Promise<boolean> {
25
+ try {
26
+ // Ed25519 public keys must be exactly 32 bytes
27
+ // Some keys may have a version byte prefix, so remove it if present
28
+ let ed25519PublicKey = publicKey;
29
+ if (publicKey.length === 33) {
30
+ ed25519PublicKey = publicKey.slice(1);
31
+ } else if (publicKey.length !== 32) {
32
+ console.error(`[Ed25519Verifier] Invalid public key length: ${publicKey.length} (expected 32 bytes)`);
33
+ return false;
34
+ }
35
+
36
+ // Correct parameter order: verifyAsync(signature, message, publicKey)
37
+ return await verifyAsync(signature, message, ed25519PublicKey);
38
+ } catch (error) {
39
+ console.error('[Ed25519Verifier] Verification error:', error);
40
+ return false;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Get the verification method ID associated with this verifier
46
+ */
47
+ getVerificationMethodId(): string | undefined {
48
+ return this.verificationMethodId;
49
+ }
50
+
51
+ /**
52
+ * Get the public key as Uint8Array
53
+ */
54
+ getPublicKey(): Uint8Array | undefined {
55
+ return this.publicKey;
56
+ }
57
+
58
+ /**
59
+ * Get the public key in multibase format (base64url with 'z' prefix)
60
+ */
61
+ getPublicKeyMultibase(): string | undefined {
62
+ if (!this.publicKey) {
63
+ return undefined;
64
+ }
65
+ return `z${Buffer.from(this.publicKey).toString('base64')}`;
66
+ }
67
+ }
68
+
@@ -0,0 +1,239 @@
1
+ // Initialize noble crypto libraries first (idempotent - safe to import multiple times)
2
+ import '../crypto/noble-init.js';
3
+
4
+ import { DIDDocument, KeyPair, KeyType, KeyRecoveryCredential } from '../types';
5
+ import * as secp256k1 from '@noble/secp256k1';
6
+ import * as ed25519 from '@noble/ed25519';
7
+ import { p256 } from '@noble/curves/p256';
8
+ import { multikey, MultikeyType } from '../crypto/Multikey';
9
+
10
+ function toMultikeyType(type: KeyType): MultikeyType {
11
+ if (type === 'ES256K') return 'Secp256k1';
12
+ if (type === 'Ed25519') return 'Ed25519';
13
+ if (type === 'ES256') return 'P256';
14
+ const _exhaustiveCheck: never = type;
15
+ throw new Error(`Unsupported key type: ${String(_exhaustiveCheck)}`);
16
+ }
17
+
18
+ function fromMultikeyType(type: MultikeyType): KeyType {
19
+ if (type === 'Secp256k1') return 'ES256K';
20
+ if (type === 'Ed25519') return 'Ed25519';
21
+ if (type === 'P256') return 'ES256';
22
+ throw new Error('Unsupported key type');
23
+ }
24
+
25
+ export class KeyManager {
26
+ constructor() {
27
+ // Noble crypto libraries are initialized via noble-init.ts (imported at SDK entry point)
28
+ // No initialization needed here
29
+ }
30
+ async generateKeyPair(type: KeyType): Promise<KeyPair> {
31
+ if (type === 'ES256K') {
32
+ const privateKeyBytes = secp256k1.utils.randomPrivateKey();
33
+ const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);
34
+ return {
35
+ privateKey: multikey.encodePrivateKey(privateKeyBytes, 'Secp256k1'),
36
+ publicKey: multikey.encodePublicKey(publicKeyBytes, 'Secp256k1')
37
+ };
38
+ }
39
+
40
+ if (type === 'Ed25519') {
41
+ const privateKeyBytes = ed25519.utils.randomPrivateKey();
42
+ const ed25519Module = ed25519 as unknown as { getPublicKeyAsync: (privateKey: Uint8Array) => Promise<Uint8Array> };
43
+ const publicKeyBytes = await ed25519Module.getPublicKeyAsync(privateKeyBytes);
44
+ return {
45
+ privateKey: multikey.encodePrivateKey(privateKeyBytes, 'Ed25519'),
46
+ publicKey: multikey.encodePublicKey(publicKeyBytes, 'Ed25519')
47
+ };
48
+ }
49
+
50
+ if (type === 'ES256') {
51
+ const privateKeyBytes = p256.utils.randomPrivateKey();
52
+ const publicKeyBytes = p256.getPublicKey(privateKeyBytes, true);
53
+ return {
54
+ privateKey: multikey.encodePrivateKey(privateKeyBytes, 'P256'),
55
+ publicKey: multikey.encodePublicKey(publicKeyBytes, 'P256')
56
+ };
57
+ }
58
+
59
+ const _exhaustiveCheck: never = type;
60
+ throw new Error(`Unsupported key type: ${String(_exhaustiveCheck)}`);
61
+ }
62
+
63
+ rotateKeys(didDoc: DIDDocument, newKeyPair: KeyPair): DIDDocument {
64
+ const multikeyContext = 'https://w3id.org/security/multikey/v1';
65
+ const securityContext = 'https://w3id.org/security/v1';
66
+
67
+ // Ensure required contexts are present
68
+ const updatedContext = [...didDoc['@context']];
69
+ if (!updatedContext.includes(multikeyContext)) {
70
+ updatedContext.push(multikeyContext);
71
+ }
72
+ if (!updatedContext.includes(securityContext)) {
73
+ updatedContext.push(securityContext);
74
+ }
75
+
76
+ // Generate new key ID
77
+ const existingKeys = didDoc.verificationMethod || [];
78
+ const keyIndex = existingKeys.length;
79
+ const newKeyId = `${didDoc.id}#keys-${keyIndex}`;
80
+
81
+ // Mark all existing verification methods as revoked with current timestamp
82
+ const revokedTimestamp = new Date().toISOString();
83
+ const revokedVerificationMethods = existingKeys.map(vm => ({
84
+ ...vm,
85
+ revoked: revokedTimestamp
86
+ }));
87
+
88
+ // Create new verification method
89
+ const newVerificationMethod = {
90
+ id: newKeyId,
91
+ type: 'Multikey',
92
+ controller: didDoc.id,
93
+ publicKeyMultibase: newKeyPair.publicKey
94
+ };
95
+
96
+ // Update authentication and assertionMethod arrays to reference only the new key
97
+ const newKeyReference = newKeyId;
98
+
99
+ const updated: DIDDocument = {
100
+ ...didDoc,
101
+ '@context': updatedContext,
102
+ verificationMethod: [...revokedVerificationMethods, newVerificationMethod],
103
+ authentication: [newKeyReference],
104
+ assertionMethod: [newKeyReference]
105
+ };
106
+
107
+ // Preserve other properties if they exist
108
+ if (didDoc.keyAgreement) {
109
+ updated.keyAgreement = didDoc.keyAgreement;
110
+ }
111
+ if (didDoc.capabilityInvocation) {
112
+ updated.capabilityInvocation = didDoc.capabilityInvocation;
113
+ }
114
+ if (didDoc.capabilityDelegation) {
115
+ updated.capabilityDelegation = didDoc.capabilityDelegation;
116
+ }
117
+ if (didDoc.service) {
118
+ updated.service = didDoc.service;
119
+ }
120
+
121
+ return updated;
122
+ }
123
+
124
+ async recoverFromCompromise(didDoc: DIDDocument): Promise<{
125
+ didDocument: DIDDocument;
126
+ recoveryCredential: KeyRecoveryCredential;
127
+ newKeyPair: KeyPair;
128
+ }> {
129
+ // Determine key type from existing verification methods or default to Ed25519
130
+ let keyType: KeyType = 'Ed25519';
131
+ if (didDoc.verificationMethod && didDoc.verificationMethod.length > 0) {
132
+ try {
133
+ const firstKey = didDoc.verificationMethod[0];
134
+ const decoded = multikey.decodePublicKey(firstKey.publicKeyMultibase);
135
+ keyType = fromMultikeyType(decoded.type);
136
+ } catch (e) {
137
+ // If decoding fails, use default Ed25519
138
+ }
139
+ }
140
+
141
+ // Generate new key pair
142
+ const newKeyPair = await this.generateKeyPair(keyType);
143
+
144
+ // Ensure required contexts
145
+ const multikeyContext = 'https://w3id.org/security/multikey/v1';
146
+ const securityContext = 'https://w3id.org/security/v1';
147
+ const credentialsContext = 'https://www.w3.org/2018/credentials/v1';
148
+
149
+ const updatedContext = [...didDoc['@context']];
150
+ if (!updatedContext.includes(multikeyContext)) {
151
+ updatedContext.push(multikeyContext);
152
+ }
153
+ if (!updatedContext.includes(securityContext)) {
154
+ updatedContext.push(securityContext);
155
+ }
156
+
157
+ // Mark all existing verification methods as compromised
158
+ const compromisedTimestamp = new Date().toISOString();
159
+ const existingKeys = didDoc.verificationMethod || [];
160
+ const compromisedVerificationMethods = existingKeys.map(vm => ({
161
+ ...vm,
162
+ compromised: compromisedTimestamp
163
+ }));
164
+
165
+ // Collect IDs of compromised keys
166
+ const previousVerificationMethodIds = existingKeys.map(vm => vm.id);
167
+
168
+ // Generate new key ID
169
+ const keyIndex = existingKeys.length;
170
+ const newKeyId = `${didDoc.id}#keys-${keyIndex}`;
171
+
172
+ // Create new verification method
173
+ const newVerificationMethod = {
174
+ id: newKeyId,
175
+ type: 'Multikey',
176
+ controller: didDoc.id,
177
+ publicKeyMultibase: newKeyPair.publicKey
178
+ };
179
+
180
+ // Update DID document
181
+ const updatedDidDocument: DIDDocument = {
182
+ ...didDoc,
183
+ '@context': updatedContext,
184
+ verificationMethod: [...compromisedVerificationMethods, newVerificationMethod],
185
+ authentication: [newKeyId],
186
+ assertionMethod: [newKeyId]
187
+ };
188
+
189
+ // Preserve other properties
190
+ if (didDoc.keyAgreement) {
191
+ updatedDidDocument.keyAgreement = didDoc.keyAgreement;
192
+ }
193
+ if (didDoc.capabilityInvocation) {
194
+ updatedDidDocument.capabilityInvocation = didDoc.capabilityInvocation;
195
+ }
196
+ if (didDoc.capabilityDelegation) {
197
+ updatedDidDocument.capabilityDelegation = didDoc.capabilityDelegation;
198
+ }
199
+ if (didDoc.service) {
200
+ updatedDidDocument.service = didDoc.service;
201
+ }
202
+
203
+ // Create recovery credential
204
+ const recoveryCredential: KeyRecoveryCredential = {
205
+ '@context': [credentialsContext, securityContext],
206
+ type: ['VerifiableCredential', 'KeyRecoveryCredential'],
207
+ issuer: didDoc.id,
208
+ issuanceDate: compromisedTimestamp,
209
+ credentialSubject: {
210
+ id: didDoc.id,
211
+ recoveredAt: compromisedTimestamp,
212
+ recoveryReason: 'key_compromise',
213
+ previousVerificationMethods: previousVerificationMethodIds,
214
+ newVerificationMethod: newKeyId
215
+ }
216
+ };
217
+
218
+ return { didDocument: updatedDidDocument, recoveryCredential, newKeyPair };
219
+ }
220
+
221
+ encodePublicKeyMultibase(publicKey: Buffer, type: KeyType): string {
222
+ const mkType = toMultikeyType(type);
223
+ return multikey.encodePublicKey(new Uint8Array(publicKey), mkType);
224
+ }
225
+
226
+ decodePublicKeyMultibase(encoded: string): { key: Buffer; type: KeyType } {
227
+ if (!encoded || typeof encoded !== 'string') {
228
+ throw new Error('Invalid multibase string');
229
+ }
230
+ try {
231
+ const decoded = multikey.decodePublicKey(encoded);
232
+ return { key: Buffer.from(decoded.key), type: fromMultikeyType(decoded.type) };
233
+ } catch {
234
+ throw new Error('Invalid multibase string');
235
+ }
236
+ }
237
+ }
238
+
239
+