@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,194 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TableCertificateField,
|
|
3
|
+
TableCertificateX,
|
|
4
|
+
TableCommission,
|
|
5
|
+
TableMonitorEvent,
|
|
6
|
+
TableOutput,
|
|
7
|
+
TableOutputBasket,
|
|
8
|
+
TableOutputTag,
|
|
9
|
+
TableOutputTagMap,
|
|
10
|
+
TableProvenTx,
|
|
11
|
+
TableProvenTxReq,
|
|
12
|
+
TableSettings,
|
|
13
|
+
TableSyncState,
|
|
14
|
+
TableTransaction,
|
|
15
|
+
TableTxLabel,
|
|
16
|
+
TableTxLabelMap,
|
|
17
|
+
TableUser
|
|
18
|
+
} from './schema/tables'
|
|
19
|
+
import * as sdk from '../sdk/index'
|
|
20
|
+
import { validateSecondsSinceEpoch, verifyOneOrNone, verifyTruthy } from '../utility/utilityHelpers'
|
|
21
|
+
import { getSyncChunk } from './methods/getSyncChunk'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The `StorageReader` abstract class is the base of the concrete wallet storage provider classes.
|
|
25
|
+
*
|
|
26
|
+
* It is the minimal interface required to read all wallet state records and is the base class for sync readers.
|
|
27
|
+
*
|
|
28
|
+
* The next class in the heirarchy is the `StorageReaderWriter` which supports sync readers and writers.
|
|
29
|
+
*
|
|
30
|
+
* The last class in the heirarchy is the `Storage` class which supports all active wallet operations.
|
|
31
|
+
*
|
|
32
|
+
* The ability to construct a properly configured instance of this class implies authentication.
|
|
33
|
+
* As such there are no user specific authenticated access checks implied in the implementation of any of these methods.
|
|
34
|
+
*/
|
|
35
|
+
export abstract class StorageReader implements sdk.WalletStorageSyncReader {
|
|
36
|
+
chain: sdk.Chain
|
|
37
|
+
_settings?: TableSettings
|
|
38
|
+
whenLastAccess?: Date
|
|
39
|
+
get dbtype(): DBType | undefined {
|
|
40
|
+
return this._settings?.dbtype
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
constructor(options: StorageReaderOptions) {
|
|
44
|
+
this.chain = options.chain
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
isAvailable(): boolean {
|
|
48
|
+
return !!this._settings
|
|
49
|
+
}
|
|
50
|
+
async makeAvailable(): Promise<TableSettings> {
|
|
51
|
+
if (this._settings) return this._settings
|
|
52
|
+
return (this._settings = await this.readSettings())
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
getSettings(): TableSettings {
|
|
56
|
+
if (!this._settings) throw new sdk.WERR_INVALID_OPERATION('must call "makeAvailable" before accessing "settings"')
|
|
57
|
+
return this._settings
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
isStorageProvider(): boolean {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
abstract destroy(): Promise<void>
|
|
65
|
+
|
|
66
|
+
abstract transaction<T>(scope: (trx: sdk.TrxToken) => Promise<T>, trx?: sdk.TrxToken): Promise<T>
|
|
67
|
+
|
|
68
|
+
abstract readSettings(trx?: sdk.TrxToken): Promise<TableSettings>
|
|
69
|
+
|
|
70
|
+
abstract findCertificateFields(args: sdk.FindCertificateFieldsArgs): Promise<TableCertificateField[]>
|
|
71
|
+
abstract findCertificates(args: sdk.FindCertificatesArgs): Promise<TableCertificateX[]>
|
|
72
|
+
abstract findCommissions(args: sdk.FindCommissionsArgs): Promise<TableCommission[]>
|
|
73
|
+
abstract findMonitorEvents(args: sdk.FindMonitorEventsArgs): Promise<TableMonitorEvent[]>
|
|
74
|
+
abstract findOutputBaskets(args: sdk.FindOutputBasketsArgs): Promise<TableOutputBasket[]>
|
|
75
|
+
abstract findOutputs(args: sdk.FindOutputsArgs): Promise<TableOutput[]>
|
|
76
|
+
abstract findOutputTags(args: sdk.FindOutputTagsArgs): Promise<TableOutputTag[]>
|
|
77
|
+
abstract findSyncStates(args: sdk.FindSyncStatesArgs): Promise<TableSyncState[]>
|
|
78
|
+
abstract findTransactions(args: sdk.FindTransactionsArgs): Promise<TableTransaction[]>
|
|
79
|
+
abstract findTxLabels(args: sdk.FindTxLabelsArgs): Promise<TableTxLabel[]>
|
|
80
|
+
abstract findUsers(args: sdk.FindUsersArgs): Promise<TableUser[]>
|
|
81
|
+
|
|
82
|
+
abstract countCertificateFields(args: sdk.FindCertificateFieldsArgs): Promise<number>
|
|
83
|
+
abstract countCertificates(args: sdk.FindCertificatesArgs): Promise<number>
|
|
84
|
+
abstract countCommissions(args: sdk.FindCommissionsArgs): Promise<number>
|
|
85
|
+
abstract countMonitorEvents(args: sdk.FindMonitorEventsArgs): Promise<number>
|
|
86
|
+
abstract countOutputBaskets(args: sdk.FindOutputBasketsArgs): Promise<number>
|
|
87
|
+
abstract countOutputs(args: sdk.FindOutputsArgs): Promise<number>
|
|
88
|
+
abstract countOutputTags(args: sdk.FindOutputTagsArgs): Promise<number>
|
|
89
|
+
abstract countSyncStates(args: sdk.FindSyncStatesArgs): Promise<number>
|
|
90
|
+
abstract countTransactions(args: sdk.FindTransactionsArgs): Promise<number>
|
|
91
|
+
abstract countTxLabels(args: sdk.FindTxLabelsArgs): Promise<number>
|
|
92
|
+
abstract countUsers(args: sdk.FindUsersArgs): Promise<number>
|
|
93
|
+
|
|
94
|
+
abstract getProvenTxsForUser(args: sdk.FindForUserSincePagedArgs): Promise<TableProvenTx[]>
|
|
95
|
+
abstract getProvenTxReqsForUser(args: sdk.FindForUserSincePagedArgs): Promise<TableProvenTxReq[]>
|
|
96
|
+
abstract getTxLabelMapsForUser(args: sdk.FindForUserSincePagedArgs): Promise<TableTxLabelMap[]>
|
|
97
|
+
abstract getOutputTagMapsForUser(args: sdk.FindForUserSincePagedArgs): Promise<TableOutputTagMap[]>
|
|
98
|
+
|
|
99
|
+
async findUserByIdentityKey(key: string): Promise<TableUser | undefined> {
|
|
100
|
+
return verifyOneOrNone(await this.findUsers({ partial: { identityKey: key } }))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async getSyncChunk(args: sdk.RequestSyncChunkArgs): Promise<sdk.SyncChunk> {
|
|
104
|
+
return getSyncChunk(this, args)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Force dates to strings on SQLite and Date objects on MySQL
|
|
109
|
+
* @param date
|
|
110
|
+
* @returns
|
|
111
|
+
*/
|
|
112
|
+
validateEntityDate(date: Date | string | number): Date | string {
|
|
113
|
+
if (!this.dbtype) throw new sdk.WERR_INTERNAL('must call verifyReadyForDatabaseAccess first')
|
|
114
|
+
let r: Date | string = this.validateDate(date)
|
|
115
|
+
switch (this.dbtype) {
|
|
116
|
+
case 'IndexedDB':
|
|
117
|
+
case 'MySQL':
|
|
118
|
+
break
|
|
119
|
+
case 'SQLite':
|
|
120
|
+
r = r.toISOString()
|
|
121
|
+
break
|
|
122
|
+
default:
|
|
123
|
+
throw new sdk.WERR_INTERNAL(`Invalid dateScheme ${this.dbtype}`)
|
|
124
|
+
}
|
|
125
|
+
return r
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
* @param date
|
|
131
|
+
* @param useNowAsDefault if true and date is null or undefiend, set to current time.
|
|
132
|
+
* @returns
|
|
133
|
+
*/
|
|
134
|
+
validateOptionalEntityDate(
|
|
135
|
+
date: Date | string | number | null | undefined,
|
|
136
|
+
useNowAsDefault?: boolean
|
|
137
|
+
): Date | string | undefined {
|
|
138
|
+
if (!this.dbtype) throw new sdk.WERR_INTERNAL('must call verifyReadyForDatabaseAccess first')
|
|
139
|
+
let r: Date | string | undefined = this.validateOptionalDate(date)
|
|
140
|
+
if (!r && useNowAsDefault) r = new Date()
|
|
141
|
+
switch (this.dbtype) {
|
|
142
|
+
case 'IndexedDB':
|
|
143
|
+
case 'MySQL':
|
|
144
|
+
break
|
|
145
|
+
case 'SQLite':
|
|
146
|
+
if (r) r = r.toISOString()
|
|
147
|
+
break
|
|
148
|
+
default:
|
|
149
|
+
throw new sdk.WERR_INTERNAL(`Invalid dateScheme ${this.dbtype}`)
|
|
150
|
+
}
|
|
151
|
+
return r
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
validateDate(date: Date | string | number): Date {
|
|
155
|
+
let r: Date
|
|
156
|
+
if (date instanceof Date) r = date
|
|
157
|
+
else r = new Date(date)
|
|
158
|
+
return r
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
validateOptionalDate(date: Date | string | number | null | undefined): Date | undefined {
|
|
162
|
+
if (date === null || date === undefined) return undefined
|
|
163
|
+
return this.validateDate(date)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
validateDateForWhere(date: Date | string | number): Date | string | number {
|
|
167
|
+
if (!this.dbtype) throw new sdk.WERR_INTERNAL('must call verifyReadyForDatabaseAccess first')
|
|
168
|
+
if (typeof date === 'number') date = validateSecondsSinceEpoch(date)
|
|
169
|
+
const vdate = verifyTruthy(this.validateDate(date))
|
|
170
|
+
let r: Date | string | number
|
|
171
|
+
switch (this.dbtype) {
|
|
172
|
+
case 'IndexedDB':
|
|
173
|
+
case 'MySQL':
|
|
174
|
+
r = vdate
|
|
175
|
+
break
|
|
176
|
+
case 'SQLite':
|
|
177
|
+
r = vdate.toISOString()
|
|
178
|
+
break
|
|
179
|
+
default:
|
|
180
|
+
throw new sdk.WERR_INTERNAL(`Invalid dateScheme ${this.dbtype}`)
|
|
181
|
+
}
|
|
182
|
+
return r
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface StorageReaderOptions {
|
|
187
|
+
chain: sdk.Chain
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type DBType = 'SQLite' | 'MySQL' | 'IndexedDB'
|
|
191
|
+
|
|
192
|
+
type DbEntityTimeStamp<T extends sdk.EntityTimeStamp> = {
|
|
193
|
+
[K in keyof T]: T[K] extends Date ? Date | string : T[K]
|
|
194
|
+
}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { TableCertificate } from './schema/tables/TableCertificate'
|
|
2
|
+
import { TableCertificateField } from './schema/tables/TableCertificateField'
|
|
3
|
+
import { TableCommission } from './schema/tables/TableCommission'
|
|
4
|
+
import { TableMonitorEvent } from './schema/tables/TableMonitorEvent'
|
|
5
|
+
import { TableOutput } from './schema/tables/TableOutput'
|
|
6
|
+
import { TableOutputBasket } from './schema/tables/TableOutputBasket'
|
|
7
|
+
import { TableOutputTag } from './schema/tables/TableOutputTag'
|
|
8
|
+
import { TableOutputTagMap } from './schema/tables/TableOutputTagMap'
|
|
9
|
+
import { TableProvenTx } from './schema/tables/TableProvenTx'
|
|
10
|
+
import { TableProvenTxReq } from './schema/tables/TableProvenTxReq'
|
|
11
|
+
import { TableSyncState } from './schema/tables/TableSyncState'
|
|
12
|
+
import { TableTransaction } from './schema/tables/TableTransaction'
|
|
13
|
+
import { TableTxLabel } from './schema/tables/TableTxLabel'
|
|
14
|
+
import { TableTxLabelMap } from './schema/tables/TableTxLabelMap'
|
|
15
|
+
import { TableUser } from './schema/tables/TableUser'
|
|
16
|
+
import { randomBytesBase64, verifyOneOrNone, verifyId, verifyOne } from '../utility/utilityHelpers'
|
|
17
|
+
import { StorageReader, StorageReaderOptions } from './StorageReader'
|
|
18
|
+
import {
|
|
19
|
+
AuthId,
|
|
20
|
+
FindOutputTagMapsArgs,
|
|
21
|
+
FindProvenTxReqsArgs,
|
|
22
|
+
FindProvenTxsArgs,
|
|
23
|
+
FindTxLabelMapsArgs,
|
|
24
|
+
ProcessSyncChunkResult,
|
|
25
|
+
RequestSyncChunkArgs,
|
|
26
|
+
SyncChunk,
|
|
27
|
+
TrxToken
|
|
28
|
+
} from '../sdk/WalletStorage.interfaces'
|
|
29
|
+
import { createSyncMap } from './schema/entities/EntityBase'
|
|
30
|
+
|
|
31
|
+
export abstract class StorageReaderWriter extends StorageReader {
|
|
32
|
+
constructor(options: StorageReaderWriterOptions) {
|
|
33
|
+
super(options)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
abstract dropAllData(): Promise<void>
|
|
37
|
+
abstract migrate(storageName: string, storageIdentityKey: string): Promise<string>
|
|
38
|
+
|
|
39
|
+
abstract findOutputTagMaps(args: FindOutputTagMapsArgs): Promise<TableOutputTagMap[]>
|
|
40
|
+
abstract findProvenTxReqs(args: FindProvenTxReqsArgs): Promise<TableProvenTxReq[]>
|
|
41
|
+
abstract findProvenTxs(args: FindProvenTxsArgs): Promise<TableProvenTx[]>
|
|
42
|
+
abstract findTxLabelMaps(args: FindTxLabelMapsArgs): Promise<TableTxLabelMap[]>
|
|
43
|
+
|
|
44
|
+
abstract countOutputTagMaps(args: FindOutputTagMapsArgs): Promise<number>
|
|
45
|
+
abstract countProvenTxReqs(args: FindProvenTxReqsArgs): Promise<number>
|
|
46
|
+
abstract countProvenTxs(args: FindProvenTxsArgs): Promise<number>
|
|
47
|
+
abstract countTxLabelMaps(args: FindTxLabelMapsArgs): Promise<number>
|
|
48
|
+
|
|
49
|
+
abstract insertCertificate(certificate: TableCertificate, trx?: TrxToken): Promise<number>
|
|
50
|
+
abstract insertCertificateField(certificateField: TableCertificateField, trx?: TrxToken): Promise<void>
|
|
51
|
+
abstract insertCommission(commission: TableCommission, trx?: TrxToken): Promise<number>
|
|
52
|
+
abstract insertMonitorEvent(event: TableMonitorEvent, trx?: TrxToken): Promise<number>
|
|
53
|
+
abstract insertOutput(output: TableOutput, trx?: TrxToken): Promise<number>
|
|
54
|
+
abstract insertOutputBasket(basket: TableOutputBasket, trx?: TrxToken): Promise<number>
|
|
55
|
+
abstract insertOutputTag(tag: TableOutputTag, trx?: TrxToken): Promise<number>
|
|
56
|
+
abstract insertOutputTagMap(tagMap: TableOutputTagMap, trx?: TrxToken): Promise<void>
|
|
57
|
+
abstract insertProvenTx(tx: TableProvenTx, trx?: TrxToken): Promise<number>
|
|
58
|
+
abstract insertProvenTxReq(tx: TableProvenTxReq, trx?: TrxToken): Promise<number>
|
|
59
|
+
abstract insertSyncState(syncState: TableSyncState, trx?: TrxToken): Promise<number>
|
|
60
|
+
abstract insertTransaction(tx: TableTransaction, trx?: TrxToken): Promise<number>
|
|
61
|
+
abstract insertTxLabel(label: TableTxLabel, trx?: TrxToken): Promise<number>
|
|
62
|
+
abstract insertTxLabelMap(labelMap: TableTxLabelMap, trx?: TrxToken): Promise<void>
|
|
63
|
+
abstract insertUser(user: TableUser, trx?: TrxToken): Promise<number>
|
|
64
|
+
|
|
65
|
+
abstract updateCertificate(id: number, update: Partial<TableCertificate>, trx?: TrxToken): Promise<number>
|
|
66
|
+
abstract updateCertificateField(
|
|
67
|
+
certificateId: number,
|
|
68
|
+
fieldName: string,
|
|
69
|
+
update: Partial<TableCertificateField>,
|
|
70
|
+
trx?: TrxToken
|
|
71
|
+
): Promise<number>
|
|
72
|
+
abstract updateCommission(id: number, update: Partial<TableCommission>, trx?: TrxToken): Promise<number>
|
|
73
|
+
abstract updateMonitorEvent(id: number, update: Partial<TableMonitorEvent>, trx?: TrxToken): Promise<number>
|
|
74
|
+
abstract updateOutput(id: number, update: Partial<TableOutput>, trx?: TrxToken): Promise<number>
|
|
75
|
+
abstract updateOutputBasket(id: number, update: Partial<TableOutputBasket>, trx?: TrxToken): Promise<number>
|
|
76
|
+
abstract updateOutputTag(id: number, update: Partial<TableOutputTag>, trx?: TrxToken): Promise<number>
|
|
77
|
+
abstract updateOutputTagMap(
|
|
78
|
+
outputId: number,
|
|
79
|
+
tagId: number,
|
|
80
|
+
update: Partial<TableOutputTagMap>,
|
|
81
|
+
trx?: TrxToken
|
|
82
|
+
): Promise<number>
|
|
83
|
+
abstract updateProvenTx(id: number, update: Partial<TableProvenTx>, trx?: TrxToken): Promise<number>
|
|
84
|
+
abstract updateProvenTxReq(id: number | number[], update: Partial<TableProvenTxReq>, trx?: TrxToken): Promise<number>
|
|
85
|
+
abstract updateSyncState(id: number, update: Partial<TableSyncState>, trx?: TrxToken): Promise<number>
|
|
86
|
+
abstract updateTransaction(id: number | number[], update: Partial<TableTransaction>, trx?: TrxToken): Promise<number>
|
|
87
|
+
abstract updateTxLabel(id: number, update: Partial<TableTxLabel>, trx?: TrxToken): Promise<number>
|
|
88
|
+
abstract updateTxLabelMap(
|
|
89
|
+
transactionId: number,
|
|
90
|
+
txLabelId: number,
|
|
91
|
+
update: Partial<TableTxLabelMap>,
|
|
92
|
+
trx?: TrxToken
|
|
93
|
+
): Promise<number>
|
|
94
|
+
abstract updateUser(id: number, update: Partial<TableUser>, trx?: TrxToken): Promise<number>
|
|
95
|
+
|
|
96
|
+
async setActive(auth: AuthId, newActiveStorageIdentityKey: string): Promise<number> {
|
|
97
|
+
return await this.updateUser(verifyId(auth.userId), {
|
|
98
|
+
activeStorage: newActiveStorageIdentityKey
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async findCertificateById(id: number, trx?: TrxToken): Promise<TableCertificate | undefined> {
|
|
103
|
+
return verifyOneOrNone(await this.findCertificates({ partial: { certificateId: id }, trx }))
|
|
104
|
+
}
|
|
105
|
+
async findCommissionById(id: number, trx?: TrxToken): Promise<TableCommission | undefined> {
|
|
106
|
+
return verifyOneOrNone(await this.findCommissions({ partial: { commissionId: id }, trx }))
|
|
107
|
+
}
|
|
108
|
+
async findOutputById(id: number, trx?: TrxToken, noScript?: boolean): Promise<TableOutput | undefined> {
|
|
109
|
+
return verifyOneOrNone(await this.findOutputs({ partial: { outputId: id }, noScript, trx }))
|
|
110
|
+
}
|
|
111
|
+
async findOutputBasketById(id: number, trx?: TrxToken): Promise<TableOutputBasket | undefined> {
|
|
112
|
+
return verifyOneOrNone(await this.findOutputBaskets({ partial: { basketId: id }, trx }))
|
|
113
|
+
}
|
|
114
|
+
async findProvenTxById(id: number, trx?: TrxToken | undefined): Promise<TableProvenTx | undefined> {
|
|
115
|
+
return verifyOneOrNone(await this.findProvenTxs({ partial: { provenTxId: id }, trx }))
|
|
116
|
+
}
|
|
117
|
+
async findProvenTxReqById(id: number, trx?: TrxToken | undefined): Promise<TableProvenTxReq | undefined> {
|
|
118
|
+
return verifyOneOrNone(await this.findProvenTxReqs({ partial: { provenTxReqId: id }, trx }))
|
|
119
|
+
}
|
|
120
|
+
async findSyncStateById(id: number, trx?: TrxToken): Promise<TableSyncState | undefined> {
|
|
121
|
+
return verifyOneOrNone(await this.findSyncStates({ partial: { syncStateId: id }, trx }))
|
|
122
|
+
}
|
|
123
|
+
async findTransactionById(id: number, trx?: TrxToken, noRawTx?: boolean): Promise<TableTransaction | undefined> {
|
|
124
|
+
return verifyOneOrNone(
|
|
125
|
+
await this.findTransactions({
|
|
126
|
+
partial: { transactionId: id },
|
|
127
|
+
noRawTx,
|
|
128
|
+
trx
|
|
129
|
+
})
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
async findTxLabelById(id: number, trx?: TrxToken): Promise<TableTxLabel | undefined> {
|
|
133
|
+
return verifyOneOrNone(await this.findTxLabels({ partial: { txLabelId: id }, trx }))
|
|
134
|
+
}
|
|
135
|
+
async findOutputTagById(id: number, trx?: TrxToken): Promise<TableOutputTag | undefined> {
|
|
136
|
+
return verifyOneOrNone(await this.findOutputTags({ partial: { outputTagId: id }, trx }))
|
|
137
|
+
}
|
|
138
|
+
async findUserById(id: number, trx?: TrxToken): Promise<TableUser | undefined> {
|
|
139
|
+
return verifyOneOrNone(await this.findUsers({ partial: { userId: id }, trx }))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async findOrInsertUser(identityKey: string, trx?: TrxToken): Promise<{ user: TableUser; isNew: boolean }> {
|
|
143
|
+
let user: TableUser | undefined
|
|
144
|
+
let isNew = false
|
|
145
|
+
for (let retry = 0; ; retry++) {
|
|
146
|
+
try {
|
|
147
|
+
user = verifyOneOrNone(await this.findUsers({ partial: { identityKey }, trx }))
|
|
148
|
+
//console.log(`findOrInsertUser oneOrNone: ${JSON.stringify(user || 'none').slice(0,512)}`)
|
|
149
|
+
if (user) break
|
|
150
|
+
const now = new Date()
|
|
151
|
+
user = {
|
|
152
|
+
created_at: now,
|
|
153
|
+
updated_at: new Date('1971-01-01'), // Default constructed user, sync will override with any updated user.
|
|
154
|
+
userId: 0,
|
|
155
|
+
identityKey,
|
|
156
|
+
activeStorage: this.getSettings().storageIdentityKey
|
|
157
|
+
}
|
|
158
|
+
user.userId = await this.insertUser(user, trx)
|
|
159
|
+
isNew = true
|
|
160
|
+
// Add default change basket for new user.
|
|
161
|
+
await this.insertOutputBasket({
|
|
162
|
+
created_at: now,
|
|
163
|
+
updated_at: new Date('1971-01-01'), // Default constructed basket, sync will override with any updated basket.
|
|
164
|
+
basketId: 0,
|
|
165
|
+
userId: user.userId,
|
|
166
|
+
name: 'default',
|
|
167
|
+
numberOfDesiredUTXOs: 144,
|
|
168
|
+
minimumDesiredUTXOValue: 32,
|
|
169
|
+
isDeleted: false
|
|
170
|
+
})
|
|
171
|
+
break
|
|
172
|
+
} catch (eu: unknown) {
|
|
173
|
+
console.log(`findOrInsertUser catch: ${JSON.stringify(eu).slice(0, 512)}`)
|
|
174
|
+
if (retry > 0) throw eu
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return { user, isNew }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async findOrInsertTransaction(
|
|
181
|
+
newTx: TableTransaction,
|
|
182
|
+
trx?: TrxToken
|
|
183
|
+
): Promise<{ tx: TableTransaction; isNew: boolean }> {
|
|
184
|
+
let tx: TableTransaction | undefined
|
|
185
|
+
let isNew = false
|
|
186
|
+
for (let retry = 0; ; retry++) {
|
|
187
|
+
try {
|
|
188
|
+
tx = verifyOneOrNone(
|
|
189
|
+
await this.findTransactions({
|
|
190
|
+
partial: { userId: newTx.userId, txid: newTx.txid },
|
|
191
|
+
trx
|
|
192
|
+
})
|
|
193
|
+
)
|
|
194
|
+
if (tx) break
|
|
195
|
+
newTx.transactionId = await this.insertTransaction(newTx, trx)
|
|
196
|
+
isNew = true
|
|
197
|
+
tx = newTx
|
|
198
|
+
break
|
|
199
|
+
} catch (eu: unknown) {
|
|
200
|
+
if (retry > 0) throw eu
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { tx, isNew }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async findOrInsertOutputBasket(userId: number, name: string, trx?: TrxToken): Promise<TableOutputBasket> {
|
|
207
|
+
const partial = { name, userId }
|
|
208
|
+
for (let retry = 0; ; retry++) {
|
|
209
|
+
try {
|
|
210
|
+
const now = new Date()
|
|
211
|
+
let basket = verifyOneOrNone(await this.findOutputBaskets({ partial, trx }))
|
|
212
|
+
if (!basket) {
|
|
213
|
+
basket = {
|
|
214
|
+
...partial,
|
|
215
|
+
minimumDesiredUTXOValue: 0,
|
|
216
|
+
numberOfDesiredUTXOs: 0,
|
|
217
|
+
basketId: 0,
|
|
218
|
+
created_at: now,
|
|
219
|
+
updated_at: now,
|
|
220
|
+
isDeleted: false
|
|
221
|
+
}
|
|
222
|
+
basket.basketId = await this.insertOutputBasket(basket, trx)
|
|
223
|
+
}
|
|
224
|
+
if (basket.isDeleted) {
|
|
225
|
+
await this.updateOutputBasket(verifyId(basket.basketId), {
|
|
226
|
+
isDeleted: false
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
return basket
|
|
230
|
+
} catch (eu: unknown) {
|
|
231
|
+
if (retry > 0) throw eu
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async findOrInsertTxLabel(userId: number, label: string, trx?: TrxToken): Promise<TableTxLabel> {
|
|
237
|
+
const partial = { label, userId }
|
|
238
|
+
for (let retry = 0; ; retry++) {
|
|
239
|
+
try {
|
|
240
|
+
const now = new Date()
|
|
241
|
+
let txLabel = verifyOneOrNone(await this.findTxLabels({ partial, trx }))
|
|
242
|
+
if (!txLabel) {
|
|
243
|
+
txLabel = {
|
|
244
|
+
...partial,
|
|
245
|
+
txLabelId: 0,
|
|
246
|
+
created_at: now,
|
|
247
|
+
updated_at: now,
|
|
248
|
+
isDeleted: false
|
|
249
|
+
}
|
|
250
|
+
txLabel.txLabelId = await this.insertTxLabel(txLabel, trx)
|
|
251
|
+
}
|
|
252
|
+
if (txLabel.isDeleted) {
|
|
253
|
+
await this.updateTxLabel(verifyId(txLabel.txLabelId), {
|
|
254
|
+
isDeleted: false
|
|
255
|
+
})
|
|
256
|
+
}
|
|
257
|
+
return txLabel
|
|
258
|
+
} catch (eu: unknown) {
|
|
259
|
+
if (retry > 0) throw eu
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
async findOrInsertTxLabelMap(transactionId: number, txLabelId: number, trx?: TrxToken): Promise<TableTxLabelMap> {
|
|
265
|
+
const partial = { transactionId, txLabelId }
|
|
266
|
+
for (let retry = 0; ; retry++) {
|
|
267
|
+
try {
|
|
268
|
+
const now = new Date()
|
|
269
|
+
let txLabelMap = verifyOneOrNone(await this.findTxLabelMaps({ partial, trx }))
|
|
270
|
+
if (!txLabelMap) {
|
|
271
|
+
txLabelMap = {
|
|
272
|
+
...partial,
|
|
273
|
+
created_at: now,
|
|
274
|
+
updated_at: now,
|
|
275
|
+
isDeleted: false
|
|
276
|
+
}
|
|
277
|
+
await this.insertTxLabelMap(txLabelMap, trx)
|
|
278
|
+
}
|
|
279
|
+
if (txLabelMap.isDeleted) {
|
|
280
|
+
await this.updateTxLabelMap(transactionId, txLabelId, {
|
|
281
|
+
isDeleted: false
|
|
282
|
+
})
|
|
283
|
+
}
|
|
284
|
+
return txLabelMap
|
|
285
|
+
} catch (eu: unknown) {
|
|
286
|
+
if (retry > 0) throw eu
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async findOrInsertOutputTag(userId: number, tag: string, trx?: TrxToken): Promise<TableOutputTag> {
|
|
292
|
+
const partial = { tag, userId }
|
|
293
|
+
for (let retry = 0; ; retry++) {
|
|
294
|
+
try {
|
|
295
|
+
const now = new Date()
|
|
296
|
+
let outputTag = verifyOneOrNone(await this.findOutputTags({ partial, trx }))
|
|
297
|
+
if (!outputTag) {
|
|
298
|
+
outputTag = {
|
|
299
|
+
...partial,
|
|
300
|
+
outputTagId: 0,
|
|
301
|
+
created_at: now,
|
|
302
|
+
updated_at: now,
|
|
303
|
+
isDeleted: false
|
|
304
|
+
}
|
|
305
|
+
outputTag.outputTagId = await this.insertOutputTag(outputTag, trx)
|
|
306
|
+
}
|
|
307
|
+
if (outputTag.isDeleted) {
|
|
308
|
+
await this.updateOutputTag(verifyId(outputTag.outputTagId), {
|
|
309
|
+
isDeleted: false
|
|
310
|
+
})
|
|
311
|
+
}
|
|
312
|
+
return outputTag
|
|
313
|
+
} catch (eu: unknown) {
|
|
314
|
+
if (retry > 0) throw eu
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async findOrInsertOutputTagMap(outputId: number, outputTagId: number, trx?: TrxToken): Promise<TableOutputTagMap> {
|
|
320
|
+
const partial = { outputId, outputTagId }
|
|
321
|
+
for (let retry = 0; ; retry++) {
|
|
322
|
+
try {
|
|
323
|
+
const now = new Date()
|
|
324
|
+
let outputTagMap = verifyOneOrNone(await this.findOutputTagMaps({ partial, trx }))
|
|
325
|
+
if (!outputTagMap) {
|
|
326
|
+
outputTagMap = {
|
|
327
|
+
...partial,
|
|
328
|
+
created_at: now,
|
|
329
|
+
updated_at: now,
|
|
330
|
+
isDeleted: false
|
|
331
|
+
}
|
|
332
|
+
await this.insertOutputTagMap(outputTagMap, trx)
|
|
333
|
+
}
|
|
334
|
+
if (outputTagMap.isDeleted) {
|
|
335
|
+
await this.updateOutputTagMap(outputId, outputTagId, {
|
|
336
|
+
isDeleted: false
|
|
337
|
+
})
|
|
338
|
+
}
|
|
339
|
+
return outputTagMap
|
|
340
|
+
} catch (eu: unknown) {
|
|
341
|
+
if (retry > 0) throw eu
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
async findOrInsertSyncStateAuth(
|
|
347
|
+
auth: AuthId,
|
|
348
|
+
storageIdentityKey: string,
|
|
349
|
+
storageName: string
|
|
350
|
+
): Promise<{ syncState: TableSyncState; isNew: boolean }> {
|
|
351
|
+
const partial = { userId: auth.userId!, storageIdentityKey, storageName }
|
|
352
|
+
for (let retry = 0; ; retry++) {
|
|
353
|
+
try {
|
|
354
|
+
const now = new Date()
|
|
355
|
+
let syncState = verifyOneOrNone(await this.findSyncStates({ partial }))
|
|
356
|
+
if (!syncState) {
|
|
357
|
+
syncState = {
|
|
358
|
+
...partial,
|
|
359
|
+
created_at: now,
|
|
360
|
+
updated_at: now,
|
|
361
|
+
syncStateId: 0,
|
|
362
|
+
status: 'unknown',
|
|
363
|
+
init: false,
|
|
364
|
+
refNum: randomBytesBase64(12),
|
|
365
|
+
syncMap: JSON.stringify(createSyncMap())
|
|
366
|
+
}
|
|
367
|
+
await this.insertSyncState(syncState)
|
|
368
|
+
return { syncState, isNew: true }
|
|
369
|
+
}
|
|
370
|
+
return { syncState, isNew: false }
|
|
371
|
+
} catch (eu: unknown) {
|
|
372
|
+
if (retry > 0) throw eu
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
async findOrInsertProvenTxReq(
|
|
378
|
+
newReq: TableProvenTxReq,
|
|
379
|
+
trx?: TrxToken
|
|
380
|
+
): Promise<{ req: TableProvenTxReq; isNew: boolean }> {
|
|
381
|
+
let req: TableProvenTxReq | undefined
|
|
382
|
+
let isNew = false
|
|
383
|
+
for (let retry = 0; ; retry++) {
|
|
384
|
+
try {
|
|
385
|
+
req = verifyOneOrNone(await this.findProvenTxReqs({ partial: { txid: newReq.txid }, trx }))
|
|
386
|
+
if (req) break
|
|
387
|
+
newReq.provenTxReqId = await this.insertProvenTxReq(newReq, trx)
|
|
388
|
+
isNew = true
|
|
389
|
+
req = newReq
|
|
390
|
+
break
|
|
391
|
+
} catch (eu: unknown) {
|
|
392
|
+
if (retry > 0) throw eu
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return { req, isNew }
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
async findOrInsertProvenTx(
|
|
399
|
+
newProven: TableProvenTx,
|
|
400
|
+
trx?: TrxToken
|
|
401
|
+
): Promise<{ proven: TableProvenTx; isNew: boolean }> {
|
|
402
|
+
let proven: TableProvenTx | undefined
|
|
403
|
+
let isNew = false
|
|
404
|
+
for (let retry = 0; ; retry++) {
|
|
405
|
+
try {
|
|
406
|
+
proven = verifyOneOrNone(await this.findProvenTxs({ partial: { txid: newProven.txid }, trx }))
|
|
407
|
+
if (proven) break
|
|
408
|
+
newProven.provenTxId = await this.insertProvenTx(newProven, trx)
|
|
409
|
+
isNew = true
|
|
410
|
+
proven = newProven
|
|
411
|
+
break
|
|
412
|
+
} catch (eu: unknown) {
|
|
413
|
+
if (retry > 0) throw eu
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return { proven, isNew }
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
abstract processSyncChunk(args: RequestSyncChunkArgs, chunk: SyncChunk): Promise<ProcessSyncChunkResult>
|
|
420
|
+
|
|
421
|
+
async tagOutput(partial: Partial<TableOutput>, tag: string, trx?: TrxToken): Promise<void> {
|
|
422
|
+
await this.transaction(async trx => {
|
|
423
|
+
const o = verifyOne(await this.findOutputs({ partial, noScript: true, trx }))
|
|
424
|
+
const outputTag = await this.findOrInsertOutputTag(o.userId, tag, trx)
|
|
425
|
+
await this.findOrInsertOutputTagMap(verifyId(o.outputId), verifyId(outputTag.outputTagId), trx)
|
|
426
|
+
}, trx)
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export interface StorageReaderWriterOptions extends StorageReaderOptions {
|
|
431
|
+
/** */
|
|
432
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as sdk from '../sdk/index'
|
|
2
|
+
import { TableSettings } from '../storage/schema/tables/TableSettings'
|
|
3
|
+
import { StorageReader } from './StorageReader'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The `StorageSyncReader` non-abstract class must be used when authentication checking access to the methods of a `StorageBaseReader` is required.
|
|
7
|
+
*
|
|
8
|
+
* Constructed from an `auth` object that must minimally include the authenticated user's identityKey,
|
|
9
|
+
* and the `StorageBaseReader` to be protected.
|
|
10
|
+
*/
|
|
11
|
+
export class StorageSyncReader implements sdk.WalletStorageSyncReader {
|
|
12
|
+
constructor(
|
|
13
|
+
public auth: sdk.AuthId,
|
|
14
|
+
public storage: StorageReader
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
async makeAvailable(): Promise<TableSettings> {
|
|
18
|
+
await this.storage.makeAvailable()
|
|
19
|
+
if (this.auth.userId === undefined) {
|
|
20
|
+
const user = await this.storage.findUserByIdentityKey(this.auth.identityKey)
|
|
21
|
+
if (!user) throw new sdk.WERR_UNAUTHORIZED()
|
|
22
|
+
this.auth.userId = user.userId
|
|
23
|
+
}
|
|
24
|
+
return this.storage.getSettings()
|
|
25
|
+
}
|
|
26
|
+
destroy(): Promise<void> {
|
|
27
|
+
return this.storage.destroy()
|
|
28
|
+
}
|
|
29
|
+
async getSyncChunk(args: sdk.RequestSyncChunkArgs): Promise<sdk.SyncChunk> {
|
|
30
|
+
if (!this.auth.userId) await this.makeAvailable()
|
|
31
|
+
if (args.identityKey !== this.auth.identityKey) throw new sdk.WERR_UNAUTHORIZED()
|
|
32
|
+
return await this.storage.getSyncChunk(args)
|
|
33
|
+
}
|
|
34
|
+
}
|