@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,293 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import * as bsv from '@bsv/sdk'
|
|
3
|
+
import { sdk, Wallet } from '../../../src/index.all'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
_tu,
|
|
7
|
+
logTransaction,
|
|
8
|
+
TestKeyPair,
|
|
9
|
+
TestWalletNoSetup,
|
|
10
|
+
cleanUnsentTransactionsUsingAbort,
|
|
11
|
+
cleanUnsignedTransactionsUsingAbort,
|
|
12
|
+
cleanUnprocessedTransactionsUsingAbort
|
|
13
|
+
} from '../../utils/TestUtilsWalletStorage'
|
|
14
|
+
|
|
15
|
+
describe('createActionToGenerateBeefs test', () => {
|
|
16
|
+
jest.setTimeout(99999999)
|
|
17
|
+
|
|
18
|
+
const ctxs: TestWalletNoSetup[] = []
|
|
19
|
+
|
|
20
|
+
beforeAll(async () => {
|
|
21
|
+
ctxs.push(await _tu.createLiveWalletSQLiteWARNING())
|
|
22
|
+
for (const { services } of ctxs) {
|
|
23
|
+
// Mock the services postBeef to avoid actually broadcasting new transactions and collect beef data.
|
|
24
|
+
services.postBeef = jest
|
|
25
|
+
.fn()
|
|
26
|
+
.mockImplementation((beef: bsv.Beef, txids: string[]): Promise<sdk.PostBeefResult[]> => {
|
|
27
|
+
const r: sdk.PostBeefResult = {
|
|
28
|
+
name: 'mock',
|
|
29
|
+
status: 'success',
|
|
30
|
+
txidResults: txids.map(txid => ({ txid, status: 'success' }))
|
|
31
|
+
}
|
|
32
|
+
return Promise.resolve([r])
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
afterAll(async () => {
|
|
38
|
+
for (const ctx of ctxs) {
|
|
39
|
+
await ctx.storage.destroy()
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('1_send 2 txs in a beef', async () => {
|
|
44
|
+
const root = '02135476'
|
|
45
|
+
const kp = _tu.getKeyPair(root.repeat(8))
|
|
46
|
+
|
|
47
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
48
|
+
const {
|
|
49
|
+
txidPair: [txid1, txid2],
|
|
50
|
+
Beef: beef1
|
|
51
|
+
} = await createAndConsume(wallet, root, kp)
|
|
52
|
+
|
|
53
|
+
{
|
|
54
|
+
const createArgs: bsv.CreateActionArgs = {
|
|
55
|
+
description: `${kp.address} of ${root}`,
|
|
56
|
+
options: {
|
|
57
|
+
acceptDelayedBroadcast: false,
|
|
58
|
+
sendWith: [txid1, txid2]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const cr = await wallet.createAction(createArgs)
|
|
63
|
+
|
|
64
|
+
expect(cr.noSendChange).not.toBeTruthy()
|
|
65
|
+
expect(cr.sendWithResults?.length).toBe(2)
|
|
66
|
+
const [swr1, swr2] = cr.sendWithResults!
|
|
67
|
+
expect(swr1.status !== 'failed').toBe(true)
|
|
68
|
+
expect(swr2.status !== 'failed').toBe(true)
|
|
69
|
+
expect(swr1.txid).toBe(txid1)
|
|
70
|
+
expect(swr2.txid).toBe(txid2)
|
|
71
|
+
const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
|
|
72
|
+
await expect(Promise.resolve(r1)).resolves.toBe(true)
|
|
73
|
+
const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
|
|
74
|
+
await expect(Promise.resolve(r2)).resolves.toBe(true)
|
|
75
|
+
const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
|
|
76
|
+
await expect(Promise.resolve(r3)).resolves.toBe(true)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('2_send 4 txs in a single beef ', async () => {
|
|
82
|
+
const root1 = '02135476'
|
|
83
|
+
const kp1 = _tu.getKeyPair(root1.repeat(8))
|
|
84
|
+
const root2 = '02135478'
|
|
85
|
+
const kp2 = _tu.getKeyPair(root2.repeat(8))
|
|
86
|
+
|
|
87
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
88
|
+
const {
|
|
89
|
+
txidPair: [txid1, txid2],
|
|
90
|
+
Beef: beef1
|
|
91
|
+
} = await createAndConsume(wallet, root1, kp1)
|
|
92
|
+
expect(txid1).toBeTruthy()
|
|
93
|
+
expect(txid2).toBeTruthy()
|
|
94
|
+
|
|
95
|
+
const {
|
|
96
|
+
txidPair: [txid3, txid4],
|
|
97
|
+
Beef: beef2
|
|
98
|
+
} = await createAndConsume(wallet, root2, kp2)
|
|
99
|
+
expect(txid3).toBeTruthy()
|
|
100
|
+
expect(txid4).toBeTruthy()
|
|
101
|
+
|
|
102
|
+
{
|
|
103
|
+
const createArgs: bsv.CreateActionArgs = {
|
|
104
|
+
description: `${root1} & ${root2}`,
|
|
105
|
+
options: {
|
|
106
|
+
acceptDelayedBroadcast: false,
|
|
107
|
+
sendWith: [txid1, txid2, txid3, txid4]
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const cr = await wallet.createAction(createArgs)
|
|
112
|
+
|
|
113
|
+
expect(cr.noSendChange).not.toBeTruthy()
|
|
114
|
+
expect(cr.sendWithResults?.length).toBe(2)
|
|
115
|
+
const [swr1, swr2, swr3, swr4] = cr.sendWithResults!
|
|
116
|
+
expect(swr1.status !== 'failed').toBe(true)
|
|
117
|
+
expect(swr2.status !== 'failed').toBe(true)
|
|
118
|
+
expect(swr3.status !== 'failed').toBe(true)
|
|
119
|
+
expect(swr4.status !== 'failed').toBe(true)
|
|
120
|
+
expect(swr1.txid).toBe(txid1)
|
|
121
|
+
expect(swr2.txid).toBe(txid2)
|
|
122
|
+
expect(swr3.txid).toBe(txid3)
|
|
123
|
+
expect(swr4.txid).toBe(txid4)
|
|
124
|
+
const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
|
|
125
|
+
await expect(Promise.resolve(r1)).resolves.toBe(true)
|
|
126
|
+
const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
|
|
127
|
+
await expect(Promise.resolve(r2)).resolves.toBe(true)
|
|
128
|
+
const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
|
|
129
|
+
await expect(Promise.resolve(r3)).resolves.toBe(true)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
test('3_test tranaction log', async () => {
|
|
135
|
+
for (const { activeStorage: storage } of ctxs) {
|
|
136
|
+
const txid: bsv.HexString = 'ed11e4b7402e38bac0ec7431063ae7c14ee82370e5f1963d48ae27a70527f784'
|
|
137
|
+
const rl = await logTransaction(storage, txid)
|
|
138
|
+
console.log(rl)
|
|
139
|
+
break
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
test('4_abort set of nosend transactions', async () => {
|
|
143
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
144
|
+
const r = await cleanUnsentTransactionsUsingAbort(wallet, storage)
|
|
145
|
+
await expect(Promise.resolve(r)).resolves.toBe(true)
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
test('5_abort a set of unsigned transactions', async () => {
|
|
150
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
151
|
+
const r = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
|
|
152
|
+
await expect(Promise.resolve(r)).resolves.toBe(true)
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
test('6_abort a set of unprocessed transactions', async () => {
|
|
157
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
158
|
+
const r = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
|
|
159
|
+
await expect(Promise.resolve(r)).resolves.toBe(true)
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('7_abort all transactions', async () => {
|
|
164
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
165
|
+
const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
|
|
166
|
+
await expect(Promise.resolve(r1)).resolves.toBe(true)
|
|
167
|
+
const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
|
|
168
|
+
await expect(Promise.resolve(r2)).resolves.toBe(true)
|
|
169
|
+
const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
|
|
170
|
+
await expect(Promise.resolve(r3)).resolves.toBe(true)
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
async function createAndConsume(
|
|
176
|
+
wallet: Wallet,
|
|
177
|
+
root: string,
|
|
178
|
+
kp: TestKeyPair
|
|
179
|
+
): Promise<{ txidPair: bsv.TXIDHexString[]; Beef: bsv.Beef }> {
|
|
180
|
+
let txid1: bsv.TXIDHexString
|
|
181
|
+
let txid2: bsv.TXIDHexString
|
|
182
|
+
const outputSatoshis = 42
|
|
183
|
+
let noSendChange: string[] | undefined
|
|
184
|
+
let inputBEEF: bsv.AtomicBEEF | undefined
|
|
185
|
+
|
|
186
|
+
{
|
|
187
|
+
const createArgs: bsv.CreateActionArgs = {
|
|
188
|
+
description: `${kp.address} of ${root}`,
|
|
189
|
+
outputs: [
|
|
190
|
+
{
|
|
191
|
+
satoshis: outputSatoshis,
|
|
192
|
+
lockingScript: _tu.getLockP2PKH(kp.address).toHex(),
|
|
193
|
+
outputDescription: 'pay fred'
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
options: {
|
|
197
|
+
randomizeOutputs: false,
|
|
198
|
+
signAndProcess: false,
|
|
199
|
+
noSend: true
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const cr = await wallet.createAction(createArgs)
|
|
204
|
+
|
|
205
|
+
noSendChange = cr.noSendChange
|
|
206
|
+
|
|
207
|
+
expect(cr.noSendChange).toBeTruthy()
|
|
208
|
+
expect(cr.sendWithResults).toBeUndefined()
|
|
209
|
+
expect(cr.tx).toBeUndefined()
|
|
210
|
+
expect(cr.txid).toBeUndefined()
|
|
211
|
+
|
|
212
|
+
expect(cr.signableTransaction).toBeTruthy()
|
|
213
|
+
const st = cr.signableTransaction!
|
|
214
|
+
expect(st.reference).toBeTruthy()
|
|
215
|
+
// const tx = Transaction.fromAtomicBEEF(st.tx) // Transaction doesn't support V2 Beef yet.
|
|
216
|
+
const atomicBeef = bsv.Beef.fromBinary(st.tx)
|
|
217
|
+
const tx = atomicBeef.txs[atomicBeef.txs.length - 1].tx!
|
|
218
|
+
for (const input of tx.inputs) {
|
|
219
|
+
expect(atomicBeef.findTxid(input.sourceTXID!)).toBeTruthy()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Spending authorization check happens here...
|
|
223
|
+
//expect(st.amount > 242 && st.amount < 300).toBe(true)
|
|
224
|
+
|
|
225
|
+
// sign and complete
|
|
226
|
+
const signArgs: bsv.SignActionArgs = {
|
|
227
|
+
reference: st.reference,
|
|
228
|
+
spends: {},
|
|
229
|
+
options: {
|
|
230
|
+
returnTXIDOnly: false,
|
|
231
|
+
noSend: true
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const sr = await wallet.signAction(signArgs)
|
|
236
|
+
inputBEEF = sr.tx
|
|
237
|
+
|
|
238
|
+
txid1 = sr.txid!
|
|
239
|
+
// Update the noSendChange txid to final signed value.
|
|
240
|
+
noSendChange = noSendChange!.map(op => `${txid1}.${op.split('.')[1]}`)
|
|
241
|
+
}
|
|
242
|
+
{
|
|
243
|
+
const unlock = _tu.getUnlockP2PKH(kp.privateKey, outputSatoshis)
|
|
244
|
+
const unlockingScriptLength = await unlock.estimateLength()
|
|
245
|
+
|
|
246
|
+
const createArgs: bsv.CreateActionArgs = {
|
|
247
|
+
description: `${kp.address} of ${root}`,
|
|
248
|
+
inputs: [
|
|
249
|
+
{
|
|
250
|
+
outpoint: `${txid1}.0`,
|
|
251
|
+
inputDescription: 'spend ${kp.address} of ${root}',
|
|
252
|
+
unlockingScriptLength
|
|
253
|
+
}
|
|
254
|
+
],
|
|
255
|
+
inputBEEF,
|
|
256
|
+
options: {
|
|
257
|
+
noSendChange,
|
|
258
|
+
// signAndProcess: false, // Not required as an input lacks unlock script...
|
|
259
|
+
noSend: true
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const cr = await wallet.createAction(createArgs)
|
|
264
|
+
|
|
265
|
+
expect(cr.noSendChange).toBeTruthy()
|
|
266
|
+
expect(cr.sendWithResults).toBeUndefined()
|
|
267
|
+
expect(cr.tx).toBeUndefined()
|
|
268
|
+
expect(cr.txid).toBeUndefined()
|
|
269
|
+
expect(cr.signableTransaction).toBeTruthy()
|
|
270
|
+
const st = cr.signableTransaction!
|
|
271
|
+
expect(st.reference).toBeTruthy()
|
|
272
|
+
const atomicBeef: bsv.Beef = bsv.Beef.fromBinary(st.tx)
|
|
273
|
+
const tx = atomicBeef.txs[atomicBeef.txs.length - 1].tx!
|
|
274
|
+
|
|
275
|
+
tx.inputs[0].unlockingScriptTemplate = unlock
|
|
276
|
+
await tx.sign()
|
|
277
|
+
const unlockingScript = tx.inputs[0].unlockingScript!.toHex()
|
|
278
|
+
|
|
279
|
+
const signArgs: bsv.SignActionArgs = {
|
|
280
|
+
reference: st.reference,
|
|
281
|
+
spends: { 0: { unlockingScript } },
|
|
282
|
+
options: {
|
|
283
|
+
returnTXIDOnly: true,
|
|
284
|
+
noSend: true
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const sr = await wallet.signAction(signArgs)
|
|
288
|
+
|
|
289
|
+
txid2 = sr.txid!
|
|
290
|
+
//expect(atomicBeef.isValid()).toBe(true)
|
|
291
|
+
return { txidPair: [txid1, txid2], Beef: atomicBeef }
|
|
292
|
+
}
|
|
293
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { Beef, InternalizeOutput } from '@bsv/sdk'
|
|
2
|
+
import { sdk, StorageKnex } from '../../../src/index.all'
|
|
3
|
+
import { _tu, expectToThrowWERR, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
|
|
4
|
+
import { getBeefForTransaction } from '../../../src/storage/methods/getBeefForTransaction'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* NOT PASSING YET
|
|
8
|
+
*/
|
|
9
|
+
describe.skip('internalizeAction tests', () => {
|
|
10
|
+
jest.setTimeout(99999999)
|
|
11
|
+
|
|
12
|
+
const env = _tu.getEnvFlags('test')
|
|
13
|
+
const ctxs: TestWalletNoSetup[] = []
|
|
14
|
+
|
|
15
|
+
beforeAll(async () => {
|
|
16
|
+
if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('internalizeActionTests'))
|
|
17
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('internalizeActionTests'))
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
afterAll(async () => {
|
|
21
|
+
for (const ctx of ctxs) {
|
|
22
|
+
await ctx.storage.destroy()
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
// Check: 'unproven' or 'completed' status. Any other status is an error.
|
|
27
|
+
// When the transaction already exists, the description is updated. The isOutgoing sense is not changed.
|
|
28
|
+
|
|
29
|
+
test.skip('1_default real wallet data', async () => {
|
|
30
|
+
// 1. construct a normal transaction with user supplied output.
|
|
31
|
+
// 2. dito but user input
|
|
32
|
+
// 3..Repeat 1 & 2 but use sign action
|
|
33
|
+
// Repeat 1-3 but use noSend and then a sendWith.
|
|
34
|
+
// Figure the exact fee cost for transactions 1-3 and start with a noSend transaction that creates a change output with just the right fee amount. Then rebuild 1-3, as second tx, feed it the noSend change from the first tx, confirm no additional change is added or produced, use sendWith to send both as a batch.
|
|
35
|
+
// "basket insertion" Merge Rules:
|
|
36
|
+
// The "default" basket may not be specified as the insertion basket.
|
|
37
|
+
// A change output in the "default" basket may not be target of an insertion into a different basket.
|
|
38
|
+
// These baskets do not affect the wallet's balance and are typed "custom".
|
|
39
|
+
// "wallet payment" Merge Rules:
|
|
40
|
+
// Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
|
|
41
|
+
// Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's amount, and the wallet balance.
|
|
42
|
+
|
|
43
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
44
|
+
try {
|
|
45
|
+
// Prepare StorageGetBeefOptions
|
|
46
|
+
const options: sdk.StorageGetBeefOptions = {
|
|
47
|
+
// Setting 'known' tells it not to include rawTxs it already knows about, just their txids.
|
|
48
|
+
// trustSelf: 'known',
|
|
49
|
+
// Setting knownTxids tells it not to include these rawTxs, just their txids.
|
|
50
|
+
// knownTxids: ['2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122'],
|
|
51
|
+
// False and undefined are equal here so no need for this.
|
|
52
|
+
// ignoreStorage: false,
|
|
53
|
+
// Yes, you expect storage to have the info, so don't use services.
|
|
54
|
+
ignoreServices: true
|
|
55
|
+
// Since you aren't using services and there won't be any newProven (rawTx's with merklePaths previously unknown to storage but required for this beef)
|
|
56
|
+
// ignoreNewProven: false,
|
|
57
|
+
// You don't expect infinitely deep nonsense
|
|
58
|
+
// minProofLevel: 0
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Fetch Beef object
|
|
62
|
+
const beef = await storage.getBeefForTransaction(
|
|
63
|
+
'2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122',
|
|
64
|
+
options
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
//console.log('Beef Object:\n', beef.toLogString())
|
|
68
|
+
|
|
69
|
+
// Ensure Beef object contains valid transactions
|
|
70
|
+
if (beef.txs.length === 0) {
|
|
71
|
+
throw new Error('Beef contains no transactions')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Validate the first transaction in the Beef object
|
|
75
|
+
const firstTx = beef.txs[0]
|
|
76
|
+
if (!firstTx.isValid) {
|
|
77
|
+
console.error('First transaction is invalid:', firstTx)
|
|
78
|
+
throw new Error('Beef contains an invalid transaction')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
expect(beef.atomicTxid).toBeUndefined()
|
|
82
|
+
|
|
83
|
+
// Convert to AtomicBEEF transaction
|
|
84
|
+
const atomicTx = beef.toBinaryAtomic('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
|
|
85
|
+
//console.log('Atomic Transaction:', atomicTx)
|
|
86
|
+
|
|
87
|
+
// {
|
|
88
|
+
// const abeef = Beef.fromBinary(atomicTx)
|
|
89
|
+
// expect(abeef.atomicTxid).toBe('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
|
|
90
|
+
// }
|
|
91
|
+
|
|
92
|
+
// This needs to be a real output (the locking script and derivation bits / key need to work with each other)
|
|
93
|
+
// But it is still a valid test to see what the reaction is to this nonsense :-)
|
|
94
|
+
// Prepare output for internalization
|
|
95
|
+
const output: InternalizeOutput = {
|
|
96
|
+
outputIndex: 2,
|
|
97
|
+
protocol: 'wallet payment',
|
|
98
|
+
paymentRemittance: {
|
|
99
|
+
derivationPrefix: 'y0tgyMJbVWKhds2/MWkDBA==',
|
|
100
|
+
derivationSuffix: 'J1Q1E8re2RbvKONkEiEHDA==',
|
|
101
|
+
senderIdentityKey: '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Internalize Action
|
|
106
|
+
const r = await wallet.internalizeAction({
|
|
107
|
+
tx: atomicTx,
|
|
108
|
+
outputs: [output],
|
|
109
|
+
description: 'Default wallet payment'
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
// Validate result
|
|
113
|
+
//console.log('Internalize Action Result:', r)
|
|
114
|
+
expect(r).toBeDefined()
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error('Test failed with error:', error)
|
|
117
|
+
throw error
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
test('2_default real basket insertion', async () => {
|
|
123
|
+
// 1. construct a normal transaction with user supplied output.
|
|
124
|
+
// 2. dito but user input
|
|
125
|
+
// 3..Repeat 1 & 2 but use sign action
|
|
126
|
+
// Repeat 1-3 but use noSend and then a sendWith.
|
|
127
|
+
// Figure the exact fee cost for transactions 1-3 and start with a noSend transaction that creates a change output with just the right fee amount. Then rebuild 1-3, as second tx, feed it the noSend change from the first tx, confirm no additional change is added or produced, use sendWith to send both as a batch.
|
|
128
|
+
// "basket insertion" Merge Rules:
|
|
129
|
+
// The "default" basket may not be specified as the insertion basket.
|
|
130
|
+
// A change output in the "default" basket may not be target of an insertion into a different basket.
|
|
131
|
+
// These baskets do not affect the wallet's balance and are typed "custom".
|
|
132
|
+
// "wallet payment" Merge Rules:
|
|
133
|
+
// Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
|
|
134
|
+
// Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's amount, and the wallet balance.
|
|
135
|
+
|
|
136
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
137
|
+
try {
|
|
138
|
+
// Prepare StorageGetBeefOptions
|
|
139
|
+
const options: sdk.StorageGetBeefOptions = {
|
|
140
|
+
// Setting 'known' tells it not to include rawTxs it already knows about, just their txids.
|
|
141
|
+
// trustSelf: 'known',
|
|
142
|
+
// Setting knownTxids tells it not to include these rawTxs, just their txids.
|
|
143
|
+
// knownTxids: ['2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122'],
|
|
144
|
+
// False and undefined are equal here so no need for this.
|
|
145
|
+
// ignoreStorage: false,
|
|
146
|
+
// Yes, you expect storage to have the info, so don't use services.
|
|
147
|
+
ignoreServices: true
|
|
148
|
+
// Since you aren't using services and there won't be any newProven (rawTx's with merklePaths previously unknown to storage but required for this beef)
|
|
149
|
+
// ignoreNewProven: false,
|
|
150
|
+
// You don't expect infinitely deep nonsense
|
|
151
|
+
// minProofLevel: 0
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Fetch Beef object
|
|
155
|
+
const beef = await storage.getBeefForTransaction(
|
|
156
|
+
'a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7',
|
|
157
|
+
options
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
//console.log('Beef Object:\n', beef.toLogString())
|
|
161
|
+
|
|
162
|
+
// Ensure Beef object contains valid transactions
|
|
163
|
+
if (beef.txs.length === 0) {
|
|
164
|
+
throw new Error('Beef contains no transactions')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Validate the first transaction in the Beef object
|
|
168
|
+
const firstTx = beef.txs[0]
|
|
169
|
+
if (!firstTx.isValid) {
|
|
170
|
+
console.error('First transaction is invalid:', firstTx)
|
|
171
|
+
throw new Error('Beef contains an invalid transaction')
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
expect(beef.atomicTxid).toBeUndefined()
|
|
175
|
+
|
|
176
|
+
// Convert to AtomicBEEF transaction
|
|
177
|
+
const atomicTx = beef.toBinaryAtomic('a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7')
|
|
178
|
+
//console.log('Atomic Transaction:', atomicTx)
|
|
179
|
+
|
|
180
|
+
{
|
|
181
|
+
const abeef = Beef.fromBinary(atomicTx)
|
|
182
|
+
expect(abeef.atomicTxid).toBe('a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7')
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// This needs to be a real output (the locking script and derivation bits / key need to work with each other)
|
|
186
|
+
// But it is still a valid test to see what the reaction is to this nonsense :-)
|
|
187
|
+
// Prepare output for internalization
|
|
188
|
+
const output: InternalizeOutput = {
|
|
189
|
+
outputIndex: 0,
|
|
190
|
+
protocol: 'basket insertion',
|
|
191
|
+
// export interface BasketInsertion {
|
|
192
|
+
// basket: BasketStringUnder300Bytes
|
|
193
|
+
// customInstructions?: string
|
|
194
|
+
// tags?: OutputTagStringUnder300Bytes[]
|
|
195
|
+
// }
|
|
196
|
+
insertionRemittance: {
|
|
197
|
+
basket: 'babbage-token-access',
|
|
198
|
+
tags: [
|
|
199
|
+
'babbage_originator todo.babbage.systems',
|
|
200
|
+
'babbage_action_originator projectbabbage.com',
|
|
201
|
+
'babbage_protocolname todo list',
|
|
202
|
+
'babbage_protocolsecuritylevel 2',
|
|
203
|
+
'babbage_counterparty self'
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Internalize Action
|
|
209
|
+
const r = await wallet.internalizeAction({
|
|
210
|
+
tx: atomicTx,
|
|
211
|
+
outputs: [output],
|
|
212
|
+
description: 'Default basket insertion'
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
// Validate result
|
|
216
|
+
//console.log('Internalize Action Result:', r)
|
|
217
|
+
expect(r).toBeDefined()
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error('Test failed with error:', error)
|
|
220
|
+
throw error
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
test.skip('3_default', async () => {
|
|
226
|
+
for (const { wallet, activeStorage: storage } of ctxs) {
|
|
227
|
+
try {
|
|
228
|
+
// Prepare StorageGetBeefOptions
|
|
229
|
+
const options: sdk.StorageGetBeefOptions = {
|
|
230
|
+
ignoreServices: true
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Fetch Beef object
|
|
234
|
+
const beef = await storage.getBeefForTransaction(
|
|
235
|
+
'2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122',
|
|
236
|
+
options
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
//console.log('Beef Object:', beef)
|
|
240
|
+
|
|
241
|
+
// Ensure Beef object contains valid transactions
|
|
242
|
+
if (beef.txs.length === 0) {
|
|
243
|
+
throw new Error('Beef contains no transactions')
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Validate the first transaction in the Beef object
|
|
247
|
+
const firstTx = beef.txs[0]
|
|
248
|
+
if (!firstTx.isValid) {
|
|
249
|
+
console.error('First transaction is invalid:', firstTx)
|
|
250
|
+
throw new Error('Beef contains an invalid transaction')
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
expect(beef.atomicTxid).toBeDefined()
|
|
254
|
+
|
|
255
|
+
// Convert to AtomicBEEF transaction
|
|
256
|
+
const atomicTx = beef.toBinaryAtomic('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
|
|
257
|
+
//console.log('Atomic Transaction:', atomicTx)
|
|
258
|
+
|
|
259
|
+
// Prepare output for internalization
|
|
260
|
+
const output: InternalizeOutput = {
|
|
261
|
+
outputIndex: 2,
|
|
262
|
+
protocol: 'basket insertion',
|
|
263
|
+
paymentRemittance: {
|
|
264
|
+
derivationPrefix: 'y0tgyMJbVWKhds2/MWkDBA==',
|
|
265
|
+
derivationSuffix: 'J1Q1E8re2RbvKONkEiEHDA==',
|
|
266
|
+
senderIdentityKey: '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Internalize Action
|
|
271
|
+
const r = await wallet.internalizeAction({
|
|
272
|
+
tx: atomicTx,
|
|
273
|
+
outputs: [output],
|
|
274
|
+
description: 'Default test description'
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
// Validate result
|
|
278
|
+
//console.log('Internalize Action Result:', r)
|
|
279
|
+
expect(r).toBeDefined()
|
|
280
|
+
} catch (error) {
|
|
281
|
+
console.error('Test failed with error:', error)
|
|
282
|
+
throw error
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
})
|
|
286
|
+
})
|