@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
package/docs/setup.md ADDED
@@ -0,0 +1,1268 @@
1
+ # SETUP: BSV Wallet Toolbox API Documentation
2
+
3
+ The documentation is split into various pages, this page covers the [Setup](#class-setup) and [SetupClient](#class-setupclient) classes and interfaces.
4
+
5
+ Unless you are targetting the browser deployment context, focus on [Setup](#class-setup) as it extends the [SetupClient](#class-setupclient) class.
6
+
7
+ The purpose of this API is to simplify and demonstrate the construction of wallets in various configurations.
8
+
9
+ [Return To Top](./README.md)
10
+
11
+ <!--#region ts2md-api-merged-here-->
12
+ ### API
13
+
14
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
15
+
16
+ #### Interfaces
17
+
18
+ | | |
19
+ | --- | --- |
20
+ | [KeyPairAddress](#interface-keypairaddress) | [SetupWalletClientArgs](#interface-setupwalletclientargs) |
21
+ | [SetupClientWalletArgs](#interface-setupclientwalletargs) | [SetupWalletIdb](#interface-setupwalletidb) |
22
+ | [SetupClientWalletClientArgs](#interface-setupclientwalletclientargs) | [SetupWalletIdbArgs](#interface-setupwalletidbargs) |
23
+ | [SetupEnv](#interface-setupenv) | [SetupWalletKnex](#interface-setupwalletknex) |
24
+ | [SetupWallet](#interface-setupwallet) | [SetupWalletKnexArgs](#interface-setupwalletknexargs) |
25
+ | [SetupWalletArgs](#interface-setupwalletargs) | [SetupWalletMySQLArgs](#interface-setupwalletmysqlargs) |
26
+ | [SetupWalletClient](#interface-setupwalletclient) | [SetupWalletSQLiteArgs](#interface-setupwalletsqliteargs) |
27
+
28
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
29
+
30
+ ---
31
+
32
+ ##### Interface: KeyPairAddress
33
+
34
+ ```ts
35
+ export interface KeyPairAddress {
36
+ privateKey: PrivateKey;
37
+ publicKey: PublicKey;
38
+ address: string;
39
+ }
40
+ ```
41
+
42
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
43
+
44
+ ---
45
+ ##### Interface: SetupClientWalletArgs
46
+
47
+ Arguments used by `createWallet` to construct a `SetupWallet`.
48
+
49
+ Extension `SetupWalletClientArgs` used by `createWalletClient` to construct a `SetupWalletClient`.
50
+
51
+ Extension `SetupWalletIdbArgs` used by `createWalletIdb` to construct a `SetupWalletIdb`.
52
+
53
+ ```ts
54
+ export interface SetupClientWalletArgs {
55
+ chain: Chain;
56
+ rootKeyHex: string;
57
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
58
+ active?: WalletStorageProvider;
59
+ backups?: WalletStorageProvider[];
60
+ taalApiKey?: string;
61
+ }
62
+ ```
63
+
64
+ See also: [Chain](./client.md#type-chain), [WalletStorageProvider](./client.md#interface-walletstorageprovider)
65
+
66
+ ###### Property active
67
+
68
+ Optional. Active wallet storage. Can be added later.
69
+
70
+ ```ts
71
+ active?: WalletStorageProvider
72
+ ```
73
+ See also: [WalletStorageProvider](./client.md#interface-walletstorageprovider)
74
+
75
+ ###### Property backups
76
+
77
+ Optional. One or more storage providers managed as backup destinations. Can be added later.
78
+
79
+ ```ts
80
+ backups?: WalletStorageProvider[]
81
+ ```
82
+ See also: [WalletStorageProvider](./client.md#interface-walletstorageprovider)
83
+
84
+ ###### Property privilegedKeyGetter
85
+
86
+ Optional. The privileged private key getter used to initialize the `PrivilegedKeyManager`.
87
+ Defaults to undefined.
88
+
89
+ ```ts
90
+ privilegedKeyGetter?: () => Promise<PrivateKey>
91
+ ```
92
+
93
+ ###### Property rootKeyHex
94
+
95
+ The non-privileged private key used to initialize the `KeyDeriver` and determine the `identityKey`.
96
+
97
+ ```ts
98
+ rootKeyHex: string
99
+ ```
100
+
101
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
102
+
103
+ ---
104
+ ##### Interface: SetupClientWalletClientArgs
105
+
106
+ Extension `SetupWalletClientArgs` of `SetupWalletArgs` is used by `createWalletClient`
107
+ to construct a `SetupWalletClient`.
108
+
109
+ ```ts
110
+ export interface SetupClientWalletClientArgs extends SetupClientWalletArgs {
111
+ endpointUrl?: string;
112
+ }
113
+ ```
114
+
115
+ See also: [SetupClientWalletArgs](./setup.md#interface-setupclientwalletargs)
116
+
117
+ ###### Property endpointUrl
118
+
119
+ The endpoint URL of a service hosting the `StorageServer` JSON-RPC service to
120
+ which a `StorageClient` instance should connect to function as
121
+ the active storage provider of the newly created wallet.
122
+
123
+ ```ts
124
+ endpointUrl?: string
125
+ ```
126
+
127
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
128
+
129
+ ---
130
+ ##### Interface: SetupEnv
131
+
132
+ `SetupEnv` provides a starting point for managing secrets that
133
+ must not appear in source code.
134
+
135
+ The `makeEnv` and `getEnv` functions of the `Setup` and `SetupClient` classes
136
+ provide an easy way to create and import these secrets and related properties.
137
+
138
+ ```ts
139
+ export interface SetupEnv {
140
+ chain: Chain;
141
+ identityKey: string;
142
+ identityKey2: string;
143
+ filePath: string | undefined;
144
+ taalApiKey: string;
145
+ devKeys: Record<string, string>;
146
+ mySQLConnection: string;
147
+ }
148
+ ```
149
+
150
+ See also: [Chain](./client.md#type-chain)
151
+
152
+ ###### Property chain
153
+
154
+ The chan being accessed: 'main' for mainnet, 'test' for 'testnet'.
155
+
156
+ ```ts
157
+ chain: Chain
158
+ ```
159
+ See also: [Chain](./client.md#type-chain)
160
+
161
+ ###### Property devKeys
162
+
163
+ A map of public keys (identity keys, hex strings) to private keys (hex strings).
164
+
165
+ ```ts
166
+ devKeys: Record<string, string>
167
+ ```
168
+
169
+ ###### Property filePath
170
+
171
+ Filepath to sqlite file to be used for identityKey wallet.
172
+
173
+ ```ts
174
+ filePath: string | undefined
175
+ ```
176
+
177
+ ###### Property identityKey
178
+
179
+ The user's primary identity key (public key).
180
+
181
+ ```ts
182
+ identityKey: string
183
+ ```
184
+
185
+ ###### Property identityKey2
186
+
187
+ A secondary identity key (public key), used to test exchanges with other users.
188
+
189
+ ```ts
190
+ identityKey2: string
191
+ ```
192
+
193
+ ###### Property mySQLConnection
194
+
195
+ A MySQL connection string including user and password properties.
196
+ Must be valid to make use of MySQL `Setup` class support.
197
+
198
+ ```ts
199
+ mySQLConnection: string
200
+ ```
201
+
202
+ ###### Property taalApiKey
203
+
204
+ A vaild TAAL API key for use by `Services`
205
+
206
+ ```ts
207
+ taalApiKey: string
208
+ ```
209
+
210
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
211
+
212
+ ---
213
+ ##### Interface: SetupWallet
214
+
215
+ When creating a BRC-100 compatible `Wallet`, many components come into play.
216
+
217
+ All of the `createWallet` functions in the `Setup` and `SetupClient` classes return
218
+ an object with direct access to each component to facilitate experimentation, testing
219
+ and customization.
220
+
221
+ ```ts
222
+ export interface SetupWallet {
223
+ rootKey: PrivateKey;
224
+ identityKey: string;
225
+ keyDeriver: KeyDeriverApi;
226
+ chain: Chain;
227
+ storage: WalletStorageManager;
228
+ services: Services;
229
+ monitor: Monitor;
230
+ wallet: Wallet;
231
+ }
232
+ ```
233
+
234
+ See also: [Chain](./client.md#type-chain), [Monitor](./monitor.md#class-monitor), [Services](./services.md#class-services), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager)
235
+
236
+ ###### Property chain
237
+
238
+ The chain ('main' or 'test') which the wallet accesses.
239
+
240
+ ```ts
241
+ chain: Chain
242
+ ```
243
+ See also: [Chain](./client.md#type-chain)
244
+
245
+ ###### Property identityKey
246
+
247
+ The pubilc key associated with the `rootKey` which also serves as the wallet's identity.
248
+
249
+ ```ts
250
+ identityKey: string
251
+ ```
252
+
253
+ ###### Property keyDeriver
254
+
255
+ The `KeyDeriver` component used by the wallet for key derivation and cryptographic functions.
256
+
257
+ ```ts
258
+ keyDeriver: KeyDeriverApi
259
+ ```
260
+
261
+ ###### Property monitor
262
+
263
+ The background task `Monitor` component available to the wallet to offload tasks
264
+ that speed up wallet operations and maintain data integrity.
265
+
266
+ ```ts
267
+ monitor: Monitor
268
+ ```
269
+ See also: [Monitor](./monitor.md#class-monitor)
270
+
271
+ ###### Property rootKey
272
+
273
+ The rootKey of the `KeyDeriver`. The private key from which other keys are derived.
274
+
275
+ ```ts
276
+ rootKey: PrivateKey
277
+ ```
278
+
279
+ ###### Property services
280
+
281
+ The network `Services` component which provides the wallet with access to external services hosted
282
+ on the public network.
283
+
284
+ ```ts
285
+ services: Services
286
+ ```
287
+ See also: [Services](./services.md#class-services)
288
+
289
+ ###### Property storage
290
+
291
+ The `WalletStorageManager` that manages all the configured storage providers (active and backups)
292
+ accessed by the wallet.
293
+
294
+ ```ts
295
+ storage: WalletStorageManager
296
+ ```
297
+ See also: [WalletStorageManager](./storage.md#class-walletstoragemanager)
298
+
299
+ ###### Property wallet
300
+
301
+ The actual BRC-100 `Wallet` to which all the other properties and components contribute.
302
+
303
+ Note that internally, the wallet is itself linked to all these properties and components.
304
+ They are included in this interface to facilitate access after wallet construction for
305
+ experimentation, testing and customization. Any changes made to the configuration of these
306
+ components after construction may disrupt the normal operation of the wallet.
307
+
308
+ ```ts
309
+ wallet: Wallet
310
+ ```
311
+ See also: [Wallet](./client.md#class-wallet)
312
+
313
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
314
+
315
+ ---
316
+ ##### Interface: SetupWalletArgs
317
+
318
+ Arguments used by `createWallet` to construct a `SetupWallet`.
319
+
320
+ Extension `SetupWalletClientArgs` used by `createWalletClient` to construct a `SetupWalletClient`.
321
+
322
+ Extension `SetupWalletKnexArgs` used by `createWalletKnex` to construct a `SetupWalletKnex`.
323
+
324
+ Extension `SetupWalletMySQLArgs` used by `createWalletMySQL` to construct a `SetupWalletKnex`.
325
+
326
+ Extension `SetupWalletSQLiteArgs` used by `createWalletSQLite` to construct a `SetupWalletKnex`.
327
+
328
+ ```ts
329
+ export interface SetupWalletArgs {
330
+ env: SetupEnv;
331
+ rootKeyHex?: string;
332
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
333
+ active?: WalletStorageProvider;
334
+ backups?: WalletStorageProvider[];
335
+ }
336
+ ```
337
+
338
+ See also: [SetupEnv](./setup.md#interface-setupenv), [WalletStorageProvider](./client.md#interface-walletstorageprovider)
339
+
340
+ ###### Property active
341
+
342
+ Optional. Active wallet storage. Can be added later.
343
+
344
+ ```ts
345
+ active?: WalletStorageProvider
346
+ ```
347
+ See also: [WalletStorageProvider](./client.md#interface-walletstorageprovider)
348
+
349
+ ###### Property backups
350
+
351
+ Optional. One or more storage providers managed as backup destinations. Can be added later.
352
+
353
+ ```ts
354
+ backups?: WalletStorageProvider[]
355
+ ```
356
+ See also: [WalletStorageProvider](./client.md#interface-walletstorageprovider)
357
+
358
+ ###### Property env
359
+
360
+ Configuration "secrets" typically obtained by `Setup.makeEnv` and `Setup.getEnv` functions.
361
+
362
+ ```ts
363
+ env: SetupEnv
364
+ ```
365
+ See also: [SetupEnv](./setup.md#interface-setupenv)
366
+
367
+ ###### Property privilegedKeyGetter
368
+
369
+ Optional. The privileged private key getter used to initialize the `PrivilegedKeyManager`.
370
+ Defaults to undefined.
371
+
372
+ ```ts
373
+ privilegedKeyGetter?: () => Promise<PrivateKey>
374
+ ```
375
+
376
+ ###### Property rootKeyHex
377
+
378
+ Optional. The non-privileged private key used to initialize the `KeyDeriver` and determine the `identityKey`.
379
+ Defaults to `env.devKeys[env.identityKey]
380
+
381
+ ```ts
382
+ rootKeyHex?: string
383
+ ```
384
+
385
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
386
+
387
+ ---
388
+ ##### Interface: SetupWalletClient
389
+
390
+ Extension `SetupWalletClient` of `SetupWallet` is returned by `createWalletClient`
391
+
392
+ ```ts
393
+ export interface SetupWalletClient extends SetupWallet {
394
+ endpointUrl: string;
395
+ }
396
+ ```
397
+
398
+ See also: [SetupWallet](./setup.md#interface-setupwallet)
399
+
400
+ ###### Property endpointUrl
401
+
402
+ The endpoint URL of the service hosting the `StorageServer` JSON-RPC service to
403
+ which a `StorageClient` instance is connected to function as
404
+ the active storage provider of the wallet.
405
+
406
+ ```ts
407
+ endpointUrl: string
408
+ ```
409
+
410
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
411
+
412
+ ---
413
+ ##### Interface: SetupWalletClientArgs
414
+
415
+ Extension `SetupWalletClientArgs` of `SetupWalletArgs` is used by `createWalletClient`
416
+ to construct a `SetupWalletClient`.
417
+
418
+ ```ts
419
+ export interface SetupWalletClientArgs extends SetupWalletArgs {
420
+ endpointUrl?: string;
421
+ }
422
+ ```
423
+
424
+ See also: [SetupWalletArgs](./setup.md#interface-setupwalletargs)
425
+
426
+ ###### Property endpointUrl
427
+
428
+ The endpoint URL of a service hosting the `StorageServer` JSON-RPC service to
429
+ which a `StorageClient` instance should connect to function as
430
+ the active storage provider of the newly created wallet.
431
+
432
+ ```ts
433
+ endpointUrl?: string
434
+ ```
435
+
436
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
437
+
438
+ ---
439
+ ##### Interface: SetupWalletIdb
440
+
441
+ ```ts
442
+ export interface SetupWalletIdb extends SetupWallet {
443
+ activeStorage: StorageIdb;
444
+ userId: number;
445
+ rootKey: PrivateKey;
446
+ identityKey: string;
447
+ keyDeriver: KeyDeriverApi;
448
+ chain: Chain;
449
+ storage: WalletStorageManager;
450
+ services: Services;
451
+ monitor: Monitor;
452
+ wallet: Wallet;
453
+ }
454
+ ```
455
+
456
+ See also: [Chain](./client.md#type-chain), [Monitor](./monitor.md#class-monitor), [Services](./services.md#class-services), [SetupWallet](./setup.md#interface-setupwallet), [StorageIdb](./storage.md#class-storageidb), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager)
457
+
458
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
459
+
460
+ ---
461
+ ##### Interface: SetupWalletIdbArgs
462
+
463
+ ```ts
464
+ export interface SetupWalletIdbArgs extends SetupClientWalletArgs {
465
+ databaseName: string;
466
+ }
467
+ ```
468
+
469
+ See also: [SetupClientWalletArgs](./setup.md#interface-setupclientwalletargs)
470
+
471
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
472
+
473
+ ---
474
+ ##### Interface: SetupWalletKnex
475
+
476
+ ```ts
477
+ export interface SetupWalletKnex extends SetupWallet {
478
+ activeStorage: StorageKnex;
479
+ userId: number;
480
+ rootKey: PrivateKey;
481
+ identityKey: string;
482
+ keyDeriver: KeyDeriverApi;
483
+ chain: Chain;
484
+ storage: WalletStorageManager;
485
+ services: Services;
486
+ monitor: Monitor;
487
+ wallet: Wallet;
488
+ }
489
+ ```
490
+
491
+ See also: [Chain](./client.md#type-chain), [Monitor](./monitor.md#class-monitor), [Services](./services.md#class-services), [SetupWallet](./setup.md#interface-setupwallet), [StorageKnex](./storage.md#class-storageknex), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager)
492
+
493
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
494
+
495
+ ---
496
+ ##### Interface: SetupWalletKnexArgs
497
+
498
+ ```ts
499
+ export interface SetupWalletKnexArgs extends SetupWalletArgs {
500
+ knex: Knex<any, any[]>;
501
+ databaseName: string;
502
+ }
503
+ ```
504
+
505
+ See also: [SetupWalletArgs](./setup.md#interface-setupwalletargs)
506
+
507
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
508
+
509
+ ---
510
+ ##### Interface: SetupWalletMySQLArgs
511
+
512
+ ```ts
513
+ export interface SetupWalletMySQLArgs extends SetupWalletArgs {
514
+ databaseName: string;
515
+ }
516
+ ```
517
+
518
+ See also: [SetupWalletArgs](./setup.md#interface-setupwalletargs)
519
+
520
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
521
+
522
+ ---
523
+ ##### Interface: SetupWalletSQLiteArgs
524
+
525
+ ```ts
526
+ export interface SetupWalletSQLiteArgs extends SetupWalletArgs {
527
+ filePath: string;
528
+ databaseName: string;
529
+ }
530
+ ```
531
+
532
+ See also: [SetupWalletArgs](./setup.md#interface-setupwalletargs)
533
+
534
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
535
+
536
+ ---
537
+ #### Classes
538
+
539
+ | |
540
+ | --- |
541
+ | [Setup](#class-setup) |
542
+ | [SetupClient](#class-setupclient) |
543
+
544
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
545
+
546
+ ---
547
+
548
+ ##### Class: Setup
549
+
550
+ The 'Setup` class provides static setup functions to construct BRC-100 compatible
551
+ wallets in a variety of configurations.
552
+
553
+ It serves as a starting point for experimentation and customization.
554
+
555
+ ```ts
556
+ export abstract class Setup {
557
+ static noEnv(chain: Chain): boolean
558
+ static makeEnv(): string {
559
+ const testPrivKey1 = PrivateKey.fromRandom();
560
+ const testIdentityKey1 = testPrivKey1.toPublicKey().toString();
561
+ const testPrivKey2 = PrivateKey.fromRandom();
562
+ const testIdentityKey2 = testPrivKey2.toPublicKey().toString();
563
+ const mainPrivKey1 = PrivateKey.fromRandom();
564
+ const mainIdentityKey1 = mainPrivKey1.toPublicKey().toString();
565
+ const mainPrivKey2 = PrivateKey.fromRandom();
566
+ const mainIdentityKey2 = mainPrivKey2.toPublicKey().toString();
567
+ const log = `
568
+ # .env file template for working with wallet-toolbox Setup functions.
569
+ MY_TEST_IDENTITY = '${testIdentityKey1}'
570
+ MY_TEST_IDENTITY2 = '${testIdentityKey2}'
571
+ MY_MAIN_IDENTITY = '${mainIdentityKey1}'
572
+ MY_MAIN_IDENTITY2 = '${mainIdentityKey2}'
573
+ MAIN_TAAL_API_KEY='mainnet_9596de07e92300c6287e4393594ae39c'
574
+ TEST_TAAL_API_KEY='testnet_0e6cf72133b43ea2d7861da2a38684e3'
575
+ MYSQL_CONNECTION='{"port":3306,"host":"127.0.0.1","user":"root","password":"your_password","database":"your_database", "timezone": "Z"}'
576
+ DEV_KEYS = '{
577
+ "${testIdentityKey1}": "${testPrivKey1.toString()}",
578
+ "${testIdentityKey2}": "${testPrivKey2.toString()}",
579
+ "${mainIdentityKey1}": "${mainPrivKey1.toString()}",
580
+ "${mainIdentityKey2}": "${mainPrivKey2.toString()}"
581
+ }'
582
+ `;
583
+ console.log(log);
584
+ return log;
585
+ }
586
+ static getEnv(chain: Chain): SetupEnv {
587
+ const identityKey = chain === "main" ? process.env.MY_MAIN_IDENTITY : process.env.MY_TEST_IDENTITY;
588
+ const identityKey2 = chain === "main" ? process.env.MY_MAIN_IDENTITY2 : process.env.MY_TEST_IDENTITY2;
589
+ const filePath = chain === "main" ? process.env.MY_MAIN_FILEPATH : process.env.MY_TEST_FILEPATH;
590
+ const DEV_KEYS = process.env.DEV_KEYS || "{}";
591
+ const mySQLConnection = process.env.MYSQL_CONNECTION || "{}";
592
+ const taalApiKey = verifyTruthy(chain === "main" ? process.env.MAIN_TAAL_API_KEY : process.env.TEST_TAAL_API_KEY, `.env value for '${chain.toUpperCase()}_TAAL_API_KEY' is required.`);
593
+ if (!identityKey || !identityKey2)
594
+ throw new WERR_INVALID_OPERATION(".env is not a valid SetupEnv configuration.");
595
+ return {
596
+ chain,
597
+ identityKey,
598
+ identityKey2,
599
+ filePath,
600
+ taalApiKey,
601
+ devKeys: JSON.parse(DEV_KEYS) as Record<string, string>,
602
+ mySQLConnection
603
+ };
604
+ }
605
+ static async createWallet(args: SetupWalletArgs): Promise<SetupWallet> {
606
+ const chain = args.env.chain;
607
+ args.rootKeyHex ||= args.env.devKeys[args.env.identityKey];
608
+ const rootKey = PrivateKey.fromHex(args.rootKeyHex);
609
+ const identityKey = rootKey.toPublicKey().toString();
610
+ const keyDeriver = new CachedKeyDeriver(rootKey);
611
+ const storage = new WalletStorageManager(identityKey, args.active, args.backups);
612
+ if (storage.canMakeAvailable())
613
+ await storage.makeAvailable();
614
+ const serviceOptions = Services.createDefaultOptions(chain);
615
+ serviceOptions.taalApiKey = args.env.taalApiKey;
616
+ const services = new Services(serviceOptions);
617
+ const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);
618
+ const monitor = new Monitor(monopts);
619
+ monitor.addDefaultTasks();
620
+ const privilegedKeyManager = args.privilegedKeyGetter
621
+ ? new PrivilegedKeyManager(args.privilegedKeyGetter)
622
+ : undefined;
623
+ const wallet = new Wallet({
624
+ chain,
625
+ keyDeriver,
626
+ storage,
627
+ services,
628
+ monitor,
629
+ privilegedKeyManager
630
+ });
631
+ const r: SetupWallet = {
632
+ rootKey,
633
+ identityKey,
634
+ keyDeriver,
635
+ chain,
636
+ storage,
637
+ services,
638
+ monitor,
639
+ wallet
640
+ };
641
+ return r;
642
+ }
643
+ static async createWalletClientNoEnv(args: {
644
+ chain: Chain;
645
+ rootKeyHex: string;
646
+ storageUrl?: string;
647
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
648
+ }): Promise<Wallet>
649
+ static async createWalletClient(args: SetupWalletClientArgs): Promise<SetupWalletClient> {
650
+ const wo = await Setup.createWallet(args);
651
+ const endpointUrl = args.endpointUrl || `https://${args.env.chain !== "main" ? "staging-" : ""}storage.babbage.systems`;
652
+ const client = new StorageClient(wo.wallet, endpointUrl);
653
+ await wo.storage.addWalletStorageProvider(client);
654
+ await wo.storage.makeAvailable();
655
+ return {
656
+ ...wo,
657
+ endpointUrl
658
+ };
659
+ }
660
+ static getKeyPair(priv?: string | PrivateKey): KeyPairAddress {
661
+ if (priv === undefined)
662
+ priv = PrivateKey.fromRandom();
663
+ else if (typeof priv === "string")
664
+ priv = new PrivateKey(priv, "hex");
665
+ const pub = PublicKey.fromPrivateKey(priv);
666
+ const address = pub.toAddress();
667
+ return { privateKey: priv, publicKey: pub, address };
668
+ }
669
+ static getLockP2PKH(address: string): LockingScript {
670
+ const p2pkh = new P2PKH();
671
+ const lock = p2pkh.lock(address);
672
+ return lock;
673
+ }
674
+ static getUnlockP2PKH(priv: PrivateKey, satoshis: number): ScriptTemplateUnlock {
675
+ const p2pkh = new P2PKH();
676
+ const lock = Setup.getLockP2PKH(Setup.getKeyPair(priv).address);
677
+ const unlock = p2pkh.unlock(priv, "all", false, satoshis, lock);
678
+ return unlock;
679
+ }
680
+ static createP2PKHOutputs(outputs: {
681
+ address: string;
682
+ satoshis: number;
683
+ outputDescription?: string;
684
+ basket?: string;
685
+ tags?: string[];
686
+ }[]): CreateActionOutput[] {
687
+ const os: CreateActionOutput[] = [];
688
+ const count = outputs.length;
689
+ for (let i = 0; i < count; i++) {
690
+ const o = outputs[i];
691
+ os.push({
692
+ basket: o.basket,
693
+ tags: o.tags,
694
+ satoshis: o.satoshis,
695
+ lockingScript: Setup.getLockP2PKH(o.address).toHex(),
696
+ outputDescription: o.outputDescription || `p2pkh ${i}`
697
+ });
698
+ }
699
+ return os;
700
+ }
701
+ static async createP2PKHOutputsAction(wallet: WalletInterface, outputs: {
702
+ address: string;
703
+ satoshis: number;
704
+ outputDescription?: string;
705
+ basket?: string;
706
+ tags?: string[];
707
+ }[], options?: CreateActionOptions): Promise<{
708
+ cr: CreateActionResult;
709
+ outpoints: string[] | undefined;
710
+ }> {
711
+ const os = Setup.createP2PKHOutputs(outputs);
712
+ const createArgs: CreateActionArgs = {
713
+ description: `createP2PKHOutputs`,
714
+ outputs: os,
715
+ options: {
716
+ ...options,
717
+ randomizeOutputs: false
718
+ }
719
+ };
720
+ const cr = await wallet.createAction(createArgs);
721
+ let outpoints: string[] | undefined;
722
+ if (cr.txid) {
723
+ outpoints = os.map((o, i) => `${cr.txid}.${i}`);
724
+ }
725
+ return { cr, outpoints };
726
+ }
727
+ static async fundWalletFromP2PKHOutpoints(wallet: WalletInterface, outpoints: string[], p2pkhKey: KeyPairAddress, inputBEEF?: BEEF) {
728
+ }
729
+ static async createWalletKnex(args: SetupWalletKnexArgs): Promise<SetupWalletKnex> {
730
+ const wo = await Setup.createWallet(args);
731
+ const activeStorage = await Setup.createStorageKnex(args);
732
+ await wo.storage.addWalletStorageProvider(activeStorage);
733
+ const { user, isNew } = await activeStorage.findOrInsertUser(wo.identityKey);
734
+ const userId = user.userId;
735
+ const r: SetupWalletKnex = {
736
+ ...wo,
737
+ activeStorage,
738
+ userId
739
+ };
740
+ return r;
741
+ }
742
+ static async createStorageKnex(args: SetupWalletKnexArgs): Promise<StorageKnex>
743
+ static createSQLiteKnex(filename: string): Knex {
744
+ const config: Knex.Config = {
745
+ client: "sqlite3",
746
+ connection: { filename },
747
+ useNullAsDefault: true
748
+ };
749
+ const knex = makeKnex(config);
750
+ return knex;
751
+ }
752
+ static createMySQLKnex(connection: string, database?: string): Knex {
753
+ const c: Knex.MySql2ConnectionConfig = JSON.parse(connection);
754
+ if (database) {
755
+ c.database = database;
756
+ }
757
+ const config: Knex.Config = {
758
+ client: "mysql2",
759
+ connection: c,
760
+ useNullAsDefault: true,
761
+ pool: { min: 0, max: 7, idleTimeoutMillis: 15000 }
762
+ };
763
+ const knex = makeKnex(config);
764
+ return knex;
765
+ }
766
+ static async createWalletMySQL(args: SetupWalletMySQLArgs): Promise<SetupWalletKnex> {
767
+ return await this.createWalletKnex({
768
+ ...args,
769
+ knex: Setup.createMySQLKnex(args.env.mySQLConnection, args.databaseName)
770
+ });
771
+ }
772
+ static async createWalletSQLite(args: SetupWalletSQLiteArgs): Promise<SetupWalletKnex> {
773
+ return await this.createWalletKnex({
774
+ ...args,
775
+ knex: Setup.createSQLiteKnex(args.filePath)
776
+ });
777
+ }
778
+ }
779
+ ```
780
+
781
+ See also: [Chain](./client.md#type-chain), [KeyPairAddress](./setup.md#interface-keypairaddress), [Monitor](./monitor.md#class-monitor), [PrivilegedKeyManager](./client.md#class-privilegedkeymanager), [ScriptTemplateUnlock](./client.md#interface-scripttemplateunlock), [Services](./services.md#class-services), [SetupEnv](./setup.md#interface-setupenv), [SetupWallet](./setup.md#interface-setupwallet), [SetupWalletArgs](./setup.md#interface-setupwalletargs), [SetupWalletClient](./setup.md#interface-setupwalletclient), [SetupWalletClientArgs](./setup.md#interface-setupwalletclientargs), [SetupWalletKnex](./setup.md#interface-setupwalletknex), [SetupWalletKnexArgs](./setup.md#interface-setupwalletknexargs), [SetupWalletMySQLArgs](./setup.md#interface-setupwalletmysqlargs), [SetupWalletSQLiteArgs](./setup.md#interface-setupwalletsqliteargs), [StorageClient](./storage.md#class-storageclient), [StorageKnex](./storage.md#class-storageknex), [WERR_INVALID_OPERATION](./client.md#class-werr_invalid_operation), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager), [createAction](./storage.md#function-createaction), [verifyTruthy](./client.md#function-verifytruthy)
782
+
783
+ ###### Method createStorageKnex
784
+
785
+ ```ts
786
+ static async createStorageKnex(args: SetupWalletKnexArgs): Promise<StorageKnex>
787
+ ```
788
+ See also: [SetupWalletKnexArgs](./setup.md#interface-setupwalletknexargs), [StorageKnex](./storage.md#class-storageknex)
789
+
790
+ Returns
791
+
792
+ - `Knex` based storage provider for a wallet. May be used for either active storage or backup storage.
793
+
794
+ ###### Method createWallet
795
+
796
+ Create a `Wallet`. Storage can optionally be provided or configured later.
797
+
798
+ The following components are configured: KeyDeriver, WalletStorageManager, WalletService, WalletStorage.
799
+ Optionally, PrivilegedKeyManager is also configured.
800
+
801
+ ```ts
802
+ static async createWallet(args: SetupWalletArgs): Promise<SetupWallet> {
803
+ const chain = args.env.chain;
804
+ args.rootKeyHex ||= args.env.devKeys[args.env.identityKey];
805
+ const rootKey = PrivateKey.fromHex(args.rootKeyHex);
806
+ const identityKey = rootKey.toPublicKey().toString();
807
+ const keyDeriver = new CachedKeyDeriver(rootKey);
808
+ const storage = new WalletStorageManager(identityKey, args.active, args.backups);
809
+ if (storage.canMakeAvailable())
810
+ await storage.makeAvailable();
811
+ const serviceOptions = Services.createDefaultOptions(chain);
812
+ serviceOptions.taalApiKey = args.env.taalApiKey;
813
+ const services = new Services(serviceOptions);
814
+ const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);
815
+ const monitor = new Monitor(monopts);
816
+ monitor.addDefaultTasks();
817
+ const privilegedKeyManager = args.privilegedKeyGetter
818
+ ? new PrivilegedKeyManager(args.privilegedKeyGetter)
819
+ : undefined;
820
+ const wallet = new Wallet({
821
+ chain,
822
+ keyDeriver,
823
+ storage,
824
+ services,
825
+ monitor,
826
+ privilegedKeyManager
827
+ });
828
+ const r: SetupWallet = {
829
+ rootKey,
830
+ identityKey,
831
+ keyDeriver,
832
+ chain,
833
+ storage,
834
+ services,
835
+ monitor,
836
+ wallet
837
+ };
838
+ return r;
839
+ }
840
+ ```
841
+ See also: [Monitor](./monitor.md#class-monitor), [PrivilegedKeyManager](./client.md#class-privilegedkeymanager), [Services](./services.md#class-services), [SetupWallet](./setup.md#interface-setupwallet), [SetupWalletArgs](./setup.md#interface-setupwalletargs), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager)
842
+
843
+ ###### Method createWalletClientNoEnv
844
+
845
+ Setup a new `Wallet` without requiring a .env file.
846
+
847
+ ```ts
848
+ static async createWalletClientNoEnv(args: {
849
+ chain: Chain;
850
+ rootKeyHex: string;
851
+ storageUrl?: string;
852
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
853
+ }): Promise<Wallet>
854
+ ```
855
+ See also: [Chain](./client.md#type-chain), [Wallet](./client.md#class-wallet)
856
+
857
+ Argument Details
858
+
859
+ + **args.chain**
860
+ + 'main' or 'test'
861
+ + **args.rootKeyHex**
862
+ + Root private key for wallet's key deriver.
863
+ + **args.storageUrl**
864
+ + Optional. `StorageClient` and `chain` compatible endpoint URL.
865
+ + **args.privilegedKeyGetter**
866
+ + Optional. Method that will return the privileged `PrivateKey`, on demand.
867
+
868
+ ###### Method createWalletKnex
869
+
870
+ Adds `Knex` based storage to a `Wallet` configured by `Setup.createWalletOnly`
871
+
872
+ ```ts
873
+ static async createWalletKnex(args: SetupWalletKnexArgs): Promise<SetupWalletKnex> {
874
+ const wo = await Setup.createWallet(args);
875
+ const activeStorage = await Setup.createStorageKnex(args);
876
+ await wo.storage.addWalletStorageProvider(activeStorage);
877
+ const { user, isNew } = await activeStorage.findOrInsertUser(wo.identityKey);
878
+ const userId = user.userId;
879
+ const r: SetupWalletKnex = {
880
+ ...wo,
881
+ activeStorage,
882
+ userId
883
+ };
884
+ return r;
885
+ }
886
+ ```
887
+ See also: [Setup](./setup.md#class-setup), [SetupWalletKnex](./setup.md#interface-setupwalletknex), [SetupWalletKnexArgs](./setup.md#interface-setupwalletknexargs)
888
+
889
+ Argument Details
890
+
891
+ + **args.knex**
892
+ + `Knex` object configured for either MySQL or SQLite database access.
893
+ Schema will be created and migrated as needed.
894
+ For MySQL, a schema corresponding to databaseName must exist with full access permissions.
895
+ + **args.databaseName**
896
+ + Name for this storage. For MySQL, the schema name within the MySQL instance.
897
+ + **args.chain**
898
+ + Which chain this wallet is on: 'main' or 'test'. Defaults to 'test'.
899
+
900
+ ###### Method getEnv
901
+
902
+ Reads a .env file of the format created by `makeEnv`.
903
+
904
+ Returns values for designated `chain`.
905
+
906
+ Access private keys through the `devKeys` object: `devKeys[identityKey]`
907
+
908
+ ```ts
909
+ static getEnv(chain: Chain): SetupEnv {
910
+ const identityKey = chain === "main" ? process.env.MY_MAIN_IDENTITY : process.env.MY_TEST_IDENTITY;
911
+ const identityKey2 = chain === "main" ? process.env.MY_MAIN_IDENTITY2 : process.env.MY_TEST_IDENTITY2;
912
+ const filePath = chain === "main" ? process.env.MY_MAIN_FILEPATH : process.env.MY_TEST_FILEPATH;
913
+ const DEV_KEYS = process.env.DEV_KEYS || "{}";
914
+ const mySQLConnection = process.env.MYSQL_CONNECTION || "{}";
915
+ const taalApiKey = verifyTruthy(chain === "main" ? process.env.MAIN_TAAL_API_KEY : process.env.TEST_TAAL_API_KEY, `.env value for '${chain.toUpperCase()}_TAAL_API_KEY' is required.`);
916
+ if (!identityKey || !identityKey2)
917
+ throw new WERR_INVALID_OPERATION(".env is not a valid SetupEnv configuration.");
918
+ return {
919
+ chain,
920
+ identityKey,
921
+ identityKey2,
922
+ filePath,
923
+ taalApiKey,
924
+ devKeys: JSON.parse(DEV_KEYS) as Record<string, string>,
925
+ mySQLConnection
926
+ };
927
+ }
928
+ ```
929
+ See also: [Chain](./client.md#type-chain), [SetupEnv](./setup.md#interface-setupenv), [WERR_INVALID_OPERATION](./client.md#class-werr_invalid_operation), [verifyTruthy](./client.md#function-verifytruthy)
930
+
931
+ Returns
932
+
933
+ with configuration environment secrets used by `Setup` functions.
934
+
935
+ Argument Details
936
+
937
+ + **chain**
938
+ + Which chain to use: 'test' or 'main'
939
+
940
+ ###### Method makeEnv
941
+
942
+ Creates content for .env file with some private keys, identity keys, sample API keys, and sample MySQL connection string.
943
+
944
+ Two new, random private keys are generated each time, with their associated public identity keys.
945
+
946
+ Loading secrets from a .env file is intended only for experimentation and getting started.
947
+ Private keys should never be included directly in your source code.
948
+
949
+ ```ts
950
+ static makeEnv(): string {
951
+ const testPrivKey1 = PrivateKey.fromRandom();
952
+ const testIdentityKey1 = testPrivKey1.toPublicKey().toString();
953
+ const testPrivKey2 = PrivateKey.fromRandom();
954
+ const testIdentityKey2 = testPrivKey2.toPublicKey().toString();
955
+ const mainPrivKey1 = PrivateKey.fromRandom();
956
+ const mainIdentityKey1 = mainPrivKey1.toPublicKey().toString();
957
+ const mainPrivKey2 = PrivateKey.fromRandom();
958
+ const mainIdentityKey2 = mainPrivKey2.toPublicKey().toString();
959
+ const log = `
960
+ # .env file template for working with wallet-toolbox Setup functions.
961
+ MY_TEST_IDENTITY = '${testIdentityKey1}'
962
+ MY_TEST_IDENTITY2 = '${testIdentityKey2}'
963
+ MY_MAIN_IDENTITY = '${mainIdentityKey1}'
964
+ MY_MAIN_IDENTITY2 = '${mainIdentityKey2}'
965
+ MAIN_TAAL_API_KEY='mainnet_9596de07e92300c6287e4393594ae39c'
966
+ TEST_TAAL_API_KEY='testnet_0e6cf72133b43ea2d7861da2a38684e3'
967
+ MYSQL_CONNECTION='{"port":3306,"host":"127.0.0.1","user":"root","password":"your_password","database":"your_database", "timezone": "Z"}'
968
+ DEV_KEYS = '{
969
+ "${testIdentityKey1}": "${testPrivKey1.toString()}",
970
+ "${testIdentityKey2}": "${testPrivKey2.toString()}",
971
+ "${mainIdentityKey1}": "${mainPrivKey1.toString()}",
972
+ "${mainIdentityKey2}": "${mainPrivKey2.toString()}"
973
+ }'
974
+ `;
975
+ console.log(log);
976
+ return log;
977
+ }
978
+ ```
979
+ See also: [Setup](./setup.md#class-setup)
980
+
981
+ ###### Method noEnv
982
+
983
+ ```ts
984
+ static noEnv(chain: Chain): boolean
985
+ ```
986
+ See also: [Chain](./client.md#type-chain)
987
+
988
+ Returns
989
+
990
+ true if .env is not valid for chain
991
+
992
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
993
+
994
+ ---
995
+ ##### Class: SetupClient
996
+
997
+ The 'Setup` class provides static setup functions to construct BRC-100 compatible
998
+ wallets in a variety of configurations.
999
+
1000
+ It serves as a starting point for experimentation and customization.
1001
+
1002
+ ```ts
1003
+ export abstract class SetupClient {
1004
+ static async createWallet(args: SetupClientWalletArgs): Promise<SetupWallet> {
1005
+ const chain = args.chain;
1006
+ const rootKey = PrivateKey.fromHex(args.rootKeyHex);
1007
+ const identityKey = rootKey.toPublicKey().toString();
1008
+ const keyDeriver = new CachedKeyDeriver(rootKey);
1009
+ const storage = new WalletStorageManager(identityKey, args.active, args.backups);
1010
+ if (storage.canMakeAvailable())
1011
+ await storage.makeAvailable();
1012
+ const serviceOptions = Services.createDefaultOptions(chain);
1013
+ serviceOptions.taalApiKey = args.taalApiKey;
1014
+ const services = new Services(serviceOptions);
1015
+ const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);
1016
+ const monitor = new Monitor(monopts);
1017
+ monitor.addDefaultTasks();
1018
+ const privilegedKeyManager = args.privilegedKeyGetter
1019
+ ? new PrivilegedKeyManager(args.privilegedKeyGetter)
1020
+ : undefined;
1021
+ const wallet = new Wallet({
1022
+ chain,
1023
+ keyDeriver,
1024
+ storage,
1025
+ services,
1026
+ monitor,
1027
+ privilegedKeyManager
1028
+ });
1029
+ const r: SetupWallet = {
1030
+ rootKey,
1031
+ identityKey,
1032
+ keyDeriver,
1033
+ chain,
1034
+ storage,
1035
+ services,
1036
+ monitor,
1037
+ wallet
1038
+ };
1039
+ return r;
1040
+ }
1041
+ static async createWalletClientNoEnv(args: {
1042
+ chain: Chain;
1043
+ rootKeyHex: string;
1044
+ storageUrl?: string;
1045
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
1046
+ }): Promise<Wallet>
1047
+ static async createWalletClient(args: SetupClientWalletClientArgs): Promise<SetupWalletClient> {
1048
+ const wo = await SetupClient.createWallet(args);
1049
+ const endpointUrl = args.endpointUrl || `https://${args.chain !== "main" ? "staging-" : ""}storage.babbage.systems`;
1050
+ const client = new StorageClient(wo.wallet, endpointUrl);
1051
+ await wo.storage.addWalletStorageProvider(client);
1052
+ await wo.storage.makeAvailable();
1053
+ return {
1054
+ ...wo,
1055
+ endpointUrl
1056
+ };
1057
+ }
1058
+ static getKeyPair(priv?: string | PrivateKey): KeyPairAddress {
1059
+ if (priv === undefined)
1060
+ priv = PrivateKey.fromRandom();
1061
+ else if (typeof priv === "string")
1062
+ priv = new PrivateKey(priv, "hex");
1063
+ const pub = PublicKey.fromPrivateKey(priv);
1064
+ const address = pub.toAddress();
1065
+ return { privateKey: priv, publicKey: pub, address };
1066
+ }
1067
+ static getLockP2PKH(address: string): LockingScript {
1068
+ const p2pkh = new P2PKH();
1069
+ const lock = p2pkh.lock(address);
1070
+ return lock;
1071
+ }
1072
+ static getUnlockP2PKH(priv: PrivateKey, satoshis: number): ScriptTemplateUnlock {
1073
+ const p2pkh = new P2PKH();
1074
+ const lock = SetupClient.getLockP2PKH(SetupClient.getKeyPair(priv).address);
1075
+ const unlock = p2pkh.unlock(priv, "all", false, satoshis, lock);
1076
+ return unlock;
1077
+ }
1078
+ static createP2PKHOutputs(outputs: {
1079
+ address: string;
1080
+ satoshis: number;
1081
+ outputDescription?: string;
1082
+ basket?: string;
1083
+ tags?: string[];
1084
+ }[]): CreateActionOutput[] {
1085
+ const os: CreateActionOutput[] = [];
1086
+ const count = outputs.length;
1087
+ for (let i = 0; i < count; i++) {
1088
+ const o = outputs[i];
1089
+ os.push({
1090
+ basket: o.basket,
1091
+ tags: o.tags,
1092
+ satoshis: o.satoshis,
1093
+ lockingScript: SetupClient.getLockP2PKH(o.address).toHex(),
1094
+ outputDescription: o.outputDescription || `p2pkh ${i}`
1095
+ });
1096
+ }
1097
+ return os;
1098
+ }
1099
+ static async createP2PKHOutputsAction(wallet: WalletInterface, outputs: {
1100
+ address: string;
1101
+ satoshis: number;
1102
+ outputDescription?: string;
1103
+ basket?: string;
1104
+ tags?: string[];
1105
+ }[], options?: CreateActionOptions): Promise<{
1106
+ cr: CreateActionResult;
1107
+ outpoints: string[] | undefined;
1108
+ }> {
1109
+ const os = SetupClient.createP2PKHOutputs(outputs);
1110
+ const createArgs: CreateActionArgs = {
1111
+ description: `createP2PKHOutputs`,
1112
+ outputs: os,
1113
+ options: {
1114
+ ...options,
1115
+ randomizeOutputs: false
1116
+ }
1117
+ };
1118
+ const cr = await wallet.createAction(createArgs);
1119
+ let outpoints: string[] | undefined;
1120
+ if (cr.txid) {
1121
+ outpoints = os.map((o, i) => `${cr.txid}.${i}`);
1122
+ }
1123
+ return { cr, outpoints };
1124
+ }
1125
+ static async fundWalletFromP2PKHOutpoints(wallet: WalletInterface, outpoints: string[], p2pkhKey: KeyPairAddress, inputBEEF?: BEEF) {
1126
+ }
1127
+ static async createWalletIdb(args: SetupWalletIdbArgs): Promise<SetupWalletIdb> {
1128
+ const wo = await SetupClient.createWallet(args);
1129
+ const activeStorage = await SetupClient.createStorageIdb(args);
1130
+ await wo.storage.addWalletStorageProvider(activeStorage);
1131
+ const { user, isNew } = await activeStorage.findOrInsertUser(wo.identityKey);
1132
+ const userId = user.userId;
1133
+ const r: SetupWalletIdb = {
1134
+ ...wo,
1135
+ activeStorage,
1136
+ userId
1137
+ };
1138
+ return r;
1139
+ }
1140
+ static async createStorageIdb(args: SetupWalletIdbArgs): Promise<StorageIdb>
1141
+ }
1142
+ ```
1143
+
1144
+ See also: [Chain](./client.md#type-chain), [KeyPairAddress](./setup.md#interface-keypairaddress), [Monitor](./monitor.md#class-monitor), [PrivilegedKeyManager](./client.md#class-privilegedkeymanager), [ScriptTemplateUnlock](./client.md#interface-scripttemplateunlock), [Services](./services.md#class-services), [SetupClientWalletArgs](./setup.md#interface-setupclientwalletargs), [SetupClientWalletClientArgs](./setup.md#interface-setupclientwalletclientargs), [SetupWallet](./setup.md#interface-setupwallet), [SetupWalletClient](./setup.md#interface-setupwalletclient), [SetupWalletIdb](./setup.md#interface-setupwalletidb), [SetupWalletIdbArgs](./setup.md#interface-setupwalletidbargs), [StorageClient](./storage.md#class-storageclient), [StorageIdb](./storage.md#class-storageidb), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager), [createAction](./storage.md#function-createaction)
1145
+
1146
+ ###### Method createStorageIdb
1147
+
1148
+ ```ts
1149
+ static async createStorageIdb(args: SetupWalletIdbArgs): Promise<StorageIdb>
1150
+ ```
1151
+ See also: [SetupWalletIdbArgs](./setup.md#interface-setupwalletidbargs), [StorageIdb](./storage.md#class-storageidb)
1152
+
1153
+ Returns
1154
+
1155
+ - `Knex` based storage provider for a wallet. May be used for either active storage or backup storage.
1156
+
1157
+ ###### Method createWallet
1158
+
1159
+ Create a `Wallet`. Storage can optionally be provided or configured later.
1160
+
1161
+ The following components are configured: KeyDeriver, WalletStorageManager, WalletService, WalletStorage.
1162
+ Optionally, PrivilegedKeyManager is also configured.
1163
+
1164
+ ```ts
1165
+ static async createWallet(args: SetupClientWalletArgs): Promise<SetupWallet> {
1166
+ const chain = args.chain;
1167
+ const rootKey = PrivateKey.fromHex(args.rootKeyHex);
1168
+ const identityKey = rootKey.toPublicKey().toString();
1169
+ const keyDeriver = new CachedKeyDeriver(rootKey);
1170
+ const storage = new WalletStorageManager(identityKey, args.active, args.backups);
1171
+ if (storage.canMakeAvailable())
1172
+ await storage.makeAvailable();
1173
+ const serviceOptions = Services.createDefaultOptions(chain);
1174
+ serviceOptions.taalApiKey = args.taalApiKey;
1175
+ const services = new Services(serviceOptions);
1176
+ const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);
1177
+ const monitor = new Monitor(monopts);
1178
+ monitor.addDefaultTasks();
1179
+ const privilegedKeyManager = args.privilegedKeyGetter
1180
+ ? new PrivilegedKeyManager(args.privilegedKeyGetter)
1181
+ : undefined;
1182
+ const wallet = new Wallet({
1183
+ chain,
1184
+ keyDeriver,
1185
+ storage,
1186
+ services,
1187
+ monitor,
1188
+ privilegedKeyManager
1189
+ });
1190
+ const r: SetupWallet = {
1191
+ rootKey,
1192
+ identityKey,
1193
+ keyDeriver,
1194
+ chain,
1195
+ storage,
1196
+ services,
1197
+ monitor,
1198
+ wallet
1199
+ };
1200
+ return r;
1201
+ }
1202
+ ```
1203
+ See also: [Monitor](./monitor.md#class-monitor), [PrivilegedKeyManager](./client.md#class-privilegedkeymanager), [Services](./services.md#class-services), [SetupClientWalletArgs](./setup.md#interface-setupclientwalletargs), [SetupWallet](./setup.md#interface-setupwallet), [Wallet](./client.md#class-wallet), [WalletStorageManager](./storage.md#class-walletstoragemanager)
1204
+
1205
+ ###### Method createWalletClientNoEnv
1206
+
1207
+ Setup a new `Wallet` without requiring a .env file.
1208
+
1209
+ ```ts
1210
+ static async createWalletClientNoEnv(args: {
1211
+ chain: Chain;
1212
+ rootKeyHex: string;
1213
+ storageUrl?: string;
1214
+ privilegedKeyGetter?: () => Promise<PrivateKey>;
1215
+ }): Promise<Wallet>
1216
+ ```
1217
+ See also: [Chain](./client.md#type-chain), [Wallet](./client.md#class-wallet)
1218
+
1219
+ Argument Details
1220
+
1221
+ + **args.chain**
1222
+ + 'main' or 'test'
1223
+ + **args.rootKeyHex**
1224
+ + Root private key for wallet's key deriver.
1225
+ + **args.storageUrl**
1226
+ + Optional. `StorageClient` and `chain` compatible endpoint URL.
1227
+ + **args.privilegedKeyGetter**
1228
+ + Optional. Method that will return the privileged `PrivateKey`, on demand.
1229
+
1230
+ ###### Method createWalletIdb
1231
+
1232
+ Adds `indexedDB` based storage to a `Wallet` configured by `SetupClient.createWalletOnly`
1233
+
1234
+ ```ts
1235
+ static async createWalletIdb(args: SetupWalletIdbArgs): Promise<SetupWalletIdb> {
1236
+ const wo = await SetupClient.createWallet(args);
1237
+ const activeStorage = await SetupClient.createStorageIdb(args);
1238
+ await wo.storage.addWalletStorageProvider(activeStorage);
1239
+ const { user, isNew } = await activeStorage.findOrInsertUser(wo.identityKey);
1240
+ const userId = user.userId;
1241
+ const r: SetupWalletIdb = {
1242
+ ...wo,
1243
+ activeStorage,
1244
+ userId
1245
+ };
1246
+ return r;
1247
+ }
1248
+ ```
1249
+ See also: [SetupClient](./setup.md#class-setupclient), [SetupWalletIdb](./setup.md#interface-setupwalletidb), [SetupWalletIdbArgs](./setup.md#interface-setupwalletidbargs)
1250
+
1251
+ Argument Details
1252
+
1253
+ + **args.databaseName**
1254
+ + Name for this storage. For MySQL, the schema name within the MySQL instance.
1255
+ + **args.chain**
1256
+ + Which chain this wallet is on: 'main' or 'test'. Defaults to 'test'.
1257
+
1258
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
1259
+
1260
+ ---
1261
+ #### Functions
1262
+
1263
+ #### Types
1264
+
1265
+ #### Variables
1266
+
1267
+
1268
+ <!--#endregion ts2md-api-merged-here-->