@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,123 @@
|
|
|
1
|
+
import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
|
|
2
|
+
import { sdk, wait } from '../../index.client'
|
|
3
|
+
import { ARC } from '../providers/ARC'
|
|
4
|
+
import { Beef, BeefTx } from '@bsv/sdk'
|
|
5
|
+
import { arcDefaultUrl } from '../createDefaultWalletServicesOptions'
|
|
6
|
+
import { Setup } from '../../index.all'
|
|
7
|
+
|
|
8
|
+
describe('ARC tests', () => {
|
|
9
|
+
jest.setTimeout(99999999)
|
|
10
|
+
|
|
11
|
+
const envTest = _tu.getEnv('test')
|
|
12
|
+
const arcTest = new ARC(arcDefaultUrl(envTest.chain), {
|
|
13
|
+
apiKey: envTest.taalApiKey
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const envMain = _tu.getEnv('main')
|
|
17
|
+
const arcMain = new ARC(arcDefaultUrl(envMain.chain), {
|
|
18
|
+
apiKey: envMain.taalApiKey
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test.skip('0 double spend', async () => {
|
|
22
|
+
const arc = arcTest
|
|
23
|
+
|
|
24
|
+
const beef = Beef.fromString(testnetDoubleSpendBeef)
|
|
25
|
+
const txids = [beef.txs.slice(-1)[0].txid]
|
|
26
|
+
const r = await arc.postBeef(beef, txids)
|
|
27
|
+
expect(r.status === 'error').toBe(true)
|
|
28
|
+
expect(r.txidResults[0].doubleSpend).toBe(true)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test.skip('7 postRawTx testnet', async () => {
|
|
32
|
+
await postRawTxTest('test', arcTest)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test.skip('8 postRawTx mainnet', async () => {
|
|
36
|
+
await postRawTxTest('main', arcMain)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test.skip('9 postBeef testnet', async () => {
|
|
40
|
+
const r = await postBeefTest('test', arcTest)
|
|
41
|
+
console.log(`9 postBeef testnet done ${r}`)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test.skip('10 postBeef mainnet', async () => {
|
|
45
|
+
const r = await postBeefTest('main', arcMain)
|
|
46
|
+
console.log(`10 postBeef mainnet done ${r}`)
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
async function postBeefTest(chain: sdk.Chain, arc: ARC): Promise<string> {
|
|
51
|
+
if (Setup.noEnv(chain)) return 'skipped'
|
|
52
|
+
const c = await _tu.createNoSendTxPair(chain)
|
|
53
|
+
|
|
54
|
+
const txids = [c.txidDo, c.txidUndo]
|
|
55
|
+
|
|
56
|
+
const r = await arc.postBeef(c.beef, txids)
|
|
57
|
+
expect(r.status).toBe('success')
|
|
58
|
+
for (const txid of txids) {
|
|
59
|
+
const tr = r.txidResults.find(tx => tx.txid === txid)
|
|
60
|
+
expect(tr).not.toBeUndefined()
|
|
61
|
+
expect(tr!.status).toBe('success')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// replace Undo transaction with double spend transaction and send again.
|
|
65
|
+
const beef2 = c.beef.clone()
|
|
66
|
+
beef2.txs[beef2.txs.length - 1] = BeefTx.fromTx(c.doubleSpendTx)
|
|
67
|
+
const txids2 = [c.txidDo, c.doubleSpendTx.id('hex')]
|
|
68
|
+
|
|
69
|
+
const r2 = await arc.postBeef(beef2, txids2)
|
|
70
|
+
expect(r2.status).toBe('error')
|
|
71
|
+
for (const txid of txids2) {
|
|
72
|
+
const tr = r2.txidResults.find(tx => tx.txid === txid)
|
|
73
|
+
expect(tr).not.toBeUndefined()
|
|
74
|
+
if (txid === c.txidDo) {
|
|
75
|
+
expect(tr!.status).toBe('success')
|
|
76
|
+
} else {
|
|
77
|
+
expect(tr!.status).toBe('error')
|
|
78
|
+
expect(tr!.doubleSpend).toBe(true)
|
|
79
|
+
expect(tr!.competingTxs).toEqual([c.txidUndo])
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return 'passed'
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function postRawTxTest(chain: sdk.Chain, arc: ARC): Promise<void> {
|
|
86
|
+
if (Setup.noEnv(chain)) return
|
|
87
|
+
const c = await _tu.createNoSendTxPair(chain)
|
|
88
|
+
|
|
89
|
+
const rawTxDo = c.beef.findTxid(c.txidDo)!.tx!.toHex()
|
|
90
|
+
const rawTxUndo = c.beef.findTxid(c.txidUndo)!.tx!.toHex()
|
|
91
|
+
|
|
92
|
+
const rDo = await arc.postRawTx(rawTxDo)
|
|
93
|
+
expect(rDo.status).toBe('success')
|
|
94
|
+
expect(rDo.txid).toBe(c.txidDo)
|
|
95
|
+
|
|
96
|
+
await wait(1000)
|
|
97
|
+
|
|
98
|
+
const rUndo = await arc.postRawTx(rawTxUndo)
|
|
99
|
+
expect(rUndo.status).toBe('success')
|
|
100
|
+
expect(rUndo.txid).toBe(c.txidUndo)
|
|
101
|
+
expect(rUndo.doubleSpend).not.toBe(true)
|
|
102
|
+
|
|
103
|
+
await wait(1000)
|
|
104
|
+
|
|
105
|
+
{
|
|
106
|
+
// Send same transaction again...
|
|
107
|
+
const rUndo = await arc.postRawTx(rawTxUndo)
|
|
108
|
+
expect(rUndo.status).toBe('success')
|
|
109
|
+
expect(rUndo.txid).toBe(c.txidUndo)
|
|
110
|
+
expect(rUndo.doubleSpend).not.toBe(true)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await wait(1000)
|
|
114
|
+
|
|
115
|
+
// Confirm double spend detection.
|
|
116
|
+
const rDouble = await arc.postRawTx(c.doubleSpendTx.toHex())
|
|
117
|
+
expect(rDouble.status).toBe('error')
|
|
118
|
+
expect(rDouble.doubleSpend).toBe(true)
|
|
119
|
+
expect(rDouble.competingTxs![0]).toBe(c.txidUndo)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const testnetDoubleSpendBeef =
|
|
123
|
+
'0100beef01fe65631900020200009df812619ae232d2363d91516ab3e811211192933526bbc2aee71b54ccb236d10102462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a361801010076a3297928f6841bcb656e91225540e87c65f67d8ec12bc768d7656eb7561b3d02010000000159617a9d17562f7c9765e5dfa6a9a393aa2809ca6166a3d7a31c09efcc5070141f0000006a47304402200a528145a67ba1879b88a093cb711f79f04413a81d5678f314302e36a7f59e43022010bc4bb3c2574052c50bbdc8a05c31fb39e69280656b34f5dc22e2ceadc3bb4a412102fd4200bf389d16479b3d06f97fee0752f2c3b9dc29fb3ddce2b327d851b8902bffffffff0204000000000000001976a9140df1a69c834bb7d9bb5b2b7d6a34e5a401db3e1688ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000001000100000001462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a3618000000006a47304402204183bbfdcf11d50907b91f5e70ea8f81228501ce84e24af75c8d984682d094dc022029caa8f7e5acb4990bbeafee523a3c4a99b78e98b9e5c41349147b099679d4ae412103b76389eea6494c2c30443cba9d59b9dba05fb04e467bc94272629615b87a429fffffffff0202000000000000001976a91476d851e59fcb4ee0ebe6947496db3a393b08e49c88ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000000'
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
|
|
2
|
+
import { defaultHttpClient, HttpClientRequestOptions } from '@bsv/sdk'
|
|
3
|
+
|
|
4
|
+
describe('ARC tests', () => {
|
|
5
|
+
jest.setTimeout(99999999)
|
|
6
|
+
|
|
7
|
+
const envMain = _tu.getEnv('main')
|
|
8
|
+
test('11 post to TAAL for timeout', async () => {
|
|
9
|
+
const httpClient = defaultHttpClient()
|
|
10
|
+
const url = `https://arc.taal.com/v1/tx`
|
|
11
|
+
|
|
12
|
+
const headers: Record<string, string> = {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'XDeployment-ID': 'wallet-toolbox-test11',
|
|
15
|
+
Authorization: `Bearer ${envMain.taalApiKey}`
|
|
16
|
+
}
|
|
17
|
+
const requestOptions: HttpClientRequestOptions = {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers,
|
|
20
|
+
data: { rawTx: beef905631 },
|
|
21
|
+
signal: AbortSignal.timeout(100)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const response = await httpClient.request(url, requestOptions)
|
|
26
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
27
|
+
} catch (error: any) {
|
|
28
|
+
console.log('Error posting to TAAL:', error.message)
|
|
29
|
+
expect(error.code).toBe('ABORT_ERR')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
requestOptions.signal = AbortSignal.timeout(30000) // 30 seconds timeout
|
|
34
|
+
const response = await httpClient.request(url, requestOptions)
|
|
35
|
+
expect(response.status).toBe(200)
|
|
36
|
+
} catch (error: any) {
|
|
37
|
+
console.log('Error posting to TAAL:', error.message)
|
|
38
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('12 post to GorillaPool for timeout', async () => {
|
|
43
|
+
const httpClient = defaultHttpClient()
|
|
44
|
+
const url = `https://arc.gorillapool.io/v1/tx`
|
|
45
|
+
|
|
46
|
+
const headers: Record<string, string> = {
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
'XDeployment-ID': 'wallet-toolbox-test11'
|
|
49
|
+
//Authorization: `Bearer ${envMain.gorillaPoolApiKey}`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const requestOptions: HttpClientRequestOptions = {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers,
|
|
55
|
+
data: { rawTx: beef905631 },
|
|
56
|
+
signal: AbortSignal.timeout(100)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const response = await httpClient.request(url, requestOptions)
|
|
61
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
62
|
+
} catch (error: any) {
|
|
63
|
+
console.log('Error posting to TAAL:', error.message)
|
|
64
|
+
expect(error.code).toBe('ABORT_ERR')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
requestOptions.signal = AbortSignal.timeout(30000) // 30 seconds timeout
|
|
69
|
+
const response = await httpClient.request(url, requestOptions)
|
|
70
|
+
expect(response.status).toBe(200)
|
|
71
|
+
} catch (error: any) {
|
|
72
|
+
console.log('Error posting to TAAL:', error.message)
|
|
73
|
+
expect(true).toBe(false) // Should not reach here, expect an error
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const beef905631 =
|
|
79
|
+
'0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
|
|
2
|
+
import { sdk, wait } from '../../index.client'
|
|
3
|
+
import { ARC } from '../providers/ARC'
|
|
4
|
+
import { Beef, BeefTx } from '@bsv/sdk'
|
|
5
|
+
import { arcGorillaPoolUrl } from '../createDefaultWalletServicesOptions'
|
|
6
|
+
import { Setup } from '../../index.all'
|
|
7
|
+
|
|
8
|
+
describe('ArcGorillaPool tests', () => {
|
|
9
|
+
jest.setTimeout(99999999)
|
|
10
|
+
|
|
11
|
+
const env = _tu.getEnv('main')
|
|
12
|
+
const arc = new ARC(arcGorillaPoolUrl(env.chain)!, {
|
|
13
|
+
apiKey: ''
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test.skip('0 double spend', async () => {
|
|
17
|
+
const beef = Beef.fromString(testnetDoubleSpendBeef)
|
|
18
|
+
const txids = [beef.txs.slice(-1)[0].txid]
|
|
19
|
+
const r = await arc.postBeef(beef, txids)
|
|
20
|
+
expect(r.status === 'error').toBe(true)
|
|
21
|
+
expect(r.txidResults[0].doubleSpend).toBe(true)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test.skip('1 postRawTx', async () => {
|
|
25
|
+
const r = await postRawTxTest('main', arc)
|
|
26
|
+
logger(`2 postBeef mainnet done ${r}`)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('2 postBeef', async () => {
|
|
30
|
+
const r = await postBeefTest('main', arc)
|
|
31
|
+
logger(`2 postBeef mainnet done ${r}`)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
async function postBeefTest(chain: sdk.Chain, arc: ARC): Promise<string> {
|
|
36
|
+
if (Setup.noEnv(chain)) return 'skipped'
|
|
37
|
+
const c = await _tu.createNoSendTxPair(chain)
|
|
38
|
+
|
|
39
|
+
const txids = [c.txidDo, c.txidUndo]
|
|
40
|
+
|
|
41
|
+
const r = await arc.postBeef(c.beef, txids)
|
|
42
|
+
expect(r.status).toBe('success')
|
|
43
|
+
for (const txid of txids) {
|
|
44
|
+
const tr = r.txidResults.find(tx => tx.txid === txid)
|
|
45
|
+
expect(tr).not.toBeUndefined()
|
|
46
|
+
expect(tr!.status).toBe('success')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// replace Undo transaction with double spend transaction and send again.
|
|
50
|
+
const beef2 = c.beef.clone()
|
|
51
|
+
beef2.txs[beef2.txs.length - 1] = BeefTx.fromTx(c.doubleSpendTx)
|
|
52
|
+
const txids2 = [c.txidDo, c.doubleSpendTx.id('hex')]
|
|
53
|
+
|
|
54
|
+
const r2 = await arc.postBeef(beef2, txids2)
|
|
55
|
+
expect(r2.status).toBe('error')
|
|
56
|
+
for (const txid of txids2) {
|
|
57
|
+
const tr = r2.txidResults.find(tx => tx.txid === txid)
|
|
58
|
+
expect(tr).not.toBeUndefined()
|
|
59
|
+
if (txid === c.txidDo) {
|
|
60
|
+
expect(tr!.status).toBe('success')
|
|
61
|
+
} else {
|
|
62
|
+
expect(tr!.status).toBe('error')
|
|
63
|
+
expect(tr!.doubleSpend).toBe(true)
|
|
64
|
+
expect(tr!.competingTxs).toEqual([c.txidUndo])
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return 'passed'
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function postRawTxTest(chain: sdk.Chain, arc: ARC): Promise<void> {
|
|
71
|
+
if (Setup.noEnv(chain)) return
|
|
72
|
+
const c = await _tu.createNoSendTxPair(chain)
|
|
73
|
+
|
|
74
|
+
const rawTxDo = c.beef.findTxid(c.txidDo)!.tx!.toHex()
|
|
75
|
+
const rawTxUndo = c.beef.findTxid(c.txidUndo)!.tx!.toHex()
|
|
76
|
+
|
|
77
|
+
const rDo = await arc.postRawTx(rawTxDo)
|
|
78
|
+
expect(rDo.status).toBe('success')
|
|
79
|
+
expect(rDo.txid).toBe(c.txidDo)
|
|
80
|
+
|
|
81
|
+
await wait(1000)
|
|
82
|
+
|
|
83
|
+
const rUndo = await arc.postRawTx(rawTxUndo)
|
|
84
|
+
expect(rUndo.status).toBe('success')
|
|
85
|
+
expect(rUndo.txid).toBe(c.txidUndo)
|
|
86
|
+
expect(rUndo.doubleSpend).not.toBe(true)
|
|
87
|
+
|
|
88
|
+
await wait(1000)
|
|
89
|
+
|
|
90
|
+
{
|
|
91
|
+
// Send same transaction again...
|
|
92
|
+
const rUndo = await arc.postRawTx(rawTxUndo)
|
|
93
|
+
expect(rUndo.status).toBe('success')
|
|
94
|
+
expect(rUndo.txid).toBe(c.txidUndo)
|
|
95
|
+
expect(rUndo.doubleSpend).not.toBe(true)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
await wait(1000)
|
|
99
|
+
|
|
100
|
+
// Confirm double spend detection.
|
|
101
|
+
const rDouble = await arc.postRawTx(c.doubleSpendTx.toHex())
|
|
102
|
+
expect(rDouble.status).toBe('error')
|
|
103
|
+
expect(rDouble.doubleSpend).toBe(true)
|
|
104
|
+
expect(rDouble.competingTxs![0]).toBe(c.txidUndo)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const testnetDoubleSpendBeef =
|
|
108
|
+
'0100beef01fe65631900020200009df812619ae232d2363d91516ab3e811211192933526bbc2aee71b54ccb236d10102462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a361801010076a3297928f6841bcb656e91225540e87c65f67d8ec12bc768d7656eb7561b3d02010000000159617a9d17562f7c9765e5dfa6a9a393aa2809ca6166a3d7a31c09efcc5070141f0000006a47304402200a528145a67ba1879b88a093cb711f79f04413a81d5678f314302e36a7f59e43022010bc4bb3c2574052c50bbdc8a05c31fb39e69280656b34f5dc22e2ceadc3bb4a412102fd4200bf389d16479b3d06f97fee0752f2c3b9dc29fb3ddce2b327d851b8902bffffffff0204000000000000001976a9140df1a69c834bb7d9bb5b2b7d6a34e5a401db3e1688ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000001000100000001462876eec65d9aa26d957421c5cc8dd9119b61177242b9dd814fb190fd0a3618000000006a47304402204183bbfdcf11d50907b91f5e70ea8f81228501ce84e24af75c8d984682d094dc022029caa8f7e5acb4990bbeafee523a3c4a99b78e98b9e5c41349147b099679d4ae412103b76389eea6494c2c30443cba9d59b9dba05fb04e467bc94272629615b87a429fffffffff0202000000000000001976a91476d851e59fcb4ee0ebe6947496db3a393b08e49c88ac01000000000000001976a91423f2562a8092ed24eddc77c74387b44c561692a188ac0000000000'
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { convertProofToMerklePath, sdk, Services, TscMerkleProofApi } from '../../index.client'
|
|
2
|
+
import { Bitails, BitailsMerkleProof } from '../providers/Bitails'
|
|
3
|
+
|
|
4
|
+
describe('bitrails tests', () => {
|
|
5
|
+
jest.setTimeout(99999999)
|
|
6
|
+
|
|
7
|
+
test('0 verify merkle proof to merkle path', async () => {
|
|
8
|
+
const mp = convertProofToMerklePath('068f2ce0d01b5f1e7c7a07c209c3c67d583aeae83e11e92801b51c36f81d6b67', proof2)
|
|
9
|
+
const root = mp.computeRoot('068f2ce0d01b5f1e7c7a07c209c3c67d583aeae83e11e92801b51c36f81d6b67')
|
|
10
|
+
expect(root).toBe(proof2merkleRoot)
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('1 ', async () => {
|
|
14
|
+
const chain: sdk.Chain = 'main'
|
|
15
|
+
const bitails = new Bitails(chain)
|
|
16
|
+
const services = new Services(chain)
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Bitails prunes historical data, only recent txids are available.
|
|
20
|
+
*/
|
|
21
|
+
for (const txid of [
|
|
22
|
+
'068f2ce0d01b5f1e7c7a07c209c3c67d583aeae83e11e92801b51c36f81d6b67',
|
|
23
|
+
'a65c2663d817da6474f7805cf103be6259aae16b01468711552b737c41768c30',
|
|
24
|
+
'243fb25b94b5ef2f8554cd10d105005f51ff543d8b7a498c4e46ed304c3da24a'
|
|
25
|
+
]) {
|
|
26
|
+
const mp = await bitails.getMerklePath(txid, services)
|
|
27
|
+
if (mp.merklePath) {
|
|
28
|
+
const root = mp.merklePath.computeRoot(txid)
|
|
29
|
+
expect(root).toBe(proof2merkleRoot)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const proof2merkleRoot = '22b294aac4c3f6f4fdae30dc4f46f68f90feb94f03531c32bcf2ce33be5d4cb0'
|
|
36
|
+
|
|
37
|
+
const proof2: TscMerkleProofApi = {
|
|
38
|
+
index: 9443,
|
|
39
|
+
height: 742198,
|
|
40
|
+
nodes: [
|
|
41
|
+
'463c37bf0ccde321b1dc8ee857e03b8eafe76e6b1803cc3a774cfef61c50c37b',
|
|
42
|
+
'debba259db996d6ca7c4fcfd168d3afe6bfdddab93298466d53ed0421634f405',
|
|
43
|
+
'6335d744771789ef69545b0f449bcde92ae7b9920e775a591fecc7fcfa37846e',
|
|
44
|
+
'38366b3723e8f166fbfe5d7528a57885f47aa25a8296c0679832a95c1e6d2f61',
|
|
45
|
+
'5a999d2186d10a787c3397938fd97a4b3e833aab8cff2ce24cfce7589b9b706b',
|
|
46
|
+
'db97fbd581b8769602c6079e7fe10eb34cd99b844598b31441018ac21babd7e7',
|
|
47
|
+
'583e044e2bbc6b19993e73c3363a8ce3b4580a54510524489daadc6c82205f5a',
|
|
48
|
+
'ba5d97e4fbedb84682f65b254c56f5826f1dc65bd376dc1660f23b81c4035b1d',
|
|
49
|
+
'bfa39460ee7a8293698e41134a53cfc5ba0054416ca092d79ecbf93ae2b8b71b',
|
|
50
|
+
'8f3d186687f3f8186c4cbddcf263bbb4b58e3c279e55f9def048076faff0cc83',
|
|
51
|
+
'287790c47a0044e8e51ee60df33d4d23b972b5a51d8e9be7ac8b635b9f1e7ffc',
|
|
52
|
+
'19444e7ad68681d847d4d88989efa5f13afa46d7cbb47e8ce91876555c3e414d',
|
|
53
|
+
'6d71f472dabd52216a3cb24090d580baed96497b449876c199f48ed07f5ea2b0',
|
|
54
|
+
'af4c17b677b0c7b4d85e7331b4e43fc16f9a7024c9417d7854c55a096ac098b3'
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Services } from '../../index.client'
|
|
2
|
+
|
|
3
|
+
describe('getRawTx service tests', () => {
|
|
4
|
+
jest.setTimeout(99999999)
|
|
5
|
+
|
|
6
|
+
test('0', async () => {
|
|
7
|
+
const options = Services.createDefaultOptions('main')
|
|
8
|
+
const services = new Services(options)
|
|
9
|
+
|
|
10
|
+
const txid = '9cce99686bc8621db439b7150dd5b3b269e4b0628fd75160222c417d6f2b95e4'
|
|
11
|
+
const r = await services.getMerklePath(txid)
|
|
12
|
+
expect(r.header?.height).toBe(877599)
|
|
13
|
+
expect(r.merklePath).toBeTruthy()
|
|
14
|
+
})
|
|
15
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Services } from '../../index.client'
|
|
2
|
+
|
|
3
|
+
describe('getRawTx service tests', () => {
|
|
4
|
+
jest.setTimeout(99999999)
|
|
5
|
+
|
|
6
|
+
test('0', async () => {
|
|
7
|
+
const options = Services.createDefaultOptions('test')
|
|
8
|
+
const services = new Services(options)
|
|
9
|
+
|
|
10
|
+
const r = await services.getRawTx('c3b6ee8b83a4261771ede9b0d2590d2f65853239ee34f84cdda36524ce317d76')
|
|
11
|
+
expect(r).toBeTruthy()
|
|
12
|
+
})
|
|
13
|
+
})
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Beef, BeefTx } from '@bsv/sdk'
|
|
2
|
+
import { Services } from '../../index.client'
|
|
3
|
+
import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
|
|
4
|
+
import { sdk, Setup } from '../../index.all'
|
|
5
|
+
|
|
6
|
+
describe.skip('postBeef service tests', () => {
|
|
7
|
+
jest.setTimeout(99999999)
|
|
8
|
+
|
|
9
|
+
test('0 postBeef mainnet', async () => {
|
|
10
|
+
if (Setup.noEnv('main')) return
|
|
11
|
+
const services = createServices('main')
|
|
12
|
+
await postBeefTest(services)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
test('1 postBeef testnet', async () => {
|
|
16
|
+
if (Setup.noEnv('test')) return
|
|
17
|
+
const services = createServices('test')
|
|
18
|
+
await postBeefTest(services)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Test to verify deprioritization of a postBeef service that times out.
|
|
23
|
+
*/
|
|
24
|
+
test.skip('2 postBeef mainnet timeout', async () => {
|
|
25
|
+
if (Setup.noEnv('main')) return
|
|
26
|
+
const services = createServices('main')
|
|
27
|
+
const beef = Beef.fromString(beefTimeout)
|
|
28
|
+
const txid = beef.txs.slice(-1)[0].txid
|
|
29
|
+
const svcs0 = [...services.postBeefServices.services]
|
|
30
|
+
const r = await services.postBeef(beef, [txid])
|
|
31
|
+
const svcs1 = [...services.postBeefServices.services]
|
|
32
|
+
expect(svcs0[1].name).toBe('TaalArcBeef')
|
|
33
|
+
expect(svcs1.slice(-1)[0].name).toBe('TaalArcBeef')
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const beefTimeout =
|
|
38
|
+
'0100beef01fe9fd10d000d02fdfe0300724e96684b24c87532f99023087423b97ffdff2d2f5ef0297a7d6ea954e48964fdff03026bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef01fdfe0100202bf5ecef0fb931ce451e514443c2026f58889c5a630a5d87c02f3eaca080e601fdfe000008ef522990bf4cb377cd013214b50689424b2031bd2c8fb758668aba3a007011017e0016924511d5773ce8030fc54595e4a1028fc9c071e5624205cb53faa5fb286680013e004c3dfbf8f8dd000521fc7121cc03c2cd2007a4424d8d3018671bc0fc32f5e1ba011e007c676e284227ecf36dac58506ebb0fc5833212860832d4d826803bffd74a2b21010e000b0f8c43e4beab689c14cb59b3f1cf93efe33905c22f40a9579c6b6e46cbd573010600f7734085b02e93f104d66d3fa5d864f4a1cc26cdb95fdfc450e34a3d8f13b5f201020041fe0c3fd297e1d83da186868cd92d374ddb3902d7d1054705df5165c0c93e8a0100007ed98d26a6f0d8d2043301cc9bfb255497c22566a59b83dade97240fa406a525010100a0561fe617c0ae0f34ee659a0d714c5b0a97e8c7cf1198edd56bfe8e8b15b7540101007bf537219f147fdedb4a5b8e0bb8a9b9c61a7bca3d05fe4ec84f85b11e21098d0101000198f7ae218e00137045252fb5f0d02c0c1a77e1ef686035dc22329b85f3e5c5020100000001b5db5dbd327c692ca8c9d5fdf7cc967f46769bfc0f481ea594a07fc60b8e9246010000006a4730440220537dcf526cf749d95c322e5daaf4479c15dbbbffa008a25560cbf833e6713fb902203f114c021d768ce9c5ea2094de296593b00926b59f64e37a6a39159607e4d05e412103852907f4bce12316784ea0ef7ac2b6a9d853a066d005ea5961750902025982a4ffffffff0214000000000000001976a914226cdae741a5e1258272bf2532669b54e7a813f988ac0100000000000000fdc5012102e01ef1e893d1164d05595f3979721d09e7dc8b971172df4bbceb56e72b7ed544ac3e314fc657a97ff276becda888ede531346172571a61491128c34c7df7ed5856e83db22843c1501de00fe93cddb47403e532f2492d4551bd974f0c7136ea533adb8d21e38f01080ce0c3fdbcbbb243b73ec0856836a423d368d100f97dafc690c0aa55534a632c612a1a0023886ac8dd2ba704d396b60894a11835eb13a01199d83bc1d19780186959f04d5408849d997fc07d99a58f9f0110b1e5ee52fe87606578c0cc33886597cca074d19b777de331fac609dea2b4108e5b95ec5b58529e5736101e54b537dc76eb3e5c9bfc4d793af8e8caa0550ce2b6ca9c1c10cedfe8f8e63c109f26aab8f9cb5f9e3456d9351d33fadd57e6a5a8973ad0ec148c27a0d1fecc720d222cedb8fbbd30af317298fd8347f7845f3edc4883ddfcd2a0c93665cff964a816f1c3a89b1c5dca7d6eb22326c023f316534299b93e836a49569a885c7ebe416fad632a1a0a4d506806d11c133bc2e8364730450221008975ecf19934195f972fbe7b4d1e6993d2186985aee919810bfaaf439ddf6cb802201946afd710f044e36932bb6d59d6191daaf044905e4b24a9f9ded193c4ac6d236d6d6d7500000000010001000000016bafadb339fe2bf651958e94235251d68ca0784e45209265a0b2f1928e6f48ef000000006b48304502210082b15b0e46da56060c3e508dbbe20c53a6282cc2c3ef2c8f7bd90c9e1748a86a02200e052abe131fb1aea3fdccf2f9ddbb59230aa99ebd7b55655388dbc6710fd15541210349c86999cb3a992c78e3cf72835071e3ca49d16c41e7c0a89d678c1a3cdc8bc8ffffffff0201000000000000001976a914554a6bf9c0203d0c2c75264786d7e8b05f143e0888ac12000000000000001976a914365fb266360071280a82ed90e6a9a85d8d35f74888ac0000000000'
|
|
39
|
+
|
|
40
|
+
function createServices(chain: sdk.Chain): Services {
|
|
41
|
+
const env = _tu.getEnv(chain)
|
|
42
|
+
const options = Services.createDefaultOptions(chain)
|
|
43
|
+
|
|
44
|
+
if (env.taalApiKey) {
|
|
45
|
+
options.taalApiKey = env.taalApiKey
|
|
46
|
+
options.arcConfig.apiKey = env.taalApiKey
|
|
47
|
+
}
|
|
48
|
+
if (env.whatsonchainApiKey) options.whatsOnChainApiKey = env.whatsonchainApiKey
|
|
49
|
+
if (env.bitailsApiKey) options.bitailsApiKey = env.bitailsApiKey
|
|
50
|
+
logger(`
|
|
51
|
+
API Keys:
|
|
52
|
+
TAAL ${options.taalApiKey!.slice(0, 20)}
|
|
53
|
+
WHATSONCHAIN ${options.whatsOnChainApiKey!.slice(0, 20)}
|
|
54
|
+
BITAILS ${options.bitailsApiKey!.slice(0, 20)}
|
|
55
|
+
`)
|
|
56
|
+
|
|
57
|
+
const services = new Services(options)
|
|
58
|
+
return services
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function postBeefTest(services: Services) {
|
|
62
|
+
const chain = services.chain
|
|
63
|
+
if (Setup.noEnv(chain)) return
|
|
64
|
+
const c = await _tu.createNoSendTxPair(chain)
|
|
65
|
+
|
|
66
|
+
const txids = [c.txidDo, c.txidUndo]
|
|
67
|
+
|
|
68
|
+
const rs = await services.postBeef(c.beef, txids)
|
|
69
|
+
for (const r of rs) {
|
|
70
|
+
const log = r.status === 'success' ? logger : console.log
|
|
71
|
+
log(`r.notes = ${JSON.stringify(r.notes)}`)
|
|
72
|
+
log(`r.txidResults = ${JSON.stringify(r.txidResults)}`)
|
|
73
|
+
expect(r.status).toBe('success')
|
|
74
|
+
for (const txid of txids) {
|
|
75
|
+
const tr = r.txidResults.find(tx => tx.txid === txid)
|
|
76
|
+
expect(tr).not.toBeUndefined()
|
|
77
|
+
expect(tr!.status).toBe('success')
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// replace Undo transaction with double spend transaction and send again.
|
|
82
|
+
const beef2 = c.beef.clone()
|
|
83
|
+
beef2.txs[beef2.txs.length - 1] = BeefTx.fromTx(c.doubleSpendTx)
|
|
84
|
+
const txids2 = [c.txidDo, c.doubleSpendTx.id('hex')]
|
|
85
|
+
|
|
86
|
+
const r2s = await services.postBeef(beef2, txids2)
|
|
87
|
+
for (const r2 of r2s) {
|
|
88
|
+
const log = r2.status === 'error' ? logger : console.log
|
|
89
|
+
log(`r2.notes = ${JSON.stringify(r2.notes)}`)
|
|
90
|
+
log(`r2.txidResults = ${JSON.stringify(r2.txidResults)}`)
|
|
91
|
+
expect(r2.status).toBe('error')
|
|
92
|
+
for (const txid of txids2) {
|
|
93
|
+
const tr = r2.txidResults.find(tx => tx.txid === txid)
|
|
94
|
+
expect(tr).not.toBeUndefined()
|
|
95
|
+
if (txid === c.txidDo) {
|
|
96
|
+
expect(tr!.status).toBe('success')
|
|
97
|
+
} else {
|
|
98
|
+
expect(tr!.status).toBe('error')
|
|
99
|
+
expect(tr!.doubleSpend).toBe(true)
|
|
100
|
+
if (tr!.competingTxs !== undefined) expect(tr!.competingTxs).toEqual([c.txidUndo])
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Beef, Utils } from '@bsv/sdk'
|
|
2
|
+
import { Services } from '../Services'
|
|
3
|
+
import { _tu, logger } from '../../../test/utils/TestUtilsWalletStorage'
|
|
4
|
+
import { verifyTruthy } from '../../utility/utilityHelpers'
|
|
5
|
+
|
|
6
|
+
describe('verifyBeef tests', () => {
|
|
7
|
+
jest.setTimeout(99999999)
|
|
8
|
+
|
|
9
|
+
test('0_', async () => {
|
|
10
|
+
const bhex =
|
|
11
|
+
'0200beef01fe7c830d000a02a0021d4ca6c031db7f6334c08ddfda43cbde3800c7fa27892f8e80a5218ca8493918a10081788ac8d8267d409b6258a6a6f5d28317ee65b5b25892def4f6cbf44f92571d01510027c2382032711033d0a1e2724b9eefcf257e27bce28e37b7472877860570ee6e0129008e15879954392f322efdd32376077a3323db02501926a697f5db6b68862f67ce01150061dcb195186d564d754a056d9ad90d65ece5bfa5ddccebd24b64d25df3780b15010b00bcd8f2c9c62b4fbbefad9640f9f6dccf21246fa08a6e1cab2c052666dee4182001040018ad6a5739749e27c191a5ef7442d861e5b8d204d36c91e08bf8015811851dbe010300f47047d1c4582eb02349eabcdafc7f4573e93ed687718275475d6f528783d16201000039a5fa5dbbbcd4a1754c250a7879ae1ad2eeb189d87d3614c2a2d9519a7a47af0101001670fc6a8d40adbd3f8a84ae35f0a702695f19f19a8feddcfd1de6249cc164e901010092a689a4cda27aea3552a98a7441ffbaed8566ae31e0a1a67e67647e2f3b8fda05025a8b77e1c82cfcfda197fec3f805a6b7000737a583e45833df6721975fe8bad102448f38860c45d33c87041c0fda51befb1c90853d3141a0df3ac737ccb9b5e61b01000100000001f7ddf439a165bf63a7d6c144b4bd8882ff45dc35a3ca3e75517fa56482fed6bd000000006b4830450221008106bc7164333415bc485ae1d12acd72bbc536f1f03b25aa42d92971565b329902202d484d09935be7fa49bbd5806148dbfdb90cc86516537351acf20655c03fa656412102b53b5339d6241c4271a07e7b09035966defe37c1a3edd60b8a427d5a5b488cb5ffffffff021d00000000000000c421029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a4734aba7171082ff009628f6d1abea57bc1ffcdb6c2b45a5e17219eaf6bc6b6e093b5243036565505084548f9715a440b6c03e73427d4730450221008e4964dc5e8f3cc6f41da7508cba05babb2ce211fa47fe91ae9c06903d95fde902206cb21d6c188f302fccedbbcd80459561dbabcabe3da16853371fede9f5d027d06d75c8030000000000001976a914f8a84c2bef6eed4eb3270c8605a8063202ed25cb88ac000000000001000000015a8b77e1c82cfcfda197fec3f805a6b7000737a583e45833df6721975fe8bad1010000006b483045022100fb62de36ac2930029b1397931c3f30bf6df5166f2e82bed6b2ef1d23491f8e450220730105461dc12236439ee568709ee72c345bb6748efe8656a0e96e4cc5eaecfb412102c6b33e96f3b635ebd71bcedd9bcb90b4c098b9b38730f58984e23615e0864833ffffffff042800000000000000c521029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a47361c08d47822cb0806cd17af298948641db6bd36440da9a988af0f6600cba6dabfcfe5c7fe086b7a08e8feef3a9d21d8b0126c2f4a260b46304402204f418ece238fb0587f887c1e0ea6beb4ebcefa6749d1b523195bd65dc9971374022009d0b21c669a72a8a01808d394c55de730a3a4d287b3bb209697b2e79a9787ce6d7516050000000000001976a914803a2e1d2ca2373c21129a7075f1a42587f16c8188acec030000000000001976a91441cb6381a584c464df4b6dd75b91fb0ab6c4b7a688acd0040000000000001976a914e08fbd92ba37c1d84bba8439c55793ea60c0dd6b88ac00000000000100000001448f38860c45d33c87041c0fda51befb1c90853d3141a0df3ac737ccb9b5e61b020000006a4730440220411ab1f23f747899bf71185fbb4ab03defc6e215fb1ee3d24060b14256d2dc40022035669cd13b5c5fd399a402862b4e6bc001d0cbf56660bac37b1563eeaf49a700412103b20f91159733fd69817cc4d4f9ed0cf4340f63b482e0a0a7f233885c61d1b044ffffffff020a00000000000000c421029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a47343c32fe905bb02e70c0a9779048c921b1e26a2684c498ab44759ac25bcdfafa95309c59d1c3ac12f056ad8d10dabe777d1d57dd934730450221009a64cdc81a0ada12d329463db24260a15ad56bdc3523613c0fae2fb64762d20e022021b942e859749fc23585fdb0395585d6ea52dcf0a310cc989a38ff0483c8717e6d75b7150000000000001976a91468cce1214ccbd14d9dfd813d8490daadaa96b39288ac00000000'
|
|
12
|
+
const beef = Beef.fromString(bhex)
|
|
13
|
+
const chaintracker = await new Services('main').getChainTracker()
|
|
14
|
+
|
|
15
|
+
logger(beef.toLogString())
|
|
16
|
+
|
|
17
|
+
const ok = await beef.verify(chaintracker, true)
|
|
18
|
+
expect(ok).toBe(true)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('1_', async () => {
|
|
22
|
+
if (_tu.noEnv('main')) return
|
|
23
|
+
const { env, storage, services } = await _tu.createMainReviewSetup()
|
|
24
|
+
|
|
25
|
+
const getBeefForTxid = '4d9a1eff26bac99c7524cb7b2e808b77935d3d890562db2fefc6cb8cb92a6b16'
|
|
26
|
+
{
|
|
27
|
+
const beef = await services.getBeefForTxid(getBeefForTxid)
|
|
28
|
+
const chaintracker = await services.getChainTracker()
|
|
29
|
+
const ok = await beef.verify(chaintracker, true)
|
|
30
|
+
expect(ok).toBe(true)
|
|
31
|
+
}
|
|
32
|
+
{
|
|
33
|
+
const beef = verifyTruthy(
|
|
34
|
+
await storage.getValidBeefForTxid(getBeefForTxid, undefined, undefined, undefined, undefined, 1)
|
|
35
|
+
)
|
|
36
|
+
const chaintracker = await services.getChainTracker()
|
|
37
|
+
const ok = await beef.verify(chaintracker, true)
|
|
38
|
+
expect(ok).toBe(true)
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test.skip('2_ review beef verify root', async () => {
|
|
43
|
+
const bhex =
|
|
44
|
+
'0200beef01fe7c830d000a02a0021d4ca6c031db7f6334c08ddfda43cbde3800c7fa27892f8e80a5218ca8493918a10081788ac8d8267d409b6258a6a6f5d28317ee65b5b25892def4f6cbf44f92571d01510027c2382032711033d0a1e2724b9eefcf257e27bce28e37b7472877860570ee6e0129008e15879954392f322efdd32376077a3323db02501926a697f5db6b68862f67ce01150061dcb195186d564d754a056d9ad90d65ece5bfa5ddccebd24b64d25df3780b15010b00bcd8f2c9c62b4fbbefad9640f9f6dccf21246fa08a6e1cab2c052666dee4182001040018ad6a5739749e27c191a5ef7442d861e5b8d204d36c91e08bf8015811851dbe010300f47047d1c4582eb02349eabcdafc7f4573e93ed687718275475d6f528783d16201000039a5fa5dbbbcd4a1754c250a7879ae1ad2eeb189d87d3614c2a2d9519a7a47af0101001670fc6a8d40adbd3f8a84ae35f0a702695f19f19a8feddcfd1de6249cc164e901010092a689a4cda27aea3552a98a7441ffbaed8566ae31e0a1a67e67647e2f3b8fda05025a8b77e1c82cfcfda197fec3f805a6b7000737a583e45833df6721975fe8bad102448f38860c45d33c87041c0fda51befb1c90853d3141a0df3ac737ccb9b5e61b01000100000001f7ddf439a165bf63a7d6c144b4bd8882ff45dc35a3ca3e75517fa56482fed6bd000000006b4830450221008106bc7164333415bc485ae1d12acd72bbc536f1f03b25aa42d92971565b329902202d484d09935be7fa49bbd5806148dbfdb90cc86516537351acf20655c03fa656412102b53b5339d6241c4271a07e7b09035966defe37c1a3edd60b8a427d5a5b488cb5ffffffff021d00000000000000c421029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a4734aba7171082ff009628f6d1abea57bc1ffcdb6c2b45a5e17219eaf6bc6b6e093b5243036565505084548f9715a440b6c03e73427d4730450221008e4964dc5e8f3cc6f41da7508cba05babb2ce211fa47fe91ae9c06903d95fde902206cb21d6c188f302fccedbbcd80459561dbabcabe3da16853371fede9f5d027d06d75c8030000000000001976a914f8a84c2bef6eed4eb3270c8605a8063202ed25cb88ac000000000001000000015a8b77e1c82cfcfda197fec3f805a6b7000737a583e45833df6721975fe8bad1010000006b483045022100fb62de36ac2930029b1397931c3f30bf6df5166f2e82bed6b2ef1d23491f8e450220730105461dc12236439ee568709ee72c345bb6748efe8656a0e96e4cc5eaecfb412102c6b33e96f3b635ebd71bcedd9bcb90b4c098b9b38730f58984e23615e0864833ffffffff042800000000000000c521029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a47361c08d47822cb0806cd17af298948641db6bd36440da9a988af0f6600cba6dabfcfe5c7fe086b7a08e8feef3a9d21d8b0126c2f4a260b46304402204f418ece238fb0587f887c1e0ea6beb4ebcefa6749d1b523195bd65dc9971374022009d0b21c669a72a8a01808d394c55de730a3a4d287b3bb209697b2e79a9787ce6d7516050000000000001976a914803a2e1d2ca2373c21129a7075f1a42587f16c8188acec030000000000001976a91441cb6381a584c464df4b6dd75b91fb0ab6c4b7a688acd0040000000000001976a914e08fbd92ba37c1d84bba8439c55793ea60c0dd6b88ac00000000000100000001448f38860c45d33c87041c0fda51befb1c90853d3141a0df3ac737ccb9b5e61b020000006a4730440220411ab1f23f747899bf71185fbb4ab03defc6e215fb1ee3d24060b14256d2dc40022035669cd13b5c5fd399a402862b4e6bc001d0cbf56660bac37b1563eeaf49a700412103b20f91159733fd69817cc4d4f9ed0cf4340f63b482e0a0a7f233885c61d1b044ffffffff020a00000000000000c421029664d9baa433b4ded47ce151d348fda7ed30df597b93bf5f321ec2fe742b0faaac2131546f446f44744b7265457a6248594b466a6d6f42756475466d53585855475a47343c32fe905bb02e70c0a9779048c921b1e26a2684c498ab44759ac25bcdfafa95309c59d1c3ac12f056ad8d10dabe777d1d57dd934730450221009a64cdc81a0ada12d329463db24260a15ad56bdc3523613c0fae2fb64762d20e022021b942e859749fc23585fdb0395585d6ea52dcf0a310cc989a38ff0483c8717e6d75b7150000000000001976a91468cce1214ccbd14d9dfd813d8490daadaa96b39288ac00000000'
|
|
45
|
+
const beef = Beef.fromString(bhex)
|
|
46
|
+
logger(beef.toLogString())
|
|
47
|
+
logger(Utils.toHex(beef.txs[1].rawTx!))
|
|
48
|
+
logger(beef.bumps[0].computeRoot('e47df21819ed320a78392e62e963ddd77143c3c52ad5255a07ff55ba507df71d'))
|
|
49
|
+
})
|
|
50
|
+
})
|