@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,369 @@
1
+ import { Beef, ListActionsResult, ListOutputsResult, Validation } from '@bsv/sdk'
2
+ import {
3
+ TrxToken,
4
+ PurgeParams,
5
+ PurgeResults,
6
+ ProvenOrRawTx,
7
+ AuthId,
8
+ FindCertificatesArgs,
9
+ FindOutputBasketsArgs,
10
+ FindOutputsArgs,
11
+ FindOutputTagMapsArgs,
12
+ FindProvenTxReqsArgs,
13
+ FindProvenTxsArgs,
14
+ FindTxLabelMapsArgs,
15
+ FindCertificateFieldsArgs,
16
+ FindCommissionsArgs,
17
+ FindMonitorEventsArgs,
18
+ FindOutputTagsArgs,
19
+ FindSyncStatesArgs,
20
+ FindTransactionsArgs,
21
+ FindTxLabelsArgs,
22
+ FindUsersArgs,
23
+ FindForUserSincePagedArgs,
24
+ StorageGetBeefOptions
25
+ } from '../../sdk'
26
+ import {
27
+ TableCertificate,
28
+ TableCertificateField,
29
+ TableCertificateX,
30
+ TableCommission,
31
+ TableMonitorEvent,
32
+ TableOutput,
33
+ TableOutputBasket,
34
+ TableOutputTag,
35
+ TableOutputTagMap,
36
+ TableProvenTx,
37
+ TableProvenTxReq,
38
+ TableSettings,
39
+ TableSyncState,
40
+ TableTransaction,
41
+ TableTxLabel,
42
+ TableTxLabelMap,
43
+ TableUser,
44
+ Services,
45
+ StorageAdminStats
46
+ } from '../../index.client'
47
+ import { StorageProvider } from '../../storage/StorageProvider'
48
+
49
+ export async function getBeefForTxid(services: Services, txid: string): Promise<Beef> {
50
+ const storage = new ServicesOnlyStorageProvider(services)
51
+ const beef = await storage.getBeefForTxid(txid)
52
+ return beef
53
+ }
54
+
55
+ /**
56
+ * The generalized implementation of getBeefForTransaction uses storage to
57
+ * avoid incurring the cost of redundant block chain data queries.
58
+ *
59
+ * This class makes the generalized implementation of getBeefForTransaction
60
+ * available in situations where there storage is not relevant.
61
+ */
62
+ class ServicesOnlyStorageProvider extends StorageProvider {
63
+ gbo: StorageGetBeefOptions
64
+
65
+ constructor(services: Services) {
66
+ const o = StorageProvider.createStorageBaseOptions(services.chain)
67
+ super(o)
68
+ this.setServices(services)
69
+ this.gbo = {
70
+ ignoreServices: false,
71
+ ignoreStorage: true,
72
+ ignoreNewProven: true
73
+ }
74
+ }
75
+
76
+ async getBeefForTxid(txid: string): Promise<Beef> {
77
+ const beef = await this.getBeefForTransaction(txid, this.gbo)
78
+ return beef
79
+ }
80
+
81
+ nip = new Error('Method not implemented.')
82
+ override reviewStatus(args: { agedLimit: Date; trx?: TrxToken }): Promise<{ log: string }> {
83
+ throw this.nip
84
+ }
85
+ override purgeData(params: PurgeParams, trx?: TrxToken): Promise<PurgeResults> {
86
+ throw this.nip
87
+ }
88
+ override allocateChangeInput(
89
+ userId: number,
90
+ basketId: number,
91
+ targetSatoshis: number,
92
+ exactSatoshis: number | undefined,
93
+ excludeSending: boolean,
94
+ transactionId: number
95
+ ): Promise<TableOutput | undefined> {
96
+ throw this.nip
97
+ }
98
+ override getProvenOrRawTx(txid: string, trx?: TrxToken): Promise<ProvenOrRawTx> {
99
+ throw this.nip
100
+ }
101
+ override getRawTxOfKnownValidTransaction(
102
+ txid?: string,
103
+ offset?: number,
104
+ length?: number,
105
+ trx?: TrxToken
106
+ ): Promise<number[] | undefined> {
107
+ throw this.nip
108
+ }
109
+ override getLabelsForTransactionId(transactionId?: number, trx?: TrxToken): Promise<TableTxLabel[]> {
110
+ throw this.nip
111
+ }
112
+ override getTagsForOutputId(outputId: number, trx?: TrxToken): Promise<TableOutputTag[]> {
113
+ throw this.nip
114
+ }
115
+ override listActions(auth: AuthId, args: Validation.ValidListActionsArgs): Promise<ListActionsResult> {
116
+ throw this.nip
117
+ }
118
+ override listOutputs(auth: AuthId, args: Validation.ValidListOutputsArgs): Promise<ListOutputsResult> {
119
+ throw this.nip
120
+ }
121
+ override countChangeInputs(userId: number, basketId: number, excludeSending: boolean): Promise<number> {
122
+ throw this.nip
123
+ }
124
+ override findCertificatesAuth(auth: AuthId, args: FindCertificatesArgs): Promise<TableCertificateX[]> {
125
+ throw this.nip
126
+ }
127
+ override findOutputBasketsAuth(auth: AuthId, args: FindOutputBasketsArgs): Promise<TableOutputBasket[]> {
128
+ throw this.nip
129
+ }
130
+ override findOutputsAuth(auth: AuthId, args: FindOutputsArgs): Promise<TableOutput[]> {
131
+ throw this.nip
132
+ }
133
+ override insertCertificateAuth(auth: AuthId, certificate: TableCertificateX): Promise<number> {
134
+ throw this.nip
135
+ }
136
+ override dropAllData(): Promise<void> {
137
+ throw this.nip
138
+ }
139
+ override migrate(storageName: string, storageIdentityKey: string): Promise<string> {
140
+ throw this.nip
141
+ }
142
+ override findOutputTagMaps(args: FindOutputTagMapsArgs): Promise<TableOutputTagMap[]> {
143
+ throw this.nip
144
+ }
145
+ override findProvenTxReqs(args: FindProvenTxReqsArgs): Promise<TableProvenTxReq[]> {
146
+ throw this.nip
147
+ }
148
+ override findProvenTxs(args: FindProvenTxsArgs): Promise<TableProvenTx[]> {
149
+ throw this.nip
150
+ }
151
+ override findTxLabelMaps(args: FindTxLabelMapsArgs): Promise<TableTxLabelMap[]> {
152
+ throw this.nip
153
+ }
154
+ override countOutputTagMaps(args: FindOutputTagMapsArgs): Promise<number> {
155
+ throw this.nip
156
+ }
157
+ override countProvenTxReqs(args: FindProvenTxReqsArgs): Promise<number> {
158
+ throw this.nip
159
+ }
160
+ override countProvenTxs(args: FindProvenTxsArgs): Promise<number> {
161
+ throw this.nip
162
+ }
163
+ override countTxLabelMaps(args: FindTxLabelMapsArgs): Promise<number> {
164
+ throw this.nip
165
+ }
166
+ override insertCertificate(certificate: TableCertificate, trx?: TrxToken): Promise<number> {
167
+ throw this.nip
168
+ }
169
+ override insertCertificateField(certificateField: TableCertificateField, trx?: TrxToken): Promise<void> {
170
+ throw this.nip
171
+ }
172
+ override insertCommission(commission: TableCommission, trx?: TrxToken): Promise<number> {
173
+ throw this.nip
174
+ }
175
+ override insertMonitorEvent(event: TableMonitorEvent, trx?: TrxToken): Promise<number> {
176
+ throw this.nip
177
+ }
178
+ override insertOutput(output: TableOutput, trx?: TrxToken): Promise<number> {
179
+ throw this.nip
180
+ }
181
+ override insertOutputBasket(basket: TableOutputBasket, trx?: TrxToken): Promise<number> {
182
+ throw this.nip
183
+ }
184
+ override insertOutputTag(tag: TableOutputTag, trx?: TrxToken): Promise<number> {
185
+ throw this.nip
186
+ }
187
+ override insertOutputTagMap(tagMap: TableOutputTagMap, trx?: TrxToken): Promise<void> {
188
+ throw this.nip
189
+ }
190
+ override insertProvenTx(tx: TableProvenTx, trx?: TrxToken): Promise<number> {
191
+ throw this.nip
192
+ }
193
+ override insertProvenTxReq(tx: TableProvenTxReq, trx?: TrxToken): Promise<number> {
194
+ throw this.nip
195
+ }
196
+ override insertSyncState(syncState: TableSyncState, trx?: TrxToken): Promise<number> {
197
+ throw this.nip
198
+ }
199
+ override insertTransaction(tx: TableTransaction, trx?: TrxToken): Promise<number> {
200
+ throw this.nip
201
+ }
202
+ override insertTxLabel(label: TableTxLabel, trx?: TrxToken): Promise<number> {
203
+ throw this.nip
204
+ }
205
+ override insertTxLabelMap(labelMap: TableTxLabelMap, trx?: TrxToken): Promise<void> {
206
+ throw this.nip
207
+ }
208
+ override insertUser(user: TableUser, trx?: TrxToken): Promise<number> {
209
+ throw this.nip
210
+ }
211
+ override updateCertificate(id: number, update: Partial<TableCertificate>, trx?: TrxToken): Promise<number> {
212
+ throw this.nip
213
+ }
214
+ override updateCertificateField(
215
+ certificateId: number,
216
+ fieldName: string,
217
+ update: Partial<TableCertificateField>,
218
+ trx?: TrxToken
219
+ ): Promise<number> {
220
+ throw this.nip
221
+ }
222
+ override updateCommission(id: number, update: Partial<TableCommission>, trx?: TrxToken): Promise<number> {
223
+ throw this.nip
224
+ }
225
+ override updateMonitorEvent(id: number, update: Partial<TableMonitorEvent>, trx?: TrxToken): Promise<number> {
226
+ throw this.nip
227
+ }
228
+ override updateOutput(id: number, update: Partial<TableOutput>, trx?: TrxToken): Promise<number> {
229
+ throw this.nip
230
+ }
231
+ override updateOutputBasket(id: number, update: Partial<TableOutputBasket>, trx?: TrxToken): Promise<number> {
232
+ throw this.nip
233
+ }
234
+ override updateOutputTag(id: number, update: Partial<TableOutputTag>, trx?: TrxToken): Promise<number> {
235
+ throw this.nip
236
+ }
237
+ override updateOutputTagMap(
238
+ outputId: number,
239
+ tagId: number,
240
+ update: Partial<TableOutputTagMap>,
241
+ trx?: TrxToken
242
+ ): Promise<number> {
243
+ throw this.nip
244
+ }
245
+ override updateProvenTx(id: number, update: Partial<TableProvenTx>, trx?: TrxToken): Promise<number> {
246
+ throw this.nip
247
+ }
248
+ override updateProvenTxReq(
249
+ id: number | number[],
250
+ update: Partial<TableProvenTxReq>,
251
+ trx?: TrxToken
252
+ ): Promise<number> {
253
+ throw this.nip
254
+ }
255
+ override updateSyncState(id: number, update: Partial<TableSyncState>, trx?: TrxToken): Promise<number> {
256
+ throw this.nip
257
+ }
258
+ override updateTransaction(
259
+ id: number | number[],
260
+ update: Partial<TableTransaction>,
261
+ trx?: TrxToken
262
+ ): Promise<number> {
263
+ throw this.nip
264
+ }
265
+ override updateTxLabel(id: number, update: Partial<TableTxLabel>, trx?: TrxToken): Promise<number> {
266
+ throw this.nip
267
+ }
268
+ override updateTxLabelMap(
269
+ transactionId: number,
270
+ txLabelId: number,
271
+ update: Partial<TableTxLabelMap>,
272
+ trx?: TrxToken
273
+ ): Promise<number> {
274
+ throw this.nip
275
+ }
276
+ override updateUser(id: number, update: Partial<TableUser>, trx?: TrxToken): Promise<number> {
277
+ throw this.nip
278
+ }
279
+ override destroy(): Promise<void> {
280
+ throw this.nip
281
+ }
282
+ override transaction<T>(scope: (trx: TrxToken) => Promise<T>, trx?: TrxToken): Promise<T> {
283
+ throw this.nip
284
+ }
285
+ override readSettings(trx?: TrxToken): Promise<TableSettings> {
286
+ throw this.nip
287
+ }
288
+ override findCertificateFields(args: FindCertificateFieldsArgs): Promise<TableCertificateField[]> {
289
+ throw this.nip
290
+ }
291
+ override findCertificates(args: FindCertificatesArgs): Promise<TableCertificateX[]> {
292
+ throw this.nip
293
+ }
294
+ override findCommissions(args: FindCommissionsArgs): Promise<TableCommission[]> {
295
+ throw this.nip
296
+ }
297
+ override findMonitorEvents(args: FindMonitorEventsArgs): Promise<TableMonitorEvent[]> {
298
+ throw this.nip
299
+ }
300
+ override findOutputBaskets(args: FindOutputBasketsArgs): Promise<TableOutputBasket[]> {
301
+ throw this.nip
302
+ }
303
+ override findOutputs(args: FindOutputsArgs): Promise<TableOutput[]> {
304
+ throw this.nip
305
+ }
306
+ override findOutputTags(args: FindOutputTagsArgs): Promise<TableOutputTag[]> {
307
+ throw this.nip
308
+ }
309
+ override findSyncStates(args: FindSyncStatesArgs): Promise<TableSyncState[]> {
310
+ throw this.nip
311
+ }
312
+ override findTransactions(args: FindTransactionsArgs): Promise<TableTransaction[]> {
313
+ throw this.nip
314
+ }
315
+ override findTxLabels(args: FindTxLabelsArgs): Promise<TableTxLabel[]> {
316
+ throw this.nip
317
+ }
318
+ override findUsers(args: FindUsersArgs): Promise<TableUser[]> {
319
+ throw this.nip
320
+ }
321
+ override countCertificateFields(args: FindCertificateFieldsArgs): Promise<number> {
322
+ throw this.nip
323
+ }
324
+ override countCertificates(args: FindCertificatesArgs): Promise<number> {
325
+ throw this.nip
326
+ }
327
+ override countCommissions(args: FindCommissionsArgs): Promise<number> {
328
+ throw this.nip
329
+ }
330
+ override countMonitorEvents(args: FindMonitorEventsArgs): Promise<number> {
331
+ throw this.nip
332
+ }
333
+ override countOutputBaskets(args: FindOutputBasketsArgs): Promise<number> {
334
+ throw this.nip
335
+ }
336
+ override countOutputs(args: FindOutputsArgs): Promise<number> {
337
+ throw this.nip
338
+ }
339
+ override countOutputTags(args: FindOutputTagsArgs): Promise<number> {
340
+ throw this.nip
341
+ }
342
+ override countSyncStates(args: FindSyncStatesArgs): Promise<number> {
343
+ throw this.nip
344
+ }
345
+ override countTransactions(args: FindTransactionsArgs): Promise<number> {
346
+ throw this.nip
347
+ }
348
+ override countTxLabels(args: FindTxLabelsArgs): Promise<number> {
349
+ throw this.nip
350
+ }
351
+ override countUsers(args: FindUsersArgs): Promise<number> {
352
+ throw this.nip
353
+ }
354
+ override getProvenTxsForUser(args: FindForUserSincePagedArgs): Promise<TableProvenTx[]> {
355
+ throw this.nip
356
+ }
357
+ override getProvenTxReqsForUser(args: FindForUserSincePagedArgs): Promise<TableProvenTxReq[]> {
358
+ throw this.nip
359
+ }
360
+ override getTxLabelMapsForUser(args: FindForUserSincePagedArgs): Promise<TableTxLabelMap[]> {
361
+ throw this.nip
362
+ }
363
+ override getOutputTagMapsForUser(args: FindForUserSincePagedArgs): Promise<TableOutputTagMap[]> {
364
+ throw this.nip
365
+ }
366
+ override adminStats(adminIdentityKey: string): Promise<StorageAdminStats> {
367
+ throw this.nip
368
+ }
369
+ }
@@ -0,0 +1,5 @@
1
+ # WalletSigner
2
+
3
+ Combines KeyDeriver and WalletStorage to implement the full Wallet.interfaces.
4
+
5
+
@@ -0,0 +1,17 @@
1
+ import { KeyDeriverApi } from '@bsv/sdk'
2
+ import { WalletStorageManager } from '../storage/WalletStorageManager'
3
+ import { Chain } from '../sdk/types'
4
+
5
+ export class WalletSigner {
6
+ isWalletSigner: true = true
7
+
8
+ chain: Chain
9
+ keyDeriver: KeyDeriverApi
10
+ storage: WalletStorageManager
11
+
12
+ constructor(chain: Chain, keyDeriver: KeyDeriverApi, storage: WalletStorageManager) {
13
+ this.chain = chain
14
+ this.keyDeriver = keyDeriver
15
+ this.storage = storage
16
+ }
17
+ }
@@ -0,0 +1,52 @@
1
+ import { AcquireCertificateResult, Validation } from '@bsv/sdk'
2
+ import { Wallet } from '../../Wallet'
3
+ import { AuthId } from '../../sdk/WalletStorage.interfaces'
4
+ import { TableCertificateX } from '../../storage/schema/tables/TableCertificate'
5
+
6
+ export async function acquireDirectCertificate(
7
+ wallet: Wallet,
8
+ auth: AuthId,
9
+ vargs: Validation.ValidAcquireDirectCertificateArgs
10
+ ): Promise<AcquireCertificateResult> {
11
+ const now = new Date()
12
+ const newCert: TableCertificateX = {
13
+ certificateId: 0, // replaced by storage insert
14
+ created_at: now,
15
+ updated_at: now,
16
+ userId: auth.userId!,
17
+ type: vargs.type,
18
+ subject: vargs.subject,
19
+ verifier: vargs.keyringRevealer === 'certifier' ? vargs.certifier : vargs.keyringRevealer,
20
+ serialNumber: vargs.serialNumber,
21
+ certifier: vargs.certifier,
22
+ revocationOutpoint: vargs.revocationOutpoint,
23
+ signature: vargs.signature,
24
+ fields: [],
25
+ isDeleted: false
26
+ }
27
+ for (const [name, value] of Object.entries(vargs.fields)) {
28
+ newCert.fields?.push({
29
+ certificateId: 0, // replaced by storage insert
30
+ created_at: now,
31
+ updated_at: now,
32
+ userId: auth.userId!,
33
+ fieldName: name,
34
+ fieldValue: value,
35
+ masterKey: vargs.keyringForSubject[name] || ''
36
+ })
37
+ }
38
+
39
+ const count = await wallet.storage.insertCertificate(newCert)
40
+
41
+ const r: AcquireCertificateResult = {
42
+ type: vargs.type,
43
+ subject: vargs.subject,
44
+ serialNumber: vargs.serialNumber,
45
+ certifier: vargs.certifier,
46
+ revocationOutpoint: vargs.revocationOutpoint,
47
+ signature: vargs.signature,
48
+ fields: vargs.fields
49
+ }
50
+
51
+ return r
52
+ }
@@ -0,0 +1,183 @@
1
+ import { Beef, Script, Transaction, TransactionInput, TransactionOutput, Validation } from '@bsv/sdk'
2
+ import { Wallet, PendingStorageInput } from '../../Wallet'
3
+ import {
4
+ StorageCreateActionResult,
5
+ StorageCreateTransactionSdkInput,
6
+ StorageCreateTransactionSdkOutput
7
+ } from '../../sdk/WalletStorage.interfaces'
8
+ import { WERR_INVALID_PARAMETER } from '../../sdk/WERR_errors'
9
+ import { asBsvSdkScript, verifyTruthy } from '../../utility/utilityHelpers'
10
+ import { KeyPair } from '../../sdk/types'
11
+ import { ScriptTemplateBRC29 } from '../../utility/ScriptTemplateBRC29'
12
+
13
+ export function buildSignableTransaction(
14
+ dctr: StorageCreateActionResult,
15
+ args: Validation.ValidCreateActionArgs,
16
+ wallet: Wallet
17
+ ): {
18
+ tx: Transaction
19
+ amount: number
20
+ pdi: PendingStorageInput[]
21
+ log: string
22
+ } {
23
+ const changeKeys = wallet.getClientChangeKeyPair()
24
+
25
+ const inputBeef = args.inputBEEF ? Beef.fromBinary(args.inputBEEF) : undefined
26
+
27
+ const { inputs: storageInputs, outputs: storageOutputs } = dctr
28
+
29
+ const tx = new Transaction(args.version, [], [], args.lockTime)
30
+
31
+ // The order of outputs in storageOutputs is always:
32
+ // CreateActionArgs.outputs in the original order
33
+ // Commission output
34
+ // Change outputs
35
+ // The Vout values will be randomized if args.options.randomizeOutputs is true. Default is true.
36
+ const voutToIndex = Array<number>(storageOutputs.length)
37
+ for (let vout = 0; vout < storageOutputs.length; vout++) {
38
+ const i = storageOutputs.findIndex(o => o.vout === vout)
39
+ if (i < 0) throw new WERR_INVALID_PARAMETER('output.vout', `sequential. ${vout} is missing`)
40
+ voutToIndex[vout] = i
41
+ }
42
+
43
+ //////////////
44
+ // Add OUTPUTS
45
+ /////////////
46
+ for (let vout = 0; vout < storageOutputs.length; vout++) {
47
+ const i = voutToIndex[vout]
48
+ const out = storageOutputs[i]
49
+ if (vout !== out.vout)
50
+ throw new WERR_INVALID_PARAMETER('output.vout', `equal to array index. ${out.vout} !== ${vout}`)
51
+
52
+ const change = out.providedBy === 'storage' && out.purpose === 'change'
53
+
54
+ const lockingScript = change
55
+ ? makeChangeLock(out, dctr, args, changeKeys, wallet)
56
+ : asBsvSdkScript(out.lockingScript)
57
+
58
+ const output: TransactionOutput = {
59
+ satoshis: out.satoshis,
60
+ lockingScript,
61
+ change
62
+ }
63
+ tx.addOutput(output)
64
+ }
65
+
66
+ if (storageOutputs.length === 0) {
67
+ // Add a dummy output to avoid transaction rejection by processors for having no outputs.
68
+ const output: TransactionOutput = {
69
+ satoshis: 0,
70
+ lockingScript: Script.fromASM('OP_FALSE OP_RETURN 42'),
71
+ change: false
72
+ }
73
+ tx.addOutput(output)
74
+ }
75
+
76
+ //////////////
77
+ // Merge and sort INPUTS info by vin order.
78
+ /////////////
79
+ const inputs: {
80
+ argsInput: Validation.ValidCreateActionInput | undefined
81
+ storageInput: StorageCreateTransactionSdkInput
82
+ }[] = []
83
+ for (const storageInput of storageInputs) {
84
+ const argsInput =
85
+ storageInput.vin !== undefined && storageInput.vin < args.inputs.length
86
+ ? args.inputs[storageInput.vin]
87
+ : undefined
88
+ inputs.push({ argsInput, storageInput })
89
+ }
90
+ inputs.sort((a, b) =>
91
+ a.storageInput.vin! < b.storageInput.vin! ? -1 : a.storageInput.vin! === b.storageInput.vin! ? 0 : 1
92
+ )
93
+
94
+ const pendingStorageInputs: PendingStorageInput[] = []
95
+
96
+ //////////////
97
+ // Add INPUTS
98
+ /////////////
99
+ let totalChangeInputs = 0
100
+ for (const { storageInput, argsInput } of inputs) {
101
+ // Two types of inputs are handled: user specified wth/without unlockingScript and storage specified using SABPPP template.
102
+ if (argsInput) {
103
+ // Type 1: User supplied input, with or without an explicit unlockingScript.
104
+ // If without, signAction must be used to provide the actual unlockScript.
105
+ const hasUnlock = typeof argsInput.unlockingScript === 'string'
106
+ const unlock = hasUnlock ? asBsvSdkScript(argsInput.unlockingScript!) : new Script()
107
+ const sourceTransaction = args.isSignAction ? inputBeef?.findTxid(argsInput.outpoint.txid)?.tx : undefined
108
+ const inputToAdd: TransactionInput = {
109
+ sourceTXID: argsInput.outpoint.txid,
110
+ sourceOutputIndex: argsInput.outpoint.vout,
111
+ // Include the source transaction for access to the outputs locking script and output satoshis for user side fee calculation.
112
+ // TODO: Make this conditional to improve performance when user can supply locking scripts themselves.
113
+ sourceTransaction,
114
+ unlockingScript: unlock,
115
+ sequence: argsInput.sequenceNumber
116
+ }
117
+ tx.addInput(inputToAdd)
118
+ } else {
119
+ // Type2: SABPPP protocol inputs which are signed using ScriptTemplateBRC29.
120
+ if (storageInput.type !== 'P2PKH')
121
+ throw new WERR_INVALID_PARAMETER(
122
+ 'type',
123
+ `vin ${storageInput.vin}, "${storageInput.type}" is not a supported unlocking script type.`
124
+ )
125
+
126
+ pendingStorageInputs.push({
127
+ vin: tx.inputs.length,
128
+ derivationPrefix: verifyTruthy(storageInput.derivationPrefix),
129
+ derivationSuffix: verifyTruthy(storageInput.derivationSuffix),
130
+ unlockerPubKey: storageInput.senderIdentityKey,
131
+ sourceSatoshis: storageInput.sourceSatoshis,
132
+ lockingScript: storageInput.sourceLockingScript
133
+ })
134
+
135
+ const inputToAdd: TransactionInput = {
136
+ sourceTXID: storageInput.sourceTxid,
137
+ sourceOutputIndex: storageInput.sourceVout,
138
+ sourceTransaction: storageInput.sourceTransaction
139
+ ? Transaction.fromBinary(storageInput.sourceTransaction)
140
+ : undefined,
141
+ unlockingScript: new Script(),
142
+ sequence: 0xffffffff
143
+ }
144
+ tx.addInput(inputToAdd)
145
+ totalChangeInputs += Validation.validateSatoshis(storageInput.sourceSatoshis, 'storageInput.sourceSatoshis')
146
+ }
147
+ }
148
+
149
+ // The amount is the total of non-foreign inputs minus change outputs
150
+ // Note that the amount can be negative when we are redeeming more inputs than we are spending
151
+ const totalChangeOutputs = storageOutputs
152
+ .filter(x => x.purpose === 'change')
153
+ .reduce((acc, el) => acc + el.satoshis, 0)
154
+ const amount = totalChangeInputs - totalChangeOutputs
155
+
156
+ return {
157
+ tx,
158
+ amount,
159
+ pdi: pendingStorageInputs,
160
+ log: ''
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Derive a change output locking script
166
+ */
167
+ export function makeChangeLock(
168
+ out: StorageCreateTransactionSdkOutput,
169
+ dctr: StorageCreateActionResult,
170
+ args: Validation.ValidCreateActionArgs,
171
+ changeKeys: KeyPair,
172
+ wallet: Wallet
173
+ ): Script {
174
+ const derivationPrefix = dctr.derivationPrefix
175
+ const derivationSuffix = verifyTruthy(out.derivationSuffix)
176
+ const sabppp = new ScriptTemplateBRC29({
177
+ derivationPrefix,
178
+ derivationSuffix,
179
+ keyDeriver: wallet.keyDeriver
180
+ })
181
+ const lockingScript = sabppp.lock(changeKeys.privateKey, changeKeys.publicKey)
182
+ return lockingScript
183
+ }