@bopen-io/wallet-toolbox 1.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.template +22 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  4. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  5. package/.github/pull_request_template.md +22 -0
  6. package/.github/workflows/push.yaml +145 -0
  7. package/.prettierrc +10 -0
  8. package/CHANGELOG.md +280 -0
  9. package/CONTRIBUTING.md +89 -0
  10. package/README.md +43 -0
  11. package/docs/README.md +85 -0
  12. package/docs/client.md +19627 -0
  13. package/docs/monitor.md +953 -0
  14. package/docs/open-rpc/index.html +46 -0
  15. package/docs/services.md +6377 -0
  16. package/docs/setup.md +1268 -0
  17. package/docs/storage.md +5367 -0
  18. package/docs/wallet.md +19626 -0
  19. package/jest.config.ts +25 -0
  20. package/license.md +28 -0
  21. package/out/tsconfig.all.tsbuildinfo +1 -0
  22. package/package.json +63 -0
  23. package/src/CWIStyleWalletManager.ts +1999 -0
  24. package/src/Setup.ts +579 -0
  25. package/src/SetupClient.ts +322 -0
  26. package/src/SetupWallet.ts +108 -0
  27. package/src/SimpleWalletManager.ts +526 -0
  28. package/src/Wallet.ts +1169 -0
  29. package/src/WalletAuthenticationManager.ts +153 -0
  30. package/src/WalletLogger.ts +213 -0
  31. package/src/WalletPermissionsManager.ts +3660 -0
  32. package/src/WalletSettingsManager.ts +114 -0
  33. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  34. package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
  36. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  37. package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
  38. package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
  39. package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
  40. package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
  41. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  42. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
  43. package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
  44. package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
  45. package/src/index.all.ts +27 -0
  46. package/src/index.client.ts +25 -0
  47. package/src/index.mobile.ts +21 -0
  48. package/src/index.ts +1 -0
  49. package/src/monitor/Monitor.ts +412 -0
  50. package/src/monitor/MonitorDaemon.ts +188 -0
  51. package/src/monitor/README.md +3 -0
  52. package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
  53. package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
  54. package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
  55. package/src/monitor/tasks/TaskClock.ts +33 -0
  56. package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
  57. package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
  58. package/src/monitor/tasks/TaskNewHeader.ts +93 -0
  59. package/src/monitor/tasks/TaskPurge.ts +68 -0
  60. package/src/monitor/tasks/TaskReorg.ts +89 -0
  61. package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
  62. package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
  63. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  64. package/src/monitor/tasks/TaskUnFail.ts +151 -0
  65. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  66. package/src/sdk/CertOpsWallet.ts +18 -0
  67. package/src/sdk/PrivilegedKeyManager.ts +372 -0
  68. package/src/sdk/README.md +13 -0
  69. package/src/sdk/WERR_errors.ts +234 -0
  70. package/src/sdk/WalletError.ts +170 -0
  71. package/src/sdk/WalletErrorFromJson.ts +80 -0
  72. package/src/sdk/WalletServices.interfaces.ts +700 -0
  73. package/src/sdk/WalletSigner.interfaces.ts +11 -0
  74. package/src/sdk/WalletStorage.interfaces.ts +606 -0
  75. package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
  76. package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
  77. package/src/sdk/__test/WalletError.test.ts +318 -0
  78. package/src/sdk/__test/validationHelpers.test.ts +21 -0
  79. package/src/sdk/index.ts +10 -0
  80. package/src/sdk/types.ts +226 -0
  81. package/src/services/README.md +11 -0
  82. package/src/services/ServiceCollection.ts +248 -0
  83. package/src/services/Services.ts +603 -0
  84. package/src/services/__tests/ARC.man.test.ts +123 -0
  85. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  86. package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
  87. package/src/services/__tests/arcServices.test.ts +8 -0
  88. package/src/services/__tests/bitrails.test.ts +56 -0
  89. package/src/services/__tests/getMerklePath.test.ts +15 -0
  90. package/src/services/__tests/getRawTx.test.ts +13 -0
  91. package/src/services/__tests/postBeef.test.ts +104 -0
  92. package/src/services/__tests/verifyBeef.test.ts +50 -0
  93. package/src/services/chaintracker/BHServiceClient.ts +212 -0
  94. package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
  95. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
  96. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
  97. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
  98. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
  99. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
  100. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
  101. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
  102. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
  103. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
  104. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
  105. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
  106. package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
  107. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
  108. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
  109. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
  110. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
  111. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
  112. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
  113. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
  114. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
  115. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
  116. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
  117. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
  118. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
  119. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
  120. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
  121. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
  122. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
  123. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
  124. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
  125. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
  126. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
  127. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
  128. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
  129. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
  130. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  131. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
  132. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
  133. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
  134. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
  135. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
  136. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
  137. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  138. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  139. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  140. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  141. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
  142. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  143. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  144. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  145. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  146. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
  147. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  148. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  149. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  150. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  151. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
  152. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  153. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  154. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  155. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  156. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  157. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
  158. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  159. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  160. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  161. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  162. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  163. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  164. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
  165. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
  166. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
  167. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  168. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  169. package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
  170. package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
  171. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  172. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
  173. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
  174. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
  175. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
  176. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
  177. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
  178. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
  179. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
  180. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
  181. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
  182. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
  183. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
  184. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
  185. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
  186. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
  187. package/src/services/chaintracker/index.all.ts +4 -0
  188. package/src/services/chaintracker/index.client.ts +4 -0
  189. package/src/services/chaintracker/index.mobile.ts +4 -0
  190. package/src/services/createDefaultWalletServicesOptions.ts +77 -0
  191. package/src/services/index.ts +1 -0
  192. package/src/services/processingErrors/arcSuccessError.json +76 -0
  193. package/src/services/providers/ARC.ts +350 -0
  194. package/src/services/providers/Bitails.ts +256 -0
  195. package/src/services/providers/SdkWhatsOnChain.ts +83 -0
  196. package/src/services/providers/WhatsOnChain.ts +883 -0
  197. package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
  198. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  199. package/src/services/providers/exchangeRates.ts +265 -0
  200. package/src/services/providers/getBeefForTxid.ts +369 -0
  201. package/src/signer/README.md +5 -0
  202. package/src/signer/WalletSigner.ts +17 -0
  203. package/src/signer/methods/acquireDirectCertificate.ts +52 -0
  204. package/src/signer/methods/buildSignableTransaction.ts +183 -0
  205. package/src/signer/methods/completeSignedTransaction.ts +117 -0
  206. package/src/signer/methods/createAction.ts +172 -0
  207. package/src/signer/methods/internalizeAction.ts +106 -0
  208. package/src/signer/methods/proveCertificate.ts +43 -0
  209. package/src/signer/methods/signAction.ts +54 -0
  210. package/src/storage/README.md +14 -0
  211. package/src/storage/StorageIdb.ts +2304 -0
  212. package/src/storage/StorageKnex.ts +1425 -0
  213. package/src/storage/StorageProvider.ts +810 -0
  214. package/src/storage/StorageReader.ts +194 -0
  215. package/src/storage/StorageReaderWriter.ts +432 -0
  216. package/src/storage/StorageSyncReader.ts +34 -0
  217. package/src/storage/WalletStorageManager.ts +943 -0
  218. package/src/storage/__test/StorageIdb.test.ts +43 -0
  219. package/src/storage/__test/WalletStorageManager.test.ts +275 -0
  220. package/src/storage/__test/adminStats.man.test.ts +89 -0
  221. package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
  222. package/src/storage/index.all.ts +11 -0
  223. package/src/storage/index.client.ts +7 -0
  224. package/src/storage/index.mobile.ts +6 -0
  225. package/src/storage/methods/ListActionsSpecOp.ts +70 -0
  226. package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
  227. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
  228. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
  229. package/src/storage/methods/__test/offsetKey.test.ts +274 -0
  230. package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
  231. package/src/storage/methods/createAction.ts +947 -0
  232. package/src/storage/methods/generateChange.ts +556 -0
  233. package/src/storage/methods/getBeefForTransaction.ts +139 -0
  234. package/src/storage/methods/getSyncChunk.ts +293 -0
  235. package/src/storage/methods/internalizeAction.ts +562 -0
  236. package/src/storage/methods/listActionsIdb.ts +183 -0
  237. package/src/storage/methods/listActionsKnex.ts +226 -0
  238. package/src/storage/methods/listCertificates.ts +73 -0
  239. package/src/storage/methods/listOutputsIdb.ts +203 -0
  240. package/src/storage/methods/listOutputsKnex.ts +263 -0
  241. package/src/storage/methods/offsetKey.ts +89 -0
  242. package/src/storage/methods/processAction.ts +420 -0
  243. package/src/storage/methods/purgeData.ts +251 -0
  244. package/src/storage/methods/purgeDataIdb.ts +10 -0
  245. package/src/storage/methods/reviewStatus.ts +101 -0
  246. package/src/storage/methods/reviewStatusIdb.ts +43 -0
  247. package/src/storage/methods/utils.Buffer.ts +33 -0
  248. package/src/storage/methods/utils.ts +56 -0
  249. package/src/storage/remoting/StorageClient.ts +567 -0
  250. package/src/storage/remoting/StorageMobile.ts +544 -0
  251. package/src/storage/remoting/StorageServer.ts +291 -0
  252. package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
  253. package/src/storage/schema/KnexMigrations.ts +489 -0
  254. package/src/storage/schema/StorageIdbSchema.ts +150 -0
  255. package/src/storage/schema/entities/EntityBase.ts +210 -0
  256. package/src/storage/schema/entities/EntityCertificate.ts +188 -0
  257. package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
  258. package/src/storage/schema/entities/EntityCommission.ts +148 -0
  259. package/src/storage/schema/entities/EntityOutput.ts +290 -0
  260. package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
  261. package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
  262. package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
  263. package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
  264. package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
  265. package/src/storage/schema/entities/EntitySyncState.ts +389 -0
  266. package/src/storage/schema/entities/EntityTransaction.ts +306 -0
  267. package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
  268. package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
  269. package/src/storage/schema/entities/EntityUser.ts +112 -0
  270. package/src/storage/schema/entities/MergeEntity.ts +73 -0
  271. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
  272. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
  273. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
  274. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
  275. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
  276. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
  277. package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
  278. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
  279. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
  280. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
  281. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
  282. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
  283. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
  284. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
  285. package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
  286. package/src/storage/schema/entities/index.ts +16 -0
  287. package/src/storage/schema/tables/TableCertificate.ts +21 -0
  288. package/src/storage/schema/tables/TableCertificateField.ts +12 -0
  289. package/src/storage/schema/tables/TableCommission.ts +13 -0
  290. package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
  291. package/src/storage/schema/tables/TableOutput.ts +64 -0
  292. package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
  293. package/src/storage/schema/tables/TableOutputTag.ts +10 -0
  294. package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
  295. package/src/storage/schema/tables/TableProvenTx.ts +14 -0
  296. package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
  297. package/src/storage/schema/tables/TableSettings.ts +17 -0
  298. package/src/storage/schema/tables/TableSyncState.ts +18 -0
  299. package/src/storage/schema/tables/TableTransaction.ts +54 -0
  300. package/src/storage/schema/tables/TableTxLabel.ts +10 -0
  301. package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
  302. package/src/storage/schema/tables/TableUser.ts +16 -0
  303. package/src/storage/schema/tables/index.ts +16 -0
  304. package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
  305. package/src/storage/sync/index.ts +1 -0
  306. package/src/utility/Format.ts +133 -0
  307. package/src/utility/README.md +3 -0
  308. package/src/utility/ReaderUint8Array.ts +187 -0
  309. package/src/utility/ScriptTemplateBRC29.ts +73 -0
  310. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
  311. package/src/utility/aggregateResults.ts +68 -0
  312. package/src/utility/identityUtils.ts +159 -0
  313. package/src/utility/index.all.ts +7 -0
  314. package/src/utility/index.client.ts +7 -0
  315. package/src/utility/parseTxScriptOffsets.ts +29 -0
  316. package/src/utility/stampLog.ts +69 -0
  317. package/src/utility/tscProofToMerklePath.ts +48 -0
  318. package/src/utility/utilityHelpers.buffer.ts +34 -0
  319. package/src/utility/utilityHelpers.noBuffer.ts +60 -0
  320. package/src/utility/utilityHelpers.ts +275 -0
  321. package/src/wab-client/WABClient.ts +94 -0
  322. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  323. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  324. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
  325. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  326. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  327. package/syncVersions.js +71 -0
  328. package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
  329. package/test/Wallet/action/abortAction.test.ts +47 -0
  330. package/test/Wallet/action/createAction.test.ts +299 -0
  331. package/test/Wallet/action/createAction2.test.ts +1273 -0
  332. package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
  333. package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
  334. package/test/Wallet/action/internalizeAction.test.ts +682 -0
  335. package/test/Wallet/action/relinquishOutput.test.ts +37 -0
  336. package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
  337. package/test/Wallet/certificate/listCertificates.test.ts +346 -0
  338. package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
  339. package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
  340. package/test/Wallet/get/getHeight.test.ts +52 -0
  341. package/test/Wallet/get/getKnownTxids.test.ts +86 -0
  342. package/test/Wallet/get/getNetwork.test.ts +27 -0
  343. package/test/Wallet/get/getVersion.test.ts +27 -0
  344. package/test/Wallet/list/listActions.test.ts +279 -0
  345. package/test/Wallet/list/listActions2.test.ts +1381 -0
  346. package/test/Wallet/list/listCertificates.test.ts +118 -0
  347. package/test/Wallet/list/listOutputs.test.ts +447 -0
  348. package/test/Wallet/live/walletLive.man.test.ts +521 -0
  349. package/test/Wallet/local/localWallet.man.test.ts +93 -0
  350. package/test/Wallet/local/localWallet2.man.test.ts +277 -0
  351. package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
  352. package/test/Wallet/specOps/specOps.man.test.ts +220 -0
  353. package/test/Wallet/support/janitor.man.test.ts +40 -0
  354. package/test/Wallet/support/operations.man.test.ts +407 -0
  355. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
  356. package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
  357. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
  358. package/test/Wallet/sync/setActive.test.ts +170 -0
  359. package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
  360. package/test/WalletClient/WERR.man.test.ts +35 -0
  361. package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
  362. package/test/checkDB.ts +57 -0
  363. package/test/checkdb +0 -0
  364. package/test/examples/backup.man.test.ts +59 -0
  365. package/test/examples/pushdrop.test.ts +282 -0
  366. package/test/monitor/Monitor.test.ts +620 -0
  367. package/test/services/Services.test.ts +263 -0
  368. package/test/storage/KnexMigrations.test.ts +86 -0
  369. package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
  370. package/test/storage/count.test.ts +177 -0
  371. package/test/storage/find.test.ts +195 -0
  372. package/test/storage/findLegacy.test.ts +67 -0
  373. package/test/storage/idb/allocateChange.test.ts +251 -0
  374. package/test/storage/idb/count.test.ts +158 -0
  375. package/test/storage/idb/find.test.ts +177 -0
  376. package/test/storage/idb/idbSpeed.test.ts +36 -0
  377. package/test/storage/idb/insert.test.ts +268 -0
  378. package/test/storage/idb/transactionAbort.test.ts +108 -0
  379. package/test/storage/idb/update.test.ts +999 -0
  380. package/test/storage/insert.test.ts +278 -0
  381. package/test/storage/update.test.ts +1021 -0
  382. package/test/storage/update2.test.ts +897 -0
  383. package/test/utils/TestUtilsWalletStorage.ts +2526 -0
  384. package/test/utils/localWalletMethods.ts +363 -0
  385. package/test/utils/removeFailedFromDatabase.sql +17 -0
  386. package/ts2md.json +44 -0
  387. package/tsconfig.all.json +31 -0
  388. package/tsconfig.client.json +29 -0
  389. package/tsconfig.json +17 -0
  390. package/tsconfig.mobile.json +28 -0
