@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.
Files changed (390) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.template +22 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  4. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  5. package/.github/pull_request_template.md +22 -0
  6. package/.github/workflows/push.yaml +145 -0
  7. package/.prettierrc +10 -0
  8. package/CHANGELOG.md +280 -0
  9. package/CONTRIBUTING.md +89 -0
  10. package/README.md +43 -0
  11. package/docs/README.md +85 -0
  12. package/docs/client.md +19627 -0
  13. package/docs/monitor.md +953 -0
  14. package/docs/open-rpc/index.html +46 -0
  15. package/docs/services.md +6377 -0
  16. package/docs/setup.md +1268 -0
  17. package/docs/storage.md +5367 -0
  18. package/docs/wallet.md +19626 -0
  19. package/jest.config.ts +25 -0
  20. package/license.md +28 -0
  21. package/out/tsconfig.all.tsbuildinfo +1 -0
  22. package/package.json +63 -0
  23. package/src/CWIStyleWalletManager.ts +1999 -0
  24. package/src/Setup.ts +579 -0
  25. package/src/SetupClient.ts +322 -0
  26. package/src/SetupWallet.ts +108 -0
  27. package/src/SimpleWalletManager.ts +526 -0
  28. package/src/Wallet.ts +1169 -0
  29. package/src/WalletAuthenticationManager.ts +153 -0
  30. package/src/WalletLogger.ts +213 -0
  31. package/src/WalletPermissionsManager.ts +3660 -0
  32. package/src/WalletSettingsManager.ts +114 -0
  33. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  34. package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
  36. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  37. package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
  38. package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
  39. package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
  40. package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
  41. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  42. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
  43. package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
  44. package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
  45. package/src/index.all.ts +27 -0
  46. package/src/index.client.ts +25 -0
  47. package/src/index.mobile.ts +21 -0
  48. package/src/index.ts +1 -0
  49. package/src/monitor/Monitor.ts +412 -0
  50. package/src/monitor/MonitorDaemon.ts +188 -0
  51. package/src/monitor/README.md +3 -0
  52. package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
  53. package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
  54. package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
  55. package/src/monitor/tasks/TaskClock.ts +33 -0
  56. package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
  57. package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
  58. package/src/monitor/tasks/TaskNewHeader.ts +93 -0
  59. package/src/monitor/tasks/TaskPurge.ts +68 -0
  60. package/src/monitor/tasks/TaskReorg.ts +89 -0
  61. package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
  62. package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
  63. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  64. package/src/monitor/tasks/TaskUnFail.ts +151 -0
  65. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  66. package/src/sdk/CertOpsWallet.ts +18 -0
  67. package/src/sdk/PrivilegedKeyManager.ts +372 -0
  68. package/src/sdk/README.md +13 -0
  69. package/src/sdk/WERR_errors.ts +234 -0
  70. package/src/sdk/WalletError.ts +170 -0
  71. package/src/sdk/WalletErrorFromJson.ts +80 -0
  72. package/src/sdk/WalletServices.interfaces.ts +700 -0
  73. package/src/sdk/WalletSigner.interfaces.ts +11 -0
  74. package/src/sdk/WalletStorage.interfaces.ts +606 -0
  75. package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
  76. package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
  77. package/src/sdk/__test/WalletError.test.ts +318 -0
  78. package/src/sdk/__test/validationHelpers.test.ts +21 -0
  79. package/src/sdk/index.ts +10 -0
  80. package/src/sdk/types.ts +226 -0
  81. package/src/services/README.md +11 -0
  82. package/src/services/ServiceCollection.ts +248 -0
  83. package/src/services/Services.ts +603 -0
  84. package/src/services/__tests/ARC.man.test.ts +123 -0
  85. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  86. package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
  87. package/src/services/__tests/arcServices.test.ts +8 -0
  88. package/src/services/__tests/bitrails.test.ts +56 -0
  89. package/src/services/__tests/getMerklePath.test.ts +15 -0
  90. package/src/services/__tests/getRawTx.test.ts +13 -0
  91. package/src/services/__tests/postBeef.test.ts +104 -0
  92. package/src/services/__tests/verifyBeef.test.ts +50 -0
  93. package/src/services/chaintracker/BHServiceClient.ts +212 -0
  94. package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
  95. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
  96. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
  97. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
  98. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
  99. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
  100. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
  101. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
  102. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
  103. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
  104. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
  105. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
  106. package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
  107. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
  108. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
  109. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
  110. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
  111. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
  112. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
  113. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
  114. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
  115. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
  116. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
  117. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
  118. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
  119. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
  120. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
  121. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
  122. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
  123. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
  124. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
  125. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
  126. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
  127. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
  128. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
  129. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
  130. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  131. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
  132. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
  133. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
  134. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
  135. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
  136. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
  137. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  138. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  139. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  140. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  141. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
  142. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  143. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  144. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  145. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  146. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
  147. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  148. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  149. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  150. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  151. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
  152. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  153. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  154. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  155. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  156. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  157. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
  158. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  159. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  160. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  161. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  162. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  163. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  164. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
  165. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
  166. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
  167. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  168. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  169. package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
  170. package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
  171. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  172. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
  173. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
  174. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
  175. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
  176. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
  177. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
  178. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
  179. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
  180. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
  181. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
  182. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
  183. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
  184. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
  185. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
  186. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
  187. package/src/services/chaintracker/index.all.ts +4 -0
  188. package/src/services/chaintracker/index.client.ts +4 -0
  189. package/src/services/chaintracker/index.mobile.ts +4 -0
  190. package/src/services/createDefaultWalletServicesOptions.ts +77 -0
  191. package/src/services/index.ts +1 -0
  192. package/src/services/processingErrors/arcSuccessError.json +76 -0
  193. package/src/services/providers/ARC.ts +350 -0
  194. package/src/services/providers/Bitails.ts +256 -0
  195. package/src/services/providers/SdkWhatsOnChain.ts +83 -0
  196. package/src/services/providers/WhatsOnChain.ts +883 -0
  197. package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
  198. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  199. package/src/services/providers/exchangeRates.ts +265 -0
  200. package/src/services/providers/getBeefForTxid.ts +369 -0
  201. package/src/signer/README.md +5 -0
  202. package/src/signer/WalletSigner.ts +17 -0
  203. package/src/signer/methods/acquireDirectCertificate.ts +52 -0
  204. package/src/signer/methods/buildSignableTransaction.ts +183 -0
  205. package/src/signer/methods/completeSignedTransaction.ts +117 -0
  206. package/src/signer/methods/createAction.ts +172 -0
  207. package/src/signer/methods/internalizeAction.ts +106 -0
  208. package/src/signer/methods/proveCertificate.ts +43 -0
  209. package/src/signer/methods/signAction.ts +54 -0
  210. package/src/storage/README.md +14 -0
  211. package/src/storage/StorageIdb.ts +2304 -0
  212. package/src/storage/StorageKnex.ts +1425 -0
  213. package/src/storage/StorageProvider.ts +810 -0
  214. package/src/storage/StorageReader.ts +194 -0
  215. package/src/storage/StorageReaderWriter.ts +432 -0
  216. package/src/storage/StorageSyncReader.ts +34 -0
  217. package/src/storage/WalletStorageManager.ts +943 -0
  218. package/src/storage/__test/StorageIdb.test.ts +43 -0
  219. package/src/storage/__test/WalletStorageManager.test.ts +275 -0
  220. package/src/storage/__test/adminStats.man.test.ts +89 -0
  221. package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
  222. package/src/storage/index.all.ts +11 -0
  223. package/src/storage/index.client.ts +7 -0
  224. package/src/storage/index.mobile.ts +6 -0
  225. package/src/storage/methods/ListActionsSpecOp.ts +70 -0
  226. package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
  227. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
  228. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
  229. package/src/storage/methods/__test/offsetKey.test.ts +274 -0
  230. package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
  231. package/src/storage/methods/createAction.ts +947 -0
  232. package/src/storage/methods/generateChange.ts +556 -0
  233. package/src/storage/methods/getBeefForTransaction.ts +139 -0
  234. package/src/storage/methods/getSyncChunk.ts +293 -0
  235. package/src/storage/methods/internalizeAction.ts +562 -0
  236. package/src/storage/methods/listActionsIdb.ts +183 -0
  237. package/src/storage/methods/listActionsKnex.ts +226 -0
  238. package/src/storage/methods/listCertificates.ts +73 -0
  239. package/src/storage/methods/listOutputsIdb.ts +203 -0
  240. package/src/storage/methods/listOutputsKnex.ts +263 -0
  241. package/src/storage/methods/offsetKey.ts +89 -0
  242. package/src/storage/methods/processAction.ts +420 -0
  243. package/src/storage/methods/purgeData.ts +251 -0
  244. package/src/storage/methods/purgeDataIdb.ts +10 -0
  245. package/src/storage/methods/reviewStatus.ts +101 -0
  246. package/src/storage/methods/reviewStatusIdb.ts +43 -0
  247. package/src/storage/methods/utils.Buffer.ts +33 -0
  248. package/src/storage/methods/utils.ts +56 -0
  249. package/src/storage/remoting/StorageClient.ts +567 -0
  250. package/src/storage/remoting/StorageMobile.ts +544 -0
  251. package/src/storage/remoting/StorageServer.ts +291 -0
  252. package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
  253. package/src/storage/schema/KnexMigrations.ts +489 -0
  254. package/src/storage/schema/StorageIdbSchema.ts +150 -0
  255. package/src/storage/schema/entities/EntityBase.ts +210 -0
  256. package/src/storage/schema/entities/EntityCertificate.ts +188 -0
  257. package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
  258. package/src/storage/schema/entities/EntityCommission.ts +148 -0
  259. package/src/storage/schema/entities/EntityOutput.ts +290 -0
  260. package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
  261. package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
  262. package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
  263. package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
  264. package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
  265. package/src/storage/schema/entities/EntitySyncState.ts +389 -0
  266. package/src/storage/schema/entities/EntityTransaction.ts +306 -0
  267. package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
  268. package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
  269. package/src/storage/schema/entities/EntityUser.ts +112 -0
  270. package/src/storage/schema/entities/MergeEntity.ts +73 -0
  271. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
  272. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
  273. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
  274. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
  275. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
  276. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
  277. package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
  278. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
  279. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
  280. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
  281. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
  282. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
  283. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
  284. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
  285. package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
  286. package/src/storage/schema/entities/index.ts +16 -0
  287. package/src/storage/schema/tables/TableCertificate.ts +21 -0
  288. package/src/storage/schema/tables/TableCertificateField.ts +12 -0
  289. package/src/storage/schema/tables/TableCommission.ts +13 -0
  290. package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
  291. package/src/storage/schema/tables/TableOutput.ts +64 -0
  292. package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
  293. package/src/storage/schema/tables/TableOutputTag.ts +10 -0
  294. package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
  295. package/src/storage/schema/tables/TableProvenTx.ts +14 -0
  296. package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
  297. package/src/storage/schema/tables/TableSettings.ts +17 -0
  298. package/src/storage/schema/tables/TableSyncState.ts +18 -0
  299. package/src/storage/schema/tables/TableTransaction.ts +54 -0
  300. package/src/storage/schema/tables/TableTxLabel.ts +10 -0
  301. package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
  302. package/src/storage/schema/tables/TableUser.ts +16 -0
  303. package/src/storage/schema/tables/index.ts +16 -0
  304. package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
  305. package/src/storage/sync/index.ts +1 -0
  306. package/src/utility/Format.ts +133 -0
  307. package/src/utility/README.md +3 -0
  308. package/src/utility/ReaderUint8Array.ts +187 -0
  309. package/src/utility/ScriptTemplateBRC29.ts +73 -0
  310. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
  311. package/src/utility/aggregateResults.ts +68 -0
  312. package/src/utility/identityUtils.ts +159 -0
  313. package/src/utility/index.all.ts +7 -0
  314. package/src/utility/index.client.ts +7 -0
  315. package/src/utility/parseTxScriptOffsets.ts +29 -0
  316. package/src/utility/stampLog.ts +69 -0
  317. package/src/utility/tscProofToMerklePath.ts +48 -0
  318. package/src/utility/utilityHelpers.buffer.ts +34 -0
  319. package/src/utility/utilityHelpers.noBuffer.ts +60 -0
  320. package/src/utility/utilityHelpers.ts +275 -0
  321. package/src/wab-client/WABClient.ts +94 -0
  322. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  323. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  324. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
  325. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  326. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  327. package/syncVersions.js +71 -0
  328. package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
  329. package/test/Wallet/action/abortAction.test.ts +47 -0
  330. package/test/Wallet/action/createAction.test.ts +299 -0
  331. package/test/Wallet/action/createAction2.test.ts +1273 -0
  332. package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
  333. package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
  334. package/test/Wallet/action/internalizeAction.test.ts +682 -0
  335. package/test/Wallet/action/relinquishOutput.test.ts +37 -0
  336. package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
  337. package/test/Wallet/certificate/listCertificates.test.ts +346 -0
  338. package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
  339. package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
  340. package/test/Wallet/get/getHeight.test.ts +52 -0
  341. package/test/Wallet/get/getKnownTxids.test.ts +86 -0
  342. package/test/Wallet/get/getNetwork.test.ts +27 -0
  343. package/test/Wallet/get/getVersion.test.ts +27 -0
  344. package/test/Wallet/list/listActions.test.ts +279 -0
  345. package/test/Wallet/list/listActions2.test.ts +1381 -0
  346. package/test/Wallet/list/listCertificates.test.ts +118 -0
  347. package/test/Wallet/list/listOutputs.test.ts +447 -0
  348. package/test/Wallet/live/walletLive.man.test.ts +521 -0
  349. package/test/Wallet/local/localWallet.man.test.ts +93 -0
  350. package/test/Wallet/local/localWallet2.man.test.ts +277 -0
  351. package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
  352. package/test/Wallet/specOps/specOps.man.test.ts +220 -0
  353. package/test/Wallet/support/janitor.man.test.ts +40 -0
  354. package/test/Wallet/support/operations.man.test.ts +407 -0
  355. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
  356. package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
  357. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
  358. package/test/Wallet/sync/setActive.test.ts +170 -0
  359. package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
  360. package/test/WalletClient/WERR.man.test.ts +35 -0
  361. package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
  362. package/test/checkDB.ts +57 -0
  363. package/test/checkdb +0 -0
  364. package/test/examples/backup.man.test.ts +59 -0
  365. package/test/examples/pushdrop.test.ts +282 -0
  366. package/test/monitor/Monitor.test.ts +620 -0
  367. package/test/services/Services.test.ts +263 -0
  368. package/test/storage/KnexMigrations.test.ts +86 -0
  369. package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
  370. package/test/storage/count.test.ts +177 -0
  371. package/test/storage/find.test.ts +195 -0
  372. package/test/storage/findLegacy.test.ts +67 -0
  373. package/test/storage/idb/allocateChange.test.ts +251 -0
  374. package/test/storage/idb/count.test.ts +158 -0
  375. package/test/storage/idb/find.test.ts +177 -0
  376. package/test/storage/idb/idbSpeed.test.ts +36 -0
  377. package/test/storage/idb/insert.test.ts +268 -0
  378. package/test/storage/idb/transactionAbort.test.ts +108 -0
  379. package/test/storage/idb/update.test.ts +999 -0
  380. package/test/storage/insert.test.ts +278 -0
  381. package/test/storage/update.test.ts +1021 -0
  382. package/test/storage/update2.test.ts +897 -0
  383. package/test/utils/TestUtilsWalletStorage.ts +2526 -0
  384. package/test/utils/localWalletMethods.ts +363 -0
  385. package/test/utils/removeFailedFromDatabase.sql +17 -0
  386. package/ts2md.json +44 -0
  387. package/tsconfig.all.json +31 -0
  388. package/tsconfig.client.json +29 -0
  389. package/tsconfig.json +17 -0
  390. 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,8 @@
1
+ import { Beef } from '@bsv/sdk'
2
+ import { Services } from '../../index.all'
3
+
4
+ describe.skip('arcServices tests', () => {
5
+ jest.setTimeout(99999999)
6
+
7
+ test('0 ', async () => {})
8
+ })
@@ -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
+ })