@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,277 @@
1
+ import { Beef, PrivateKey, SignActionArgs, WalletOutput, Validation } from '@bsv/sdk'
2
+ import { sdk, Setup, TableUser } from '../../../src'
3
+ import { _tu } from '../../utils/TestUtilsWalletStorage'
4
+ import { specOpInvalidChange, WERR_REVIEW_ACTIONS } from '../../../src/sdk'
5
+ import {
6
+ burnOneSatTestOutput,
7
+ createMainReviewSetup,
8
+ createOneSatTestOutput,
9
+ createSetup,
10
+ doubleSpendOldChange,
11
+ LocalWalletTestOptions,
12
+ recoverOneSatTestOutputs
13
+ } from '../../utils/localWalletMethods'
14
+
15
+ import * as dotenv from 'dotenv'
16
+ dotenv.config()
17
+
18
+ const chain: sdk.Chain = 'main'
19
+
20
+ const options: LocalWalletTestOptions = {
21
+ setActiveClient: true,
22
+ useMySQLConnectionForClient: true,
23
+ useTestIdentityKey: false,
24
+ useIdentityKey2: false
25
+ }
26
+
27
+ describe('localWallet2 tests', () => {
28
+ jest.setTimeout(99999999)
29
+
30
+ test('0 monitor runOnce', async () => {
31
+ const setup = await createSetup(chain, options)
32
+ //const log = await setup.monitor.runTask('UnFail')
33
+ //if (log) console.log(log)
34
+ await setup.monitor.runOnce()
35
+ await setup.wallet.destroy()
36
+ })
37
+
38
+ test('0a abort nosend', async () => {
39
+ const setup = await createSetup(chain, options)
40
+ await setup.wallet.listNoSendActions({ labels: [] }, true)
41
+ await setup.wallet.destroy()
42
+ })
43
+
44
+ test('1 recover 1 sat outputs', async () => {
45
+ const setup = await createSetup(chain, options)
46
+ await recoverOneSatTestOutputs(setup, 1)
47
+ await setup.wallet.destroy()
48
+ })
49
+
50
+ test('2 create 1 sat delayed', async () => {
51
+ const setup = await createSetup(chain, options)
52
+ const car = await createOneSatTestOutput(setup, {}, 1)
53
+ //await trackReqByTxid(setup, car.txid!)
54
+ await setup.wallet.destroy()
55
+ })
56
+
57
+ test('2a create 1 sat immediate', async () => {
58
+ const setup = await createSetup(chain, options)
59
+ const car = await createOneSatTestOutput(setup, { acceptDelayedBroadcast: false }, 1)
60
+ await setup.wallet.destroy()
61
+ })
62
+
63
+ test('2c burn 1 sat output', async () => {
64
+ const setup = await createSetup(chain, options)
65
+ await burnOneSatTestOutput(setup, {}, 1)
66
+ await setup.wallet.destroy()
67
+ })
68
+
69
+ test('2d doubleSpend old change', async () => {
70
+ const setup = await createSetup(chain, options)
71
+ try {
72
+ await doubleSpendOldChange(setup, {
73
+ acceptDelayedBroadcast: false
74
+ })
75
+ } catch (eu: unknown) {
76
+ const e = sdk.WalletError.fromUnknown(eu) as WERR_REVIEW_ACTIONS
77
+ expect(e.code).toBe('WERR_REVIEW_ACTIONS')
78
+ expect(e.reviewActionResults?.length === 1).toBe(true)
79
+ const rar = e.reviewActionResults![0]!
80
+ expect(rar.status).toBe('doubleSpend')
81
+ expect(rar.competingTxs?.length).toBe(1)
82
+ }
83
+ await setup.wallet.destroy()
84
+ })
85
+
86
+ test('4 review change utxos', async () => {
87
+ const setup = await createSetup(chain, options)
88
+ const lor = await setup.wallet.listOutputs({
89
+ basket: specOpInvalidChange,
90
+ tags: ['all']
91
+ })
92
+ if (lor.totalOutputs > 0) {
93
+ debugger
94
+ const lor = await setup.wallet.listOutputs({
95
+ basket: specOpInvalidChange,
96
+ tags: ['all', 'release']
97
+ })
98
+ }
99
+ await setup.wallet.destroy()
100
+ })
101
+
102
+ test('5 review and release all production invalid change utxos', async () => {
103
+ const { env, storage } = await createMainReviewSetup()
104
+ const users = await storage.findUsers({ partial: {} })
105
+ const withInvalid: Record<number, { user: TableUser; outputs: WalletOutput[]; total: number }> = {}
106
+ // [76, 48, 166, 94, 110, 111, 81]
107
+ const vargs: Validation.ValidListOutputsArgs = {
108
+ basket: specOpInvalidChange,
109
+ tags: [],
110
+ tagQueryMode: 'all',
111
+ includeLockingScripts: false,
112
+ includeTransactions: false,
113
+ includeCustomInstructions: false,
114
+ includeTags: false,
115
+ includeLabels: false,
116
+ limit: 0,
117
+ offset: 0,
118
+ seekPermission: false,
119
+ knownTxids: []
120
+ }
121
+ for (const user of users) {
122
+ const { userId } = user
123
+ const auth = { userId, identityKey: '' }
124
+ let r = await storage.listOutputs(auth, vargs)
125
+ if (r.totalOutputs > 0) {
126
+ const total: number = r.outputs.reduce((s, o) => (s += o.satoshis), 0)
127
+ console.log(`userId ${userId}: ${r.totalOutputs} unspendable utxos, total ${total}, ${user.identityKey}`)
128
+ withInvalid[userId] = { user, outputs: r.outputs, total }
129
+ }
130
+ }
131
+ if (Object.keys(withInvalid).length > 0) {
132
+ debugger
133
+ // Release invalids
134
+ for (const { user, outputs } of Object.values(withInvalid)) {
135
+ const { userId } = user
136
+ const auth = { userId, identityKey: '' }
137
+ await storage.listOutputs(auth, { ...vargs, tags: ['release'] })
138
+ }
139
+ // Verify
140
+ for (const { user, outputs } of Object.values(withInvalid)) {
141
+ const { userId } = user
142
+ const auth = { userId, identityKey: '' }
143
+ const r = await storage.listOutputs(auth, vargs)
144
+ expect(r.totalOutputs).toBe(0)
145
+ }
146
+ }
147
+ await storage.destroy()
148
+ })
149
+
150
+ test('6 review and unfail false doubleSpends', async () => {
151
+ const { env, storage, services } = await createMainReviewSetup()
152
+ let offset = 1100
153
+ const limit = 100
154
+ let allUnfails: number[] = []
155
+ for (;;) {
156
+ let log = ''
157
+ const unfails: number[] = []
158
+ const reqs = await storage.findProvenTxReqs({ partial: { status: 'doubleSpend' }, paged: { limit, offset } })
159
+ for (const req of reqs) {
160
+ const gsr = await services.getStatusForTxids([req.txid])
161
+ if (gsr.results[0].status !== 'unknown') {
162
+ log += `unfail ${req.provenTxReqId} ${req.txid}\n`
163
+ unfails.push(req.provenTxReqId)
164
+ }
165
+ }
166
+ console.log(`OFFSET: ${offset} ${unfails.length} unfails\n${log}`)
167
+ allUnfails = allUnfails.concat(unfails)
168
+ if (reqs.length < limit) break
169
+ offset += reqs.length
170
+ }
171
+ debugger
172
+ for (const id of allUnfails) {
173
+ await storage.updateProvenTxReq(id, { status: 'unfail' })
174
+ }
175
+ await storage.destroy()
176
+ })
177
+
178
+ test('7 review and unfail false invalids', async () => {
179
+ const { env, storage, services } = await createMainReviewSetup()
180
+ let offset = 1000
181
+ const limit = 100
182
+ let allUnfails: number[] = []
183
+ for (;;) {
184
+ let log = ''
185
+ const unfails: number[] = []
186
+ const reqs = await storage.findProvenTxReqs({ partial: { status: 'invalid' }, paged: { limit, offset } })
187
+ for (const req of reqs) {
188
+ if (!req.txid || !req.rawTx) continue
189
+ const gsr = await services.getStatusForTxids([req.txid])
190
+ if (gsr.results[0]?.status !== 'unknown') {
191
+ log += `unfail ${req.provenTxReqId} ${req.txid}\n`
192
+ unfails.push(req.provenTxReqId)
193
+ }
194
+ }
195
+ console.log(`OFFSET: ${offset} ${unfails.length} unfails\n${log}`)
196
+ allUnfails = allUnfails.concat(unfails)
197
+ if (reqs.length < limit) break
198
+ offset += reqs.length
199
+ }
200
+ debugger
201
+ for (const id of allUnfails) {
202
+ await storage.updateProvenTxReq(id, { status: 'unfail' })
203
+ }
204
+ await storage.destroy()
205
+ })
206
+
207
+ test('8 Beef verifier', async () => {
208
+ const setup = await createSetup(chain, options)
209
+ // replace bb with beef to test
210
+ const bb = new Beef().toBinary()
211
+ const beef = Beef.fromBinary(bb)
212
+ console.log(beef.toLogString())
213
+ const ok = await beef.verify(await setup.services.getChainTracker())
214
+ await setup.wallet.destroy()
215
+ })
216
+
217
+ test.skip('9 received payment from wif and outpoint', async () => {
218
+ const setup = await createSetup(chain, options)
219
+ console.log(`active store ${setup.wallet.storage.getActiveStore()}`)
220
+ if (!setup.wallet.storage.isActiveEnabled) throw new Error('Active storage is not enabled.')
221
+
222
+ const pk = PrivateKey.fromWif('L4ZRWA...Nw4Brt8rvJLRZegPF2oiBKJaxUgr4e')
223
+ const outpoint = { txid: '5e2965a50618425af21bebddb9aa60c3e12f64c8e1eb44b6589273455a9760e9', vout: 0 }
224
+ const address = pk.toAddress()
225
+ console.log(`address: ${address.toString()}`)
226
+
227
+ const inputBEEF = await setup.activeStorage.getBeefForTransaction(outpoint.txid, { ignoreStorage: true })
228
+ const btx = inputBEEF.findTxid(outpoint.txid)
229
+ const satoshis = btx!.tx!.outputs[0]!.satoshis!
230
+
231
+ const unlock = Setup.getUnlockP2PKH(pk, satoshis)
232
+
233
+ const label = 'inputBrayden257'
234
+
235
+ const car = await setup.wallet.createAction({
236
+ inputBEEF: inputBEEF.toBinary(),
237
+ inputs: [
238
+ {
239
+ outpoint: `${outpoint.txid}.${outpoint.vout}`,
240
+ unlockingScriptLength: 108,
241
+ inputDescription: label
242
+ }
243
+ ],
244
+ labels: [label],
245
+ description: label
246
+ })
247
+
248
+ const st = car.signableTransaction!
249
+ const beef = Beef.fromBinary(st.tx)
250
+ const tx = beef.findAtomicTransaction(beef.txs.slice(-1)[0].txid)!
251
+ tx.inputs[0].unlockingScriptTemplate = unlock
252
+ await tx.sign()
253
+ const unlockingScript = tx.inputs[0].unlockingScript!.toHex()
254
+
255
+ const signArgs: SignActionArgs = {
256
+ reference: st.reference,
257
+ spends: { 0: { unlockingScript } },
258
+ options: {
259
+ acceptDelayedBroadcast: false
260
+ }
261
+ }
262
+
263
+ const sar = await setup.wallet.signAction(signArgs)
264
+
265
+ {
266
+ const beef = Beef.fromBinary(sar.tx!)
267
+ const txid = sar.txid!
268
+
269
+ console.log(`
270
+ BEEF
271
+ ${beef.toHex()}
272
+ ${beef.toLogString()}
273
+ `)
274
+ }
275
+ await setup.wallet.destroy()
276
+ })
277
+ })
@@ -0,0 +1,130 @@
1
+ import {
2
+ Beef,
3
+ BigNumber,
4
+ Hash,
5
+ P2PKH,
6
+ PublicKey,
7
+ Signature,
8
+ Transaction,
9
+ TransactionSignature,
10
+ UnlockingScript,
11
+ Utils,
12
+ Validation
13
+ } from '@bsv/sdk'
14
+ import { Setup, verifyInteger, verifyTruthy, Wallet } from '../../../src'
15
+ const parseWalletOutpoint = Validation.parseWalletOutpoint
16
+
17
+ describe('mountaintop tests', () => {
18
+ jest.setTimeout(99999999)
19
+
20
+ test('0 signature validity', async () => {
21
+ // obtain the secrets environment for the testnet network.
22
+ const env = Setup.getEnv('main')
23
+ const setup = await Setup.createWalletClient({ env })
24
+
25
+ const privKey = await setup.wallet.keyDeriver.derivePrivateKey([1, 'mountaintops'], '1', 'anyone')
26
+ const a2 = privKey.toAddress()
27
+
28
+ const { publicKey } = await setup.wallet.getPublicKey({
29
+ protocolID: [1, 'mountaintops'],
30
+ keyID: '1',
31
+ counterparty: 'anyone',
32
+ forSelf: true
33
+ })
34
+ const address = PublicKey.fromString(publicKey).toAddress()
35
+ expect(address).toBe('1BSMQ1PxMbzMqjB47EYaSNBAD7Qme1dXuk')
36
+ expect(a2).toBe(address)
37
+
38
+ const msg = [
39
+ 111, 16, 29, 104, 166, 199, 108, 36, 242, 153, 242, 104, 10, 198, 151, 176, 170, 69, 98, 209, 88, 105, 113, 199,
40
+ 124, 56, 189, 3, 104, 214, 94, 76
41
+ ]
42
+ const msgHash = new BigNumber(msg, 16)
43
+ const h1 = msgHash.toHex()
44
+ const msgHash2 = new BigNumber(msg)
45
+ const h2 = msgHash2.toHex()
46
+
47
+ const beef = Beef.fromString(beef0, 'hex')
48
+ const o = parseWalletOutpoint(outpoints[0])
49
+ const tx = new Transaction()
50
+ tx.addInput({
51
+ sourceOutputIndex: o.vout,
52
+ sourceTXID: o.txid,
53
+ sourceTransaction: beef.findAtomicTransaction(o.txid)
54
+ })
55
+
56
+ const p2pkh = new P2PKH().unlock(privKey, 'all')
57
+ tx.inputs[0].unlockingScript = await p2pkh.sign(tx, 0)
58
+ const ok2 = await tx.verify('scripts only')
59
+ expect(ok2).toBe(true)
60
+
61
+ tx.inputs[0].unlockingScript = await sign(setup.wallet, tx, 0)
62
+ const ok = await tx.verify('scripts only')
63
+ expect(ok).toBe(true)
64
+ })
65
+ })
66
+
67
+ const outpoints = [
68
+ '30c83f8b84864fd4497414980faadf074192e7193602ef96ca18705876ce74b1.0',
69
+ '797bd197f2328931231f2834c5dc8036fe9990981c368df27d3b55fa926863be.0',
70
+ '08d47d844e81d751691f6b4a39ce378e9d0f70a3a0606c87995f0f28399552e2.0'
71
+ ]
72
+ const beef0 =
73
+ '0200beef01fe068d0d0008027a001b501758910c83d8e2c839cfc133245510f5ddbbd28202c331bb9feccc261c287b02b174ce76587018ca96ef023619e7924107dfaa0f98147449d44f86848b3fc830013c006174b69497f770d46604b177a98ff8b8a693a5cec19cd145b3b32abab71676f8011f001f86947779e8e749fd439f037d93733c2ea0734a17cdf1c32f87278b80c7ff72010e00161e280d8481978b9d2696c58d634beda36265ceef9faaa351566afc2c8ab2f0010600e250ce168ac74d432a14df5669f337cd44a8c2cfc8709b955174dd57e2354399010200fd976461d8c0ed097e32ae79afefb35e89daa7289daf7b01bde8bb1481762f590100005fb474d7ddaf5a299509a165cabfe0b6dbea56ed56d1f0d3acf1d3d89531a21e01010029f89d48414f66b9bfd8d711f51d6db0a712cfff2d641f66f83dd2e5e452e5c601010001000000014289ced528197deb6980d634200d333d9983c45ef46893affd027914fdc02cf7000000006a473044022019e70e4325f95b3d5f9f0569123b23c6bff7ef4197fcb15fa50ac3537b8546de0220100d181429245e0349903a0784ad61bfa022d864fca8ce6ba13b0de99fd39eb641210327c7cb8afcd1adce5b26055d70cad9fb1045976a6f99b2ee61ed36295d5802a7ffffffff020a000000000000001976a914727caee3e1178da2ca0b48786171f23695a4ccd088ac1d000000000000001976a9148419faaf7a5e97dcc62002e2415cb51bdb91937e88ac00000000'
74
+
75
+ async function sign(client: Wallet, tx: Transaction, inputIndex: number): Promise<UnlockingScript> {
76
+ let signatureScope = TransactionSignature.SIGHASH_FORKID
77
+ signatureScope |= TransactionSignature.SIGHASH_ALL
78
+ const input = tx.inputs[inputIndex]
79
+ const otherInputs = tx.inputs.filter((_, index) => index !== inputIndex)
80
+ const sourceTXID = input.sourceTXID ?? input.sourceTransaction?.id('hex')
81
+ if (sourceTXID == null || sourceTXID === undefined) {
82
+ throw new Error('The input sourceTXID or sourceTransaction is required for transaction signing.')
83
+ }
84
+ if (sourceTXID === '') {
85
+ throw new Error('The input sourceTXID or sourceTransaction is required for transaction signing.')
86
+ }
87
+ const sourceSatoshis = input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis
88
+ if (sourceSatoshis == null || sourceSatoshis === undefined) {
89
+ throw new Error('The sourceSatoshis or input sourceTransaction is required for transaction signing.')
90
+ }
91
+ const lockingScript = input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript
92
+ if (lockingScript == null) {
93
+ throw new Error('The lockingScript or input sourceTransaction is required for transaction signing.')
94
+ }
95
+
96
+ const preimage = TransactionSignature.format({
97
+ sourceTXID,
98
+ sourceOutputIndex: verifyInteger(input.sourceOutputIndex),
99
+ sourceSatoshis,
100
+ transactionVersion: tx.version,
101
+ otherInputs,
102
+ inputIndex,
103
+ outputs: tx.outputs,
104
+ inputSequence: verifyTruthy(input.sequence),
105
+ subscript: lockingScript,
106
+ lockTime: tx.lockTime,
107
+ scope: signatureScope
108
+ })
109
+
110
+ const { signature } = await client.createSignature({
111
+ hashToDirectlySign: Hash.sha256(Hash.sha256(preimage)),
112
+ protocolID: [1, 'mountaintops'],
113
+ keyID: '1',
114
+ counterparty: 'anyone'
115
+ })
116
+ const rawSignature = Signature.fromDER(signature)
117
+ const sig = new TransactionSignature(rawSignature.r, rawSignature.s, signatureScope)
118
+ const sigForScript = sig.toChecksigFormat()
119
+ const { publicKey } = await client.getPublicKey({
120
+ protocolID: [1, 'mountaintops'],
121
+ keyID: '1',
122
+ counterparty: 'anyone',
123
+ forSelf: true
124
+ })
125
+ const pubkeyForScript = Utils.toArray(publicKey, 'hex')
126
+ return new UnlockingScript([
127
+ { op: sigForScript.length, data: sigForScript },
128
+ { op: pubkeyForScript.length, data: pubkeyForScript }
129
+ ])
130
+ }
@@ -0,0 +1,220 @@
1
+ import { WalletClient } from '@bsv/sdk'
2
+ import { sdk, verifyOne } from '../../../src'
3
+ import {
4
+ specOpInvalidChange,
5
+ specOpSetWalletChangeParams,
6
+ specOpThrowReviewActions,
7
+ specOpWalletBalance
8
+ } from '../../../src/sdk'
9
+ import { _tu, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
10
+
11
+ describe('specOps tests', () => {
12
+ jest.setTimeout(99999999)
13
+
14
+ test('00', () => {})
15
+ if (_tu.noTestEnv('test')) return
16
+ if (_tu.noTestEnv('main')) return
17
+
18
+ test('0 wallet balance specOp', async () => {
19
+ const setup = await createSetup('test')
20
+
21
+ const r = await setup.wallet.listOutputs({ basket: specOpWalletBalance })
22
+
23
+ expect(r.totalOutputs > 0).toBe(true)
24
+ expect(r.outputs.length === 0).toBe(true)
25
+
26
+ await setup.wallet.destroy()
27
+ })
28
+
29
+ test('0a wallet balance method', async () => {
30
+ const setup = await createSetup('test')
31
+
32
+ const r = await setup.wallet.balance()
33
+
34
+ expect(r > 0).toBe(true)
35
+
36
+ await setup.wallet.destroy()
37
+ })
38
+
39
+ test('0b wallet balanceAndUtxos method', async () => {
40
+ const setup = await createSetup('test')
41
+
42
+ const r = await setup.wallet.balanceAndUtxos('default')
43
+
44
+ expect(r.total > 0).toBe(true)
45
+ expect(r.utxos.length === 0).toBe(true)
46
+
47
+ await setup.wallet.destroy()
48
+ })
49
+
50
+ test('1 wallet invalid change outputs specOp', async () => {
51
+ const setup = await createSetup('test')
52
+
53
+ const r = await setup.wallet.listOutputs({
54
+ basket: specOpInvalidChange
55
+ //tags: ['release', 'all']
56
+ })
57
+
58
+ expect(r.totalOutputs).toBe(0)
59
+ expect(r.outputs.length).toBe(0)
60
+
61
+ await setup.wallet.destroy()
62
+ })
63
+
64
+ test('1a wallet reviewSpendableOutputs method', async () => {
65
+ const setup = await createSetup('test')
66
+
67
+ const r = await setup.wallet.reviewSpendableOutputs(false, false, {})
68
+
69
+ expect(r.totalOutputs).toBe(0)
70
+ expect(r.outputs.length).toBe(0)
71
+
72
+ await setup.wallet.destroy()
73
+ })
74
+
75
+ test('2 update default basket params specOp', async () => {
76
+ const setup = await createSetup('test')
77
+
78
+ const before = verifyOne(
79
+ await setup.activeStorage.findOutputBaskets({
80
+ partial: { userId: setup.userId, name: 'default' }
81
+ })
82
+ )
83
+
84
+ const r = await setup.wallet.listOutputs({
85
+ basket: specOpSetWalletChangeParams,
86
+ tags: ['33', '6']
87
+ })
88
+
89
+ const after = verifyOne(
90
+ await setup.activeStorage.findOutputBaskets({
91
+ partial: { userId: setup.userId, name: 'default' }
92
+ })
93
+ )
94
+
95
+ expect(r.totalOutputs).toBe(0)
96
+ expect(r.outputs.length).toBe(0)
97
+ expect(after.minimumDesiredUTXOValue).toBe(6)
98
+ expect(after.numberOfDesiredUTXOs).toBe(33)
99
+
100
+ // Restore original values...
101
+ await setup.wallet.listOutputs({
102
+ basket: specOpSetWalletChangeParams,
103
+ tags: [before.numberOfDesiredUTXOs.toString(), before.minimumDesiredUTXOValue.toString()]
104
+ })
105
+
106
+ await setup.wallet.destroy()
107
+ })
108
+
109
+ test('2a update default basket params specOp', async () => {
110
+ const setup = await createSetup('test')
111
+
112
+ const before = verifyOne(
113
+ await setup.activeStorage.findOutputBaskets({
114
+ partial: { userId: setup.userId, name: 'default' }
115
+ })
116
+ )
117
+
118
+ await setup.wallet.setWalletChangeParams(33, 6)
119
+
120
+ const after = verifyOne(
121
+ await setup.activeStorage.findOutputBaskets({
122
+ partial: { userId: setup.userId, name: 'default' }
123
+ })
124
+ )
125
+
126
+ expect(after.minimumDesiredUTXOValue).toBe(6)
127
+ expect(after.numberOfDesiredUTXOs).toBe(33)
128
+
129
+ // Restore original values...
130
+ await setup.wallet.setWalletChangeParams(before.numberOfDesiredUTXOs, before.minimumDesiredUTXOValue)
131
+
132
+ await setup.wallet.destroy()
133
+ })
134
+
135
+ test('3 wallet listNoSendActions method', async () => {
136
+ const setup = await createSetup('test')
137
+
138
+ const r = await setup.wallet.listNoSendActions({
139
+ labels: [
140
+ // 'abort'
141
+ ]
142
+ })
143
+
144
+ expect(r.totalActions).toBeGreaterThanOrEqual(0)
145
+ expect(r.actions.length).toBe(r.totalActions)
146
+
147
+ await setup.wallet.destroy()
148
+ })
149
+
150
+ test('4 wallet listFailedActions method', async () => {
151
+ const setup = await createSetup('test')
152
+
153
+ const r = await setup.wallet.listFailedActions({
154
+ labels: [
155
+ // 'unfail'
156
+ ],
157
+ limit: 1000
158
+ })
159
+
160
+ expect(r.totalActions).toBeGreaterThanOrEqual(0)
161
+ expect(r.actions.length).toBe(r.totalActions)
162
+
163
+ await setup.wallet.destroy()
164
+ })
165
+
166
+ test('5 Wallet specOpThrowReviewActions', async () => {
167
+ const setup = await createSetup('test')
168
+
169
+ try {
170
+ const r = await setup.wallet.createAction({
171
+ labels: [specOpThrowReviewActions],
172
+ description: 'must throw'
173
+ })
174
+ expect(true).toBe(false)
175
+ } catch (eu: unknown) {
176
+ const e = sdk.WalletError.fromUnknown(eu) as sdk.WERR_REVIEW_ACTIONS
177
+ expect(e.code).toBe('WERR_REVIEW_ACTIONS')
178
+ expect(e.reviewActionResults).toBeTruthy()
179
+ }
180
+
181
+ await setup.wallet.destroy()
182
+ })
183
+
184
+ test('6 WalletClient specOpThrowReviewActions', async () => {
185
+ const wallet = new WalletClient(undefined, '6.specOps.man.test')
186
+
187
+ try {
188
+ const r = await wallet.createAction({
189
+ labels: [specOpThrowReviewActions],
190
+ description: 'must throw'
191
+ })
192
+ expect(true).toBe(false)
193
+ } catch (eu: unknown) {
194
+ const e = sdk.WalletError.fromUnknown(eu) as sdk.WERR_REVIEW_ACTIONS
195
+ expect(e.code).toBe('WERR_REVIEW_ACTIONS')
196
+ expect(e.reviewActionResults).toBeTruthy()
197
+ }
198
+ })
199
+ })
200
+
201
+ async function createSetup(chain: sdk.Chain): Promise<TestWalletNoSetup> {
202
+ const env = _tu.getEnv(chain)
203
+ const identityKey = chain === 'test' ? env.testIdentityKey : env.identityKey
204
+ const filePath = chain === 'test' ? env.testFilePath : env.filePath
205
+ if (!identityKey) throw new sdk.WERR_INVALID_PARAMETER('identityKey', 'valid for chain ' + chain)
206
+ if (!filePath) throw new sdk.WERR_INVALID_PARAMETER('filePath', 'valid for chain ' + chain)
207
+
208
+ const setup = await _tu.createTestWallet({
209
+ chain,
210
+ rootKeyHex: env.devKeys[identityKey],
211
+ filePath,
212
+ setActiveClient: false,
213
+ addLocalBackup: false,
214
+ useMySQLConnectionForClient: false
215
+ })
216
+
217
+ console.log(`ACTIVE STORAGE: ${setup.storage.getActiveStoreName()}`)
218
+
219
+ return setup
220
+ }
@@ -0,0 +1,40 @@
1
+ import { Services, StorageKnex } from '../../../src'
2
+ import { _tu } from '../../utils/TestUtilsWalletStorage'
3
+
4
+ describe('janitor tests', () => {
5
+ jest.setTimeout(99999999)
6
+
7
+ test('0 review utxos by identity key', async () => {
8
+ const env = _tu.getEnv('main')
9
+ if (!env.cloudMySQLConnection) return
10
+
11
+ const connection = JSON.parse(env.cloudMySQLConnection)
12
+ const storage = new StorageKnex({
13
+ ...StorageKnex.defaultOptions(),
14
+ knex: _tu.createMySQLFromConnection(connection),
15
+ chain: env.chain
16
+ })
17
+ await storage.makeAvailable()
18
+
19
+ const services = new Services(env.chain)
20
+
21
+ /*
22
+ const identityKey = '0304985aa632dde471d3bf1ffb030d0af253fe65f5d186bb4cf878ca0fbee54c1c'
23
+ const { invalidSpendableOutputs: notUtxos } = await confirmSpendableOutputs(storage, services, identityKey)
24
+ const outputsToUpdate = notUtxos.map(o => ({
25
+ id: o.outputId,
26
+ satoshis: o.satoshis
27
+ }))
28
+
29
+ const total: number = outputsToUpdate.reduce((t, o) => t + o.satoshis, 0)
30
+
31
+ debugger
32
+ // *** About set spendable = false for outputs ***
33
+ for (const o of outputsToUpdate) {
34
+ await storage.updateOutput(o.id, { spendable: false })
35
+ }
36
+ */
37
+
38
+ await storage.destroy()
39
+ })
40
+ })