@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,412 @@
|
|
|
1
|
+
import { mockUnderlyingWallet, MockedBSV_SDK, MockTransaction } from './WalletPermissionsManager.fixtures'
|
|
2
|
+
import { WalletPermissionsManager } from '../WalletPermissionsManager'
|
|
3
|
+
import { jest } from '@jest/globals'
|
|
4
|
+
import { Utils } from '@bsv/sdk'
|
|
5
|
+
|
|
6
|
+
jest.mock('@bsv/sdk', () => MockedBSV_SDK)
|
|
7
|
+
|
|
8
|
+
describe('WalletPermissionsManager - Metadata Encryption & Decryption', () => {
|
|
9
|
+
let underlying: ReturnType<typeof mockUnderlyingWallet>
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
// Create a fresh underlying mock wallet before each test
|
|
13
|
+
underlying = mockUnderlyingWallet()
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
jest.clearAllMocks()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
describe('Unit Tests for metadata encryption helpers', () => {
|
|
21
|
+
it('should call underlying.encrypt() with the correct protocol and key when encryptWalletMetadata=true', async () => {
|
|
22
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
23
|
+
encryptWalletMetadata: true
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const plaintext = 'Hello, world!'
|
|
27
|
+
await manager['maybeEncryptMetadata'](plaintext)
|
|
28
|
+
|
|
29
|
+
// We expect underlying.encrypt() to have been called exactly once
|
|
30
|
+
expect(underlying.encrypt).toHaveBeenCalledTimes(1)
|
|
31
|
+
|
|
32
|
+
// Check that the call was with the correct protocol ID and key
|
|
33
|
+
expect(underlying.encrypt).toHaveBeenCalledWith(
|
|
34
|
+
{
|
|
35
|
+
plaintext: expect.any(Array), // byte array version of 'Hello, world!'
|
|
36
|
+
protocolID: [2, 'admin metadata encryption'],
|
|
37
|
+
keyID: '1'
|
|
38
|
+
},
|
|
39
|
+
'admin.domain.com'
|
|
40
|
+
)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('should NOT call underlying.encrypt() if encryptWalletMetadata=false', async () => {
|
|
44
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
45
|
+
encryptWalletMetadata: false
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const plaintext = 'No encryption needed!'
|
|
49
|
+
const result = await manager['maybeEncryptMetadata'](plaintext)
|
|
50
|
+
|
|
51
|
+
expect(result).toBe(plaintext)
|
|
52
|
+
expect(underlying.encrypt).not.toHaveBeenCalled()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should call underlying.decrypt() with correct protocol and key, returning plaintext on success', async () => {
|
|
56
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
57
|
+
encryptWalletMetadata: true
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// Underlying decrypt mock returns { plaintext: [42, 42] } by default
|
|
61
|
+
// which would become "**" if using our ASCII interpretation
|
|
62
|
+
;(underlying.decrypt as any).mockResolvedValueOnce({
|
|
63
|
+
plaintext: [72, 105] // 'Hi'
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const ciphertext = Utils.toBase64(Utils.toArray('random-string-representing-ciphertext'))
|
|
67
|
+
const result = await manager['maybeDecryptMetadata'](ciphertext)
|
|
68
|
+
|
|
69
|
+
// We expect underlying.decrypt() to have been called
|
|
70
|
+
expect(underlying.decrypt).toHaveBeenCalledTimes(1)
|
|
71
|
+
expect(underlying.decrypt).toHaveBeenCalledWith(
|
|
72
|
+
{
|
|
73
|
+
ciphertext: expect.any(Array), // byte array version of ciphertext
|
|
74
|
+
protocolID: [2, 'admin metadata encryption'],
|
|
75
|
+
keyID: '1'
|
|
76
|
+
},
|
|
77
|
+
'admin.domain.com'
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
// The manager returns the decrypted UTF-8 string
|
|
81
|
+
expect(result).toBe('Hi')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('should fallback to original string if underlying.decrypt() fails', async () => {
|
|
85
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
86
|
+
encryptWalletMetadata: true
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Make underlying.decrypt() throw an error to simulate failure
|
|
90
|
+
;(underlying.decrypt as any).mockImplementationOnce(() => {
|
|
91
|
+
throw new Error('Decryption error')
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
const ciphertext = 'this-was-not-valid-for-decryption'
|
|
95
|
+
const result = await manager['maybeDecryptMetadata'](ciphertext)
|
|
96
|
+
|
|
97
|
+
// The manager should return the original ciphertext if decryption throws
|
|
98
|
+
expect(result).toBe(ciphertext)
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
describe('Integration Tests for createAction + listActions (round-trip encryption)', () => {
|
|
103
|
+
it('should encrypt metadata fields in createAction when encryptWalletMetadata=true, then decrypt them in listActions', async () => {
|
|
104
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
105
|
+
encryptWalletMetadata: true
|
|
106
|
+
})
|
|
107
|
+
manager.bindCallback('onSpendingAuthorizationRequested', x => {
|
|
108
|
+
manager.grantPermission({ requestID: x.requestID, ephemeral: true })
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
// We prepare an action with multiple metadata fields
|
|
112
|
+
const actionDescription = 'User Action #1: Doing something important'
|
|
113
|
+
const inputDesc = 'Some input desc'
|
|
114
|
+
const outputDesc = 'Some output desc'
|
|
115
|
+
const customInstr = 'Some custom instructions'
|
|
116
|
+
|
|
117
|
+
// Our createAction call
|
|
118
|
+
await manager.createAction(
|
|
119
|
+
{
|
|
120
|
+
description: actionDescription,
|
|
121
|
+
inputs: [
|
|
122
|
+
{
|
|
123
|
+
outpoint: '0231.0',
|
|
124
|
+
unlockingScriptLength: 73,
|
|
125
|
+
inputDescription: inputDesc
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
outputs: [
|
|
129
|
+
{
|
|
130
|
+
lockingScript: '561234',
|
|
131
|
+
satoshis: 500,
|
|
132
|
+
outputDescription: outputDesc,
|
|
133
|
+
customInstructions: customInstr
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
'nonadmin.com'
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
// 1) Confirm underlying.encrypt() was called for each field that is non-empty:
|
|
141
|
+
// - description
|
|
142
|
+
// - inputDescription
|
|
143
|
+
// - outputDescription
|
|
144
|
+
// - customInstructions
|
|
145
|
+
// (We can't be certain how many times exactly, but we can check that it was at least 4.)
|
|
146
|
+
expect(underlying.encrypt).toHaveBeenCalledTimes(4)
|
|
147
|
+
|
|
148
|
+
// 2) Now we simulate listing actions. We'll have the manager call underlying.listActions.
|
|
149
|
+
// Our mock underlying wallet returns an empty array by default, so let's override it
|
|
150
|
+
// to return the "encrypted" data that the manager gave it.
|
|
151
|
+
// But the manager doesn't store that data in the underlying wallet mock automatically.
|
|
152
|
+
// We'll just pretend that the wallet returns some data, and ensure the manager tries to decrypt it.
|
|
153
|
+
;(underlying.listActions as any).mockResolvedValueOnce({
|
|
154
|
+
totalActions: 1,
|
|
155
|
+
actions: [
|
|
156
|
+
{
|
|
157
|
+
description: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-description')),
|
|
158
|
+
inputs: [
|
|
159
|
+
{
|
|
160
|
+
outpoint: 'txid1.0',
|
|
161
|
+
inputDescription: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-inputDesc'))
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
outputs: [
|
|
165
|
+
{
|
|
166
|
+
lockingScript: 'OP_RETURN 1234',
|
|
167
|
+
satoshis: 500,
|
|
168
|
+
outputDescription: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-outputDesc')),
|
|
169
|
+
customInstructions: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-customInstr'))
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
// Also mock decrypt calls to simulate a correct round-trip
|
|
177
|
+
const decryptMock = underlying.decrypt as any
|
|
178
|
+
decryptMock.mockResolvedValueOnce({
|
|
179
|
+
plaintext: Array.from(actionDescription).map(c => c.charCodeAt(0))
|
|
180
|
+
})
|
|
181
|
+
decryptMock.mockResolvedValueOnce({
|
|
182
|
+
plaintext: Array.from(inputDesc).map(c => c.charCodeAt(0))
|
|
183
|
+
})
|
|
184
|
+
decryptMock.mockResolvedValueOnce({
|
|
185
|
+
plaintext: Array.from(outputDesc).map(c => c.charCodeAt(0))
|
|
186
|
+
})
|
|
187
|
+
decryptMock.mockResolvedValueOnce({
|
|
188
|
+
plaintext: Array.from(customInstr).map(c => c.charCodeAt(0))
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
const result = await (manager as any).listActions({}, 'nonadmin.com')
|
|
192
|
+
|
|
193
|
+
// We should get exactly 1 action
|
|
194
|
+
expect(result.actions.length).toBe(1)
|
|
195
|
+
const action = result.actions[0]
|
|
196
|
+
|
|
197
|
+
// The manager is expected to have decrypted each field
|
|
198
|
+
expect(action.description).toBe(actionDescription)
|
|
199
|
+
expect(action.inputs[0].inputDescription).toBe(inputDesc)
|
|
200
|
+
expect(action.outputs[0].outputDescription).toBe(outputDesc)
|
|
201
|
+
expect(action.outputs[0].customInstructions).toBe(customInstr)
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('should not encrypt metadata if encryptWalletMetadata=false, storing and retrieving plaintext', async () => {
|
|
205
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
206
|
+
encryptWalletMetadata: false
|
|
207
|
+
})
|
|
208
|
+
manager.bindCallback('onSpendingAuthorizationRequested', x => {
|
|
209
|
+
manager.grantPermission({ requestID: x.requestID, ephemeral: true })
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
const actionDescription = 'Plaintext action description'
|
|
213
|
+
const inputDesc = 'Plaintext input desc'
|
|
214
|
+
const outputDesc = 'Plaintext output desc'
|
|
215
|
+
const customInstr = 'Plaintext instructions'
|
|
216
|
+
await manager.createAction(
|
|
217
|
+
{
|
|
218
|
+
description: actionDescription,
|
|
219
|
+
inputs: [
|
|
220
|
+
{
|
|
221
|
+
outpoint: '9876.0',
|
|
222
|
+
unlockingScriptLength: 73,
|
|
223
|
+
inputDescription: inputDesc
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
outputs: [
|
|
227
|
+
{
|
|
228
|
+
lockingScript: 'ABCD',
|
|
229
|
+
satoshis: 123,
|
|
230
|
+
outputDescription: outputDesc,
|
|
231
|
+
customInstructions: customInstr
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
'nonadmin.com'
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
// Because encryption is disabled, underlying.encrypt() is not called
|
|
239
|
+
expect(underlying.encrypt).not.toHaveBeenCalled()
|
|
240
|
+
|
|
241
|
+
// Simulate that the wallet actually stored them in plaintext and is returning them as-is
|
|
242
|
+
;(underlying.listActions as any).mockResolvedValue({
|
|
243
|
+
totalActions: 1,
|
|
244
|
+
actions: [
|
|
245
|
+
{
|
|
246
|
+
description: actionDescription,
|
|
247
|
+
inputs: [
|
|
248
|
+
{
|
|
249
|
+
outpoint: '0123.0',
|
|
250
|
+
inputDescription: inputDesc
|
|
251
|
+
}
|
|
252
|
+
],
|
|
253
|
+
outputs: [
|
|
254
|
+
{
|
|
255
|
+
lockingScript: 'ABCD',
|
|
256
|
+
satoshis: 123,
|
|
257
|
+
outputDescription: outputDesc,
|
|
258
|
+
customInstructions: customInstr
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
// Decrypt is still called, because we try to decrypt regardless of whether encryption is enabled.
|
|
266
|
+
// This allows us to disable it on a wallet that had it in the past. The result is that when not encrypted,
|
|
267
|
+
// the plaintext is returned if decryption fails. If it was encrypted from metadata encryption being enabled in
|
|
268
|
+
// the past (even when not enabled now), we will still decrypt and see the correct plaintext rather than garbage.
|
|
269
|
+
// To simulate, we make decryption pass through.
|
|
270
|
+
underlying.decrypt.mockImplementation(x => x)
|
|
271
|
+
const listResult = await (manager as any).listActions({}, 'nonadmin.com')
|
|
272
|
+
expect(underlying.decrypt).toHaveBeenCalledTimes(3)
|
|
273
|
+
|
|
274
|
+
// Confirm the returned data is the same as originally provided (plaintext)
|
|
275
|
+
const [first] = listResult.actions
|
|
276
|
+
expect(first.description).toBe(actionDescription)
|
|
277
|
+
expect(first.inputs[0].inputDescription).toBe(inputDesc)
|
|
278
|
+
expect(first.outputs[0].outputDescription).toBe(outputDesc)
|
|
279
|
+
expect(first.outputs[0].customInstructions).toBe(customInstr)
|
|
280
|
+
})
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
describe('Integration Test for listOutputs decryption', () => {
|
|
284
|
+
it('should decrypt customInstructions in listOutputs if encryptWalletMetadata=true', async () => {
|
|
285
|
+
jest.spyOn(MockedBSV_SDK.Transaction, 'fromBEEF').mockImplementation(() => {
|
|
286
|
+
const mockTx = new MockTransaction()
|
|
287
|
+
// Add outputs with lockingScript
|
|
288
|
+
mockTx.outputs = [
|
|
289
|
+
{
|
|
290
|
+
lockingScript: {
|
|
291
|
+
// Ensure this matches what PushDrop.decode expects to work with
|
|
292
|
+
toHex: () => 'some script'
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
]
|
|
296
|
+
// Add the toBEEF method
|
|
297
|
+
mockTx.toBEEF = () => []
|
|
298
|
+
return mockTx
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
302
|
+
encryptWalletMetadata: true
|
|
303
|
+
})
|
|
304
|
+
manager.bindCallback('onBasketAccessRequested', x => {
|
|
305
|
+
manager.grantPermission({ requestID: x.requestID, ephemeral: true })
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
// Suppose we have an output with custom instructions that was stored encrypted
|
|
309
|
+
;(underlying.listOutputs as any).mockResolvedValue({
|
|
310
|
+
totalOutputs: 1,
|
|
311
|
+
outputs: [
|
|
312
|
+
{
|
|
313
|
+
outpoint: 'fakeTxid.0',
|
|
314
|
+
satoshis: 999,
|
|
315
|
+
lockingScript: 'OP_RETURN something',
|
|
316
|
+
basket: 'some-basket',
|
|
317
|
+
customInstructions: Utils.toBase64(Utils.toArray('fake-encrypted-instructions-string'))
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
})
|
|
321
|
+
|
|
322
|
+
const originalInstr = 'Please do not reveal this data.'
|
|
323
|
+
// We'll mock decrypt() to interpret 'fake-encrypted-instructions-string' as a success
|
|
324
|
+
;(underlying.decrypt as any).mockResolvedValueOnce({
|
|
325
|
+
plaintext: Array.from(originalInstr).map(ch => ch.charCodeAt(0))
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
const outputsResult = await manager.listOutputs(
|
|
329
|
+
{
|
|
330
|
+
basket: 'some-basket'
|
|
331
|
+
},
|
|
332
|
+
'some-origin.com'
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
expect(outputsResult.outputs.length).toBe(1)
|
|
336
|
+
expect(outputsResult.outputs[0].customInstructions).toBe(originalInstr)
|
|
337
|
+
|
|
338
|
+
// Confirm we tried to decrypt
|
|
339
|
+
expect(underlying.decrypt).toHaveBeenCalledTimes(1)
|
|
340
|
+
expect(underlying.decrypt).toHaveBeenCalledWith(
|
|
341
|
+
{
|
|
342
|
+
ciphertext: expect.any(Array),
|
|
343
|
+
protocolID: [2, 'admin metadata encryption'],
|
|
344
|
+
keyID: '1'
|
|
345
|
+
},
|
|
346
|
+
'admin.domain.com'
|
|
347
|
+
)
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
it('should fallback to the original ciphertext if decrypt fails in listOutputs', async () => {
|
|
351
|
+
jest.spyOn(MockedBSV_SDK.Transaction, 'fromBEEF').mockImplementation(() => {
|
|
352
|
+
const mockTx = new MockTransaction()
|
|
353
|
+
// Add outputs with lockingScript
|
|
354
|
+
mockTx.outputs = [
|
|
355
|
+
{
|
|
356
|
+
lockingScript: {
|
|
357
|
+
// Ensure this matches what PushDrop.decode expects to work with
|
|
358
|
+
toHex: () => 'some script'
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
]
|
|
362
|
+
// Add the toBEEF method
|
|
363
|
+
mockTx.toBEEF = () => []
|
|
364
|
+
return mockTx
|
|
365
|
+
})
|
|
366
|
+
// Add this to your test alongside the Transaction.fromBEEF mock
|
|
367
|
+
jest.spyOn(MockedBSV_SDK.PushDrop, 'decode').mockReturnValue({
|
|
368
|
+
fields: [
|
|
369
|
+
// Values that will decrypt to the expected values for domain, expiry, and basket
|
|
370
|
+
Utils.toArray('encoded-domain'),
|
|
371
|
+
Utils.toArray('encoded-expiry'),
|
|
372
|
+
Utils.toArray('encoded-basket')
|
|
373
|
+
]
|
|
374
|
+
})
|
|
375
|
+
|
|
376
|
+
const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
|
|
377
|
+
encryptWalletMetadata: true
|
|
378
|
+
})
|
|
379
|
+
manager.bindCallback('onBasketAccessRequested', x => {
|
|
380
|
+
manager.grantPermission({ requestID: x.requestID, ephemeral: true })
|
|
381
|
+
})
|
|
382
|
+
;(underlying.listOutputs as any).mockResolvedValue({
|
|
383
|
+
totalOutputs: 1,
|
|
384
|
+
outputs: [
|
|
385
|
+
{
|
|
386
|
+
outpoint: 'fakeTxid.0',
|
|
387
|
+
satoshis: 500,
|
|
388
|
+
lockingScript: 'OP_RETURN something',
|
|
389
|
+
basket: 'some-basket',
|
|
390
|
+
customInstructions: 'bad-ciphertext-of-some-kind'
|
|
391
|
+
}
|
|
392
|
+
]
|
|
393
|
+
})
|
|
394
|
+
|
|
395
|
+
// Force an error from decrypt
|
|
396
|
+
;(underlying.decrypt as any).mockImplementationOnce(() => {
|
|
397
|
+
throw new Error('Failed to decrypt')
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
const outputsResult = await manager.listOutputs(
|
|
401
|
+
{
|
|
402
|
+
basket: 'some-basket'
|
|
403
|
+
},
|
|
404
|
+
'some-origin.com'
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
expect(outputsResult.outputs.length).toBe(1)
|
|
408
|
+
// Should fall back to the original 'bad-ciphertext-of-some-kind'
|
|
409
|
+
expect(outputsResult.outputs[0].customInstructions).toBe('bad-ciphertext-of-some-kind')
|
|
410
|
+
})
|
|
411
|
+
})
|
|
412
|
+
})
|