@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,382 @@
|
|
|
1
|
+
import { WERR_INTERNAL, WERR_INVALID_PARAMETER, Chain } from '../../../../sdk'
|
|
2
|
+
import {
|
|
3
|
+
InsertHeaderResult,
|
|
4
|
+
ChaintracksStorageBaseOptions,
|
|
5
|
+
ChaintracksStorageIngestApi,
|
|
6
|
+
ChaintracksStorageQueryApi
|
|
7
|
+
} from '../Api/ChaintracksStorageApi'
|
|
8
|
+
import { BaseBlockHeader, BlockHeader, LiveBlockHeader } from '../Api/BlockHeaderApi'
|
|
9
|
+
import { HeightRange } from '../util/HeightRange'
|
|
10
|
+
import {
|
|
11
|
+
addWork,
|
|
12
|
+
convertBitsToWork,
|
|
13
|
+
deserializeBaseBlockHeaders,
|
|
14
|
+
isMoreWork,
|
|
15
|
+
serializeBaseBlockHeaders,
|
|
16
|
+
subWork
|
|
17
|
+
} from '../util/blockHeaderUtilities'
|
|
18
|
+
import { BulkFileDataManager } from '../util/BulkFileDataManager'
|
|
19
|
+
import { BulkFilesReaderStorage } from '../util/BulkFilesReader'
|
|
20
|
+
import { asArray } from '../../../../utility/utilityHelpers.noBuffer'
|
|
21
|
+
import { deserialize } from 'v8'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Required interface methods of a Chaintracks Storage Engine implementation.
|
|
25
|
+
*/
|
|
26
|
+
export abstract class ChaintracksStorageBase implements ChaintracksStorageQueryApi, ChaintracksStorageIngestApi {
|
|
27
|
+
static createStorageBaseOptions(chain: Chain): ChaintracksStorageBaseOptions {
|
|
28
|
+
const options: ChaintracksStorageBaseOptions = {
|
|
29
|
+
chain,
|
|
30
|
+
liveHeightThreshold: 2000,
|
|
31
|
+
reorgHeightThreshold: 400,
|
|
32
|
+
bulkMigrationChunkSize: 500,
|
|
33
|
+
batchInsertLimit: 400,
|
|
34
|
+
bulkFileDataManager: undefined
|
|
35
|
+
}
|
|
36
|
+
return options
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
log: (...args: any[]) => void = () => {}
|
|
40
|
+
|
|
41
|
+
chain: Chain
|
|
42
|
+
liveHeightThreshold: number
|
|
43
|
+
reorgHeightThreshold: number
|
|
44
|
+
bulkMigrationChunkSize: number
|
|
45
|
+
batchInsertLimit: number
|
|
46
|
+
|
|
47
|
+
isAvailable: boolean = false
|
|
48
|
+
hasMigrated: boolean = false
|
|
49
|
+
bulkManager: BulkFileDataManager
|
|
50
|
+
|
|
51
|
+
constructor(options: ChaintracksStorageBaseOptions) {
|
|
52
|
+
this.chain = options.chain
|
|
53
|
+
this.liveHeightThreshold = options.liveHeightThreshold
|
|
54
|
+
this.reorgHeightThreshold = options.reorgHeightThreshold
|
|
55
|
+
this.bulkMigrationChunkSize = options.bulkMigrationChunkSize
|
|
56
|
+
this.batchInsertLimit = options.batchInsertLimit
|
|
57
|
+
this.bulkManager =
|
|
58
|
+
options.bulkFileDataManager || new BulkFileDataManager(BulkFileDataManager.createDefaultOptions(this.chain))
|
|
59
|
+
}
|
|
60
|
+
async shutdown(): Promise<void> {
|
|
61
|
+
/* base class does notning */
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async makeAvailable(): Promise<void> {
|
|
65
|
+
if (this.isAvailable) return
|
|
66
|
+
this.isAvailable = true
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async migrateLatest(): Promise<void> {
|
|
70
|
+
this.hasMigrated = true
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async dropAllData(): Promise<void> {
|
|
74
|
+
await this.bulkManager.deleteBulkFiles()
|
|
75
|
+
await this.makeAvailable()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Abstract functions to be defined by implementation classes
|
|
79
|
+
|
|
80
|
+
abstract deleteLiveBlockHeaders(): Promise<void>
|
|
81
|
+
abstract deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number>
|
|
82
|
+
abstract findChainTipHeader(): Promise<LiveBlockHeader>
|
|
83
|
+
abstract findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined>
|
|
84
|
+
abstract findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null>
|
|
85
|
+
abstract findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader>
|
|
86
|
+
abstract findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null>
|
|
87
|
+
abstract findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null>
|
|
88
|
+
abstract findLiveHeightRange(): Promise<HeightRange>
|
|
89
|
+
abstract findMaxHeaderId(): Promise<number>
|
|
90
|
+
abstract liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]>
|
|
91
|
+
abstract getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]>
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @param header Header to attempt to add to live storage.
|
|
95
|
+
* @returns details of conditions found attempting to insert header
|
|
96
|
+
*/
|
|
97
|
+
abstract insertHeader(header: BlockHeader): Promise<InsertHeaderResult>
|
|
98
|
+
abstract destroy(): Promise<void>
|
|
99
|
+
|
|
100
|
+
// BASE CLASS IMPLEMENTATIONS - MAY BE OVERRIDEN
|
|
101
|
+
|
|
102
|
+
async getBulkHeaders(range: HeightRange): Promise<Uint8Array> {
|
|
103
|
+
if (range.isEmpty) return new Uint8Array()
|
|
104
|
+
|
|
105
|
+
const fetch = this.bulkManager.fetch
|
|
106
|
+
const reader = await BulkFilesReaderStorage.fromStorage(this, fetch, range, range.length * 80)
|
|
107
|
+
const data = await reader.read()
|
|
108
|
+
if (!data) return new Uint8Array()
|
|
109
|
+
return data
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async getHeadersUint8Array(height: number, count: number): Promise<Uint8Array> {
|
|
113
|
+
if (count <= 0) return new Uint8Array()
|
|
114
|
+
const ranges = await this.getAvailableHeightRanges()
|
|
115
|
+
const range = new HeightRange(height, height + count - 1)
|
|
116
|
+
const bulkRange = ranges.bulk.intersect(range)
|
|
117
|
+
const liveRange = ranges.live.intersect(range)
|
|
118
|
+
|
|
119
|
+
if (liveRange.isEmpty && bulkRange.isEmpty) return new Uint8Array()
|
|
120
|
+
|
|
121
|
+
const liveHeaders = await this.getLiveHeaders(liveRange)
|
|
122
|
+
const liveData = serializeBaseBlockHeaders(liveHeaders)
|
|
123
|
+
const bulkData = await this.getBulkHeaders(bulkRange)
|
|
124
|
+
|
|
125
|
+
const data = new Uint8Array(liveData.length + bulkData.length)
|
|
126
|
+
|
|
127
|
+
if (bulkData.length > 0) data.set(bulkData, 0)
|
|
128
|
+
|
|
129
|
+
if (liveData.length > 0) data.set(liveData, bulkData.length)
|
|
130
|
+
|
|
131
|
+
return data
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async getHeaders(height: number, count: number): Promise<BaseBlockHeader[]> {
|
|
135
|
+
const data = await this.getHeadersUint8Array(height, count)
|
|
136
|
+
const headers = deserializeBaseBlockHeaders(data)
|
|
137
|
+
return headers
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async deleteBulkBlockHeaders(): Promise<void> {
|
|
141
|
+
await this.bulkManager.deleteBulkFiles()
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async getAvailableHeightRanges(): Promise<{ bulk: HeightRange; live: HeightRange }> {
|
|
145
|
+
await this.makeAvailable()
|
|
146
|
+
const bulk = await this.bulkManager.getHeightRange()
|
|
147
|
+
const live = await this.findLiveHeightRange()
|
|
148
|
+
if (bulk.isEmpty) {
|
|
149
|
+
if (!live.isEmpty && live.minHeight !== 0)
|
|
150
|
+
throw new Error('With empty bulk storage, live storage must start with genesis header.')
|
|
151
|
+
} else {
|
|
152
|
+
if (!bulk.isEmpty && bulk.minHeight != 0) throw new Error("Bulk storage doesn't start with genesis header.")
|
|
153
|
+
if (!live.isEmpty && !bulk.isEmpty && bulk.maxHeight + 1 !== live.minHeight)
|
|
154
|
+
throw new Error('There is a gap or overlap between bulk and live header storage.')
|
|
155
|
+
}
|
|
156
|
+
return { bulk, live }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private lastActiveMinHeight: number | undefined
|
|
160
|
+
|
|
161
|
+
async pruneLiveBlockHeaders(activeTipHeight: number): Promise<void> {
|
|
162
|
+
await this.makeAvailable()
|
|
163
|
+
try {
|
|
164
|
+
const minHeight = this.lastActiveMinHeight || (await this.findLiveHeightRange()).minHeight
|
|
165
|
+
|
|
166
|
+
let totalCount = activeTipHeight - minHeight + 1 - this.liveHeightThreshold
|
|
167
|
+
while (totalCount >= this.bulkMigrationChunkSize) {
|
|
168
|
+
const count = Math.min(totalCount, this.bulkMigrationChunkSize)
|
|
169
|
+
await this.migrateLiveToBulk(count)
|
|
170
|
+
totalCount -= count
|
|
171
|
+
this.lastActiveMinHeight = undefined
|
|
172
|
+
}
|
|
173
|
+
} catch (err: unknown) {
|
|
174
|
+
this.log(err)
|
|
175
|
+
throw err
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async findChainTipHash(): Promise<string> {
|
|
180
|
+
await this.makeAvailable()
|
|
181
|
+
const tip = await this.findChainTipHeader()
|
|
182
|
+
return tip.hash
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async findChainTipWork(): Promise<string> {
|
|
186
|
+
await this.makeAvailable()
|
|
187
|
+
const tip = await this.findChainTipHeader()
|
|
188
|
+
return tip.chainWork
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async findChainWorkForBlockHash(hash: string): Promise<string> {
|
|
192
|
+
await this.makeAvailable()
|
|
193
|
+
const header = await this.findLiveHeaderForBlockHash(hash)
|
|
194
|
+
if (header !== null) return header.chainWork
|
|
195
|
+
throw new Error(`Header with hash of ${hash} was not found in the live headers database.`)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async findBulkFilesHeaderForHeightOrUndefined(height: number): Promise<BlockHeader | undefined> {
|
|
199
|
+
await this.makeAvailable()
|
|
200
|
+
return this.bulkManager.findHeaderForHeightOrUndefined(height)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async findHeaderForHeightOrUndefined(height: number): Promise<LiveBlockHeader | BlockHeader | undefined> {
|
|
204
|
+
await this.makeAvailable()
|
|
205
|
+
if (isNaN(height) || height < 0 || Math.ceil(height) !== height)
|
|
206
|
+
throw new WERR_INVALID_PARAMETER('height', `a non-negative integer (${height}).`)
|
|
207
|
+
const liveHeader = await this.findLiveHeaderForHeight(height)
|
|
208
|
+
if (liveHeader !== null) return liveHeader
|
|
209
|
+
const header = await this.findBulkFilesHeaderForHeightOrUndefined(height)
|
|
210
|
+
return header
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async findHeaderForHeight(height: number): Promise<LiveBlockHeader | BlockHeader> {
|
|
214
|
+
await this.makeAvailable()
|
|
215
|
+
const header = await this.findHeaderForHeightOrUndefined(height)
|
|
216
|
+
if (header) return header
|
|
217
|
+
throw new Error(`Header with height of ${height} was not found.`)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async isMerkleRootActive(merkleRoot: string): Promise<boolean> {
|
|
221
|
+
await this.makeAvailable()
|
|
222
|
+
const header = await this.findLiveHeaderForMerkleRoot(merkleRoot)
|
|
223
|
+
return header ? header.isActive : false
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async findCommonAncestor(header1: LiveBlockHeader, header2: LiveBlockHeader): Promise<LiveBlockHeader> {
|
|
227
|
+
await this.makeAvailable()
|
|
228
|
+
/*eslint no-constant-condition: ["error", { "checkLoops": false }]*/
|
|
229
|
+
while (true) {
|
|
230
|
+
if (header1.previousHeaderId === null || header2.previousHeaderId === null)
|
|
231
|
+
throw new Error('Reached start of live database without resolving the reorg.')
|
|
232
|
+
if (header1.previousHeaderId === header2.previousHeaderId)
|
|
233
|
+
return await this.findLiveHeaderForHeaderId(header1.previousHeaderId)
|
|
234
|
+
const backupHeader1 = header1.height >= header2.height
|
|
235
|
+
if (header2.height >= header1.height) header2 = await this.findLiveHeaderForHeaderId(header2.previousHeaderId)
|
|
236
|
+
if (backupHeader1) header1 = await this.findLiveHeaderForHeaderId(header1.previousHeaderId)
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async findReorgDepth(header1: LiveBlockHeader, header2: LiveBlockHeader): Promise<number> {
|
|
241
|
+
await this.makeAvailable()
|
|
242
|
+
const ancestor = await this.findCommonAncestor(header1, header2)
|
|
243
|
+
return Math.max(header1.height, header2.height) - ancestor.height
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private nowMigratingLiveToBulk = false
|
|
247
|
+
|
|
248
|
+
async migrateLiveToBulk(count: number, ignoreLimits = false): Promise<void> {
|
|
249
|
+
await this.makeAvailable()
|
|
250
|
+
if (!ignoreLimits && count > this.bulkMigrationChunkSize) return
|
|
251
|
+
|
|
252
|
+
if (this.nowMigratingLiveToBulk) {
|
|
253
|
+
this.log('Already migrating live to bulk.')
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
try {
|
|
258
|
+
this.nowMigratingLiveToBulk = true
|
|
259
|
+
|
|
260
|
+
const headers = await this.liveHeadersForBulk(count)
|
|
261
|
+
|
|
262
|
+
await this.addLiveHeadersToBulk(headers)
|
|
263
|
+
|
|
264
|
+
await this.deleteOlderLiveBlockHeaders(headers.slice(-1)[0].height)
|
|
265
|
+
} finally {
|
|
266
|
+
this.nowMigratingLiveToBulk = false
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async addBulkHeaders(
|
|
271
|
+
headers: BlockHeader[],
|
|
272
|
+
bulkRange: HeightRange,
|
|
273
|
+
priorLiveHeaders: BlockHeader[]
|
|
274
|
+
): Promise<BlockHeader[]> {
|
|
275
|
+
await this.makeAvailable()
|
|
276
|
+
|
|
277
|
+
if (!headers || headers.length === 0) return priorLiveHeaders
|
|
278
|
+
|
|
279
|
+
// Get the current extent of validated bulk and live block headers.
|
|
280
|
+
const before = await this.getAvailableHeightRanges()
|
|
281
|
+
const bulkFiles = this.bulkManager
|
|
282
|
+
|
|
283
|
+
// Review `headers`, applying the following rules:
|
|
284
|
+
// 1. Height must be outside the current bulk HeightRange.
|
|
285
|
+
// 2. Height must not exceed presentHeight - liveHeightThreshold. If presentHeight is unknown, use maximum height across all headers.
|
|
286
|
+
// 3. Compute chainWork for each header.
|
|
287
|
+
// 4. Verify chain of header hash and previousHash values. One header at each height. Retain chain with most chainWork.
|
|
288
|
+
|
|
289
|
+
const minHeight = !bulkRange.isEmpty ? bulkRange.minHeight : before.bulk.isEmpty ? 0 : before.bulk.maxHeight + 1
|
|
290
|
+
const filteredHeaders = headers.concat(priorLiveHeaders || []).filter(h => h.height >= minHeight)
|
|
291
|
+
const sortedHeaders = filteredHeaders.sort((a, b) => a.height - b.height)
|
|
292
|
+
const liveHeaders = sortedHeaders.filter(h => bulkRange.isEmpty || !bulkRange.contains(h.height))
|
|
293
|
+
|
|
294
|
+
if (liveHeaders.length === sortedHeaders.length) {
|
|
295
|
+
// All headers are live, no bulk headers to add.
|
|
296
|
+
return liveHeaders
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const chains: AddBulkHeadersChain[] = []
|
|
300
|
+
|
|
301
|
+
for (const h of sortedHeaders) {
|
|
302
|
+
const dupe = chains.find(c => {
|
|
303
|
+
const lh = c.headers[c.headers.length - 1]
|
|
304
|
+
return lh.hash === h.hash
|
|
305
|
+
})
|
|
306
|
+
if (dupe) continue
|
|
307
|
+
const chainWork = convertBitsToWork(h.bits)
|
|
308
|
+
let chain = chains.find(c => {
|
|
309
|
+
const lh = c.headers[c.headers.length - 1]
|
|
310
|
+
return lh.height + 1 === h.height && lh.hash === h.previousHash
|
|
311
|
+
})
|
|
312
|
+
if (chain) {
|
|
313
|
+
chain.headers.push(h)
|
|
314
|
+
chain.chainWork = addWork(chain.chainWork, chainWork)
|
|
315
|
+
if (h.height <= bulkRange.maxHeight) {
|
|
316
|
+
chain.bulkChainWork = chain.chainWork
|
|
317
|
+
}
|
|
318
|
+
continue
|
|
319
|
+
}
|
|
320
|
+
// Since headers are assumed to be sorted by height,
|
|
321
|
+
// if this header doesn't extend an existing chain,
|
|
322
|
+
// it may be a branch from the previous header.
|
|
323
|
+
chain = chains.find(c => {
|
|
324
|
+
const lh = c.headers[c.headers.length - 2]
|
|
325
|
+
return lh.height + 1 === h.height && lh.hash === h.previousHash
|
|
326
|
+
})
|
|
327
|
+
if (chain) {
|
|
328
|
+
// This header competes with tip of `chain`.
|
|
329
|
+
// Create a new chain with this header as the tip.
|
|
330
|
+
const headers = chain.headers.slice(0, -1)
|
|
331
|
+
headers.push(h)
|
|
332
|
+
const otherHeaderChainWork = convertBitsToWork(chain.headers[chain.headers.length - 1].bits)
|
|
333
|
+
const newChainWork = addWork(subWork(chain.chainWork, otherHeaderChainWork), chainWork)
|
|
334
|
+
const newChain = {
|
|
335
|
+
headers,
|
|
336
|
+
chainWork: newChainWork,
|
|
337
|
+
bulkChainWork: h.height <= bulkRange.maxHeight ? newChainWork : undefined
|
|
338
|
+
}
|
|
339
|
+
chains.push(newChain)
|
|
340
|
+
continue
|
|
341
|
+
}
|
|
342
|
+
// Starting a new chain
|
|
343
|
+
chains.push({ headers: [h], chainWork, bulkChainWork: h.height <= bulkRange.maxHeight ? chainWork : undefined })
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Find the chain with the most chainWork.
|
|
347
|
+
const bestChain = chains.reduce((best, c) => (isMoreWork(c.chainWork, best.chainWork) ? c : best), chains[0])
|
|
348
|
+
|
|
349
|
+
const newBulkHeaders = bestChain.headers.slice(0, bulkRange.maxHeight - bestChain.headers[0].height + 1)
|
|
350
|
+
|
|
351
|
+
await this.addBulkHeadersFromBestChain(newBulkHeaders, bestChain)
|
|
352
|
+
|
|
353
|
+
return liveHeaders
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
private async addBulkHeadersFromBestChain(newBulkHeaders: BlockHeader[], bestChain: AddBulkHeadersChain) {
|
|
357
|
+
if (!bestChain.bulkChainWork) {
|
|
358
|
+
throw new WERR_INTERNAL(
|
|
359
|
+
`bulkChainWork is not defined for the best chain with height ${bestChain.headers[0].height}`
|
|
360
|
+
)
|
|
361
|
+
}
|
|
362
|
+
await this.bulkManager.mergeIncrementalBlockHeaders(newBulkHeaders, bestChain.bulkChainWork)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private async addLiveHeadersToBulk(liveHeaders: LiveBlockHeader[]) {
|
|
366
|
+
if (liveHeaders.length === 0) return
|
|
367
|
+
const lastChainWork = liveHeaders.slice(-1)[0].chainWork
|
|
368
|
+
await this.bulkManager.mergeIncrementalBlockHeaders(liveHeaders, lastChainWork)
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
interface AddBulkHeadersChain {
|
|
373
|
+
headers: BlockHeader[]
|
|
374
|
+
/**
|
|
375
|
+
* Total chainwork of headers.
|
|
376
|
+
*/
|
|
377
|
+
chainWork: string
|
|
378
|
+
/**
|
|
379
|
+
* Total chainwork of headers with height not greater than maxBulkHeight.
|
|
380
|
+
*/
|
|
381
|
+
bulkChainWork?: string
|
|
382
|
+
}
|