@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,371 @@
|
|
|
1
|
+
import { createSyncMap, sdk, SyncMap, TableCommission, TableTransaction } from '../../../../../src'
|
|
2
|
+
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
|
|
3
|
+
import { EntityCommission } from '../EntityCommission'
|
|
4
|
+
|
|
5
|
+
describe('Commission class method tests', () => {
|
|
6
|
+
jest.setTimeout(99999999)
|
|
7
|
+
|
|
8
|
+
const env = _tu.getEnv('test')
|
|
9
|
+
const ctxs: TestWalletNoSetup[] = []
|
|
10
|
+
const ctxs2: TestWalletNoSetup[] = []
|
|
11
|
+
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
if (env.runMySQL) {
|
|
14
|
+
ctxs.push(await _tu.createLegacyWalletMySQLCopy('CommissionTests'))
|
|
15
|
+
ctxs2.push(await _tu.createLegacyWalletMySQLCopy('CommissionTests2'))
|
|
16
|
+
}
|
|
17
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('CommissionTests'))
|
|
18
|
+
ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('CommissionTests2'))
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
afterAll(async () => {
|
|
22
|
+
for (const ctx of ctxs) {
|
|
23
|
+
await ctx.storage.destroy()
|
|
24
|
+
}
|
|
25
|
+
for (const ctx of ctxs2) {
|
|
26
|
+
await ctx.storage.destroy()
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
// Test: equals returns true for identical Commission entities
|
|
30
|
+
test('0_equals identifies matching Commission entities', async () => {
|
|
31
|
+
for (const { activeStorage } of ctxs) {
|
|
32
|
+
// Generate a unique transactionId
|
|
33
|
+
const transactionId = 192
|
|
34
|
+
|
|
35
|
+
// Insert the transaction to satisfy the foreign key constraint
|
|
36
|
+
const now = new Date()
|
|
37
|
+
const transactionData: TableTransaction = {
|
|
38
|
+
transactionId,
|
|
39
|
+
created_at: now,
|
|
40
|
+
updated_at: now,
|
|
41
|
+
userId: 1,
|
|
42
|
+
txid: 'unique-txid',
|
|
43
|
+
status: 'sending',
|
|
44
|
+
reference: 'test-transaction',
|
|
45
|
+
isOutgoing: false,
|
|
46
|
+
satoshis: 1000,
|
|
47
|
+
description: 'Test transaction'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
await activeStorage.insertTransaction(transactionData)
|
|
51
|
+
|
|
52
|
+
// Insert initial Commission record
|
|
53
|
+
const initialData: TableCommission = {
|
|
54
|
+
commissionId: 801,
|
|
55
|
+
created_at: now,
|
|
56
|
+
updated_at: now,
|
|
57
|
+
transactionId,
|
|
58
|
+
userId: 1,
|
|
59
|
+
isRedeemed: false,
|
|
60
|
+
keyOffset: 'offset123',
|
|
61
|
+
lockingScript: [1, 2, 3],
|
|
62
|
+
satoshis: 500
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
await activeStorage.insertCommission(initialData)
|
|
66
|
+
|
|
67
|
+
// Create two Commission entities from the same data
|
|
68
|
+
const entity1 = new EntityCommission(initialData)
|
|
69
|
+
const entity2 = new EntityCommission(initialData)
|
|
70
|
+
|
|
71
|
+
const syncMap = createSyncMap()
|
|
72
|
+
syncMap.transaction.idMap[transactionId] = transactionId
|
|
73
|
+
|
|
74
|
+
// Test: equals returns true for identical entities without SyncMap
|
|
75
|
+
expect(entity1.equals(entity2.toApi())).toBe(true)
|
|
76
|
+
|
|
77
|
+
// Test: equals returns true for identical entities with SyncMap
|
|
78
|
+
expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// Test: equals identifies non-matching Commission entities
|
|
83
|
+
test('1_equals identifies non-matching Commission entities', async () => {
|
|
84
|
+
for (const { activeStorage } of ctxs) {
|
|
85
|
+
// Generate unique transactionIds
|
|
86
|
+
const transactionId1 = 200
|
|
87
|
+
const transactionId2 = 201
|
|
88
|
+
|
|
89
|
+
// Insert the first transaction to satisfy the foreign key constraint
|
|
90
|
+
const now = new Date()
|
|
91
|
+
const transactionData1: TableTransaction = {
|
|
92
|
+
transactionId: transactionId1,
|
|
93
|
+
created_at: now,
|
|
94
|
+
updated_at: now,
|
|
95
|
+
userId: 1,
|
|
96
|
+
txid: 'unique-txid-1',
|
|
97
|
+
status: 'sending',
|
|
98
|
+
reference: 'test-transaction-1',
|
|
99
|
+
isOutgoing: false,
|
|
100
|
+
satoshis: 1000,
|
|
101
|
+
description: 'Test transaction 1'
|
|
102
|
+
}
|
|
103
|
+
await activeStorage.insertTransaction(transactionData1)
|
|
104
|
+
|
|
105
|
+
// Insert the second transaction to satisfy the foreign key constraint for mismatched data
|
|
106
|
+
const transactionData2: TableTransaction = {
|
|
107
|
+
transactionId: transactionId2,
|
|
108
|
+
created_at: now,
|
|
109
|
+
updated_at: now,
|
|
110
|
+
userId: 1,
|
|
111
|
+
txid: 'unique-txid-2',
|
|
112
|
+
status: 'sending',
|
|
113
|
+
reference: 'test-transaction-2',
|
|
114
|
+
isOutgoing: false,
|
|
115
|
+
satoshis: 2000,
|
|
116
|
+
description: 'Test transaction 2'
|
|
117
|
+
}
|
|
118
|
+
await activeStorage.insertTransaction(transactionData2)
|
|
119
|
+
|
|
120
|
+
// Insert initial Commission record
|
|
121
|
+
const initialData: TableCommission = {
|
|
122
|
+
commissionId: 802,
|
|
123
|
+
created_at: now,
|
|
124
|
+
updated_at: now,
|
|
125
|
+
transactionId: transactionId1,
|
|
126
|
+
userId: 1,
|
|
127
|
+
isRedeemed: false,
|
|
128
|
+
keyOffset: 'offset123',
|
|
129
|
+
lockingScript: [1, 2, 3],
|
|
130
|
+
satoshis: 500
|
|
131
|
+
}
|
|
132
|
+
await activeStorage.insertCommission(initialData)
|
|
133
|
+
|
|
134
|
+
// Create a Commission entity from the initial data
|
|
135
|
+
const entity1 = new EntityCommission(initialData)
|
|
136
|
+
|
|
137
|
+
// Create mismatched entities and test each condition
|
|
138
|
+
const mismatchedEntities: Partial<TableCommission>[] = [
|
|
139
|
+
{ isRedeemed: true },
|
|
140
|
+
{ transactionId: transactionId2 }, // Requires valid transaction
|
|
141
|
+
{ keyOffset: 'offset456' },
|
|
142
|
+
{ lockingScript: [4, 5, 6] },
|
|
143
|
+
{ satoshis: 1000 }
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
for (const mismatch of mismatchedEntities) {
|
|
147
|
+
const mismatchedEntity = new EntityCommission({
|
|
148
|
+
...initialData,
|
|
149
|
+
...mismatch
|
|
150
|
+
})
|
|
151
|
+
expect(entity1.equals(mismatchedEntity.toApi())).toBe(false)
|
|
152
|
+
|
|
153
|
+
const syncMap = createSyncMap()
|
|
154
|
+
syncMap.transaction.idMap[transactionId1] = transactionId1
|
|
155
|
+
syncMap.transaction.idMap[transactionId2] = transactionId2
|
|
156
|
+
|
|
157
|
+
expect(entity1.equals(mismatchedEntity.toApi(), syncMap)).toBe(false)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// Test: mergeExisting updates entity and database when ei.updated_at > this.updated_at
|
|
163
|
+
test('2_mergeExisting updates entity and database when ei.updated_at > this.updated_at', async () => {
|
|
164
|
+
for (const { activeStorage } of ctxs) {
|
|
165
|
+
// Generate unique transactionId
|
|
166
|
+
const transactionId = 203
|
|
167
|
+
|
|
168
|
+
// Insert a valid transaction to satisfy foreign key constraints
|
|
169
|
+
const now = new Date()
|
|
170
|
+
const transactionData: TableTransaction = {
|
|
171
|
+
transactionId,
|
|
172
|
+
created_at: now,
|
|
173
|
+
updated_at: now,
|
|
174
|
+
userId: 1,
|
|
175
|
+
txid: 'unique-txid',
|
|
176
|
+
status: 'sending',
|
|
177
|
+
reference: 'test-transaction-5',
|
|
178
|
+
isOutgoing: false,
|
|
179
|
+
satoshis: 1000,
|
|
180
|
+
description: 'Test transaction'
|
|
181
|
+
}
|
|
182
|
+
await activeStorage.insertTransaction(transactionData)
|
|
183
|
+
|
|
184
|
+
// Insert the initial Commission record
|
|
185
|
+
const initialData: TableCommission = {
|
|
186
|
+
commissionId: 803,
|
|
187
|
+
created_at: now,
|
|
188
|
+
updated_at: now,
|
|
189
|
+
transactionId,
|
|
190
|
+
userId: 1,
|
|
191
|
+
isRedeemed: false,
|
|
192
|
+
keyOffset: 'offset123',
|
|
193
|
+
lockingScript: [1, 2, 3],
|
|
194
|
+
satoshis: 500
|
|
195
|
+
}
|
|
196
|
+
await activeStorage.insertCommission(initialData)
|
|
197
|
+
|
|
198
|
+
// Create a Commission entity from the initial data
|
|
199
|
+
const entity = new EntityCommission(initialData)
|
|
200
|
+
|
|
201
|
+
// Simulate the `ei` argument with a later `updated_at`
|
|
202
|
+
const updatedData: TableCommission = {
|
|
203
|
+
...initialData,
|
|
204
|
+
updated_at: new Date(now.getTime() + 1000),
|
|
205
|
+
isRedeemed: true
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const syncMap = createSyncMap()
|
|
209
|
+
syncMap.transaction.idMap[transactionId] = transactionId
|
|
210
|
+
|
|
211
|
+
// Call mergeExisting
|
|
212
|
+
const wasMergedRaw = await entity.mergeExisting(
|
|
213
|
+
activeStorage,
|
|
214
|
+
undefined, // `since` is not used
|
|
215
|
+
updatedData,
|
|
216
|
+
syncMap,
|
|
217
|
+
undefined // `trx` is not used
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
const wasMerged = Boolean(wasMergedRaw)
|
|
221
|
+
|
|
222
|
+
// Verify that wasMerged is true
|
|
223
|
+
expect(wasMerged).toBe(true)
|
|
224
|
+
|
|
225
|
+
// Verify that the entity is updated
|
|
226
|
+
expect(entity.isRedeemed).toBe(true)
|
|
227
|
+
|
|
228
|
+
// Verify that the database is updated
|
|
229
|
+
const updatedRecord = await activeStorage.findCommissions({
|
|
230
|
+
partial: { commissionId: 803 }
|
|
231
|
+
})
|
|
232
|
+
expect(updatedRecord.length).toBe(1)
|
|
233
|
+
expect(updatedRecord[0]).toBeDefined()
|
|
234
|
+
expect(updatedRecord[0].isRedeemed).toBe(true)
|
|
235
|
+
}
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
// Test: mergeExisting does not update when ei.updated_at <= this.updated_at
|
|
239
|
+
test('3_mergeExisting does not update when ei.updated_at <= this.updated_at', async () => {
|
|
240
|
+
for (const { activeStorage } of ctxs) {
|
|
241
|
+
// Generate unique transactionId
|
|
242
|
+
const transactionId = 193
|
|
243
|
+
|
|
244
|
+
// Insert a valid transaction to satisfy foreign key constraints
|
|
245
|
+
const now = new Date()
|
|
246
|
+
const transactionData: TableTransaction = {
|
|
247
|
+
transactionId,
|
|
248
|
+
created_at: now,
|
|
249
|
+
updated_at: now,
|
|
250
|
+
userId: 1,
|
|
251
|
+
txid: 'unique-txid-193',
|
|
252
|
+
status: 'sending',
|
|
253
|
+
reference: 'test-transaction-6',
|
|
254
|
+
isOutgoing: false,
|
|
255
|
+
satoshis: 1000,
|
|
256
|
+
description: 'Test transaction'
|
|
257
|
+
}
|
|
258
|
+
await activeStorage.insertTransaction(transactionData)
|
|
259
|
+
|
|
260
|
+
// Insert the initial Commission record
|
|
261
|
+
const initialData: TableCommission = {
|
|
262
|
+
commissionId: 804,
|
|
263
|
+
created_at: now,
|
|
264
|
+
updated_at: now,
|
|
265
|
+
transactionId,
|
|
266
|
+
userId: 1,
|
|
267
|
+
isRedeemed: false,
|
|
268
|
+
keyOffset: 'offset123',
|
|
269
|
+
lockingScript: [1, 2, 3],
|
|
270
|
+
satoshis: 500
|
|
271
|
+
}
|
|
272
|
+
await activeStorage.insertCommission(initialData)
|
|
273
|
+
|
|
274
|
+
// Create a Commission entity from the initial data
|
|
275
|
+
const entity = new EntityCommission(initialData)
|
|
276
|
+
|
|
277
|
+
// Simulate the `ei` argument with an earlier or equal `updated_at`
|
|
278
|
+
const olderOrEqualData: TableCommission = {
|
|
279
|
+
...initialData,
|
|
280
|
+
updated_at: new Date(now.getTime()),
|
|
281
|
+
isRedeemed: true
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const syncMap = createSyncMap()
|
|
285
|
+
syncMap.transaction.idMap[transactionId] = transactionId
|
|
286
|
+
|
|
287
|
+
// Call mergeExisting
|
|
288
|
+
const wasMergedRaw = await entity.mergeExisting(
|
|
289
|
+
activeStorage,
|
|
290
|
+
undefined,
|
|
291
|
+
olderOrEqualData,
|
|
292
|
+
syncMap,
|
|
293
|
+
undefined // `trx` is not used
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
const wasMerged = Boolean(wasMergedRaw)
|
|
297
|
+
|
|
298
|
+
// Verify that wasMerged is false
|
|
299
|
+
expect(wasMerged).toBe(false)
|
|
300
|
+
|
|
301
|
+
// Verify that the entity is not updated
|
|
302
|
+
expect(entity.isRedeemed).toBe(false)
|
|
303
|
+
|
|
304
|
+
// Verify that the database is not updated
|
|
305
|
+
const record = await activeStorage.findCommissions({
|
|
306
|
+
partial: { commissionId: 802 }
|
|
307
|
+
})
|
|
308
|
+
expect(record.length).toBe(1)
|
|
309
|
+
expect(record[0]).toBeDefined()
|
|
310
|
+
expect(record[0].isRedeemed).toBe(false)
|
|
311
|
+
}
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
// Test: Commission entity getters and setters
|
|
315
|
+
test('4_Commission entity getters and setters', async () => {
|
|
316
|
+
const now = new Date()
|
|
317
|
+
|
|
318
|
+
// Initial test data
|
|
319
|
+
const initialData: TableCommission = {
|
|
320
|
+
commissionId: 801,
|
|
321
|
+
created_at: now,
|
|
322
|
+
updated_at: now,
|
|
323
|
+
transactionId: 101,
|
|
324
|
+
userId: 1,
|
|
325
|
+
isRedeemed: false,
|
|
326
|
+
keyOffset: 'offset123',
|
|
327
|
+
lockingScript: [1, 2, 3],
|
|
328
|
+
satoshis: 500
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Create the Commission entity
|
|
332
|
+
const entity = new EntityCommission(initialData)
|
|
333
|
+
|
|
334
|
+
// Validate getters
|
|
335
|
+
expect(entity.commissionId).toBe(initialData.commissionId)
|
|
336
|
+
expect(entity.created_at).toEqual(initialData.created_at)
|
|
337
|
+
expect(entity.updated_at).toEqual(initialData.updated_at)
|
|
338
|
+
expect(entity.transactionId).toBe(initialData.transactionId)
|
|
339
|
+
expect(entity.userId).toBe(initialData.userId)
|
|
340
|
+
expect(entity.isRedeemed).toBe(initialData.isRedeemed)
|
|
341
|
+
expect(entity.keyOffset).toBe(initialData.keyOffset)
|
|
342
|
+
expect(entity.lockingScript).toEqual(initialData.lockingScript)
|
|
343
|
+
expect(entity.satoshis).toBe(initialData.satoshis)
|
|
344
|
+
expect(entity.id).toBe(initialData.commissionId)
|
|
345
|
+
expect(entity.entityName).toBe('commission')
|
|
346
|
+
expect(entity.entityTable).toBe('commissions')
|
|
347
|
+
|
|
348
|
+
// Validate setters
|
|
349
|
+
entity.commissionId = 900
|
|
350
|
+
entity.created_at = new Date('2024-01-01')
|
|
351
|
+
entity.updated_at = new Date('2024-01-02')
|
|
352
|
+
entity.transactionId = 202
|
|
353
|
+
entity.userId = 2
|
|
354
|
+
entity.isRedeemed = true
|
|
355
|
+
entity.keyOffset = 'offset456'
|
|
356
|
+
entity.lockingScript = [4, 5, 6]
|
|
357
|
+
entity.satoshis = 1000
|
|
358
|
+
entity.id = 900
|
|
359
|
+
|
|
360
|
+
expect(entity.commissionId).toBe(900)
|
|
361
|
+
expect(entity.created_at).toEqual(new Date('2024-01-01'))
|
|
362
|
+
expect(entity.updated_at).toEqual(new Date('2024-01-02'))
|
|
363
|
+
expect(entity.transactionId).toBe(202)
|
|
364
|
+
expect(entity.userId).toBe(2)
|
|
365
|
+
expect(entity.isRedeemed).toBe(true)
|
|
366
|
+
expect(entity.keyOffset).toBe('offset456')
|
|
367
|
+
expect(entity.lockingScript).toEqual([4, 5, 6])
|
|
368
|
+
expect(entity.satoshis).toBe(1000)
|
|
369
|
+
expect(entity.id).toBe(900)
|
|
370
|
+
})
|
|
371
|
+
})
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { createSyncMap, sdk, SyncMap, TableOutputBasket } from '../../../../../src'
|
|
2
|
+
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
|
|
3
|
+
import { EntityOutputBasket } from '../EntityOutputBasket'
|
|
4
|
+
|
|
5
|
+
describe('OutputBasket class method tests', () => {
|
|
6
|
+
jest.setTimeout(99999999)
|
|
7
|
+
|
|
8
|
+
const env = _tu.getEnv('test')
|
|
9
|
+
const ctxs: TestWalletNoSetup[] = []
|
|
10
|
+
const ctxs2: TestWalletNoSetup[] = []
|
|
11
|
+
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
if (env.runMySQL) {
|
|
14
|
+
ctxs.push(await _tu.createLegacyWalletMySQLCopy('OutputBasketTests'))
|
|
15
|
+
ctxs2.push(await _tu.createLegacyWalletMySQLCopy('OutputBasketTests2'))
|
|
16
|
+
}
|
|
17
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('OutputBasketTests'))
|
|
18
|
+
ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('OutputBasketTests2'))
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
afterAll(async () => {
|
|
22
|
+
for (const ctx of ctxs) {
|
|
23
|
+
await ctx.storage.destroy()
|
|
24
|
+
}
|
|
25
|
+
for (const ctx of ctxs2) {
|
|
26
|
+
await ctx.storage.destroy()
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('1_mergeExisting merges and updates entity when ei.updated_at > this.updated_at', async () => {
|
|
31
|
+
const ctx = ctxs[0]
|
|
32
|
+
|
|
33
|
+
// Insert initial OutputBasket record with valid data
|
|
34
|
+
const initialData: TableOutputBasket = {
|
|
35
|
+
basketId: 100,
|
|
36
|
+
created_at: new Date('2023-01-01'),
|
|
37
|
+
updated_at: new Date('2023-01-02'),
|
|
38
|
+
userId: 1,
|
|
39
|
+
name: 'Basket1',
|
|
40
|
+
numberOfDesiredUTXOs: 10,
|
|
41
|
+
minimumDesiredUTXOValue: 5000,
|
|
42
|
+
isDeleted: false
|
|
43
|
+
}
|
|
44
|
+
await ctx.activeStorage.insertOutputBasket(initialData)
|
|
45
|
+
|
|
46
|
+
// Create an OutputBasket entity from the initial data
|
|
47
|
+
const entity = new EntityOutputBasket(initialData)
|
|
48
|
+
|
|
49
|
+
// Simulate the `ei` argument with a later `updated_at`
|
|
50
|
+
const updatedData: TableOutputBasket = {
|
|
51
|
+
...initialData,
|
|
52
|
+
updated_at: new Date('2023-01-03'), // Later timestamp
|
|
53
|
+
numberOfDesiredUTXOs: 20, // Update this field
|
|
54
|
+
minimumDesiredUTXOValue: 10000, // Update this field
|
|
55
|
+
isDeleted: true // Simulate a change in `isDeleted`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const syncMap = createSyncMap()
|
|
59
|
+
syncMap.outputBasket.idMap[100] = 100
|
|
60
|
+
|
|
61
|
+
// Call mergeExisting
|
|
62
|
+
const wasMergedRaw = await entity.mergeExisting(
|
|
63
|
+
ctx.activeStorage,
|
|
64
|
+
undefined, // `since` is not used in this method
|
|
65
|
+
updatedData,
|
|
66
|
+
syncMap,
|
|
67
|
+
undefined // `trx` is not used
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
const wasMerged = Boolean(wasMergedRaw)
|
|
71
|
+
|
|
72
|
+
// Verify that wasMerged is true
|
|
73
|
+
expect(wasMerged).toBe(true)
|
|
74
|
+
|
|
75
|
+
// Verify that the entity is updated
|
|
76
|
+
expect(entity.numberOfDesiredUTXOs).toBe(20)
|
|
77
|
+
expect(entity.minimumDesiredUTXOValue).toBe(10000)
|
|
78
|
+
expect(entity.isDeleted).toBe(1)
|
|
79
|
+
|
|
80
|
+
// Verify that the database is updated
|
|
81
|
+
const updatedRecord = await ctx.activeStorage.findOutputBaskets({
|
|
82
|
+
partial: { basketId: 100 }
|
|
83
|
+
})
|
|
84
|
+
expect(updatedRecord.length).toBe(1)
|
|
85
|
+
expect(updatedRecord[0]).toBeDefined() // Ensure record exists
|
|
86
|
+
expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(20)
|
|
87
|
+
expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(10000)
|
|
88
|
+
expect(updatedRecord[0].isDeleted).toBe(true)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('2_mergeExisting does not merge when ei.updated_at <= this.updated_at', async () => {
|
|
92
|
+
const ctx = ctxs[0]
|
|
93
|
+
|
|
94
|
+
// Insert initial OutputBasket record with valid data
|
|
95
|
+
const initialData: TableOutputBasket = {
|
|
96
|
+
basketId: 200,
|
|
97
|
+
created_at: new Date('2023-01-01'),
|
|
98
|
+
updated_at: new Date('2023-01-02'),
|
|
99
|
+
userId: 1,
|
|
100
|
+
name: 'Basket2',
|
|
101
|
+
numberOfDesiredUTXOs: 10,
|
|
102
|
+
minimumDesiredUTXOValue: 5000,
|
|
103
|
+
isDeleted: false
|
|
104
|
+
}
|
|
105
|
+
await ctx.activeStorage.insertOutputBasket(initialData)
|
|
106
|
+
|
|
107
|
+
// Create an OutputBasket entity from the initial data
|
|
108
|
+
const entity = new EntityOutputBasket(initialData)
|
|
109
|
+
|
|
110
|
+
// Simulate the `ei` argument with an earlier `updated_at`
|
|
111
|
+
const earlierData: TableOutputBasket = {
|
|
112
|
+
...initialData,
|
|
113
|
+
updated_at: new Date('2023-01-01'), // Earlier timestamp
|
|
114
|
+
numberOfDesiredUTXOs: 20, // Simulate a change
|
|
115
|
+
minimumDesiredUTXOValue: 10000, // Simulate a change
|
|
116
|
+
isDeleted: true // Simulate a change
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const syncMap = createSyncMap()
|
|
120
|
+
syncMap.outputBasket.idMap[200] = 200
|
|
121
|
+
|
|
122
|
+
// Call mergeExisting
|
|
123
|
+
const wasMergedRaw = await entity.mergeExisting(
|
|
124
|
+
ctx.activeStorage,
|
|
125
|
+
undefined, // `since` is not used in this method
|
|
126
|
+
earlierData,
|
|
127
|
+
syncMap,
|
|
128
|
+
undefined // `trx` is not used
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const wasMerged = Boolean(wasMergedRaw)
|
|
132
|
+
|
|
133
|
+
// Verify that wasMerged is false
|
|
134
|
+
expect(wasMerged).toBe(false)
|
|
135
|
+
|
|
136
|
+
// Verify that the entity is not updated
|
|
137
|
+
expect(entity.numberOfDesiredUTXOs).toBe(10)
|
|
138
|
+
expect(entity.minimumDesiredUTXOValue).toBe(5000)
|
|
139
|
+
expect(entity.isDeleted).toBe(0)
|
|
140
|
+
|
|
141
|
+
// Verify that the database is not updated
|
|
142
|
+
const updatedRecord = await ctx.activeStorage.findOutputBaskets({
|
|
143
|
+
partial: { basketId: 200 }
|
|
144
|
+
})
|
|
145
|
+
expect(updatedRecord.length).toBe(1)
|
|
146
|
+
expect(updatedRecord[0]).toBeDefined() // Ensure record exists
|
|
147
|
+
expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(10)
|
|
148
|
+
expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(5000)
|
|
149
|
+
expect(updatedRecord[0].isDeleted).toBe(false)
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test('equals identifies matching entities with and without SyncMap', async () => {
|
|
153
|
+
const ctx = ctxs[0]
|
|
154
|
+
|
|
155
|
+
// Insert two identical OutputBasket records in the database
|
|
156
|
+
const basketData: TableOutputBasket = {
|
|
157
|
+
basketId: 401,
|
|
158
|
+
created_at: new Date('2023-01-01'),
|
|
159
|
+
updated_at: new Date('2023-01-02'),
|
|
160
|
+
userId: 1,
|
|
161
|
+
name: 'Test Basket',
|
|
162
|
+
numberOfDesiredUTXOs: 10,
|
|
163
|
+
minimumDesiredUTXOValue: 1000,
|
|
164
|
+
isDeleted: false
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
await ctx.activeStorage.insertOutputBasket(basketData)
|
|
168
|
+
|
|
169
|
+
// Create two identical entities
|
|
170
|
+
const entity1 = new EntityOutputBasket(basketData)
|
|
171
|
+
const entity2 = new EntityOutputBasket(basketData)
|
|
172
|
+
|
|
173
|
+
// Test: equals returns true for identical entities without SyncMap
|
|
174
|
+
expect(entity1.equals(entity2.toApi())).toBe(true)
|
|
175
|
+
|
|
176
|
+
const syncMap = createSyncMap()
|
|
177
|
+
syncMap.outputBasket.idMap[401] = 401
|
|
178
|
+
|
|
179
|
+
// Test: equals returns true for identical entities with SyncMap
|
|
180
|
+
expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
test('equals identifies non-matching entities', async () => {
|
|
184
|
+
const ctx = ctxs[0]
|
|
185
|
+
|
|
186
|
+
// Insert two different OutputBasket records in the database
|
|
187
|
+
const basketData1: TableOutputBasket = {
|
|
188
|
+
basketId: 402,
|
|
189
|
+
created_at: new Date('2023-01-01'),
|
|
190
|
+
updated_at: new Date('2023-01-02'),
|
|
191
|
+
userId: 1,
|
|
192
|
+
name: 'Test Basket 1',
|
|
193
|
+
numberOfDesiredUTXOs: 10,
|
|
194
|
+
minimumDesiredUTXOValue: 1000,
|
|
195
|
+
isDeleted: false
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const basketData2: TableOutputBasket = {
|
|
199
|
+
basketId: 403,
|
|
200
|
+
created_at: new Date('2023-01-01'),
|
|
201
|
+
updated_at: new Date('2023-01-02'),
|
|
202
|
+
userId: 1,
|
|
203
|
+
name: 'Test Basket 2',
|
|
204
|
+
numberOfDesiredUTXOs: 5,
|
|
205
|
+
minimumDesiredUTXOValue: 500,
|
|
206
|
+
isDeleted: true
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
await ctx.activeStorage.insertOutputBasket(basketData1)
|
|
210
|
+
await ctx.activeStorage.insertOutputBasket(basketData2)
|
|
211
|
+
|
|
212
|
+
// Create entities
|
|
213
|
+
const entity1 = new EntityOutputBasket(basketData1)
|
|
214
|
+
const entity2 = new EntityOutputBasket(basketData2)
|
|
215
|
+
|
|
216
|
+
// Test: equals returns false for different entities without SyncMap
|
|
217
|
+
expect(entity1.equals(entity2.toApi())).toBe(false)
|
|
218
|
+
|
|
219
|
+
const syncMap = createSyncMap()
|
|
220
|
+
syncMap.outputBasket.idMap[1] = 2
|
|
221
|
+
|
|
222
|
+
// Test: equals returns false for different entities with SyncMap
|
|
223
|
+
expect(entity1.equals(entity2.toApi(), syncMap)).toBe(false)
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
test('OutputBasket getters, setters, and updateApi', () => {
|
|
227
|
+
// Create a mock OutputBasket instance
|
|
228
|
+
const initialData: TableOutputBasket = {
|
|
229
|
+
basketId: 123,
|
|
230
|
+
created_at: new Date('2023-01-01'),
|
|
231
|
+
updated_at: new Date('2023-01-02'),
|
|
232
|
+
userId: 1,
|
|
233
|
+
name: 'Test Basket',
|
|
234
|
+
numberOfDesiredUTXOs: 10,
|
|
235
|
+
minimumDesiredUTXOValue: 1000,
|
|
236
|
+
isDeleted: false
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const entity = new EntityOutputBasket(initialData)
|
|
240
|
+
|
|
241
|
+
// Test getters
|
|
242
|
+
expect(entity.basketId).toBe(123)
|
|
243
|
+
expect(entity.created_at.getTime()).toBe(new Date('2023-01-01').getTime())
|
|
244
|
+
expect(entity.updated_at.getTime()).toBe(new Date('2023-01-02').getTime())
|
|
245
|
+
expect(entity.userId).toBe(1)
|
|
246
|
+
expect(entity.name).toBe('Test Basket')
|
|
247
|
+
expect(entity.numberOfDesiredUTXOs).toBe(10)
|
|
248
|
+
expect(entity.minimumDesiredUTXOValue).toBe(1000)
|
|
249
|
+
expect(entity.isDeleted).toBe(false)
|
|
250
|
+
expect(entity.id).toBe(123)
|
|
251
|
+
expect(entity.entityName).toBe('outputBasket')
|
|
252
|
+
expect(entity.entityTable).toBe('output_baskets')
|
|
253
|
+
|
|
254
|
+
// Test setters
|
|
255
|
+
entity.basketId = 456
|
|
256
|
+
entity.created_at = new Date('2023-02-01')
|
|
257
|
+
entity.updated_at = new Date('2023-02-02')
|
|
258
|
+
entity.userId = 2
|
|
259
|
+
entity.name = 'Updated Basket'
|
|
260
|
+
entity.numberOfDesiredUTXOs = 20
|
|
261
|
+
entity.minimumDesiredUTXOValue = 2000
|
|
262
|
+
entity.isDeleted = true
|
|
263
|
+
entity.id = 456
|
|
264
|
+
|
|
265
|
+
expect(entity.basketId).toBe(456)
|
|
266
|
+
expect(entity.created_at.getTime()).toBe(new Date('2023-02-01').getTime())
|
|
267
|
+
expect(entity.updated_at.getTime()).toBe(new Date('2023-02-02').getTime())
|
|
268
|
+
expect(entity.userId).toBe(2)
|
|
269
|
+
expect(entity.name).toBe('Updated Basket')
|
|
270
|
+
expect(entity.numberOfDesiredUTXOs).toBe(20)
|
|
271
|
+
expect(entity.minimumDesiredUTXOValue).toBe(2000)
|
|
272
|
+
expect(entity.isDeleted).toBe(true)
|
|
273
|
+
expect(entity.id).toBe(456)
|
|
274
|
+
|
|
275
|
+
// Test updateApi (even though it does nothing)
|
|
276
|
+
expect(() => entity.updateApi()).not.toThrow()
|
|
277
|
+
})
|
|
278
|
+
})
|