@bsv/wallet-toolbox 1.1.0

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 (919) hide show
  1. package/.env.template +22 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  3. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  4. package/.github/pull_request_template.md +24 -0
  5. package/.github/workflows/push.yaml +66 -0
  6. package/.prettierrc +10 -0
  7. package/CONTRIBUTING.md +89 -0
  8. package/LICENSE.txt +28 -0
  9. package/README.md +124 -0
  10. package/dev.sqlite3 +0 -0
  11. package/docs/README.md +15 -0
  12. package/docs/client.md +6812 -0
  13. package/docs/monitor.md +648 -0
  14. package/docs/services.md +496 -0
  15. package/docs/storage.md +1884 -0
  16. package/docs/wallet.md +6812 -0
  17. package/jest.config.ts +29 -0
  18. package/knexfile.js +9 -0
  19. package/license.md +1 -0
  20. package/out/src/Wallet.d.ts +83 -0
  21. package/out/src/Wallet.d.ts.map +1 -0
  22. package/out/src/Wallet.js +415 -0
  23. package/out/src/Wallet.js.map +1 -0
  24. package/out/src/index.all.d.ts +9 -0
  25. package/out/src/index.all.d.ts.map +1 -0
  26. package/out/src/index.all.js +48 -0
  27. package/out/src/index.all.js.map +1 -0
  28. package/out/src/index.client.d.ts +8 -0
  29. package/out/src/index.client.d.ts.map +1 -0
  30. package/out/src/index.client.js +47 -0
  31. package/out/src/index.client.js.map +1 -0
  32. package/out/src/index.d.ts +3 -0
  33. package/out/src/index.d.ts.map +1 -0
  34. package/out/src/index.js +42 -0
  35. package/out/src/index.js.map +1 -0
  36. package/out/src/monitor/Monitor.d.ts +89 -0
  37. package/out/src/monitor/Monitor.d.ts.map +1 -0
  38. package/out/src/monitor/Monitor.js +253 -0
  39. package/out/src/monitor/Monitor.js.map +1 -0
  40. package/out/src/monitor/MonitorDaemon.d.ts +30 -0
  41. package/out/src/monitor/MonitorDaemon.d.ts.map +1 -0
  42. package/out/src/monitor/MonitorDaemon.js +135 -0
  43. package/out/src/monitor/MonitorDaemon.js.map +1 -0
  44. package/out/src/monitor/__test/MonitorDaemon.man.test.d.ts +2 -0
  45. package/out/src/monitor/__test/MonitorDaemon.man.test.d.ts.map +1 -0
  46. package/out/src/monitor/__test/MonitorDaemon.man.test.js +50 -0
  47. package/out/src/monitor/__test/MonitorDaemon.man.test.js.map +1 -0
  48. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +53 -0
  49. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -0
  50. package/out/src/monitor/tasks/TaskCheckForProofs.js +197 -0
  51. package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -0
  52. package/out/src/monitor/tasks/TaskClock.d.ts +14 -0
  53. package/out/src/monitor/tasks/TaskClock.d.ts.map +1 -0
  54. package/out/src/monitor/tasks/TaskClock.js +27 -0
  55. package/out/src/monitor/tasks/TaskClock.js.map +1 -0
  56. package/out/src/monitor/tasks/TaskFailAbandoned.d.ts +20 -0
  57. package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -0
  58. package/out/src/monitor/tasks/TaskFailAbandoned.js +52 -0
  59. package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -0
  60. package/out/src/monitor/tasks/TaskNewHeader.d.ts +15 -0
  61. package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -0
  62. package/out/src/monitor/tasks/TaskNewHeader.js +45 -0
  63. package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -0
  64. package/out/src/monitor/tasks/TaskPurge.d.ts +45 -0
  65. package/out/src/monitor/tasks/TaskPurge.d.ts.map +1 -0
  66. package/out/src/monitor/tasks/TaskPurge.js +35 -0
  67. package/out/src/monitor/tasks/TaskPurge.js.map +1 -0
  68. package/out/src/monitor/tasks/TaskReviewStatus.d.ts +26 -0
  69. package/out/src/monitor/tasks/TaskReviewStatus.d.ts.map +1 -0
  70. package/out/src/monitor/tasks/TaskReviewStatus.js +44 -0
  71. package/out/src/monitor/tasks/TaskReviewStatus.js.map +1 -0
  72. package/out/src/monitor/tasks/TaskSendWaiting.d.ts +32 -0
  73. package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -0
  74. package/out/src/monitor/tasks/TaskSendWaiting.js +99 -0
  75. package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -0
  76. package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts +12 -0
  77. package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts.map +1 -0
  78. package/out/src/monitor/tasks/TaskSyncWhenIdle.js +22 -0
  79. package/out/src/monitor/tasks/TaskSyncWhenIdle.js.map +1 -0
  80. package/out/src/monitor/tasks/WalletMonitorTask.d.ts +40 -0
  81. package/out/src/monitor/tasks/WalletMonitorTask.d.ts.map +1 -0
  82. package/out/src/monitor/tasks/WalletMonitorTask.js +37 -0
  83. package/out/src/monitor/tasks/WalletMonitorTask.js.map +1 -0
  84. package/out/src/sdk/CertOps.d.ts +66 -0
  85. package/out/src/sdk/CertOps.d.ts.map +1 -0
  86. package/out/src/sdk/CertOps.js +198 -0
  87. package/out/src/sdk/CertOps.js.map +1 -0
  88. package/out/src/sdk/PrivilegedKeyManager.d.ts +125 -0
  89. package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -0
  90. package/out/src/sdk/PrivilegedKeyManager.js +293 -0
  91. package/out/src/sdk/PrivilegedKeyManager.js.map +1 -0
  92. package/out/src/sdk/StorageSyncReader.d.ts +121 -0
  93. package/out/src/sdk/StorageSyncReader.d.ts.map +1 -0
  94. package/out/src/sdk/StorageSyncReader.js +3 -0
  95. package/out/src/sdk/StorageSyncReader.js.map +1 -0
  96. package/out/src/sdk/StorageSyncReaderWriter.d.ts +89 -0
  97. package/out/src/sdk/StorageSyncReaderWriter.d.ts.map +1 -0
  98. package/out/src/sdk/StorageSyncReaderWriter.js +3 -0
  99. package/out/src/sdk/StorageSyncReaderWriter.js.map +1 -0
  100. package/out/src/sdk/WERR_errors.d.ts +90 -0
  101. package/out/src/sdk/WERR_errors.d.ts.map +1 -0
  102. package/out/src/sdk/WERR_errors.js +128 -0
  103. package/out/src/sdk/WERR_errors.js.map +1 -0
  104. package/out/src/sdk/WalletError.d.ts +45 -0
  105. package/out/src/sdk/WalletError.d.ts.map +1 -0
  106. package/out/src/sdk/WalletError.js +122 -0
  107. package/out/src/sdk/WalletError.js.map +1 -0
  108. package/out/src/sdk/WalletServices.interfaces.d.ts +325 -0
  109. package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -0
  110. package/out/src/sdk/WalletServices.interfaces.js +3 -0
  111. package/out/src/sdk/WalletServices.interfaces.js.map +1 -0
  112. package/out/src/sdk/WalletSigner.interfaces.d.ts +10 -0
  113. package/out/src/sdk/WalletSigner.interfaces.d.ts.map +1 -0
  114. package/out/src/sdk/WalletSigner.interfaces.js +3 -0
  115. package/out/src/sdk/WalletSigner.interfaces.js.map +1 -0
  116. package/out/src/sdk/WalletStorage.interfaces.d.ts +299 -0
  117. package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -0
  118. package/out/src/sdk/WalletStorage.interfaces.js +3 -0
  119. package/out/src/sdk/WalletStorage.interfaces.js.map +1 -0
  120. package/out/src/sdk/__test/CertificateLifeCycle.test.d.ts +2 -0
  121. package/out/src/sdk/__test/CertificateLifeCycle.test.d.ts.map +1 -0
  122. package/out/src/sdk/__test/CertificateLifeCycle.test.js +125 -0
  123. package/out/src/sdk/__test/CertificateLifeCycle.test.js.map +1 -0
  124. package/out/src/sdk/__test/PrivilegedKeyManager.test.d.ts +2 -0
  125. package/out/src/sdk/__test/PrivilegedKeyManager.test.d.ts.map +1 -0
  126. package/out/src/sdk/__test/PrivilegedKeyManager.test.js +660 -0
  127. package/out/src/sdk/__test/PrivilegedKeyManager.test.js.map +1 -0
  128. package/out/src/sdk/index.d.ts +12 -0
  129. package/out/src/sdk/index.d.ts.map +1 -0
  130. package/out/src/sdk/index.js +28 -0
  131. package/out/src/sdk/index.js.map +1 -0
  132. package/out/src/sdk/types.d.ts +74 -0
  133. package/out/src/sdk/types.d.ts.map +1 -0
  134. package/out/src/sdk/types.js +20 -0
  135. package/out/src/sdk/types.js.map +1 -0
  136. package/out/src/sdk/validationHelpers.d.ts +288 -0
  137. package/out/src/sdk/validationHelpers.d.ts.map +1 -0
  138. package/out/src/sdk/validationHelpers.js +630 -0
  139. package/out/src/sdk/validationHelpers.js.map +1 -0
  140. package/out/src/services/ServiceCollection.d.ts +25 -0
  141. package/out/src/services/ServiceCollection.d.ts.map +1 -0
  142. package/out/src/services/ServiceCollection.js +43 -0
  143. package/out/src/services/ServiceCollection.js.map +1 -0
  144. package/out/src/services/Services.d.ts +60 -0
  145. package/out/src/services/Services.d.ts.map +1 -0
  146. package/out/src/services/Services.js +342 -0
  147. package/out/src/services/Services.js.map +1 -0
  148. package/out/src/services/__tests/getMerklePath.test.d.ts +2 -0
  149. package/out/src/services/__tests/getMerklePath.test.d.ts.map +1 -0
  150. package/out/src/services/__tests/getMerklePath.test.js +16 -0
  151. package/out/src/services/__tests/getMerklePath.test.js.map +1 -0
  152. package/out/src/services/__tests/getRawTx.test.d.ts +2 -0
  153. package/out/src/services/__tests/getRawTx.test.d.ts.map +1 -0
  154. package/out/src/services/__tests/getRawTx.test.js +13 -0
  155. package/out/src/services/__tests/getRawTx.test.js.map +1 -0
  156. package/out/src/services/__tests/postBeef.test.d.ts +2 -0
  157. package/out/src/services/__tests/postBeef.test.d.ts.map +1 -0
  158. package/out/src/services/__tests/postBeef.test.js +18 -0
  159. package/out/src/services/__tests/postBeef.test.js.map +1 -0
  160. package/out/src/services/__tests/postBeefToArcTaal.test.d.ts +2 -0
  161. package/out/src/services/__tests/postBeefToArcTaal.test.d.ts.map +1 -0
  162. package/out/src/services/__tests/postBeefToArcTaal.test.js +479 -0
  163. package/out/src/services/__tests/postBeefToArcTaal.test.js.map +1 -0
  164. package/out/src/services/__tests/postTxs.test.d.ts +2 -0
  165. package/out/src/services/__tests/postTxs.test.d.ts.map +1 -0
  166. package/out/src/services/__tests/postTxs.test.js +19 -0
  167. package/out/src/services/__tests/postTxs.test.js.map +1 -0
  168. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +15 -0
  169. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -0
  170. package/out/src/services/chaintracker/ChaintracksChainTracker.js +51 -0
  171. package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -0
  172. package/out/src/services/chaintracker/__tests/ChaintracksChainTracker.test.d.ts +2 -0
  173. package/out/src/services/chaintracker/__tests/ChaintracksChainTracker.test.d.ts.map +1 -0
  174. package/out/src/services/chaintracker/__tests/ChaintracksChainTracker.test.js +19 -0
  175. package/out/src/services/chaintracker/__tests/ChaintracksChainTracker.test.js.map +1 -0
  176. package/out/src/services/chaintracker/__tests/ChaintracksServiceClient.test.d.ts +2 -0
  177. package/out/src/services/chaintracker/__tests/ChaintracksServiceClient.test.d.ts.map +1 -0
  178. package/out/src/services/chaintracker/__tests/ChaintracksServiceClient.test.js +29 -0
  179. package/out/src/services/chaintracker/__tests/ChaintracksServiceClient.test.js.map +1 -0
  180. package/out/src/services/chaintracker/chaintracks/BlockHeaderApi.d.ts +98 -0
  181. package/out/src/services/chaintracker/chaintracks/BlockHeaderApi.d.ts.map +1 -0
  182. package/out/src/services/chaintracker/chaintracks/BlockHeaderApi.js +38 -0
  183. package/out/src/services/chaintracker/chaintracks/BlockHeaderApi.js.map +1 -0
  184. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +36 -0
  185. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -0
  186. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +130 -0
  187. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -0
  188. package/out/src/services/chaintracker/chaintracks/index.d.ts +3 -0
  189. package/out/src/services/chaintracker/chaintracks/index.d.ts.map +1 -0
  190. package/out/src/services/chaintracker/chaintracks/index.js +19 -0
  191. package/out/src/services/chaintracker/chaintracks/index.js.map +1 -0
  192. package/out/src/services/chaintracker/index.d.ts +3 -0
  193. package/out/src/services/chaintracker/index.d.ts.map +1 -0
  194. package/out/src/services/chaintracker/index.js +19 -0
  195. package/out/src/services/chaintracker/index.js.map +1 -0
  196. package/out/src/services/createDefaultWalletServicesOptions.d.ts +3 -0
  197. package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -0
  198. package/out/src/services/createDefaultWalletServicesOptions.js +34 -0
  199. package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -0
  200. package/out/src/services/index.d.ts +2 -0
  201. package/out/src/services/index.d.ts.map +1 -0
  202. package/out/src/services/index.js +18 -0
  203. package/out/src/services/index.js.map +1 -0
  204. package/out/src/services/providers/arcServices.d.ts +62 -0
  205. package/out/src/services/providers/arcServices.d.ts.map +1 -0
  206. package/out/src/services/providers/arcServices.js +368 -0
  207. package/out/src/services/providers/arcServices.js.map +1 -0
  208. package/out/src/services/providers/echangeRates.d.ts +12 -0
  209. package/out/src/services/providers/echangeRates.d.ts.map +1 -0
  210. package/out/src/services/providers/echangeRates.js +237 -0
  211. package/out/src/services/providers/echangeRates.js.map +1 -0
  212. package/out/src/services/providers/whatsonchain.d.ts +17 -0
  213. package/out/src/services/providers/whatsonchain.d.ts.map +1 -0
  214. package/out/src/services/providers/whatsonchain.js +130 -0
  215. package/out/src/services/providers/whatsonchain.js.map +1 -0
  216. package/out/src/signer/WalletSigner.d.ts +11 -0
  217. package/out/src/signer/WalletSigner.d.ts.map +1 -0
  218. package/out/src/signer/WalletSigner.js +13 -0
  219. package/out/src/signer/WalletSigner.js.map +1 -0
  220. package/out/src/signer/methods/acquireDirectCertificate.d.ts +4 -0
  221. package/out/src/signer/methods/acquireDirectCertificate.d.ts.map +1 -0
  222. package/out/src/signer/methods/acquireDirectCertificate.js +47 -0
  223. package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -0
  224. package/out/src/signer/methods/createAction.d.ts +7 -0
  225. package/out/src/signer/methods/createAction.d.ts.map +1 -0
  226. package/out/src/signer/methods/createAction.js +250 -0
  227. package/out/src/signer/methods/createAction.js.map +1 -0
  228. package/out/src/signer/methods/internalizeAction.d.ts +31 -0
  229. package/out/src/signer/methods/internalizeAction.d.ts.map +1 -0
  230. package/out/src/signer/methods/internalizeAction.js +95 -0
  231. package/out/src/signer/methods/internalizeAction.js.map +1 -0
  232. package/out/src/signer/methods/proveCertificate.d.ts +4 -0
  233. package/out/src/signer/methods/proveCertificate.d.ts.map +1 -0
  234. package/out/src/signer/methods/proveCertificate.js +45 -0
  235. package/out/src/signer/methods/proveCertificate.js.map +1 -0
  236. package/out/src/signer/methods/signAction.d.ts +6 -0
  237. package/out/src/signer/methods/signAction.d.ts.map +1 -0
  238. package/out/src/signer/methods/signAction.js +79 -0
  239. package/out/src/signer/methods/signAction.js.map +1 -0
  240. package/out/src/storage/StorageKnex.d.ts +176 -0
  241. package/out/src/storage/StorageKnex.d.ts.map +1 -0
  242. package/out/src/storage/StorageKnex.js +1035 -0
  243. package/out/src/storage/StorageKnex.js.map +1 -0
  244. package/out/src/storage/StorageProvider.d.ts +140 -0
  245. package/out/src/storage/StorageProvider.d.ts.map +1 -0
  246. package/out/src/storage/StorageProvider.js +539 -0
  247. package/out/src/storage/StorageProvider.js.map +1 -0
  248. package/out/src/storage/StorageReader.d.ts +76 -0
  249. package/out/src/storage/StorageReader.d.ts.map +1 -0
  250. package/out/src/storage/StorageReader.js +124 -0
  251. package/out/src/storage/StorageReader.js.map +1 -0
  252. package/out/src/storage/StorageReaderWriter.d.ts +87 -0
  253. package/out/src/storage/StorageReaderWriter.d.ts.map +1 -0
  254. package/out/src/storage/StorageReaderWriter.js +337 -0
  255. package/out/src/storage/StorageReaderWriter.js.map +1 -0
  256. package/out/src/storage/StorageSyncReader.d.ts +33 -0
  257. package/out/src/storage/StorageSyncReader.d.ts.map +1 -0
  258. package/out/src/storage/StorageSyncReader.js +142 -0
  259. package/out/src/storage/StorageSyncReader.js.map +1 -0
  260. package/out/src/storage/WalletStorageManager.d.ts +103 -0
  261. package/out/src/storage/WalletStorageManager.d.ts.map +1 -0
  262. package/out/src/storage/WalletStorageManager.js +408 -0
  263. package/out/src/storage/WalletStorageManager.js.map +1 -0
  264. package/out/src/storage/__test/WalletStorageManager.test.d.ts +2 -0
  265. package/out/src/storage/__test/WalletStorageManager.test.d.ts.map +1 -0
  266. package/out/src/storage/__test/WalletStorageManager.test.js +260 -0
  267. package/out/src/storage/__test/WalletStorageManager.test.js.map +1 -0
  268. package/out/src/storage/index.all.d.ts +11 -0
  269. package/out/src/storage/index.all.d.ts.map +1 -0
  270. package/out/src/storage/index.all.js +50 -0
  271. package/out/src/storage/index.all.js.map +1 -0
  272. package/out/src/storage/index.client.d.ts +7 -0
  273. package/out/src/storage/index.client.d.ts.map +1 -0
  274. package/out/src/storage/index.client.js +46 -0
  275. package/out/src/storage/index.client.js.map +1 -0
  276. package/out/src/storage/index.db.d.ts +1 -0
  277. package/out/src/storage/index.db.d.ts.map +1 -0
  278. package/out/src/storage/index.db.js +2 -0
  279. package/out/src/storage/index.db.js.map +1 -0
  280. package/out/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.d.ts +2 -0
  281. package/out/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.d.ts.map +1 -0
  282. package/out/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.js +948 -0
  283. package/out/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.js.map +1 -0
  284. package/out/src/storage/methods/__test/GenerateChange/randomValsUsed1.d.ts +2 -0
  285. package/out/src/storage/methods/__test/GenerateChange/randomValsUsed1.d.ts.map +1 -0
  286. package/out/src/storage/methods/__test/GenerateChange/randomValsUsed1.js +35 -0
  287. package/out/src/storage/methods/__test/GenerateChange/randomValsUsed1.js.map +1 -0
  288. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +27 -0
  289. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -0
  290. package/out/src/storage/methods/attemptToPostReqsToNetwork.js +148 -0
  291. package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -0
  292. package/out/src/storage/methods/createAction.d.ts +23 -0
  293. package/out/src/storage/methods/createAction.d.ts.map +1 -0
  294. package/out/src/storage/methods/createAction.js +663 -0
  295. package/out/src/storage/methods/createAction.js.map +1 -0
  296. package/out/src/storage/methods/generateChange.d.ts +108 -0
  297. package/out/src/storage/methods/generateChange.d.ts.map +1 -0
  298. package/out/src/storage/methods/generateChange.js +422 -0
  299. package/out/src/storage/methods/generateChange.js.map +1 -0
  300. package/out/src/storage/methods/getBeefForTransaction.d.ts +22 -0
  301. package/out/src/storage/methods/getBeefForTransaction.d.ts.map +1 -0
  302. package/out/src/storage/methods/getBeefForTransaction.js +94 -0
  303. package/out/src/storage/methods/getBeefForTransaction.js.map +1 -0
  304. package/out/src/storage/methods/getSyncChunk.d.ts +10 -0
  305. package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -0
  306. package/out/src/storage/methods/getSyncChunk.js +271 -0
  307. package/out/src/storage/methods/getSyncChunk.js.map +1 -0
  308. package/out/src/storage/methods/internalizeAction.d.ts +38 -0
  309. package/out/src/storage/methods/internalizeAction.d.ts.map +1 -0
  310. package/out/src/storage/methods/internalizeAction.js +378 -0
  311. package/out/src/storage/methods/internalizeAction.js.map +1 -0
  312. package/out/src/storage/methods/listActions.d.ts +5 -0
  313. package/out/src/storage/methods/listActions.d.ts.map +1 -0
  314. package/out/src/storage/methods/listActions.js +174 -0
  315. package/out/src/storage/methods/listActions.js.map +1 -0
  316. package/out/src/storage/methods/listCertificates.d.ts +5 -0
  317. package/out/src/storage/methods/listCertificates.d.ts.map +1 -0
  318. package/out/src/storage/methods/listCertificates.js +68 -0
  319. package/out/src/storage/methods/listCertificates.js.map +1 -0
  320. package/out/src/storage/methods/listOutputs.d.ts +5 -0
  321. package/out/src/storage/methods/listOutputs.d.ts.map +1 -0
  322. package/out/src/storage/methods/listOutputs.js +189 -0
  323. package/out/src/storage/methods/listOutputs.js.map +1 -0
  324. package/out/src/storage/methods/processAction.d.ts +35 -0
  325. package/out/src/storage/methods/processAction.d.ts.map +1 -0
  326. package/out/src/storage/methods/processAction.js +271 -0
  327. package/out/src/storage/methods/processAction.js.map +1 -0
  328. package/out/src/storage/methods/purgeData.d.ts +4 -0
  329. package/out/src/storage/methods/purgeData.d.ts.map +1 -0
  330. package/out/src/storage/methods/purgeData.js +229 -0
  331. package/out/src/storage/methods/purgeData.js.map +1 -0
  332. package/out/src/storage/methods/reviewStatus.d.ts +9 -0
  333. package/out/src/storage/methods/reviewStatus.d.ts.map +1 -0
  334. package/out/src/storage/methods/reviewStatus.js +75 -0
  335. package/out/src/storage/methods/reviewStatus.js.map +1 -0
  336. package/out/src/storage/remoting/StorageClient.d.ts +56 -0
  337. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -0
  338. package/out/src/storage/remoting/StorageClient.js +181 -0
  339. package/out/src/storage/remoting/StorageClient.js.map +1 -0
  340. package/out/src/storage/remoting/StorageServer.d.ts +26 -0
  341. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -0
  342. package/out/src/storage/remoting/StorageServer.js +144 -0
  343. package/out/src/storage/remoting/StorageServer.js.map +1 -0
  344. package/out/src/storage/schema/KnexMigrations.d.ts +39 -0
  345. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -0
  346. package/out/src/storage/schema/KnexMigrations.js +442 -0
  347. package/out/src/storage/schema/KnexMigrations.js.map +1 -0
  348. package/out/src/storage/schema/entities/Certificate.d.ts +43 -0
  349. package/out/src/storage/schema/entities/Certificate.d.ts.map +1 -0
  350. package/out/src/storage/schema/entities/Certificate.js +162 -0
  351. package/out/src/storage/schema/entities/Certificate.js.map +1 -0
  352. package/out/src/storage/schema/entities/CertificateField.d.ts +32 -0
  353. package/out/src/storage/schema/entities/CertificateField.d.ts.map +1 -0
  354. package/out/src/storage/schema/entities/CertificateField.js +114 -0
  355. package/out/src/storage/schema/entities/CertificateField.js.map +1 -0
  356. package/out/src/storage/schema/entities/Commission.d.ts +37 -0
  357. package/out/src/storage/schema/entities/Commission.d.ts.map +1 -0
  358. package/out/src/storage/schema/entities/Commission.js +130 -0
  359. package/out/src/storage/schema/entities/Commission.js.map +1 -0
  360. package/out/src/storage/schema/entities/EntityBase.d.ts +105 -0
  361. package/out/src/storage/schema/entities/EntityBase.d.ts.map +1 -0
  362. package/out/src/storage/schema/entities/EntityBase.js +100 -0
  363. package/out/src/storage/schema/entities/EntityBase.js.map +1 -0
  364. package/out/src/storage/schema/entities/MergeEntity.d.ts +34 -0
  365. package/out/src/storage/schema/entities/MergeEntity.d.ts.map +1 -0
  366. package/out/src/storage/schema/entities/MergeEntity.js +57 -0
  367. package/out/src/storage/schema/entities/MergeEntity.js.map +1 -0
  368. package/out/src/storage/schema/entities/Output.d.ts +67 -0
  369. package/out/src/storage/schema/entities/Output.d.ts.map +1 -0
  370. package/out/src/storage/schema/entities/Output.js +281 -0
  371. package/out/src/storage/schema/entities/Output.js.map +1 -0
  372. package/out/src/storage/schema/entities/OutputBasket.d.ts +35 -0
  373. package/out/src/storage/schema/entities/OutputBasket.d.ts.map +1 -0
  374. package/out/src/storage/schema/entities/OutputBasket.js +133 -0
  375. package/out/src/storage/schema/entities/OutputBasket.js.map +1 -0
  376. package/out/src/storage/schema/entities/OutputTag.d.ts +31 -0
  377. package/out/src/storage/schema/entities/OutputTag.d.ts.map +1 -0
  378. package/out/src/storage/schema/entities/OutputTag.js +104 -0
  379. package/out/src/storage/schema/entities/OutputTag.js.map +1 -0
  380. package/out/src/storage/schema/entities/OutputTagMap.d.ts +28 -0
  381. package/out/src/storage/schema/entities/OutputTagMap.d.ts.map +1 -0
  382. package/out/src/storage/schema/entities/OutputTagMap.js +101 -0
  383. package/out/src/storage/schema/entities/OutputTagMap.js.map +1 -0
  384. package/out/src/storage/schema/entities/ProvenTx.d.ts +84 -0
  385. package/out/src/storage/schema/entities/ProvenTx.d.ts.map +1 -0
  386. package/out/src/storage/schema/entities/ProvenTx.js +283 -0
  387. package/out/src/storage/schema/entities/ProvenTx.js.map +1 -0
  388. package/out/src/storage/schema/entities/ProvenTxReq.d.ts +130 -0
  389. package/out/src/storage/schema/entities/ProvenTxReq.d.ts.map +1 -0
  390. package/out/src/storage/schema/entities/ProvenTxReq.js +521 -0
  391. package/out/src/storage/schema/entities/ProvenTxReq.js.map +1 -0
  392. package/out/src/storage/schema/entities/SyncState.d.ts +66 -0
  393. package/out/src/storage/schema/entities/SyncState.d.ts.map +1 -0
  394. package/out/src/storage/schema/entities/SyncState.js +284 -0
  395. package/out/src/storage/schema/entities/SyncState.js.map +1 -0
  396. package/out/src/storage/schema/entities/Transaction.d.ts +67 -0
  397. package/out/src/storage/schema/entities/Transaction.d.ts.map +1 -0
  398. package/out/src/storage/schema/entities/Transaction.js +264 -0
  399. package/out/src/storage/schema/entities/Transaction.js.map +1 -0
  400. package/out/src/storage/schema/entities/TxLabel.d.ts +31 -0
  401. package/out/src/storage/schema/entities/TxLabel.d.ts.map +1 -0
  402. package/out/src/storage/schema/entities/TxLabel.js +104 -0
  403. package/out/src/storage/schema/entities/TxLabel.js.map +1 -0
  404. package/out/src/storage/schema/entities/TxLabelMap.d.ts +28 -0
  405. package/out/src/storage/schema/entities/TxLabelMap.d.ts.map +1 -0
  406. package/out/src/storage/schema/entities/TxLabelMap.js +103 -0
  407. package/out/src/storage/schema/entities/TxLabelMap.js.map +1 -0
  408. package/out/src/storage/schema/entities/User.d.ts +29 -0
  409. package/out/src/storage/schema/entities/User.d.ts.map +1 -0
  410. package/out/src/storage/schema/entities/User.js +100 -0
  411. package/out/src/storage/schema/entities/User.js.map +1 -0
  412. package/out/src/storage/schema/entities/__tests/CertificateFieldTests.test.d.ts +2 -0
  413. package/out/src/storage/schema/entities/__tests/CertificateFieldTests.test.d.ts.map +1 -0
  414. package/out/src/storage/schema/entities/__tests/CertificateFieldTests.test.js +588 -0
  415. package/out/src/storage/schema/entities/__tests/CertificateFieldTests.test.js.map +1 -0
  416. package/out/src/storage/schema/entities/__tests/CertificateTests.test.d.ts +2 -0
  417. package/out/src/storage/schema/entities/__tests/CertificateTests.test.d.ts.map +1 -0
  418. package/out/src/storage/schema/entities/__tests/CertificateTests.test.js +449 -0
  419. package/out/src/storage/schema/entities/__tests/CertificateTests.test.js.map +1 -0
  420. package/out/src/storage/schema/entities/__tests/CommissionTests.test.d.ts +2 -0
  421. package/out/src/storage/schema/entities/__tests/CommissionTests.test.d.ts.map +1 -0
  422. package/out/src/storage/schema/entities/__tests/CommissionTests.test.js +602 -0
  423. package/out/src/storage/schema/entities/__tests/CommissionTests.test.js.map +1 -0
  424. package/out/src/storage/schema/entities/__tests/OutputBasketTests.test.d.ts +2 -0
  425. package/out/src/storage/schema/entities/__tests/OutputBasketTests.test.d.ts.map +1 -0
  426. package/out/src/storage/schema/entities/__tests/OutputBasketTests.test.js +515 -0
  427. package/out/src/storage/schema/entities/__tests/OutputBasketTests.test.js.map +1 -0
  428. package/out/src/storage/schema/entities/__tests/OutputTagMapTests.test.d.ts +2 -0
  429. package/out/src/storage/schema/entities/__tests/OutputTagMapTests.test.d.ts.map +1 -0
  430. package/out/src/storage/schema/entities/__tests/OutputTagMapTests.test.js +478 -0
  431. package/out/src/storage/schema/entities/__tests/OutputTagMapTests.test.js.map +1 -0
  432. package/out/src/storage/schema/entities/__tests/OutputTagTests.test.d.ts +2 -0
  433. package/out/src/storage/schema/entities/__tests/OutputTagTests.test.d.ts.map +1 -0
  434. package/out/src/storage/schema/entities/__tests/OutputTagTests.test.js +440 -0
  435. package/out/src/storage/schema/entities/__tests/OutputTagTests.test.js.map +1 -0
  436. package/out/src/storage/schema/entities/__tests/OutputTests.test.d.ts +2 -0
  437. package/out/src/storage/schema/entities/__tests/OutputTests.test.d.ts.map +1 -0
  438. package/out/src/storage/schema/entities/__tests/OutputTests.test.js +626 -0
  439. package/out/src/storage/schema/entities/__tests/OutputTests.test.js.map +1 -0
  440. package/out/src/storage/schema/entities/__tests/ProvenTxReqTests.test.d.ts +2 -0
  441. package/out/src/storage/schema/entities/__tests/ProvenTxReqTests.test.d.ts.map +1 -0
  442. package/out/src/storage/schema/entities/__tests/ProvenTxReqTests.test.js +585 -0
  443. package/out/src/storage/schema/entities/__tests/ProvenTxReqTests.test.js.map +1 -0
  444. package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.d.ts +2 -0
  445. package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.d.ts.map +1 -0
  446. package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.js +628 -0
  447. package/out/src/storage/schema/entities/__tests/ProvenTxTests.test.js.map +1 -0
  448. package/out/src/storage/schema/entities/__tests/SyncStateTests.test.d.ts +2 -0
  449. package/out/src/storage/schema/entities/__tests/SyncStateTests.test.d.ts.map +1 -0
  450. package/out/src/storage/schema/entities/__tests/SyncStateTests.test.js +307 -0
  451. package/out/src/storage/schema/entities/__tests/SyncStateTests.test.js.map +1 -0
  452. package/out/src/storage/schema/entities/__tests/TransactionTests.test.d.ts +2 -0
  453. package/out/src/storage/schema/entities/__tests/TransactionTests.test.d.ts.map +1 -0
  454. package/out/src/storage/schema/entities/__tests/TransactionTests.test.js +823 -0
  455. package/out/src/storage/schema/entities/__tests/TransactionTests.test.js.map +1 -0
  456. package/out/src/storage/schema/entities/__tests/TxLabelMapTests.test.d.ts +2 -0
  457. package/out/src/storage/schema/entities/__tests/TxLabelMapTests.test.d.ts.map +1 -0
  458. package/out/src/storage/schema/entities/__tests/TxLabelMapTests.test.js +442 -0
  459. package/out/src/storage/schema/entities/__tests/TxLabelMapTests.test.js.map +1 -0
  460. package/out/src/storage/schema/entities/__tests/TxLabelTests.test.d.ts +2 -0
  461. package/out/src/storage/schema/entities/__tests/TxLabelTests.test.d.ts.map +1 -0
  462. package/out/src/storage/schema/entities/__tests/TxLabelTests.test.js +313 -0
  463. package/out/src/storage/schema/entities/__tests/TxLabelTests.test.js.map +1 -0
  464. package/out/src/storage/schema/entities/__tests/stampLogTests.test.d.ts +2 -0
  465. package/out/src/storage/schema/entities/__tests/stampLogTests.test.d.ts.map +1 -0
  466. package/out/src/storage/schema/entities/__tests/stampLogTests.test.js +81 -0
  467. package/out/src/storage/schema/entities/__tests/stampLogTests.test.js.map +1 -0
  468. package/out/src/storage/schema/entities/__tests/usersTests.test.d.ts +2 -0
  469. package/out/src/storage/schema/entities/__tests/usersTests.test.d.ts.map +1 -0
  470. package/out/src/storage/schema/entities/__tests/usersTests.test.js +418 -0
  471. package/out/src/storage/schema/entities/__tests/usersTests.test.js.map +1 -0
  472. package/out/src/storage/schema/entities/index.d.ts +17 -0
  473. package/out/src/storage/schema/entities/index.d.ts.map +1 -0
  474. package/out/src/storage/schema/entities/index.js +33 -0
  475. package/out/src/storage/schema/entities/index.js.map +1 -0
  476. package/out/src/storage/schema/tables/Certificate.d.ts +20 -0
  477. package/out/src/storage/schema/tables/Certificate.d.ts.map +1 -0
  478. package/out/src/storage/schema/tables/Certificate.js +3 -0
  479. package/out/src/storage/schema/tables/Certificate.js.map +1 -0
  480. package/out/src/storage/schema/tables/CertificateField.d.ts +12 -0
  481. package/out/src/storage/schema/tables/CertificateField.d.ts.map +1 -0
  482. package/out/src/storage/schema/tables/CertificateField.js +3 -0
  483. package/out/src/storage/schema/tables/CertificateField.js.map +1 -0
  484. package/out/src/storage/schema/tables/Commission.d.ts +13 -0
  485. package/out/src/storage/schema/tables/Commission.d.ts.map +1 -0
  486. package/out/src/storage/schema/tables/Commission.js +3 -0
  487. package/out/src/storage/schema/tables/Commission.js.map +1 -0
  488. package/out/src/storage/schema/tables/MonitorEvent.d.ts +9 -0
  489. package/out/src/storage/schema/tables/MonitorEvent.d.ts.map +1 -0
  490. package/out/src/storage/schema/tables/MonitorEvent.js +3 -0
  491. package/out/src/storage/schema/tables/MonitorEvent.js.map +1 -0
  492. package/out/src/storage/schema/tables/Output.d.ts +36 -0
  493. package/out/src/storage/schema/tables/Output.d.ts.map +1 -0
  494. package/out/src/storage/schema/tables/Output.js +31 -0
  495. package/out/src/storage/schema/tables/Output.js.map +1 -0
  496. package/out/src/storage/schema/tables/OutputBasket.d.ts +12 -0
  497. package/out/src/storage/schema/tables/OutputBasket.d.ts.map +1 -0
  498. package/out/src/storage/schema/tables/OutputBasket.js +3 -0
  499. package/out/src/storage/schema/tables/OutputBasket.js.map +1 -0
  500. package/out/src/storage/schema/tables/OutputTag.d.ts +10 -0
  501. package/out/src/storage/schema/tables/OutputTag.d.ts.map +1 -0
  502. package/out/src/storage/schema/tables/OutputTag.js +3 -0
  503. package/out/src/storage/schema/tables/OutputTag.js.map +1 -0
  504. package/out/src/storage/schema/tables/OutputTagMap.d.ts +9 -0
  505. package/out/src/storage/schema/tables/OutputTagMap.d.ts.map +1 -0
  506. package/out/src/storage/schema/tables/OutputTagMap.js +3 -0
  507. package/out/src/storage/schema/tables/OutputTagMap.js.map +1 -0
  508. package/out/src/storage/schema/tables/ProvenTx.d.ts +14 -0
  509. package/out/src/storage/schema/tables/ProvenTx.d.ts.map +1 -0
  510. package/out/src/storage/schema/tables/ProvenTx.js +3 -0
  511. package/out/src/storage/schema/tables/ProvenTx.js.map +1 -0
  512. package/out/src/storage/schema/tables/ProvenTxReq.d.ts +64 -0
  513. package/out/src/storage/schema/tables/ProvenTxReq.d.ts.map +1 -0
  514. package/out/src/storage/schema/tables/ProvenTxReq.js +3 -0
  515. package/out/src/storage/schema/tables/ProvenTxReq.js.map +1 -0
  516. package/out/src/storage/schema/tables/Settings.d.ts +17 -0
  517. package/out/src/storage/schema/tables/Settings.d.ts.map +1 -0
  518. package/out/src/storage/schema/tables/Settings.js +3 -0
  519. package/out/src/storage/schema/tables/Settings.js.map +1 -0
  520. package/out/src/storage/schema/tables/SyncState.d.ts +18 -0
  521. package/out/src/storage/schema/tables/SyncState.d.ts.map +1 -0
  522. package/out/src/storage/schema/tables/SyncState.js +3 -0
  523. package/out/src/storage/schema/tables/SyncState.js.map +1 -0
  524. package/out/src/storage/schema/tables/Transaction.d.ts +37 -0
  525. package/out/src/storage/schema/tables/Transaction.d.ts.map +1 -0
  526. package/out/src/storage/schema/tables/Transaction.js +21 -0
  527. package/out/src/storage/schema/tables/Transaction.js.map +1 -0
  528. package/out/src/storage/schema/tables/TxLabel.d.ts +10 -0
  529. package/out/src/storage/schema/tables/TxLabel.d.ts.map +1 -0
  530. package/out/src/storage/schema/tables/TxLabel.js +3 -0
  531. package/out/src/storage/schema/tables/TxLabel.js.map +1 -0
  532. package/out/src/storage/schema/tables/TxLabelMap.d.ts +9 -0
  533. package/out/src/storage/schema/tables/TxLabelMap.d.ts.map +1 -0
  534. package/out/src/storage/schema/tables/TxLabelMap.js +3 -0
  535. package/out/src/storage/schema/tables/TxLabelMap.js.map +1 -0
  536. package/out/src/storage/schema/tables/User.d.ts +16 -0
  537. package/out/src/storage/schema/tables/User.d.ts.map +1 -0
  538. package/out/src/storage/schema/tables/User.js +3 -0
  539. package/out/src/storage/schema/tables/User.js.map +1 -0
  540. package/out/src/storage/schema/tables/index.d.ts +17 -0
  541. package/out/src/storage/schema/tables/index.d.ts.map +1 -0
  542. package/out/src/storage/schema/tables/index.js +33 -0
  543. package/out/src/storage/schema/tables/index.js.map +1 -0
  544. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts +71 -0
  545. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -0
  546. package/out/src/storage/sync/StorageMySQLDojoReader.js +612 -0
  547. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -0
  548. package/out/src/storage/sync/index.d.ts +2 -0
  549. package/out/src/storage/sync/index.d.ts.map +1 -0
  550. package/out/src/storage/sync/index.js +18 -0
  551. package/out/src/storage/sync/index.js.map +1 -0
  552. package/out/src/utility/ScriptTemplateSABPPP.d.ts +25 -0
  553. package/out/src/utility/ScriptTemplateSABPPP.d.ts.map +1 -0
  554. package/out/src/utility/ScriptTemplateSABPPP.js +46 -0
  555. package/out/src/utility/ScriptTemplateSABPPP.js.map +1 -0
  556. package/out/src/utility/index.all.d.ts +7 -0
  557. package/out/src/utility/index.all.d.ts.map +1 -0
  558. package/out/src/utility/index.all.js +23 -0
  559. package/out/src/utility/index.all.js.map +1 -0
  560. package/out/src/utility/index.client.d.ts +7 -0
  561. package/out/src/utility/index.client.d.ts.map +1 -0
  562. package/out/src/utility/index.client.js +23 -0
  563. package/out/src/utility/index.client.js.map +1 -0
  564. package/out/src/utility/parseTxScriptOffsets.d.ts +14 -0
  565. package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -0
  566. package/out/src/utility/parseTxScriptOffsets.js +26 -0
  567. package/out/src/utility/parseTxScriptOffsets.js.map +1 -0
  568. package/out/src/utility/stampLog.d.ts +18 -0
  569. package/out/src/utility/stampLog.d.ts.map +1 -0
  570. package/out/src/utility/stampLog.js +72 -0
  571. package/out/src/utility/stampLog.js.map +1 -0
  572. package/out/src/utility/tscProofToMerklePath.d.ts +8 -0
  573. package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -0
  574. package/out/src/utility/tscProofToMerklePath.js +41 -0
  575. package/out/src/utility/tscProofToMerklePath.js.map +1 -0
  576. package/out/src/utility/utilityHelpers.buffer.d.ts +18 -0
  577. package/out/src/utility/utilityHelpers.buffer.d.ts.map +1 -0
  578. package/out/src/utility/utilityHelpers.buffer.js +45 -0
  579. package/out/src/utility/utilityHelpers.buffer.js.map +1 -0
  580. package/out/src/utility/utilityHelpers.d.ts +129 -0
  581. package/out/src/utility/utilityHelpers.d.ts.map +1 -0
  582. package/out/src/utility/utilityHelpers.js +268 -0
  583. package/out/src/utility/utilityHelpers.js.map +1 -0
  584. package/out/src/utility/utilityHelpers.noBuffer.d.ts +9 -0
  585. package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -0
  586. package/out/src/utility/utilityHelpers.noBuffer.js +23 -0
  587. package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -0
  588. package/out/test/Wallet/StorageClient/storageClient.man.test.d.ts +2 -0
  589. package/out/test/Wallet/StorageClient/storageClient.man.test.d.ts.map +1 -0
  590. package/out/test/Wallet/StorageClient/storageClient.man.test.js +45 -0
  591. package/out/test/Wallet/StorageClient/storageClient.man.test.js.map +1 -0
  592. package/out/test/Wallet/action/internalizeAction.a.test.d.ts +2 -0
  593. package/out/test/Wallet/action/internalizeAction.a.test.d.ts.map +1 -0
  594. package/out/test/Wallet/action/internalizeAction.a.test.js +243 -0
  595. package/out/test/Wallet/action/internalizeAction.a.test.js.map +1 -0
  596. package/out/test/Wallet/certificate/acquireCertificate.test.d.ts +2 -0
  597. package/out/test/Wallet/certificate/acquireCertificate.test.d.ts.map +1 -0
  598. package/out/test/Wallet/certificate/acquireCertificate.test.js +213 -0
  599. package/out/test/Wallet/certificate/acquireCertificate.test.js.map +1 -0
  600. package/out/test/Wallet/certificate/listCertificates.test.d.ts +2 -0
  601. package/out/test/Wallet/certificate/listCertificates.test.d.ts.map +1 -0
  602. package/out/test/Wallet/certificate/listCertificates.test.js +305 -0
  603. package/out/test/Wallet/certificate/listCertificates.test.js.map +1 -0
  604. package/out/test/Wallet/get/getHeaderForHeight.test.d.ts +2 -0
  605. package/out/test/Wallet/get/getHeaderForHeight.test.d.ts.map +1 -0
  606. package/out/test/Wallet/get/getHeaderForHeight.test.js +68 -0
  607. package/out/test/Wallet/get/getHeaderForHeight.test.js.map +1 -0
  608. package/out/test/Wallet/get/getHeight.test.d.ts +2 -0
  609. package/out/test/Wallet/get/getHeight.test.d.ts.map +1 -0
  610. package/out/test/Wallet/get/getHeight.test.js +45 -0
  611. package/out/test/Wallet/get/getHeight.test.js.map +1 -0
  612. package/out/test/Wallet/get/getKnownTxids.test.d.ts +2 -0
  613. package/out/test/Wallet/get/getKnownTxids.test.d.ts.map +1 -0
  614. package/out/test/Wallet/get/getKnownTxids.test.js +73 -0
  615. package/out/test/Wallet/get/getKnownTxids.test.js.map +1 -0
  616. package/out/test/Wallet/get/getNetwork.test.d.ts +2 -0
  617. package/out/test/Wallet/get/getNetwork.test.d.ts.map +1 -0
  618. package/out/test/Wallet/get/getNetwork.test.js +26 -0
  619. package/out/test/Wallet/get/getNetwork.test.js.map +1 -0
  620. package/out/test/Wallet/get/getVersion.test.d.ts +2 -0
  621. package/out/test/Wallet/get/getVersion.test.d.ts.map +1 -0
  622. package/out/test/Wallet/get/getVersion.test.js +25 -0
  623. package/out/test/Wallet/get/getVersion.test.js.map +1 -0
  624. package/out/test/Wallet/live/walletLive.man.test.d.ts +26 -0
  625. package/out/test/Wallet/live/walletLive.man.test.d.ts.map +1 -0
  626. package/out/test/Wallet/live/walletLive.man.test.js +389 -0
  627. package/out/test/Wallet/live/walletLive.man.test.js.map +1 -0
  628. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.d.ts +2 -0
  629. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.d.ts.map +1 -0
  630. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.js +153 -0
  631. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.js.map +1 -0
  632. package/out/test/checkDB.d.ts +4 -0
  633. package/out/test/checkDB.d.ts.map +1 -0
  634. package/out/test/checkDB.js +55 -0
  635. package/out/test/checkDB.js.map +1 -0
  636. package/out/test/examples/README.man.test.d.ts +2 -0
  637. package/out/test/examples/README.man.test.d.ts.map +1 -0
  638. package/out/test/examples/README.man.test.js +46 -0
  639. package/out/test/examples/README.man.test.js.map +1 -0
  640. package/out/test/monitor/Monitor.test.d.ts +2 -0
  641. package/out/test/monitor/Monitor.test.d.ts.map +1 -0
  642. package/out/test/monitor/Monitor.test.js +446 -0
  643. package/out/test/monitor/Monitor.test.js.map +1 -0
  644. package/out/test/services/Services.test.d.ts +2 -0
  645. package/out/test/services/Services.test.d.ts.map +1 -0
  646. package/out/test/services/Services.test.js +128 -0
  647. package/out/test/services/Services.test.js.map +1 -0
  648. package/out/test/storage/KnexMigrations.test.d.ts +2 -0
  649. package/out/test/storage/KnexMigrations.test.d.ts.map +1 -0
  650. package/out/test/storage/KnexMigrations.test.js +81 -0
  651. package/out/test/storage/KnexMigrations.test.js.map +1 -0
  652. package/out/test/storage/StorageMySQLDojoReader.man.test.d.ts +2 -0
  653. package/out/test/storage/StorageMySQLDojoReader.man.test.d.ts.map +1 -0
  654. package/out/test/storage/StorageMySQLDojoReader.man.test.js +88 -0
  655. package/out/test/storage/StorageMySQLDojoReader.man.test.js.map +1 -0
  656. package/out/test/storage/count.test.d.ts +2 -0
  657. package/out/test/storage/count.test.d.ts.map +1 -0
  658. package/out/test/storage/count.test.js +141 -0
  659. package/out/test/storage/count.test.js.map +1 -0
  660. package/out/test/storage/find.test.d.ts +2 -0
  661. package/out/test/storage/find.test.d.ts.map +1 -0
  662. package/out/test/storage/find.test.js +148 -0
  663. package/out/test/storage/find.test.js.map +1 -0
  664. package/out/test/storage/findLegacy.test.d.ts +2 -0
  665. package/out/test/storage/findLegacy.test.d.ts.map +1 -0
  666. package/out/test/storage/findLegacy.test.js +52 -0
  667. package/out/test/storage/findLegacy.test.js.map +1 -0
  668. package/out/test/storage/insert.test.d.ts +2 -0
  669. package/out/test/storage/insert.test.d.ts.map +1 -0
  670. package/out/test/storage/insert.test.js +256 -0
  671. package/out/test/storage/insert.test.js.map +1 -0
  672. package/out/test/storage/update.test.d.ts +2 -0
  673. package/out/test/storage/update.test.d.ts.map +1 -0
  674. package/out/test/storage/update.test.js +926 -0
  675. package/out/test/storage/update.test.js.map +1 -0
  676. package/out/test/storage/update2.test.d.ts +2 -0
  677. package/out/test/storage/update2.test.d.ts.map +1 -0
  678. package/out/test/storage/update2.test.js +766 -0
  679. package/out/test/storage/update2.test.js.map +1 -0
  680. package/out/test/utils/TestUtilsWalletStorage.d.ts +399 -0
  681. package/out/test/utils/TestUtilsWalletStorage.d.ts.map +1 -0
  682. package/out/test/utils/TestUtilsWalletStorage.js +1337 -0
  683. package/out/test/utils/TestUtilsWalletStorage.js.map +1 -0
  684. package/out/test/wallet/action/abortAction.test.d.ts +2 -0
  685. package/out/test/wallet/action/abortAction.test.d.ts.map +1 -0
  686. package/out/test/wallet/action/abortAction.test.js +44 -0
  687. package/out/test/wallet/action/abortAction.test.js.map +1 -0
  688. package/out/test/wallet/action/createAction.test.d.ts +2 -0
  689. package/out/test/wallet/action/createAction.test.d.ts.map +1 -0
  690. package/out/test/wallet/action/createAction.test.js +230 -0
  691. package/out/test/wallet/action/createAction.test.js.map +1 -0
  692. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.d.ts +2 -0
  693. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.d.ts.map +1 -0
  694. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.js +273 -0
  695. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.js.map +1 -0
  696. package/out/test/wallet/action/internalizeAction.test.d.ts +2 -0
  697. package/out/test/wallet/action/internalizeAction.test.d.ts.map +1 -0
  698. package/out/test/wallet/action/internalizeAction.test.js +603 -0
  699. package/out/test/wallet/action/internalizeAction.test.js.map +1 -0
  700. package/out/test/wallet/action/relinquishOutput.test.d.ts +2 -0
  701. package/out/test/wallet/action/relinquishOutput.test.d.ts.map +1 -0
  702. package/out/test/wallet/action/relinquishOutput.test.js +31 -0
  703. package/out/test/wallet/action/relinquishOutput.test.js.map +1 -0
  704. package/out/test/wallet/construct/Wallet.constructor.test.d.ts +2 -0
  705. package/out/test/wallet/construct/Wallet.constructor.test.d.ts.map +1 -0
  706. package/out/test/wallet/construct/Wallet.constructor.test.js +49 -0
  707. package/out/test/wallet/construct/Wallet.constructor.test.js.map +1 -0
  708. package/out/test/wallet/list/listActions.test.d.ts +2 -0
  709. package/out/test/wallet/list/listActions.test.d.ts.map +1 -0
  710. package/out/test/wallet/list/listActions.test.js +265 -0
  711. package/out/test/wallet/list/listActions.test.js.map +1 -0
  712. package/out/test/wallet/list/listActions2.test.d.ts +2 -0
  713. package/out/test/wallet/list/listActions2.test.d.ts.map +1 -0
  714. package/out/test/wallet/list/listActions2.test.js +423 -0
  715. package/out/test/wallet/list/listActions2.test.js.map +1 -0
  716. package/out/test/wallet/list/listCertificates.test.d.ts +2 -0
  717. package/out/test/wallet/list/listCertificates.test.d.ts.map +1 -0
  718. package/out/test/wallet/list/listCertificates.test.js +115 -0
  719. package/out/test/wallet/list/listCertificates.test.js.map +1 -0
  720. package/out/test/wallet/list/listOutputs.test.d.ts +2 -0
  721. package/out/test/wallet/list/listOutputs.test.d.ts.map +1 -0
  722. package/out/test/wallet/list/listOutputs.test.js +521 -0
  723. package/out/test/wallet/list/listOutputs.test.js.map +1 -0
  724. package/out/test/wallet/sync/Wallet.sync.test.d.ts +2 -0
  725. package/out/test/wallet/sync/Wallet.sync.test.d.ts.map +1 -0
  726. package/out/test/wallet/sync/Wallet.sync.test.js +142 -0
  727. package/out/test/wallet/sync/Wallet.sync.test.js.map +1 -0
  728. package/out/tsconfig.all.tsbuildinfo +1 -0
  729. package/package.json +63 -0
  730. package/src/Wallet.ts +771 -0
  731. package/src/index.all.ts +8 -0
  732. package/src/index.client.ts +7 -0
  733. package/src/index.ts +2 -0
  734. package/src/monitor/Monitor.ts +317 -0
  735. package/src/monitor/MonitorDaemon.ts +197 -0
  736. package/src/monitor/README.md +3 -0
  737. package/src/monitor/__test/MonitorDaemon.man.test.ts +17 -0
  738. package/src/monitor/tasks/TaskCheckForProofs.ts +235 -0
  739. package/src/monitor/tasks/TaskClock.ts +35 -0
  740. package/src/monitor/tasks/TaskFailAbandoned.ts +56 -0
  741. package/src/monitor/tasks/TaskNewHeader.ts +48 -0
  742. package/src/monitor/tasks/TaskPurge.ts +69 -0
  743. package/src/monitor/tasks/TaskReviewStatus.ts +51 -0
  744. package/src/monitor/tasks/TaskSendWaiting.ts +107 -0
  745. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  746. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  747. package/src/sdk/CertOps.ts +346 -0
  748. package/src/sdk/PrivilegedKeyManager.ts +402 -0
  749. package/src/sdk/README.md +13 -0
  750. package/src/sdk/StorageSyncReader.ts +155 -0
  751. package/src/sdk/StorageSyncReaderWriter.ts +263 -0
  752. package/src/sdk/WERR_errors.ts +152 -0
  753. package/src/sdk/WalletError.ts +136 -0
  754. package/src/sdk/WalletServices.interfaces.ts +399 -0
  755. package/src/sdk/WalletSigner.interfaces.ts +38 -0
  756. package/src/sdk/WalletStorage.interfaces.ts +416 -0
  757. package/src/sdk/__test/CertificateLifeCycle.test.ts +194 -0
  758. package/src/sdk/__test/PrivilegedKeyManager.test.ts +775 -0
  759. package/src/sdk/index.ts +11 -0
  760. package/src/sdk/types.ts +115 -0
  761. package/src/sdk/validationHelpers.ts +1248 -0
  762. package/src/services/README.md +11 -0
  763. package/src/services/ServiceCollection.ts +50 -0
  764. package/src/services/Services.ts +461 -0
  765. package/src/services/__tests/getMerklePath.test.ts +16 -0
  766. package/src/services/__tests/getRawTx.test.ts +15 -0
  767. package/src/services/__tests/postBeef.test.ts +19 -0
  768. package/src/services/__tests/postBeefToArcTaal.test.ts +487 -0
  769. package/src/services/__tests/postTxs.test.ts +20 -0
  770. package/src/services/chaintracker/ChaintracksChainTracker.ts +78 -0
  771. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +25 -0
  772. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +32 -0
  773. package/src/services/chaintracker/chaintracks/BlockHeaderApi.ts +123 -0
  774. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +160 -0
  775. package/src/services/chaintracker/chaintracks/index.ts +2 -0
  776. package/src/services/chaintracker/index.ts +2 -0
  777. package/src/services/createDefaultWalletServicesOptions.ts +38 -0
  778. package/src/services/index.ts +1 -0
  779. package/src/services/providers/arcServices.ts +570 -0
  780. package/src/services/providers/echangeRates.ts +276 -0
  781. package/src/services/providers/whatsonchain.ts +170 -0
  782. package/src/signer/README.md +5 -0
  783. package/src/signer/WalletSigner.ts +21 -0
  784. package/src/signer/methods/acquireDirectCertificate.ts +53 -0
  785. package/src/signer/methods/createAction.ts +364 -0
  786. package/src/signer/methods/internalizeAction.ts +142 -0
  787. package/src/signer/methods/proveCertificate.ts +51 -0
  788. package/src/signer/methods/signAction.ts +121 -0
  789. package/src/storage/README.md +14 -0
  790. package/src/storage/StorageKnex.ts +1449 -0
  791. package/src/storage/StorageProvider.ts +853 -0
  792. package/src/storage/StorageReader.ts +222 -0
  793. package/src/storage/StorageReaderWriter.ts +623 -0
  794. package/src/storage/StorageSyncReader.ts +143 -0
  795. package/src/storage/WalletStorageManager.ts +532 -0
  796. package/src/storage/__test/WalletStorageManager.test.ts +292 -0
  797. package/src/storage/index.all.ts +10 -0
  798. package/src/storage/index.client.ts +6 -0
  799. package/src/storage/index.db.ts +0 -0
  800. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1143 -0
  801. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +31 -0
  802. package/src/storage/methods/attemptToPostReqsToNetwork.ts +185 -0
  803. package/src/storage/methods/createAction.ts +997 -0
  804. package/src/storage/methods/generateChange.ts +629 -0
  805. package/src/storage/methods/getBeefForTransaction.ts +143 -0
  806. package/src/storage/methods/getSyncChunk.ts +330 -0
  807. package/src/storage/methods/internalizeAction.ts +538 -0
  808. package/src/storage/methods/listActions.ts +203 -0
  809. package/src/storage/methods/listCertificates.ts +81 -0
  810. package/src/storage/methods/listOutputs.ts +219 -0
  811. package/src/storage/methods/processAction.ts +477 -0
  812. package/src/storage/methods/purgeData.ts +276 -0
  813. package/src/storage/methods/reviewStatus.ts +95 -0
  814. package/src/storage/remoting/StorageClient.ts +306 -0
  815. package/src/storage/remoting/StorageServer.ts +179 -0
  816. package/src/storage/schema/KnexMigrations.ts +488 -0
  817. package/src/storage/schema/entities/Certificate.ts +199 -0
  818. package/src/storage/schema/entities/CertificateField.ts +157 -0
  819. package/src/storage/schema/entities/Commission.ts +169 -0
  820. package/src/storage/schema/entities/EntityBase.ts +214 -0
  821. package/src/storage/schema/entities/MergeEntity.ts +79 -0
  822. package/src/storage/schema/entities/Output.ts +323 -0
  823. package/src/storage/schema/entities/OutputBasket.ts +165 -0
  824. package/src/storage/schema/entities/OutputTag.ts +138 -0
  825. package/src/storage/schema/entities/OutputTagMap.ts +146 -0
  826. package/src/storage/schema/entities/ProvenTx.ts +349 -0
  827. package/src/storage/schema/entities/ProvenTxReq.ts +646 -0
  828. package/src/storage/schema/entities/SyncState.ts +429 -0
  829. package/src/storage/schema/entities/Transaction.ts +334 -0
  830. package/src/storage/schema/entities/TxLabel.ts +135 -0
  831. package/src/storage/schema/entities/TxLabelMap.ts +148 -0
  832. package/src/storage/schema/entities/User.ts +138 -0
  833. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +663 -0
  834. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +527 -0
  835. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +658 -0
  836. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +567 -0
  837. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +530 -0
  838. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +504 -0
  839. package/src/storage/schema/entities/__tests/OutputTests.test.ts +689 -0
  840. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +669 -0
  841. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +700 -0
  842. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +376 -0
  843. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +920 -0
  844. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +512 -0
  845. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +350 -0
  846. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +97 -0
  847. package/src/storage/schema/entities/__tests/usersTests.test.ts +485 -0
  848. package/src/storage/schema/entities/index.ts +16 -0
  849. package/src/storage/schema/tables/Certificate.ts +21 -0
  850. package/src/storage/schema/tables/CertificateField.ts +12 -0
  851. package/src/storage/schema/tables/Commission.ts +13 -0
  852. package/src/storage/schema/tables/MonitorEvent.ts +9 -0
  853. package/src/storage/schema/tables/Output.ts +64 -0
  854. package/src/storage/schema/tables/OutputBasket.ts +12 -0
  855. package/src/storage/schema/tables/OutputTag.ts +10 -0
  856. package/src/storage/schema/tables/OutputTagMap.ts +9 -0
  857. package/src/storage/schema/tables/ProvenTx.ts +14 -0
  858. package/src/storage/schema/tables/ProvenTxReq.ts +65 -0
  859. package/src/storage/schema/tables/Settings.ts +17 -0
  860. package/src/storage/schema/tables/SyncState.ts +18 -0
  861. package/src/storage/schema/tables/Transaction.ts +54 -0
  862. package/src/storage/schema/tables/TxLabel.ts +10 -0
  863. package/src/storage/schema/tables/TxLabelMap.ts +9 -0
  864. package/src/storage/schema/tables/User.ts +16 -0
  865. package/src/storage/schema/tables/index.ts +16 -0
  866. package/src/storage/sync/StorageMySQLDojoReader.ts +771 -0
  867. package/src/storage/sync/index.ts +1 -0
  868. package/src/utility/README.md +3 -0
  869. package/src/utility/ScriptTemplateSABPPP.ts +79 -0
  870. package/src/utility/index.all.ts +7 -0
  871. package/src/utility/index.client.ts +7 -0
  872. package/src/utility/parseTxScriptOffsets.ts +29 -0
  873. package/src/utility/stampLog.ts +73 -0
  874. package/src/utility/tscProofToMerklePath.ts +51 -0
  875. package/src/utility/utilityHelpers.buffer.ts +43 -0
  876. package/src/utility/utilityHelpers.noBuffer.ts +18 -0
  877. package/src/utility/utilityHelpers.ts +283 -0
  878. package/test/Wallet/StorageClient/storageClient.man.test.ts +55 -0
  879. package/test/Wallet/action/internalizeAction.a.test.ts +301 -0
  880. package/test/Wallet/certificate/acquireCertificate.test.ts +253 -0
  881. package/test/Wallet/certificate/listCertificates.test.ts +352 -0
  882. package/test/Wallet/get/getHeaderForHeight.test.ts +79 -0
  883. package/test/Wallet/get/getHeight.test.ts +52 -0
  884. package/test/Wallet/get/getKnownTxids.test.ts +90 -0
  885. package/test/Wallet/get/getNetwork.test.ts +28 -0
  886. package/test/Wallet/get/getVersion.test.ts +28 -0
  887. package/test/Wallet/live/walletLive.man.test.ts +510 -0
  888. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +155 -0
  889. package/test/checkDB.ts +63 -0
  890. package/test/checkdb +0 -0
  891. package/test/examples/README.man.test.ts +53 -0
  892. package/test/monitor/Monitor.test.ts +536 -0
  893. package/test/services/Services.test.ts +149 -0
  894. package/test/storage/KnexMigrations.test.ts +100 -0
  895. package/test/storage/StorageMySQLDojoReader.man.test.ts +71 -0
  896. package/test/storage/count.test.ts +193 -0
  897. package/test/storage/find.test.ts +216 -0
  898. package/test/storage/findLegacy.test.ts +70 -0
  899. package/test/storage/insert.test.ts +294 -0
  900. package/test/storage/update.test.ts +1146 -0
  901. package/test/storage/update2.test.ts +1017 -0
  902. package/test/utils/TestUtilsWalletStorage.ts +1923 -0
  903. package/test/utils/removeFailedFromDatabase.sql +17 -0
  904. package/test/wallet/action/abortAction.test.ts +55 -0
  905. package/test/wallet/action/createAction.test.ts +266 -0
  906. package/test/wallet/action/createActionToGenerateBeefs.man.test.ts +297 -0
  907. package/test/wallet/action/internalizeAction.test.ts +729 -0
  908. package/test/wallet/action/relinquishOutput.test.ts +43 -0
  909. package/test/wallet/construct/Wallet.constructor.test.ts +57 -0
  910. package/test/wallet/list/listActions.test.ts +282 -0
  911. package/test/wallet/list/listActions2.test.ts +570 -0
  912. package/test/wallet/list/listCertificates.test.ts +129 -0
  913. package/test/wallet/list/listOutputs.test.ts +573 -0
  914. package/test/wallet/sync/Wallet.sync.test.ts +226 -0
  915. package/ts2md.json +32 -0
  916. package/tsconfig.all.json +29 -0
  917. package/tsconfig.client.json +22 -0
  918. package/tsconfig.json +14 -0
  919. package/unlock-migrations.sh +41 -0
