@originals/sdk 1.4.2 → 1.4.3
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.
- package/package.json +4 -1
- package/.eslintrc.json +0 -33
- package/src/adapters/FeeOracleMock.ts +0 -9
- package/src/adapters/index.ts +0 -5
- package/src/adapters/providers/OrdHttpProvider.ts +0 -126
- package/src/adapters/providers/OrdMockProvider.ts +0 -101
- package/src/adapters/types.ts +0 -66
- package/src/bitcoin/BitcoinManager.ts +0 -330
- package/src/bitcoin/BroadcastClient.ts +0 -54
- package/src/bitcoin/OrdinalsClient.ts +0 -119
- package/src/bitcoin/PSBTBuilder.ts +0 -106
- package/src/bitcoin/fee-calculation.ts +0 -38
- package/src/bitcoin/providers/OrdNodeProvider.ts +0 -92
- package/src/bitcoin/providers/OrdinalsProvider.ts +0 -56
- package/src/bitcoin/providers/types.ts +0 -59
- package/src/bitcoin/transactions/commit.ts +0 -465
- package/src/bitcoin/transactions/index.ts +0 -13
- package/src/bitcoin/transfer.ts +0 -43
- package/src/bitcoin/utxo-selection.ts +0 -322
- package/src/bitcoin/utxo.ts +0 -113
- package/src/contexts/credentials-v1.json +0 -237
- package/src/contexts/credentials-v2-examples.json +0 -5
- package/src/contexts/credentials-v2.json +0 -340
- package/src/contexts/credentials.json +0 -237
- package/src/contexts/data-integrity-v2.json +0 -81
- package/src/contexts/dids.json +0 -58
- package/src/contexts/ed255192020.json +0 -93
- package/src/contexts/ordinals-plus.json +0 -23
- package/src/contexts/originals.json +0 -22
- package/src/core/OriginalsSDK.ts +0 -416
- package/src/crypto/Multikey.ts +0 -194
- package/src/crypto/Signer.ts +0 -254
- package/src/crypto/noble-init.ts +0 -121
- package/src/did/BtcoDidResolver.ts +0 -227
- package/src/did/DIDManager.ts +0 -694
- package/src/did/Ed25519Verifier.ts +0 -68
- package/src/did/KeyManager.ts +0 -236
- package/src/did/WebVHManager.ts +0 -498
- package/src/did/createBtcoDidDocument.ts +0 -59
- package/src/did/providers/OrdinalsClientProviderAdapter.ts +0 -68
- package/src/events/EventEmitter.ts +0 -222
- package/src/events/index.ts +0 -19
- package/src/events/types.ts +0 -331
- package/src/examples/basic-usage.ts +0 -78
- package/src/examples/create-module-original.ts +0 -435
- package/src/examples/full-lifecycle-flow.ts +0 -514
- package/src/examples/run.ts +0 -60
- package/src/index.ts +0 -150
- package/src/kinds/KindRegistry.ts +0 -290
- package/src/kinds/index.ts +0 -74
- package/src/kinds/types.ts +0 -470
- package/src/kinds/validators/AgentValidator.ts +0 -257
- package/src/kinds/validators/AppValidator.ts +0 -211
- package/src/kinds/validators/DatasetValidator.ts +0 -242
- package/src/kinds/validators/DocumentValidator.ts +0 -311
- package/src/kinds/validators/MediaValidator.ts +0 -269
- package/src/kinds/validators/ModuleValidator.ts +0 -225
- package/src/kinds/validators/base.ts +0 -276
- package/src/kinds/validators/index.ts +0 -12
- package/src/lifecycle/BatchOperations.ts +0 -373
- package/src/lifecycle/LifecycleManager.ts +0 -2126
- package/src/lifecycle/OriginalsAsset.ts +0 -524
- package/src/lifecycle/ProvenanceQuery.ts +0 -280
- package/src/lifecycle/ResourceVersioning.ts +0 -163
- package/src/migration/MigrationManager.ts +0 -527
- package/src/migration/audit/AuditLogger.ts +0 -176
- package/src/migration/checkpoint/CheckpointManager.ts +0 -112
- package/src/migration/checkpoint/CheckpointStorage.ts +0 -101
- package/src/migration/index.ts +0 -33
- package/src/migration/operations/BaseMigration.ts +0 -126
- package/src/migration/operations/PeerToBtcoMigration.ts +0 -105
- package/src/migration/operations/PeerToWebvhMigration.ts +0 -62
- package/src/migration/operations/WebvhToBtcoMigration.ts +0 -105
- package/src/migration/rollback/RollbackManager.ts +0 -170
- package/src/migration/state/StateMachine.ts +0 -92
- package/src/migration/state/StateTracker.ts +0 -156
- package/src/migration/types.ts +0 -344
- package/src/migration/validation/BitcoinValidator.ts +0 -107
- package/src/migration/validation/CredentialValidator.ts +0 -62
- package/src/migration/validation/DIDCompatibilityValidator.ts +0 -151
- package/src/migration/validation/LifecycleValidator.ts +0 -64
- package/src/migration/validation/StorageValidator.ts +0 -79
- package/src/migration/validation/ValidationPipeline.ts +0 -213
- package/src/resources/ResourceManager.ts +0 -655
- package/src/resources/index.ts +0 -21
- package/src/resources/types.ts +0 -202
- package/src/storage/LocalStorageAdapter.ts +0 -61
- package/src/storage/MemoryStorageAdapter.ts +0 -29
- package/src/storage/StorageAdapter.ts +0 -25
- package/src/storage/index.ts +0 -3
- package/src/types/bitcoin.ts +0 -98
- package/src/types/common.ts +0 -92
- package/src/types/credentials.ts +0 -88
- package/src/types/did.ts +0 -31
- package/src/types/external-shims.d.ts +0 -53
- package/src/types/index.ts +0 -7
- package/src/types/network.ts +0 -175
- package/src/utils/EventLogger.ts +0 -298
- package/src/utils/Logger.ts +0 -322
- package/src/utils/MetricsCollector.ts +0 -358
- package/src/utils/bitcoin-address.ts +0 -130
- package/src/utils/cbor.ts +0 -12
- package/src/utils/encoding.ts +0 -127
- package/src/utils/hash.ts +0 -6
- package/src/utils/retry.ts +0 -46
- package/src/utils/satoshi-validation.ts +0 -196
- package/src/utils/serialization.ts +0 -96
- package/src/utils/telemetry.ts +0 -40
- package/src/utils/validation.ts +0 -119
- package/src/vc/CredentialManager.ts +0 -918
- package/src/vc/Issuer.ts +0 -100
- package/src/vc/Verifier.ts +0 -47
- package/src/vc/cryptosuites/bbs.ts +0 -253
- package/src/vc/cryptosuites/bbsSimple.ts +0 -21
- package/src/vc/cryptosuites/eddsa.ts +0 -99
- package/src/vc/documentLoader.ts +0 -67
- package/src/vc/proofs/data-integrity.ts +0 -33
- package/src/vc/utils/jsonld.ts +0 -18
- package/tests/__mocks__/bbs-signatures.js +0 -17
- package/tests/__mocks__/mf-base58.js +0 -24
- package/tests/fixtures/did-documents.ts +0 -247
- package/tests/index.test.ts +0 -21
- package/tests/integration/BatchOperations.test.ts +0 -531
- package/tests/integration/CompleteLifecycle.e2e.test.ts +0 -735
- package/tests/integration/CredentialManager.test.ts +0 -42
- package/tests/integration/DIDManager.test.ts +0 -41
- package/tests/integration/DidPeerToWebVhFlow.test.ts +0 -351
- package/tests/integration/Events.test.ts +0 -435
- package/tests/integration/Lifecycle.transfer.btco.integration.test.ts +0 -25
- package/tests/integration/LifecycleManager.test.ts +0 -21
- package/tests/integration/MultikeyFlow.test.ts +0 -52
- package/tests/integration/TelemetryIntegration.test.ts +0 -395
- package/tests/integration/WebVhPublish.test.ts +0 -48
- package/tests/integration/createTypedOriginal.test.ts +0 -379
- package/tests/integration/migration/peer-to-webvh.test.ts +0 -172
- package/tests/manual/test-commit-creation.ts +0 -323
- package/tests/mocks/MockKeyStore.ts +0 -38
- package/tests/mocks/adapters/MemoryStorageAdapter.ts +0 -24
- package/tests/mocks/adapters/MockFeeOracle.ts +0 -11
- package/tests/mocks/adapters/MockOrdinalsProvider.ts +0 -76
- package/tests/mocks/adapters/OrdMockProvider.test.ts +0 -176
- package/tests/mocks/adapters/index.ts +0 -6
- package/tests/performance/BatchOperations.perf.test.ts +0 -403
- package/tests/performance/logging.perf.test.ts +0 -336
- package/tests/sdk.test.ts +0 -43
- package/tests/security/bitcoin-penetration-tests.test.ts +0 -622
- package/tests/setup.bun.ts +0 -69
- package/tests/setup.jest.ts +0 -23
- package/tests/stress/batch-operations-stress.test.ts +0 -571
- package/tests/unit/adapters/FeeOracleMock.test.ts +0 -40
- package/tests/unit/bitcoin/BitcoinManager.test.ts +0 -293
- package/tests/unit/bitcoin/BroadcastClient.test.ts +0 -52
- package/tests/unit/bitcoin/OrdNodeProvider.test.ts +0 -53
- package/tests/unit/bitcoin/OrdinalsClient.test.ts +0 -381
- package/tests/unit/bitcoin/OrdinalsClientProvider.test.ts +0 -102
- package/tests/unit/bitcoin/PSBTBuilder.test.ts +0 -84
- package/tests/unit/bitcoin/fee-calculation.test.ts +0 -261
- package/tests/unit/bitcoin/transactions/commit.test.ts +0 -649
- package/tests/unit/bitcoin/transfer.test.ts +0 -31
- package/tests/unit/bitcoin/utxo-selection-new.test.ts +0 -502
- package/tests/unit/bitcoin/utxo.more.test.ts +0 -39
- package/tests/unit/bitcoin/utxo.selection.test.ts +0 -38
- package/tests/unit/core/OriginalsSDK.test.ts +0 -152
- package/tests/unit/crypto/Multikey.test.ts +0 -206
- package/tests/unit/crypto/Signer.test.ts +0 -408
- package/tests/unit/did/BtcoDidResolver.test.ts +0 -611
- package/tests/unit/did/DIDManager.more.test.ts +0 -43
- package/tests/unit/did/DIDManager.test.ts +0 -185
- package/tests/unit/did/Ed25519Verifier.test.ts +0 -160
- package/tests/unit/did/KeyManager.test.ts +0 -452
- package/tests/unit/did/OrdinalsClientProviderAdapter.test.ts +0 -45
- package/tests/unit/did/WebVHManager.test.ts +0 -435
- package/tests/unit/did/createBtcoDidDocument.test.ts +0 -67
- package/tests/unit/did/providers/OrdinalsClientProviderAdapter.test.ts +0 -159
- package/tests/unit/events/EventEmitter.test.ts +0 -407
- package/tests/unit/kinds/KindRegistry.test.ts +0 -329
- package/tests/unit/kinds/types.test.ts +0 -409
- package/tests/unit/kinds/validators.test.ts +0 -651
- package/tests/unit/lifecycle/BatchOperations.test.ts +0 -527
- package/tests/unit/lifecycle/LifecycleManager.cleanapi.test.ts +0 -441
- package/tests/unit/lifecycle/LifecycleManager.keymanagement.test.ts +0 -312
- package/tests/unit/lifecycle/LifecycleManager.prov.test.ts +0 -18
- package/tests/unit/lifecycle/LifecycleManager.test.ts +0 -213
- package/tests/unit/lifecycle/LifecycleManager.transfer.unit.test.ts +0 -30
- package/tests/unit/lifecycle/OriginalsAsset.test.ts +0 -176
- package/tests/unit/lifecycle/ProvenanceQuery.test.ts +0 -577
- package/tests/unit/lifecycle/ResourceVersioning.test.ts +0 -651
- package/tests/unit/resources/ResourceManager.test.ts +0 -740
- package/tests/unit/storage/MemoryStorageAdapter.test.ts +0 -93
- package/tests/unit/types/network.test.ts +0 -255
- package/tests/unit/utils/EventIntegration.test.ts +0 -384
- package/tests/unit/utils/Logger.test.ts +0 -473
- package/tests/unit/utils/MetricsCollector.test.ts +0 -358
- package/tests/unit/utils/bitcoin-address.test.ts +0 -250
- package/tests/unit/utils/cbor.test.ts +0 -35
- package/tests/unit/utils/encoding.test.ts +0 -318
- package/tests/unit/utils/hash.test.ts +0 -12
- package/tests/unit/utils/retry.test.ts +0 -100
- package/tests/unit/utils/satoshi-validation.test.ts +0 -354
- package/tests/unit/utils/serialization.test.ts +0 -124
- package/tests/unit/utils/telemetry.test.ts +0 -52
- package/tests/unit/utils/validation.test.ts +0 -141
- package/tests/unit/vc/CredentialManager.helpers.test.ts +0 -527
- package/tests/unit/vc/CredentialManager.test.ts +0 -487
- package/tests/unit/vc/Issuer.test.ts +0 -107
- package/tests/unit/vc/Verifier.test.ts +0 -525
- package/tests/unit/vc/bbs.test.ts +0 -282
- package/tests/unit/vc/cryptosuites/eddsa.test.ts +0 -398
- package/tests/unit/vc/documentLoader.test.ts +0 -121
- package/tests/unit/vc/proofs/data-integrity.test.ts +0 -24
- package/tsconfig.json +0 -31
- package/tsconfig.test.json +0 -15
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from 'bun:test';
|
|
2
|
-
import { OriginalsSDK, LifecycleManager, type LifecycleProgress, type CostEstimate, type MigrationValidation } from '../../../src';
|
|
3
|
-
import { MockOrdinalsProvider } from '../../mocks/adapters';
|
|
4
|
-
import { DIDManager } from '../../../src/did/DIDManager';
|
|
5
|
-
import { CredentialManager } from '../../../src/vc/CredentialManager';
|
|
6
|
-
|
|
7
|
-
const resources = [
|
|
8
|
-
{
|
|
9
|
-
id: 'res1',
|
|
10
|
-
type: 'text',
|
|
11
|
-
content: 'hello world',
|
|
12
|
-
contentType: 'text/plain',
|
|
13
|
-
hash: 'deadbeef'
|
|
14
|
-
}
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
describe('LifecycleManager - Clean API', () => {
|
|
18
|
-
describe('createDraft', () => {
|
|
19
|
-
test('creates a peer-layer asset', async () => {
|
|
20
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
21
|
-
const asset = await sdk.lifecycle.createDraft(resources);
|
|
22
|
-
expect(asset.currentLayer).toBe('did:peer');
|
|
23
|
-
expect(asset.id.startsWith('did:peer:')).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test('reports progress during creation', async () => {
|
|
27
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
28
|
-
const progressEvents: LifecycleProgress[] = [];
|
|
29
|
-
|
|
30
|
-
const asset = await sdk.lifecycle.createDraft(resources, {
|
|
31
|
-
onProgress: (p) => progressEvents.push({ ...p })
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
expect(asset.currentLayer).toBe('did:peer');
|
|
35
|
-
expect(progressEvents.length).toBeGreaterThan(0);
|
|
36
|
-
expect(progressEvents[0].phase).toBe('preparing');
|
|
37
|
-
expect(progressEvents[progressEvents.length - 1].phase).toBe('complete');
|
|
38
|
-
expect(progressEvents[progressEvents.length - 1].percentage).toBe(100);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('reports failure progress on error', async () => {
|
|
42
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
43
|
-
const progressEvents: LifecycleProgress[] = [];
|
|
44
|
-
|
|
45
|
-
// Pass invalid resources to trigger error
|
|
46
|
-
await expect(
|
|
47
|
-
sdk.lifecycle.createDraft([], {
|
|
48
|
-
onProgress: (p) => progressEvents.push({ ...p })
|
|
49
|
-
})
|
|
50
|
-
).rejects.toThrow();
|
|
51
|
-
|
|
52
|
-
// Should have a failed progress event
|
|
53
|
-
const failedEvent = progressEvents.find(p => p.phase === 'failed');
|
|
54
|
-
expect(failedEvent).toBeDefined();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('publish', () => {
|
|
59
|
-
test('migrates asset to webvh layer', async () => {
|
|
60
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
61
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
62
|
-
const published = await sdk.lifecycle.publish(draft, 'example.com');
|
|
63
|
-
|
|
64
|
-
expect(published.currentLayer).toBe('did:webvh');
|
|
65
|
-
expect(published.bindings?.['did:webvh']).toContain('example.com');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('reports progress during publish', async () => {
|
|
69
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
70
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
71
|
-
const progressEvents: LifecycleProgress[] = [];
|
|
72
|
-
|
|
73
|
-
await sdk.lifecycle.publish(draft, 'example.com', {
|
|
74
|
-
onProgress: (p) => progressEvents.push({ ...p })
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
expect(progressEvents.length).toBeGreaterThan(0);
|
|
78
|
-
expect(progressEvents[progressEvents.length - 1].phase).toBe('complete');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('validates before publishing', async () => {
|
|
82
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
83
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
84
|
-
|
|
85
|
-
// Migrate to webvh first (can't publish from webvh)
|
|
86
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
87
|
-
|
|
88
|
-
// Try to publish again - should fail validation
|
|
89
|
-
await expect(
|
|
90
|
-
sdk.lifecycle.publish(draft, 'other.com')
|
|
91
|
-
).rejects.toThrow(/validation failed/i);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
describe('inscribe', () => {
|
|
96
|
-
test('inscribes asset on Bitcoin', async () => {
|
|
97
|
-
const provider = new MockOrdinalsProvider();
|
|
98
|
-
const sdk = OriginalsSDK.create({
|
|
99
|
-
network: 'regtest',
|
|
100
|
-
ordinalsProvider: provider
|
|
101
|
-
} as any);
|
|
102
|
-
|
|
103
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
104
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
105
|
-
const inscribed = await sdk.lifecycle.inscribe(draft, { feeRate: 10 });
|
|
106
|
-
|
|
107
|
-
expect(inscribed.currentLayer).toBe('did:btco');
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test('reports progress during inscription', async () => {
|
|
111
|
-
const provider = new MockOrdinalsProvider();
|
|
112
|
-
const sdk = OriginalsSDK.create({
|
|
113
|
-
network: 'regtest',
|
|
114
|
-
ordinalsProvider: provider
|
|
115
|
-
} as any);
|
|
116
|
-
|
|
117
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
118
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
119
|
-
const progressEvents: LifecycleProgress[] = [];
|
|
120
|
-
|
|
121
|
-
await sdk.lifecycle.inscribe(draft, {
|
|
122
|
-
feeRate: 10,
|
|
123
|
-
onProgress: (p) => progressEvents.push({ ...p })
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
expect(progressEvents.length).toBeGreaterThan(0);
|
|
127
|
-
// Should include cost estimate in messages
|
|
128
|
-
const preparingEvent = progressEvents.find(p =>
|
|
129
|
-
p.phase === 'preparing' && p.message.includes('sats')
|
|
130
|
-
);
|
|
131
|
-
expect(preparingEvent).toBeDefined();
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
test('fails validation without ordinals provider', async () => {
|
|
135
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
136
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
137
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
138
|
-
|
|
139
|
-
await expect(
|
|
140
|
-
sdk.lifecycle.inscribe(draft)
|
|
141
|
-
).rejects.toThrow(/ordinalsProvider/i);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
describe('transfer', () => {
|
|
146
|
-
test('transfers inscribed asset', async () => {
|
|
147
|
-
const provider = new MockOrdinalsProvider();
|
|
148
|
-
const sdk = OriginalsSDK.create({
|
|
149
|
-
network: 'regtest',
|
|
150
|
-
ordinalsProvider: provider
|
|
151
|
-
} as any);
|
|
152
|
-
|
|
153
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
154
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
155
|
-
await sdk.lifecycle.inscribe(draft, { feeRate: 10 });
|
|
156
|
-
|
|
157
|
-
const tx = await sdk.lifecycle.transfer(
|
|
158
|
-
draft,
|
|
159
|
-
'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx'
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
expect(tx.txid).toBeDefined();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test('reports progress during transfer', async () => {
|
|
166
|
-
const provider = new MockOrdinalsProvider();
|
|
167
|
-
const sdk = OriginalsSDK.create({
|
|
168
|
-
network: 'regtest',
|
|
169
|
-
ordinalsProvider: provider
|
|
170
|
-
} as any);
|
|
171
|
-
|
|
172
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
173
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
174
|
-
await sdk.lifecycle.inscribe(draft, { feeRate: 10 });
|
|
175
|
-
|
|
176
|
-
const progressEvents: LifecycleProgress[] = [];
|
|
177
|
-
|
|
178
|
-
await sdk.lifecycle.transfer(
|
|
179
|
-
draft,
|
|
180
|
-
'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx',
|
|
181
|
-
{ onProgress: (p) => progressEvents.push({ ...p }) }
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
expect(progressEvents.length).toBeGreaterThan(0);
|
|
185
|
-
expect(progressEvents[progressEvents.length - 1].details?.transactionId).toBeDefined();
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
test('fails if asset not inscribed', async () => {
|
|
189
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
190
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
191
|
-
|
|
192
|
-
await expect(
|
|
193
|
-
sdk.lifecycle.transfer(draft, 'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx')
|
|
194
|
-
).rejects.toThrow(/must be inscribed/i);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
describe('LifecycleManager - Cost Estimation', () => {
|
|
200
|
-
describe('estimateCost', () => {
|
|
201
|
-
test('returns zero cost for webvh migration', async () => {
|
|
202
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
203
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
204
|
-
|
|
205
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:webvh');
|
|
206
|
-
|
|
207
|
-
expect(cost.totalSats).toBe(0);
|
|
208
|
-
expect(cost.targetLayer).toBe('did:webvh');
|
|
209
|
-
expect(cost.confidence).toBe('high');
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
test('estimates btco inscription cost', async () => {
|
|
213
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
214
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
215
|
-
|
|
216
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:btco', 10);
|
|
217
|
-
|
|
218
|
-
expect(cost.totalSats).toBeGreaterThan(0);
|
|
219
|
-
expect(cost.feeRate).toBe(10);
|
|
220
|
-
expect(cost.targetLayer).toBe('did:btco');
|
|
221
|
-
expect(cost.breakdown.networkFee).toBeGreaterThan(0);
|
|
222
|
-
expect(cost.breakdown.dustValue).toBe(546);
|
|
223
|
-
expect(cost.dataSize).toBeGreaterThan(0);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
test('uses fee oracle when available', async () => {
|
|
227
|
-
const mockFeeOracle = {
|
|
228
|
-
estimateFeeRate: async (blocks: number) => 15
|
|
229
|
-
};
|
|
230
|
-
const sdk = OriginalsSDK.create({
|
|
231
|
-
network: 'regtest',
|
|
232
|
-
feeOracle: mockFeeOracle as any
|
|
233
|
-
});
|
|
234
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
235
|
-
|
|
236
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:btco');
|
|
237
|
-
|
|
238
|
-
expect(cost.feeRate).toBe(15);
|
|
239
|
-
expect(cost.confidence).toBe('high');
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
test('uses ordinals provider when fee oracle unavailable', async () => {
|
|
243
|
-
const provider = new MockOrdinalsProvider();
|
|
244
|
-
const sdk = OriginalsSDK.create({
|
|
245
|
-
network: 'regtest',
|
|
246
|
-
ordinalsProvider: provider
|
|
247
|
-
} as any);
|
|
248
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
249
|
-
|
|
250
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:btco');
|
|
251
|
-
|
|
252
|
-
expect(cost.feeRate).toBeGreaterThan(0);
|
|
253
|
-
expect(cost.confidence).toBe('medium');
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
test('falls back to default fee rate', async () => {
|
|
257
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
258
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
259
|
-
|
|
260
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:btco');
|
|
261
|
-
|
|
262
|
-
expect(cost.feeRate).toBe(10); // Default
|
|
263
|
-
expect(cost.confidence).toBe('low');
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
test('returns zero for peer layer (no migration needed)', async () => {
|
|
267
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
268
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
269
|
-
|
|
270
|
-
const cost = await sdk.lifecycle.estimateCost(draft, 'did:peer');
|
|
271
|
-
|
|
272
|
-
expect(cost.totalSats).toBe(0);
|
|
273
|
-
expect(cost.confidence).toBe('high');
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
describe('LifecycleManager - Migration Validation', () => {
|
|
279
|
-
describe('validateMigration', () => {
|
|
280
|
-
test('validates peer to webvh migration', async () => {
|
|
281
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
282
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
283
|
-
|
|
284
|
-
const validation = await sdk.lifecycle.validateMigration(draft, 'did:webvh');
|
|
285
|
-
|
|
286
|
-
expect(validation.valid).toBe(true);
|
|
287
|
-
expect(validation.errors).toHaveLength(0);
|
|
288
|
-
expect(validation.currentLayer).toBe('did:peer');
|
|
289
|
-
expect(validation.targetLayer).toBe('did:webvh');
|
|
290
|
-
expect(validation.checks.layerTransition).toBe(true);
|
|
291
|
-
expect(validation.checks.resourcesValid).toBe(true);
|
|
292
|
-
expect(validation.checks.didDocumentValid).toBe(true);
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
test('validates peer to btco migration with provider', async () => {
|
|
296
|
-
const provider = new MockOrdinalsProvider();
|
|
297
|
-
const sdk = OriginalsSDK.create({
|
|
298
|
-
network: 'regtest',
|
|
299
|
-
ordinalsProvider: provider
|
|
300
|
-
} as any);
|
|
301
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
302
|
-
|
|
303
|
-
const validation = await sdk.lifecycle.validateMigration(draft, 'did:btco');
|
|
304
|
-
|
|
305
|
-
expect(validation.valid).toBe(true);
|
|
306
|
-
expect(validation.checks.bitcoinReadiness).toBe(true);
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
test('fails validation for btco without provider', async () => {
|
|
310
|
-
const sdk = OriginalsSDK.create({ network: 'regtest' });
|
|
311
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
312
|
-
|
|
313
|
-
const validation = await sdk.lifecycle.validateMigration(draft, 'did:btco');
|
|
314
|
-
|
|
315
|
-
expect(validation.valid).toBe(false);
|
|
316
|
-
expect(validation.errors).toContain('Bitcoin inscription requires an ordinalsProvider to be configured');
|
|
317
|
-
expect(validation.checks.bitcoinReadiness).toBe(false);
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
test('rejects invalid layer transition (btco to webvh)', async () => {
|
|
321
|
-
const provider = new MockOrdinalsProvider();
|
|
322
|
-
const sdk = OriginalsSDK.create({
|
|
323
|
-
network: 'regtest',
|
|
324
|
-
ordinalsProvider: provider
|
|
325
|
-
} as any);
|
|
326
|
-
|
|
327
|
-
const draft = await sdk.lifecycle.createDraft(resources);
|
|
328
|
-
await sdk.lifecycle.publish(draft, 'example.com');
|
|
329
|
-
await sdk.lifecycle.inscribe(draft, { feeRate: 10 });
|
|
330
|
-
|
|
331
|
-
const validation = await sdk.lifecycle.validateMigration(draft, 'did:webvh');
|
|
332
|
-
|
|
333
|
-
expect(validation.valid).toBe(false);
|
|
334
|
-
expect(validation.errors.some(e => e.includes('Invalid migration'))).toBe(true);
|
|
335
|
-
expect(validation.checks.layerTransition).toBe(false);
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
test('rejects asset with no resources', async () => {
|
|
339
|
-
const config: any = { network: 'regtest', defaultKeyType: 'Ed25519' };
|
|
340
|
-
const didManager = new DIDManager(config);
|
|
341
|
-
const credentialManager = new CredentialManager(config);
|
|
342
|
-
const lm = new LifecycleManager(config, didManager, credentialManager);
|
|
343
|
-
|
|
344
|
-
// Create a fake asset with no resources
|
|
345
|
-
const fakeAsset = {
|
|
346
|
-
currentLayer: 'did:peer' as const,
|
|
347
|
-
resources: [],
|
|
348
|
-
did: { id: 'did:peer:test' },
|
|
349
|
-
credentials: []
|
|
350
|
-
};
|
|
351
|
-
|
|
352
|
-
const validation = await lm.validateMigration(fakeAsset as any, 'did:webvh');
|
|
353
|
-
|
|
354
|
-
expect(validation.valid).toBe(false);
|
|
355
|
-
expect(validation.errors.some(e => e.includes('at least one resource'))).toBe(true);
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
test('rejects asset with invalid resource hash', async () => {
|
|
359
|
-
const config: any = { network: 'regtest', defaultKeyType: 'Ed25519' };
|
|
360
|
-
const didManager = new DIDManager(config);
|
|
361
|
-
const credentialManager = new CredentialManager(config);
|
|
362
|
-
const lm = new LifecycleManager(config, didManager, credentialManager);
|
|
363
|
-
|
|
364
|
-
const fakeAsset = {
|
|
365
|
-
currentLayer: 'did:peer' as const,
|
|
366
|
-
resources: [{ id: 'r1', type: 'text', contentType: 'text/plain', hash: 'not-hex!' }],
|
|
367
|
-
did: { id: 'did:peer:test' },
|
|
368
|
-
credentials: []
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
const validation = await lm.validateMigration(fakeAsset as any, 'did:webvh');
|
|
372
|
-
|
|
373
|
-
expect(validation.valid).toBe(false);
|
|
374
|
-
expect(validation.errors.some(e => e.includes('invalid hash'))).toBe(true);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
test('warns about large manifest sizes', async () => {
|
|
378
|
-
const provider = new MockOrdinalsProvider();
|
|
379
|
-
const sdk = OriginalsSDK.create({
|
|
380
|
-
network: 'regtest',
|
|
381
|
-
ordinalsProvider: provider
|
|
382
|
-
} as any);
|
|
383
|
-
|
|
384
|
-
// Create asset with many resources to increase manifest size
|
|
385
|
-
// Need 1000+ resources to exceed 100KB threshold (each resource adds ~100 bytes)
|
|
386
|
-
const manyResources = Array.from({ length: 1200 }, (_, i) => ({
|
|
387
|
-
id: `resource-${i}-with-longer-name`,
|
|
388
|
-
type: 'text',
|
|
389
|
-
content: 'x'.repeat(200),
|
|
390
|
-
contentType: 'text/plain',
|
|
391
|
-
hash: 'a'.repeat(64)
|
|
392
|
-
}));
|
|
393
|
-
|
|
394
|
-
const draft = await sdk.lifecycle.createDraft(manyResources);
|
|
395
|
-
const validation = await sdk.lifecycle.validateMigration(draft, 'did:btco');
|
|
396
|
-
|
|
397
|
-
expect(validation.warnings.some(w => w.includes('Large manifest'))).toBe(true);
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
test('validates credentials structure', async () => {
|
|
401
|
-
const config: any = { network: 'regtest', defaultKeyType: 'Ed25519' };
|
|
402
|
-
const didManager = new DIDManager(config);
|
|
403
|
-
const credentialManager = new CredentialManager(config);
|
|
404
|
-
const lm = new LifecycleManager(config, didManager, credentialManager);
|
|
405
|
-
|
|
406
|
-
const fakeAsset = {
|
|
407
|
-
currentLayer: 'did:peer' as const,
|
|
408
|
-
resources: [{ id: 'r1', type: 'text', contentType: 'text/plain', hash: 'deadbeef' }],
|
|
409
|
-
did: { id: 'did:peer:test' },
|
|
410
|
-
credentials: [
|
|
411
|
-
{ type: ['VerifiableCredential'], issuer: 'did:test:issuer', issuanceDate: '2024-01-01' }
|
|
412
|
-
]
|
|
413
|
-
};
|
|
414
|
-
|
|
415
|
-
const validation = await lm.validateMigration(fakeAsset as any, 'did:webvh');
|
|
416
|
-
|
|
417
|
-
expect(validation.checks.credentialsValid).toBe(true);
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
test('warns about credentials with missing fields', async () => {
|
|
421
|
-
const config: any = { network: 'regtest', defaultKeyType: 'Ed25519' };
|
|
422
|
-
const didManager = new DIDManager(config);
|
|
423
|
-
const credentialManager = new CredentialManager(config);
|
|
424
|
-
const lm = new LifecycleManager(config, didManager, credentialManager);
|
|
425
|
-
|
|
426
|
-
const fakeAsset = {
|
|
427
|
-
currentLayer: 'did:peer' as const,
|
|
428
|
-
resources: [{ id: 'r1', type: 'text', contentType: 'text/plain', hash: 'deadbeef' }],
|
|
429
|
-
did: { id: 'did:peer:test' },
|
|
430
|
-
credentials: [
|
|
431
|
-
{ type: ['VerifiableCredential'] } // Missing issuer and issuanceDate
|
|
432
|
-
]
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
const validation = await lm.validateMigration(fakeAsset as any, 'did:webvh');
|
|
436
|
-
|
|
437
|
-
expect(validation.warnings.some(w => w.includes('missing fields'))).toBe(true);
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
|