@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,117 @@
|
|
|
1
|
+
import { Beef, SignActionResult, SignActionSpend, Spend, Transaction } from '@bsv/sdk'
|
|
2
|
+
import { PendingSignAction, Wallet } from '../../Wallet'
|
|
3
|
+
import { WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
|
|
4
|
+
import { asBsvSdkScript } from '../../utility/utilityHelpers'
|
|
5
|
+
import { ScriptTemplateBRC29 } from '../../utility/ScriptTemplateBRC29'
|
|
6
|
+
import { WalletError } from '../../sdk/WalletError'
|
|
7
|
+
|
|
8
|
+
export async function completeSignedTransaction(
|
|
9
|
+
prior: PendingSignAction,
|
|
10
|
+
spends: Record<number, SignActionSpend>,
|
|
11
|
+
wallet: Wallet
|
|
12
|
+
): Promise<Transaction> {
|
|
13
|
+
/////////////////////
|
|
14
|
+
// Insert the user provided unlocking scripts from "spends" arg
|
|
15
|
+
/////////////////////
|
|
16
|
+
for (const [key, spend] of Object.entries(spends)) {
|
|
17
|
+
const vin = Number(key)
|
|
18
|
+
const createInput = prior.args.inputs[vin]
|
|
19
|
+
const input = prior.tx.inputs[vin]
|
|
20
|
+
if (!createInput || !input || createInput.unlockingScript || !Number.isInteger(createInput.unlockingScriptLength))
|
|
21
|
+
throw new WERR_INVALID_PARAMETER(
|
|
22
|
+
'args',
|
|
23
|
+
`spend does not correspond to prior input with valid unlockingScriptLength.`
|
|
24
|
+
)
|
|
25
|
+
if (spend.unlockingScript.length / 2 > createInput.unlockingScriptLength!)
|
|
26
|
+
throw new WERR_INVALID_PARAMETER(
|
|
27
|
+
'args',
|
|
28
|
+
`spend unlockingScript length ${spend.unlockingScript.length} exceeds expected length ${createInput.unlockingScriptLength}`
|
|
29
|
+
)
|
|
30
|
+
input.unlockingScript = asBsvSdkScript(spend.unlockingScript)
|
|
31
|
+
if (spend.sequenceNumber !== undefined) input.sequence = spend.sequenceNumber
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const results = {
|
|
35
|
+
sdk: <SignActionResult>{}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/////////////////////
|
|
39
|
+
// Insert SABPPP unlock templates for wallet signed inputs
|
|
40
|
+
/////////////////////
|
|
41
|
+
for (const pdi of prior.pdi) {
|
|
42
|
+
const sabppp = new ScriptTemplateBRC29({
|
|
43
|
+
derivationPrefix: pdi.derivationPrefix,
|
|
44
|
+
derivationSuffix: pdi.derivationSuffix,
|
|
45
|
+
keyDeriver: wallet.keyDeriver
|
|
46
|
+
})
|
|
47
|
+
const keys = wallet.getClientChangeKeyPair()
|
|
48
|
+
const lockerPrivKey = keys.privateKey
|
|
49
|
+
const unlockerPubKey = pdi.unlockerPubKey || keys.publicKey
|
|
50
|
+
const sourceSatoshis = pdi.sourceSatoshis
|
|
51
|
+
const lockingScript = asBsvSdkScript(pdi.lockingScript)
|
|
52
|
+
const unlockTemplate = sabppp.unlock(lockerPrivKey, unlockerPubKey, sourceSatoshis, lockingScript)
|
|
53
|
+
const input = prior.tx.inputs[pdi.vin]
|
|
54
|
+
input.unlockingScriptTemplate = unlockTemplate
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/////////////////////
|
|
58
|
+
// Sign wallet signed inputs making transaction fully valid.
|
|
59
|
+
/////////////////////
|
|
60
|
+
await prior.tx.sign()
|
|
61
|
+
|
|
62
|
+
return prior.tx
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param txid The TXID of a transaction in the beef for which all unlocking scripts must be valid.
|
|
67
|
+
* @param beef Must contain transactions for txid and all its inputs.
|
|
68
|
+
* @throws WERR_INVALID_PARAMETER if any unlocking script is invalid, if sourceTXID is invalid, if beef doesn't contain required transactions.
|
|
69
|
+
*/
|
|
70
|
+
export function verifyUnlockScripts(txid: string, beef: Beef): void {
|
|
71
|
+
const tx = beef.findTxid(txid)?.tx
|
|
72
|
+
if (!tx) throw new WERR_INVALID_PARAMETER(`txid`, `contained in beef, txid ${txid}`)
|
|
73
|
+
|
|
74
|
+
for (let i = 0; i < tx.inputs.length; i++) {
|
|
75
|
+
const input = tx.inputs[i]
|
|
76
|
+
if (!input.sourceTXID) throw new WERR_INVALID_PARAMETER(`inputs[${i}].sourceTXID`, `valid`)
|
|
77
|
+
if (!input.unlockingScript) throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockingScript`, `valid`)
|
|
78
|
+
input.sourceTransaction = beef.findTxid(input.sourceTXID)?.tx
|
|
79
|
+
if (!input.sourceTransaction) {
|
|
80
|
+
// The beef doesn't contain all the source transactions only if advanced features
|
|
81
|
+
// such as knownTxids are used.
|
|
82
|
+
// Skip unlock script checks.
|
|
83
|
+
return
|
|
84
|
+
// throw new WERR_INVALID_PARAMETER(`inputs[${i}].sourceTXID`, `contained in beef`)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
for (let i = 0; i < tx.inputs.length; i++) {
|
|
89
|
+
const input = tx.inputs[i]
|
|
90
|
+
const sourceOutput = input.sourceTransaction!.outputs[input.sourceOutputIndex]
|
|
91
|
+
|
|
92
|
+
const otherInputs = tx.inputs.filter((_, idx) => idx !== i)
|
|
93
|
+
|
|
94
|
+
const spend = new Spend({
|
|
95
|
+
sourceTXID: input.sourceTXID!,
|
|
96
|
+
sourceOutputIndex: input.sourceOutputIndex,
|
|
97
|
+
lockingScript: sourceOutput.lockingScript,
|
|
98
|
+
sourceSatoshis: sourceOutput.satoshis ?? 0,
|
|
99
|
+
transactionVersion: tx.version,
|
|
100
|
+
otherInputs,
|
|
101
|
+
unlockingScript: input.unlockingScript!,
|
|
102
|
+
inputSequence: input.sequence ?? 0,
|
|
103
|
+
inputIndex: i,
|
|
104
|
+
outputs: tx.outputs,
|
|
105
|
+
lockTime: tx.lockTime
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
const spendValid = spend.validate()
|
|
110
|
+
|
|
111
|
+
if (!spendValid) throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockScript`, `valid`)
|
|
112
|
+
} catch (eu: unknown) {
|
|
113
|
+
const e = WalletError.fromUnknown(eu)
|
|
114
|
+
throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockScript`, `valid. ${e.message}`)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AtomicBEEF,
|
|
3
|
+
Beef,
|
|
4
|
+
CreateActionResult,
|
|
5
|
+
OutpointString,
|
|
6
|
+
SendWithResult,
|
|
7
|
+
SignableTransaction,
|
|
8
|
+
TXIDHexString,
|
|
9
|
+
Script,
|
|
10
|
+
Transaction,
|
|
11
|
+
Validation
|
|
12
|
+
} from '@bsv/sdk'
|
|
13
|
+
import { buildSignableTransaction } from './buildSignableTransaction'
|
|
14
|
+
import {
|
|
15
|
+
AuthId,
|
|
16
|
+
ReviewActionResult,
|
|
17
|
+
StorageProcessActionArgs,
|
|
18
|
+
StorageProcessActionResults
|
|
19
|
+
} from '../../sdk/WalletStorage.interfaces'
|
|
20
|
+
import { completeSignedTransaction, verifyUnlockScripts } from './completeSignedTransaction'
|
|
21
|
+
import { PendingSignAction, Wallet } from '../../Wallet'
|
|
22
|
+
import { WERR_INTERNAL } from '../../sdk/WERR_errors'
|
|
23
|
+
|
|
24
|
+
export interface CreateActionResultX extends CreateActionResult {
|
|
25
|
+
txid?: TXIDHexString
|
|
26
|
+
tx?: AtomicBEEF
|
|
27
|
+
noSendChange?: OutpointString[]
|
|
28
|
+
sendWithResults?: SendWithResult[]
|
|
29
|
+
signableTransaction?: SignableTransaction
|
|
30
|
+
notDelayedResults?: ReviewActionResult[]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function createAction(
|
|
34
|
+
wallet: Wallet,
|
|
35
|
+
auth: AuthId,
|
|
36
|
+
vargs: Validation.ValidCreateActionArgs
|
|
37
|
+
): Promise<CreateActionResultX> {
|
|
38
|
+
const r: CreateActionResultX = {}
|
|
39
|
+
const logger = vargs.logger
|
|
40
|
+
|
|
41
|
+
let prior: PendingSignAction | undefined = undefined
|
|
42
|
+
|
|
43
|
+
if (vargs.isNewTx || vargs.isTestWerrReviewActions) {
|
|
44
|
+
prior = await createNewTx(wallet, vargs)
|
|
45
|
+
logger?.log('created new transaction')
|
|
46
|
+
|
|
47
|
+
if (vargs.isSignAction) {
|
|
48
|
+
const r = makeSignableTransactionResult(prior, wallet, vargs)
|
|
49
|
+
logger?.log('created signable transaction result')
|
|
50
|
+
return r
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
prior.tx = await completeSignedTransaction(prior, {}, wallet)
|
|
54
|
+
logger?.log('completed signed transaction')
|
|
55
|
+
|
|
56
|
+
r.txid = prior.tx.id('hex')
|
|
57
|
+
const beef = new Beef()
|
|
58
|
+
if (prior.dcr.inputBeef) beef.mergeBeef(prior.dcr.inputBeef)
|
|
59
|
+
beef.mergeTransaction(prior.tx)
|
|
60
|
+
logger?.log('merged beef')
|
|
61
|
+
|
|
62
|
+
verifyUnlockScripts(r.txid, beef)
|
|
63
|
+
logger?.log('verified unlock scripts')
|
|
64
|
+
|
|
65
|
+
r.noSendChange = prior.dcr.noSendChangeOutputVouts?.map(vout => `${r.txid}.${vout}`)
|
|
66
|
+
if (!vargs.options.returnTXIDOnly) r.tx = beef.toBinaryAtomic(r.txid)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const { sendWithResults, notDelayedResults } = await processAction(prior, wallet, auth, vargs)
|
|
70
|
+
logger?.log('processed transaction')
|
|
71
|
+
|
|
72
|
+
r.sendWithResults = sendWithResults
|
|
73
|
+
r.notDelayedResults = notDelayedResults
|
|
74
|
+
|
|
75
|
+
return r
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function createNewTx(wallet: Wallet, vargs: Validation.ValidCreateActionArgs): Promise<PendingSignAction> {
|
|
79
|
+
const logger = vargs.logger
|
|
80
|
+
const storageArgs = removeUnlockScripts(vargs)
|
|
81
|
+
const dcr = await wallet.storage.createAction(storageArgs)
|
|
82
|
+
|
|
83
|
+
const reference = dcr.reference
|
|
84
|
+
|
|
85
|
+
const { tx, amount, pdi } = buildSignableTransaction(dcr, vargs, wallet)
|
|
86
|
+
logger?.log('built signable transaction')
|
|
87
|
+
|
|
88
|
+
const prior: PendingSignAction = { reference, dcr, args: vargs, amount, tx, pdi }
|
|
89
|
+
|
|
90
|
+
return prior
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function makeSignableTransactionResult(
|
|
94
|
+
prior: PendingSignAction,
|
|
95
|
+
wallet: Wallet,
|
|
96
|
+
args: Validation.ValidCreateActionArgs
|
|
97
|
+
): CreateActionResult {
|
|
98
|
+
if (!prior.dcr.inputBeef) throw new WERR_INTERNAL('prior.dcr.inputBeef must be valid')
|
|
99
|
+
|
|
100
|
+
const txid = prior.tx.id('hex')
|
|
101
|
+
|
|
102
|
+
const r: CreateActionResult = {
|
|
103
|
+
noSendChange: args.isNoSend ? prior.dcr.noSendChangeOutputVouts?.map(vout => `${txid}.${vout}`) : undefined,
|
|
104
|
+
signableTransaction: {
|
|
105
|
+
reference: prior.dcr.reference,
|
|
106
|
+
tx: makeSignableTransactionBeef(prior.tx, prior.dcr.inputBeef)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
wallet.pendingSignActions[r.signableTransaction!.reference] = prior
|
|
111
|
+
|
|
112
|
+
return r
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function makeSignableTransactionBeef(tx: Transaction, inputBEEF: number[]): number[] {
|
|
116
|
+
// This is a special case beef for transaction signing.
|
|
117
|
+
// We only need the transaction being signed, and for each input, the raw source transaction.
|
|
118
|
+
const beef = new Beef()
|
|
119
|
+
for (const input of tx.inputs) {
|
|
120
|
+
if (!input.sourceTransaction)
|
|
121
|
+
throw new WERR_INTERNAL('Every signableTransaction input must have a sourceTransaction')
|
|
122
|
+
beef.mergeRawTx(input.sourceTransaction!.toBinary())
|
|
123
|
+
}
|
|
124
|
+
beef.mergeRawTx(tx.toBinary())
|
|
125
|
+
return beef.toBinaryAtomic(tx.id('hex'))
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function removeUnlockScripts(args: Validation.ValidCreateActionArgs) {
|
|
129
|
+
let storageArgs = args
|
|
130
|
+
if (!storageArgs.inputs.every(i => i.unlockingScript === undefined)) {
|
|
131
|
+
// Never send unlocking scripts to storage, all it needs is the script length.
|
|
132
|
+
storageArgs = { ...args, inputs: [] }
|
|
133
|
+
for (const i of args.inputs) {
|
|
134
|
+
const di: Validation.ValidCreateActionInput = {
|
|
135
|
+
...i,
|
|
136
|
+
unlockingScriptLength: i.unlockingScript !== undefined ? i.unlockingScript.length : i.unlockingScriptLength
|
|
137
|
+
}
|
|
138
|
+
delete di.unlockingScript
|
|
139
|
+
storageArgs.inputs.push(di)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return storageArgs
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export async function processAction(
|
|
146
|
+
prior: PendingSignAction | undefined,
|
|
147
|
+
wallet: Wallet,
|
|
148
|
+
auth: AuthId,
|
|
149
|
+
vargs: Validation.ValidProcessActionArgs
|
|
150
|
+
): Promise<StorageProcessActionResults> {
|
|
151
|
+
const args: StorageProcessActionArgs = {
|
|
152
|
+
isNewTx: vargs.isNewTx,
|
|
153
|
+
isSendWith: vargs.isSendWith,
|
|
154
|
+
isNoSend: vargs.isNoSend,
|
|
155
|
+
isDelayed: vargs.isDelayed,
|
|
156
|
+
reference: prior ? prior.reference : undefined,
|
|
157
|
+
txid: prior ? prior.tx.id('hex') : undefined,
|
|
158
|
+
rawTx: prior ? prior.tx.toBinary() : undefined,
|
|
159
|
+
sendWith: vargs.isSendWith ? vargs.options.sendWith : [],
|
|
160
|
+
logger: vargs.logger
|
|
161
|
+
}
|
|
162
|
+
const r: StorageProcessActionResults = await wallet.storage.processAction(args)
|
|
163
|
+
|
|
164
|
+
return r
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function makeDummyTransactionForOutputSatoshis(vout: number, satoshis: number): Transaction {
|
|
168
|
+
const tx = new Transaction()
|
|
169
|
+
for (let i = 0; i < vout; i++) tx.addOutput({ lockingScript: new Script(), satoshis: 0 })
|
|
170
|
+
tx.addOutput({ lockingScript: new Script(), satoshis })
|
|
171
|
+
return tx
|
|
172
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Beef, InternalizeActionArgs, InternalizeOutput, P2PKH, WalletProtocol, Validation } from '@bsv/sdk'
|
|
2
|
+
import { Wallet } from '../../Wallet'
|
|
3
|
+
import { AuthId, StorageInternalizeActionResult } from '../../sdk/WalletStorage.interfaces'
|
|
4
|
+
import { WERR_INTERNAL, WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internalize Action allows a wallet to take ownership of outputs in a pre-existing transaction.
|
|
8
|
+
* The transaction may, or may not already be known to both the storage and user.
|
|
9
|
+
*
|
|
10
|
+
* Two types of outputs are handled: "wallet payments" and "basket insertions".
|
|
11
|
+
*
|
|
12
|
+
* A "basket insertion" output is considered a custom output and has no effect on the wallet's "balance".
|
|
13
|
+
*
|
|
14
|
+
* A "wallet payment" adds an outputs value to the wallet's change "balance". These outputs are assigned to the "default" basket.
|
|
15
|
+
*
|
|
16
|
+
* Processing starts with simple validation and then checks for a pre-existing transaction.
|
|
17
|
+
* If the transaction is already known to the user, then the outputs are reviewed against the existing outputs treatment,
|
|
18
|
+
* and merge rules are added to the arguments passed to the storage layer.
|
|
19
|
+
* The existing transaction must be in the 'unproven' or 'completed' status. Any other status is an error.
|
|
20
|
+
*
|
|
21
|
+
* When the transaction already exists, the description is updated. The isOutgoing sense is not changed.
|
|
22
|
+
*
|
|
23
|
+
* "basket insertion" Merge Rules:
|
|
24
|
+
* 1. The "default" basket may not be specified as the insertion basket.
|
|
25
|
+
* 2. A change output in the "default" basket may not be target of an insertion into a different basket.
|
|
26
|
+
* 3. These baskets do not affect the wallet's balance and are typed "custom".
|
|
27
|
+
*
|
|
28
|
+
* "wallet payment" Merge Rules:
|
|
29
|
+
* 1. Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
|
|
30
|
+
* 2. Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's `amount`, and the wallet balance.
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
export async function internalizeAction(
|
|
34
|
+
wallet: Wallet,
|
|
35
|
+
auth: AuthId,
|
|
36
|
+
args: InternalizeActionArgs
|
|
37
|
+
): Promise<StorageInternalizeActionResult> {
|
|
38
|
+
const vargs = Validation.validateInternalizeActionArgs(args)
|
|
39
|
+
|
|
40
|
+
const { ab, tx, txid } = await validateAtomicBeef()
|
|
41
|
+
const brc29ProtocolID: WalletProtocol = [2, '3241645161d8']
|
|
42
|
+
|
|
43
|
+
for (const o of vargs.outputs) {
|
|
44
|
+
if (o.outputIndex < 0 || o.outputIndex >= tx.outputs.length)
|
|
45
|
+
throw new WERR_INVALID_PARAMETER('outputIndex', `a valid output index in range 0 to ${tx.outputs.length - 1}`)
|
|
46
|
+
switch (o.protocol) {
|
|
47
|
+
case 'basket insertion':
|
|
48
|
+
setupBasketInsertionForOutput(o, vargs)
|
|
49
|
+
break
|
|
50
|
+
case 'wallet payment':
|
|
51
|
+
setupWalletPaymentForOutput(o, vargs)
|
|
52
|
+
break
|
|
53
|
+
default:
|
|
54
|
+
throw new WERR_INTERNAL(`unexpected protocol ${o.protocol}`)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const r: StorageInternalizeActionResult = await wallet.storage.internalizeAction(args)
|
|
59
|
+
|
|
60
|
+
return r
|
|
61
|
+
|
|
62
|
+
function setupWalletPaymentForOutput(o: InternalizeOutput, dargs: Validation.ValidInternalizeActionArgs) {
|
|
63
|
+
const p = o.paymentRemittance
|
|
64
|
+
const output = tx.outputs[o.outputIndex]
|
|
65
|
+
if (!p) throw new WERR_INVALID_PARAMETER('paymentRemittance', `valid for protocol ${o.protocol}`)
|
|
66
|
+
|
|
67
|
+
const keyID = `${p.derivationPrefix} ${p.derivationSuffix}`
|
|
68
|
+
|
|
69
|
+
const privKey = wallet.keyDeriver!.derivePrivateKey(brc29ProtocolID, keyID, p.senderIdentityKey)
|
|
70
|
+
const expectedLockScript = new P2PKH().lock(privKey.toAddress())
|
|
71
|
+
if (output.lockingScript.toHex() !== expectedLockScript.toHex())
|
|
72
|
+
throw new WERR_INVALID_PARAMETER('paymentRemittance', `locked by script conforming to BRC-29`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function setupBasketInsertionForOutput(o: InternalizeOutput, dargs: Validation.ValidInternalizeActionArgs) {
|
|
76
|
+
/*
|
|
77
|
+
No additional validations...
|
|
78
|
+
*/
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Verifies that the `tx` argument passed to internalizeAction is a valid AtomicBEEF,
|
|
83
|
+
* and the proofs are valid according to the wallet's configured chainTracker.
|
|
84
|
+
* THIS DOES NOT GUARANTEE:
|
|
85
|
+
* 1. That the transaction has been broadcast. (Is known to the network).
|
|
86
|
+
* 2. That the proofs are for the same block as recorded in the wallet's configured storage in the event of a reorg.
|
|
87
|
+
*/
|
|
88
|
+
async function validateAtomicBeef() {
|
|
89
|
+
const ab = Beef.fromBinary(vargs.tx)
|
|
90
|
+
|
|
91
|
+
// TODO: Add support for known txids...which would speed up processing by avoiding a network call,
|
|
92
|
+
// unless a local chaintracker is used.
|
|
93
|
+
|
|
94
|
+
const txValid = await ab.verify(await wallet.getServices().getChainTracker(), false)
|
|
95
|
+
if (!txValid || !ab.atomicTxid) {
|
|
96
|
+
console.log(`internalizeAction beef is invalid: ${ab.toLogString()}`)
|
|
97
|
+
throw new WERR_INVALID_PARAMETER('tx', 'valid AtomicBEEF')
|
|
98
|
+
}
|
|
99
|
+
const txid = ab.atomicTxid
|
|
100
|
+
const btx = ab.findTxid(txid)
|
|
101
|
+
if (!btx) throw new WERR_INVALID_PARAMETER('tx', `valid AtomicBEEF with newest txid of ${txid}`)
|
|
102
|
+
const tx = btx.tx!
|
|
103
|
+
|
|
104
|
+
return { ab, tx, txid }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MasterCertificate, ProveCertificateResult, Validation } from '@bsv/sdk'
|
|
2
|
+
import { Wallet } from '../../Wallet'
|
|
3
|
+
import { WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
|
|
4
|
+
import { AuthId } from '../../sdk/WalletStorage.interfaces'
|
|
5
|
+
|
|
6
|
+
export async function proveCertificate(
|
|
7
|
+
wallet: Wallet,
|
|
8
|
+
auth: AuthId,
|
|
9
|
+
vargs: Validation.ValidProveCertificateArgs
|
|
10
|
+
): Promise<ProveCertificateResult> {
|
|
11
|
+
const lcargs: Validation.ValidListCertificatesArgs = {
|
|
12
|
+
partial: {
|
|
13
|
+
type: vargs.type,
|
|
14
|
+
serialNumber: vargs.serialNumber,
|
|
15
|
+
certifier: vargs.certifier,
|
|
16
|
+
subject: vargs.subject,
|
|
17
|
+
revocationOutpoint: vargs.revocationOutpoint,
|
|
18
|
+
signature: vargs.signature
|
|
19
|
+
},
|
|
20
|
+
certifiers: [],
|
|
21
|
+
types: [],
|
|
22
|
+
limit: 2,
|
|
23
|
+
offset: 0,
|
|
24
|
+
privileged: false
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const lcr = await wallet.storage.listCertificates(lcargs)
|
|
28
|
+
if (lcr.certificates.length != 1) throw new WERR_INVALID_PARAMETER('args', `a unique certificate match`)
|
|
29
|
+
const storageCert = lcr.certificates[0]
|
|
30
|
+
const keyringForVerifier = await MasterCertificate.createKeyringForVerifier(
|
|
31
|
+
wallet,
|
|
32
|
+
storageCert.certifier,
|
|
33
|
+
vargs.verifier,
|
|
34
|
+
storageCert.fields,
|
|
35
|
+
vargs.fieldsToReveal,
|
|
36
|
+
storageCert.keyring!,
|
|
37
|
+
storageCert.serialNumber,
|
|
38
|
+
vargs.privileged,
|
|
39
|
+
vargs.privilegedReason
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return { keyringForVerifier }
|
|
43
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AtomicBEEF, Beef, SendWithResult, SignActionArgs, SignActionResult, TXIDHexString, Validation } from '@bsv/sdk'
|
|
2
|
+
import { processAction } from './createAction'
|
|
3
|
+
import { AuthId, ReviewActionResult } from '../../sdk/WalletStorage.interfaces'
|
|
4
|
+
import { completeSignedTransaction, verifyUnlockScripts } from './completeSignedTransaction'
|
|
5
|
+
import { Wallet } from '../../Wallet'
|
|
6
|
+
import { WERR_INTERNAL, WERR_NOT_IMPLEMENTED } from '../../sdk/WERR_errors'
|
|
7
|
+
|
|
8
|
+
export interface SignActionResultX extends SignActionResult {
|
|
9
|
+
txid?: TXIDHexString
|
|
10
|
+
tx?: AtomicBEEF
|
|
11
|
+
sendWithResults?: SendWithResult[]
|
|
12
|
+
notDelayedResults?: ReviewActionResult[]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function signAction(wallet: Wallet, auth: AuthId, args: SignActionArgs): Promise<SignActionResultX> {
|
|
16
|
+
const prior = wallet.pendingSignActions[args.reference]
|
|
17
|
+
if (!prior)
|
|
18
|
+
throw new WERR_NOT_IMPLEMENTED('recovery of out-of-session signAction reference data is not yet implemented.')
|
|
19
|
+
if (!prior.dcr.inputBeef) throw new WERR_INTERNAL('prior.dcr.inputBeef must be valid')
|
|
20
|
+
|
|
21
|
+
const vargs = mergePriorOptions(prior.args, args)
|
|
22
|
+
|
|
23
|
+
prior.tx = await completeSignedTransaction(prior, vargs.spends, wallet)
|
|
24
|
+
|
|
25
|
+
const { sendWithResults, notDelayedResults } = await processAction(prior, wallet, auth, vargs)
|
|
26
|
+
|
|
27
|
+
const txid = prior.tx.id('hex')
|
|
28
|
+
const beef = Beef.fromBinary(prior.dcr.inputBeef)
|
|
29
|
+
beef.mergeTransaction(prior.tx)
|
|
30
|
+
|
|
31
|
+
verifyUnlockScripts(txid, beef)
|
|
32
|
+
|
|
33
|
+
const r: SignActionResultX = {
|
|
34
|
+
txid: prior.tx.id('hex'),
|
|
35
|
+
tx: vargs.options.returnTXIDOnly ? undefined : beef.toBinaryAtomic(txid),
|
|
36
|
+
sendWithResults,
|
|
37
|
+
notDelayedResults
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return r
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function mergePriorOptions(
|
|
44
|
+
caVargs: Validation.ValidCreateActionArgs,
|
|
45
|
+
saArgs: SignActionArgs
|
|
46
|
+
): Validation.ValidSignActionArgs {
|
|
47
|
+
const saOptions = (saArgs.options ||= {})
|
|
48
|
+
if (saOptions.acceptDelayedBroadcast === undefined)
|
|
49
|
+
saOptions.acceptDelayedBroadcast = caVargs.options.acceptDelayedBroadcast
|
|
50
|
+
if (saOptions.returnTXIDOnly === undefined) saOptions.returnTXIDOnly = caVargs.options.returnTXIDOnly
|
|
51
|
+
if (saOptions.noSend === undefined) saOptions.noSend = caVargs.options.noSend
|
|
52
|
+
if (saOptions.sendWith === undefined) saOptions.sendWith = caVargs.options.sendWith
|
|
53
|
+
return Validation.validateSignActionArgs(saArgs)
|
|
54
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# WalletStorage
|
|
2
|
+
|
|
3
|
+
Provides access to persistent storage in support of Wallet.interfaces.
|
|
4
|
+
|
|
5
|
+
This includes:
|
|
6
|
+
|
|
7
|
+
- Direct storage on a variety of databases.
|
|
8
|
+
- Remoted storage to service providers for backup and mobile support.
|
|
9
|
+
- Synchronization between multiple stores.
|
|
10
|
+
- Import from legacy stores.
|
|
11
|
+
- Support single user, multi-read/single write, full multi-user modes.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|