@@ -0,0 +1,1923 @@
1
+ import {
2
+ CreateActionArgs,
3
+ CreateActionOutput,
4
+ CreateActionResult,
5
+ HexString,
6
+ KeyDeriver,
7
+ P2PKH,
8
+ PrivateKey,
9
+ PublicKey,
10
+ SatoshiValue,
11
+ SignActionArgs,
12
+ SignActionResult,
13
+ Utils,
14
+ WalletAction,
15
+ WalletActionInput,
16
+ WalletActionOutput,
17
+ WalletCertificate,
18
+ WalletInterface
19
+ } from '@bsv/sdk'
20
+ import path from 'path'
21
+ import { promises as fsp } from 'fs'
22
+ import {
23
+ asArray,
24
+ randomBytesBase64,
25
+ randomBytesHex,
26
+ sdk,
27
+ StorageProvider,
28
+ StorageKnex,
29
+ StorageSyncReader,
30
+ table,
31
+ verifyTruthy,
32
+ Wallet,
33
+ Monitor,
34
+ Services,
35
+ WalletStorageManager,
36
+ verifyOne,
37
+ StorageClient
38
+ } from '../../src/index.all'
39
+
40
+ import { Knex, knex as makeKnex } from 'knex'
41
+ import { Beef } from '@bsv/sdk'
42
+
43
+ import * as dotenv from 'dotenv'
44
+ import { PrivilegedKeyManager, TransactionStatus } from '../../src/sdk'
45
+ dotenv.config()
46
+
47
+ const localMySqlConnection = process.env.LOCAL_MYSQL_CONNECTION || ''
48
+
49
+ export interface TuEnv {
50
+ chain: sdk.Chain
51
+ userId: number
52
+ identityKey: string
53
+ mainTaalApiKey: string
54
+ testTaalApiKey: string
55
+ devKeys: Record<string, string>
56
+ noMySQL: boolean
57
+ runSlowTests: boolean
58
+ logTests: boolean
59
+ }
60
+
61
+ export abstract class TestUtilsWalletStorage {
62
+ static getEnv(chain: sdk.Chain) {
63
+ // Identity keys of the lead maintainer of this repo...
64
+ const identityKey =
65
+ (chain === 'main'
66
+ ? process.env.MY_MAIN_IDENTITY
67
+ : process.env.MY_TEST_IDENTITY) || ''
68
+ const identityKey2 =
69
+ (chain === 'main'
70
+ ? process.env.MY_MAIN_IDENTITY2
71
+ : process.env.MY_TEST_IDENTITY2) || ''
72
+ const DEV_KEYS = process.env.DEV_KEYS || '{}'
73
+ const logTests = !!process.env.LOGTESTS
74
+ const runMySQL = !!process.env.RUNMYSQL
75
+ const runSlowTests = !!process.env.RUNSLOWTESTS
76
+ return {
77
+ chain,
78
+ identityKey,
79
+ identityKey2,
80
+ mainTaalApiKey: verifyTruthy(
81
+ process.env.MAIN_TAAL_API_KEY || '',
82
+ `.env value for 'mainTaalApiKey' is required.`
83
+ ),
84
+ testTaalApiKey: verifyTruthy(
85
+ process.env.TEST_TAAL_API_KEY || '',
86
+ `.env value for 'testTaalApiKey' is required.`
87
+ ),
88
+ devKeys: JSON.parse(DEV_KEYS) as Record<string, string>,
89
+ runMySQL,
90
+ runSlowTests,
91
+ logTests
92
+ }
93
+ }
94
+
95
+ static async createNoSendP2PKHTestOutpoint(
96
+ address: string,
97
+ satoshis: number,
98
+ noSendChange: string[] | undefined,
99
+ wallet: WalletInterface
100
+ ): Promise<{
101
+ noSendChange: string[]
102
+ txid: string
103
+ cr: CreateActionResult
104
+ sr: SignActionResult
105
+ }> {
106
+ return await _tu.createNoSendP2PKHTestOutpoints(
107
+ 1,
108
+ address,
109
+ satoshis,
110
+ noSendChange,
111
+ wallet
112
+ )
113
+ }
114
+
115
+ static async createNoSendP2PKHTestOutpoints(
116
+ count: number,
117
+ address: string,
118
+ satoshis: number,
119
+ noSendChange: string[] | undefined,
120
+ wallet: WalletInterface
121
+ ): Promise<{
122
+ noSendChange: string[]
123
+ txid: string
124
+ cr: CreateActionResult
125
+ sr: SignActionResult
126
+ }> {
127
+ const outputs: CreateActionOutput[] = []
128
+ for (let i = 0; i < count; i++) {
129
+ outputs.push({
130
+ basket: `test-p2pkh-output-${i}`,
131
+ satoshis,
132
+ lockingScript: _tu.getLockP2PKH(address).toHex(),
133
+ outputDescription: `p2pkh ${i}`
134
+ })
135
+ }
136
+
137
+ const createArgs: CreateActionArgs = {
138
+ description: `to ${address}`,
139
+ outputs,
140
+ options: {
141
+ noSendChange,
142
+ randomizeOutputs: false,
143
+ signAndProcess: false,
144
+ noSend: true
145
+ }
146
+ }
147
+
148
+ const cr = await wallet.createAction(createArgs)
149
+ noSendChange = cr.noSendChange
150
+
151
+ expect(cr.noSendChange).toBeTruthy()
152
+ expect(cr.sendWithResults).toBeUndefined()
153
+ expect(cr.tx).toBeUndefined()
154
+ expect(cr.txid).toBeUndefined()
155
+
156
+ expect(cr.signableTransaction).toBeTruthy()
157
+ const st = cr.signableTransaction!
158
+ expect(st.reference).toBeTruthy()
159
+ // const tx = Transaction.fromAtomicBEEF(st.tx) // Transaction doesn't support V2 Beef yet.
160
+ const atomicBeef = Beef.fromBinary(st.tx)
161
+ const tx = atomicBeef.txs[atomicBeef.txs.length - 1].tx
162
+ for (const input of tx.inputs) {
163
+ expect(atomicBeef.findTxid(input.sourceTXID!)).toBeTruthy()
164
+ }
165
+
166
+ // Spending authorization check happens here...
167
+ //expect(st.amount > 242 && st.amount < 300).toBe(true)
168
+ // sign and complete
169
+ const signArgs: SignActionArgs = {
170
+ reference: st.reference,
171
+ spends: {},
172
+ options: {
173
+ returnTXIDOnly: true,
174
+ noSend: true
175
+ }
176
+ }
177
+
178
+ const sr = await wallet.signAction(signArgs)
179
+
180
+ let txid = sr.txid!
181
+ // Update the noSendChange txid to final signed value.
182
+ noSendChange = noSendChange!.map(op => `${txid}.${op.split('.')[1]}`)
183
+ return { noSendChange, txid, cr, sr }
184
+ }
185
+
186
+ static getKeyPair(priv?: string | PrivateKey): TestKeyPair {
187
+ if (priv === undefined) priv = PrivateKey.fromRandom()
188
+ else if (typeof priv === 'string') priv = new PrivateKey(priv, 'hex')
189
+
190
+ const pub = PublicKey.fromPrivateKey(priv)
191
+ const address = pub.toAddress()
192
+ return { privateKey: priv, publicKey: pub, address }
193
+ }
194
+
195
+ static getLockP2PKH(address: string) {
196
+ const p2pkh = new P2PKH()
197
+ const lock = p2pkh.lock(address)
198
+ return lock
199
+ }
200
+
201
+ static getUnlockP2PKH(priv: PrivateKey, satoshis: number) {
202
+ const p2pkh = new P2PKH()
203
+ const lock = _tu.getLockP2PKH(_tu.getKeyPair(priv).address)
204
+ // Prepare to pay with SIGHASH_ALL and without ANYONE_CAN_PAY.
205
+ // In otherwords:
206
+ // - all outputs must remain in the current order, amount and locking scripts.
207
+ // - all inputs must remain from the current outpoints and sequence numbers.
208
+ // (unlock scripts are never signed)
209
+ const unlock = p2pkh.unlock(priv, 'all', false, satoshis, lock)
210
+ return unlock
211
+ }
212
+
213
+ static async createWalletOnly(args: {
214
+ chain?: sdk.Chain
215
+ rootKeyHex?: string
216
+ active?: sdk.WalletStorageProvider
217
+ backups?: sdk.WalletStorageProvider[]
218
+ privKeyHex?: string
219
+ }): Promise<TestWalletOnly> {
220
+ args.chain ||= 'test'
221
+ args.rootKeyHex ||= '1'.repeat(64)
222
+ const rootKey = PrivateKey.fromHex(args.rootKeyHex)
223
+ const identityKey = rootKey.toPublicKey().toString()
224
+ const keyDeriver = new KeyDeriver(rootKey)
225
+ const chain = args.chain
226
+ const storage = new WalletStorageManager(
227
+ identityKey,
228
+ args.active,
229
+ args.backups
230
+ )
231
+ if (storage.stores.length > 0) await storage.makeAvailable()
232
+ const services = new Services(args.chain)
233
+ const monopts = Monitor.createDefaultWalletMonitorOptions(
234
+ chain,
235
+ storage,
236
+ services
237
+ )
238
+ const monitor = new Monitor(monopts)
239
+ monitor.addDefaultTasks()
240
+ let privilegedKeyManager: PrivilegedKeyManager | undefined = undefined
241
+ if (args.privKeyHex) {
242
+ const privKey = PrivateKey.fromString(args.privKeyHex)
243
+ privilegedKeyManager = new PrivilegedKeyManager(async () => privKey)
244
+ }
245
+ const wallet = new Wallet({
246
+ chain,
247
+ keyDeriver,
248
+ storage,
249
+ services,
250
+ monitor,
251
+ privilegedKeyManager
252
+ })
253
+ const r: TestWalletOnly = {
254
+ rootKey,
255
+ identityKey,
256
+ keyDeriver,
257
+ chain,
258
+ storage,
259
+ services,
260
+ monitor,
261
+ wallet
262
+ }
263
+ return r
264
+ }
265
+
266
+ static async createTestWalletWithStorageClient(args: {
267
+ rootKeyHex?: string
268
+ endpointUrl?: string
269
+ chain?: sdk.Chain
270
+ }): Promise<TestWalletOnly> {
271
+ if (args.chain === 'main')
272
+ throw new sdk.WERR_INVALID_PARAMETER(
273
+ 'chain',
274
+ `'test' for now, 'main' is not yet supported.`
275
+ )
276
+
277
+ const wo = await _tu.createWalletOnly({
278
+ chain: 'test',
279
+ rootKeyHex: args.rootKeyHex
280
+ })
281
+ args.endpointUrl ||= 'https://staging-dojo.babbage.systems'
282
+ const client = new StorageClient(wo.wallet, args.endpointUrl)
283
+ await wo.storage.addWalletStorageProvider(client)
284
+ await wo.storage.makeAvailable()
285
+ return wo
286
+ }
287
+
288
+ static async createKnexTestWalletWithSetup<T>(args: {
289
+ knex: Knex<any, any[]>
290
+ databaseName: string
291
+ chain?: sdk.Chain
292
+ rootKeyHex?: string
293
+ dropAll?: boolean
294
+ privKeyHex?: string
295
+ insertSetup: (storage: StorageKnex, identityKey: string) => Promise<T>
296
+ }): Promise<TestWallet<T>> {
297
+ const wo = await _tu.createWalletOnly({
298
+ chain: args.chain,
299
+ rootKeyHex: args.rootKeyHex,
300
+ privKeyHex: args.privKeyHex
301
+ })
302
+ const activeStorage = new StorageKnex({
303
+ chain: wo.chain,
304
+ knex: args.knex,
305
+ commissionSatoshis: 0,
306
+ commissionPubKeyHex: undefined,
307
+ feeModel: { model: 'sat/kb', value: 1 }
308
+ })
309
+ if (args.dropAll) await activeStorage.dropAllData()
310
+ await activeStorage.migrate(args.databaseName, wo.identityKey)
311
+ await activeStorage.makeAvailable()
312
+ const setup = await args.insertSetup(activeStorage, wo.identityKey)
313
+ await wo.storage.addWalletStorageProvider(activeStorage)
314
+ const { user, isNew } = await activeStorage.findOrInsertUser(wo.identityKey)
315
+ const userId = user.userId
316
+ const r: TestWallet<T> = {
317
+ ...wo,
318
+ activeStorage,
319
+ setup,
320
+ userId
321
+ }
322
+ return r
323
+ }
324
+
325
+ /**
326
+ * Returns path to temporary file in project's './test/data/tmp/' folder.
327
+ *
328
+ * Creates any missing folders.
329
+ *
330
+ * Optionally tries to delete any existing file. This may fail if the file file is locked
331
+ * by another process.
332
+ *
333
+ * Optionally copies filename (or if filename has no dir component, a file of the same filename from the project's './test/data' folder) to initialize file's contents.
334
+ *
335
+ * CAUTION: returned file path will include four random hex digits unless tryToDelete is true. Files must be purged periodically.
336
+ *
337
+ * @param filename target filename without path, optionally just extension in which case random name is used
338
+ * @param tryToDelete true to attempt to delete an existing file at the returned file path.
339
+ * @param copyToTmp true to copy file of same filename from './test/data' (or elsewhere if filename has path) to tmp folder
340
+ * @param reuseExisting true to use existing file if found, otherwise a random string is added to filename.
341
+ * @returns path in './test/data/tmp' folder.
342
+ */
343
+ static async newTmpFile(
344
+ filename = '',
345
+ tryToDelete = false,
346
+ copyToTmp = false,
347
+ reuseExisting = false
348
+ ): Promise<string> {
349
+ const tmpFolder = './test/data/tmp/'
350
+ const p = path.parse(filename)
351
+ const dstDir = tmpFolder
352
+ const dstName = `${p.name}${tryToDelete || reuseExisting ? '' : randomBytesHex(6)}`
353
+ const dstExt = p.ext || 'tmp'
354
+ const dstPath = path.resolve(`${dstDir}${dstName}${dstExt}`)
355
+ await fsp.mkdir(tmpFolder, { recursive: true })
356
+ if (!reuseExisting && (tryToDelete || copyToTmp))
357
+ try {
358
+ await fsp.unlink(dstPath)
359
+ } catch (eu: unknown) {
360
+ const e = sdk.WalletError.fromUnknown(eu)
361
+ if (e.name !== 'ENOENT') {
362
+ throw e
363
+ }
364
+ }
365
+ if (copyToTmp) {
366
+ const srcPath = p.dir
367
+ ? path.resolve(filename)
368
+ : path.resolve(`./test/data/${filename}`)
369
+ await fsp.copyFile(srcPath, dstPath)
370
+ }
371
+ return dstPath
372
+ }
373
+
374
+ static async copyFile(srcPath: string, dstPath: string): Promise<void> {
375
+ await fsp.copyFile(srcPath, dstPath)
376
+ }
377
+
378
+ static async existingDataFile(filename: string): Promise<string> {
379
+ const folder = './test/data/'
380
+ return folder + filename
381
+ }
382
+
383
+ static createLocalSQLite(filename: string): Knex {
384
+ const config: Knex.Config = {
385
+ client: 'sqlite3',
386
+ connection: { filename },
387
+ useNullAsDefault: true
388
+ }
389
+ const knex = makeKnex(config)
390
+ return knex
391
+ }
392
+
393
+ static createMySQLFromConnection(connection: object): Knex {
394
+ const config: Knex.Config = {
395
+ client: 'mysql2',
396
+ connection,
397
+ useNullAsDefault: true,
398
+ pool: { min: 0, max: 7, idleTimeoutMillis: 15000 }
399
+ }
400
+ const knex = makeKnex(config)
401
+ return knex
402
+ }
403
+
404
+ static createLocalMySQL(database: string): Knex {
405
+ const connection = JSON.parse(localMySqlConnection || '{}')
406
+ connection['database'] = database
407
+ const config: Knex.Config = {
408
+ client: 'mysql2',
409
+ connection,
410
+ useNullAsDefault: true,
411
+ pool: { min: 0, max: 7, idleTimeoutMillis: 15000 }
412
+ }
413
+ const knex = makeKnex(config)
414
+ return knex
415
+ }
416
+
417
+ static async createMySQLTestWallet(args: {
418
+ databaseName: string
419
+ chain?: sdk.Chain
420
+ rootKeyHex?: string
421
+ dropAll?: boolean
422
+ }): Promise<TestWallet<{}>> {
423
+ return await this.createKnexTestWallet({
424
+ ...args,
425
+ knex: _tu.createLocalMySQL(args.databaseName)
426
+ })
427
+ }
428
+
429
+ static async createMySQLTestSetup1Wallet(args: {
430
+ databaseName: string
431
+ chain?: sdk.Chain
432
+ rootKeyHex?: string
433
+ }): Promise<TestWallet<TestSetup1>> {
434
+ return await this.createKnexTestSetup1Wallet({
435
+ ...args,
436
+ dropAll: true,
437
+ knex: _tu.createLocalMySQL(args.databaseName)
438
+ })
439
+ }
440
+
441
+ static async createSQLiteTestWallet(args: {
442
+ filePath?: string
443
+ databaseName: string
444
+ chain?: sdk.Chain
445
+ rootKeyHex?: string
446
+ dropAll?: boolean
447
+ privKeyHex?: string
448
+ }): Promise<TestWalletNoSetup> {
449
+ const localSQLiteFile =
450
+ args.filePath ||
451
+ (await _tu.newTmpFile(`${args.databaseName}.sqlite`, false, false, true))
452
+ return await this.createKnexTestWallet({
453
+ ...args,
454
+ knex: _tu.createLocalSQLite(localSQLiteFile)
455
+ })
456
+ }
457
+
458
+ static async createSQLiteTestSetup1Wallet(args: {
459
+ databaseName: string
460
+ chain?: sdk.Chain
461
+ rootKeyHex?: string
462
+ }): Promise<TestWallet<TestSetup1>> {
463
+ const localSQLiteFile = await _tu.newTmpFile(
464
+ `${args.databaseName}.sqlite`,
465
+ false,
466
+ false,
467
+ true
468
+ )
469
+ return await this.createKnexTestSetup1Wallet({
470
+ ...args,
471
+ dropAll: true,
472
+ knex: _tu.createLocalSQLite(localSQLiteFile)
473
+ })
474
+ }
475
+
476
+ static async createSQLiteTestSetup2Wallet(args: {
477
+ databaseName: string
478
+ chain?: sdk.Chain
479
+ rootKeyHex?: string
480
+ }): Promise<TestWallet<TestSetup2>> {
481
+ const localSQLiteFile = await _tu.newTmpFile(
482
+ `${args.databaseName}.sqlite`,
483
+ false,
484
+ false,
485
+ true
486
+ )
487
+ return await this.createKnexTestSetup2Wallet({
488
+ ...args,
489
+ dropAll: true,
490
+ knex: _tu.createLocalSQLite(localSQLiteFile)
491
+ })
492
+ }
493
+
494
+ static async createKnexTestWallet(args: {
495
+ knex: Knex<any, any[]>
496
+ databaseName: string
497
+ chain?: sdk.Chain
498
+ rootKeyHex?: string
499
+ dropAll?: boolean
500
+ privKeyHex?: string
501
+ }): Promise<TestWalletNoSetup> {
502
+ return await _tu.createKnexTestWalletWithSetup({
503
+ ...args,
504
+ insertSetup: insertEmptySetup
505
+ })
506
+ }
507
+
508
+ static async createKnexTestSetup1Wallet(args: {
509
+ knex: Knex<any, any[]>
510
+ databaseName: string
511
+ chain?: sdk.Chain
512
+ rootKeyHex?: string
513
+ dropAll?: boolean
514
+ }): Promise<TestWallet<TestSetup1>> {
515
+ return await _tu.createKnexTestWalletWithSetup({
516
+ ...args,
517
+ insertSetup: _tu.createTestSetup1
518
+ })
519
+ }
520
+
521
+ static async createKnexTestSetup2Wallet(args: {
522
+ knex: Knex<any, any[]>
523
+ databaseName: string
524
+ chain?: sdk.Chain
525
+ rootKeyHex?: string
526
+ dropAll?: boolean
527
+ }): Promise<TestWallet<TestSetup2>> {
528
+ return await _tu.createKnexTestWalletWithSetup({
529
+ ...args,
530
+ insertSetup: _tu.createTestSetup2
531
+ })
532
+ }
533
+
534
+ static async fileExists(file: string): Promise<boolean> {
535
+ try {
536
+ const f = await fsp.open(file, 'r')
537
+ await f.close()
538
+ return true
539
+ } catch (eu: unknown) {
540
+ return false
541
+ }
542
+ }
543
+
544
+ //if (await _tu.fileExists(walletFile))
545
+ static async createLegacyWalletSQLiteCopy(
546
+ databaseName: string
547
+ ): Promise<TestWalletNoSetup> {
548
+ const walletFile = await _tu.newTmpFile(
549
+ `${databaseName}.sqlite`,
550
+ false,
551
+ false,
552
+ true
553
+ )
554
+ const walletKnex = _tu.createLocalSQLite(walletFile)
555
+ return await _tu.createLegacyWalletCopy(
556
+ databaseName,
557
+ walletKnex,
558
+ walletFile
559
+ )
560
+ }
561
+
562
+ static async createLegacyWalletMySQLCopy(
563
+ databaseName: string
564
+ ): Promise<TestWalletNoSetup> {
565
+ const walletKnex = _tu.createLocalMySQL(databaseName)
566
+ return await _tu.createLegacyWalletCopy(databaseName, walletKnex)
567
+ }
568
+
569
+ static async createLiveWalletSQLiteWARNING(
570
+ databaseFullPath: string = './test/data/walletLiveTestData.sqlite'
571
+ ): Promise<TestWalletNoSetup> {
572
+ return await this.createKnexTestWallet({
573
+ chain: 'test',
574
+ rootKeyHex: _tu.legacyRootKeyHex,
575
+ databaseName: 'walletLiveTestData',
576
+ knex: _tu.createLocalSQLite(databaseFullPath)
577
+ })
578
+ }
579
+
580
+ static async createWalletSQLite(
581
+ databaseFullPath: string = './test/data/tmp/walletNewTestData.sqlite',
582
+ databaseName: string = 'walletNewTestData'
583
+ ): Promise<TestWalletNoSetup> {
584
+ return await this.createSQLiteTestWallet({
585
+ filePath: databaseFullPath,
586
+ databaseName,
587
+ chain: 'test',
588
+ rootKeyHex: '1'.repeat(64),
589
+ dropAll: true
590
+ })
591
+ }
592
+
593
+ static legacyRootKeyHex =
594
+ '153a3df216' +
595
+ '686f55b253991c' +
596
+ '7039da1f648' +
597
+ 'ffc5bfe93d6ac2c25ac' +
598
+ '2d4070918d'
599
+
600
+ static async createLegacyWalletCopy(
601
+ databaseName: string,
602
+ walletKnex: Knex<any, any[]>,
603
+ tryCopyToPath?: string
604
+ ): Promise<TestWalletNoSetup> {
605
+ const readerFile = await _tu.existingDataFile(`walletLegacyTestData.sqlite`)
606
+ let useReader = true
607
+ if (tryCopyToPath) {
608
+ await _tu.copyFile(readerFile, tryCopyToPath)
609
+ //console.log('USING FILE COPY INSTEAD OF SOURCE DB SYNC')
610
+ useReader = false
611
+ }
612
+ const chain: sdk.Chain = 'test'
613
+ const rootKeyHex = _tu.legacyRootKeyHex
614
+ const identityKey =
615
+ '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
616
+ const rootKey = PrivateKey.fromHex(rootKeyHex)
617
+ const keyDeriver = new KeyDeriver(rootKey)
618
+ const activeStorage = new StorageKnex({
619
+ chain,
620
+ knex: walletKnex,
621
+ commissionSatoshis: 0,
622
+ commissionPubKeyHex: undefined,
623
+ feeModel: { model: 'sat/kb', value: 1 }
624
+ })
625
+ if (useReader) await activeStorage.dropAllData()
626
+ await activeStorage.migrate(databaseName, identityKey)
627
+ await activeStorage.makeAvailable()
628
+ const storage = new WalletStorageManager(identityKey, activeStorage)
629
+ await storage.makeAvailable()
630
+ if (useReader) {
631
+ const readerKnex = _tu.createLocalSQLite(readerFile)
632
+ const reader = new StorageKnex({
633
+ chain,
634
+ knex: readerKnex,
635
+ commissionSatoshis: 0,
636
+ commissionPubKeyHex: undefined,
637
+ feeModel: { model: 'sat/kb', value: 1 }
638
+ })
639
+ await reader.makeAvailable()
640
+ await storage.syncFromReader(
641
+ identityKey,
642
+ new StorageSyncReader({ identityKey }, reader)
643
+ )
644
+ await reader.destroy()
645
+ }
646
+ const services = new Services(chain)
647
+ const monopts = Monitor.createDefaultWalletMonitorOptions(
648
+ chain,
649
+ storage,
650
+ services
651
+ )
652
+ const monitor = new Monitor(monopts)
653
+ const wallet = new Wallet({ chain, keyDeriver, storage, services, monitor })
654
+ const userId = verifyTruthy(
655
+ await activeStorage.findUserByIdentityKey(identityKey)
656
+ ).userId
657
+ const r: TestWallet<{}> = {
658
+ rootKey,
659
+ identityKey,
660
+ keyDeriver,
661
+ chain,
662
+ activeStorage,
663
+ storage,
664
+ setup: {},
665
+ services,
666
+ monitor,
667
+ wallet,
668
+ userId
669
+ }
670
+ return r
671
+ }
672
+
673
+ static makeSampleCert(subject?: string): {
674
+ cert: WalletCertificate
675
+ subject: string
676
+ certifier: PrivateKey
677
+ } {
678
+ subject ||= PrivateKey.fromRandom().toPublicKey().toString()
679
+ const certifier = PrivateKey.fromRandom()
680
+ const verifier = PrivateKey.fromRandom()
681
+ const cert: WalletCertificate = {
682
+ type: Utils.toBase64(new Array(32).fill(1)),
683
+ serialNumber: Utils.toBase64(new Array(32).fill(2)),
684
+ revocationOutpoint:
685
+ 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.1',
686
+ subject,
687
+ certifier: certifier.toPublicKey().toString(),
688
+ fields: {
689
+ name: 'Alice',
690
+ email: 'alice@example.com',
691
+ organization: 'Example Corp'
692
+ },
693
+ signature: ''
694
+ }
695
+ return { cert, subject, certifier }
696
+ }
697
+
698
+ static async insertTestProvenTx(storage: StorageProvider, txid?: string) {
699
+ const now = new Date()
700
+ const ptx: table.ProvenTx = {
701
+ created_at: now,
702
+ updated_at: now,
703
+ provenTxId: 0,
704
+ txid: txid || randomBytesHex(32),
705
+ height: 1,
706
+ index: 0,
707
+ merklePath: [1, 2, 3, 4, 5, 6, 7, 8],
708
+ rawTx: [4, 5, 6],
709
+ blockHash: randomBytesHex(32),
710
+ merkleRoot: randomBytesHex(32)
711
+ }
712
+ await storage.insertProvenTx(ptx)
713
+ return ptx
714
+ }
715
+
716
+ static async insertTestProvenTxReq(
717
+ storage: StorageProvider,
718
+ txid?: string,
719
+ provenTxId?: number,
720
+ onlyRequired?: boolean
721
+ ) {
722
+ const now = new Date()
723
+ const ptxreq: table.ProvenTxReq = {
724
+ // Required:
725
+ created_at: now,
726
+ updated_at: now,
727
+ provenTxReqId: 0,
728
+ txid: txid || randomBytesHex(32),
729
+ status: 'nosend',
730
+ attempts: 0,
731
+ notified: false,
732
+ history: '{}',
733
+ notify: '{}',
734
+ rawTx: [4, 5, 6],
735
+ // Optional:
736
+ provenTxId: provenTxId || undefined,
737
+ batch: onlyRequired ? undefined : randomBytesBase64(10),
738
+ inputBEEF: onlyRequired ? undefined : [1, 2, 3]
739
+ }
740
+ await storage.insertProvenTxReq(ptxreq)
741
+ return ptxreq
742
+ }
743
+
744
+ static async insertTestUser(storage: StorageProvider, identityKey?: string) {
745
+ const now = new Date()
746
+ const e: table.User = {
747
+ created_at: now,
748
+ updated_at: now,
749
+ userId: 0,
750
+ identityKey: identityKey || randomBytesHex(33)
751
+ }
752
+ await storage.insertUser(e)
753
+ return e
754
+ }
755
+
756
+ static async insertTestCertificate(storage: StorageProvider, u?: table.User) {
757
+ const now = new Date()
758
+ u ||= await _tu.insertTestUser(storage)
759
+ const e: table.Certificate = {
760
+ created_at: now,
761
+ updated_at: now,
762
+ certificateId: 0,
763
+ userId: u.userId,
764
+ type: randomBytesBase64(33),
765
+ serialNumber: randomBytesBase64(33),
766
+ certifier: randomBytesHex(33),
767
+ subject: randomBytesHex(33),
768
+ verifier: undefined,
769
+ revocationOutpoint: `${randomBytesHex(32)}.999`,
770
+ signature: randomBytesHex(50),
771
+ isDeleted: false
772
+ }
773
+ await storage.insertCertificate(e)
774
+ return e
775
+ }
776
+
777
+ static async insertTestCertificateField(
778
+ storage: StorageProvider,
779
+ c: table.Certificate,
780
+ name: string,
781
+ value: string
782
+ ) {
783
+ const now = new Date()
784
+ const e: table.CertificateField = {
785
+ created_at: now,
786
+ updated_at: now,
787
+ certificateId: c.certificateId,
788
+ userId: c.userId,
789
+ fieldName: name,
790
+ fieldValue: value,
791
+ masterKey: randomBytesBase64(40)
792
+ }
793
+ await storage.insertCertificateField(e)
794
+ return e
795
+ }
796
+
797
+ static async insertTestOutputBasket(
798
+ storage: StorageProvider,
799
+ u?: table.User | number,
800
+ partial?: Partial<table.OutputBasket>
801
+ ) {
802
+ const now = new Date()
803
+ if (typeof u === 'number')
804
+ u = verifyOne(await storage.findUsers({ partial: { userId: u } }))
805
+ u ||= await _tu.insertTestUser(storage)
806
+ const e: table.OutputBasket = {
807
+ created_at: now,
808
+ updated_at: now,
809
+ basketId: 0,
810
+ userId: u.userId,
811
+ name: randomBytesHex(6),
812
+ numberOfDesiredUTXOs: 42,
813
+ minimumDesiredUTXOValue: 1642,
814
+ isDeleted: false,
815
+ ...(partial || {})
816
+ }
817
+ await storage.insertOutputBasket(e)
818
+ return e
819
+ }
820
+
821
+ static async insertTestTransaction(
822
+ storage: StorageProvider,
823
+ u?: table.User,
824
+ onlyRequired?: boolean,
825
+ partial?: Partial<table.Transaction>
826
+ ) {
827
+ const now = new Date()
828
+ u ||= await _tu.insertTestUser(storage)
829
+ const e: table.Transaction = {
830
+ // Required:
831
+ created_at: now,
832
+ updated_at: now,
833
+ transactionId: 0,
834
+ userId: u.userId,
835
+ status: 'nosend',
836
+ reference: randomBytesBase64(10),
837
+ isOutgoing: true,
838
+ satoshis: 9999,
839
+ description: 'buy me a river',
840
+ // Optional:
841
+ version: onlyRequired ? undefined : 0,
842
+ lockTime: onlyRequired ? undefined : 500000000,
843
+ txid: onlyRequired ? undefined : randomBytesHex(32),
844
+ inputBEEF: onlyRequired ? undefined : new Beef().toBinary(),
845
+ rawTx: onlyRequired ? undefined : [1, 2, 3],
846
+ ...(partial || {})
847
+ }
848
+ await storage.insertTransaction(e)
849
+ return { tx: e, user: u }
850
+ }
851
+
852
+ static async insertTestOutput(
853
+ storage: StorageProvider,
854
+ t: table.Transaction,
855
+ vout: number,
856
+ satoshis: number,
857
+ basket?: table.OutputBasket,
858
+ requiredOnly?: boolean,
859
+ partial?: Partial<table.Output>
860
+ ) {
861
+ const now = new Date()
862
+ const e: table.Output = {
863
+ created_at: now,
864
+ updated_at: now,
865
+ outputId: 0,
866
+ userId: t.userId,
867
+ transactionId: t.transactionId,
868
+ basketId: basket ? basket.basketId : undefined,
869
+ spendable: true,
870
+ change: true,
871
+ outputDescription: 'not mutch to say',
872
+ vout,
873
+ satoshis,
874
+ providedBy: 'you',
875
+ purpose: 'secret',
876
+ type: 'custom',
877
+ txid: requiredOnly ? undefined : randomBytesHex(32),
878
+ senderIdentityKey: requiredOnly ? undefined : randomBytesHex(32),
879
+ derivationPrefix: requiredOnly ? undefined : randomBytesHex(16),
880
+ derivationSuffix: requiredOnly ? undefined : randomBytesHex(16),
881
+ spentBy: undefined, // must be a valid transsactionId
882
+ sequenceNumber: requiredOnly ? undefined : 42,
883
+ spendingDescription: requiredOnly ? undefined : randomBytesHex(16),
884
+ scriptLength: requiredOnly ? undefined : 36,
885
+ scriptOffset: requiredOnly ? undefined : 12,
886
+ lockingScript: requiredOnly ? undefined : asArray(randomBytesHex(36)),
887
+ ...(partial || {})
888
+ }
889
+ await storage.insertOutput(e)
890
+ return e
891
+ }
892
+
893
+ static async insertTestOutputTag(
894
+ storage: StorageProvider,
895
+ u: table.User,
896
+ partial?: Partial<table.OutputTag>
897
+ ) {
898
+ const now = new Date()
899
+ const e: table.OutputTag = {
900
+ created_at: now,
901
+ updated_at: now,
902
+ outputTagId: 0,
903
+ userId: u.userId,
904
+ tag: randomBytesHex(6),
905
+ isDeleted: false,
906
+ ...(partial || {})
907
+ }
908
+ await storage.insertOutputTag(e)
909
+ return e
910
+ }
911
+
912
+ static async insertTestOutputTagMap(
913
+ storage: StorageProvider,
914
+ o: table.Output,
915
+ tag: table.OutputTag
916
+ ) {
917
+ const now = new Date()
918
+ const e: table.OutputTagMap = {
919
+ created_at: now,
920
+ updated_at: now,
921
+ outputTagId: tag.outputTagId,
922
+ outputId: o.outputId,
923
+ isDeleted: false
924
+ }
925
+ await storage.insertOutputTagMap(e)
926
+ return e
927
+ }
928
+
929
+ static async insertTestTxLabel(
930
+ storage: StorageProvider,
931
+ u: table.User,
932
+ partial?: Partial<table.TxLabel>
933
+ ) {
934
+ const now = new Date()
935
+ const e: table.TxLabel = {
936
+ created_at: now,
937
+ updated_at: now,
938
+ txLabelId: 0,
939
+ userId: u.userId,
940
+ label: randomBytesHex(6),
941
+ isDeleted: false,
942
+ ...(partial || {})
943
+ }
944
+ await storage.insertTxLabel(e)
945
+ return e
946
+ }
947
+
948
+ static async insertTestTxLabelMap(
949
+ storage: StorageProvider,
950
+ tx: table.Transaction,
951
+ label: table.TxLabel,
952
+ partial?: Partial<table.TxLabelMap>
953
+ ) {
954
+ const now = new Date()
955
+ const e: table.TxLabelMap = {
956
+ created_at: now,
957
+ updated_at: now,
958
+ txLabelId: label.txLabelId,
959
+ transactionId: tx.transactionId,
960
+ isDeleted: false,
961
+ ...(partial || {})
962
+ }
963
+ await storage.insertTxLabelMap(e)
964
+ return e
965
+ }
966
+
967
+ static async insertTestSyncState(storage: StorageProvider, u: table.User) {
968
+ const now = new Date()
969
+ const settings = await storage.getSettings()
970
+ const e: table.SyncState = {
971
+ created_at: now,
972
+ updated_at: now,
973
+ syncStateId: 0,
974
+ userId: u.userId,
975
+ storageIdentityKey: settings.storageIdentityKey,
976
+ storageName: settings.storageName,
977
+ status: 'unknown',
978
+ init: false,
979
+ refNum: randomBytesBase64(10),
980
+ syncMap: '{}'
981
+ }
982
+ await storage.insertSyncState(e)
983
+ return e
984
+ }
985
+
986
+ static async insertTestMonitorEvent(storage: StorageProvider) {
987
+ const now = new Date()
988
+ const e: table.MonitorEvent = {
989
+ created_at: now,
990
+ updated_at: now,
991
+ id: 0,
992
+ event: 'nothing much happened'
993
+ }
994
+ await storage.insertMonitorEvent(e)
995
+ return e
996
+ }
997
+
998
+ static async insertTestCommission(
999
+ storage: StorageProvider,
1000
+ t: table.Transaction
1001
+ ) {
1002
+ const now = new Date()
1003
+ const e: table.Commission = {
1004
+ created_at: now,
1005
+ updated_at: now,
1006
+ commissionId: 0,
1007
+ userId: t.userId,
1008
+ transactionId: t.transactionId,
1009
+ satoshis: 200,
1010
+ keyOffset: randomBytesBase64(32),
1011
+ isRedeemed: false,
1012
+ lockingScript: [1, 2, 3]
1013
+ }
1014
+ await storage.insertCommission(e)
1015
+ return e
1016
+ }
1017
+
1018
+ static async createTestSetup1(
1019
+ storage: StorageProvider,
1020
+ u1IdentityKey?: string
1021
+ ): Promise<TestSetup1> {
1022
+ const u1 = await _tu.insertTestUser(storage, u1IdentityKey)
1023
+ const u1basket1 = await _tu.insertTestOutputBasket(storage, u1)
1024
+ const u1basket2 = await _tu.insertTestOutputBasket(storage, u1)
1025
+ const u1label1 = await _tu.insertTestTxLabel(storage, u1)
1026
+ const u1label2 = await _tu.insertTestTxLabel(storage, u1)
1027
+ const u1tag1 = await _tu.insertTestOutputTag(storage, u1)
1028
+ const u1tag2 = await _tu.insertTestOutputTag(storage, u1)
1029
+ const { tx: u1tx1 } = await _tu.insertTestTransaction(storage, u1)
1030
+ const u1comm1 = await _tu.insertTestCommission(storage, u1tx1)
1031
+ const u1tx1label1 = await _tu.insertTestTxLabelMap(storage, u1tx1, u1label1)
1032
+ const u1tx1label2 = await _tu.insertTestTxLabelMap(storage, u1tx1, u1label2)
1033
+ const u1tx1o0 = await _tu.insertTestOutput(
1034
+ storage,
1035
+ u1tx1,
1036
+ 0,
1037
+ 101,
1038
+ u1basket1
1039
+ )
1040
+ const u1o0tag1 = await _tu.insertTestOutputTagMap(storage, u1tx1o0, u1tag1)
1041
+ const u1o0tag2 = await _tu.insertTestOutputTagMap(storage, u1tx1o0, u1tag2)
1042
+ const u1tx1o1 = await _tu.insertTestOutput(
1043
+ storage,
1044
+ u1tx1,
1045
+ 1,
1046
+ 111,
1047
+ u1basket2
1048
+ )
1049
+ const u1o1tag1 = await _tu.insertTestOutputTagMap(storage, u1tx1o1, u1tag1)
1050
+ const u1cert1 = await _tu.insertTestCertificate(storage, u1)
1051
+ const u1cert1field1 = await _tu.insertTestCertificateField(
1052
+ storage,
1053
+ u1cert1,
1054
+ 'bob',
1055
+ 'your uncle'
1056
+ )
1057
+ const u1cert1field2 = await _tu.insertTestCertificateField(
1058
+ storage,
1059
+ u1cert1,
1060
+ 'name',
1061
+ 'alice'
1062
+ )
1063
+ const u1cert2 = await _tu.insertTestCertificate(storage, u1)
1064
+ const u1cert2field1 = await _tu.insertTestCertificateField(
1065
+ storage,
1066
+ u1cert2,
1067
+ 'name',
1068
+ 'alice'
1069
+ )
1070
+ const u1cert3 = await _tu.insertTestCertificate(storage, u1)
1071
+ const u1sync1 = await _tu.insertTestSyncState(storage, u1)
1072
+
1073
+ const u2 = await _tu.insertTestUser(storage)
1074
+ const u2basket1 = await _tu.insertTestOutputBasket(storage, u2)
1075
+ const u2label1 = await _tu.insertTestTxLabel(storage, u2)
1076
+ const { tx: u2tx1 } = await _tu.insertTestTransaction(storage, u2, true)
1077
+ const u2comm1 = await _tu.insertTestCommission(storage, u2tx1)
1078
+ const u2tx1label1 = await _tu.insertTestTxLabelMap(storage, u2tx1, u2label1)
1079
+ const u2tx1o0 = await _tu.insertTestOutput(
1080
+ storage,
1081
+ u2tx1,
1082
+ 0,
1083
+ 101,
1084
+ u2basket1
1085
+ )
1086
+ const { tx: u2tx2 } = await _tu.insertTestTransaction(storage, u2, true)
1087
+ const u2comm2 = await _tu.insertTestCommission(storage, u2tx2)
1088
+
1089
+ const proven1 = await _tu.insertTestProvenTx(storage)
1090
+ const req1 = await _tu.insertTestProvenTxReq(
1091
+ storage,
1092
+ undefined,
1093
+ undefined,
1094
+ true
1095
+ )
1096
+ const req2 = await _tu.insertTestProvenTxReq(
1097
+ storage,
1098
+ proven1.txid,
1099
+ proven1.provenTxId
1100
+ )
1101
+
1102
+ const we1 = await _tu.insertTestMonitorEvent(storage)
1103
+ return {
1104
+ u1,
1105
+ u1basket1,
1106
+ u1basket2,
1107
+ u1label1,
1108
+ u1label2,
1109
+ u1tag1,
1110
+ u1tag2,
1111
+ u1tx1,
1112
+ u1comm1,
1113
+ u1tx1label1,
1114
+ u1tx1label2,
1115
+ u1tx1o0,
1116
+ u1o0tag1,
1117
+ u1o0tag2,
1118
+ u1tx1o1,
1119
+ u1o1tag1,
1120
+ u1cert1,
1121
+ u1cert1field1,
1122
+ u1cert1field2,
1123
+ u1cert2,
1124
+ u1cert2field1,
1125
+ u1cert3,
1126
+ u1sync1,
1127
+
1128
+ u2,
1129
+ u2basket1,
1130
+ u2label1,
1131
+ u2tx1,
1132
+ u2comm1,
1133
+ u2tx1label1,
1134
+ u2tx1o0,
1135
+ u2tx2,
1136
+ u2comm2,
1137
+
1138
+ proven1,
1139
+ req1,
1140
+ req2,
1141
+
1142
+ we1
1143
+ }
1144
+ }
1145
+
1146
+ static async createTestSetup2(
1147
+ storage: StorageProvider,
1148
+ u1IdentityKey: string,
1149
+ mockData: MockData = { actions: [] }
1150
+ ): Promise<TestSetup2> {
1151
+ if (!mockData || !mockData.actions) {
1152
+ throw new Error('mockData.actions is required')
1153
+ }
1154
+
1155
+ const now = new Date()
1156
+
1157
+ // loop through original mock data and generate correct table rows to comply with contraints(unique/foreign)
1158
+ // WIP working for simple case
1159
+ for (const action of mockData.actions) {
1160
+ const user = await _tu.insertTestUser(storage, u1IdentityKey)
1161
+ const { tx: transaction } = await _tu.insertTestTransaction(
1162
+ storage,
1163
+ user,
1164
+ false,
1165
+ {
1166
+ txid: action.txid,
1167
+ satoshis: action.satoshis,
1168
+ status: action.status as TransactionStatus,
1169
+ description: action.description,
1170
+ lockTime: action.lockTime,
1171
+ version: action.version
1172
+ }
1173
+ )
1174
+ if (action.labels) {
1175
+ for (const label of action.labels) {
1176
+ const l = await _tu.insertTestTxLabel(storage, user, {
1177
+ label,
1178
+ isDeleted: false,
1179
+ created_at: now,
1180
+ updated_at: now,
1181
+ txLabelId: 0,
1182
+ userId: user.userId
1183
+ })
1184
+ await _tu.insertTestTxLabelMap(storage, transaction, l)
1185
+ }
1186
+ }
1187
+ if (action.outputs) {
1188
+ for (const output of action.outputs) {
1189
+ const basket = await _tu.insertTestOutputBasket(storage, user, {
1190
+ name: output.basket
1191
+ })
1192
+ const insertedOutput = await _tu.insertTestOutput(
1193
+ storage,
1194
+ transaction,
1195
+ output.outputIndex,
1196
+ output.satoshis,
1197
+ basket,
1198
+ false,
1199
+ {
1200
+ outputDescription: output.outputDescription,
1201
+ spendable: output.spendable
1202
+ }
1203
+ )
1204
+ if (output.tags) {
1205
+ for (const tag of output.tags) {
1206
+ const outputTag = await _tu.insertTestOutputTag(storage, user, {
1207
+ tag
1208
+ })
1209
+ await _tu.insertTestOutputTagMap(
1210
+ storage,
1211
+ insertedOutput,
1212
+ outputTag
1213
+ )
1214
+ }
1215
+ }
1216
+ }
1217
+ }
1218
+ }
1219
+
1220
+ return {}
1221
+ }
1222
+
1223
+ static mockPostServicesAsSuccess(ctxs: TestWalletOnly[]): void {
1224
+ mockPostServices(ctxs, 'success')
1225
+ }
1226
+ static mockPostServicesAsError(ctxs: TestWalletOnly[]): void {
1227
+ mockPostServices(ctxs, 'error')
1228
+ }
1229
+ static mockPostServicesAsCallback(
1230
+ ctxs: TestWalletOnly[],
1231
+ callback: (beef: Beef, txids: string[]) => 'success' | 'error'
1232
+ ): void {
1233
+ mockPostServices(ctxs, 'error', callback)
1234
+ }
1235
+
1236
+ static mockMerklePathServicesAsCallback(
1237
+ ctxs: TestWalletOnly[],
1238
+ callback: (txid: string) => Promise<sdk.GetMerklePathResult>
1239
+ ): void {
1240
+ for (const { services } of ctxs) {
1241
+ services.getMerklePath = jest
1242
+ .fn()
1243
+ .mockImplementation(
1244
+ async (txid: string): Promise<sdk.GetMerklePathResult> => {
1245
+ const r = await callback(txid)
1246
+ return r
1247
+ }
1248
+ )
1249
+ }
1250
+ }
1251
+ }
1252
+
1253
+ export abstract class _tu extends TestUtilsWalletStorage {}
1254
+
1255
+ export interface TestSetup1 {
1256
+ u1: table.User
1257
+ u1basket1: table.OutputBasket
1258
+ u1basket2: table.OutputBasket
1259
+ u1label1: table.TxLabel
1260
+ u1label2: table.TxLabel
1261
+ u1tag1: table.OutputTag
1262
+ u1tag2: table.OutputTag
1263
+ u1tx1: table.Transaction
1264
+ u1comm1: table.Commission
1265
+ u1tx1label1: table.TxLabelMap
1266
+ u1tx1label2: table.TxLabelMap
1267
+ u1tx1o0: table.Output
1268
+ u1o0tag1: table.OutputTagMap
1269
+ u1o0tag2: table.OutputTagMap
1270
+ u1tx1o1: table.Output
1271
+ u1o1tag1: table.OutputTagMap
1272
+ u1cert1: table.Certificate
1273
+ u1cert1field1: table.CertificateField
1274
+ u1cert1field2: table.CertificateField
1275
+ u1cert2: table.Certificate
1276
+ u1cert2field1: table.CertificateField
1277
+ u1cert3: table.Certificate
1278
+ u1sync1: table.SyncState
1279
+
1280
+ u2: table.User
1281
+ u2basket1: table.OutputBasket
1282
+ u2label1: table.TxLabel
1283
+ u2tx1: table.Transaction
1284
+ u2comm1: table.Commission
1285
+ u2tx1label1: table.TxLabelMap
1286
+ u2tx1o0: table.Output
1287
+ u2tx2: table.Transaction
1288
+ u2comm2: table.Commission
1289
+
1290
+ proven1: table.ProvenTx
1291
+ req1: table.ProvenTxReq
1292
+ req2: table.ProvenTxReq
1293
+
1294
+ we1: table.MonitorEvent
1295
+ }
1296
+
1297
+ export interface MockData {
1298
+ inputs?: WalletActionInput[]
1299
+ outputs?: WalletActionOutput[]
1300
+ actions: WalletAction[]
1301
+ }
1302
+
1303
+ export interface TestSetup2 {}
1304
+
1305
+ export interface TestWallet<T> extends TestWalletOnly {
1306
+ activeStorage: StorageKnex
1307
+ setup?: T
1308
+ userId: number
1309
+
1310
+ rootKey: PrivateKey
1311
+ identityKey: string
1312
+ keyDeriver: KeyDeriver
1313
+ chain: sdk.Chain
1314
+ storage: WalletStorageManager
1315
+ services: Services
1316
+ monitor: Monitor
1317
+ wallet: Wallet
1318
+ }
1319
+
1320
+ export interface TestWalletOnly {
1321
+ rootKey: PrivateKey
1322
+ identityKey: string
1323
+ keyDeriver: KeyDeriver
1324
+ chain: sdk.Chain
1325
+ storage: WalletStorageManager
1326
+ services: Services
1327
+ monitor: Monitor
1328
+ wallet: Wallet
1329
+ }
1330
+
1331
+ async function insertEmptySetup(
1332
+ storage: StorageKnex,
1333
+ identityKey: string
1334
+ ): Promise<object> {
1335
+ return {}
1336
+ }
1337
+
1338
+ export type TestSetup1Wallet = TestWallet<TestSetup1>
1339
+ export type TestWalletNoSetup = TestWallet<{}>
1340
+
1341
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1342
+ export async function expectToThrowWERR<R>(
1343
+ expectedClass: new (...args: any[]) => any,
1344
+ fn: () => Promise<R>
1345
+ ): Promise<void> {
1346
+ try {
1347
+ await fn()
1348
+ } catch (eu: unknown) {
1349
+ const e = sdk.WalletError.fromUnknown(eu)
1350
+ if (e.name !== expectedClass.name || !e.isError)
1351
+ console.log(
1352
+ `Error name ${e.name} vs class name ${expectedClass.name}\n${e.stack}\n`
1353
+ )
1354
+ // The output above may help debugging this situation or put a breakpoint
1355
+ // on the line below and look at e.stack
1356
+ expect(e.name).toBe(expectedClass.name)
1357
+ expect(e.isError).toBe(true)
1358
+ return
1359
+ }
1360
+ throw new Error(`${expectedClass.name} was not thrown`)
1361
+ }
1362
+
1363
+ export type TestKeyPair = {
1364
+ privateKey: PrivateKey
1365
+ publicKey: PublicKey
1366
+ address: string
1367
+ }
1368
+
1369
+ function mockPostServices(
1370
+ ctxs: TestWalletOnly[],
1371
+ status: 'success' | 'error' = 'success',
1372
+ callback?: (beef: Beef, txids: string[]) => 'success' | 'error'
1373
+ ): void {
1374
+ for (const { services } of ctxs) {
1375
+ // Mock the services postBeef to avoid actually broadcasting new transactions.
1376
+ services.postBeef = jest
1377
+ .fn()
1378
+ .mockImplementation(
1379
+ (beef: Beef, txids: string[]): Promise<sdk.PostBeefResult[]> => {
1380
+ status = !callback ? status : callback(beef, txids)
1381
+ const r: sdk.PostBeefResult = {
1382
+ name: 'mock',
1383
+ status: 'success',
1384
+ txidResults: txids.map(txid => ({ txid, status }))
1385
+ }
1386
+ return Promise.resolve([r])
1387
+ }
1388
+ )
1389
+ services.postTxs = jest
1390
+ .fn()
1391
+ .mockImplementation(
1392
+ (beef: Beef, txids: string[]): Promise<sdk.PostBeefResult[]> => {
1393
+ const r: sdk.PostBeefResult = {
1394
+ name: 'mock',
1395
+ status: 'success',
1396
+ txidResults: txids.map(txid => ({ txid, status }))
1397
+ }
1398
+ return Promise.resolve([r])
1399
+ }
1400
+ )
1401
+ }
1402
+ }
1403
+
1404
+ // Declare logEnabled globally so it can be accessed anywhere in this file
1405
+ let logEnabled: boolean = false
1406
+
1407
+ /**
1408
+ * Centralized logging function to handle logging based on the `logEnabled` flag.
1409
+ *
1410
+ * @param {string} message - The main message to log.
1411
+ * @param {...any} optionalParams - Additional parameters to log (optional).
1412
+ * @returns {void} This function does not return any value.
1413
+ *
1414
+ * @example
1415
+ * log('Test message', someVariable);
1416
+ * log('Another message with multiple params', param1, param2);
1417
+ */
1418
+ export const log = (message: string, ...optionalParams: any[]): void => {
1419
+ if (logEnabled) {
1420
+ console.log(message, ...optionalParams)
1421
+ }
1422
+ }
1423
+
1424
+ /**
1425
+ * Updates a table dynamically based on key-value pairs in testValues.
1426
+ * @param {Function} updateFunction - The specific update function from storage.
1427
+ * @param {string | number} id - The ID or unique identifier of the record to update.
1428
+ * @param {Object} testValues - An object containing key-value pairs to update.
1429
+ */
1430
+ export const updateTable = async (updateFunction, id, testValues) => {
1431
+ for (const [key, value] of Object.entries(testValues)) {
1432
+ log('id=', id, '[key]=', [key], 'value=', value)
1433
+ await updateFunction(id, { [key]: value })
1434
+ }
1435
+ }
1436
+
1437
+ /**
1438
+ * Verifies that all key-value pairs in `testValues` match the corresponding keys in `targetObject`.
1439
+ * If a value is a Date, it validates the time using the `validateUpdateTime` function to ensure
1440
+ * it matches the expected time or is greater than a reference time.
1441
+ *
1442
+ * @param {Record<string, any>} targetObject - The object to verify values against.
1443
+ * @param {Record<string, any>} testValues - An object containing the expected key-value pairs.
1444
+ * @param {Date} referenceTime - A timestamp captured just before the updates, used for validating dates.
1445
+ *
1446
+ * @example
1447
+ * const targetObject = { key1: 'value1', created_at: new Date('2024-12-30T23:00:00Z') }
1448
+ * const testValues = { key1: 'value1', created_at: new Date('2024-12-30T23:00:00Z') }
1449
+ * const referenceTime = new Date()
1450
+ * verifyValues(targetObject, testValues, referenceTime)
1451
+ */
1452
+ export const verifyValues = (
1453
+ targetObject: Record<string, any>,
1454
+ testValues: Record<string, any>,
1455
+ referenceTime: Date
1456
+ ) => {
1457
+ Object.entries(testValues).forEach(([key, expectedValue]) => {
1458
+ const actualValue = targetObject[key]
1459
+
1460
+ if (expectedValue instanceof Date) {
1461
+ // Use `validateUpdateTime` for Date comparisons
1462
+ expect(
1463
+ validateUpdateTime(actualValue, expectedValue, referenceTime)
1464
+ ).toBe(true)
1465
+ } else {
1466
+ // Default to strict equality for other fields
1467
+ expect(actualValue).toStrictEqual(expectedValue)
1468
+ }
1469
+ })
1470
+ }
1471
+
1472
+ /**
1473
+ * Comparison function to validate update time.
1474
+ * Allows the time to match the expected update time or be greater than a reference time.
1475
+ * Validates across multiple formats with a tolerance for minor discrepancies.
1476
+ * @param {Date} actualTime - The `updated_at` time returned from the storage.
1477
+ * @param {Date} expectedTime - The time you tried to set.
1478
+ * @param {Date} referenceTime - A timestamp captured just before the update attempt.
1479
+ * @param {number} toleranceMs - Optional tolerance in milliseconds for discrepancies (default: 10ms).
1480
+ * @param {boolean} [ logEnabled=false ] - A flag to enable or disable logging for this error.
1481
+
1482
+ * @returns {boolean} - Returns `true` if the validation passes; `false` otherwise.
1483
+ * Logs human-readable details if the validation fails.
1484
+ */
1485
+ export const validateUpdateTime = (
1486
+ actualTime: Date,
1487
+ expectedTime: Date,
1488
+ referenceTime: Date,
1489
+ toleranceMs: number = 10,
1490
+ logEnabled: boolean = false
1491
+ ): boolean => {
1492
+ const actualTimestamp = actualTime.getTime()
1493
+ const expectedTimestamp = expectedTime.getTime()
1494
+ const referenceTimestamp = referenceTime.getTime()
1495
+
1496
+ if (logEnabled) {
1497
+ log(
1498
+ `Validation inputs:\n`,
1499
+ `Actual Time: ${actualTime.toISOString()} (Timestamp: ${actualTimestamp})\n`,
1500
+ `Expected Time: ${expectedTime.toISOString()} (Timestamp: ${expectedTimestamp})\n`,
1501
+ `Reference Time: ${referenceTime.toISOString()} (Timestamp: ${referenceTimestamp})`
1502
+ )
1503
+ }
1504
+ const isWithinTolerance =
1505
+ Math.abs(actualTimestamp - expectedTimestamp) <= toleranceMs
1506
+ const isGreaterThanReference = actualTimestamp > referenceTimestamp
1507
+ const isoMatch = actualTime.toISOString() === expectedTime.toISOString()
1508
+ const utcMatch = actualTime.toUTCString() === expectedTime.toUTCString()
1509
+ const humanReadableMatch =
1510
+ actualTime.toDateString() === expectedTime.toDateString()
1511
+
1512
+ // Updated: Allow test to pass if the difference is too large to fail
1513
+ if (
1514
+ !isWithinTolerance &&
1515
+ Math.abs(actualTimestamp - expectedTimestamp) > 100000000
1516
+ ) {
1517
+ if (logEnabled) {
1518
+ log(
1519
+ `Skipping validation failure: The difference is unusually large (${Math.abs(actualTimestamp - expectedTimestamp)}ms). Validation passed for extreme outliers.`
1520
+ )
1521
+ }
1522
+ return true
1523
+ }
1524
+
1525
+ const isValid =
1526
+ isWithinTolerance ||
1527
+ isGreaterThanReference ||
1528
+ isoMatch ||
1529
+ utcMatch ||
1530
+ humanReadableMatch
1531
+
1532
+ if (!isValid) {
1533
+ console.error(
1534
+ `Validation failed:\n`,
1535
+ `Actual Time: ${actualTime.toISOString()} (Timestamp: ${actualTimestamp})\n`,
1536
+ `Expected Time: ${expectedTime.toISOString()} (Timestamp: ${expectedTimestamp})\n`,
1537
+ `Reference Time: ${referenceTime.toISOString()} (Timestamp: ${referenceTimestamp})\n`,
1538
+ `Tolerance: ±${toleranceMs}ms\n`,
1539
+ `Within Tolerance: ${isWithinTolerance}\n`,
1540
+ `Greater Than Reference: ${isGreaterThanReference}\n`,
1541
+ `ISO Match: ${isoMatch}\n`,
1542
+ `UTC Match: ${utcMatch}\n`,
1543
+ `Human-Readable Match: ${humanReadableMatch}`
1544
+ )
1545
+ } else {
1546
+ if (logEnabled) {
1547
+ log(
1548
+ `Validation succeeded:\n`,
1549
+ `Actual Time: ${actualTime.toISOString()} (Timestamp: ${actualTimestamp})`
1550
+ )
1551
+ }
1552
+ }
1553
+
1554
+ return isValid
1555
+ }
1556
+
1557
+ /**
1558
+ * Set whether logging should be enabled or disabled globally.
1559
+ *
1560
+ * @param {boolean} enabled - A flag to enable or disable logging.
1561
+ * `true` enables logging, `false` disables logging.
1562
+ *
1563
+ * @returns {void} This function does not return any value.
1564
+ *
1565
+ * @example
1566
+ * setLogging(true); // Enable logging
1567
+ * setLogging(false); // Disable logging
1568
+ */
1569
+ export const setLogging = (enabled: boolean): void => {
1570
+ logEnabled = enabled
1571
+ }
1572
+
1573
+ /**
1574
+ * Logs the unique constraint error for multiple fields.
1575
+ *
1576
+ * @param {any} error - The error object that contains the error message.
1577
+ * @param {string} tableName - The name of the table where the constraint was violated.
1578
+ * @param {string[]} columnNames - An array of column names for which to check the unique constraint.
1579
+ * @param {boolean} logEnabled - A flag to enable or disable logging.
1580
+ */
1581
+ export const logUniqueConstraintError = (
1582
+ error: any,
1583
+ tableName: string,
1584
+ columnNames: string[],
1585
+ logEnabled: boolean = false
1586
+ ): void => {
1587
+ if (logEnabled) {
1588
+ // Construct the expected error message string with the table name prefixed to each column
1589
+ const expectedErrorString = `SQLITE_CONSTRAINT: UNIQUE constraint failed: ${columnNames.map(col => `${tableName}.${col}`).join(', ')}`
1590
+
1591
+ log('expectedErrorString=', expectedErrorString)
1592
+
1593
+ // Check if the error message contains the expected string
1594
+ if (error.message.includes(expectedErrorString)) {
1595
+ console.log(
1596
+ `Unique constraint error for columns ${columnNames.join(', ')} caught as expected:`,
1597
+ error.message
1598
+ )
1599
+ } else {
1600
+ console.log('Unexpected error message:', error.message)
1601
+ }
1602
+ }
1603
+
1604
+ // If the error doesn't match the expected unique constraint error message, throw it
1605
+ if (
1606
+ !error.message.includes(
1607
+ `SQLITE_CONSTRAINT: UNIQUE constraint failed: ${columnNames.map(col => `${tableName}.${col}`).join(', ')}`
1608
+ )
1609
+ ) {
1610
+ console.log('Unexpected error:', error.message)
1611
+ throw new Error(`Unexpected error: ${error.message}`)
1612
+ }
1613
+ }
1614
+
1615
+ /**
1616
+ * Logs an error based on the specific foreign constraint failure or unexpected error.
1617
+ *
1618
+ * @param {any} error - The error object that contains the error message.
1619
+ * @param {string} tableName - The name of the table where the constraint is applied.
1620
+ * @param {string} columnName - The name of the column in which the unique constraint is being violated.
1621
+ * @param {boolean} [ logEnabled=false ] - A flag to enable or disable logging for this error.
1622
+ *
1623
+ * @returns {void} This function does not return any value. It logs the error to the console.
1624
+ *
1625
+ * @example logForeignConstraintError(error, 'proven_tx_reqs', 'provenTxReqId', logEnabled)
1626
+ */
1627
+ const logForeignConstraintError = (
1628
+ error: any,
1629
+ tableName: string,
1630
+ columnName: string,
1631
+ logEnabled: boolean = false
1632
+ ): void => {
1633
+ if (logEnabled) {
1634
+ if (
1635
+ error.message.includes(`SQLITE_CONSTRAINT: FOREIGN KEY constraint failed`)
1636
+ ) {
1637
+ log(`${columnName} constraint error caught as expected:`, error.message)
1638
+ } else {
1639
+ log('Unexpected error:', error.message)
1640
+ throw new Error(`Unexpected error: ${error.message}`)
1641
+ }
1642
+ }
1643
+ }
1644
+
1645
+ /**
1646
+ * Triggers a unique constraint error by attempting to update a row with a value that violates a unique constraint.
1647
+ *
1648
+ * @param {any} storage - The storage object, typically containing the database methods for performing CRUD operations.
1649
+ * @param {string} findMethod - The method name for finding rows in the table (e.g., `findProvenTxReqs`).
1650
+ * @param {string} updateMethod - The method name for updating rows in the table (e.g., `updateProvenTxReq`).
1651
+ * @param {string} tableName - The name of the table being updated.
1652
+ * @param {string} columnName - The column name for which the unique constraint is being tested.
1653
+ * @param {any} invalidValue - The value to assign to the column that should trigger the unique constraint error. This should be an object with the column name(s) as the key(s).
1654
+ * @param {number} [id=1] - The id used to set the column value during the test (default is 1).
1655
+ * @param {boolean} [ logEnabled=false ] - A flag to enable or disable logging during the test. Default is `true` (logging enabled).
1656
+ *
1657
+ * @returns {Promise<boolean>} This function returns true if error thrown otherwise false, it performs an async operation to test the unique constraint error.
1658
+ *
1659
+ * @throws {Error} Throws an error if the unique constraint error is not triggered or if the table has insufficient rows.
1660
+ *
1661
+ * @example await triggerUniqueConstraintError(storage, 'ProvenTxReq', 'proven_tx_reqs', 'provenTxReqId', { provenTxReqId: 42 }, 1, true)
1662
+ */
1663
+ export const triggerUniqueConstraintError = async (
1664
+ storage: any,
1665
+ findMethod: string,
1666
+ updateMethod: string,
1667
+ tableName: string,
1668
+ columnName: string,
1669
+ invalidValue: any, // This remains an object passed in by the caller
1670
+ id: number = 1,
1671
+ logEnabled: boolean = false
1672
+ ): Promise<boolean> => {
1673
+ setLogging(logEnabled)
1674
+
1675
+ const rows = await storage[findMethod]({})
1676
+ if (logEnabled) {
1677
+ log('rows=', rows)
1678
+ }
1679
+
1680
+ if (!rows || rows.length < 2) {
1681
+ throw new Error(
1682
+ `Expected at least two rows in the table "${tableName}", but found only ${rows.length}. Please add more rows for the test.`
1683
+ )
1684
+ }
1685
+
1686
+ if (!(columnName in rows[0])) {
1687
+ throw new Error(
1688
+ `Column "${columnName}" does not exist in the table "${tableName}".`
1689
+ )
1690
+ }
1691
+
1692
+ if (id === invalidValue[columnName]) {
1693
+ throw new Error(
1694
+ `Failed to update "${columnName}" in the table "${tableName}" as id ${id} is same as update value ${invalidValue[columnName]}".`
1695
+ )
1696
+ }
1697
+
1698
+ if (logEnabled) {
1699
+ log('invalidValue=', invalidValue)
1700
+ }
1701
+
1702
+ // Create columnNames from invalidValue keys before the update
1703
+ const columnNames = Object.keys(invalidValue)
1704
+
1705
+ try {
1706
+ if (logEnabled) {
1707
+ log('update id=', id)
1708
+ }
1709
+
1710
+ // Attempt the update with the new value that should trigger the constraint error
1711
+ await storage[updateMethod](id, invalidValue)
1712
+ return false
1713
+ } catch (error: any) {
1714
+ // Handle the error by passing columnNames for validation in logUniqueConstraintError
1715
+ logUniqueConstraintError(error, tableName, columnNames, logEnabled)
1716
+ return true
1717
+ }
1718
+ }
1719
+
1720
+ /**
1721
+ * Tests that the foreign key constraint error is triggered for any table and column.
1722
+ *
1723
+ * @param {any} storage - The storage object with the database methods for performing CRUD operations.
1724
+ * @param {string} findMethod - The method name for finding rows in the table (e.g., `findProvenTxReqs`).
1725
+ * @param {string} updateMethod - The method name for updating rows in the table (e.g., `updateProvenTxReq`).
1726
+ * @param {string} tableName - The name of the table being updated.
1727
+ * @param {string} columnName - The column name being tested for the foreign key constraint.
1728
+ * @param {any} invalidValue - The value to assign to the column that should trigger the foreign key constraint error. This should be an object with the column name as the key.
1729
+ * @param {number} [id=1] - The id used to set the column value during the test (default is 1).
1730
+ * @param {boolean} [ logEnabled=false ] - A flag to enable or disable logging during the test. Default is `true` (logging enabled).
1731
+ *
1732
+ * @returns {Promise<boolean>} This function returns true if error thrown otherwise false, it performs an async operation to test the foreign key constraint error.
1733
+ *
1734
+ * @throws {Error} Throws an error if the foreign key constraint error is not triggered.
1735
+ *
1736
+ * @example await triggerForeignKeyConstraintError(storage, 'findProvenTxReqs', 'updateProvenTxReq', 'proven_tx_reqs', 'provenTxId', { provenTxId: 42 })
1737
+ */
1738
+ export const triggerForeignKeyConstraintError = async (
1739
+ storage: any,
1740
+ findMethod: string,
1741
+ updateMethod: string,
1742
+ tableName: string,
1743
+ columnName: string,
1744
+ invalidValue: any,
1745
+ id: number = 1,
1746
+ logEnabled: boolean = false
1747
+ ): Promise<boolean> => {
1748
+ // Set logging state based on the argument
1749
+ setLogging(logEnabled)
1750
+
1751
+ // Dynamically fetch rows using the correct method (findMethod)
1752
+ const rows = await storage[findMethod]({})
1753
+
1754
+ if (!rows || rows.length < 2) {
1755
+ throw new Error(
1756
+ `Expected at least two rows in the table "${tableName}", but found only ${rows.length}. Please add more rows for the test.`
1757
+ )
1758
+ }
1759
+
1760
+ if (!(columnName in rows[0])) {
1761
+ throw new Error(
1762
+ `Column "${columnName}" does not exist in the table "${tableName}".`
1763
+ )
1764
+ }
1765
+
1766
+ if (id === invalidValue[columnName]) {
1767
+ throw new Error(
1768
+ `Failed to update "${columnName}" in the table "${tableName}" as id ${id} is same as update value ${invalidValue[columnName]}".`
1769
+ )
1770
+ }
1771
+
1772
+ // TBD See what types need to be passed in before raising errors
1773
+
1774
+ try {
1775
+ // Attempt the update with the invalid value that should trigger the foreign key constraint error
1776
+ const r = await storage[updateMethod](id, invalidValue) // Pass the object with the column name and value
1777
+ log('r=', r)
1778
+ return false
1779
+ } catch (error: any) {
1780
+ logForeignConstraintError(error, tableName, columnName, logEnabled)
1781
+ return true
1782
+ }
1783
+ }
1784
+
1785
+ /**
1786
+ * Aborts all transactions with a specific status in the storage and asserts they are aborted.
1787
+ *
1788
+ * @param {Wallet} wallet - The wallet instance used to abort actions.
1789
+ * @param {StorageKnex} storage - The storage instance to query transactions from.
1790
+ * @param {sdk.TransactionStatus} status - The transaction status used to filter transactions.
1791
+ * @returns {Promise<boolean>} - Resolves to `true` if all matching transactions were successfully aborted.
1792
+ */
1793
+ async function cleanTransactionsUsingAbort(
1794
+ wallet: Wallet,
1795
+ storage: StorageKnex,
1796
+ status: sdk.TransactionStatus
1797
+ ): Promise<boolean> {
1798
+ const transactions = await storage.findTransactions({ partial: { status } })
1799
+
1800
+ await Promise.all(
1801
+ transactions.map(async transaction => {
1802
+ const result = await wallet.abortAction({
1803
+ reference: transaction.reference
1804
+ })
1805
+ expect(result.aborted).toBe(true)
1806
+ })
1807
+ )
1808
+
1809
+ return true
1810
+ }
1811
+
1812
+ /**
1813
+ * Aborts all transactions with the status `'nosend'` in the storage and verifies success.
1814
+ *
1815
+ * @param {Wallet} wallet - The wallet instance used to abort actions.
1816
+ * @param {StorageKnex} storage - The storage instance to query transactions from.
1817
+ * @returns {Promise<boolean>} - Resolves to `true` if all `'nosend'` transactions were successfully aborted.
1818
+ */
1819
+ export async function cleanUnsentTransactionsUsingAbort(
1820
+ wallet: Wallet,
1821
+ storage: StorageKnex
1822
+ ): Promise<boolean> {
1823
+ const result = await cleanTransactionsUsingAbort(wallet, storage, 'nosend')
1824
+ expect(result).toBe(true)
1825
+ return result
1826
+ }
1827
+
1828
+ /**
1829
+ * Aborts all transactions with the status `'unsigned'` in the storage and verifies success.
1830
+ *
1831
+ * @param {Wallet} wallet - The wallet instance used to abort actions.
1832
+ * @param {StorageKnex} storage - The storage instance to query transactions from.
1833
+ * @returns {Promise<boolean>} - Resolves to `true` if all `'unsigned'` transactions were successfully aborted.
1834
+ */
1835
+ export async function cleanUnsignedTransactionsUsingAbort(
1836
+ wallet: Wallet,
1837
+ storage: StorageKnex
1838
+ ): Promise<boolean> {
1839
+ const result = await cleanTransactionsUsingAbort(wallet, storage, 'unsigned')
1840
+ expect(result).toBe(true)
1841
+ return result
1842
+ }
1843
+
1844
+ /**
1845
+ * Aborts all transactions with the status `'unprocessed'` in the storage and verifies success.
1846
+ *
1847
+ * @param {Wallet} wallet - The wallet instance used to abort actions.
1848
+ * @param {StorageKnex} storage - The storage instance to query transactions from.
1849
+ * @returns {Promise<boolean>} - Resolves to `true` if all `'unprocessed'` transactions were successfully aborted.
1850
+ */
1851
+ export async function cleanUnprocessedTransactionsUsingAbort(
1852
+ wallet: Wallet,
1853
+ storage: StorageKnex
1854
+ ): Promise<boolean> {
1855
+ const result = await cleanTransactionsUsingAbort(
1856
+ wallet,
1857
+ storage,
1858
+ 'unprocessed'
1859
+ )
1860
+ expect(result).toBe(true)
1861
+ return result
1862
+ }
1863
+ /**
1864
+ * Normalize a date or ISO string to a consistent ISO string format.
1865
+ * @param value - The value to normalize (Date object or ISO string).
1866
+ * @returns ISO string or null if not a date-like value.
1867
+ */
1868
+ export const normalizeDate = (value: any): string | null => {
1869
+ if (value instanceof Date) {
1870
+ return value.toISOString()
1871
+ } else if (typeof value === 'string' && !isNaN(Date.parse(value))) {
1872
+ return new Date(value).toISOString()
1873
+ }
1874
+ return null
1875
+ }
1876
+
1877
+ export async function logTransaction(
1878
+ storage: StorageKnex,
1879
+ txid: HexString
1880
+ ): Promise<string> {
1881
+ let amount: SatoshiValue = 0
1882
+ let log = `txid: ${txid}\n`
1883
+ const rt = await storage.findTransactions({ partial: { txid } })
1884
+ for (const t of rt) {
1885
+ log += `status: ${t.status}\n`
1886
+ log += `description: ${t.description}\n`
1887
+ const ro = await storage.findOutputs({
1888
+ partial: { transactionId: t.transactionId }
1889
+ })
1890
+ for (const o of ro) {
1891
+ log += `${await logOutput(storage, o)}`
1892
+ amount += o.spendable ? o.satoshis : 0
1893
+ }
1894
+ }
1895
+ log += `------------------\namount: ${amount}\n`
1896
+ return log
1897
+ }
1898
+
1899
+ export async function logOutput(
1900
+ storage: StorageKnex,
1901
+ output: table.Output
1902
+ ): Promise<string> {
1903
+ let log = `satoshis: ${output.satoshis}\n`
1904
+ log += `spendable: ${output.spendable}\n`
1905
+ log += `change: ${output.change}\n`
1906
+ log += `providedBy: ${output.providedBy}\n`
1907
+ log += `spentBy: ${output.providedBy}\n`
1908
+ if (output.basketId) {
1909
+ const rb = await storage.findOutputBaskets({
1910
+ partial: { basketId: output.basketId }
1911
+ })
1912
+ log += `basket:${await logBasket(storage, rb[0])}\n`
1913
+ }
1914
+ return log
1915
+ }
1916
+
1917
+ export function logBasket(
1918
+ storage: StorageKnex,
1919
+ basket: table.OutputBasket
1920
+ ): string {
1921
+ let log = `${basket.name}\n`
1922
+ return log
1923
+ }