@@ -0,0 +1,293 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import * as bsv from '@bsv/sdk'
3
+ import { sdk, Wallet } from '../../../src/index.all'
4
+
5
+ import {
6
+ _tu,
7
+ logTransaction,
8
+ TestKeyPair,
9
+ TestWalletNoSetup,
10
+ cleanUnsentTransactionsUsingAbort,
11
+ cleanUnsignedTransactionsUsingAbort,
12
+ cleanUnprocessedTransactionsUsingAbort
13
+ } from '../../utils/TestUtilsWalletStorage'
14
+
15
+ describe('createActionToGenerateBeefs test', () => {
16
+ jest.setTimeout(99999999)
17
+
18
+ const ctxs: TestWalletNoSetup[] = []
19
+
20
+ beforeAll(async () => {
21
+ ctxs.push(await _tu.createLiveWalletSQLiteWARNING())
22
+ for (const { services } of ctxs) {
23
+ // Mock the services postBeef to avoid actually broadcasting new transactions and collect beef data.
24
+ services.postBeef = jest
25
+ .fn()
26
+ .mockImplementation((beef: bsv.Beef, txids: string[]): Promise<sdk.PostBeefResult[]> => {
27
+ const r: sdk.PostBeefResult = {
28
+ name: 'mock',
29
+ status: 'success',
30
+ txidResults: txids.map(txid => ({ txid, status: 'success' }))
31
+ }
32
+ return Promise.resolve([r])
33
+ })
34
+ }
35
+ })
36
+
37
+ afterAll(async () => {
38
+ for (const ctx of ctxs) {
39
+ await ctx.storage.destroy()
40
+ }
41
+ })
42
+
43
+ test('1_send 2 txs in a beef', async () => {
44
+ const root = '02135476'
45
+ const kp = _tu.getKeyPair(root.repeat(8))
46
+
47
+ for (const { wallet, activeStorage: storage } of ctxs) {
48
+ const {
49
+ txidPair: [txid1, txid2],
50
+ Beef: beef1
51
+ } = await createAndConsume(wallet, root, kp)
52
+
53
+ {
54
+ const createArgs: bsv.CreateActionArgs = {
55
+ description: `${kp.address} of ${root}`,
56
+ options: {
57
+ acceptDelayedBroadcast: false,
58
+ sendWith: [txid1, txid2]
59
+ }
60
+ }
61
+
62
+ const cr = await wallet.createAction(createArgs)
63
+
64
+ expect(cr.noSendChange).not.toBeTruthy()
65
+ expect(cr.sendWithResults?.length).toBe(2)
66
+ const [swr1, swr2] = cr.sendWithResults!
67
+ expect(swr1.status !== 'failed').toBe(true)
68
+ expect(swr2.status !== 'failed').toBe(true)
69
+ expect(swr1.txid).toBe(txid1)
70
+ expect(swr2.txid).toBe(txid2)
71
+ const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
72
+ await expect(Promise.resolve(r1)).resolves.toBe(true)
73
+ const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
74
+ await expect(Promise.resolve(r2)).resolves.toBe(true)
75
+ const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
76
+ await expect(Promise.resolve(r3)).resolves.toBe(true)
77
+ }
78
+ }
79
+ })
80
+
81
+ test('2_send 4 txs in a single beef ', async () => {
82
+ const root1 = '02135476'
83
+ const kp1 = _tu.getKeyPair(root1.repeat(8))
84
+ const root2 = '02135478'
85
+ const kp2 = _tu.getKeyPair(root2.repeat(8))
86
+
87
+ for (const { wallet, activeStorage: storage } of ctxs) {
88
+ const {
89
+ txidPair: [txid1, txid2],
90
+ Beef: beef1
91
+ } = await createAndConsume(wallet, root1, kp1)
92
+ expect(txid1).toBeTruthy()
93
+ expect(txid2).toBeTruthy()
94
+
95
+ const {
96
+ txidPair: [txid3, txid4],
97
+ Beef: beef2
98
+ } = await createAndConsume(wallet, root2, kp2)
99
+ expect(txid3).toBeTruthy()
100
+ expect(txid4).toBeTruthy()
101
+
102
+ {
103
+ const createArgs: bsv.CreateActionArgs = {
104
+ description: `${root1} & ${root2}`,
105
+ options: {
106
+ acceptDelayedBroadcast: false,
107
+ sendWith: [txid1, txid2, txid3, txid4]
108
+ }
109
+ }
110
+
111
+ const cr = await wallet.createAction(createArgs)
112
+
113
+ expect(cr.noSendChange).not.toBeTruthy()
114
+ expect(cr.sendWithResults?.length).toBe(2)
115
+ const [swr1, swr2, swr3, swr4] = cr.sendWithResults!
116
+ expect(swr1.status !== 'failed').toBe(true)
117
+ expect(swr2.status !== 'failed').toBe(true)
118
+ expect(swr3.status !== 'failed').toBe(true)
119
+ expect(swr4.status !== 'failed').toBe(true)
120
+ expect(swr1.txid).toBe(txid1)
121
+ expect(swr2.txid).toBe(txid2)
122
+ expect(swr3.txid).toBe(txid3)
123
+ expect(swr4.txid).toBe(txid4)
124
+ const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
125
+ await expect(Promise.resolve(r1)).resolves.toBe(true)
126
+ const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
127
+ await expect(Promise.resolve(r2)).resolves.toBe(true)
128
+ const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
129
+ await expect(Promise.resolve(r3)).resolves.toBe(true)
130
+ }
131
+ }
132
+ })
133
+
134
+ test('3_test tranaction log', async () => {
135
+ for (const { activeStorage: storage } of ctxs) {
136
+ const txid: bsv.HexString = 'ed11e4b7402e38bac0ec7431063ae7c14ee82370e5f1963d48ae27a70527f784'
137
+ const rl = await logTransaction(storage, txid)
138
+ console.log(rl)
139
+ break
140
+ }
141
+ })
142
+ test('4_abort set of nosend transactions', async () => {
143
+ for (const { wallet, activeStorage: storage } of ctxs) {
144
+ const r = await cleanUnsentTransactionsUsingAbort(wallet, storage)
145
+ await expect(Promise.resolve(r)).resolves.toBe(true)
146
+ }
147
+ })
148
+
149
+ test('5_abort a set of unsigned transactions', async () => {
150
+ for (const { wallet, activeStorage: storage } of ctxs) {
151
+ const r = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
152
+ await expect(Promise.resolve(r)).resolves.toBe(true)
153
+ }
154
+ })
155
+
156
+ test('6_abort a set of unprocessed transactions', async () => {
157
+ for (const { wallet, activeStorage: storage } of ctxs) {
158
+ const r = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
159
+ await expect(Promise.resolve(r)).resolves.toBe(true)
160
+ }
161
+ })
162
+
163
+ test('7_abort all transactions', async () => {
164
+ for (const { wallet, activeStorage: storage } of ctxs) {
165
+ const r1 = await cleanUnsentTransactionsUsingAbort(wallet, storage)
166
+ await expect(Promise.resolve(r1)).resolves.toBe(true)
167
+ const r2 = await cleanUnsignedTransactionsUsingAbort(wallet, storage)
168
+ await expect(Promise.resolve(r2)).resolves.toBe(true)
169
+ const r3 = await cleanUnprocessedTransactionsUsingAbort(wallet, storage)
170
+ await expect(Promise.resolve(r3)).resolves.toBe(true)
171
+ }
172
+ })
173
+ })
174
+
175
+ async function createAndConsume(
176
+ wallet: Wallet,
177
+ root: string,
178
+ kp: TestKeyPair
179
+ ): Promise<{ txidPair: bsv.TXIDHexString[]; Beef: bsv.Beef }> {
180
+ let txid1: bsv.TXIDHexString
181
+ let txid2: bsv.TXIDHexString
182
+ const outputSatoshis = 42
183
+ let noSendChange: string[] | undefined
184
+ let inputBEEF: bsv.AtomicBEEF | undefined
185
+
186
+ {
187
+ const createArgs: bsv.CreateActionArgs = {
188
+ description: `${kp.address} of ${root}`,
189
+ outputs: [
190
+ {
191
+ satoshis: outputSatoshis,
192
+ lockingScript: _tu.getLockP2PKH(kp.address).toHex(),
193
+ outputDescription: 'pay fred'
194
+ }
195
+ ],
196
+ options: {
197
+ randomizeOutputs: false,
198
+ signAndProcess: false,
199
+ noSend: true
200
+ }
201
+ }
202
+
203
+ const cr = await wallet.createAction(createArgs)
204
+
205
+ noSendChange = cr.noSendChange
206
+
207
+ expect(cr.noSendChange).toBeTruthy()
208
+ expect(cr.sendWithResults).toBeUndefined()
209
+ expect(cr.tx).toBeUndefined()
210
+ expect(cr.txid).toBeUndefined()
211
+
212
+ expect(cr.signableTransaction).toBeTruthy()
213
+ const st = cr.signableTransaction!
214
+ expect(st.reference).toBeTruthy()
215
+ // const tx = Transaction.fromAtomicBEEF(st.tx) // Transaction doesn't support V2 Beef yet.
216
+ const atomicBeef = bsv.Beef.fromBinary(st.tx)
217
+ const tx = atomicBeef.txs[atomicBeef.txs.length - 1].tx!
218
+ for (const input of tx.inputs) {
219
+ expect(atomicBeef.findTxid(input.sourceTXID!)).toBeTruthy()
220
+ }
221
+
222
+ // Spending authorization check happens here...
223
+ //expect(st.amount > 242 && st.amount < 300).toBe(true)
224
+
225
+ // sign and complete
226
+ const signArgs: bsv.SignActionArgs = {
227
+ reference: st.reference,
228
+ spends: {},
229
+ options: {
230
+ returnTXIDOnly: false,
231
+ noSend: true
232
+ }
233
+ }
234
+
235
+ const sr = await wallet.signAction(signArgs)
236
+ inputBEEF = sr.tx
237
+
238
+ txid1 = sr.txid!
239
+ // Update the noSendChange txid to final signed value.
240
+ noSendChange = noSendChange!.map(op => `${txid1}.${op.split('.')[1]}`)
241
+ }
242
+ {
243
+ const unlock = _tu.getUnlockP2PKH(kp.privateKey, outputSatoshis)
244
+ const unlockingScriptLength = await unlock.estimateLength()
245
+
246
+ const createArgs: bsv.CreateActionArgs = {
247
+ description: `${kp.address} of ${root}`,
248
+ inputs: [
249
+ {
250
+ outpoint: `${txid1}.0`,
251
+ inputDescription: 'spend ${kp.address} of ${root}',
252
+ unlockingScriptLength
253
+ }
254
+ ],
255
+ inputBEEF,
256
+ options: {
257
+ noSendChange,
258
+ // signAndProcess: false, // Not required as an input lacks unlock script...
259
+ noSend: true
260
+ }
261
+ }
262
+
263
+ const cr = await wallet.createAction(createArgs)
264
+
265
+ expect(cr.noSendChange).toBeTruthy()
266
+ expect(cr.sendWithResults).toBeUndefined()
267
+ expect(cr.tx).toBeUndefined()
268
+ expect(cr.txid).toBeUndefined()
269
+ expect(cr.signableTransaction).toBeTruthy()
270
+ const st = cr.signableTransaction!
271
+ expect(st.reference).toBeTruthy()
272
+ const atomicBeef: bsv.Beef = bsv.Beef.fromBinary(st.tx)
273
+ const tx = atomicBeef.txs[atomicBeef.txs.length - 1].tx!
274
+
275
+ tx.inputs[0].unlockingScriptTemplate = unlock
276
+ await tx.sign()
277
+ const unlockingScript = tx.inputs[0].unlockingScript!.toHex()
278
+
279
+ const signArgs: bsv.SignActionArgs = {
280
+ reference: st.reference,
281
+ spends: { 0: { unlockingScript } },
282
+ options: {
283
+ returnTXIDOnly: true,
284
+ noSend: true
285
+ }
286
+ }
287
+ const sr = await wallet.signAction(signArgs)
288
+
289
+ txid2 = sr.txid!
290
+ //expect(atomicBeef.isValid()).toBe(true)
291
+ return { txidPair: [txid1, txid2], Beef: atomicBeef }
292
+ }
293
+ }
@@ -0,0 +1,286 @@
1
+ import { Beef, InternalizeOutput } from '@bsv/sdk'
2
+ import { sdk, StorageKnex } from '../../../src/index.all'
3
+ import { _tu, expectToThrowWERR, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
4
+ import { getBeefForTransaction } from '../../../src/storage/methods/getBeefForTransaction'
5
+
6
+ /**
7
+ * NOT PASSING YET
8
+ */
9
+ describe.skip('internalizeAction tests', () => {
10
+ jest.setTimeout(99999999)
11
+
12
+ const env = _tu.getEnvFlags('test')
13
+ const ctxs: TestWalletNoSetup[] = []
14
+
15
+ beforeAll(async () => {
16
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('internalizeActionTests'))
17
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('internalizeActionTests'))
18
+ })
19
+
20
+ afterAll(async () => {
21
+ for (const ctx of ctxs) {
22
+ await ctx.storage.destroy()
23
+ }
24
+ })
25
+
26
+ // Check: 'unproven' or 'completed' status. Any other status is an error.
27
+ // When the transaction already exists, the description is updated. The isOutgoing sense is not changed.
28
+
29
+ test.skip('1_default real wallet data', async () => {
30
+ // 1. construct a normal transaction with user supplied output.
31
+ // 2. dito but user input
32
+ // 3..Repeat 1 & 2 but use sign action
33
+ // Repeat 1-3 but use noSend and then a sendWith.
34
+ // Figure the exact fee cost for transactions 1-3 and start with a noSend transaction that creates a change output with just the right fee amount. Then rebuild 1-3, as second tx, feed it the noSend change from the first tx, confirm no additional change is added or produced, use sendWith to send both as a batch.
35
+ // "basket insertion" Merge Rules:
36
+ // The "default" basket may not be specified as the insertion basket.
37
+ // A change output in the "default" basket may not be target of an insertion into a different basket.
38
+ // These baskets do not affect the wallet's balance and are typed "custom".
39
+ // "wallet payment" Merge Rules:
40
+ // Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
41
+ // Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's amount, and the wallet balance.
42
+
43
+ for (const { wallet, activeStorage: storage } of ctxs) {
44
+ try {
45
+ // Prepare StorageGetBeefOptions
46
+ const options: sdk.StorageGetBeefOptions = {
47
+ // Setting 'known' tells it not to include rawTxs it already knows about, just their txids.
48
+ // trustSelf: 'known',
49
+ // Setting knownTxids tells it not to include these rawTxs, just their txids.
50
+ // knownTxids: ['2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122'],
51
+ // False and undefined are equal here so no need for this.
52
+ // ignoreStorage: false,
53
+ // Yes, you expect storage to have the info, so don't use services.
54
+ ignoreServices: true
55
+ // Since you aren't using services and there won't be any newProven (rawTx's with merklePaths previously unknown to storage but required for this beef)
56
+ // ignoreNewProven: false,
57
+ // You don't expect infinitely deep nonsense
58
+ // minProofLevel: 0
59
+ }
60
+
61
+ // Fetch Beef object
62
+ const beef = await storage.getBeefForTransaction(
63
+ '2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122',
64
+ options
65
+ )
66
+
67
+ //console.log('Beef Object:\n', beef.toLogString())
68
+
69
+ // Ensure Beef object contains valid transactions
70
+ if (beef.txs.length === 0) {
71
+ throw new Error('Beef contains no transactions')
72
+ }
73
+
74
+ // Validate the first transaction in the Beef object
75
+ const firstTx = beef.txs[0]
76
+ if (!firstTx.isValid) {
77
+ console.error('First transaction is invalid:', firstTx)
78
+ throw new Error('Beef contains an invalid transaction')
79
+ }
80
+
81
+ expect(beef.atomicTxid).toBeUndefined()
82
+
83
+ // Convert to AtomicBEEF transaction
84
+ const atomicTx = beef.toBinaryAtomic('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
85
+ //console.log('Atomic Transaction:', atomicTx)
86
+
87
+ // {
88
+ // const abeef = Beef.fromBinary(atomicTx)
89
+ // expect(abeef.atomicTxid).toBe('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
90
+ // }
91
+
92
+ // This needs to be a real output (the locking script and derivation bits / key need to work with each other)
93
+ // But it is still a valid test to see what the reaction is to this nonsense :-)
94
+ // Prepare output for internalization
95
+ const output: InternalizeOutput = {
96
+ outputIndex: 2,
97
+ protocol: 'wallet payment',
98
+ paymentRemittance: {
99
+ derivationPrefix: 'y0tgyMJbVWKhds2/MWkDBA==',
100
+ derivationSuffix: 'J1Q1E8re2RbvKONkEiEHDA==',
101
+ senderIdentityKey: '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
102
+ }
103
+ }
104
+
105
+ // Internalize Action
106
+ const r = await wallet.internalizeAction({
107
+ tx: atomicTx,
108
+ outputs: [output],
109
+ description: 'Default wallet payment'
110
+ })
111
+
112
+ // Validate result
113
+ //console.log('Internalize Action Result:', r)
114
+ expect(r).toBeDefined()
115
+ } catch (error) {
116
+ console.error('Test failed with error:', error)
117
+ throw error
118
+ }
119
+ }
120
+ })
121
+
122
+ test('2_default real basket insertion', async () => {
123
+ // 1. construct a normal transaction with user supplied output.
124
+ // 2. dito but user input
125
+ // 3..Repeat 1 & 2 but use sign action
126
+ // Repeat 1-3 but use noSend and then a sendWith.
127
+ // Figure the exact fee cost for transactions 1-3 and start with a noSend transaction that creates a change output with just the right fee amount. Then rebuild 1-3, as second tx, feed it the noSend change from the first tx, confirm no additional change is added or produced, use sendWith to send both as a batch.
128
+ // "basket insertion" Merge Rules:
129
+ // The "default" basket may not be specified as the insertion basket.
130
+ // A change output in the "default" basket may not be target of an insertion into a different basket.
131
+ // These baskets do not affect the wallet's balance and are typed "custom".
132
+ // "wallet payment" Merge Rules:
133
+ // Targetting an existing change "default" basket output results in a no-op. No error. No alterations made.
134
+ // Targetting a previously "custom" non-change output converts it into a change output. This alters the transaction's amount, and the wallet balance.
135
+
136
+ for (const { wallet, activeStorage: storage } of ctxs) {
137
+ try {
138
+ // Prepare StorageGetBeefOptions
139
+ const options: sdk.StorageGetBeefOptions = {
140
+ // Setting 'known' tells it not to include rawTxs it already knows about, just their txids.
141
+ // trustSelf: 'known',
142
+ // Setting knownTxids tells it not to include these rawTxs, just their txids.
143
+ // knownTxids: ['2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122'],
144
+ // False and undefined are equal here so no need for this.
145
+ // ignoreStorage: false,
146
+ // Yes, you expect storage to have the info, so don't use services.
147
+ ignoreServices: true
148
+ // Since you aren't using services and there won't be any newProven (rawTx's with merklePaths previously unknown to storage but required for this beef)
149
+ // ignoreNewProven: false,
150
+ // You don't expect infinitely deep nonsense
151
+ // minProofLevel: 0
152
+ }
153
+
154
+ // Fetch Beef object
155
+ const beef = await storage.getBeefForTransaction(
156
+ 'a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7',
157
+ options
158
+ )
159
+
160
+ //console.log('Beef Object:\n', beef.toLogString())
161
+
162
+ // Ensure Beef object contains valid transactions
163
+ if (beef.txs.length === 0) {
164
+ throw new Error('Beef contains no transactions')
165
+ }
166
+
167
+ // Validate the first transaction in the Beef object
168
+ const firstTx = beef.txs[0]
169
+ if (!firstTx.isValid) {
170
+ console.error('First transaction is invalid:', firstTx)
171
+ throw new Error('Beef contains an invalid transaction')
172
+ }
173
+
174
+ expect(beef.atomicTxid).toBeUndefined()
175
+
176
+ // Convert to AtomicBEEF transaction
177
+ const atomicTx = beef.toBinaryAtomic('a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7')
178
+ //console.log('Atomic Transaction:', atomicTx)
179
+
180
+ {
181
+ const abeef = Beef.fromBinary(atomicTx)
182
+ expect(abeef.atomicTxid).toBe('a3b2f0935c7b5bb7a841a09e535c13be86f4df0e7a91cebdc33812bfcc0eb9d7')
183
+ }
184
+
185
+ // This needs to be a real output (the locking script and derivation bits / key need to work with each other)
186
+ // But it is still a valid test to see what the reaction is to this nonsense :-)
187
+ // Prepare output for internalization
188
+ const output: InternalizeOutput = {
189
+ outputIndex: 0,
190
+ protocol: 'basket insertion',
191
+ // export interface BasketInsertion {
192
+ // basket: BasketStringUnder300Bytes
193
+ // customInstructions?: string
194
+ // tags?: OutputTagStringUnder300Bytes[]
195
+ // }
196
+ insertionRemittance: {
197
+ basket: 'babbage-token-access',
198
+ tags: [
199
+ 'babbage_originator todo.babbage.systems',
200
+ 'babbage_action_originator projectbabbage.com',
201
+ 'babbage_protocolname todo list',
202
+ 'babbage_protocolsecuritylevel 2',
203
+ 'babbage_counterparty self'
204
+ ]
205
+ }
206
+ }
207
+
208
+ // Internalize Action
209
+ const r = await wallet.internalizeAction({
210
+ tx: atomicTx,
211
+ outputs: [output],
212
+ description: 'Default basket insertion'
213
+ })
214
+
215
+ // Validate result
216
+ //console.log('Internalize Action Result:', r)
217
+ expect(r).toBeDefined()
218
+ } catch (error) {
219
+ console.error('Test failed with error:', error)
220
+ throw error
221
+ }
222
+ }
223
+ })
224
+
225
+ test.skip('3_default', async () => {
226
+ for (const { wallet, activeStorage: storage } of ctxs) {
227
+ try {
228
+ // Prepare StorageGetBeefOptions
229
+ const options: sdk.StorageGetBeefOptions = {
230
+ ignoreServices: true
231
+ }
232
+
233
+ // Fetch Beef object
234
+ const beef = await storage.getBeefForTransaction(
235
+ '2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122',
236
+ options
237
+ )
238
+
239
+ //console.log('Beef Object:', beef)
240
+
241
+ // Ensure Beef object contains valid transactions
242
+ if (beef.txs.length === 0) {
243
+ throw new Error('Beef contains no transactions')
244
+ }
245
+
246
+ // Validate the first transaction in the Beef object
247
+ const firstTx = beef.txs[0]
248
+ if (!firstTx.isValid) {
249
+ console.error('First transaction is invalid:', firstTx)
250
+ throw new Error('Beef contains an invalid transaction')
251
+ }
252
+
253
+ expect(beef.atomicTxid).toBeDefined()
254
+
255
+ // Convert to AtomicBEEF transaction
256
+ const atomicTx = beef.toBinaryAtomic('2795b293c698b2244147aaba745db887a632d21990c474df46d842ec3e52f122')
257
+ //console.log('Atomic Transaction:', atomicTx)
258
+
259
+ // Prepare output for internalization
260
+ const output: InternalizeOutput = {
261
+ outputIndex: 2,
262
+ protocol: 'basket insertion',
263
+ paymentRemittance: {
264
+ derivationPrefix: 'y0tgyMJbVWKhds2/MWkDBA==',
265
+ derivationSuffix: 'J1Q1E8re2RbvKONkEiEHDA==',
266
+ senderIdentityKey: '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
267
+ }
268
+ }
269
+
270
+ // Internalize Action
271
+ const r = await wallet.internalizeAction({
272
+ tx: atomicTx,
273
+ outputs: [output],
274
+ description: 'Default test description'
275
+ })
276
+
277
+ // Validate result
278
+ //console.log('Internalize Action Result:', r)
279
+ expect(r).toBeDefined()
280
+ } catch (error) {
281
+ console.error('Test failed with error:', error)
282
+ throw error
283
+ }
284
+ }
285
+ })
286
+ })