@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,682 @@
1
+ import { Beef, CreateActionArgs, InternalizeActionArgs, P2PKH, WalletProtocol } from '@bsv/sdk'
2
+ import { sdk } from '../../../src/index.all'
3
+ import { _tu, expectToThrowWERR, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
4
+
5
+ const includeTestChaintracks = false
6
+
7
+ describe('internalizeAction tests', () => {
8
+ jest.setTimeout(99999999)
9
+
10
+ const env = _tu.getEnvFlags('test')
11
+
12
+ const gctxs: TestWalletNoSetup[] = []
13
+ const useSharedCtxs = true
14
+
15
+ beforeAll(async () => {
16
+ if (includeTestChaintracks) {
17
+ if (env.runMySQL) gctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeActionTests'))
18
+ gctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeActionTests'))
19
+ }
20
+ })
21
+
22
+ afterAll(async () => {
23
+ for (const ctx of gctxs) {
24
+ await ctx.storage.destroy()
25
+ }
26
+ })
27
+
28
+ test('0 invalid params', async () => {
29
+ for (const { wallet } of gctxs) {
30
+ const beef0 = new Beef()
31
+ const beef1 = new Beef()
32
+ beef1.mergeTxidOnly('1'.repeat(64))
33
+
34
+ const invalidArgs: InternalizeActionArgs[] = [
35
+ { tx: [], outputs: [], description: '' },
36
+ { tx: [], outputs: [], description: '12345' },
37
+ { tx: beef0.toBinary(), outputs: [], description: '12345' },
38
+ { tx: beef1.toBinary(), outputs: [], description: '12345' }
39
+ // Oh so many things to test...
40
+ ]
41
+
42
+ for (const args of invalidArgs) {
43
+ await expectToThrowWERR(sdk.WERR_INVALID_PARAMETER, () => wallet.internalizeAction(args))
44
+ }
45
+ }
46
+ })
47
+
48
+ test('1_internalize custom output in receiving wallet with checks', async () => {
49
+ const ctxs: TestWalletNoSetup[] = []
50
+ if (useSharedCtxs) ctxs.push(...gctxs)
51
+ else {
52
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeAction1Tests'))
53
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeAction1Tests'))
54
+ }
55
+ for (const { wallet } of ctxs) {
56
+ const root = '02135476'
57
+ const kp = _tu.getKeyPair(root.repeat(8))
58
+ const fredsAddress = kp.address
59
+
60
+ const outputSatoshis = 4
61
+
62
+ {
63
+ const createArgs: CreateActionArgs = {
64
+ description: `${kp.address} of ${root}`,
65
+ outputs: [
66
+ {
67
+ satoshis: outputSatoshis,
68
+ lockingScript: _tu.getLockP2PKH(fredsAddress).toHex(),
69
+ outputDescription: 'pay fred'
70
+ }
71
+ ],
72
+ options: {
73
+ returnTXIDOnly: false,
74
+ randomizeOutputs: false,
75
+ signAndProcess: true,
76
+ noSend: true
77
+ }
78
+ }
79
+ // This createAction creates a new P2PKH output of 4 satoshis for Fred using his publish payment address... old school.
80
+ const cr = await wallet.createAction(createArgs)
81
+ expect(cr.tx).toBeTruthy()
82
+
83
+ // Fred's new wallet (context)
84
+ const fred = await _tu.createSQLiteTestWallet({
85
+ chain: 'test',
86
+ databaseName: 'internalizeAction1fred',
87
+ rootKeyHex: '2'.repeat(64),
88
+ dropAll: true
89
+ })
90
+
91
+ // Internalize args to add fred's new output to his own wallet
92
+ const internalizeArgs: InternalizeActionArgs = {
93
+ tx: cr.tx!,
94
+ outputs: [
95
+ {
96
+ outputIndex: 0,
97
+ protocol: 'basket insertion',
98
+ insertionRemittance: {
99
+ basket: 'payments',
100
+ customInstructions: JSON.stringify({ root, repeat: 8 }),
101
+ tags: ['test', 'again']
102
+ }
103
+ }
104
+ ],
105
+ description: 'got paid!'
106
+ }
107
+ // And do it...
108
+ const ir = await fred.wallet.internalizeAction(internalizeArgs)
109
+ expect(ir.accepted).toBe(true)
110
+
111
+ const ro = await fred.activeStorage.findOutputs({
112
+ partial: { outputId: 1 }
113
+ })
114
+ expect(ro[0].basketId).toBe(2) // Basket can't be default basket so basketId must be 2
115
+ expect(ro[0].satoshis).toBe(outputSatoshis)
116
+
117
+ // Validate custom instructions and tags
118
+ expect(ro[0].customInstructions).toBe(JSON.stringify({ root, repeat: 8 }))
119
+ const rtm = await fred.activeStorage.findOutputTagMaps({
120
+ partial: { outputId: 1 }
121
+ })
122
+ const rt1 = await fred.activeStorage.findOutputTags({
123
+ partial: { outputTagId: rtm[0].outputTagId }
124
+ })
125
+ expect(rt1[0].tag).toBe('test')
126
+ const rt2 = await fred.activeStorage.findOutputTags({
127
+ partial: { outputTagId: rtm[1].outputTagId }
128
+ })
129
+ expect(rt2[0].tag).toBe('again')
130
+
131
+ // Check that calling again does not throw an error
132
+ const r = await fred.wallet.internalizeAction(internalizeArgs)
133
+ await expect(Promise.resolve(r)).resolves.toBeTruthy()
134
+
135
+ // Cleanup Fred's storage
136
+ await fred.activeStorage.destroy()
137
+ }
138
+ }
139
+ if (!useSharedCtxs) {
140
+ for (const ctx of ctxs) {
141
+ await ctx.storage.destroy()
142
+ }
143
+ }
144
+ })
145
+
146
+ test('2_internalize 2 custom outputs in receiving wallet with checks', async () => {
147
+ const ctxs: TestWalletNoSetup[] = []
148
+ if (useSharedCtxs) ctxs.push(...gctxs)
149
+ else {
150
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeAction2Tests'))
151
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeAction2Tests'))
152
+ }
153
+ for (const { wallet } of ctxs) {
154
+ const root = '02135476'
155
+ const kp = _tu.getKeyPair(root.repeat(8))
156
+ const fredsAddress = kp.address
157
+
158
+ const outputSatoshis1 = 4
159
+ const outputSatoshis2 = 5
160
+
161
+ {
162
+ const createArgs: CreateActionArgs = {
163
+ description: `${kp.address} of ${root}`,
164
+ outputs: [
165
+ {
166
+ satoshis: outputSatoshis1,
167
+ lockingScript: _tu.getLockP2PKH(fredsAddress).toHex(),
168
+ outputDescription: 'pay fred 1st payment'
169
+ },
170
+ {
171
+ satoshis: outputSatoshis2,
172
+ lockingScript: _tu.getLockP2PKH(fredsAddress).toHex(),
173
+ outputDescription: 'pay fred 2nd payment'
174
+ }
175
+ ],
176
+ options: {
177
+ returnTXIDOnly: false,
178
+ randomizeOutputs: false,
179
+ signAndProcess: true,
180
+ noSend: true
181
+ }
182
+ }
183
+
184
+ // This createAction creates a new P2PKH output of 4 and 5 satoshis for Fred using his publish payment address... old school.
185
+ const cr = await wallet.createAction(createArgs)
186
+ expect(cr.tx).toBeTruthy()
187
+
188
+ // Fred's new wallet (context)
189
+ const fred = await _tu.createSQLiteTestWallet({
190
+ chain: 'test',
191
+ databaseName: 'internalizeAction2fred',
192
+ rootKeyHex: '2'.repeat(64),
193
+ dropAll: true
194
+ })
195
+
196
+ // Internalize args to add fred's new output to his own wallet
197
+ const internalizeArgs: InternalizeActionArgs = {
198
+ tx: cr.tx!,
199
+ outputs: [
200
+ {
201
+ outputIndex: 0,
202
+ protocol: 'basket insertion',
203
+ insertionRemittance: {
204
+ basket: 'payments',
205
+ customInstructions: JSON.stringify({ root, repeat: 8 }),
206
+ tags: ['2 tests', 'test 1']
207
+ }
208
+ },
209
+ {
210
+ outputIndex: 1,
211
+ protocol: 'basket insertion',
212
+ insertionRemittance: {
213
+ basket: 'payments',
214
+ customInstructions: JSON.stringify({ root, repeat: 8 }),
215
+ tags: ['2 tests', 'test 2']
216
+ }
217
+ }
218
+ ],
219
+ description: 'got paid twice!'
220
+ }
221
+ // And do it...
222
+ const ir = await fred.wallet.internalizeAction(internalizeArgs)
223
+ expect(ir.accepted).toBe(true)
224
+
225
+ {
226
+ const ro = await fred.activeStorage.findOutputs({
227
+ partial: { outputId: 1 }
228
+ })
229
+ expect(ro[0].basketId).toBe(2)
230
+ expect(ro[0].satoshis).toBe(outputSatoshis1)
231
+
232
+ // Validate custom instructions and tags
233
+ expect(ro[0].customInstructions).toBe(JSON.stringify({ root, repeat: 8 }))
234
+ const rtm = await fred.activeStorage.findOutputTagMaps({
235
+ partial: { outputId: 1 }
236
+ })
237
+ const rt1 = await fred.activeStorage.findOutputTags({
238
+ partial: { outputTagId: rtm[0].outputTagId }
239
+ })
240
+ expect(rt1[0].tag).toBe('2 tests')
241
+ const rt2 = await fred.activeStorage.findOutputTags({
242
+ partial: { outputTagId: rtm[1].outputTagId }
243
+ })
244
+ expect(rt2[0].tag).toBe('test 1')
245
+ }
246
+ {
247
+ const ro = await fred.activeStorage.findOutputs({
248
+ partial: { outputId: 2 }
249
+ })
250
+ expect(ro[0].basketId).toBe(2)
251
+ expect(ro[0].satoshis).toBe(outputSatoshis2)
252
+
253
+ expect(ro[0].customInstructions).toBe(JSON.stringify({ root, repeat: 8 }))
254
+ const rtm = await fred.activeStorage.findOutputTagMaps({
255
+ partial: { outputId: 2 }
256
+ })
257
+ const rt1 = await fred.activeStorage.findOutputTags({
258
+ partial: { outputTagId: rtm[0].outputTagId }
259
+ })
260
+ expect(rt1[0].tag).toBe('2 tests')
261
+ const rt2 = await fred.activeStorage.findOutputTags({
262
+ partial: { outputTagId: rtm[1].outputTagId }
263
+ })
264
+ expect(rt2[0].tag).toBe('test 2')
265
+ }
266
+
267
+ // Check that calling again does not throw an error
268
+ const r = await fred.wallet.internalizeAction(internalizeArgs)
269
+ await expect(Promise.resolve(r)).resolves.toBeTruthy()
270
+
271
+ await fred.activeStorage.destroy()
272
+ }
273
+ }
274
+ if (!useSharedCtxs) {
275
+ for (const ctx of ctxs) {
276
+ await ctx.storage.destroy()
277
+ }
278
+ }
279
+ })
280
+
281
+ test('3_internalize wallet payment in receiving wallet with checks', async () => {
282
+ const ctxs: TestWalletNoSetup[] = []
283
+ if (useSharedCtxs) ctxs.push(...gctxs)
284
+ else {
285
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeAction3Tests'))
286
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeAction3Tests'))
287
+ }
288
+ for (const { wallet, identityKey: senderIdentityKey } of ctxs) {
289
+ const fred = await _tu.createSQLiteTestWallet({
290
+ chain: 'test',
291
+ databaseName: 'internalizeAction3fred',
292
+ rootKeyHex: '2'.repeat(64),
293
+ dropAll: true
294
+ })
295
+ const outputSatoshis = 5
296
+ const derivationPrefix = Buffer.from('invoice-12345').toString('base64')
297
+ const derivationSuffix = Buffer.from('utxo-0').toString('base64')
298
+ const brc29ProtocolID: WalletProtocol = [2, '3241645161d8']
299
+ const derivedPublicKey = wallet.keyDeriver.derivePublicKey(
300
+ brc29ProtocolID,
301
+ `${derivationPrefix} ${derivationSuffix}`,
302
+ fred.identityKey
303
+ )
304
+ const derivedAddress = derivedPublicKey.toAddress()
305
+
306
+ {
307
+ const createArgs: CreateActionArgs = {
308
+ description: `description BRC-29`,
309
+ outputs: [
310
+ {
311
+ satoshis: outputSatoshis,
312
+ lockingScript: new P2PKH().lock(derivedAddress).toHex(),
313
+ outputDescription: 'pay fred BRC-29'
314
+ }
315
+ ],
316
+ options: {
317
+ returnTXIDOnly: false,
318
+ randomizeOutputs: false,
319
+ signAndProcess: true,
320
+ noSend: true
321
+ }
322
+ }
323
+
324
+ const cr = await wallet.createAction(createArgs)
325
+ expect(cr.tx).toBeTruthy()
326
+
327
+ const internalizeArgs: InternalizeActionArgs = {
328
+ tx: cr.tx!,
329
+ outputs: [
330
+ {
331
+ outputIndex: 0,
332
+ protocol: 'wallet payment',
333
+ paymentRemittance: {
334
+ derivationPrefix: derivationPrefix,
335
+ derivationSuffix: derivationSuffix,
336
+ senderIdentityKey: senderIdentityKey
337
+ }
338
+ }
339
+ ],
340
+ description: 'received BRC-29 payment!'
341
+ }
342
+
343
+ const ir = await fred.wallet.internalizeAction(internalizeArgs)
344
+ expect(ir.accepted).toBe(true)
345
+
346
+ const rfbs = await fred.activeStorage.findOutputBaskets({
347
+ partial: { name: 'default' }
348
+ })
349
+ expect(rfbs.length).toBe(1)
350
+
351
+ const rfos = await fred.activeStorage.findOutputs({
352
+ partial: { basketId: rfbs[0].basketId }
353
+ })
354
+ expect(rfos.length).toBe(1)
355
+ expect(rfos[0].satoshis).toBe(outputSatoshis)
356
+ expect(rfos[0].type).toBe('P2PKH')
357
+ expect(rfos[0].purpose).toBe('change')
358
+
359
+ const r = await fred.wallet.internalizeAction(internalizeArgs)
360
+ await expect(Promise.resolve(r)).resolves.toBeTruthy()
361
+
362
+ await fred.activeStorage.destroy()
363
+ }
364
+ }
365
+ if (!useSharedCtxs) {
366
+ for (const ctx of ctxs) {
367
+ await ctx.storage.destroy()
368
+ }
369
+ }
370
+ })
371
+
372
+ test('4_internalize 2 wallet payments in receiving wallet with checks', async () => {
373
+ const ctxs: TestWalletNoSetup[] = []
374
+ if (useSharedCtxs) ctxs.push(...gctxs)
375
+ else {
376
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeAction4Tests'))
377
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeAction4Tests'))
378
+ }
379
+ for (const { wallet, identityKey: senderIdentityKey } of ctxs) {
380
+ const fred = await _tu.createSQLiteTestWallet({
381
+ chain: 'test',
382
+ databaseName: 'internalizeAction4fred',
383
+ rootKeyHex: '2'.repeat(64),
384
+ dropAll: true
385
+ })
386
+
387
+ const brc29ProtocolID: WalletProtocol = [2, '3241645161d8']
388
+ const outputSatoshis1 = 6
389
+ const derivationPrefix = Buffer.from('invoice-12345').toString('base64')
390
+ const derivationSuffix1 = Buffer.from('utxo-1').toString('base64')
391
+ const derivedPublicKey1 = wallet.keyDeriver.derivePublicKey(
392
+ brc29ProtocolID,
393
+ `${derivationPrefix} ${derivationSuffix1}`,
394
+ fred.identityKey
395
+ )
396
+ const derivedAddress1 = derivedPublicKey1.toAddress()
397
+
398
+ const outputSatoshis2 = 7
399
+ const derivationSuffix2 = Buffer.from('utxo-2').toString('base64')
400
+ const derivedPublicKey2 = wallet.keyDeriver.derivePublicKey(
401
+ brc29ProtocolID,
402
+ `${derivationPrefix} ${derivationSuffix2}`,
403
+ fred.identityKey
404
+ )
405
+ const derivedAddress2 = derivedPublicKey2.toAddress()
406
+
407
+ {
408
+ const createArgs: CreateActionArgs = {
409
+ description: `BRC-29 payments from other wallet`,
410
+ outputs: [
411
+ {
412
+ satoshis: outputSatoshis1,
413
+ lockingScript: new P2PKH().lock(derivedAddress1).toHex(),
414
+ outputDescription: 'pay fred 1st BRC-29 payment'
415
+ },
416
+ {
417
+ satoshis: outputSatoshis2,
418
+ lockingScript: new P2PKH().lock(derivedAddress2).toHex(),
419
+ outputDescription: 'pay fred 2nd BRC-29 payment'
420
+ }
421
+ ],
422
+ options: {
423
+ returnTXIDOnly: false,
424
+ randomizeOutputs: false,
425
+ signAndProcess: true,
426
+ noSend: true
427
+ }
428
+ }
429
+
430
+ const cr = await wallet.createAction(createArgs)
431
+ expect(cr.tx).toBeTruthy()
432
+
433
+ const internalizeArgs: InternalizeActionArgs = {
434
+ tx: cr.tx!,
435
+ outputs: [
436
+ {
437
+ outputIndex: 0,
438
+ protocol: 'wallet payment',
439
+ paymentRemittance: {
440
+ derivationPrefix: derivationPrefix,
441
+ derivationSuffix: derivationSuffix1,
442
+ senderIdentityKey: senderIdentityKey
443
+ }
444
+ },
445
+ {
446
+ outputIndex: 1,
447
+ protocol: 'wallet payment',
448
+ paymentRemittance: {
449
+ derivationPrefix: derivationPrefix,
450
+ derivationSuffix: derivationSuffix2,
451
+ senderIdentityKey: senderIdentityKey
452
+ }
453
+ }
454
+ ],
455
+ description: 'received pair of BRC-29 payments!'
456
+ }
457
+
458
+ const ir = await fred.wallet.internalizeAction(internalizeArgs)
459
+ expect(ir.accepted).toBe(true)
460
+
461
+ const rfbs = await fred.activeStorage.findOutputBaskets({
462
+ partial: { name: 'default' }
463
+ })
464
+ expect(rfbs.length).toBe(1)
465
+
466
+ const rfos = await fred.activeStorage.findOutputs({
467
+ partial: { basketId: rfbs[0].basketId }
468
+ })
469
+ expect(rfos.length).toBe(2)
470
+ expect(rfos[0].satoshis).toBe(outputSatoshis1)
471
+ expect(rfos[0].type).toBe('P2PKH')
472
+ expect(rfos[0].purpose).toBe('change')
473
+
474
+ expect(rfos[1].satoshis).toBe(outputSatoshis2)
475
+ expect(rfos[1].type).toBe('P2PKH')
476
+ expect(rfos[1].purpose).toBe('change')
477
+
478
+ const r = await fred.wallet.internalizeAction(internalizeArgs)
479
+ await expect(Promise.resolve(r)).resolves.toBeTruthy()
480
+
481
+ await fred.activeStorage.destroy()
482
+ }
483
+ }
484
+ if (!useSharedCtxs) {
485
+ for (const ctx of ctxs) {
486
+ await ctx.storage.destroy()
487
+ }
488
+ }
489
+ })
490
+
491
+ test('5_internalize 2 wallet payments and 2 basket insertions in receiving wallet with checks', async () => {
492
+ if (!includeTestChaintracks) return
493
+ const ctxs: TestWalletNoSetup[] = []
494
+ if (env.runMySQL) ctxs.push(await _tu.createLegacyWalletMySQLCopy('actionInternalizeAction5Tests'))
495
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('actionInternalizeAction5Tests'))
496
+ for (const { wallet, identityKey: senderIdentityKey } of ctxs) {
497
+ const fred = await _tu.createSQLiteTestWallet({
498
+ chain: 'test',
499
+ databaseName: 'internalizeAction5fred',
500
+ rootKeyHex: '2'.repeat(64),
501
+ dropAll: true
502
+ })
503
+
504
+ const brc29ProtocolID: WalletProtocol = [2, '3241645161d8']
505
+ const outputSatoshis1 = 8
506
+ const derivationPrefix = Buffer.from('invoice-12345').toString('base64')
507
+ const derivationSuffix1 = Buffer.from('utxo-1').toString('base64')
508
+ const derivedPublicKey1 = wallet.keyDeriver.derivePublicKey(
509
+ brc29ProtocolID,
510
+ `${derivationPrefix} ${derivationSuffix1}`,
511
+ fred.identityKey
512
+ )
513
+ const derivedAddress1 = derivedPublicKey1.toAddress()
514
+
515
+ const outputSatoshis2 = 9
516
+ const derivationSuffix2 = Buffer.from('utxo-2').toString('base64')
517
+ const derivedPublicKey2 = wallet.keyDeriver.derivePublicKey(
518
+ brc29ProtocolID,
519
+ `${derivationPrefix} ${derivationSuffix2}`,
520
+ fred.identityKey
521
+ )
522
+ const derivedAddress2 = derivedPublicKey2.toAddress()
523
+
524
+ const root = '02135476'
525
+ const kp = _tu.getKeyPair(root.repeat(8))
526
+ const fredsAddress = kp.address
527
+
528
+ const outputSatoshis3 = 10
529
+ const outputSatoshis4 = 11
530
+
531
+ {
532
+ const createArgs: CreateActionArgs = {
533
+ description: `BRC-29 payments from other wallet`,
534
+ outputs: [
535
+ {
536
+ satoshis: outputSatoshis1,
537
+ lockingScript: new P2PKH().lock(derivedAddress1).toHex(),
538
+ outputDescription: 'pay fred 1st BRC-29 payment'
539
+ },
540
+ {
541
+ satoshis: outputSatoshis2,
542
+ lockingScript: new P2PKH().lock(derivedAddress2).toHex(),
543
+ outputDescription: 'pay fred 2nd BRC-29 payment'
544
+ },
545
+ {
546
+ satoshis: outputSatoshis3,
547
+ lockingScript: _tu.getLockP2PKH(fredsAddress).toHex(),
548
+ outputDescription: 'pay fred 3rd payment'
549
+ },
550
+ {
551
+ satoshis: outputSatoshis4,
552
+ lockingScript: _tu.getLockP2PKH(fredsAddress).toHex(),
553
+ outputDescription: 'pay fred 4th payment'
554
+ }
555
+ ],
556
+ options: {
557
+ returnTXIDOnly: false,
558
+ randomizeOutputs: false,
559
+ signAndProcess: true,
560
+ noSend: true
561
+ }
562
+ }
563
+
564
+ const cr = await wallet.createAction(createArgs)
565
+ expect(cr.tx).toBeTruthy()
566
+
567
+ const internalizeArgs: InternalizeActionArgs = {
568
+ tx: cr.tx!,
569
+
570
+ outputs: [
571
+ {
572
+ outputIndex: 0,
573
+ protocol: 'wallet payment',
574
+ paymentRemittance: {
575
+ derivationPrefix: derivationPrefix,
576
+ derivationSuffix: derivationSuffix1,
577
+ senderIdentityKey: senderIdentityKey
578
+ }
579
+ },
580
+ {
581
+ outputIndex: 1,
582
+ protocol: 'wallet payment',
583
+ paymentRemittance: {
584
+ derivationPrefix: derivationPrefix,
585
+ derivationSuffix: derivationSuffix2,
586
+ senderIdentityKey: senderIdentityKey
587
+ }
588
+ },
589
+ {
590
+ outputIndex: 2,
591
+ protocol: 'basket insertion',
592
+ insertionRemittance: {
593
+ basket: 'payments',
594
+ customInstructions: `3rd payment ${JSON.stringify({ root, repeat: 8 })}`,
595
+ tags: ['basket payments', '1st basket payment']
596
+ }
597
+ },
598
+ {
599
+ outputIndex: 3,
600
+ protocol: 'basket insertion',
601
+ insertionRemittance: {
602
+ basket: 'payments',
603
+ customInstructions: `4th payment ${JSON.stringify({ root, repeat: 8 })}`,
604
+ tags: ['basket payments', '2nd basket payment']
605
+ }
606
+ }
607
+ ],
608
+ description: 'received 2 BRC-29 pay and 2 basket ins!'
609
+ }
610
+
611
+ const ir = await fred.wallet.internalizeAction(internalizeArgs)
612
+ expect(ir.accepted).toBe(true)
613
+
614
+ const rfbs = await fred.activeStorage.findOutputBaskets({
615
+ partial: { name: 'default' }
616
+ })
617
+ expect(rfbs.length).toBe(1)
618
+
619
+ const rfos = await fred.activeStorage.findOutputs({
620
+ partial: { basketId: rfbs[0].basketId }
621
+ })
622
+ expect(rfos.length).toBe(2)
623
+ expect(rfos[0].satoshis).toBe(outputSatoshis1)
624
+ expect(rfos[0].type).toBe('P2PKH')
625
+ expect(rfos[0].purpose).toBe('change')
626
+
627
+ expect(rfos[1].satoshis).toBe(outputSatoshis2)
628
+ expect(rfos[1].type).toBe('P2PKH')
629
+ expect(rfos[1].purpose).toBe('change')
630
+
631
+ {
632
+ const ro = await fred.activeStorage.findOutputs({
633
+ partial: { outputId: 3 }
634
+ })
635
+ expect(ro[0].basketId).toBe(2)
636
+ expect(ro[0].satoshis).toBe(outputSatoshis3)
637
+
638
+ expect(ro[0].customInstructions).toBe(`3rd payment ${JSON.stringify({ root, repeat: 8 })}`)
639
+ const rtm = await fred.activeStorage.findOutputTagMaps({
640
+ partial: { outputId: 3 }
641
+ })
642
+ const rt1 = await fred.activeStorage.findOutputTags({
643
+ partial: { outputTagId: rtm[0].outputTagId }
644
+ })
645
+ expect(rt1[0].tag).toBe('basket payments')
646
+ const rt2 = await fred.activeStorage.findOutputTags({
647
+ partial: { outputTagId: rtm[1].outputTagId }
648
+ })
649
+ expect(rt2[0].tag).toBe('1st basket payment')
650
+ }
651
+ {
652
+ const ro = await fred.activeStorage.findOutputs({
653
+ partial: { outputId: 4 }
654
+ })
655
+ expect(ro[0].basketId).toBe(2)
656
+ expect(ro[0].satoshis).toBe(outputSatoshis4)
657
+
658
+ expect(ro[0].customInstructions).toBe(`4th payment ${JSON.stringify({ root, repeat: 8 })}`)
659
+ const rtm = await fred.activeStorage.findOutputTagMaps({
660
+ partial: { outputId: 4 }
661
+ })
662
+ const rt1 = await fred.activeStorage.findOutputTags({
663
+ partial: { outputTagId: rtm[0].outputTagId }
664
+ })
665
+ expect(rt1[0].tag).toBe('basket payments')
666
+ const rt2 = await fred.activeStorage.findOutputTags({
667
+ partial: { outputTagId: rtm[1].outputTagId }
668
+ })
669
+ expect(rt2[0].tag).toBe('2nd basket payment')
670
+ }
671
+
672
+ const r = await fred.wallet.internalizeAction(internalizeArgs)
673
+ await expect(Promise.resolve(r)).resolves.toBeTruthy()
674
+
675
+ await fred.activeStorage.destroy()
676
+ }
677
+ }
678
+ for (const ctx of ctxs) {
679
+ await ctx.storage.destroy()
680
+ }
681
+ })
682
+ })