@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,117 @@
1
+ import { Beef, SignActionResult, SignActionSpend, Spend, Transaction } from '@bsv/sdk'
2
+ import { PendingSignAction, Wallet } from '../../Wallet'
3
+ import { WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
4
+ import { asBsvSdkScript } from '../../utility/utilityHelpers'
5
+ import { ScriptTemplateBRC29 } from '../../utility/ScriptTemplateBRC29'
6
+ import { WalletError } from '../../sdk/WalletError'
7
+
8
+ export async function completeSignedTransaction(
9
+ prior: PendingSignAction,
10
+ spends: Record<number, SignActionSpend>,
11
+ wallet: Wallet
12
+ ): Promise<Transaction> {
13
+ /////////////////////
14
+ // Insert the user provided unlocking scripts from "spends" arg
15
+ /////////////////////
16
+ for (const [key, spend] of Object.entries(spends)) {
17
+ const vin = Number(key)
18
+ const createInput = prior.args.inputs[vin]
19
+ const input = prior.tx.inputs[vin]
20
+ if (!createInput || !input || createInput.unlockingScript || !Number.isInteger(createInput.unlockingScriptLength))
21
+ throw new WERR_INVALID_PARAMETER(
22
+ 'args',
23
+ `spend does not correspond to prior input with valid unlockingScriptLength.`
24
+ )
25
+ if (spend.unlockingScript.length / 2 > createInput.unlockingScriptLength!)
26
+ throw new WERR_INVALID_PARAMETER(
27
+ 'args',
28
+ `spend unlockingScript length ${spend.unlockingScript.length} exceeds expected length ${createInput.unlockingScriptLength}`
29
+ )
30
+ input.unlockingScript = asBsvSdkScript(spend.unlockingScript)
31
+ if (spend.sequenceNumber !== undefined) input.sequence = spend.sequenceNumber
32
+ }
33
+
34
+ const results = {
35
+ sdk: <SignActionResult>{}
36
+ }
37
+
38
+ /////////////////////
39
+ // Insert SABPPP unlock templates for wallet signed inputs
40
+ /////////////////////
41
+ for (const pdi of prior.pdi) {
42
+ const sabppp = new ScriptTemplateBRC29({
43
+ derivationPrefix: pdi.derivationPrefix,
44
+ derivationSuffix: pdi.derivationSuffix,
45
+ keyDeriver: wallet.keyDeriver
46
+ })
47
+ const keys = wallet.getClientChangeKeyPair()
48
+ const lockerPrivKey = keys.privateKey
49
+ const unlockerPubKey = pdi.unlockerPubKey || keys.publicKey
50
+ const sourceSatoshis = pdi.sourceSatoshis
51
+ const lockingScript = asBsvSdkScript(pdi.lockingScript)
52
+ const unlockTemplate = sabppp.unlock(lockerPrivKey, unlockerPubKey, sourceSatoshis, lockingScript)
53
+ const input = prior.tx.inputs[pdi.vin]
54
+ input.unlockingScriptTemplate = unlockTemplate
55
+ }
56
+
57
+ /////////////////////
58
+ // Sign wallet signed inputs making transaction fully valid.
59
+ /////////////////////
60
+ await prior.tx.sign()
61
+
62
+ return prior.tx
63
+ }
64
+
65
+ /**
66
+ * @param txid The TXID of a transaction in the beef for which all unlocking scripts must be valid.
67
+ * @param beef Must contain transactions for txid and all its inputs.
68
+ * @throws WERR_INVALID_PARAMETER if any unlocking script is invalid, if sourceTXID is invalid, if beef doesn't contain required transactions.
69
+ */
70
+ export function verifyUnlockScripts(txid: string, beef: Beef): void {
71
+ const tx = beef.findTxid(txid)?.tx
72
+ if (!tx) throw new WERR_INVALID_PARAMETER(`txid`, `contained in beef, txid ${txid}`)
73
+
74
+ for (let i = 0; i < tx.inputs.length; i++) {
75
+ const input = tx.inputs[i]
76
+ if (!input.sourceTXID) throw new WERR_INVALID_PARAMETER(`inputs[${i}].sourceTXID`, `valid`)
77
+ if (!input.unlockingScript) throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockingScript`, `valid`)
78
+ input.sourceTransaction = beef.findTxid(input.sourceTXID)?.tx
79
+ if (!input.sourceTransaction) {
80
+ // The beef doesn't contain all the source transactions only if advanced features
81
+ // such as knownTxids are used.
82
+ // Skip unlock script checks.
83
+ return
84
+ // throw new WERR_INVALID_PARAMETER(`inputs[${i}].sourceTXID`, `contained in beef`)
85
+ }
86
+ }
87
+
88
+ for (let i = 0; i < tx.inputs.length; i++) {
89
+ const input = tx.inputs[i]
90
+ const sourceOutput = input.sourceTransaction!.outputs[input.sourceOutputIndex]
91
+
92
+ const otherInputs = tx.inputs.filter((_, idx) => idx !== i)
93
+
94
+ const spend = new Spend({
95
+ sourceTXID: input.sourceTXID!,
96
+ sourceOutputIndex: input.sourceOutputIndex,
97
+ lockingScript: sourceOutput.lockingScript,
98
+ sourceSatoshis: sourceOutput.satoshis ?? 0,
99
+ transactionVersion: tx.version,
100
+ otherInputs,
101
+ unlockingScript: input.unlockingScript!,
102
+ inputSequence: input.sequence ?? 0,
103
+ inputIndex: i,
104
+ outputs: tx.outputs,
105
+ lockTime: tx.lockTime
106
+ })
107
+
108
+ try {
109
+ const spendValid = spend.validate()
110
+
111
+ if (!spendValid) throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockScript`, `valid`)
112
+ } catch (eu: unknown) {
113
+ const e = WalletError.fromUnknown(eu)
114
+ throw new WERR_INVALID_PARAMETER(`inputs[${i}].unlockScript`, `valid. ${e.message}`)
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,172 @@
1
+ import {
2
+ AtomicBEEF,
3
+ Beef,
4
+ CreateActionResult,
5
+ OutpointString,
6
+ SendWithResult,
7
+ SignableTransaction,
8
+ TXIDHexString,
9
+ Script,
10
+ Transaction,
11
+ Validation
12
+ } from '@bsv/sdk'
13
+ import { buildSignableTransaction } from './buildSignableTransaction'
14
+ import {
15
+ AuthId,
16
+ ReviewActionResult,
17
+ StorageProcessActionArgs,
18
+ StorageProcessActionResults
19
+ } from '../../sdk/WalletStorage.interfaces'
20
+ import { completeSignedTransaction, verifyUnlockScripts } from './completeSignedTransaction'
21
+ import { PendingSignAction, Wallet } from '../../Wallet'
22
+ import { WERR_INTERNAL } from '../../sdk/WERR_errors'
23
+
24
+ export interface CreateActionResultX extends CreateActionResult {
25
+ txid?: TXIDHexString
26
+ tx?: AtomicBEEF
27
+ noSendChange?: OutpointString[]
28
+ sendWithResults?: SendWithResult[]
29
+ signableTransaction?: SignableTransaction
30
+ notDelayedResults?: ReviewActionResult[]
31
+ }
32
+
33
+ export async function createAction(
34
+ wallet: Wallet,
35
+ auth: AuthId,
36
+ vargs: Validation.ValidCreateActionArgs
37
+ ): Promise<CreateActionResultX> {
38
+ const r: CreateActionResultX = {}
39
+ const logger = vargs.logger
40
+
41
+ let prior: PendingSignAction | undefined = undefined
42
+
43
+ if (vargs.isNewTx || vargs.isTestWerrReviewActions) {
44
+ prior = await createNewTx(wallet, vargs)
45
+ logger?.log('created new transaction')
46
+
47
+ if (vargs.isSignAction) {
48
+ const r = makeSignableTransactionResult(prior, wallet, vargs)
49
+ logger?.log('created signable transaction result')
50
+ return r
51
+ }
52
+
53
+ prior.tx = await completeSignedTransaction(prior, {}, wallet)
54
+ logger?.log('completed signed transaction')
55
+
56
+ r.txid = prior.tx.id('hex')
57
+ const beef = new Beef()
58
+ if (prior.dcr.inputBeef) beef.mergeBeef(prior.dcr.inputBeef)
59
+ beef.mergeTransaction(prior.tx)
60
+ logger?.log('merged beef')
61
+
62
+ verifyUnlockScripts(r.txid, beef)
63
+ logger?.log('verified unlock scripts')
64
+
65
+ r.noSendChange = prior.dcr.noSendChangeOutputVouts?.map(vout => `${r.txid}.${vout}`)
66
+ if (!vargs.options.returnTXIDOnly) r.tx = beef.toBinaryAtomic(r.txid)
67
+ }
68
+
69
+ const { sendWithResults, notDelayedResults } = await processAction(prior, wallet, auth, vargs)
70
+ logger?.log('processed transaction')
71
+
72
+ r.sendWithResults = sendWithResults
73
+ r.notDelayedResults = notDelayedResults
74
+
75
+ return r
76
+ }
77
+
78
+ async function createNewTx(wallet: Wallet, vargs: Validation.ValidCreateActionArgs): Promise<PendingSignAction> {
79
+ const logger = vargs.logger
80
+ const storageArgs = removeUnlockScripts(vargs)
81
+ const dcr = await wallet.storage.createAction(storageArgs)
82
+
83
+ const reference = dcr.reference
84
+
85
+ const { tx, amount, pdi } = buildSignableTransaction(dcr, vargs, wallet)
86
+ logger?.log('built signable transaction')
87
+
88
+ const prior: PendingSignAction = { reference, dcr, args: vargs, amount, tx, pdi }
89
+
90
+ return prior
91
+ }
92
+
93
+ function makeSignableTransactionResult(
94
+ prior: PendingSignAction,
95
+ wallet: Wallet,
96
+ args: Validation.ValidCreateActionArgs
97
+ ): CreateActionResult {
98
+ if (!prior.dcr.inputBeef) throw new WERR_INTERNAL('prior.dcr.inputBeef must be valid')
99
+
100
+ const txid = prior.tx.id('hex')
101
+
102
+ const r: CreateActionResult = {
103
+ noSendChange: args.isNoSend ? prior.dcr.noSendChangeOutputVouts?.map(vout => `${txid}.${vout}`) : undefined,
104
+ signableTransaction: {
105
+ reference: prior.dcr.reference,
106
+ tx: makeSignableTransactionBeef(prior.tx, prior.dcr.inputBeef)
107
+ }
108
+ }
109
+
110
+ wallet.pendingSignActions[r.signableTransaction!.reference] = prior
111
+
112
+ return r
113
+ }
114
+
115
+ function makeSignableTransactionBeef(tx: Transaction, inputBEEF: number[]): number[] {
116
+ // This is a special case beef for transaction signing.
117
+ // We only need the transaction being signed, and for each input, the raw source transaction.
118
+ const beef = new Beef()
119
+ for (const input of tx.inputs) {
120
+ if (!input.sourceTransaction)
121
+ throw new WERR_INTERNAL('Every signableTransaction input must have a sourceTransaction')
122
+ beef.mergeRawTx(input.sourceTransaction!.toBinary())
123
+ }
124
+ beef.mergeRawTx(tx.toBinary())
125
+ return beef.toBinaryAtomic(tx.id('hex'))
126
+ }
127
+
128
+ function removeUnlockScripts(args: Validation.ValidCreateActionArgs) {
129
+ let storageArgs = args
130
+ if (!storageArgs.inputs.every(i => i.unlockingScript === undefined)) {
131
+ // Never send unlocking scripts to storage, all it needs is the script length.
132
+ storageArgs = { ...args, inputs: [] }
133
+ for (const i of args.inputs) {
134
+ const di: Validation.ValidCreateActionInput = {
135
+ ...i,
136
+ unlockingScriptLength: i.unlockingScript !== undefined ? i.unlockingScript.length : i.unlockingScriptLength
137
+ }
138
+ delete di.unlockingScript
139
+ storageArgs.inputs.push(di)
140
+ }
141
+ }
142
+ return storageArgs
143
+ }
144
+
145
+ export async function processAction(
146
+ prior: PendingSignAction | undefined,
147
+ wallet: Wallet,
148
+ auth: AuthId,
149
+ vargs: Validation.ValidProcessActionArgs
150
+ ): Promise<StorageProcessActionResults> {
151
+ const args: StorageProcessActionArgs = {
152
+ isNewTx: vargs.isNewTx,
153
+ isSendWith: vargs.isSendWith,
154
+ isNoSend: vargs.isNoSend,
155
+ isDelayed: vargs.isDelayed,
156
+ reference: prior ? prior.reference : undefined,
157
+ txid: prior ? prior.tx.id('hex') : undefined,
158
+ rawTx: prior ? prior.tx.toBinary() : undefined,
159
+ sendWith: vargs.isSendWith ? vargs.options.sendWith : [],
160
+ logger: vargs.logger
161
+ }
162
+ const r: StorageProcessActionResults = await wallet.storage.processAction(args)
163
+
164
+ return r
165
+ }
166
+
167
+ function makeDummyTransactionForOutputSatoshis(vout: number, satoshis: number): Transaction {
168
+ const tx = new Transaction()
169
+ for (let i = 0; i < vout; i++) tx.addOutput({ lockingScript: new Script(), satoshis: 0 })
170
+ tx.addOutput({ lockingScript: new Script(), satoshis })
171
+ return tx
172
+ }
@@ -0,0 +1,106 @@
1
+ import { Beef, InternalizeActionArgs, InternalizeOutput, P2PKH, WalletProtocol, Validation } from '@bsv/sdk'
2
+ import { Wallet } from '../../Wallet'
3
+ import { AuthId, StorageInternalizeActionResult } from '../../sdk/WalletStorage.interfaces'
4
+ import { WERR_INTERNAL, WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
5
+
6
+ /**
7
+ * Internalize Action allows a wallet to take ownership of outputs in a pre-existing transaction.
8
+ * The transaction may, or may not already be known to both the storage and user.
9
+ *
10
+ * Two types of outputs are handled: "wallet payments" and "basket insertions".
11
+ *
12
+ * A "basket insertion" output is considered a custom output and has no effect on the wallet's "balance".
13
+ *
14
+ * A "wallet payment" adds an outputs value to the wallet's change "balance". These outputs are assigned to the "default" basket.
15
+ *
16
+ * Processing starts with simple validation and then checks for a pre-existing transaction.
17
+ * If the transaction is already known to the user, then the outputs are reviewed against the existing outputs treatment,
18
+ * and merge rules are added to the arguments passed to the storage layer.
19
+ * The existing transaction must be in the 'unproven' or 'completed' status. Any other status is an error.
20
+ *
21
+ * When the transaction already exists, the description is updated. The isOutgoing sense is not changed.
22
+ *
23
+ * "basket insertion" Merge Rules:
24
+ * 1. The "default" basket may not be specified as the insertion basket.
25
+ * 2. A change output in the "default" basket may not be target of an insertion into a different basket.
26
+ * 3. These baskets do not affect the wallet's balance and are typed "custom".
27
+ *
28
+ * "wallet payment" Merge Rules:
29
+ * 1. Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
30
+ * 2. Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's `amount`, and the wallet balance.
31
+ *
32
+ */
33
+ export async function internalizeAction(
34
+ wallet: Wallet,
35
+ auth: AuthId,
36
+ args: InternalizeActionArgs
37
+ ): Promise<StorageInternalizeActionResult> {
38
+ const vargs = Validation.validateInternalizeActionArgs(args)
39
+
40
+ const { ab, tx, txid } = await validateAtomicBeef()
41
+ const brc29ProtocolID: WalletProtocol = [2, '3241645161d8']
42
+
43
+ for (const o of vargs.outputs) {
44
+ if (o.outputIndex < 0 || o.outputIndex >= tx.outputs.length)
45
+ throw new WERR_INVALID_PARAMETER('outputIndex', `a valid output index in range 0 to ${tx.outputs.length - 1}`)
46
+ switch (o.protocol) {
47
+ case 'basket insertion':
48
+ setupBasketInsertionForOutput(o, vargs)
49
+ break
50
+ case 'wallet payment':
51
+ setupWalletPaymentForOutput(o, vargs)
52
+ break
53
+ default:
54
+ throw new WERR_INTERNAL(`unexpected protocol ${o.protocol}`)
55
+ }
56
+ }
57
+
58
+ const r: StorageInternalizeActionResult = await wallet.storage.internalizeAction(args)
59
+
60
+ return r
61
+
62
+ function setupWalletPaymentForOutput(o: InternalizeOutput, dargs: Validation.ValidInternalizeActionArgs) {
63
+ const p = o.paymentRemittance
64
+ const output = tx.outputs[o.outputIndex]
65
+ if (!p) throw new WERR_INVALID_PARAMETER('paymentRemittance', `valid for protocol ${o.protocol}`)
66
+
67
+ const keyID = `${p.derivationPrefix} ${p.derivationSuffix}`
68
+
69
+ const privKey = wallet.keyDeriver!.derivePrivateKey(brc29ProtocolID, keyID, p.senderIdentityKey)
70
+ const expectedLockScript = new P2PKH().lock(privKey.toAddress())
71
+ if (output.lockingScript.toHex() !== expectedLockScript.toHex())
72
+ throw new WERR_INVALID_PARAMETER('paymentRemittance', `locked by script conforming to BRC-29`)
73
+ }
74
+
75
+ function setupBasketInsertionForOutput(o: InternalizeOutput, dargs: Validation.ValidInternalizeActionArgs) {
76
+ /*
77
+ No additional validations...
78
+ */
79
+ }
80
+
81
+ /**
82
+ * Verifies that the `tx` argument passed to internalizeAction is a valid AtomicBEEF,
83
+ * and the proofs are valid according to the wallet's configured chainTracker.
84
+ * THIS DOES NOT GUARANTEE:
85
+ * 1. That the transaction has been broadcast. (Is known to the network).
86
+ * 2. That the proofs are for the same block as recorded in the wallet's configured storage in the event of a reorg.
87
+ */
88
+ async function validateAtomicBeef() {
89
+ const ab = Beef.fromBinary(vargs.tx)
90
+
91
+ // TODO: Add support for known txids...which would speed up processing by avoiding a network call,
92
+ // unless a local chaintracker is used.
93
+
94
+ const txValid = await ab.verify(await wallet.getServices().getChainTracker(), false)
95
+ if (!txValid || !ab.atomicTxid) {
96
+ console.log(`internalizeAction beef is invalid: ${ab.toLogString()}`)
97
+ throw new WERR_INVALID_PARAMETER('tx', 'valid AtomicBEEF')
98
+ }
99
+ const txid = ab.atomicTxid
100
+ const btx = ab.findTxid(txid)
101
+ if (!btx) throw new WERR_INVALID_PARAMETER('tx', `valid AtomicBEEF with newest txid of ${txid}`)
102
+ const tx = btx.tx!
103
+
104
+ return { ab, tx, txid }
105
+ }
106
+ }
@@ -0,0 +1,43 @@
1
+ import { MasterCertificate, ProveCertificateResult, Validation } from '@bsv/sdk'
2
+ import { Wallet } from '../../Wallet'
3
+ import { WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
4
+ import { AuthId } from '../../sdk/WalletStorage.interfaces'
5
+
6
+ export async function proveCertificate(
7
+ wallet: Wallet,
8
+ auth: AuthId,
9
+ vargs: Validation.ValidProveCertificateArgs
10
+ ): Promise<ProveCertificateResult> {
11
+ const lcargs: Validation.ValidListCertificatesArgs = {
12
+ partial: {
13
+ type: vargs.type,
14
+ serialNumber: vargs.serialNumber,
15
+ certifier: vargs.certifier,
16
+ subject: vargs.subject,
17
+ revocationOutpoint: vargs.revocationOutpoint,
18
+ signature: vargs.signature
19
+ },
20
+ certifiers: [],
21
+ types: [],
22
+ limit: 2,
23
+ offset: 0,
24
+ privileged: false
25
+ }
26
+
27
+ const lcr = await wallet.storage.listCertificates(lcargs)
28
+ if (lcr.certificates.length != 1) throw new WERR_INVALID_PARAMETER('args', `a unique certificate match`)
29
+ const storageCert = lcr.certificates[0]
30
+ const keyringForVerifier = await MasterCertificate.createKeyringForVerifier(
31
+ wallet,
32
+ storageCert.certifier,
33
+ vargs.verifier,
34
+ storageCert.fields,
35
+ vargs.fieldsToReveal,
36
+ storageCert.keyring!,
37
+ storageCert.serialNumber,
38
+ vargs.privileged,
39
+ vargs.privilegedReason
40
+ )
41
+
42
+ return { keyringForVerifier }
43
+ }
@@ -0,0 +1,54 @@
1
+ import { AtomicBEEF, Beef, SendWithResult, SignActionArgs, SignActionResult, TXIDHexString, Validation } from '@bsv/sdk'
2
+ import { processAction } from './createAction'
3
+ import { AuthId, ReviewActionResult } from '../../sdk/WalletStorage.interfaces'
4
+ import { completeSignedTransaction, verifyUnlockScripts } from './completeSignedTransaction'
5
+ import { Wallet } from '../../Wallet'
6
+ import { WERR_INTERNAL, WERR_NOT_IMPLEMENTED } from '../../sdk/WERR_errors'
7
+
8
+ export interface SignActionResultX extends SignActionResult {
9
+ txid?: TXIDHexString
10
+ tx?: AtomicBEEF
11
+ sendWithResults?: SendWithResult[]
12
+ notDelayedResults?: ReviewActionResult[]
13
+ }
14
+
15
+ export async function signAction(wallet: Wallet, auth: AuthId, args: SignActionArgs): Promise<SignActionResultX> {
16
+ const prior = wallet.pendingSignActions[args.reference]
17
+ if (!prior)
18
+ throw new WERR_NOT_IMPLEMENTED('recovery of out-of-session signAction reference data is not yet implemented.')
19
+ if (!prior.dcr.inputBeef) throw new WERR_INTERNAL('prior.dcr.inputBeef must be valid')
20
+
21
+ const vargs = mergePriorOptions(prior.args, args)
22
+
23
+ prior.tx = await completeSignedTransaction(prior, vargs.spends, wallet)
24
+
25
+ const { sendWithResults, notDelayedResults } = await processAction(prior, wallet, auth, vargs)
26
+
27
+ const txid = prior.tx.id('hex')
28
+ const beef = Beef.fromBinary(prior.dcr.inputBeef)
29
+ beef.mergeTransaction(prior.tx)
30
+
31
+ verifyUnlockScripts(txid, beef)
32
+
33
+ const r: SignActionResultX = {
34
+ txid: prior.tx.id('hex'),
35
+ tx: vargs.options.returnTXIDOnly ? undefined : beef.toBinaryAtomic(txid),
36
+ sendWithResults,
37
+ notDelayedResults
38
+ }
39
+
40
+ return r
41
+ }
42
+
43
+ function mergePriorOptions(
44
+ caVargs: Validation.ValidCreateActionArgs,
45
+ saArgs: SignActionArgs
46
+ ): Validation.ValidSignActionArgs {
47
+ const saOptions = (saArgs.options ||= {})
48
+ if (saOptions.acceptDelayedBroadcast === undefined)
49
+ saOptions.acceptDelayedBroadcast = caVargs.options.acceptDelayedBroadcast
50
+ if (saOptions.returnTXIDOnly === undefined) saOptions.returnTXIDOnly = caVargs.options.returnTXIDOnly
51
+ if (saOptions.noSend === undefined) saOptions.noSend = caVargs.options.noSend
52
+ if (saOptions.sendWith === undefined) saOptions.sendWith = caVargs.options.sendWith
53
+ return Validation.validateSignActionArgs(saArgs)
54
+ }
@@ -0,0 +1,14 @@
1
+ # WalletStorage
2
+
3
+ Provides access to persistent storage in support of Wallet.interfaces.
4
+
5
+ This includes:
6
+
7
+ - Direct storage on a variety of databases.
8
+ - Remoted storage to service providers for backup and mobile support.
9
+ - Synchronization between multiple stores.
10
+ - Import from legacy stores.
11
+ - Support single user, multi-read/single write, full multi-user modes.
12
+
13
+
14
+