@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,203 @@
|
|
|
1
|
+
import { Setup } from '../../../src'
|
|
2
|
+
import { sdk, StorageSyncReader, wait } from '../../../src/index.client'
|
|
3
|
+
import { TaskCheckForProofs } from '../../../src/monitor/tasks/TaskCheckForProofs'
|
|
4
|
+
import { TaskClock } from '../../../src/monitor/tasks/TaskClock'
|
|
5
|
+
import { TaskNewHeader } from '../../../src/monitor/tasks/TaskNewHeader'
|
|
6
|
+
import { TaskPurge } from '../../../src/monitor/tasks/TaskPurge'
|
|
7
|
+
import { StorageMySQLDojoReader } from '../../../src/storage/sync'
|
|
8
|
+
import { _tu, TestSetup1Wallet } from '../../utils/TestUtilsWalletStorage'
|
|
9
|
+
|
|
10
|
+
import * as dotenv from 'dotenv'
|
|
11
|
+
dotenv.config()
|
|
12
|
+
const main_satoshi_shop = process.env.SATOSHI_SHOP_MAIN_IDENTITY || ''
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* NOTICE: These tests are designed to chain one after the other.
|
|
16
|
+
* Disable the "await WaitFor*()" lines to run them individually.
|
|
17
|
+
*
|
|
18
|
+
* The inital import from staging dojo takes around 100 seconds... be patient.
|
|
19
|
+
*/
|
|
20
|
+
describe('Wallet sync tests', () => {
|
|
21
|
+
jest.setTimeout(99999999)
|
|
22
|
+
|
|
23
|
+
beforeAll(async () => {})
|
|
24
|
+
|
|
25
|
+
afterAll(async () => {})
|
|
26
|
+
|
|
27
|
+
let doWait = false
|
|
28
|
+
let done0 = false
|
|
29
|
+
const waitFor0 = async () => {
|
|
30
|
+
while (doWait && !done0) await wait(100)
|
|
31
|
+
}
|
|
32
|
+
let done1 = false
|
|
33
|
+
const waitFor1 = async () => {
|
|
34
|
+
while (doWait && !done1) await wait(100)
|
|
35
|
+
}
|
|
36
|
+
let done2 = false
|
|
37
|
+
const waitFor2 = async () => {
|
|
38
|
+
while (doWait && !done2) await wait(100)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const env = _tu.getEnv('test')
|
|
42
|
+
const identityKeyTone = '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
|
|
43
|
+
const rootKeyHex = env.devKeys[identityKeyTone]
|
|
44
|
+
|
|
45
|
+
test('0 sync staging dojo to local MySQL', async () => {
|
|
46
|
+
console.log('Importing from staging dojo to local MySQL stagingdojotone')
|
|
47
|
+
const chain: sdk.Chain = 'test'
|
|
48
|
+
const connection = JSON.parse(process.env.TEST_DOJO_CONNECTION || '')
|
|
49
|
+
const readerKnex = _tu.createMySQLFromConnection(connection)
|
|
50
|
+
const reader = new StorageMySQLDojoReader({ chain, knex: readerKnex })
|
|
51
|
+
const writer = await _tu.createMySQLTestWallet({
|
|
52
|
+
databaseName: 'stagingdojotone',
|
|
53
|
+
chain: 'test',
|
|
54
|
+
rootKeyHex,
|
|
55
|
+
dropAll: true
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const identityKey = writer.identityKey
|
|
59
|
+
await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader))
|
|
60
|
+
|
|
61
|
+
await reader.destroy()
|
|
62
|
+
await writer.activeStorage.destroy()
|
|
63
|
+
done0 = true
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test.skip('0a sync production dojo to local MySQL', async () => {
|
|
67
|
+
const chain: sdk.Chain = 'main'
|
|
68
|
+
const env = _tu.getEnv(chain)
|
|
69
|
+
console.log('Importing from production dojo to local MySQL productiondojotone')
|
|
70
|
+
const identityKey = main_satoshi_shop
|
|
71
|
+
const rootKeyHex = env.devKeys[identityKey]
|
|
72
|
+
const connection = JSON.parse(process.env.MAIN_DOJO_CONNECTION || '')
|
|
73
|
+
const readerKnex = _tu.createMySQLFromConnection(connection)
|
|
74
|
+
const reader = new StorageMySQLDojoReader({ chain, knex: readerKnex })
|
|
75
|
+
const writer = await _tu.createMySQLTestWallet({
|
|
76
|
+
databaseName: 'main_satoshi_shop',
|
|
77
|
+
chain: 'main',
|
|
78
|
+
rootKeyHex,
|
|
79
|
+
dropAll: true
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader))
|
|
83
|
+
|
|
84
|
+
await reader.destroy()
|
|
85
|
+
await writer.activeStorage.destroy()
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
test.skip('0b sweep mysql dojo sync to another wallet', async () => {
|
|
89
|
+
const chain: sdk.Chain = 'main'
|
|
90
|
+
const env = _tu.getEnv(chain)
|
|
91
|
+
// const prod_faucet = '030b78da8101cd8929ec355c694c275fbaf4f73d4eaa104873463779cac69a2a01' // prod faucet
|
|
92
|
+
// const identityKeyTone = process.env.MY_MAIN_IDENTITY || ''
|
|
93
|
+
const identityKey = main_satoshi_shop
|
|
94
|
+
const rootKeyHex = env.devKeys[identityKey]
|
|
95
|
+
|
|
96
|
+
const sweepFrom = await _tu.createMySQLTestWallet({
|
|
97
|
+
databaseName: 'main_satoshi_shop',
|
|
98
|
+
chain,
|
|
99
|
+
rootKeyHex
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
const sweepTo = await _tu.createTestWalletWithStorageClient({
|
|
103
|
+
rootKeyHex: env.devKeys[env.identityKey],
|
|
104
|
+
chain
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
//await sweepTo.activeStorage.updateProvenTxReq(2, { status: 'invalid' })
|
|
108
|
+
//await sweepTo.activeStorage.updateTransactionStatus('failed', 2)
|
|
109
|
+
|
|
110
|
+
await sweepFrom.wallet.sweepTo(sweepTo.wallet)
|
|
111
|
+
|
|
112
|
+
await sweepTo.wallet.destroy()
|
|
113
|
+
await sweepFrom.wallet.destroy()
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
test.skip('1 aggressively purge records from MySQL stagingdojotone', async () => {
|
|
117
|
+
await waitFor0()
|
|
118
|
+
|
|
119
|
+
const { monitor, activeStorage } = await _tu.createMySQLTestWallet({
|
|
120
|
+
databaseName: 'stagingdojotone',
|
|
121
|
+
chain: 'test',
|
|
122
|
+
rootKeyHex
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
{
|
|
126
|
+
const task = new TaskPurge(monitor, {
|
|
127
|
+
purgeCompleted: true,
|
|
128
|
+
purgeFailed: true,
|
|
129
|
+
purgeSpent: true,
|
|
130
|
+
purgeCompletedAge: 1,
|
|
131
|
+
purgeFailedAge: 1,
|
|
132
|
+
purgeSpentAge: 1
|
|
133
|
+
})
|
|
134
|
+
TaskPurge.checkNow = true
|
|
135
|
+
monitor._tasks.push(task)
|
|
136
|
+
await monitor.runTask('Purge')
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
await activeStorage.destroy()
|
|
140
|
+
|
|
141
|
+
done1 = true
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
test.skip('2 sync pruned MySQL stagingdojotone to SQLite walletLegacyTestData', async () => {
|
|
145
|
+
await waitFor1()
|
|
146
|
+
console.log('syncing local MySQL stagingdojotone to local SQLite walletLegacyTestData in tmp folder')
|
|
147
|
+
const reader = await _tu.createMySQLTestWallet({
|
|
148
|
+
databaseName: 'stagingdojotone',
|
|
149
|
+
chain: 'test',
|
|
150
|
+
rootKeyHex
|
|
151
|
+
})
|
|
152
|
+
const writer = await _tu.createSQLiteTestWallet({
|
|
153
|
+
databaseName: 'walletLegacyTestData',
|
|
154
|
+
chain: 'test',
|
|
155
|
+
rootKeyHex,
|
|
156
|
+
dropAll: true
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const identityKey = writer.identityKey
|
|
160
|
+
await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader.activeStorage))
|
|
161
|
+
|
|
162
|
+
await reader.activeStorage.destroy()
|
|
163
|
+
await writer.activeStorage.destroy()
|
|
164
|
+
|
|
165
|
+
console.log('REMEMBER: copy walletLegacyTestData.sqlite from tmp up to data!')
|
|
166
|
+
done2 = true
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
test.skip('3 sync pruned MySQL stagingdojotone to MySQL walletLegacyTestData', async () => {
|
|
170
|
+
await waitFor2()
|
|
171
|
+
console.log('syncing local MySQL stagingdojotone to local SQLite walletLegacyTestData in tmp folder')
|
|
172
|
+
const reader = await _tu.createMySQLTestWallet({
|
|
173
|
+
databaseName: 'stagingdojotone',
|
|
174
|
+
chain: 'test',
|
|
175
|
+
rootKeyHex
|
|
176
|
+
})
|
|
177
|
+
const writer = await _tu.createMySQLTestWallet({
|
|
178
|
+
databaseName: 'walletLegacyTestData',
|
|
179
|
+
chain: 'test',
|
|
180
|
+
rootKeyHex,
|
|
181
|
+
dropAll: true
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
const identityKey = writer.identityKey
|
|
185
|
+
await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader.activeStorage))
|
|
186
|
+
|
|
187
|
+
await reader.activeStorage.destroy()
|
|
188
|
+
await writer.activeStorage.destroy()
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
test('8b run monitor mainnet', async () => {
|
|
192
|
+
if (Setup.noEnv('main')) return
|
|
193
|
+
if (!Setup.getEnv('main').filePath) return
|
|
194
|
+
|
|
195
|
+
// Only run if `Setup` style .env is present with a sqlite filePath...
|
|
196
|
+
|
|
197
|
+
const c = await _tu.createWalletSetupEnv('main')
|
|
198
|
+
|
|
199
|
+
await c.monitor.runOnce()
|
|
200
|
+
|
|
201
|
+
await c.wallet.destroy()
|
|
202
|
+
})
|
|
203
|
+
})
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import knex from 'knex'
|
|
2
|
+
import { sdk, Setup, StorageKnex, wait } from '../../../src'
|
|
3
|
+
import { _tu, logger, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
|
|
4
|
+
|
|
5
|
+
let done0 = false
|
|
6
|
+
const waitFor0 = async () => {
|
|
7
|
+
while (!done0) await wait(100)
|
|
8
|
+
}
|
|
9
|
+
let done1 = false
|
|
10
|
+
const waitFor1 = async () => {
|
|
11
|
+
while (!done1) await wait(100)
|
|
12
|
+
}
|
|
13
|
+
let done2 = false
|
|
14
|
+
const waitFor2 = async () => {
|
|
15
|
+
while (!done2) await wait(100)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('setActive tests', () => {
|
|
19
|
+
jest.setTimeout(99999999)
|
|
20
|
+
|
|
21
|
+
const env = _tu.getEnv('test')
|
|
22
|
+
const chain = env.chain
|
|
23
|
+
const rootKeyHex = env.devKeys[env.identityKey]
|
|
24
|
+
let setup: {
|
|
25
|
+
a: TestWalletNoSetup
|
|
26
|
+
b: TestWalletNoSetup
|
|
27
|
+
c: TestWalletNoSetup
|
|
28
|
+
}
|
|
29
|
+
let store: { a: StorageKnex; b: StorageKnex; c: StorageKnex }
|
|
30
|
+
let storeKey: { a: string; b: string; c: string }
|
|
31
|
+
const testName = () => expect.getState().currentTestName || 'test'
|
|
32
|
+
|
|
33
|
+
beforeEach(async () => {
|
|
34
|
+
const a = await _tu.createSQLiteTestWallet({
|
|
35
|
+
databaseName: `${testName()}_a`,
|
|
36
|
+
chain,
|
|
37
|
+
rootKeyHex,
|
|
38
|
+
dropAll: true
|
|
39
|
+
})
|
|
40
|
+
const b = await _tu.createSQLiteTestWallet({
|
|
41
|
+
databaseName: `${testName()}_b`,
|
|
42
|
+
chain,
|
|
43
|
+
rootKeyHex,
|
|
44
|
+
dropAll: true
|
|
45
|
+
})
|
|
46
|
+
const c = await _tu.createSQLiteTestWallet({
|
|
47
|
+
databaseName: `${testName()}_c`,
|
|
48
|
+
chain,
|
|
49
|
+
rootKeyHex,
|
|
50
|
+
dropAll: true
|
|
51
|
+
})
|
|
52
|
+
setup = { a, b, c }
|
|
53
|
+
store = { a: a.activeStorage, b: b.activeStorage, c: c.activeStorage }
|
|
54
|
+
storeKey = {
|
|
55
|
+
a: store.a._settings!.storageIdentityKey,
|
|
56
|
+
b: store.b._settings!.storageIdentityKey,
|
|
57
|
+
c: store.c._settings!.storageIdentityKey
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
afterEach(async () => {
|
|
62
|
+
await setup.a.wallet.destroy()
|
|
63
|
+
await setup.b.wallet.destroy()
|
|
64
|
+
await setup.c.wallet.destroy()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
test('0 cycle active over three new sqlite wallets', async () => {
|
|
68
|
+
const s = await _tu.createWalletOnly({
|
|
69
|
+
chain,
|
|
70
|
+
rootKeyHex,
|
|
71
|
+
active: store.a,
|
|
72
|
+
backups: [store.b, store.c]
|
|
73
|
+
})
|
|
74
|
+
let first: boolean = true
|
|
75
|
+
for (const active of [storeKey.b, storeKey.c, storeKey.a]) {
|
|
76
|
+
expect(s.storage.isAvailable() === true)
|
|
77
|
+
expect(s.storage.isActiveEnabled === !first)
|
|
78
|
+
const log = await s.storage.setActive(active)
|
|
79
|
+
logger(log)
|
|
80
|
+
expect(s.storage.getActiveStore()).toBe(active)
|
|
81
|
+
expect(s.storage.isActiveEnabled === true)
|
|
82
|
+
first = false
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
test.skip('1 setActive on main storage wallet with local backup', async () => {
|
|
87
|
+
const chain: sdk.Chain = 'main'
|
|
88
|
+
if (Setup.noEnv(chain)) return
|
|
89
|
+
const env = _tu.getEnv(chain)
|
|
90
|
+
if (!env.filePath) return
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const s = await _tu.createTestWallet({
|
|
94
|
+
chain,
|
|
95
|
+
rootKeyHex: env.devKeys[env.identityKey],
|
|
96
|
+
filePath: env.filePath,
|
|
97
|
+
setActiveClient: true,
|
|
98
|
+
addLocalBackup: false,
|
|
99
|
+
useMySQLConnectionForClient: true
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
{
|
|
103
|
+
const log = await s.storage.setActive(s.clientStorageIdentityKey!)
|
|
104
|
+
logger(log)
|
|
105
|
+
}
|
|
106
|
+
{
|
|
107
|
+
const log = await s.storage.setActive(s.localStorageIdentityKey!)
|
|
108
|
+
logger(log)
|
|
109
|
+
}
|
|
110
|
+
{
|
|
111
|
+
const log = await s.storage.setActive(s.clientStorageIdentityKey!)
|
|
112
|
+
logger(log)
|
|
113
|
+
}
|
|
114
|
+
expect(s.storage.isActiveEnabled)
|
|
115
|
+
|
|
116
|
+
await s.wallet.destroy()
|
|
117
|
+
} finally {
|
|
118
|
+
done1 = true
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
test.skip('2 setActive between two local backups', async () => {
|
|
123
|
+
await waitFor1()
|
|
124
|
+
try {
|
|
125
|
+
if (Setup.noEnv('main')) return
|
|
126
|
+
const env = _tu.getEnv('main')
|
|
127
|
+
const s = await _tu.createKnexTestWallet({
|
|
128
|
+
knex: _tu.createLocalSQLite(env.filePath!),
|
|
129
|
+
databaseName: `envFilePath for ${env.identityKey}`,
|
|
130
|
+
chain: env.chain
|
|
131
|
+
})
|
|
132
|
+
const envStorageIdentityKey = s.storage.getActiveStore()
|
|
133
|
+
const filePath = '/Users/tone/Kz/tone42_backup.sqlite'
|
|
134
|
+
const localStore = (
|
|
135
|
+
await _tu.createKnexTestWallet({
|
|
136
|
+
knex: _tu.createLocalSQLite(filePath),
|
|
137
|
+
databaseName: `sqlite for ${env.identityKey}`,
|
|
138
|
+
chain: env.chain
|
|
139
|
+
})
|
|
140
|
+
).activeStorage
|
|
141
|
+
await s.storage.addWalletStorageProvider(localStore)
|
|
142
|
+
{
|
|
143
|
+
const log = await s.storage.setActive(envStorageIdentityKey)
|
|
144
|
+
logger(log)
|
|
145
|
+
}
|
|
146
|
+
{
|
|
147
|
+
const log = await s.storage.setActive(localStore._settings!.storageIdentityKey)
|
|
148
|
+
logger(log)
|
|
149
|
+
}
|
|
150
|
+
{
|
|
151
|
+
const log = await s.storage.setActive(envStorageIdentityKey)
|
|
152
|
+
logger(log)
|
|
153
|
+
}
|
|
154
|
+
expect(s.storage.isActiveEnabled)
|
|
155
|
+
await s.wallet.destroy()
|
|
156
|
+
} finally {
|
|
157
|
+
done2 = true
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
test.skip('3 compare wallet balances', async () => {
|
|
162
|
+
await waitFor2()
|
|
163
|
+
const chain: sdk.Chain = 'test'
|
|
164
|
+
if (Setup.noEnv(chain)) return
|
|
165
|
+
|
|
166
|
+
const s = await _tu.createTestWallet(chain)
|
|
167
|
+
|
|
168
|
+
await s.wallet.destroy()
|
|
169
|
+
})
|
|
170
|
+
})
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { LocalKVStore, WalletClient } from '@bsv/sdk'
|
|
2
|
+
import { Chain } from '../../src/sdk/types'
|
|
3
|
+
import { createSetup, LocalWalletTestOptions } from '../utils/localWalletMethods'
|
|
4
|
+
|
|
5
|
+
const chain: Chain = 'main'
|
|
6
|
+
|
|
7
|
+
const options: LocalWalletTestOptions = {
|
|
8
|
+
setActiveClient: true,
|
|
9
|
+
useMySQLConnectionForClient: true,
|
|
10
|
+
useTestIdentityKey: false,
|
|
11
|
+
useIdentityKey2: false
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe('LocalKVStore tests', () => {
|
|
15
|
+
jest.setTimeout(99999999)
|
|
16
|
+
|
|
17
|
+
test('0 unencrypted Wallet', async () => {
|
|
18
|
+
const originator = 'wallet-toolbox.tests'
|
|
19
|
+
const setup = await createSetup(chain, options)
|
|
20
|
+
const { wallet } = setup
|
|
21
|
+
|
|
22
|
+
const basket = 'kvstoretest5'
|
|
23
|
+
const kv = new LocalKVStore(wallet, basket, false, originator)
|
|
24
|
+
|
|
25
|
+
const r1 = await kv.set('a', 'apple')
|
|
26
|
+
expect(r1).toBeTruthy() // the outpoint of the new stored value
|
|
27
|
+
const r1a = await kv.set('a', 'apple')
|
|
28
|
+
expect(r1a).toBe(r1) // same value must return same outpoint
|
|
29
|
+
const r2 = await kv.get('a')
|
|
30
|
+
expect(r2).toBe('apple')
|
|
31
|
+
const r3 = await kv.get('b', 'banana')
|
|
32
|
+
expect(r3).toBe('banana')
|
|
33
|
+
const r4 = await kv.remove('b')
|
|
34
|
+
expect(r4.length).toBe(0)
|
|
35
|
+
const r5 = await kv.remove('a')
|
|
36
|
+
expect(r5.length).toBe(1)
|
|
37
|
+
const lor = await wallet.listOutputs({ basket })
|
|
38
|
+
expect(lor.totalOutputs).toBe(0)
|
|
39
|
+
|
|
40
|
+
await wallet.destroy()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('1 unencrypted Wallet', async () => {
|
|
44
|
+
const originator = 'wallet-toolbox.tests'
|
|
45
|
+
const setup = await createSetup(chain, options)
|
|
46
|
+
const { wallet } = setup
|
|
47
|
+
|
|
48
|
+
const basket = 'kvstoretest6'
|
|
49
|
+
const kv = new LocalKVStore(wallet, basket, true, originator)
|
|
50
|
+
|
|
51
|
+
const r1 = await kv.set('a', 'apple')
|
|
52
|
+
expect(r1).toBeTruthy() // the outpoint of the new stored value
|
|
53
|
+
const r1a = await kv.set('a', 'apple')
|
|
54
|
+
expect(r1a).toBe(r1) // same value must return same outpoint
|
|
55
|
+
const r2 = await kv.get('a')
|
|
56
|
+
expect(r2).toBe('apple')
|
|
57
|
+
const r3 = await kv.get('b', 'banana')
|
|
58
|
+
expect(r3).toBe('banana')
|
|
59
|
+
const r4 = await kv.remove('b')
|
|
60
|
+
expect(r4.length).toBe(0)
|
|
61
|
+
const r5 = await kv.remove('a')
|
|
62
|
+
expect(r5.length).toBe(1)
|
|
63
|
+
const lor = await wallet.listOutputs({ basket })
|
|
64
|
+
expect(lor.totalOutputs).toBe(0)
|
|
65
|
+
|
|
66
|
+
await wallet.destroy()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('0a unencrypted WalletClient', async () => {
|
|
70
|
+
const originator = 'wallet-toolbox.tests'
|
|
71
|
+
const wallet = new WalletClient(undefined, originator)
|
|
72
|
+
|
|
73
|
+
const basket = 'kvstoretest7'
|
|
74
|
+
const kv = new LocalKVStore(wallet, basket, false, originator)
|
|
75
|
+
|
|
76
|
+
const r1 = await kv.set('a', 'apple')
|
|
77
|
+
expect(r1).toBeTruthy() // the outpoint of the new stored value
|
|
78
|
+
const r1a = await kv.set('a', 'apple')
|
|
79
|
+
expect(r1a).toBe(r1) // same value must return same outpoint
|
|
80
|
+
const r2 = await kv.get('a')
|
|
81
|
+
expect(r2).toBe('apple')
|
|
82
|
+
const r3 = await kv.get('b', 'banana')
|
|
83
|
+
expect(r3).toBe('banana')
|
|
84
|
+
const r4 = await kv.remove('b')
|
|
85
|
+
expect(r4.length).toBe(0)
|
|
86
|
+
const r5 = await kv.remove('a')
|
|
87
|
+
expect(r5.length).toBe(1)
|
|
88
|
+
const lor = await wallet.listOutputs({ basket })
|
|
89
|
+
expect(lor.totalOutputs).toBe(0)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('1a unencrypted WalletClient', async () => {
|
|
93
|
+
const originator = 'wallet-toolbox.tests'
|
|
94
|
+
const wallet = new WalletClient(undefined, originator)
|
|
95
|
+
|
|
96
|
+
const basket = 'kvstoretest8'
|
|
97
|
+
const kv = new LocalKVStore(wallet, basket, true, originator)
|
|
98
|
+
|
|
99
|
+
const r1 = await kv.set('a', 'apple')
|
|
100
|
+
expect(r1).toBeTruthy() // the outpoint of the new stored value
|
|
101
|
+
const r1a = await kv.set('a', 'apple')
|
|
102
|
+
expect(r1a).toBe(r1) // same value must return same outpoint
|
|
103
|
+
const r2 = await kv.get('a')
|
|
104
|
+
expect(r2).toBe('apple')
|
|
105
|
+
const r3 = await kv.get('b', 'banana')
|
|
106
|
+
expect(r3).toBe('banana')
|
|
107
|
+
const r4 = await kv.remove('b')
|
|
108
|
+
expect(r4.length).toBe(0)
|
|
109
|
+
const r5 = await kv.remove('a')
|
|
110
|
+
expect(r5.length).toBe(1)
|
|
111
|
+
const lor = await wallet.listOutputs({ basket })
|
|
112
|
+
expect(lor.totalOutputs).toBe(0)
|
|
113
|
+
})
|
|
114
|
+
})
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Validation as V, CreateActionArgs, WalletClient } from '@bsv/sdk'
|
|
2
|
+
import { specOpThrowReviewActions } from '../../src/sdk/types'
|
|
3
|
+
import { WalletError } from '../../src/sdk/WalletError'
|
|
4
|
+
import { WERR_REVIEW_ACTIONS } from '../../src/sdk/WERR_errors'
|
|
5
|
+
import { WalletErrorFromJson } from '../../src/sdk'
|
|
6
|
+
|
|
7
|
+
describe('WERR.man tests', () => {
|
|
8
|
+
jest.setTimeout(99999999)
|
|
9
|
+
|
|
10
|
+
test('0 WERR_REVIEW_ACTIONS via WalletClient', async () => {
|
|
11
|
+
const wallet = new WalletClient('auto', '0.WERR.man.test')
|
|
12
|
+
|
|
13
|
+
const args: CreateActionArgs = {
|
|
14
|
+
labels: [specOpThrowReviewActions],
|
|
15
|
+
description: 'must throw'
|
|
16
|
+
}
|
|
17
|
+
const vargs = V.validateCreateActionArgs(args)
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const r = await wallet.createAction(args)
|
|
21
|
+
expect(true).toBe(false)
|
|
22
|
+
} catch (eu: unknown) {
|
|
23
|
+
const e = WalletError.fromUnknown(eu) as WERR_REVIEW_ACTIONS
|
|
24
|
+
expect(e.code).toBe('WERR_REVIEW_ACTIONS')
|
|
25
|
+
expect(e.reviewActionResults).toBeTruthy()
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('1', async () => {
|
|
30
|
+
const s = `{\"isError\":true,\"name\":\"WERR_REVIEW_ACTIONS\",\"reviewActionResults\":[{\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"status\":\"doubleSpend\",\"competingTxs\":[\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\"],\"competingBeef\":[1,0,190,239,1,254,12,52,25,0,3,2,2,2,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,3,0,206,69,142,120,152,200,85,221,140,68,16,34,144,39,29,181,67,66,245,76,24,46,209,253,246,204,133,193,175,188,98,241,2,0,0,119,165,81,236,153,173,143,252,69,138,209,229,97,189,36,123,84,160,234,127,63,185,82,5,26,106,157,73,26,107,32,100,1,0,143,243,215,201,227,2,63,39,103,57,216,42,131,190,76,56,216,43,104,59,7,4,174,137,191,49,49,128,249,252,45,42,2,0,0,25,6,223,99,50,23,119,231,67,155,160,205,224,45,74,194,190,202,18,106,135,17,234,165,66,245,89,135,90,255,10,227,1,0,35,96,209,29,146,83,58,174,231,36,40,57,137,94,136,75,149,86,89,160,195,121,92,180,37,191,31,187,23,71,219,209,2,1,0,0,0,2,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,0,0,0,0,106,71,48,68,2,32,23,143,242,5,200,252,85,12,167,137,194,54,96,107,40,141,240,219,145,62,182,133,119,224,94,146,94,249,214,213,212,121,2,32,15,130,24,137,152,12,86,54,141,67,39,178,80,29,110,48,77,114,212,69,237,139,89,152,246,124,138,91,19,32,71,43,65,33,3,16,229,154,223,195,210,19,58,106,26,124,66,99,139,137,43,164,213,109,60,35,235,32,30,122,36,252,12,131,190,69,63,255,255,255,255,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,2,0,0,0,107,72,48,69,2,33,0,154,55,50,224,237,75,147,58,95,164,173,104,149,13,24,125,198,35,126,194,134,91,150,238,179,25,192,213,136,196,51,66,2,32,98,84,153,139,248,106,241,122,65,180,241,124,30,233,140,74,172,74,217,165,129,143,127,156,49,230,34,46,188,15,28,52,65,33,2,146,89,63,53,57,196,48,37,118,17,182,193,201,75,44,105,67,181,136,23,25,104,127,48,146,231,88,99,197,53,56,239,255,255,255,255,2,225,3,0,0,0,0,0,0,25,118,169,20,255,161,196,19,38,201,6,21,136,26,207,151,137,162,75,232,58,201,53,88,136,172,1,0,0,0,0,0,0,0,25,118,169,20,39,140,42,205,54,197,3,247,165,173,16,224,138,193,127,34,191,29,126,7,136,172,0,0,0,0,1,0,1,0,0,0,1,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,0,0,0,0,106,71,48,68,2,32,113,14,233,125,141,249,154,234,138,195,178,164,149,171,255,63,165,28,128,191,230,247,66,128,150,223,65,199,233,39,23,251,2,32,80,77,229,88,242,236,59,27,87,164,79,120,131,240,100,247,182,28,231,200,43,86,4,88,118,214,123,86,89,234,15,220,65,33,2,126,31,155,113,109,251,248,50,61,159,13,216,133,12,125,72,157,20,95,38,54,244,202,14,140,141,176,184,127,210,62,36,255,255,255,255,3,42,0,0,0,0,0,0,0,25,118,169,20,56,12,202,72,139,24,243,136,130,254,20,130,110,109,96,207,112,30,168,123,136,172,1,0,0,0,0,0,0,0,25,118,169,20,70,66,47,177,97,74,57,246,237,66,211,206,113,253,228,175,14,128,182,53,136,172,181,3,0,0,0,0,0,0,25,118,169,20,168,166,193,185,78,43,31,133,215,58,172,227,98,32,56,171,116,85,185,171,136,172,0,0,0,0,0]}],\"sendWithResults\":[{\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"status\":\"failed\"}],\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"tx\":[1,1,1,1,75,0,7,181,153,31,141,207,193,247,92,171,31,219,85,231,207,199,77,170,41,158,224,137,118,54,40,196,241,86,69,52,1,0,190,239,1,254,12,52,25,0,3,2,2,2,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,3,0,206,69,142,120,152,200,85,221,140,68,16,34,144,39,29,181,67,66,245,76,24,46,209,253,246,204,133,193,175,188,98,241,2,0,0,119,165,81,236,153,173,143,252,69,138,209,229,97,189,36,123,84,160,234,127,63,185,82,5,26,106,157,73,26,107,32,100,1,0,143,243,215,201,227,2,63,39,103,57,216,42,131,190,76,56,216,43,104,59,7,4,174,137,191,49,49,128,249,252,45,42,2,0,0,25,6,223,99,50,23,119,231,67,155,160,205,224,45,74,194,190,202,18,106,135,17,234,165,66,245,89,135,90,255,10,227,1,0,35,96,209,29,146,83,58,174,231,36,40,57,137,94,136,75,149,86,89,160,195,121,92,180,37,191,31,187,23,71,219,209,2,1,0,0,0,2,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,0,0,0,0,106,71,48,68,2,32,23,143,242,5,200,252,85,12,167,137,194,54,96,107,40,141,240,219,145,62,182,133,119,224,94,146,94,249,214,213,212,121,2,32,15,130,24,137,152,12,86,54,141,67,39,178,80,29,110,48,77,114,212,69,237,139,89,152,246,124,138,91,19,32,71,43,65,33,3,16,229,154,223,195,210,19,58,106,26,124,66,99,139,137,43,164,213,109,60,35,235,32,30,122,36,252,12,131,190,69,63,255,255,255,255,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,2,0,0,0,107,72,48,69,2,33,0,154,55,50,224,237,75,147,58,95,164,173,104,149,13,24,125,198,35,126,194,134,91,150,238,179,25,192,213,136,196,51,66,2,32,98,84,153,139,248,106,241,122,65,180,241,124,30,233,140,74,172,74,217,165,129,143,127,156,49,230,34,46,188,15,28,52,65,33,2,146,89,63,53,57,196,48,37,118,17,182,193,201,75,44,105,67,181,136,23,25,104,127,48,146,231,88,99,197,53,56,239,255,255,255,255,2,225,3,0,0,0,0,0,0,25,118,169,20,255,161,196,19,38,201,6,21,136,26,207,151,137,162,75,232,58,201,53,88,136,172,1,0,0,0,0,0,0,0,25,118,169,20,39,140,42,205,54,197,3,247,165,173,16,224,138,193,127,34,191,29,126,7,136,172,0,0,0,0,1,0,1,0,0,0,1,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,0,0,0,0,106,71,48,68,2,32,113,14,233,125,141,249,154,234,138,195,178,164,149,171,255,63,165,28,128,191,230,247,66,128,150,223,65,199,233,39,23,251,2,32,80,77,229,88,242,236,59,27,87,164,79,120,131,240,100,247,182,28,231,200,43,86,4,88,118,214,123,86,89,234,15,220,65,33,2,126,31,155,113,109,251,248,50,61,159,13,216,133,12,125,72,157,20,95,38,54,244,202,14,140,141,176,184,127,210,62,36,255,255,255,255,3,42,0,0,0,0,0,0,0,25,118,169,20,56,12,202,72,139,24,243,136,130,254,20,130,110,109,96,207,112,30,168,123,136,172,1,0,0,0,0,0,0,0,25,118,169,20,70,66,47,177,97,74,57,246,237,66,211,206,113,253,228,175,14,128,182,53,136,172,181,3,0,0,0,0,0,0,25,118,169,20,168,166,193,185,78,43,31,133,215,58,172,227,98,32,56,171,116,85,185,171,136,172,0,0,0,0,0],\"noSendChange\":[\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b.0\"]}`
|
|
31
|
+
const o = JSON.parse(s)
|
|
32
|
+
const e = WalletErrorFromJson(o)
|
|
33
|
+
expect(e instanceof WERR_REVIEW_ACTIONS).toBe(true)
|
|
34
|
+
})
|
|
35
|
+
})
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { _tu, logger, TestWalletNoSetup } from '../utils/TestUtilsWalletStorage'
|
|
2
|
+
import { LocalKVStore } from '@bsv/sdk'
|
|
3
|
+
|
|
4
|
+
const includeTestChaintracks = false
|
|
5
|
+
|
|
6
|
+
describe('LocalKVStore tests', () => {
|
|
7
|
+
jest.setTimeout(99999999)
|
|
8
|
+
|
|
9
|
+
const testName = () => expect.getState().currentTestName || 'test'
|
|
10
|
+
let ctxs: TestWalletNoSetup[] = []
|
|
11
|
+
const context = 'test kv store'
|
|
12
|
+
const key1 = 'key1'
|
|
13
|
+
const key2 = 'key2'
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
ctxs = [await _tu.createLegacyWalletSQLiteCopy(`${testName()}`)]
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
afterEach(async () => {
|
|
20
|
+
for (const ctx of ctxs) {
|
|
21
|
+
await ctx.storage.destroy()
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('0 get non-existent', async () => {
|
|
26
|
+
for (const { storage, wallet } of ctxs) {
|
|
27
|
+
const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
|
|
28
|
+
const value = await kvStore.get(key1)
|
|
29
|
+
expect(value).toBeUndefined()
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('1 set get', async () => {
|
|
34
|
+
if (!includeTestChaintracks) return
|
|
35
|
+
for (const { storage, wallet } of ctxs) {
|
|
36
|
+
const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
|
|
37
|
+
await kvStore.set(key1, 'value1')
|
|
38
|
+
const value = await kvStore.get(key1)
|
|
39
|
+
expect(value).toBe('value1')
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('3 set x 4 get', async () => {
|
|
44
|
+
if (!includeTestChaintracks) return
|
|
45
|
+
for (const { storage, wallet } of ctxs) {
|
|
46
|
+
const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
|
|
47
|
+
const promises = [
|
|
48
|
+
kvStore.set(key1, 'value1'),
|
|
49
|
+
kvStore.set(key1, 'value2'),
|
|
50
|
+
kvStore.set(key1, 'value3'),
|
|
51
|
+
kvStore.set(key1, 'value4')
|
|
52
|
+
]
|
|
53
|
+
await Promise.all(promises)
|
|
54
|
+
const value = await kvStore.get(key1)
|
|
55
|
+
expect(value).toBe('value4')
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('4 promise test', async () => {
|
|
60
|
+
jest.useFakeTimers()
|
|
61
|
+
let resolveNewLock: () => void = () => {}
|
|
62
|
+
const newLock = new Promise<void>(resolve => {
|
|
63
|
+
resolveNewLock = resolve
|
|
64
|
+
})
|
|
65
|
+
const t = Date.now()
|
|
66
|
+
setTimeout(() => {
|
|
67
|
+
resolveNewLock()
|
|
68
|
+
}, 1000)
|
|
69
|
+
jest.advanceTimersByTime(1000)
|
|
70
|
+
await newLock
|
|
71
|
+
const elapsed = Date.now() - t
|
|
72
|
+
logger(`Elapsed time: ${elapsed} ms`)
|
|
73
|
+
expect(elapsed).toBeGreaterThanOrEqual(1000)
|
|
74
|
+
jest.useRealTimers()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
test('5 set x 4 get set x 4 get', async () => {
|
|
78
|
+
if (!includeTestChaintracks) return
|
|
79
|
+
for (const { storage, wallet } of ctxs) {
|
|
80
|
+
const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
|
|
81
|
+
let v4: string | undefined
|
|
82
|
+
async function captureValue(): Promise<void> {
|
|
83
|
+
v4 = await kvStore.get(key1)
|
|
84
|
+
}
|
|
85
|
+
const promises = [
|
|
86
|
+
kvStore.set(key1, 'value1'),
|
|
87
|
+
kvStore.set(key1, 'value2'),
|
|
88
|
+
kvStore.set(key1, 'value3'),
|
|
89
|
+
kvStore.set(key1, 'value4'),
|
|
90
|
+
captureValue(),
|
|
91
|
+
kvStore.set(key1, 'value5'),
|
|
92
|
+
kvStore.set(key1, 'value6'),
|
|
93
|
+
kvStore.set(key1, 'value7'),
|
|
94
|
+
kvStore.set(key1, 'value8')
|
|
95
|
+
]
|
|
96
|
+
await Promise.all(promises)
|
|
97
|
+
const v8 = await kvStore.get(key1)
|
|
98
|
+
expect(v4).toBe('value4')
|
|
99
|
+
expect(v8).toBe('value8')
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
})
|
package/test/checkDB.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const sqlite3 = require('sqlite3').verbose()
|
|
2
|
+
|
|
3
|
+
const dbPath = 'test/data/tmp/updatetest.sqlite' // Path to your SQLite database file
|
|
4
|
+
|
|
5
|
+
const runTest = async () => {
|
|
6
|
+
// Open the database
|
|
7
|
+
const db = new sqlite3.Database(dbPath, err => {
|
|
8
|
+
if (err) {
|
|
9
|
+
console.error('Error opening database:', err.message)
|
|
10
|
+
process.exit(1)
|
|
11
|
+
}
|
|
12
|
+
console.log(`Connected to the SQLite database at ${dbPath}`)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
// Check if foreign key enforcement is enabled
|
|
16
|
+
db.get('PRAGMA foreign_keys;', (err, row) => {
|
|
17
|
+
if (err) {
|
|
18
|
+
console.error('Error running PRAGMA foreign_keys:', err.message)
|
|
19
|
+
} else {
|
|
20
|
+
console.log('Foreign key enforcement:', row.foreign_keys === 1 ? 'Enabled' : 'Disabled')
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
// List foreign key constraints for a specific table
|
|
25
|
+
const tables = ['certificates', 'commissions', 'output_baskets', 'outputs']
|
|
26
|
+
for (const table of tables) {
|
|
27
|
+
db.all(`PRAGMA foreign_key_list('${table}');`, (err, rows) => {
|
|
28
|
+
if (err) {
|
|
29
|
+
console.error(`Error querying foreign key list for table '${table}':`, err.message)
|
|
30
|
+
} else {
|
|
31
|
+
console.log(`Foreign key constraints for table '${table}':`)
|
|
32
|
+
if (rows.length === 0) {
|
|
33
|
+
console.log(' No foreign key constraints defined.')
|
|
34
|
+
} else {
|
|
35
|
+
rows.forEach(fk => {
|
|
36
|
+
console.log(
|
|
37
|
+
` Column '${fk.from}' references '${fk.table}(${fk.to})' ` +
|
|
38
|
+
`ON UPDATE ${fk.on_update} ON DELETE ${fk.on_delete}`
|
|
39
|
+
)
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Close the database
|
|
47
|
+
db.close(err => {
|
|
48
|
+
if (err) {
|
|
49
|
+
console.error('Error closing database:', err.message)
|
|
50
|
+
} else {
|
|
51
|
+
console.log('Database connection closed.')
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Run the test
|
|
57
|
+
runTest()
|
package/test/checkdb
ADDED
|
File without changes
|