@bopen-io/wallet-toolbox 1.7.18
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/.claude/settings.local.json +10 -0
- package/.env.template +22 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
- package/.github/pull_request_template.md +22 -0
- package/.github/workflows/push.yaml +145 -0
- package/.prettierrc +10 -0
- package/CHANGELOG.md +280 -0
- package/CONTRIBUTING.md +89 -0
- package/README.md +43 -0
- package/docs/README.md +85 -0
- package/docs/client.md +19627 -0
- package/docs/monitor.md +953 -0
- package/docs/open-rpc/index.html +46 -0
- package/docs/services.md +6377 -0
- package/docs/setup.md +1268 -0
- package/docs/storage.md +5367 -0
- package/docs/wallet.md +19626 -0
- package/jest.config.ts +25 -0
- package/license.md +28 -0
- package/out/tsconfig.all.tsbuildinfo +1 -0
- package/package.json +63 -0
- package/src/CWIStyleWalletManager.ts +1999 -0
- package/src/Setup.ts +579 -0
- package/src/SetupClient.ts +322 -0
- package/src/SetupWallet.ts +108 -0
- package/src/SimpleWalletManager.ts +526 -0
- package/src/Wallet.ts +1169 -0
- package/src/WalletAuthenticationManager.ts +153 -0
- package/src/WalletLogger.ts +213 -0
- package/src/WalletPermissionsManager.ts +3660 -0
- package/src/WalletSettingsManager.ts +114 -0
- package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
- package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
- package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
- package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
- package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
- package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
- package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
- package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
- package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
- package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
- package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
- package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
- package/src/index.all.ts +27 -0
- package/src/index.client.ts +25 -0
- package/src/index.mobile.ts +21 -0
- package/src/index.ts +1 -0
- package/src/monitor/Monitor.ts +412 -0
- package/src/monitor/MonitorDaemon.ts +188 -0
- package/src/monitor/README.md +3 -0
- package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
- package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
- package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
- package/src/monitor/tasks/TaskClock.ts +33 -0
- package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
- package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
- package/src/monitor/tasks/TaskNewHeader.ts +93 -0
- package/src/monitor/tasks/TaskPurge.ts +68 -0
- package/src/monitor/tasks/TaskReorg.ts +89 -0
- package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
- package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
- package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
- package/src/monitor/tasks/TaskUnFail.ts +151 -0
- package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
- package/src/sdk/CertOpsWallet.ts +18 -0
- package/src/sdk/PrivilegedKeyManager.ts +372 -0
- package/src/sdk/README.md +13 -0
- package/src/sdk/WERR_errors.ts +234 -0
- package/src/sdk/WalletError.ts +170 -0
- package/src/sdk/WalletErrorFromJson.ts +80 -0
- package/src/sdk/WalletServices.interfaces.ts +700 -0
- package/src/sdk/WalletSigner.interfaces.ts +11 -0
- package/src/sdk/WalletStorage.interfaces.ts +606 -0
- package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
- package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
- package/src/sdk/__test/WalletError.test.ts +318 -0
- package/src/sdk/__test/validationHelpers.test.ts +21 -0
- package/src/sdk/index.ts +10 -0
- package/src/sdk/types.ts +226 -0
- package/src/services/README.md +11 -0
- package/src/services/ServiceCollection.ts +248 -0
- package/src/services/Services.ts +603 -0
- package/src/services/__tests/ARC.man.test.ts +123 -0
- package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
- package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
- package/src/services/__tests/arcServices.test.ts +8 -0
- package/src/services/__tests/bitrails.test.ts +56 -0
- package/src/services/__tests/getMerklePath.test.ts +15 -0
- package/src/services/__tests/getRawTx.test.ts +13 -0
- package/src/services/__tests/postBeef.test.ts +104 -0
- package/src/services/__tests/verifyBeef.test.ts +50 -0
- package/src/services/chaintracker/BHServiceClient.ts +212 -0
- package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
- package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
- package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
- package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
- package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
- package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
- package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
- package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
- package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
- package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
- package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
- package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
- package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
- package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
- package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
- package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
- package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
- package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
- package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
- package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
- package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
- package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
- package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
- package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
- package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
- package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
- package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
- package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
- package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
- package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
- package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
- package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
- package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
- package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
- package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
- package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
- package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
- package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
- package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
- package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
- package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
- package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
- package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
- package/src/services/chaintracker/index.all.ts +4 -0
- package/src/services/chaintracker/index.client.ts +4 -0
- package/src/services/chaintracker/index.mobile.ts +4 -0
- package/src/services/createDefaultWalletServicesOptions.ts +77 -0
- package/src/services/index.ts +1 -0
- package/src/services/processingErrors/arcSuccessError.json +76 -0
- package/src/services/providers/ARC.ts +350 -0
- package/src/services/providers/Bitails.ts +256 -0
- package/src/services/providers/SdkWhatsOnChain.ts +83 -0
- package/src/services/providers/WhatsOnChain.ts +883 -0
- package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
- package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
- package/src/services/providers/exchangeRates.ts +265 -0
- package/src/services/providers/getBeefForTxid.ts +369 -0
- package/src/signer/README.md +5 -0
- package/src/signer/WalletSigner.ts +17 -0
- package/src/signer/methods/acquireDirectCertificate.ts +52 -0
- package/src/signer/methods/buildSignableTransaction.ts +183 -0
- package/src/signer/methods/completeSignedTransaction.ts +117 -0
- package/src/signer/methods/createAction.ts +172 -0
- package/src/signer/methods/internalizeAction.ts +106 -0
- package/src/signer/methods/proveCertificate.ts +43 -0
- package/src/signer/methods/signAction.ts +54 -0
- package/src/storage/README.md +14 -0
- package/src/storage/StorageIdb.ts +2304 -0
- package/src/storage/StorageKnex.ts +1425 -0
- package/src/storage/StorageProvider.ts +810 -0
- package/src/storage/StorageReader.ts +194 -0
- package/src/storage/StorageReaderWriter.ts +432 -0
- package/src/storage/StorageSyncReader.ts +34 -0
- package/src/storage/WalletStorageManager.ts +943 -0
- package/src/storage/__test/StorageIdb.test.ts +43 -0
- package/src/storage/__test/WalletStorageManager.test.ts +275 -0
- package/src/storage/__test/adminStats.man.test.ts +89 -0
- package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
- package/src/storage/index.all.ts +11 -0
- package/src/storage/index.client.ts +7 -0
- package/src/storage/index.mobile.ts +6 -0
- package/src/storage/methods/ListActionsSpecOp.ts +70 -0
- package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
- package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
- package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
- package/src/storage/methods/__test/offsetKey.test.ts +274 -0
- package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
- package/src/storage/methods/createAction.ts +947 -0
- package/src/storage/methods/generateChange.ts +556 -0
- package/src/storage/methods/getBeefForTransaction.ts +139 -0
- package/src/storage/methods/getSyncChunk.ts +293 -0
- package/src/storage/methods/internalizeAction.ts +562 -0
- package/src/storage/methods/listActionsIdb.ts +183 -0
- package/src/storage/methods/listActionsKnex.ts +226 -0
- package/src/storage/methods/listCertificates.ts +73 -0
- package/src/storage/methods/listOutputsIdb.ts +203 -0
- package/src/storage/methods/listOutputsKnex.ts +263 -0
- package/src/storage/methods/offsetKey.ts +89 -0
- package/src/storage/methods/processAction.ts +420 -0
- package/src/storage/methods/purgeData.ts +251 -0
- package/src/storage/methods/purgeDataIdb.ts +10 -0
- package/src/storage/methods/reviewStatus.ts +101 -0
- package/src/storage/methods/reviewStatusIdb.ts +43 -0
- package/src/storage/methods/utils.Buffer.ts +33 -0
- package/src/storage/methods/utils.ts +56 -0
- package/src/storage/remoting/StorageClient.ts +567 -0
- package/src/storage/remoting/StorageMobile.ts +544 -0
- package/src/storage/remoting/StorageServer.ts +291 -0
- package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
- package/src/storage/schema/KnexMigrations.ts +489 -0
- package/src/storage/schema/StorageIdbSchema.ts +150 -0
- package/src/storage/schema/entities/EntityBase.ts +210 -0
- package/src/storage/schema/entities/EntityCertificate.ts +188 -0
- package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
- package/src/storage/schema/entities/EntityCommission.ts +148 -0
- package/src/storage/schema/entities/EntityOutput.ts +290 -0
- package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
- package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
- package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
- package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
- package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
- package/src/storage/schema/entities/EntitySyncState.ts +389 -0
- package/src/storage/schema/entities/EntityTransaction.ts +306 -0
- package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
- package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
- package/src/storage/schema/entities/EntityUser.ts +112 -0
- package/src/storage/schema/entities/MergeEntity.ts +73 -0
- package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
- package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
- package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
- package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
- package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
- package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
- package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
- package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
- package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
- package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
- package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
- package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
- package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
- package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
- package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
- package/src/storage/schema/entities/index.ts +16 -0
- package/src/storage/schema/tables/TableCertificate.ts +21 -0
- package/src/storage/schema/tables/TableCertificateField.ts +12 -0
- package/src/storage/schema/tables/TableCommission.ts +13 -0
- package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
- package/src/storage/schema/tables/TableOutput.ts +64 -0
- package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
- package/src/storage/schema/tables/TableOutputTag.ts +10 -0
- package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
- package/src/storage/schema/tables/TableProvenTx.ts +14 -0
- package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
- package/src/storage/schema/tables/TableSettings.ts +17 -0
- package/src/storage/schema/tables/TableSyncState.ts +18 -0
- package/src/storage/schema/tables/TableTransaction.ts +54 -0
- package/src/storage/schema/tables/TableTxLabel.ts +10 -0
- package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
- package/src/storage/schema/tables/TableUser.ts +16 -0
- package/src/storage/schema/tables/index.ts +16 -0
- package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
- package/src/storage/sync/index.ts +1 -0
- package/src/utility/Format.ts +133 -0
- package/src/utility/README.md +3 -0
- package/src/utility/ReaderUint8Array.ts +187 -0
- package/src/utility/ScriptTemplateBRC29.ts +73 -0
- package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
- package/src/utility/aggregateResults.ts +68 -0
- package/src/utility/identityUtils.ts +159 -0
- package/src/utility/index.all.ts +7 -0
- package/src/utility/index.client.ts +7 -0
- package/src/utility/parseTxScriptOffsets.ts +29 -0
- package/src/utility/stampLog.ts +69 -0
- package/src/utility/tscProofToMerklePath.ts +48 -0
- package/src/utility/utilityHelpers.buffer.ts +34 -0
- package/src/utility/utilityHelpers.noBuffer.ts +60 -0
- package/src/utility/utilityHelpers.ts +275 -0
- package/src/wab-client/WABClient.ts +94 -0
- package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
- package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
- package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
- package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
- package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
- package/syncVersions.js +71 -0
- package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
- package/test/Wallet/action/abortAction.test.ts +47 -0
- package/test/Wallet/action/createAction.test.ts +299 -0
- package/test/Wallet/action/createAction2.test.ts +1273 -0
- package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
- package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
- package/test/Wallet/action/internalizeAction.test.ts +682 -0
- package/test/Wallet/action/relinquishOutput.test.ts +37 -0
- package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
- package/test/Wallet/certificate/listCertificates.test.ts +346 -0
- package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
- package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
- package/test/Wallet/get/getHeight.test.ts +52 -0
- package/test/Wallet/get/getKnownTxids.test.ts +86 -0
- package/test/Wallet/get/getNetwork.test.ts +27 -0
- package/test/Wallet/get/getVersion.test.ts +27 -0
- package/test/Wallet/list/listActions.test.ts +279 -0
- package/test/Wallet/list/listActions2.test.ts +1381 -0
- package/test/Wallet/list/listCertificates.test.ts +118 -0
- package/test/Wallet/list/listOutputs.test.ts +447 -0
- package/test/Wallet/live/walletLive.man.test.ts +521 -0
- package/test/Wallet/local/localWallet.man.test.ts +93 -0
- package/test/Wallet/local/localWallet2.man.test.ts +277 -0
- package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
- package/test/Wallet/specOps/specOps.man.test.ts +220 -0
- package/test/Wallet/support/janitor.man.test.ts +40 -0
- package/test/Wallet/support/operations.man.test.ts +407 -0
- package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
- package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
- package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
- package/test/Wallet/sync/setActive.test.ts +170 -0
- package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
- package/test/WalletClient/WERR.man.test.ts +35 -0
- package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
- package/test/checkDB.ts +57 -0
- package/test/checkdb +0 -0
- package/test/examples/backup.man.test.ts +59 -0
- package/test/examples/pushdrop.test.ts +282 -0
- package/test/monitor/Monitor.test.ts +620 -0
- package/test/services/Services.test.ts +263 -0
- package/test/storage/KnexMigrations.test.ts +86 -0
- package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
- package/test/storage/count.test.ts +177 -0
- package/test/storage/find.test.ts +195 -0
- package/test/storage/findLegacy.test.ts +67 -0
- package/test/storage/idb/allocateChange.test.ts +251 -0
- package/test/storage/idb/count.test.ts +158 -0
- package/test/storage/idb/find.test.ts +177 -0
- package/test/storage/idb/idbSpeed.test.ts +36 -0
- package/test/storage/idb/insert.test.ts +268 -0
- package/test/storage/idb/transactionAbort.test.ts +108 -0
- package/test/storage/idb/update.test.ts +999 -0
- package/test/storage/insert.test.ts +278 -0
- package/test/storage/update.test.ts +1021 -0
- package/test/storage/update2.test.ts +897 -0
- package/test/utils/TestUtilsWalletStorage.ts +2526 -0
- package/test/utils/localWalletMethods.ts +363 -0
- package/test/utils/removeFailedFromDatabase.sql +17 -0
- package/ts2md.json +44 -0
- package/tsconfig.all.json +31 -0
- package/tsconfig.client.json +29 -0
- package/tsconfig.json +17 -0
- package/tsconfig.mobile.json +28 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { Knex } from 'knex'
|
|
2
|
+
import { ChaintracksKnexMigrations } from './ChaintracksKnexMigrations'
|
|
3
|
+
import { InsertHeaderResult, ChaintracksStorageBaseOptions } from '../Api/ChaintracksStorageApi'
|
|
4
|
+
import { ChaintracksStorageBase } from './ChaintracksStorageBase'
|
|
5
|
+
import { LiveBlockHeader } from '../Api/BlockHeaderApi'
|
|
6
|
+
import { BlockHeader } from '../../../../sdk/WalletServices.interfaces'
|
|
7
|
+
import { addWork, convertBitsToWork, isMoreWork } from '../util/blockHeaderUtilities'
|
|
8
|
+
import { verifyOneOrNone } from '../../../../utility/utilityHelpers'
|
|
9
|
+
import { DBType } from '../../../../storage/StorageReader'
|
|
10
|
+
import { BulkHeaderFileInfo } from '../util/BulkHeaderFile'
|
|
11
|
+
import { HeightRange } from '../util/HeightRange'
|
|
12
|
+
import { ChaintracksStorageBulkFileApi } from '../Api/ChaintracksStorageApi'
|
|
13
|
+
import { Chain } from '../../../../sdk/types'
|
|
14
|
+
import { WERR_INVALID_OPERATION, WERR_INVALID_PARAMETER } from '../../../../sdk/WERR_errors'
|
|
15
|
+
import { determineDBType } from '../../../../storage/schema/KnexMigrations'
|
|
16
|
+
|
|
17
|
+
export interface ChaintracksStorageKnexOptions extends ChaintracksStorageBaseOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Required.
|
|
20
|
+
*
|
|
21
|
+
* Knex.js database interface initialized with valid connection configuration.
|
|
22
|
+
*/
|
|
23
|
+
knex: Knex | undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Implements the ChaintracksStorageApi using Knex.js for both MySql and Sqlite support.
|
|
28
|
+
* Also see `chaintracksStorageMemory` which leverages Knex support for an in memory database.
|
|
29
|
+
*/
|
|
30
|
+
export class ChaintracksStorageKnex extends ChaintracksStorageBase implements ChaintracksStorageBulkFileApi {
|
|
31
|
+
static createStorageKnexOptions(chain: Chain, knex?: Knex): ChaintracksStorageKnexOptions {
|
|
32
|
+
const options: ChaintracksStorageKnexOptions = {
|
|
33
|
+
...ChaintracksStorageBase.createStorageBaseOptions(chain),
|
|
34
|
+
knex
|
|
35
|
+
}
|
|
36
|
+
return options
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
knex: Knex
|
|
40
|
+
_dbtype?: DBType
|
|
41
|
+
bulkFilesTableName: string = 'bulk_files'
|
|
42
|
+
headerTableName: string = `live_headers`
|
|
43
|
+
|
|
44
|
+
constructor(options: ChaintracksStorageKnexOptions) {
|
|
45
|
+
super(options)
|
|
46
|
+
if (!options.knex) throw new Error('The knex options property is required.')
|
|
47
|
+
this.knex = options.knex
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get dbtype(): DBType {
|
|
51
|
+
if (!this._dbtype) throw new WERR_INVALID_OPERATION('must call makeAvailable first')
|
|
52
|
+
return this._dbtype
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
override async shutdown(): Promise<void> {
|
|
56
|
+
try {
|
|
57
|
+
await this.knex.destroy()
|
|
58
|
+
} catch {
|
|
59
|
+
/* ignore */
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override async makeAvailable(): Promise<void> {
|
|
64
|
+
if (this.isAvailable && this.hasMigrated) return
|
|
65
|
+
// Not a base class policy, but we want to ensure migrations are run before getting to business.
|
|
66
|
+
if (!this.hasMigrated) {
|
|
67
|
+
await this.migrateLatest()
|
|
68
|
+
}
|
|
69
|
+
if (!this.isAvailable) {
|
|
70
|
+
this._dbtype = await determineDBType(this.knex)
|
|
71
|
+
await super.makeAvailable()
|
|
72
|
+
// Connect the bulk data file manager to the table provided by this storage class.
|
|
73
|
+
await this.bulkManager.setStorage(this, this.log)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override async migrateLatest(): Promise<void> {
|
|
78
|
+
if (this.hasMigrated) return
|
|
79
|
+
await this.knex.migrate.latest({ migrationSource: new ChaintracksKnexMigrations(this.chain) })
|
|
80
|
+
await super.migrateLatest()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override async dropAllData(): Promise<void> {
|
|
84
|
+
// Only using migrations to migrate down, don't need valid properties for settings table.
|
|
85
|
+
const config = {
|
|
86
|
+
migrationSource: new ChaintracksKnexMigrations('test')
|
|
87
|
+
}
|
|
88
|
+
const count = Object.keys(config.migrationSource.migrations).length
|
|
89
|
+
for (let i = 0; i < count; i++) {
|
|
90
|
+
try {
|
|
91
|
+
const r = await this.knex.migrate.down(config)
|
|
92
|
+
if (!r) {
|
|
93
|
+
console.error(`Migration returned falsy result await this.knex.migrate.down(config)`)
|
|
94
|
+
break
|
|
95
|
+
}
|
|
96
|
+
} catch (eu: unknown) {
|
|
97
|
+
break
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.hasMigrated = false
|
|
101
|
+
await super.dropAllData()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
override async destroy(): Promise<void> {
|
|
105
|
+
await this.knex.destroy()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
override async findLiveHeightRange(): Promise<HeightRange> {
|
|
109
|
+
return new HeightRange(
|
|
110
|
+
((await this.knex(this.headerTableName).where({ isActive: true }).min('height as v')).pop()?.v as number) || 0,
|
|
111
|
+
((await this.knex(this.headerTableName).where({ isActive: true }).max('height as v')).pop()?.v as number) || -1
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
override async findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader> {
|
|
116
|
+
const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ headerId: headerId })
|
|
117
|
+
if (!header) throw new Error(`HeaderId ${headerId} not found in live header database.`)
|
|
118
|
+
return header
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
override async findChainTipHeader(): Promise<LiveBlockHeader> {
|
|
122
|
+
const [tip] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ isActive: true, isChainTip: true })
|
|
123
|
+
if (!tip) throw new Error('Database contains no active chain tip header.')
|
|
124
|
+
return tip
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
override async findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined> {
|
|
128
|
+
const [tip] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ isActive: true, isChainTip: true })
|
|
129
|
+
return tip
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null> {
|
|
133
|
+
const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ height: height, isActive: true })
|
|
134
|
+
return header ? header : null
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null> {
|
|
138
|
+
const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ hash: hash })
|
|
139
|
+
const result = header ? header : null
|
|
140
|
+
return result
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null> {
|
|
144
|
+
const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ merkleRoot: merkleRoot })
|
|
145
|
+
return header
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async deleteBulkFile(fileId: number): Promise<number> {
|
|
149
|
+
const count = await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).del()
|
|
150
|
+
return count
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async insertBulkFile(file: BulkHeaderFileInfo): Promise<number> {
|
|
154
|
+
if (!file.fileId) delete file.fileId
|
|
155
|
+
const [id] = await this.knex(this.bulkFilesTableName).insert(file)
|
|
156
|
+
file.fileId = id
|
|
157
|
+
return id
|
|
158
|
+
}
|
|
159
|
+
async updateBulkFile(fileId: number, file: BulkHeaderFileInfo): Promise<number> {
|
|
160
|
+
const n = await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).update(file)
|
|
161
|
+
return n
|
|
162
|
+
}
|
|
163
|
+
async getBulkFiles(): Promise<BulkHeaderFileInfo[]> {
|
|
164
|
+
const files = await this.knex<BulkHeaderFileInfo>(this.bulkFilesTableName)
|
|
165
|
+
.select(
|
|
166
|
+
'fileId',
|
|
167
|
+
'chain',
|
|
168
|
+
'fileName',
|
|
169
|
+
'firstHeight',
|
|
170
|
+
'count',
|
|
171
|
+
'prevHash',
|
|
172
|
+
'lastHash',
|
|
173
|
+
'fileHash',
|
|
174
|
+
'prevChainWork',
|
|
175
|
+
'lastChainWork',
|
|
176
|
+
'validated',
|
|
177
|
+
'sourceUrl'
|
|
178
|
+
)
|
|
179
|
+
.orderBy('firstHeight', 'asc')
|
|
180
|
+
return files
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
dbTypeSubstring(source: string, fromOffset: number, forLength?: number) {
|
|
184
|
+
if (this.dbtype === 'MySQL') return `substring(${source} from ${fromOffset} for ${forLength!})`
|
|
185
|
+
return `substr(${source}, ${fromOffset}, ${forLength})`
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async getBulkFileData(fileId: number, offset?: number, length?: number): Promise<Uint8Array | undefined> {
|
|
189
|
+
await this.makeAvailable()
|
|
190
|
+
if (!Number.isInteger(fileId)) throw new WERR_INVALID_PARAMETER('fileId', 'a valid, integer bulk_files fileId')
|
|
191
|
+
let data: Uint8Array | undefined = undefined
|
|
192
|
+
if (Number.isInteger(offset) && Number.isInteger(length)) {
|
|
193
|
+
let rs: { data: Buffer | null }[] = await this.knex.raw(
|
|
194
|
+
`select ${this.dbTypeSubstring('data', offset! + 1, length)} as data from ${this.bulkFilesTableName} where fileId = '${fileId}'`
|
|
195
|
+
)
|
|
196
|
+
if (this.dbtype === 'MySQL') rs = (rs as unknown as { data: Buffer | null }[][])[0]
|
|
197
|
+
const r = verifyOneOrNone(rs)
|
|
198
|
+
if (r && r.data) {
|
|
199
|
+
data = Uint8Array.from(r.data)
|
|
200
|
+
}
|
|
201
|
+
} else {
|
|
202
|
+
const r = verifyOneOrNone(await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).select('data'))
|
|
203
|
+
if (r.data) data = Uint8Array.from(r.data)
|
|
204
|
+
}
|
|
205
|
+
return data
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* @param header Header to attempt to add to live storage.
|
|
210
|
+
* @returns details of conditions found attempting to insert header
|
|
211
|
+
*/
|
|
212
|
+
async insertHeader(header: BlockHeader): Promise<InsertHeaderResult> {
|
|
213
|
+
const table = this.headerTableName
|
|
214
|
+
|
|
215
|
+
const r: InsertHeaderResult = {
|
|
216
|
+
added: false,
|
|
217
|
+
dupe: false,
|
|
218
|
+
noPrev: false,
|
|
219
|
+
badPrev: false,
|
|
220
|
+
noActiveAncestor: false,
|
|
221
|
+
isActiveTip: false,
|
|
222
|
+
reorgDepth: 0,
|
|
223
|
+
priorTip: undefined,
|
|
224
|
+
noTip: false,
|
|
225
|
+
deactivatedHeaders: []
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await this.knex.transaction(async trx => {
|
|
229
|
+
/*
|
|
230
|
+
We ensure the header does not already exist. This needs to be done
|
|
231
|
+
inside the transaction to avoid inserting multiple headers. If an
|
|
232
|
+
identical header is found, there is no need to insert a new header.
|
|
233
|
+
*/
|
|
234
|
+
const [dupeCheck] = await trx(table).where({ hash: header.hash }).count()
|
|
235
|
+
if (dupeCheck['count(*)']) {
|
|
236
|
+
r.dupe = true
|
|
237
|
+
return
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// This is the existing previous header to the one being inserted...
|
|
241
|
+
let [oneBack] = await trx<LiveBlockHeader>(table).where({ hash: header.previousHash })
|
|
242
|
+
|
|
243
|
+
if (!oneBack) {
|
|
244
|
+
// Check if this is first live header...
|
|
245
|
+
const cr = await trx(table).count()
|
|
246
|
+
const count = Number(cr[0]['count(*)'])
|
|
247
|
+
if (count === 0) {
|
|
248
|
+
// If this is the first live header, the last bulk header (if there is one) is the previous header.
|
|
249
|
+
const lbf = await this.bulkManager.getLastFile()
|
|
250
|
+
if (!lbf) throw new WERR_INVALID_OPERATION('bulk headers must exist before first live header can be added')
|
|
251
|
+
if (header.previousHash === lbf.lastHash && header.height === lbf.firstHeight + lbf.count) {
|
|
252
|
+
// Valid first live header. Add it.
|
|
253
|
+
const chainWork = addWork(lbf.lastChainWork, convertBitsToWork(header.bits))
|
|
254
|
+
r.isActiveTip = true
|
|
255
|
+
const newHeader = {
|
|
256
|
+
...header,
|
|
257
|
+
previousHeaderId: null,
|
|
258
|
+
chainWork,
|
|
259
|
+
isChainTip: r.isActiveTip,
|
|
260
|
+
isActive: r.isActiveTip
|
|
261
|
+
}
|
|
262
|
+
// Success
|
|
263
|
+
await trx<LiveBlockHeader>(table).insert(newHeader)
|
|
264
|
+
r.added = true
|
|
265
|
+
return
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Failure without a oneBack
|
|
269
|
+
// First live header that does not follow last bulk header or
|
|
270
|
+
// Not the first live header and live headers doesn't include a previousHash header.
|
|
271
|
+
r.noPrev = true
|
|
272
|
+
return
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// This header's previousHash matches an existing live header's hash, if height isn't +1, reject it.
|
|
276
|
+
if (oneBack.height + 1 != header.height) {
|
|
277
|
+
r.badPrev = true
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (oneBack.isActive && oneBack.isChainTip) {
|
|
282
|
+
r.priorTip = oneBack
|
|
283
|
+
} else {
|
|
284
|
+
;[r.priorTip] = await trx<LiveBlockHeader>(table).where({ isActive: true, isChainTip: true })
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (!r.priorTip) {
|
|
288
|
+
// No active chain tip found. This is a logic error in state of live headers.
|
|
289
|
+
r.noTip = true
|
|
290
|
+
return
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// We have an acceptable new live header...and live headers has an active chain tip.
|
|
294
|
+
|
|
295
|
+
const chainWork = addWork(oneBack.chainWork, convertBitsToWork(header.bits))
|
|
296
|
+
|
|
297
|
+
r.isActiveTip = isMoreWork(chainWork, r.priorTip.chainWork)
|
|
298
|
+
|
|
299
|
+
const newHeader = {
|
|
300
|
+
...header,
|
|
301
|
+
previousHeaderId: oneBack.headerId,
|
|
302
|
+
chainWork,
|
|
303
|
+
isChainTip: r.isActiveTip,
|
|
304
|
+
isActive: r.isActiveTip
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (r.isActiveTip) {
|
|
308
|
+
// Find newHeader's first active ancestor
|
|
309
|
+
let activeAncestor = oneBack
|
|
310
|
+
while (!activeAncestor.isActive) {
|
|
311
|
+
const [previousHeader] = await trx<LiveBlockHeader>(table).where({
|
|
312
|
+
headerId: activeAncestor.previousHeaderId || -1
|
|
313
|
+
})
|
|
314
|
+
if (!previousHeader) {
|
|
315
|
+
// live headers doesn't contain an active ancestor. This is a live header's logic error.
|
|
316
|
+
r.noActiveAncestor = true
|
|
317
|
+
return
|
|
318
|
+
}
|
|
319
|
+
activeAncestor = previousHeader
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (!(oneBack.isActive && oneBack.isChainTip))
|
|
323
|
+
// If this is the new active chain tip, and oneBack was not, this is a reorg.
|
|
324
|
+
r.reorgDepth = Math.min(r.priorTip.height, header.height) - activeAncestor.height
|
|
325
|
+
|
|
326
|
+
if (activeAncestor.headerId !== oneBack.headerId) {
|
|
327
|
+
// Deactivate headers from the current active chain tip up to but excluding our activeAncestor:
|
|
328
|
+
let [headerToDeactivate] = await trx<LiveBlockHeader>(table).where({ isChainTip: true, isActive: true })
|
|
329
|
+
while (headerToDeactivate.headerId !== activeAncestor.headerId) {
|
|
330
|
+
// Headers are deactivated until we reach the activeAncestor
|
|
331
|
+
r.deactivatedHeaders.push(headerToDeactivate)
|
|
332
|
+
await trx<LiveBlockHeader>(table)
|
|
333
|
+
.where({ headerId: headerToDeactivate.headerId })
|
|
334
|
+
.update({ isActive: false })
|
|
335
|
+
const [previousHeader] = await trx<LiveBlockHeader>(table).where({
|
|
336
|
+
headerId: headerToDeactivate.previousHeaderId || -1
|
|
337
|
+
})
|
|
338
|
+
headerToDeactivate = previousHeader
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// The first header to activate is one before the one we are about to insert
|
|
342
|
+
let headerToActivate = oneBack
|
|
343
|
+
while (headerToActivate.headerId !== activeAncestor.headerId) {
|
|
344
|
+
// Headers are activated until we reach the active ancestor
|
|
345
|
+
await trx<LiveBlockHeader>(table).where({ headerId: headerToActivate.headerId }).update({ isActive: true })
|
|
346
|
+
const [previousHeader] = await trx<LiveBlockHeader>(table).where({
|
|
347
|
+
headerId: headerToActivate.previousHeaderId || -1
|
|
348
|
+
})
|
|
349
|
+
headerToActivate = previousHeader
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (oneBack.isChainTip) {
|
|
355
|
+
// Deactivate the old chain tip
|
|
356
|
+
await trx<LiveBlockHeader>(table).where({ headerId: oneBack.headerId }).update({ isChainTip: false })
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
await trx<LiveBlockHeader>(table).insert(newHeader)
|
|
360
|
+
r.added = true
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
if (r.added && r.isActiveTip) this.pruneLiveBlockHeaders(header.height)
|
|
364
|
+
|
|
365
|
+
return r
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
async findMaxHeaderId(): Promise<number> {
|
|
369
|
+
return ((await this.knex(this.headerTableName).max('headerId as v')).pop()?.v as number) || -1
|
|
370
|
+
//const [resultrow] = await this.knex(this.headerTableName).max('headerId as maxHeaderId')
|
|
371
|
+
//return resultrow?.maxHeaderId || 0
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
override async deleteLiveBlockHeaders(): Promise<void> {
|
|
375
|
+
const table = this.headerTableName
|
|
376
|
+
await this.knex.transaction(async trx => {
|
|
377
|
+
await trx<LiveBlockHeader>(table).update({ previousHeaderId: null })
|
|
378
|
+
await trx<LiveBlockHeader>(table).del()
|
|
379
|
+
})
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
override async deleteBulkBlockHeaders(): Promise<void> {
|
|
383
|
+
const table = this.bulkFilesTableName
|
|
384
|
+
await this.knex.transaction(async trx => {
|
|
385
|
+
await trx<BulkHeaderFileInfo>(table).del()
|
|
386
|
+
})
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number> {
|
|
390
|
+
return this.knex.transaction(async trx => {
|
|
391
|
+
try {
|
|
392
|
+
const tableName = this.headerTableName
|
|
393
|
+
await trx(tableName)
|
|
394
|
+
.whereIn('previousHeaderId', function () {
|
|
395
|
+
this.select('headerId').from(tableName).where('height', '<=', maxHeight)
|
|
396
|
+
})
|
|
397
|
+
.update({ previousHeaderId: null })
|
|
398
|
+
|
|
399
|
+
const deletedCount = await trx(tableName).where('height', '<=', maxHeight).del()
|
|
400
|
+
|
|
401
|
+
// Commit transaction
|
|
402
|
+
await trx.commit()
|
|
403
|
+
return deletedCount
|
|
404
|
+
} catch (error) {
|
|
405
|
+
// Rollback on error
|
|
406
|
+
await trx.rollback()
|
|
407
|
+
throw error
|
|
408
|
+
}
|
|
409
|
+
})
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
async getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]> {
|
|
413
|
+
const headers = await this.knex<LiveBlockHeader>(this.headerTableName)
|
|
414
|
+
.where({ isActive: true })
|
|
415
|
+
.andWhere('height', '>=', range.minHeight)
|
|
416
|
+
.andWhere('height', '<=', range.maxHeight)
|
|
417
|
+
.orderBy('height')
|
|
418
|
+
return headers
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
concatSerializedHeaders(bufs: number[][]): number[] {
|
|
422
|
+
const r: number[] = [bufs.length * 80]
|
|
423
|
+
for (const bh of bufs) {
|
|
424
|
+
for (const b of bh) {
|
|
425
|
+
r.push(b)
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return r
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
async liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]> {
|
|
432
|
+
const headers = await this.knex<LiveBlockHeader>(this.headerTableName)
|
|
433
|
+
.where({ isActive: true })
|
|
434
|
+
.limit(count)
|
|
435
|
+
.orderBy('height')
|
|
436
|
+
return headers
|
|
437
|
+
}
|
|
438
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Chain } from '../../../../sdk'
|
|
2
|
+
import { ChaintracksStorageKnex, ChaintracksStorageKnexOptions } from './ChaintracksStorageKnex'
|
|
3
|
+
import knex from 'knex'
|
|
4
|
+
|
|
5
|
+
export interface ChaintracksStorageMemoryOptions extends ChaintracksStorageKnexOptions {
|
|
6
|
+
sqliteClient: 'sqlite3' | 'better-sqlite3' | undefined
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
export class ChaintracksStorageMemory extends ChaintracksStorageKnex {
|
|
11
|
+
static createStorageMemoryOptions(chain: Chain) {
|
|
12
|
+
const options: ChaintracksStorageMemoryOptions = {
|
|
13
|
+
...ChaintracksStorageKnex.createStorageKnexOptions(chain),
|
|
14
|
+
sqliteClient: 'sqlite3'
|
|
15
|
+
}
|
|
16
|
+
return options
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
constructor(options: ChaintracksStorageMemoryOptions) {
|
|
20
|
+
if (options.knex)
|
|
21
|
+
throw new Error(
|
|
22
|
+
'knex will be automatically configured from the sqliteClient property setting. Must be undefined.'
|
|
23
|
+
)
|
|
24
|
+
options.knex = knex({ client: options.sqliteClient || 'sqlite3', connection: ':memory:', useNullAsDefault: true })
|
|
25
|
+
|
|
26
|
+
super(options)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
*/
|