@originals/sdk 1.4.2 → 1.4.5
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/dist/adapters/FeeOracleMock.d.ts +6 -0
- package/dist/adapters/FeeOracleMock.js +8 -0
- package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/providers/OrdHttpProvider.d.ts +56 -0
- package/dist/adapters/providers/OrdHttpProvider.js +110 -0
- package/dist/adapters/providers/OrdMockProvider.d.ts +70 -0
- package/dist/adapters/providers/OrdMockProvider.js +75 -0
- package/dist/adapters/types.d.ts +71 -0
- package/dist/adapters/types.js +1 -0
- package/dist/bitcoin/BitcoinManager.d.ts +15 -0
- package/dist/bitcoin/BitcoinManager.js +262 -0
- package/dist/bitcoin/BroadcastClient.d.ts +30 -0
- package/dist/bitcoin/BroadcastClient.js +35 -0
- package/dist/bitcoin/OrdinalsClient.d.ts +21 -0
- package/dist/bitcoin/OrdinalsClient.js +105 -0
- package/dist/bitcoin/PSBTBuilder.d.ts +24 -0
- package/dist/bitcoin/PSBTBuilder.js +80 -0
- package/dist/bitcoin/fee-calculation.d.ts +14 -0
- package/{src/bitcoin/fee-calculation.ts → dist/bitcoin/fee-calculation.js} +5 -12
- package/dist/bitcoin/providers/OrdNodeProvider.d.ts +38 -0
- package/dist/bitcoin/providers/OrdNodeProvider.js +67 -0
- package/dist/bitcoin/providers/OrdinalsProvider.d.ts +33 -0
- package/dist/bitcoin/providers/OrdinalsProvider.js +50 -0
- package/dist/bitcoin/providers/types.d.ts +63 -0
- package/dist/bitcoin/providers/types.js +1 -0
- package/dist/bitcoin/transactions/commit.d.ts +89 -0
- package/dist/bitcoin/transactions/commit.js +311 -0
- package/dist/bitcoin/transactions/index.d.ts +7 -0
- package/{src/bitcoin/transactions/index.ts → dist/bitcoin/transactions/index.js} +1 -6
- package/dist/bitcoin/transfer.d.ts +9 -0
- package/dist/bitcoin/transfer.js +26 -0
- package/dist/bitcoin/utxo-selection.d.ts +78 -0
- package/dist/bitcoin/utxo-selection.js +237 -0
- package/dist/bitcoin/utxo.d.ts +26 -0
- package/dist/bitcoin/utxo.js +78 -0
- package/dist/contexts/credentials-v1.json +195 -0
- package/dist/contexts/credentials-v2-examples.json +5 -0
- package/dist/contexts/credentials-v2.json +301 -0
- package/dist/contexts/credentials.json +195 -0
- package/dist/contexts/data-integrity-v2.json +81 -0
- package/dist/contexts/dids.json +57 -0
- package/dist/contexts/ed255192020.json +93 -0
- package/dist/contexts/ordinals-plus.json +23 -0
- package/dist/contexts/originals.json +22 -0
- package/dist/core/OriginalsSDK.d.ts +158 -0
- package/dist/core/OriginalsSDK.js +274 -0
- package/dist/crypto/Multikey.d.ts +30 -0
- package/dist/crypto/Multikey.js +149 -0
- package/dist/crypto/Signer.d.ts +21 -0
- package/dist/crypto/Signer.js +196 -0
- package/dist/crypto/noble-init.d.ts +18 -0
- package/dist/crypto/noble-init.js +106 -0
- package/dist/did/BtcoDidResolver.d.ts +57 -0
- package/dist/did/BtcoDidResolver.js +166 -0
- package/dist/did/DIDManager.d.ts +101 -0
- package/dist/did/DIDManager.js +493 -0
- package/dist/did/Ed25519Verifier.d.ts +30 -0
- package/dist/did/Ed25519Verifier.js +59 -0
- package/dist/did/KeyManager.d.ts +17 -0
- package/dist/did/KeyManager.js +207 -0
- package/dist/did/WebVHManager.d.ts +100 -0
- package/dist/did/WebVHManager.js +312 -0
- package/dist/did/createBtcoDidDocument.d.ts +10 -0
- package/dist/did/createBtcoDidDocument.js +42 -0
- package/dist/did/providers/OrdinalsClientProviderAdapter.d.ts +23 -0
- package/dist/did/providers/OrdinalsClientProviderAdapter.js +51 -0
- package/dist/events/EventEmitter.d.ts +115 -0
- package/dist/events/EventEmitter.js +198 -0
- package/dist/events/index.d.ts +7 -0
- package/dist/events/index.js +6 -0
- package/dist/events/types.d.ts +286 -0
- package/dist/events/types.js +9 -0
- package/dist/examples/basic-usage.d.ts +3 -0
- package/dist/examples/basic-usage.js +62 -0
- package/dist/examples/create-module-original.d.ts +32 -0
- package/dist/examples/create-module-original.js +376 -0
- package/dist/examples/full-lifecycle-flow.d.ts +56 -0
- package/dist/examples/full-lifecycle-flow.js +419 -0
- package/dist/examples/run.d.ts +12 -0
- package/dist/examples/run.js +51 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +52 -0
- package/dist/kinds/KindRegistry.d.ts +76 -0
- package/dist/kinds/KindRegistry.js +216 -0
- package/dist/kinds/index.d.ts +33 -0
- package/{src/kinds/index.ts → dist/kinds/index.js} +6 -44
- package/dist/kinds/types.d.ts +363 -0
- package/dist/kinds/types.js +25 -0
- package/dist/kinds/validators/AgentValidator.d.ts +14 -0
- package/dist/kinds/validators/AgentValidator.js +155 -0
- package/dist/kinds/validators/AppValidator.d.ts +14 -0
- package/dist/kinds/validators/AppValidator.js +135 -0
- package/dist/kinds/validators/DatasetValidator.d.ts +14 -0
- package/dist/kinds/validators/DatasetValidator.js +148 -0
- package/dist/kinds/validators/DocumentValidator.d.ts +14 -0
- package/dist/kinds/validators/DocumentValidator.js +180 -0
- package/dist/kinds/validators/MediaValidator.d.ts +14 -0
- package/dist/kinds/validators/MediaValidator.js +172 -0
- package/dist/kinds/validators/ModuleValidator.d.ts +14 -0
- package/dist/kinds/validators/ModuleValidator.js +140 -0
- package/dist/kinds/validators/base.d.ts +96 -0
- package/dist/kinds/validators/base.js +218 -0
- package/{src/kinds/validators/index.ts → dist/kinds/validators/index.d.ts} +0 -2
- package/dist/kinds/validators/index.js +10 -0
- package/dist/lifecycle/BatchOperations.d.ts +147 -0
- package/dist/lifecycle/BatchOperations.js +251 -0
- package/dist/lifecycle/LifecycleManager.d.ts +362 -0
- package/dist/lifecycle/LifecycleManager.js +1692 -0
- package/dist/lifecycle/OriginalsAsset.d.ts +164 -0
- package/dist/lifecycle/OriginalsAsset.js +380 -0
- package/dist/lifecycle/ProvenanceQuery.d.ts +126 -0
- package/dist/lifecycle/ProvenanceQuery.js +220 -0
- package/dist/lifecycle/ResourceVersioning.d.ts +73 -0
- package/dist/lifecycle/ResourceVersioning.js +127 -0
- package/dist/migration/MigrationManager.d.ts +86 -0
- package/dist/migration/MigrationManager.js +412 -0
- package/dist/migration/audit/AuditLogger.d.ts +51 -0
- package/dist/migration/audit/AuditLogger.js +156 -0
- package/dist/migration/checkpoint/CheckpointManager.d.ts +31 -0
- package/dist/migration/checkpoint/CheckpointManager.js +96 -0
- package/dist/migration/checkpoint/CheckpointStorage.d.ts +26 -0
- package/dist/migration/checkpoint/CheckpointStorage.js +89 -0
- package/dist/migration/index.d.ts +22 -0
- package/{src/migration/index.ts → dist/migration/index.js} +0 -6
- package/dist/migration/operations/BaseMigration.d.ts +48 -0
- package/dist/migration/operations/BaseMigration.js +83 -0
- package/dist/migration/operations/PeerToBtcoMigration.d.ts +25 -0
- package/dist/migration/operations/PeerToBtcoMigration.js +67 -0
- package/dist/migration/operations/PeerToWebvhMigration.d.ts +19 -0
- package/dist/migration/operations/PeerToWebvhMigration.js +46 -0
- package/dist/migration/operations/WebvhToBtcoMigration.d.ts +25 -0
- package/dist/migration/operations/WebvhToBtcoMigration.js +67 -0
- package/dist/migration/rollback/RollbackManager.d.ts +29 -0
- package/dist/migration/rollback/RollbackManager.js +146 -0
- package/dist/migration/state/StateMachine.d.ts +25 -0
- package/dist/migration/state/StateMachine.js +76 -0
- package/dist/migration/state/StateTracker.d.ts +36 -0
- package/dist/migration/state/StateTracker.js +123 -0
- package/dist/migration/types.d.ts +306 -0
- package/dist/migration/types.js +33 -0
- package/dist/migration/validation/BitcoinValidator.d.ts +13 -0
- package/dist/migration/validation/BitcoinValidator.js +83 -0
- package/dist/migration/validation/CredentialValidator.d.ts +13 -0
- package/dist/migration/validation/CredentialValidator.js +46 -0
- package/dist/migration/validation/DIDCompatibilityValidator.d.ts +16 -0
- package/dist/migration/validation/DIDCompatibilityValidator.js +127 -0
- package/dist/migration/validation/LifecycleValidator.d.ts +10 -0
- package/dist/migration/validation/LifecycleValidator.js +52 -0
- package/dist/migration/validation/StorageValidator.d.ts +10 -0
- package/dist/migration/validation/StorageValidator.js +65 -0
- package/dist/migration/validation/ValidationPipeline.d.ts +29 -0
- package/dist/migration/validation/ValidationPipeline.js +180 -0
- package/dist/resources/ResourceManager.d.ts +231 -0
- package/dist/resources/ResourceManager.js +573 -0
- package/{src/resources/index.ts → dist/resources/index.d.ts} +3 -13
- package/dist/resources/index.js +10 -0
- package/dist/resources/types.d.ts +93 -0
- package/dist/resources/types.js +80 -0
- package/dist/storage/LocalStorageAdapter.d.ts +11 -0
- package/dist/storage/LocalStorageAdapter.js +53 -0
- package/dist/storage/MemoryStorageAdapter.d.ts +6 -0
- package/dist/storage/MemoryStorageAdapter.js +21 -0
- package/dist/storage/StorageAdapter.d.ts +16 -0
- package/dist/storage/StorageAdapter.js +1 -0
- package/{src/storage/index.ts → dist/storage/index.d.ts} +0 -1
- package/dist/storage/index.js +2 -0
- package/dist/types/bitcoin.d.ts +84 -0
- package/dist/types/bitcoin.js +1 -0
- package/dist/types/common.d.ts +82 -0
- package/dist/types/common.js +1 -0
- package/dist/types/credentials.d.ts +75 -0
- package/dist/types/credentials.js +1 -0
- package/dist/types/did.d.ts +26 -0
- package/dist/types/did.js +1 -0
- package/{src/types/index.ts → dist/types/index.d.ts} +0 -2
- package/dist/types/index.js +5 -0
- package/dist/types/network.d.ts +78 -0
- package/dist/types/network.js +145 -0
- package/dist/utils/EventLogger.d.ts +71 -0
- package/dist/utils/EventLogger.js +232 -0
- package/dist/utils/Logger.d.ts +106 -0
- package/dist/utils/Logger.js +257 -0
- package/dist/utils/MetricsCollector.d.ts +110 -0
- package/dist/utils/MetricsCollector.js +264 -0
- package/dist/utils/bitcoin-address.d.ts +38 -0
- package/dist/utils/bitcoin-address.js +113 -0
- package/dist/utils/cbor.d.ts +2 -0
- package/dist/utils/cbor.js +9 -0
- package/dist/utils/encoding.d.ts +37 -0
- package/dist/utils/encoding.js +120 -0
- package/dist/utils/hash.d.ts +1 -0
- package/dist/utils/hash.js +5 -0
- package/dist/utils/retry.d.ts +10 -0
- package/dist/utils/retry.js +35 -0
- package/dist/utils/satoshi-validation.d.ts +60 -0
- package/dist/utils/satoshi-validation.js +156 -0
- package/dist/utils/serialization.d.ts +14 -0
- package/dist/utils/serialization.js +76 -0
- package/dist/utils/telemetry.d.ts +17 -0
- package/dist/utils/telemetry.js +24 -0
- package/dist/utils/validation.d.ts +5 -0
- package/dist/utils/validation.js +98 -0
- package/dist/vc/CredentialManager.d.ts +329 -0
- package/dist/vc/CredentialManager.js +615 -0
- package/dist/vc/Issuer.d.ts +27 -0
- package/dist/vc/Issuer.js +70 -0
- package/dist/vc/Verifier.d.ts +16 -0
- package/dist/vc/Verifier.js +50 -0
- package/dist/vc/cryptosuites/bbs.d.ts +44 -0
- package/dist/vc/cryptosuites/bbs.js +213 -0
- package/dist/vc/cryptosuites/bbsSimple.d.ts +9 -0
- package/dist/vc/cryptosuites/bbsSimple.js +12 -0
- package/dist/vc/cryptosuites/eddsa.d.ts +30 -0
- package/dist/vc/cryptosuites/eddsa.js +81 -0
- package/dist/vc/documentLoader.d.ts +16 -0
- package/dist/vc/documentLoader.js +59 -0
- package/dist/vc/proofs/data-integrity.d.ts +21 -0
- package/dist/vc/proofs/data-integrity.js +15 -0
- package/dist/vc/utils/jsonld.d.ts +2 -0
- package/dist/vc/utils/jsonld.js +15 -0
- package/package.json +5 -1
- package/.eslintrc.json +0 -33
- package/src/adapters/FeeOracleMock.ts +0 -9
- 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/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/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/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/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/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/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/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/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
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@originals/sdk",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.5",
|
|
4
4
|
"description": "TypeScript SDK for the Originals Protocol - creating, discovering, and transferring digital assets with cryptographically verifiable provenance",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
8
11
|
"exports": {
|
|
9
12
|
".": {
|
|
10
13
|
"types": "./dist/index.d.ts",
|
|
@@ -13,6 +16,7 @@
|
|
|
13
16
|
},
|
|
14
17
|
"scripts": {
|
|
15
18
|
"build": "tsc && tsc-alias",
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
16
20
|
"test": "bun test tests/integration && bun test tests/unit && bun test tests/security && bun test tests/stress",
|
|
17
21
|
"test:coverage": "bun test tests/integration tests/unit --coverage",
|
|
18
22
|
"check-coverage": "bun run ../../scripts/check-coverage.ts",
|
package/.eslintrc.json
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"parser": "@typescript-eslint/parser",
|
|
3
|
-
"parserOptions": {
|
|
4
|
-
"ecmaVersion": 2022,
|
|
5
|
-
"sourceType": "module",
|
|
6
|
-
"project": true
|
|
7
|
-
},
|
|
8
|
-
"plugins": ["@typescript-eslint"],
|
|
9
|
-
"extends": [
|
|
10
|
-
"eslint:recommended",
|
|
11
|
-
"plugin:@typescript-eslint/recommended",
|
|
12
|
-
"plugin:@typescript-eslint/recommended-requiring-type-checking"
|
|
13
|
-
],
|
|
14
|
-
"rules": {
|
|
15
|
-
"@typescript-eslint/no-explicit-any": "warn",
|
|
16
|
-
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
17
|
-
"@typescript-eslint/explicit-function-return-type": "off",
|
|
18
|
-
"@typescript-eslint/no-unsafe-assignment": "warn",
|
|
19
|
-
"@typescript-eslint/no-unsafe-member-access": "warn",
|
|
20
|
-
"@typescript-eslint/no-unsafe-call": "warn",
|
|
21
|
-
"@typescript-eslint/no-unsafe-return": "warn",
|
|
22
|
-
"@typescript-eslint/restrict-template-expressions": "warn",
|
|
23
|
-
"no-console": "off",
|
|
24
|
-
"no-empty": ["error", { "allowEmptyCatch": false }],
|
|
25
|
-
"prefer-const": "error",
|
|
26
|
-
"no-var": "error"
|
|
27
|
-
},
|
|
28
|
-
"env": {
|
|
29
|
-
"node": true,
|
|
30
|
-
"es6": true
|
|
31
|
-
},
|
|
32
|
-
"ignorePatterns": ["dist/", "node_modules/", "legacy/", "apps/", "*.js", "tests/"]
|
|
33
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { FeeOracleAdapter } from './types';
|
|
2
|
-
|
|
3
|
-
export class FeeOracleMock implements FeeOracleAdapter {
|
|
4
|
-
constructor(private feeRate = 7) {}
|
|
5
|
-
async estimateFeeRate(targetBlocks = 1): Promise<number> {
|
|
6
|
-
return Math.max(1, this.feeRate - (targetBlocks - 1));
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/* istanbul ignore file */
|
|
2
|
-
import type { OrdinalsProvider } from '../types';
|
|
3
|
-
|
|
4
|
-
interface HttpProviderOptions {
|
|
5
|
-
baseUrl: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function buildUrl(baseUrl: string, path: string): string {
|
|
9
|
-
const base = baseUrl.replace(/\/$/, '');
|
|
10
|
-
return `${base}${path.startsWith('/') ? '' : '/'}${path}`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
async function fetchJson<T>(url: string): Promise<T | null> {
|
|
14
|
-
const res = await (globalThis as any).fetch(url, {
|
|
15
|
-
headers: {
|
|
16
|
-
'Accept': 'application/json'
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
if (!res.ok) return null;
|
|
20
|
-
return (await res.json()) as T;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class OrdHttpProvider implements OrdinalsProvider {
|
|
24
|
-
private readonly baseUrl: string;
|
|
25
|
-
|
|
26
|
-
constructor(options: HttpProviderOptions) {
|
|
27
|
-
if (!options?.baseUrl) {
|
|
28
|
-
throw new Error('OrdHttpProvider requires baseUrl');
|
|
29
|
-
}
|
|
30
|
-
this.baseUrl = options.baseUrl;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async getInscriptionById(id: string) {
|
|
34
|
-
if (!id) return null;
|
|
35
|
-
const data = await fetchJson<any>(buildUrl(this.baseUrl, `/inscription/${id}`));
|
|
36
|
-
if (!data) return null;
|
|
37
|
-
// Expecting a shape similar to Ordinals indexers; adapt minimally
|
|
38
|
-
const ownerOutput: string | undefined = data.owner_output;
|
|
39
|
-
let txid = data.txid || 'unknown';
|
|
40
|
-
let vout = typeof data.vout === 'number' ? data.vout : 0;
|
|
41
|
-
if (ownerOutput && ownerOutput.includes(':')) {
|
|
42
|
-
const [tid, v] = ownerOutput.split(':');
|
|
43
|
-
txid = tid;
|
|
44
|
-
vout = Number(v) || 0;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const contentType = data.content_type || 'application/octet-stream';
|
|
48
|
-
const contentUrl = data.content_url || buildUrl(this.baseUrl, `/content/${id}`);
|
|
49
|
-
const contentRes = await (globalThis as any).fetch(contentUrl);
|
|
50
|
-
if (!contentRes.ok) return null;
|
|
51
|
-
const buf = (globalThis as any).Buffer
|
|
52
|
-
? (globalThis as any).Buffer.from(new Uint8Array(await contentRes.arrayBuffer()))
|
|
53
|
-
: new Uint8Array(await contentRes.arrayBuffer()) as any;
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
inscriptionId: data.inscription_id || id,
|
|
57
|
-
content: buf,
|
|
58
|
-
contentType,
|
|
59
|
-
txid,
|
|
60
|
-
vout,
|
|
61
|
-
satoshi: String(data.sat ?? ''),
|
|
62
|
-
blockHeight: data.block_height
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async getInscriptionsBySatoshi(satoshi: string) {
|
|
67
|
-
if (!satoshi) return [];
|
|
68
|
-
const data = await fetchJson<any>(buildUrl(this.baseUrl, `/sat/${satoshi}`));
|
|
69
|
-
const ids: string[] = Array.isArray(data?.inscription_ids) ? data.inscription_ids : [];
|
|
70
|
-
return ids.map((inscriptionId) => ({ inscriptionId }));
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async broadcastTransaction(_txHexOrObj: unknown): Promise<string> {
|
|
74
|
-
// For example purposes only, return a placeholder
|
|
75
|
-
return 'broadcast-txid';
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async getTransactionStatus(_txid: string) {
|
|
79
|
-
return { confirmed: false };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async estimateFee(blocks: number = 1): Promise<number> {
|
|
83
|
-
// Basic fallback: some providers expose fee estimates; for example purposes, return linear estimate
|
|
84
|
-
return 5 * Math.max(1, blocks);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async createInscription(params: { data: any; contentType: string; feeRate?: number; }) {
|
|
88
|
-
// Example placeholder: a real implementation would POST to a service
|
|
89
|
-
// Here we return a deterministic mock-like result to avoid network coupling in code
|
|
90
|
-
const inscriptionId = `insc-${Math.random().toString(36).slice(2)}`;
|
|
91
|
-
const txid = `tx-${Math.random().toString(36).slice(2)}`;
|
|
92
|
-
return {
|
|
93
|
-
inscriptionId,
|
|
94
|
-
revealTxId: txid,
|
|
95
|
-
txid,
|
|
96
|
-
vout: 0,
|
|
97
|
-
blockHeight: undefined,
|
|
98
|
-
content: params.data,
|
|
99
|
-
contentType: params.contentType,
|
|
100
|
-
feeRate: params.feeRate
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async transferInscription(inscriptionId: string, _toAddress: string, _options?: { feeRate?: number }) {
|
|
105
|
-
if (!inscriptionId) throw new Error('inscriptionId required');
|
|
106
|
-
const txid = `tx-${Math.random().toString(36).slice(2)}`;
|
|
107
|
-
return {
|
|
108
|
-
txid,
|
|
109
|
-
vin: [{ txid: 'prev', vout: 0 }],
|
|
110
|
-
vout: [{ value: 546, scriptPubKey: 'script' }],
|
|
111
|
-
fee: 100,
|
|
112
|
-
confirmations: 0
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export async function createOrdinalsProviderFromEnv(): Promise<OrdinalsProvider> {
|
|
118
|
-
const useLive = String(((globalThis as any).process?.env?.USE_LIVE_ORD_PROVIDER) || '').toLowerCase() === 'true';
|
|
119
|
-
if (useLive) {
|
|
120
|
-
const baseUrl = ((globalThis as any).process?.env?.ORD_PROVIDER_BASE_URL) || 'https://ord.example.com/api';
|
|
121
|
-
return new OrdHttpProvider({ baseUrl });
|
|
122
|
-
}
|
|
123
|
-
const mod = await import('./OrdMockProvider');
|
|
124
|
-
return new mod.OrdMockProvider();
|
|
125
|
-
}
|
|
126
|
-
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { OrdinalsProvider } from '../types';
|
|
2
|
-
|
|
3
|
-
export interface OrdMockState {
|
|
4
|
-
inscriptionsById: Map<string, {
|
|
5
|
-
inscriptionId: string;
|
|
6
|
-
content: Buffer;
|
|
7
|
-
contentType: string;
|
|
8
|
-
txid: string;
|
|
9
|
-
vout: number;
|
|
10
|
-
satoshi?: string;
|
|
11
|
-
blockHeight?: number;
|
|
12
|
-
}>;
|
|
13
|
-
inscriptionsBySatoshi: Map<string, string[]>;
|
|
14
|
-
feeRate: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export class OrdMockProvider implements OrdinalsProvider {
|
|
18
|
-
private state: OrdMockState;
|
|
19
|
-
|
|
20
|
-
constructor(state?: Partial<OrdMockState>) {
|
|
21
|
-
this.state = {
|
|
22
|
-
inscriptionsById: new Map(),
|
|
23
|
-
inscriptionsBySatoshi: new Map(),
|
|
24
|
-
feeRate: 5,
|
|
25
|
-
...state
|
|
26
|
-
} as OrdMockState;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async getInscriptionById(id: string) {
|
|
30
|
-
const rec = this.state.inscriptionsById.get(id);
|
|
31
|
-
return rec ? { ...rec } : null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async getInscriptionsBySatoshi(satoshi: string) {
|
|
35
|
-
const list = this.state.inscriptionsBySatoshi.get(satoshi) || [];
|
|
36
|
-
return list.map((inscriptionId) => ({ inscriptionId }));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async broadcastTransaction(_txHexOrObj: unknown): Promise<string> {
|
|
40
|
-
return 'mock-broadcast-txid';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async getTransactionStatus(txid: string) {
|
|
44
|
-
return { confirmed: true, blockHeight: 1, confirmations: 1 };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async estimateFee(blocks = 1): Promise<number> {
|
|
48
|
-
return Math.max(1, this.state.feeRate - (blocks - 1));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async createInscription(params: { data: Buffer; contentType: string; feeRate?: number; }) {
|
|
52
|
-
const inscriptionId = `insc-${Math.random().toString(36).slice(2)}`;
|
|
53
|
-
const txid = `tx-${Math.random().toString(36).slice(2)}`;
|
|
54
|
-
// Generate a valid numeric satoshi identifier (not sat-123 format)
|
|
55
|
-
const satoshi = `${Math.floor(Math.random() * 1e12)}`;
|
|
56
|
-
const vout = 0;
|
|
57
|
-
const record = {
|
|
58
|
-
inscriptionId,
|
|
59
|
-
content: params.data,
|
|
60
|
-
contentType: params.contentType,
|
|
61
|
-
txid,
|
|
62
|
-
vout,
|
|
63
|
-
satoshi,
|
|
64
|
-
blockHeight: 1
|
|
65
|
-
};
|
|
66
|
-
this.state.inscriptionsById.set(inscriptionId, record);
|
|
67
|
-
const list = this.state.inscriptionsBySatoshi.get(satoshi) || [];
|
|
68
|
-
list.push(inscriptionId);
|
|
69
|
-
this.state.inscriptionsBySatoshi.set(satoshi, list);
|
|
70
|
-
return {
|
|
71
|
-
inscriptionId,
|
|
72
|
-
revealTxId: txid,
|
|
73
|
-
commitTxId: undefined,
|
|
74
|
-
satoshi,
|
|
75
|
-
txid,
|
|
76
|
-
vout,
|
|
77
|
-
blockHeight: 1,
|
|
78
|
-
content: params.data,
|
|
79
|
-
contentType: params.contentType,
|
|
80
|
-
feeRate: params.feeRate
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async transferInscription(inscriptionId: string, _toAddress: string, _options?: { feeRate?: number }) {
|
|
85
|
-
const rec = this.state.inscriptionsById.get(inscriptionId);
|
|
86
|
-
if (!rec) {
|
|
87
|
-
return Promise.reject(new Error('inscription not found'));
|
|
88
|
-
}
|
|
89
|
-
const txid = `tx-${Math.random().toString(36).slice(2)}`;
|
|
90
|
-
return {
|
|
91
|
-
txid,
|
|
92
|
-
vin: [{ txid: rec.txid, vout: rec.vout }],
|
|
93
|
-
vout: [{ value: 546, scriptPubKey: 'script' }],
|
|
94
|
-
fee: 100,
|
|
95
|
-
blockHeight: 1,
|
|
96
|
-
confirmations: 0,
|
|
97
|
-
satoshi: rec.satoshi
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
package/src/adapters/types.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
export interface StoragePutOptions {
|
|
2
|
-
contentType?: string;
|
|
3
|
-
cacheControl?: string;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export interface StorageGetResult {
|
|
7
|
-
content: Buffer;
|
|
8
|
-
contentType: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface StorageAdapter {
|
|
12
|
-
put(objectKey: string, data: Buffer | string, options?: StoragePutOptions): Promise<string>;
|
|
13
|
-
get(objectKey: string): Promise<StorageGetResult | null>;
|
|
14
|
-
delete?(objectKey: string): Promise<boolean>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface FeeOracleAdapter {
|
|
18
|
-
// Returns sats/vB (or feerate unit appropriate to the network) for the given target blocks
|
|
19
|
-
estimateFeeRate(targetBlocks?: number): Promise<number>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface OrdinalsProvider {
|
|
23
|
-
getInscriptionById(id: string): Promise<{
|
|
24
|
-
inscriptionId: string;
|
|
25
|
-
content: Buffer;
|
|
26
|
-
contentType: string;
|
|
27
|
-
txid: string;
|
|
28
|
-
vout: number;
|
|
29
|
-
satoshi?: string;
|
|
30
|
-
blockHeight?: number;
|
|
31
|
-
} | null>;
|
|
32
|
-
getInscriptionsBySatoshi(satoshi: string): Promise<Array<{ inscriptionId: string }>>;
|
|
33
|
-
broadcastTransaction(txHexOrObj: unknown): Promise<string>;
|
|
34
|
-
getTransactionStatus(txid: string): Promise<{ confirmed: boolean; blockHeight?: number; confirmations?: number }>;
|
|
35
|
-
estimateFee(blocks?: number): Promise<number>;
|
|
36
|
-
createInscription(params: {
|
|
37
|
-
data: Buffer;
|
|
38
|
-
contentType: string;
|
|
39
|
-
feeRate?: number;
|
|
40
|
-
}): Promise<{
|
|
41
|
-
inscriptionId: string;
|
|
42
|
-
revealTxId: string;
|
|
43
|
-
commitTxId?: string;
|
|
44
|
-
satoshi?: string;
|
|
45
|
-
txid?: string;
|
|
46
|
-
vout?: number;
|
|
47
|
-
blockHeight?: number;
|
|
48
|
-
content?: Buffer;
|
|
49
|
-
contentType?: string;
|
|
50
|
-
feeRate?: number;
|
|
51
|
-
}>;
|
|
52
|
-
transferInscription(
|
|
53
|
-
inscriptionId: string,
|
|
54
|
-
toAddress: string,
|
|
55
|
-
options?: { feeRate?: number }
|
|
56
|
-
): Promise<{
|
|
57
|
-
txid: string;
|
|
58
|
-
vin: Array<{ txid: string; vout: number }>;
|
|
59
|
-
vout: Array<{ value: number; scriptPubKey: string; address?: string }>;
|
|
60
|
-
fee: number;
|
|
61
|
-
blockHeight?: number;
|
|
62
|
-
confirmations?: number;
|
|
63
|
-
satoshi?: string;
|
|
64
|
-
}>;
|
|
65
|
-
}
|
|
66
|
-
|
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
OriginalsConfig,
|
|
3
|
-
OrdinalsInscription,
|
|
4
|
-
BitcoinTransaction,
|
|
5
|
-
Utxo,
|
|
6
|
-
DUST_LIMIT_SATS
|
|
7
|
-
} from '../types';
|
|
8
|
-
import type { FeeOracleAdapter, OrdinalsProvider } from '../adapters';
|
|
9
|
-
import { emitTelemetry, StructuredError } from '../utils/telemetry';
|
|
10
|
-
import { validateBitcoinAddress } from '../utils/bitcoin-address';
|
|
11
|
-
import { validateSatoshiNumber, parseSatoshiIdentifier } from '../utils/satoshi-validation';
|
|
12
|
-
|
|
13
|
-
export class BitcoinManager {
|
|
14
|
-
private readonly feeOracle?: FeeOracleAdapter;
|
|
15
|
-
private readonly ord?: OrdinalsProvider;
|
|
16
|
-
|
|
17
|
-
constructor(private config: OriginalsConfig) {
|
|
18
|
-
this.feeOracle = config.feeOracle;
|
|
19
|
-
this.ord = config.ordinalsProvider;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private async resolveFeeRate(targetBlocks = 1, provided?: number): Promise<number | undefined> {
|
|
23
|
-
// 1) Prefer external fee oracle
|
|
24
|
-
if (this.feeOracle) {
|
|
25
|
-
try {
|
|
26
|
-
const estimated = await this.feeOracle.estimateFeeRate(targetBlocks);
|
|
27
|
-
if (typeof estimated === 'number' && Number.isFinite(estimated) && estimated > 0) {
|
|
28
|
-
emitTelemetry(this.config.telemetry, {
|
|
29
|
-
name: 'bitcoin.fee.estimated',
|
|
30
|
-
attributes: { feeRate: estimated, source: 'feeOracle' }
|
|
31
|
-
});
|
|
32
|
-
return estimated;
|
|
33
|
-
}
|
|
34
|
-
} catch (error) {
|
|
35
|
-
emitTelemetry(this.config.telemetry, {
|
|
36
|
-
name: 'bitcoin.fee.error',
|
|
37
|
-
level: 'warn',
|
|
38
|
-
attributes: { error: String(error), source: 'feeOracle' }
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 2) Fallback to ordinals provider if present
|
|
44
|
-
if (this.ord) {
|
|
45
|
-
try {
|
|
46
|
-
const estimated = await this.ord.estimateFee(targetBlocks);
|
|
47
|
-
if (typeof estimated === 'number' && Number.isFinite(estimated) && estimated > 0) {
|
|
48
|
-
emitTelemetry(this.config.telemetry, {
|
|
49
|
-
name: 'bitcoin.fee.estimated',
|
|
50
|
-
attributes: { feeRate: estimated, source: 'ordinalsProvider' }
|
|
51
|
-
});
|
|
52
|
-
return estimated;
|
|
53
|
-
}
|
|
54
|
-
} catch (error) {
|
|
55
|
-
emitTelemetry(this.config.telemetry, {
|
|
56
|
-
name: 'bitcoin.fee.error',
|
|
57
|
-
level: 'warn',
|
|
58
|
-
attributes: { error: String(error), source: 'ordinalsProvider' }
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// 3) If caller provided a valid non-zero fee rate, use it as last resort
|
|
64
|
-
if (typeof provided === 'number' && Number.isFinite(provided) && provided > 0) {
|
|
65
|
-
return provided;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async inscribeData(
|
|
72
|
-
data: any,
|
|
73
|
-
contentType: string,
|
|
74
|
-
feeRate?: number
|
|
75
|
-
): Promise<OrdinalsInscription> {
|
|
76
|
-
// Input validation
|
|
77
|
-
if (!data) {
|
|
78
|
-
throw new StructuredError('INVALID_INPUT', 'Data to inscribe cannot be null or undefined');
|
|
79
|
-
}
|
|
80
|
-
if (!contentType || typeof contentType !== 'string') {
|
|
81
|
-
throw new StructuredError('INVALID_INPUT', 'Content type must be a non-empty string');
|
|
82
|
-
}
|
|
83
|
-
// Validate contentType is a valid MIME type
|
|
84
|
-
if (!/^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.+-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_.+-]{0,126}$/.test(contentType)) {
|
|
85
|
-
throw new StructuredError('INVALID_INPUT', `Invalid MIME type format: ${contentType}`);
|
|
86
|
-
}
|
|
87
|
-
if (feeRate !== undefined && (typeof feeRate !== 'number' || feeRate <= 0 || !Number.isFinite(feeRate))) {
|
|
88
|
-
throw new StructuredError('INVALID_INPUT', 'Fee rate must be a positive number');
|
|
89
|
-
}
|
|
90
|
-
// Security: Reject extremely high fee rates to prevent accidental fund drainage
|
|
91
|
-
const MAX_REASONABLE_FEE_RATE = 10_000; // sat/vB
|
|
92
|
-
if (feeRate !== undefined && feeRate > MAX_REASONABLE_FEE_RATE) {
|
|
93
|
-
throw new StructuredError('INVALID_INPUT', `Fee rate ${feeRate} exceeds maximum reasonable fee rate of ${MAX_REASONABLE_FEE_RATE} sat/vB`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const effectiveFeeRate = await this.resolveFeeRate(1, feeRate);
|
|
97
|
-
|
|
98
|
-
if (!this.ord) {
|
|
99
|
-
throw new StructuredError(
|
|
100
|
-
'ORD_PROVIDER_REQUIRED',
|
|
101
|
-
'Ordinals provider must be configured to inscribe data on Bitcoin. ' +
|
|
102
|
-
'Please provide an ordinalsProvider in your SDK configuration. ' +
|
|
103
|
-
'For testing, use: import { OrdMockProvider } from \'@originals/sdk\';'
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (typeof this.ord.createInscription !== 'function') {
|
|
108
|
-
throw new StructuredError(
|
|
109
|
-
'ORD_PROVIDER_UNSUPPORTED',
|
|
110
|
-
'Configured ordinals provider does not support inscription creation'
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const creation = await this.ord.createInscription({ data, contentType, feeRate: effectiveFeeRate });
|
|
115
|
-
const txid = creation.txid ?? creation.revealTxId;
|
|
116
|
-
if (!creation.inscriptionId || !txid) {
|
|
117
|
-
throw new StructuredError(
|
|
118
|
-
'ORD_PROVIDER_INVALID_RESPONSE',
|
|
119
|
-
'Ordinals provider did not return a valid inscription identifier or transaction id'
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
let satoshi = creation.satoshi ?? '';
|
|
124
|
-
if (!satoshi) {
|
|
125
|
-
satoshi = (await this.getSatoshiFromInscription(creation.inscriptionId)) ?? '';
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Validate satoshi before using it
|
|
129
|
-
if (satoshi) {
|
|
130
|
-
const validation = validateSatoshiNumber(satoshi);
|
|
131
|
-
if (!validation.valid) {
|
|
132
|
-
throw new StructuredError(
|
|
133
|
-
'INVALID_SATOSHI',
|
|
134
|
-
`Ordinals provider returned invalid satoshi identifier: ${validation.error}`
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
let recordedFeeRate: number | undefined;
|
|
140
|
-
if (this.feeOracle) {
|
|
141
|
-
recordedFeeRate = effectiveFeeRate;
|
|
142
|
-
} else if (typeof feeRate === 'number' && Number.isFinite(feeRate) && feeRate > 0) {
|
|
143
|
-
recordedFeeRate = feeRate;
|
|
144
|
-
} else {
|
|
145
|
-
recordedFeeRate = creation.feeRate ?? effectiveFeeRate;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const inscription: OrdinalsInscription & {
|
|
149
|
-
revealTxId?: string;
|
|
150
|
-
commitTxId?: string;
|
|
151
|
-
feeRate?: number;
|
|
152
|
-
} = {
|
|
153
|
-
satoshi,
|
|
154
|
-
inscriptionId: creation.inscriptionId,
|
|
155
|
-
content: creation.content ?? data,
|
|
156
|
-
contentType: creation.contentType ?? contentType,
|
|
157
|
-
txid,
|
|
158
|
-
vout: typeof creation.vout === 'number' ? creation.vout : 0,
|
|
159
|
-
blockHeight: creation.blockHeight,
|
|
160
|
-
revealTxId: creation.revealTxId,
|
|
161
|
-
commitTxId: creation.commitTxId,
|
|
162
|
-
feeRate: recordedFeeRate
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
return inscription;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
async trackInscription(inscriptionId: string): Promise<OrdinalsInscription | null> {
|
|
169
|
-
if (this.ord) {
|
|
170
|
-
const info = await this.ord.getInscriptionById(inscriptionId);
|
|
171
|
-
if (!info) return null;
|
|
172
|
-
return {
|
|
173
|
-
satoshi: info.satoshi ?? '',
|
|
174
|
-
inscriptionId: info.inscriptionId,
|
|
175
|
-
content: info.content,
|
|
176
|
-
contentType: info.contentType,
|
|
177
|
-
txid: info.txid,
|
|
178
|
-
vout: info.vout,
|
|
179
|
-
blockHeight: info.blockHeight
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
return null;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async transferInscription(
|
|
186
|
-
inscription: OrdinalsInscription,
|
|
187
|
-
toAddress: string
|
|
188
|
-
): Promise<BitcoinTransaction> {
|
|
189
|
-
// Input validation
|
|
190
|
-
if (!inscription || typeof inscription !== 'object') {
|
|
191
|
-
throw new StructuredError('INVALID_INPUT', 'Inscription must be a valid OrdinalsInscription object');
|
|
192
|
-
}
|
|
193
|
-
if (!inscription.inscriptionId || typeof inscription.inscriptionId !== 'string') {
|
|
194
|
-
throw new StructuredError('INVALID_INPUT', 'Inscription must have a valid inscriptionId');
|
|
195
|
-
}
|
|
196
|
-
if (!toAddress || typeof toAddress !== 'string') {
|
|
197
|
-
throw new StructuredError('INVALID_INPUT', 'Destination address must be a non-empty string');
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Validate Bitcoin address format and checksum
|
|
201
|
-
try {
|
|
202
|
-
validateBitcoinAddress(toAddress, this.config.network);
|
|
203
|
-
} catch (error) {
|
|
204
|
-
const message = error instanceof Error ? error.message : 'Invalid Bitcoin address';
|
|
205
|
-
throw new StructuredError('INVALID_ADDRESS', message);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const effectiveFeeRate = await this.resolveFeeRate(1);
|
|
209
|
-
|
|
210
|
-
if (!this.ord) {
|
|
211
|
-
throw new StructuredError(
|
|
212
|
-
'ORD_PROVIDER_REQUIRED',
|
|
213
|
-
'Ordinals provider must be configured to transfer inscriptions on Bitcoin. ' +
|
|
214
|
-
'Please provide an ordinalsProvider in your SDK configuration. ' +
|
|
215
|
-
'For testing, use: import { OrdMockProvider } from \'@originals/sdk\';'
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (typeof this.ord.transferInscription !== 'function') {
|
|
220
|
-
throw new StructuredError(
|
|
221
|
-
'ORD_PROVIDER_UNSUPPORTED',
|
|
222
|
-
'Configured ordinals provider does not support inscription transfers'
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const response = await this.ord.transferInscription(inscription.inscriptionId, toAddress, {
|
|
227
|
-
feeRate: effectiveFeeRate
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
if (!response || !response.txid) {
|
|
231
|
-
throw new StructuredError(
|
|
232
|
-
'ORD_PROVIDER_INVALID_RESPONSE',
|
|
233
|
-
'Ordinals provider did not return a valid transfer transaction'
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (response.satoshi) {
|
|
238
|
-
inscription.satoshi = response.satoshi;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return {
|
|
242
|
-
txid: response.txid,
|
|
243
|
-
vin: response.vin ?? [{ txid: inscription.txid, vout: inscription.vout }],
|
|
244
|
-
vout:
|
|
245
|
-
response.vout?.length
|
|
246
|
-
? response.vout
|
|
247
|
-
: [{ value: DUST_LIMIT_SATS, scriptPubKey: 'script', address: toAddress }],
|
|
248
|
-
fee: response.fee,
|
|
249
|
-
blockHeight: response.blockHeight,
|
|
250
|
-
confirmations: response.confirmations
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
async preventFrontRunning(satoshi: string): Promise<boolean> {
|
|
255
|
-
if (!satoshi) throw new StructuredError('SATOSHI_REQUIRED', 'Satoshi identifier is required');
|
|
256
|
-
// Naive implementation: check for multiple inscriptions on same satoshi via provider
|
|
257
|
-
if (this.ord) {
|
|
258
|
-
const list = await this.ord.getInscriptionsBySatoshi(satoshi);
|
|
259
|
-
return list.length <= 1;
|
|
260
|
-
}
|
|
261
|
-
return true;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async getSatoshiFromInscription(inscriptionId: string): Promise<string | null> {
|
|
265
|
-
if (this.ord) {
|
|
266
|
-
const info = await this.ord.getInscriptionById(inscriptionId);
|
|
267
|
-
const satoshi = info?.satoshi;
|
|
268
|
-
|
|
269
|
-
// Validate satoshi before returning
|
|
270
|
-
if (satoshi) {
|
|
271
|
-
const validation = validateSatoshiNumber(satoshi);
|
|
272
|
-
if (!validation.valid) {
|
|
273
|
-
// Return null if validation fails (don't return empty or invalid string)
|
|
274
|
-
return null;
|
|
275
|
-
}
|
|
276
|
-
return satoshi;
|
|
277
|
-
}
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
async validateBTCODID(didId: string): Promise<boolean> {
|
|
284
|
-
// Validate that a did:btco DID exists on Bitcoin
|
|
285
|
-
const satoshi = this.extractSatoshiFromBTCODID(didId);
|
|
286
|
-
if (!satoshi) return false;
|
|
287
|
-
|
|
288
|
-
// Validate the extracted satoshi number
|
|
289
|
-
const validation = validateSatoshiNumber(satoshi);
|
|
290
|
-
if (!validation.valid) return false;
|
|
291
|
-
|
|
292
|
-
if (!this.ord) return false;
|
|
293
|
-
const inscriptions = await this.ord.getInscriptionsBySatoshi(satoshi);
|
|
294
|
-
return inscriptions.length > 0;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
private extractSatoshiFromBTCODID(didId: string): string | null {
|
|
298
|
-
// Extract satoshi identifier from did:btco DID
|
|
299
|
-
if (!didId.startsWith('did:btco:')) return null;
|
|
300
|
-
|
|
301
|
-
const parts = didId.split(':');
|
|
302
|
-
let satoshi: string | null = null;
|
|
303
|
-
|
|
304
|
-
// Handle different network prefixes:
|
|
305
|
-
// did:btco:123456 (mainnet) - 3 parts
|
|
306
|
-
// did:btco:test:123456 or did:btco:sig:123456 - 4 parts
|
|
307
|
-
if (parts.length === 3) {
|
|
308
|
-
satoshi = parts[2];
|
|
309
|
-
} else if (parts.length === 4) {
|
|
310
|
-
// Validate network prefix - only 'test' and 'sig' are allowed
|
|
311
|
-
const network = parts[2];
|
|
312
|
-
if (network !== 'test' && network !== 'sig') {
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
satoshi = parts[3];
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Validate the extracted satoshi format
|
|
319
|
-
if (satoshi) {
|
|
320
|
-
const validation = validateSatoshiNumber(satoshi);
|
|
321
|
-
if (!validation.valid) {
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
return satoshi;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
|