@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,412 @@
1
+ import { mockUnderlyingWallet, MockedBSV_SDK, MockTransaction } from './WalletPermissionsManager.fixtures'
2
+ import { WalletPermissionsManager } from '../WalletPermissionsManager'
3
+ import { jest } from '@jest/globals'
4
+ import { Utils } from '@bsv/sdk'
5
+
6
+ jest.mock('@bsv/sdk', () => MockedBSV_SDK)
7
+
8
+ describe('WalletPermissionsManager - Metadata Encryption & Decryption', () => {
9
+ let underlying: ReturnType<typeof mockUnderlyingWallet>
10
+
11
+ beforeEach(() => {
12
+ // Create a fresh underlying mock wallet before each test
13
+ underlying = mockUnderlyingWallet()
14
+ })
15
+
16
+ afterEach(() => {
17
+ jest.clearAllMocks()
18
+ })
19
+
20
+ describe('Unit Tests for metadata encryption helpers', () => {
21
+ it('should call underlying.encrypt() with the correct protocol and key when encryptWalletMetadata=true', async () => {
22
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
23
+ encryptWalletMetadata: true
24
+ })
25
+
26
+ const plaintext = 'Hello, world!'
27
+ await manager['maybeEncryptMetadata'](plaintext)
28
+
29
+ // We expect underlying.encrypt() to have been called exactly once
30
+ expect(underlying.encrypt).toHaveBeenCalledTimes(1)
31
+
32
+ // Check that the call was with the correct protocol ID and key
33
+ expect(underlying.encrypt).toHaveBeenCalledWith(
34
+ {
35
+ plaintext: expect.any(Array), // byte array version of 'Hello, world!'
36
+ protocolID: [2, 'admin metadata encryption'],
37
+ keyID: '1'
38
+ },
39
+ 'admin.domain.com'
40
+ )
41
+ })
42
+
43
+ it('should NOT call underlying.encrypt() if encryptWalletMetadata=false', async () => {
44
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
45
+ encryptWalletMetadata: false
46
+ })
47
+
48
+ const plaintext = 'No encryption needed!'
49
+ const result = await manager['maybeEncryptMetadata'](plaintext)
50
+
51
+ expect(result).toBe(plaintext)
52
+ expect(underlying.encrypt).not.toHaveBeenCalled()
53
+ })
54
+
55
+ it('should call underlying.decrypt() with correct protocol and key, returning plaintext on success', async () => {
56
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
57
+ encryptWalletMetadata: true
58
+ })
59
+
60
+ // Underlying decrypt mock returns { plaintext: [42, 42] } by default
61
+ // which would become "**" if using our ASCII interpretation
62
+ ;(underlying.decrypt as any).mockResolvedValueOnce({
63
+ plaintext: [72, 105] // 'Hi'
64
+ })
65
+
66
+ const ciphertext = Utils.toBase64(Utils.toArray('random-string-representing-ciphertext'))
67
+ const result = await manager['maybeDecryptMetadata'](ciphertext)
68
+
69
+ // We expect underlying.decrypt() to have been called
70
+ expect(underlying.decrypt).toHaveBeenCalledTimes(1)
71
+ expect(underlying.decrypt).toHaveBeenCalledWith(
72
+ {
73
+ ciphertext: expect.any(Array), // byte array version of ciphertext
74
+ protocolID: [2, 'admin metadata encryption'],
75
+ keyID: '1'
76
+ },
77
+ 'admin.domain.com'
78
+ )
79
+
80
+ // The manager returns the decrypted UTF-8 string
81
+ expect(result).toBe('Hi')
82
+ })
83
+
84
+ it('should fallback to original string if underlying.decrypt() fails', async () => {
85
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
86
+ encryptWalletMetadata: true
87
+ })
88
+
89
+ // Make underlying.decrypt() throw an error to simulate failure
90
+ ;(underlying.decrypt as any).mockImplementationOnce(() => {
91
+ throw new Error('Decryption error')
92
+ })
93
+
94
+ const ciphertext = 'this-was-not-valid-for-decryption'
95
+ const result = await manager['maybeDecryptMetadata'](ciphertext)
96
+
97
+ // The manager should return the original ciphertext if decryption throws
98
+ expect(result).toBe(ciphertext)
99
+ })
100
+ })
101
+
102
+ describe('Integration Tests for createAction + listActions (round-trip encryption)', () => {
103
+ it('should encrypt metadata fields in createAction when encryptWalletMetadata=true, then decrypt them in listActions', async () => {
104
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
105
+ encryptWalletMetadata: true
106
+ })
107
+ manager.bindCallback('onSpendingAuthorizationRequested', x => {
108
+ manager.grantPermission({ requestID: x.requestID, ephemeral: true })
109
+ })
110
+
111
+ // We prepare an action with multiple metadata fields
112
+ const actionDescription = 'User Action #1: Doing something important'
113
+ const inputDesc = 'Some input desc'
114
+ const outputDesc = 'Some output desc'
115
+ const customInstr = 'Some custom instructions'
116
+
117
+ // Our createAction call
118
+ await manager.createAction(
119
+ {
120
+ description: actionDescription,
121
+ inputs: [
122
+ {
123
+ outpoint: '0231.0',
124
+ unlockingScriptLength: 73,
125
+ inputDescription: inputDesc
126
+ }
127
+ ],
128
+ outputs: [
129
+ {
130
+ lockingScript: '561234',
131
+ satoshis: 500,
132
+ outputDescription: outputDesc,
133
+ customInstructions: customInstr
134
+ }
135
+ ]
136
+ },
137
+ 'nonadmin.com'
138
+ )
139
+
140
+ // 1) Confirm underlying.encrypt() was called for each field that is non-empty:
141
+ // - description
142
+ // - inputDescription
143
+ // - outputDescription
144
+ // - customInstructions
145
+ // (We can't be certain how many times exactly, but we can check that it was at least 4.)
146
+ expect(underlying.encrypt).toHaveBeenCalledTimes(4)
147
+
148
+ // 2) Now we simulate listing actions. We'll have the manager call underlying.listActions.
149
+ // Our mock underlying wallet returns an empty array by default, so let's override it
150
+ // to return the "encrypted" data that the manager gave it.
151
+ // But the manager doesn't store that data in the underlying wallet mock automatically.
152
+ // We'll just pretend that the wallet returns some data, and ensure the manager tries to decrypt it.
153
+ ;(underlying.listActions as any).mockResolvedValueOnce({
154
+ totalActions: 1,
155
+ actions: [
156
+ {
157
+ description: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-description')),
158
+ inputs: [
159
+ {
160
+ outpoint: 'txid1.0',
161
+ inputDescription: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-inputDesc'))
162
+ }
163
+ ],
164
+ outputs: [
165
+ {
166
+ lockingScript: 'OP_RETURN 1234',
167
+ satoshis: 500,
168
+ outputDescription: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-outputDesc')),
169
+ customInstructions: Utils.toBase64(Utils.toArray('fake-encrypted-string-for-customInstr'))
170
+ }
171
+ ]
172
+ }
173
+ ]
174
+ })
175
+
176
+ // Also mock decrypt calls to simulate a correct round-trip
177
+ const decryptMock = underlying.decrypt as any
178
+ decryptMock.mockResolvedValueOnce({
179
+ plaintext: Array.from(actionDescription).map(c => c.charCodeAt(0))
180
+ })
181
+ decryptMock.mockResolvedValueOnce({
182
+ plaintext: Array.from(inputDesc).map(c => c.charCodeAt(0))
183
+ })
184
+ decryptMock.mockResolvedValueOnce({
185
+ plaintext: Array.from(outputDesc).map(c => c.charCodeAt(0))
186
+ })
187
+ decryptMock.mockResolvedValueOnce({
188
+ plaintext: Array.from(customInstr).map(c => c.charCodeAt(0))
189
+ })
190
+
191
+ const result = await (manager as any).listActions({}, 'nonadmin.com')
192
+
193
+ // We should get exactly 1 action
194
+ expect(result.actions.length).toBe(1)
195
+ const action = result.actions[0]
196
+
197
+ // The manager is expected to have decrypted each field
198
+ expect(action.description).toBe(actionDescription)
199
+ expect(action.inputs[0].inputDescription).toBe(inputDesc)
200
+ expect(action.outputs[0].outputDescription).toBe(outputDesc)
201
+ expect(action.outputs[0].customInstructions).toBe(customInstr)
202
+ })
203
+
204
+ it('should not encrypt metadata if encryptWalletMetadata=false, storing and retrieving plaintext', async () => {
205
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
206
+ encryptWalletMetadata: false
207
+ })
208
+ manager.bindCallback('onSpendingAuthorizationRequested', x => {
209
+ manager.grantPermission({ requestID: x.requestID, ephemeral: true })
210
+ })
211
+
212
+ const actionDescription = 'Plaintext action description'
213
+ const inputDesc = 'Plaintext input desc'
214
+ const outputDesc = 'Plaintext output desc'
215
+ const customInstr = 'Plaintext instructions'
216
+ await manager.createAction(
217
+ {
218
+ description: actionDescription,
219
+ inputs: [
220
+ {
221
+ outpoint: '9876.0',
222
+ unlockingScriptLength: 73,
223
+ inputDescription: inputDesc
224
+ }
225
+ ],
226
+ outputs: [
227
+ {
228
+ lockingScript: 'ABCD',
229
+ satoshis: 123,
230
+ outputDescription: outputDesc,
231
+ customInstructions: customInstr
232
+ }
233
+ ]
234
+ },
235
+ 'nonadmin.com'
236
+ )
237
+
238
+ // Because encryption is disabled, underlying.encrypt() is not called
239
+ expect(underlying.encrypt).not.toHaveBeenCalled()
240
+
241
+ // Simulate that the wallet actually stored them in plaintext and is returning them as-is
242
+ ;(underlying.listActions as any).mockResolvedValue({
243
+ totalActions: 1,
244
+ actions: [
245
+ {
246
+ description: actionDescription,
247
+ inputs: [
248
+ {
249
+ outpoint: '0123.0',
250
+ inputDescription: inputDesc
251
+ }
252
+ ],
253
+ outputs: [
254
+ {
255
+ lockingScript: 'ABCD',
256
+ satoshis: 123,
257
+ outputDescription: outputDesc,
258
+ customInstructions: customInstr
259
+ }
260
+ ]
261
+ }
262
+ ]
263
+ })
264
+
265
+ // Decrypt is still called, because we try to decrypt regardless of whether encryption is enabled.
266
+ // This allows us to disable it on a wallet that had it in the past. The result is that when not encrypted,
267
+ // the plaintext is returned if decryption fails. If it was encrypted from metadata encryption being enabled in
268
+ // the past (even when not enabled now), we will still decrypt and see the correct plaintext rather than garbage.
269
+ // To simulate, we make decryption pass through.
270
+ underlying.decrypt.mockImplementation(x => x)
271
+ const listResult = await (manager as any).listActions({}, 'nonadmin.com')
272
+ expect(underlying.decrypt).toHaveBeenCalledTimes(3)
273
+
274
+ // Confirm the returned data is the same as originally provided (plaintext)
275
+ const [first] = listResult.actions
276
+ expect(first.description).toBe(actionDescription)
277
+ expect(first.inputs[0].inputDescription).toBe(inputDesc)
278
+ expect(first.outputs[0].outputDescription).toBe(outputDesc)
279
+ expect(first.outputs[0].customInstructions).toBe(customInstr)
280
+ })
281
+ })
282
+
283
+ describe('Integration Test for listOutputs decryption', () => {
284
+ it('should decrypt customInstructions in listOutputs if encryptWalletMetadata=true', async () => {
285
+ jest.spyOn(MockedBSV_SDK.Transaction, 'fromBEEF').mockImplementation(() => {
286
+ const mockTx = new MockTransaction()
287
+ // Add outputs with lockingScript
288
+ mockTx.outputs = [
289
+ {
290
+ lockingScript: {
291
+ // Ensure this matches what PushDrop.decode expects to work with
292
+ toHex: () => 'some script'
293
+ }
294
+ }
295
+ ]
296
+ // Add the toBEEF method
297
+ mockTx.toBEEF = () => []
298
+ return mockTx
299
+ })
300
+
301
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
302
+ encryptWalletMetadata: true
303
+ })
304
+ manager.bindCallback('onBasketAccessRequested', x => {
305
+ manager.grantPermission({ requestID: x.requestID, ephemeral: true })
306
+ })
307
+
308
+ // Suppose we have an output with custom instructions that was stored encrypted
309
+ ;(underlying.listOutputs as any).mockResolvedValue({
310
+ totalOutputs: 1,
311
+ outputs: [
312
+ {
313
+ outpoint: 'fakeTxid.0',
314
+ satoshis: 999,
315
+ lockingScript: 'OP_RETURN something',
316
+ basket: 'some-basket',
317
+ customInstructions: Utils.toBase64(Utils.toArray('fake-encrypted-instructions-string'))
318
+ }
319
+ ]
320
+ })
321
+
322
+ const originalInstr = 'Please do not reveal this data.'
323
+ // We'll mock decrypt() to interpret 'fake-encrypted-instructions-string' as a success
324
+ ;(underlying.decrypt as any).mockResolvedValueOnce({
325
+ plaintext: Array.from(originalInstr).map(ch => ch.charCodeAt(0))
326
+ })
327
+
328
+ const outputsResult = await manager.listOutputs(
329
+ {
330
+ basket: 'some-basket'
331
+ },
332
+ 'some-origin.com'
333
+ )
334
+
335
+ expect(outputsResult.outputs.length).toBe(1)
336
+ expect(outputsResult.outputs[0].customInstructions).toBe(originalInstr)
337
+
338
+ // Confirm we tried to decrypt
339
+ expect(underlying.decrypt).toHaveBeenCalledTimes(1)
340
+ expect(underlying.decrypt).toHaveBeenCalledWith(
341
+ {
342
+ ciphertext: expect.any(Array),
343
+ protocolID: [2, 'admin metadata encryption'],
344
+ keyID: '1'
345
+ },
346
+ 'admin.domain.com'
347
+ )
348
+ })
349
+
350
+ it('should fallback to the original ciphertext if decrypt fails in listOutputs', async () => {
351
+ jest.spyOn(MockedBSV_SDK.Transaction, 'fromBEEF').mockImplementation(() => {
352
+ const mockTx = new MockTransaction()
353
+ // Add outputs with lockingScript
354
+ mockTx.outputs = [
355
+ {
356
+ lockingScript: {
357
+ // Ensure this matches what PushDrop.decode expects to work with
358
+ toHex: () => 'some script'
359
+ }
360
+ }
361
+ ]
362
+ // Add the toBEEF method
363
+ mockTx.toBEEF = () => []
364
+ return mockTx
365
+ })
366
+ // Add this to your test alongside the Transaction.fromBEEF mock
367
+ jest.spyOn(MockedBSV_SDK.PushDrop, 'decode').mockReturnValue({
368
+ fields: [
369
+ // Values that will decrypt to the expected values for domain, expiry, and basket
370
+ Utils.toArray('encoded-domain'),
371
+ Utils.toArray('encoded-expiry'),
372
+ Utils.toArray('encoded-basket')
373
+ ]
374
+ })
375
+
376
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com', {
377
+ encryptWalletMetadata: true
378
+ })
379
+ manager.bindCallback('onBasketAccessRequested', x => {
380
+ manager.grantPermission({ requestID: x.requestID, ephemeral: true })
381
+ })
382
+ ;(underlying.listOutputs as any).mockResolvedValue({
383
+ totalOutputs: 1,
384
+ outputs: [
385
+ {
386
+ outpoint: 'fakeTxid.0',
387
+ satoshis: 500,
388
+ lockingScript: 'OP_RETURN something',
389
+ basket: 'some-basket',
390
+ customInstructions: 'bad-ciphertext-of-some-kind'
391
+ }
392
+ ]
393
+ })
394
+
395
+ // Force an error from decrypt
396
+ ;(underlying.decrypt as any).mockImplementationOnce(() => {
397
+ throw new Error('Failed to decrypt')
398
+ })
399
+
400
+ const outputsResult = await manager.listOutputs(
401
+ {
402
+ basket: 'some-basket'
403
+ },
404
+ 'some-origin.com'
405
+ )
406
+
407
+ expect(outputsResult.outputs.length).toBe(1)
408
+ // Should fall back to the original 'bad-ciphertext-of-some-kind'
409
+ expect(outputsResult.outputs[0].customInstructions).toBe('bad-ciphertext-of-some-kind')
410
+ })
411
+ })
412
+ })