@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,231 @@
1
+ import type { DIDDocument } from '../types/did';
2
+
3
+ export interface BtcoInscriptionData {
4
+ inscriptionId: string;
5
+ content: string;
6
+ metadata: Record<string, unknown> | null;
7
+ contentUrl?: string;
8
+ contentType?: string;
9
+ isValidDid?: boolean;
10
+ didDocument?: DIDDocument | null;
11
+ error?: string;
12
+ }
13
+
14
+ export interface BtcoDidResolutionResult {
15
+ didDocument: DIDDocument | null;
16
+ inscriptions?: BtcoInscriptionData[];
17
+ resolutionMetadata: {
18
+ contentType?: string;
19
+ error?: string;
20
+ message?: string;
21
+ inscriptionId?: string;
22
+ satNumber?: string;
23
+ network?: string;
24
+ totalInscriptions?: number;
25
+ };
26
+ didDocumentMetadata: {
27
+ created?: string;
28
+ updated?: string;
29
+ deactivated?: boolean;
30
+ inscriptionId?: string;
31
+ network?: string;
32
+ };
33
+ }
34
+
35
+ export interface ResourceProviderLike {
36
+ getSatInfo(satNumber: string): Promise<{ inscription_ids: string[] }>;
37
+ resolveInscription(inscriptionId: string): Promise<{ id: string; sat: number; content_type: string; content_url: string }>;
38
+ getMetadata(inscriptionId: string): Promise<Record<string, unknown> | null>;
39
+ }
40
+
41
+ export interface BtcoDidResolutionOptions {
42
+ provider?: ResourceProviderLike;
43
+ fetchFn?: (url: string) => Promise<Response>;
44
+ timeout?: number;
45
+ }
46
+
47
+ export class BtcoDidResolver {
48
+ private readonly options: BtcoDidResolutionOptions;
49
+
50
+ constructor(options: BtcoDidResolutionOptions = {}) {
51
+ this.options = options;
52
+ }
53
+
54
+ private parseBtcoDid(did: string): { satNumber: string; path?: string; network: string } | null {
55
+ const regex = /^did:btco(?::(reg|sig))?:([0-9]+)(?:\/(.+))?$/;
56
+ const match = did.match(regex);
57
+ if (!match) return null;
58
+ const [, networkSuffix, satNumber, path] = match;
59
+ const network = networkSuffix || 'mainnet';
60
+ return { satNumber, path, network };
61
+ }
62
+
63
+ private getDidPrefix(network: string): string {
64
+ switch (network) {
65
+ case 'reg':
66
+ case 'regtest':
67
+ return 'did:btco:reg';
68
+ case 'sig':
69
+ case 'signet':
70
+ return 'did:btco:sig';
71
+ default:
72
+ return 'did:btco';
73
+ }
74
+ }
75
+
76
+ async resolve(did: string, options: BtcoDidResolutionOptions = {}): Promise<BtcoDidResolutionResult> {
77
+ const parsed = this.parseBtcoDid(did);
78
+ if (!parsed) {
79
+ return this.createErrorResult('invalidDid', `Invalid BTCO DID format: ${did}`);
80
+ }
81
+
82
+ const { satNumber, network } = parsed;
83
+ const provider = options.provider || this.options.provider;
84
+ if (!provider) {
85
+ return this.createErrorResult('noProvider', 'No provider supplied');
86
+ }
87
+
88
+ let inscriptionIds: string[] = [];
89
+ try {
90
+ const satInfo = await provider.getSatInfo(satNumber);
91
+ inscriptionIds = satInfo?.inscription_ids || [];
92
+ } catch (e: unknown) {
93
+ const message = e instanceof Error ? e.message : String(e);
94
+ return this.createErrorResult('notFound', `Failed to retrieve inscriptions for satoshi ${satNumber}: ${message}`);
95
+ }
96
+
97
+ if (inscriptionIds.length === 0) {
98
+ return this.createErrorResult('notFound', `No inscriptions found on satoshi ${satNumber}`);
99
+ }
100
+
101
+ const expectedDid = `${this.getDidPrefix(network)}:${satNumber}`;
102
+ const didPattern = new RegExp(`^(?:BTCO DID: )?(${expectedDid.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i');
103
+
104
+ const inscriptionDataList: BtcoInscriptionData[] = [];
105
+
106
+ for (const inscriptionId of inscriptionIds) {
107
+ const inscriptionData: BtcoInscriptionData = {
108
+ inscriptionId,
109
+ content: '',
110
+ metadata: null
111
+ };
112
+
113
+ try {
114
+ const inscription = await provider.resolveInscription(inscriptionId);
115
+ if (!inscription) {
116
+ inscriptionData.error = `Inscription ${inscriptionId} not found`;
117
+ inscriptionDataList.push(inscriptionData);
118
+ continue;
119
+ }
120
+
121
+ inscriptionData.contentUrl = inscription.content_url;
122
+ inscriptionData.contentType = inscription.content_type;
123
+
124
+ try {
125
+ // Use configurable fetch function or default to global fetch
126
+ const fetchFn = options.fetchFn || this.options.fetchFn || fetch;
127
+ const timeout = options.timeout || this.options.timeout || 10000; // 10 second default
128
+
129
+ // Create abort controller for timeout
130
+ const controller = new AbortController();
131
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
132
+
133
+ try {
134
+ const response = await fetchFn(inscription.content_url);
135
+ clearTimeout(timeoutId);
136
+
137
+ if (!response.ok) {
138
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
139
+ }
140
+ inscriptionData.content = await response.text();
141
+ } finally {
142
+ clearTimeout(timeoutId);
143
+ }
144
+ } catch (err: unknown) {
145
+ const message = err instanceof Error ? err.message : String(err);
146
+ inscriptionData.error = `Failed to fetch content: ${message}`;
147
+ inscriptionDataList.push(inscriptionData);
148
+ continue;
149
+ }
150
+
151
+ try {
152
+ inscriptionData.metadata = await provider.getMetadata(inscriptionId);
153
+ } catch (err) {
154
+ inscriptionData.metadata = null;
155
+ }
156
+
157
+ inscriptionData.isValidDid = didPattern.test(inscriptionData.content);
158
+
159
+ if (inscriptionData.isValidDid && inscriptionData.metadata) {
160
+ const didDocument = inscriptionData.metadata as unknown as DIDDocument;
161
+ if (this.isValidDidDocument(didDocument) && didDocument.id === expectedDid) {
162
+ inscriptionData.didDocument = didDocument;
163
+ } else {
164
+ inscriptionData.error = 'Invalid DID document structure or mismatched ID';
165
+ }
166
+ }
167
+
168
+ if (inscriptionData.content.includes('🔥')) {
169
+ inscriptionData.didDocument = null;
170
+ if (!inscriptionData.error) {
171
+ inscriptionData.error = 'DID has been deactivated';
172
+ }
173
+ }
174
+ } catch (err: unknown) {
175
+ const message = err instanceof Error ? err.message : String(err);
176
+ inscriptionData.error = `Failed to process inscription: ${message}`;
177
+ }
178
+
179
+ inscriptionDataList.push(inscriptionData);
180
+ }
181
+
182
+ let latestValidDidDocument: DIDDocument | null = null;
183
+ let latestInscriptionId: string | undefined;
184
+ for (let i = inscriptionDataList.length - 1; i >= 0; i--) {
185
+ const data = inscriptionDataList[i];
186
+ if (data.didDocument && !data.error) {
187
+ latestValidDidDocument = data.didDocument;
188
+ latestInscriptionId = data.inscriptionId;
189
+ break;
190
+ }
191
+ }
192
+
193
+ return {
194
+ didDocument: latestValidDidDocument,
195
+ inscriptions: inscriptionDataList,
196
+ resolutionMetadata: {
197
+ inscriptionId: latestInscriptionId,
198
+ satNumber,
199
+ network,
200
+ totalInscriptions: inscriptionDataList.length
201
+ },
202
+ didDocumentMetadata: {
203
+ inscriptionId: latestInscriptionId,
204
+ network
205
+ }
206
+ };
207
+ }
208
+
209
+ private isValidDidDocument(doc: unknown): doc is DIDDocument {
210
+ if (!doc || typeof doc !== 'object') return false;
211
+ const d = doc as Record<string, unknown>;
212
+ if (!d.id || typeof d.id !== 'string') return false;
213
+ if (!d['@context']) return false;
214
+ const contexts = Array.isArray(d['@context']) ? d['@context'] : [d['@context']];
215
+ if (!contexts.includes('https://www.w3.org/ns/did/v1') && !contexts.includes('https://w3id.org/did/v1')) {
216
+ return false;
217
+ }
218
+ if (d.verificationMethod && !Array.isArray(d.verificationMethod)) return false;
219
+ if (d.authentication && !Array.isArray(d.authentication)) return false;
220
+ return true;
221
+ }
222
+
223
+ private createErrorResult(error: string, message: string): BtcoDidResolutionResult {
224
+ return {
225
+ didDocument: null,
226
+ resolutionMetadata: { error, message },
227
+ didDocumentMetadata: {}
228
+ };
229
+ }
230
+ }
231
+