@bsv/wallet-toolbox 2.4.4 → 2.4.20

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 (632) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE.txt +58 -0
  3. package/README.md +98 -36
  4. package/docs/action-batch-planning.md +117 -14
  5. package/docs/client.md +1535 -4125
  6. package/docs/monitor.md +34 -137
  7. package/docs/services.md +296 -602
  8. package/docs/setup.md +48 -28
  9. package/docs/storage.md +358 -1901
  10. package/docs/wallet.md +10316 -5665
  11. package/out/src/CWIStyleWalletManager.d.ts +11 -2
  12. package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
  13. package/out/src/CWIStyleWalletManager.js +118 -87
  14. package/out/src/CWIStyleWalletManager.js.map +1 -1
  15. package/out/src/Setup.d.ts +7 -0
  16. package/out/src/Setup.d.ts.map +1 -1
  17. package/out/src/Setup.js +10 -11
  18. package/out/src/Setup.js.map +1 -1
  19. package/out/src/SetupClient.d.ts +2 -0
  20. package/out/src/SetupClient.d.ts.map +1 -1
  21. package/out/src/SetupClient.js +8 -9
  22. package/out/src/SetupClient.js.map +1 -1
  23. package/out/src/SetupWallet.d.ts +6 -0
  24. package/out/src/SetupWallet.d.ts.map +1 -1
  25. package/out/src/ShamirWalletManager.d.ts.map +1 -1
  26. package/out/src/ShamirWalletManager.js.map +1 -1
  27. package/out/src/SimpleWalletManager.d.ts.map +1 -1
  28. package/out/src/SimpleWalletManager.js +2 -5
  29. package/out/src/SimpleWalletManager.js.map +1 -1
  30. package/out/src/Wallet.d.ts +28 -10
  31. package/out/src/Wallet.d.ts.map +1 -1
  32. package/out/src/Wallet.js +146 -125
  33. package/out/src/Wallet.js.map +1 -1
  34. package/out/src/WalletAuthenticationManager.d.ts +11 -1
  35. package/out/src/WalletAuthenticationManager.d.ts.map +1 -1
  36. package/out/src/WalletAuthenticationManager.js +7 -6
  37. package/out/src/WalletAuthenticationManager.js.map +1 -1
  38. package/out/src/WalletLogger.d.ts.map +1 -1
  39. package/out/src/WalletLogger.js +33 -30
  40. package/out/src/WalletLogger.js.map +1 -1
  41. package/out/src/WalletPermissionsManager.d.ts +22 -1
  42. package/out/src/WalletPermissionsManager.d.ts.map +1 -1
  43. package/out/src/WalletPermissionsManager.js +392 -267
  44. package/out/src/WalletPermissionsManager.js.map +1 -1
  45. package/out/src/WalletSettingsManager.d.ts.map +1 -1
  46. package/out/src/WalletSettingsManager.js.map +1 -1
  47. package/out/src/entropy/EntropyCollector.d.ts.map +1 -1
  48. package/out/src/entropy/EntropyCollector.js +6 -8
  49. package/out/src/entropy/EntropyCollector.js.map +1 -1
  50. package/out/src/fundWalletP2PKH.js.map +1 -1
  51. package/out/src/index.all.js.map +1 -1
  52. package/out/src/index.client.js.map +1 -1
  53. package/out/src/index.mobile.d.ts +1 -0
  54. package/out/src/index.mobile.d.ts.map +1 -1
  55. package/out/src/index.mobile.js +1 -0
  56. package/out/src/index.mobile.js.map +1 -1
  57. package/out/src/mockchain/MockChainMigrations.d.ts.map +1 -1
  58. package/out/src/mockchain/MockChainMigrations.js.map +1 -1
  59. package/out/src/mockchain/MockChainStorage.d.ts.map +1 -1
  60. package/out/src/mockchain/MockChainStorage.js.map +1 -1
  61. package/out/src/mockchain/MockChainTracker.d.ts.map +1 -1
  62. package/out/src/mockchain/MockChainTracker.js.map +1 -1
  63. package/out/src/mockchain/MockMiner.d.ts.map +1 -1
  64. package/out/src/mockchain/MockMiner.js.map +1 -1
  65. package/out/src/mockchain/MockServices.d.ts +4 -0
  66. package/out/src/mockchain/MockServices.d.ts.map +1 -1
  67. package/out/src/mockchain/MockServices.js +69 -74
  68. package/out/src/mockchain/MockServices.js.map +1 -1
  69. package/out/src/mockchain/merkleTree.d.ts.map +1 -1
  70. package/out/src/mockchain/merkleTree.js +51 -56
  71. package/out/src/mockchain/merkleTree.js.map +1 -1
  72. package/out/src/monitor/Monitor.d.ts +4 -0
  73. package/out/src/monitor/Monitor.d.ts.map +1 -1
  74. package/out/src/monitor/Monitor.js +56 -54
  75. package/out/src/monitor/Monitor.js.map +1 -1
  76. package/out/src/monitor/MonitorDaemon.d.ts +3 -0
  77. package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
  78. package/out/src/monitor/MonitorDaemon.js +65 -56
  79. package/out/src/monitor/MonitorDaemon.js.map +1 -1
  80. package/out/src/monitor/index.all.js.map +1 -1
  81. package/out/src/monitor/tasks/TaskArcSSE.d.ts +5 -0
  82. package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
  83. package/out/src/monitor/tasks/TaskArcSSE.js +86 -77
  84. package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
  85. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +4 -2
  86. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
  87. package/out/src/monitor/tasks/TaskCheckForProofs.js +132 -131
  88. package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
  89. package/out/src/monitor/tasks/TaskCheckNoSends.d.ts +3 -1
  90. package/out/src/monitor/tasks/TaskCheckNoSends.d.ts.map +1 -1
  91. package/out/src/monitor/tasks/TaskCheckNoSends.js +3 -1
  92. package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
  93. package/out/src/monitor/tasks/TaskCleanupActionBatches.d.ts.map +1 -1
  94. package/out/src/monitor/tasks/TaskCleanupActionBatches.js.map +1 -1
  95. package/out/src/monitor/tasks/TaskClock.d.ts +1 -1
  96. package/out/src/monitor/tasks/TaskClock.d.ts.map +1 -1
  97. package/out/src/monitor/tasks/TaskClock.js +1 -1
  98. package/out/src/monitor/tasks/TaskClock.js.map +1 -1
  99. package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -1
  100. package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -1
  101. package/out/src/monitor/tasks/TaskMineBlock.d.ts +3 -1
  102. package/out/src/monitor/tasks/TaskMineBlock.d.ts.map +1 -1
  103. package/out/src/monitor/tasks/TaskMineBlock.js +3 -1
  104. package/out/src/monitor/tasks/TaskMineBlock.js.map +1 -1
  105. package/out/src/monitor/tasks/TaskMonitorCallHistory.d.ts.map +1 -1
  106. package/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
  107. package/out/src/monitor/tasks/TaskNewHeader.d.ts +4 -3
  108. package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -1
  109. package/out/src/monitor/tasks/TaskNewHeader.js +4 -3
  110. package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
  111. package/out/src/monitor/tasks/TaskPurge.d.ts +3 -1
  112. package/out/src/monitor/tasks/TaskPurge.d.ts.map +1 -1
  113. package/out/src/monitor/tasks/TaskPurge.js +3 -1
  114. package/out/src/monitor/tasks/TaskPurge.js.map +1 -1
  115. package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -1
  116. package/out/src/monitor/tasks/TaskReorg.js.map +1 -1
  117. package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts +3 -1
  118. package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
  119. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +3 -1
  120. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
  121. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts +3 -1
  122. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts.map +1 -1
  123. package/out/src/monitor/tasks/TaskReviewProvenTxs.js +3 -1
  124. package/out/src/monitor/tasks/TaskReviewProvenTxs.js.map +1 -1
  125. package/out/src/monitor/tasks/TaskReviewStatus.d.ts +3 -1
  126. package/out/src/monitor/tasks/TaskReviewStatus.d.ts.map +1 -1
  127. package/out/src/monitor/tasks/TaskReviewStatus.js +3 -1
  128. package/out/src/monitor/tasks/TaskReviewStatus.js.map +1 -1
  129. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +3 -1
  130. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
  131. package/out/src/monitor/tasks/TaskReviewUtxos.js +3 -1
  132. package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
  133. package/out/src/monitor/tasks/TaskSendWaiting.d.ts +3 -0
  134. package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
  135. package/out/src/monitor/tasks/TaskSendWaiting.js +53 -46
  136. package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
  137. package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts +1 -1
  138. package/out/src/monitor/tasks/TaskSyncWhenIdle.d.ts.map +1 -1
  139. package/out/src/monitor/tasks/TaskSyncWhenIdle.js +1 -1
  140. package/out/src/monitor/tasks/TaskSyncWhenIdle.js.map +1 -1
  141. package/out/src/monitor/tasks/TaskUnFail.d.ts +3 -1
  142. package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
  143. package/out/src/monitor/tasks/TaskUnFail.js +3 -1
  144. package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
  145. package/out/src/monitor/tasks/WalletMonitorTask.d.ts.map +1 -1
  146. package/out/src/monitor/tasks/WalletMonitorTask.js.map +1 -1
  147. package/out/src/sdk/ActionBatch.interfaces.d.ts +56 -2
  148. package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
  149. package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -1
  150. package/out/src/sdk/PrivilegedKeyManager.js +3 -3
  151. package/out/src/sdk/PrivilegedKeyManager.js.map +1 -1
  152. package/out/src/sdk/WERR_errors.d.ts +1 -1
  153. package/out/src/sdk/WERR_errors.d.ts.map +1 -1
  154. package/out/src/sdk/WERR_errors.js +2 -2
  155. package/out/src/sdk/WERR_errors.js.map +1 -1
  156. package/out/src/sdk/WalletError.d.ts +3 -0
  157. package/out/src/sdk/WalletError.d.ts.map +1 -1
  158. package/out/src/sdk/WalletError.js +53 -56
  159. package/out/src/sdk/WalletError.js.map +1 -1
  160. package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
  161. package/out/src/sdk/WalletServices.interfaces.d.ts +3 -1
  162. package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
  163. package/out/src/sdk/WalletStorage.interfaces.d.ts +5 -1
  164. package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
  165. package/out/src/sdk/types.js.map +1 -1
  166. package/out/src/services/ServiceCollection.d.ts.map +1 -1
  167. package/out/src/services/ServiceCollection.js.map +1 -1
  168. package/out/src/services/Services.d.ts +8 -2
  169. package/out/src/services/Services.d.ts.map +1 -1
  170. package/out/src/services/Services.js +86 -44
  171. package/out/src/services/Services.js.map +1 -1
  172. package/out/src/services/chaintracker/BHServiceClient.d.ts +7 -7
  173. package/out/src/services/chaintracker/BHServiceClient.d.ts.map +1 -1
  174. package/out/src/services/chaintracker/BHServiceClient.js +9 -9
  175. package/out/src/services/chaintracker/BHServiceClient.js.map +1 -1
  176. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +4 -1
  177. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
  178. package/out/src/services/chaintracker/ChaintracksChainTracker.js +42 -6
  179. package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
  180. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts +4 -4
  181. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts.map +1 -1
  182. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js +1 -1
  183. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js.map +1 -1
  184. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +3 -0
  185. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  186. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +45 -40
  187. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  188. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts +5 -0
  189. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
  190. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +25 -18
  191. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
  192. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +3 -3
  193. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -1
  194. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +6 -7
  195. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -1
  196. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -1
  197. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -1
  198. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
  199. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
  200. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.d.ts.map +1 -1
  201. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
  202. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.d.ts.map +1 -1
  203. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.js.map +1 -1
  204. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
  205. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +0 -1
  206. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
  207. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
  208. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
  209. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
  210. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
  211. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -1
  212. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -1
  213. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts +2 -2
  214. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts.map +1 -1
  215. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js +2 -2
  216. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js.map +1 -1
  217. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
  218. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
  219. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
  220. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
  221. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +12 -2
  222. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
  223. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +110 -103
  224. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
  225. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts +8 -0
  226. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts.map +1 -1
  227. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js +58 -48
  228. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js.map +1 -1
  229. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
  230. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
  231. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
  232. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
  233. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +3 -0
  234. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
  235. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +55 -54
  236. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
  237. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +4 -0
  238. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
  239. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +97 -72
  240. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
  241. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +5 -0
  242. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
  243. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +145 -136
  244. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
  245. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +4 -0
  246. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  247. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +92 -68
  248. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  249. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +43 -0
  250. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
  251. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +76 -0
  252. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
  253. package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.d.ts +18 -0
  254. package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.d.ts.map +1 -0
  255. package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.js +24 -0
  256. package/out/src/services/chaintracker/chaintracks/configureKnexChaintracks.js.map +1 -0
  257. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +2 -3
  258. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -1
  259. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +4 -22
  260. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -1
  261. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts +2 -4
  262. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
  263. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js +12 -25
  264. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
  265. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -3
  266. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
  267. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +4 -22
  268. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
  269. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +2 -1
  270. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
  271. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +3 -15
  272. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
  273. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts +2 -2
  274. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
  275. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +3 -15
  276. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -1
  277. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +2 -1
  278. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -1
  279. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +3 -15
  280. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -1
  281. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +1 -1
  282. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
  283. package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
  284. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +2 -0
  285. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  286. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +64 -61
  287. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  288. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.d.ts.map +1 -1
  289. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js.map +1 -1
  290. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
  291. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js +4 -3
  292. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
  293. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
  294. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
  295. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
  296. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
  297. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +8 -10
  298. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
  299. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +14 -24
  300. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
  301. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  302. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  303. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
  304. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
  305. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +1 -11
  306. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
  307. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +20 -49
  308. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
  309. package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.d.ts.map +1 -1
  310. package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.js +4 -2
  311. package/out/src/services/chaintracker/chaintracks/util/dirtyHashes.js.map +1 -1
  312. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  313. package/out/src/services/createDefaultWalletServicesOptions.d.ts +23 -14
  314. package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
  315. package/out/src/services/createDefaultWalletServicesOptions.js +1 -14
  316. package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
  317. package/out/src/services/networkConfig.js.map +1 -1
  318. package/out/src/services/providers/ARC.d.ts +4 -0
  319. package/out/src/services/providers/ARC.d.ts.map +1 -1
  320. package/out/src/services/providers/ARC.js +96 -83
  321. package/out/src/services/providers/ARC.js.map +1 -1
  322. package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
  323. package/out/src/services/providers/ArcSSEClient.js.map +1 -1
  324. package/out/src/services/providers/Arcade.d.ts +4 -0
  325. package/out/src/services/providers/Arcade.d.ts.map +1 -1
  326. package/out/src/services/providers/Arcade.js +118 -92
  327. package/out/src/services/providers/Arcade.js.map +1 -1
  328. package/out/src/services/providers/Bitails.d.ts.map +1 -1
  329. package/out/src/services/providers/Bitails.js +107 -86
  330. package/out/src/services/providers/Bitails.js.map +1 -1
  331. package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
  332. package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
  333. package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
  334. package/out/src/services/providers/WhatsOnChain.js +19 -6
  335. package/out/src/services/providers/WhatsOnChain.js.map +1 -1
  336. package/out/src/services/providers/exchangeRates.js +1 -1
  337. package/out/src/services/providers/exchangeRates.js.map +1 -1
  338. package/out/src/services/providers/getBeefForTxid.js.map +1 -1
  339. package/out/src/services/providers/whatsOnChainHelpers.js.map +1 -1
  340. package/out/src/signer/WalletSigner.d.ts.map +1 -1
  341. package/out/src/signer/WalletSigner.js.map +1 -1
  342. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts +3 -2
  343. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
  344. package/out/src/signer/actionBatch/ActionBatchPlanner.js +68 -35
  345. package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
  346. package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
  347. package/out/src/signer/actionBatch/ActionBatchWorkspace.js +217 -41
  348. package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
  349. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts +11 -0
  350. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts.map +1 -0
  351. package/out/src/signer/actionBatch/actionBatchBootstrap.js +38 -0
  352. package/out/src/signer/actionBatch/actionBatchBootstrap.js.map +1 -0
  353. package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -1
  354. package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
  355. package/out/src/signer/methods/buildSignableTransaction.js +95 -106
  356. package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
  357. package/out/src/signer/methods/completeSignedTransaction.d.ts +3 -7
  358. package/out/src/signer/methods/completeSignedTransaction.d.ts.map +1 -1
  359. package/out/src/signer/methods/completeSignedTransaction.js +14 -57
  360. package/out/src/signer/methods/completeSignedTransaction.js.map +1 -1
  361. package/out/src/signer/methods/createAction.d.ts.map +1 -1
  362. package/out/src/signer/methods/createAction.js +47 -20
  363. package/out/src/signer/methods/createAction.js.map +1 -1
  364. package/out/src/signer/methods/internalizeAction.d.ts.map +1 -1
  365. package/out/src/signer/methods/internalizeAction.js +4 -4
  366. package/out/src/signer/methods/internalizeAction.js.map +1 -1
  367. package/out/src/signer/methods/proveCertificate.js.map +1 -1
  368. package/out/src/signer/methods/resultBeef.js.map +1 -1
  369. package/out/src/signer/methods/signAction.d.ts.map +1 -1
  370. package/out/src/signer/methods/signAction.js +29 -4
  371. package/out/src/signer/methods/signAction.js.map +1 -1
  372. package/out/src/signer/methods/verifyUnlockScripts.d.ts +17 -0
  373. package/out/src/signer/methods/verifyUnlockScripts.d.ts.map +1 -0
  374. package/out/src/signer/methods/verifyUnlockScripts.js +137 -0
  375. package/out/src/signer/methods/verifyUnlockScripts.js.map +1 -0
  376. package/out/src/storage/StorageIdb.d.ts +5 -3
  377. package/out/src/storage/StorageIdb.d.ts.map +1 -1
  378. package/out/src/storage/StorageIdb.js +80 -27
  379. package/out/src/storage/StorageIdb.js.map +1 -1
  380. package/out/src/storage/StorageKnex.d.ts +10 -1
  381. package/out/src/storage/StorageKnex.d.ts.map +1 -1
  382. package/out/src/storage/StorageKnex.js +118 -9
  383. package/out/src/storage/StorageKnex.js.map +1 -1
  384. package/out/src/storage/StorageProvider.d.ts +41 -13
  385. package/out/src/storage/StorageProvider.d.ts.map +1 -1
  386. package/out/src/storage/StorageProvider.js +241 -158
  387. package/out/src/storage/StorageProvider.js.map +1 -1
  388. package/out/src/storage/StorageReader.d.ts +13 -5
  389. package/out/src/storage/StorageReader.d.ts.map +1 -1
  390. package/out/src/storage/StorageReader.js +3 -0
  391. package/out/src/storage/StorageReader.js.map +1 -1
  392. package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
  393. package/out/src/storage/StorageReaderWriter.js.map +1 -1
  394. package/out/src/storage/StorageSyncReader.d.ts.map +1 -1
  395. package/out/src/storage/StorageSyncReader.js.map +1 -1
  396. package/out/src/storage/WalletStorageManager.d.ts +2 -0
  397. package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
  398. package/out/src/storage/WalletStorageManager.js +25 -6
  399. package/out/src/storage/WalletStorageManager.js.map +1 -1
  400. package/out/src/storage/adminServer/adminServer.d.ts +79 -0
  401. package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
  402. package/out/src/storage/adminServer/adminServer.js +47 -16
  403. package/out/src/storage/adminServer/adminServer.js.map +1 -1
  404. package/out/src/storage/adminServer/adminUi.js.map +1 -1
  405. package/out/src/storage/idbHelpers.js.map +1 -1
  406. package/out/src/storage/index.all.js.map +1 -1
  407. package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -1
  408. package/out/src/storage/methods/ListActionsSpecOp.js +48 -71
  409. package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -1
  410. package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
  411. package/out/src/storage/methods/ListOutputsSpecOp.js +29 -27
  412. package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
  413. package/out/src/storage/methods/actionBatch.d.ts +2 -1
  414. package/out/src/storage/methods/actionBatch.d.ts.map +1 -1
  415. package/out/src/storage/methods/actionBatch.js +143 -50
  416. package/out/src/storage/methods/actionBatch.js.map +1 -1
  417. package/out/src/storage/methods/actionBatchBlobs.d.ts +6 -3
  418. package/out/src/storage/methods/actionBatchBlobs.d.ts.map +1 -1
  419. package/out/src/storage/methods/actionBatchBlobs.js +77 -14
  420. package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
  421. package/out/src/storage/methods/actionBatchValidation.d.ts +6 -4
  422. package/out/src/storage/methods/actionBatchValidation.d.ts.map +1 -1
  423. package/out/src/storage/methods/actionBatchValidation.js +261 -155
  424. package/out/src/storage/methods/actionBatchValidation.js.map +1 -1
  425. package/out/src/storage/methods/actionPlanning.js.map +1 -1
  426. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +0 -21
  427. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
  428. package/out/src/storage/methods/attemptToPostReqsToNetwork.js +43 -51
  429. package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
  430. package/out/src/storage/methods/createAction.d.ts +1 -1
  431. package/out/src/storage/methods/createAction.d.ts.map +1 -1
  432. package/out/src/storage/methods/createAction.js +57 -38
  433. package/out/src/storage/methods/createAction.js.map +1 -1
  434. package/out/src/storage/methods/generateChange.d.ts +2 -2
  435. package/out/src/storage/methods/generateChange.d.ts.map +1 -1
  436. package/out/src/storage/methods/generateChange.js +66 -38
  437. package/out/src/storage/methods/generateChange.js.map +1 -1
  438. package/out/src/storage/methods/getBeefForTransaction.d.ts.map +1 -1
  439. package/out/src/storage/methods/getBeefForTransaction.js +48 -42
  440. package/out/src/storage/methods/getBeefForTransaction.js.map +1 -1
  441. package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -1
  442. package/out/src/storage/methods/getSyncChunk.js +8 -6
  443. package/out/src/storage/methods/getSyncChunk.js.map +1 -1
  444. package/out/src/storage/methods/internalizeAction.js +145 -121
  445. package/out/src/storage/methods/internalizeAction.js.map +1 -1
  446. package/out/src/storage/methods/listActionsIdb.js.map +1 -1
  447. package/out/src/storage/methods/listActionsKnex.js +1 -1
  448. package/out/src/storage/methods/listActionsKnex.js.map +1 -1
  449. package/out/src/storage/methods/listCertificates.d.ts +1 -1
  450. package/out/src/storage/methods/listCertificates.d.ts.map +1 -1
  451. package/out/src/storage/methods/listCertificates.js +1 -1
  452. package/out/src/storage/methods/listCertificates.js.map +1 -1
  453. package/out/src/storage/methods/listOutputsIdb.d.ts +1 -1
  454. package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
  455. package/out/src/storage/methods/listOutputsIdb.js +133 -152
  456. package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
  457. package/out/src/storage/methods/listOutputsKnex.d.ts +1 -1
  458. package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
  459. package/out/src/storage/methods/listOutputsKnex.js +213 -254
  460. package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
  461. package/out/src/storage/methods/managedChange.d.ts +3 -3
  462. package/out/src/storage/methods/managedChange.d.ts.map +1 -1
  463. package/out/src/storage/methods/managedChange.js +1 -2
  464. package/out/src/storage/methods/managedChange.js.map +1 -1
  465. package/out/src/storage/methods/offsetKey.d.ts.map +1 -1
  466. package/out/src/storage/methods/offsetKey.js +0 -1
  467. package/out/src/storage/methods/offsetKey.js.map +1 -1
  468. package/out/src/storage/methods/processAction.d.ts +2 -0
  469. package/out/src/storage/methods/processAction.d.ts.map +1 -1
  470. package/out/src/storage/methods/processAction.js +8 -8
  471. package/out/src/storage/methods/processAction.js.map +1 -1
  472. package/out/src/storage/methods/purgeData.d.ts.map +1 -1
  473. package/out/src/storage/methods/purgeData.js +157 -179
  474. package/out/src/storage/methods/purgeData.js.map +1 -1
  475. package/out/src/storage/methods/purgeDataIdb.d.ts +1 -1
  476. package/out/src/storage/methods/purgeDataIdb.d.ts.map +1 -1
  477. package/out/src/storage/methods/purgeDataIdb.js +1 -1
  478. package/out/src/storage/methods/purgeDataIdb.js.map +1 -1
  479. package/out/src/storage/methods/reviewStatus.js +6 -6
  480. package/out/src/storage/methods/reviewStatus.js.map +1 -1
  481. package/out/src/storage/methods/reviewStatusIdb.js.map +1 -1
  482. package/out/src/storage/methods/utils.Buffer.js.map +1 -1
  483. package/out/src/storage/methods/utils.js.map +1 -1
  484. package/out/src/storage/portable/index.js +2 -2
  485. package/out/src/storage/portable/index.js.map +1 -1
  486. package/out/src/storage/remoting/BinaryJson.d.ts.map +1 -1
  487. package/out/src/storage/remoting/BinaryJson.js +84 -38
  488. package/out/src/storage/remoting/BinaryJson.js.map +1 -1
  489. package/out/src/storage/remoting/KnexSessionManager.d.ts.map +1 -1
  490. package/out/src/storage/remoting/KnexSessionManager.js.map +1 -1
  491. package/out/src/storage/remoting/RateLimitPolicy.d.ts +10 -0
  492. package/out/src/storage/remoting/RateLimitPolicy.d.ts.map +1 -0
  493. package/out/src/storage/remoting/RateLimitPolicy.js +37 -0
  494. package/out/src/storage/remoting/RateLimitPolicy.js.map +1 -0
  495. package/out/src/storage/remoting/StorageClient.d.ts +2 -0
  496. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
  497. package/out/src/storage/remoting/StorageClient.js +82 -50
  498. package/out/src/storage/remoting/StorageClient.js.map +1 -1
  499. package/out/src/storage/remoting/StorageClientBase.d.ts +15 -5
  500. package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
  501. package/out/src/storage/remoting/StorageClientBase.js +61 -3
  502. package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
  503. package/out/src/storage/remoting/StorageMobile.d.ts.map +1 -1
  504. package/out/src/storage/remoting/StorageMobile.js +34 -22
  505. package/out/src/storage/remoting/StorageMobile.js.map +1 -1
  506. package/out/src/storage/remoting/StorageServer.d.ts +52 -1
  507. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
  508. package/out/src/storage/remoting/StorageServer.js +340 -201
  509. package/out/src/storage/remoting/StorageServer.js.map +1 -1
  510. package/out/src/storage/remoting/edgePolicy.d.ts +57 -0
  511. package/out/src/storage/remoting/edgePolicy.d.ts.map +1 -0
  512. package/out/src/storage/remoting/edgePolicy.js +387 -0
  513. package/out/src/storage/remoting/edgePolicy.js.map +1 -0
  514. package/out/src/storage/remoting/entityValidationHelpers.d.ts.map +1 -1
  515. package/out/src/storage/remoting/entityValidationHelpers.js +22 -5
  516. package/out/src/storage/remoting/entityValidationHelpers.js.map +1 -1
  517. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
  518. package/out/src/storage/schema/KnexMigrations.js +12 -0
  519. package/out/src/storage/schema/KnexMigrations.js.map +1 -1
  520. package/out/src/storage/schema/entities/EntityBase.d.ts.map +1 -1
  521. package/out/src/storage/schema/entities/EntityBase.js.map +1 -1
  522. package/out/src/storage/schema/entities/EntityCertificate.d.ts.map +1 -1
  523. package/out/src/storage/schema/entities/EntityCertificate.js.map +1 -1
  524. package/out/src/storage/schema/entities/EntityCertificateField.d.ts.map +1 -1
  525. package/out/src/storage/schema/entities/EntityCertificateField.js.map +1 -1
  526. package/out/src/storage/schema/entities/EntityCommission.d.ts.map +1 -1
  527. package/out/src/storage/schema/entities/EntityCommission.js.map +1 -1
  528. package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
  529. package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
  530. package/out/src/storage/schema/entities/EntityOutputBasket.d.ts.map +1 -1
  531. package/out/src/storage/schema/entities/EntityOutputBasket.js.map +1 -1
  532. package/out/src/storage/schema/entities/EntityOutputTag.d.ts.map +1 -1
  533. package/out/src/storage/schema/entities/EntityOutputTag.js.map +1 -1
  534. package/out/src/storage/schema/entities/EntityOutputTagMap.d.ts.map +1 -1
  535. package/out/src/storage/schema/entities/EntityOutputTagMap.js.map +1 -1
  536. package/out/src/storage/schema/entities/EntityProvenTx.d.ts +3 -0
  537. package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
  538. package/out/src/storage/schema/entities/EntityProvenTx.js +46 -36
  539. package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
  540. package/out/src/storage/schema/entities/EntityProvenTxReq.d.ts +2 -2
  541. package/out/src/storage/schema/entities/EntityProvenTxReq.d.ts.map +1 -1
  542. package/out/src/storage/schema/entities/EntityProvenTxReq.js +12 -10
  543. package/out/src/storage/schema/entities/EntityProvenTxReq.js.map +1 -1
  544. package/out/src/storage/schema/entities/EntitySyncState.d.ts.map +1 -1
  545. package/out/src/storage/schema/entities/EntitySyncState.js +25 -34
  546. package/out/src/storage/schema/entities/EntitySyncState.js.map +1 -1
  547. package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
  548. package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
  549. package/out/src/storage/schema/entities/EntityTxLabel.d.ts.map +1 -1
  550. package/out/src/storage/schema/entities/EntityTxLabel.js.map +1 -1
  551. package/out/src/storage/schema/entities/EntityTxLabelMap.d.ts.map +1 -1
  552. package/out/src/storage/schema/entities/EntityTxLabelMap.js.map +1 -1
  553. package/out/src/storage/schema/entities/EntityUser.d.ts.map +1 -1
  554. package/out/src/storage/schema/entities/EntityUser.js.map +1 -1
  555. package/out/src/storage/schema/entities/MergeEntity.d.ts.map +1 -1
  556. package/out/src/storage/schema/entities/MergeEntity.js +9 -14
  557. package/out/src/storage/schema/entities/MergeEntity.js.map +1 -1
  558. package/out/src/storage/schema/tables/TableActionBatch.d.ts +3 -1
  559. package/out/src/storage/schema/tables/TableActionBatch.d.ts.map +1 -1
  560. package/out/src/storage/schema/tables/TableAuthSession.js.map +1 -1
  561. package/out/src/storage/storageProviderHelpers.js.map +1 -1
  562. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts +3 -0
  563. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
  564. package/out/src/storage/sync/StorageMySQLDojoReader.js +30 -16
  565. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
  566. package/out/src/utility/Format.d.ts.map +1 -1
  567. package/out/src/utility/Format.js +2 -2
  568. package/out/src/utility/Format.js.map +1 -1
  569. package/out/src/utility/ScriptTemplateBRC29.d.ts.map +1 -1
  570. package/out/src/utility/ScriptTemplateBRC29.js.map +1 -1
  571. package/out/src/utility/actionBatchDigest.d.ts.map +1 -1
  572. package/out/src/utility/actionBatchDigest.js +41 -3
  573. package/out/src/utility/actionBatchDigest.js.map +1 -1
  574. package/out/src/utility/actionBatchPack.d.ts +16 -0
  575. package/out/src/utility/actionBatchPack.d.ts.map +1 -0
  576. package/out/src/utility/actionBatchPack.js +220 -0
  577. package/out/src/utility/actionBatchPack.js.map +1 -0
  578. package/out/src/utility/aggregateResults.d.ts.map +1 -1
  579. package/out/src/utility/aggregateResults.js.map +1 -1
  580. package/out/src/utility/beefForTxids.js.map +1 -1
  581. package/out/src/utility/brc114ActionTimeLabels.d.ts.map +1 -1
  582. package/out/src/utility/brc114ActionTimeLabels.js +26 -30
  583. package/out/src/utility/brc114ActionTimeLabels.js.map +1 -1
  584. package/out/src/utility/formatUnknown.d.ts +6 -0
  585. package/out/src/utility/formatUnknown.d.ts.map +1 -0
  586. package/out/src/utility/formatUnknown.js +39 -0
  587. package/out/src/utility/formatUnknown.js.map +1 -0
  588. package/out/src/utility/hashWasm.d.ts +5 -0
  589. package/out/src/utility/hashWasm.d.ts.map +1 -0
  590. package/out/src/utility/hashWasm.js +15 -0
  591. package/out/src/utility/hashWasm.js.map +1 -0
  592. package/out/src/utility/identityUtils.d.ts.map +1 -1
  593. package/out/src/utility/identityUtils.js +2 -4
  594. package/out/src/utility/identityUtils.js.map +1 -1
  595. package/out/src/utility/parseTxScriptOffsets.d.ts +1 -1
  596. package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -1
  597. package/out/src/utility/parseTxScriptOffsets.js +1 -1
  598. package/out/src/utility/parseTxScriptOffsets.js.map +1 -1
  599. package/out/src/utility/stampLog.d.ts.map +1 -1
  600. package/out/src/utility/stampLog.js +49 -42
  601. package/out/src/utility/stampLog.js.map +1 -1
  602. package/out/src/utility/traceContext.d.ts +13 -0
  603. package/out/src/utility/traceContext.d.ts.map +1 -0
  604. package/out/src/utility/traceContext.js +34 -0
  605. package/out/src/utility/traceContext.js.map +1 -0
  606. package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -1
  607. package/out/src/utility/tscProofToMerklePath.js +1 -1
  608. package/out/src/utility/tscProofToMerklePath.js.map +1 -1
  609. package/out/src/utility/utilityHelpers.buffer.js.map +1 -1
  610. package/out/src/utility/utilityHelpers.d.ts +2 -2
  611. package/out/src/utility/utilityHelpers.d.ts.map +1 -1
  612. package/out/src/utility/utilityHelpers.js +8 -4
  613. package/out/src/utility/utilityHelpers.js.map +1 -1
  614. package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -1
  615. package/out/src/utility/utilityHelpers.noBuffer.js +1 -2
  616. package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -1
  617. package/out/src/wab-client/WABClient.d.ts.map +1 -1
  618. package/out/src/wab-client/WABClient.js +1 -1
  619. package/out/src/wab-client/WABClient.js.map +1 -1
  620. package/out/src/wab-client/WABTransport.d.ts +33 -5
  621. package/out/src/wab-client/WABTransport.d.ts.map +1 -1
  622. package/out/src/wab-client/WABTransport.js +240 -120
  623. package/out/src/wab-client/WABTransport.js.map +1 -1
  624. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -1
  625. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -1
  626. package/out/src/wab-client/auth-method-interactors/DevConsoleInteractor.js.map +1 -1
  627. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js.map +1 -1
  628. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts.map +1 -1
  629. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js +1 -1
  630. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js.map +1 -1
  631. package/package.json +57 -21
  632. package/license.md +0 -28
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WalletPermissionsManager = void 0;
4
4
  const sdk_1 = require("@bsv/sdk");
5
5
  const brc114ActionTimeLabels_1 = require("./utility/brc114ActionTimeLabels");
6
- /// /// TODO: ADD SUPPORT FOR ADMIN COUNTERPARTIES BASED ON WALLET STORAGE
7
- /// /// PROHIBITION OF SPECIAL OPERATIONS IS ALSO CRITICAL.
8
- /// /// !!!!!!!! SECURITY-CRITICAL ADDITION DO NOT USE UNTIL IMPLEMENTED.
6
+ // Security invariant: only the configured admin originator bypasses permission
7
+ // prompts. Admin-reserved protocols, baskets, and labels are rejected for all
8
+ // other originators; counterparty bypasses require an explicit configuration
9
+ // allowlist.
9
10
  function deepEqual(object1, object2) {
10
11
  if (object1 === null || object1 === undefined || object2 === null || object2 === undefined) {
11
12
  return object1 === object2;
@@ -126,6 +127,7 @@ class WalletPermissionsManager {
126
127
  * Configuration that determines whether to skip or apply various checks and encryption.
127
128
  */
128
129
  config;
130
+ telemetry;
129
131
  /**
130
132
  * Constructs a new Permissions Manager instance.
131
133
  *
@@ -136,6 +138,7 @@ class WalletPermissionsManager {
136
138
  constructor(underlyingWallet, adminOriginator, config = {}) {
137
139
  this.underlying = underlyingWallet;
138
140
  this.adminOriginator = this.normalizeOriginator(adminOriginator) || adminOriginator;
141
+ this.telemetry = new sdk_1.Telemetry(config.telemetry);
139
142
  // Default all config options to true unless specified
140
143
  this.config = {
141
144
  seekProtocolPermissionsForSigning: true,
@@ -363,12 +366,24 @@ class WalletPermissionsManager {
363
366
  */
364
367
  async callEvent(eventName, param) {
365
368
  const arr = this.callbacks[eventName] || [];
366
- for (const cb of arr) {
369
+ for (const [callbackIndex, cb] of arr.entries()) {
367
370
  if (typeof cb === 'function') {
368
371
  try {
369
- await cb(param);
372
+ if (this.telemetry.enabled && typeof param === 'object' && param != null) {
373
+ await this.telemetry.withSpan('wallet.permission.callback', {
374
+ component: 'wallet-permissions',
375
+ carrier: param,
376
+ attributes: {
377
+ 'permission.callback': eventName,
378
+ 'permission.callback_index': callbackIndex
379
+ }
380
+ }, async () => await cb(param));
381
+ }
382
+ else {
383
+ await cb(param);
384
+ }
370
385
  }
371
- catch (_callbackError) {
386
+ catch {
372
387
  // Intentionally swallow errors from user-provided callbacks to prevent
373
388
  // a misbehaving callback from disrupting the event dispatch loop.
374
389
  }
@@ -568,16 +583,16 @@ class WalletPermissionsManager {
568
583
  * Throws an error on the first mismatch.
569
584
  */
570
585
  validateGrantedPermissionsSubset(granted, requested) {
571
- if ((granted.spendingAuthorization != null) && (requested.spendingAuthorization == null)) {
586
+ if (granted.spendingAuthorization != null && requested.spendingAuthorization == null) {
572
587
  throw new Error('Granted spending authorization was not part of the original request.');
573
588
  }
574
- if (granted.protocolPermissions?.some(g => (requested.protocolPermissions?.find(r => deepEqual(r, g))) == null)) {
589
+ if (granted.protocolPermissions?.some(g => requested.protocolPermissions?.find(r => deepEqual(r, g)) == null)) {
575
590
  throw new Error('Granted protocol permissions are not a subset of the original request.');
576
591
  }
577
- if (granted.basketAccess?.some(g => (requested.basketAccess?.find(r => deepEqual(r, g))) == null)) {
592
+ if (granted.basketAccess?.some(g => requested.basketAccess?.find(r => deepEqual(r, g)) == null)) {
578
593
  throw new Error('Granted basket access permissions are not a subset of the original request.');
579
594
  }
580
- if (granted.certificateAccess?.some(g => (requested.certificateAccess?.find(r => deepEqual(r, g))) == null)) {
595
+ if (granted.certificateAccess?.some(g => requested.certificateAccess?.find(r => deepEqual(r, g)) == null)) {
581
596
  throw new Error('Granted certificate access permissions are not a subset of the original request.');
582
597
  }
583
598
  }
@@ -707,13 +722,21 @@ class WalletPermissionsManager {
707
722
  if (await this.hasRecentOrPendingGrant(cacheKey))
708
723
  return true;
709
724
  // 4) Attempt to find a valid token in the internal basket
710
- const token = await this.findProtocolToken(originator, privileged, protocolID, counterparty, /* includeExpired= */ true, lookupValues);
725
+ const token = await this.findProtocolToken(originator, privileged, protocolID, counterparty,
726
+ /* includeExpired= */ true, lookupValues);
711
727
  if (token == null) {
712
728
  // No token found => request a new one if allowed
713
729
  if (!seekPermission)
714
730
  throw new Error('No protocol permission token found (seekPermission=false).');
715
731
  return await this.requestPermissionFlow({
716
- type: 'protocol', originator, privileged, protocolID, counterparty, usageType, reason, renewal: false
732
+ type: 'protocol',
733
+ originator,
734
+ privileged,
735
+ protocolID,
736
+ counterparty,
737
+ usageType,
738
+ reason,
739
+ renewal: false
717
740
  });
718
741
  }
719
742
  if (this.isTokenExpired(token.expiry)) {
@@ -722,8 +745,15 @@ class WalletPermissionsManager {
722
745
  throw new Error('Protocol permission expired and no further user consent allowed (seekPermission=false).');
723
746
  }
724
747
  return await this.requestPermissionFlow({
725
- type: 'protocol', originator, privileged, protocolID, counterparty, usageType, reason,
726
- renewal: true, previousToken: token
748
+ type: 'protocol',
749
+ originator,
750
+ privileged,
751
+ protocolID,
752
+ counterparty,
753
+ usageType,
754
+ reason,
755
+ renewal: true,
756
+ previousToken: token
727
757
  });
728
758
  }
729
759
  // valid and unexpired
@@ -756,7 +786,13 @@ class WalletPermissionsManager {
756
786
  if (!seekPermission)
757
787
  throw new Error('Basket permission expired (seekPermission=false).');
758
788
  return await this.requestPermissionFlow({
759
- type: 'basket', originator, basket, usageType, reason, renewal: true, previousToken: token
789
+ type: 'basket',
790
+ originator,
791
+ basket,
792
+ usageType,
793
+ reason,
794
+ renewal: true,
795
+ previousToken: token
760
796
  });
761
797
  }
762
798
  this.cachePermission(cacheKey, token.expiry);
@@ -999,7 +1035,7 @@ class WalletPermissionsManager {
999
1035
  }
1000
1036
  async fetchManifestPermissions(originator) {
1001
1037
  const cached = this.manifestCache.get(originator);
1002
- if ((cached != null) && Date.now() - cached.fetchedAt < WalletPermissionsManager.MANIFEST_CACHE_TTL_MS) {
1038
+ if (cached != null && Date.now() - cached.fetchedAt < WalletPermissionsManager.MANIFEST_CACHE_TTL_MS) {
1003
1039
  return {
1004
1040
  groupPermissions: cached.groupPermissions,
1005
1041
  counterpartyPermissions: cached.counterpartyPermissions
@@ -1026,7 +1062,7 @@ class WalletPermissionsManager {
1026
1062
  return { groupPermissions, counterpartyPermissions: counterpartyPermissionsDeclared };
1027
1063
  }
1028
1064
  }
1029
- catch (_manifestFetchError) {
1065
+ catch {
1030
1066
  // Manifest fetch or parse failed — fall through to return null/null defaults below
1031
1067
  }
1032
1068
  const result = { groupPermissions: null, counterpartyPermissions: null };
@@ -1482,12 +1518,36 @@ class WalletPermissionsManager {
1482
1518
  * and return a promise that resolves once permission is granted or rejects if denied.
1483
1519
  */
1484
1520
  async requestPermissionFlow(r) {
1521
+ if (!this.telemetry.enabled)
1522
+ return await this.requestPermissionFlowCore(r);
1523
+ return await this.telemetry.withSpan('wallet.permission.request', {
1524
+ component: 'wallet-permissions',
1525
+ carrier: r,
1526
+ attributes: {
1527
+ 'permission.type': r.type,
1528
+ 'permission.renewal': r.renewal === true
1529
+ }
1530
+ }, async (span) => {
1531
+ const result = await this.requestPermissionFlowCore(r, span.context);
1532
+ span.end({
1533
+ attributes: {
1534
+ 'permission.granted': result
1535
+ }
1536
+ });
1537
+ return result;
1538
+ });
1539
+ }
1540
+ async requestPermissionFlowCore(r, context) {
1541
+ if (context != null)
1542
+ this.telemetry.bindContext(r, context);
1485
1543
  const normalizedOriginator = this.normalizeOriginator(r.originator) || r.originator;
1486
1544
  const preparedRequest = {
1487
1545
  ...r,
1488
1546
  originator: normalizedOriginator,
1489
1547
  displayOriginator: r.displayOriginator ?? r.previousToken?.rawOriginator ?? r.originator
1490
1548
  };
1549
+ if (context != null)
1550
+ this.telemetry.bindContext(preparedRequest, context);
1491
1551
  if (preparedRequest.type === 'protocol' && preparedRequest.protocolID?.[0] === 1) {
1492
1552
  preparedRequest.counterparty = '';
1493
1553
  }
@@ -1513,7 +1573,7 @@ class WalletPermissionsManager {
1513
1573
  /** Returns true when an active-request queue already has pending waiters for this key. */
1514
1574
  isPiggybacking(key) {
1515
1575
  const q = this.activeRequests.get(key);
1516
- return (q != null) && q.pending.length > 0;
1576
+ return q != null && q.pending.length > 0;
1517
1577
  }
1518
1578
  /** Appends to an existing request queue and waits for resolution. */
1519
1579
  async piggybackOnExistingQueue(key) {
@@ -1523,7 +1583,7 @@ class WalletPermissionsManager {
1523
1583
  });
1524
1584
  }
1525
1585
  /** Runs the grouped-permission flow (with or without a lock) and checks post-group satisfaction. */
1526
- async resolveGroupedFlow(preparedRequest, key) {
1586
+ async resolveGroupedFlow(preparedRequest, _key) {
1527
1587
  const hadPendingGroupedFlowBefore = this.config.seekGroupedPermission && this.groupedPermissionFlowTail.has(preparedRequest.originator);
1528
1588
  let groupResult;
1529
1589
  if (this.config.seekGroupedPermission) {
@@ -1565,23 +1625,27 @@ class WalletPermissionsManager {
1565
1625
  async firePermissionRequestEvent(request, key) {
1566
1626
  switch (request.type) {
1567
1627
  case 'protocol':
1568
- await this.callEvent('onProtocolPermissionRequested', {
1628
+ await this.callPermissionEvent(request, 'onProtocolPermissionRequested', {
1569
1629
  ...request,
1570
1630
  counterparty: request.protocolID?.[0] === 1 ? undefined : request.counterparty,
1571
1631
  requestID: key
1572
1632
  });
1573
1633
  break;
1574
1634
  case 'basket':
1575
- await this.callEvent('onBasketAccessRequested', { ...request, requestID: key });
1635
+ await this.callPermissionEvent(request, 'onBasketAccessRequested', { ...request, requestID: key });
1576
1636
  break;
1577
1637
  case 'certificate':
1578
- await this.callEvent('onCertificateAccessRequested', { ...request, requestID: key });
1638
+ await this.callPermissionEvent(request, 'onCertificateAccessRequested', { ...request, requestID: key });
1579
1639
  break;
1580
1640
  case 'spending':
1581
- await this.callEvent('onSpendingAuthorizationRequested', { ...request, requestID: key });
1641
+ await this.callPermissionEvent(request, 'onSpendingAuthorizationRequested', { ...request, requestID: key });
1582
1642
  break;
1583
1643
  }
1584
1644
  }
1645
+ async callPermissionEvent(request, eventName, param) {
1646
+ this.telemetry.linkContext(request, param);
1647
+ await this.callEvent(eventName, param);
1648
+ }
1585
1649
  /* ---------------------------------------------------------------------
1586
1650
  * 4) SEARCH / DECODE / DECRYPT ON-CHAIN TOKENS (PushDrop Scripts)
1587
1651
  * --------------------------------------------------------------------- */
@@ -1660,7 +1724,7 @@ class WalletPermissionsManager {
1660
1724
  }, this.adminOriginator);
1661
1725
  return plaintext;
1662
1726
  }
1663
- catch (_decryptionError) {
1727
+ catch {
1664
1728
  // Decryption failed (e.g. wrong key, unencrypted legacy value) — return the raw bytes unchanged
1665
1729
  return ciphertext;
1666
1730
  }
@@ -1695,7 +1759,7 @@ class WalletPermissionsManager {
1695
1759
  }, this.adminOriginator);
1696
1760
  return sdk_1.Utils.toUTF8(plaintext);
1697
1761
  }
1698
- catch (_decryptionError) {
1762
+ catch {
1699
1763
  // Decryption failed (e.g. wrong key, unencrypted legacy value) — return original string unchanged
1700
1764
  return ciphertext;
1701
1765
  }
@@ -1715,6 +1779,108 @@ class WalletPermissionsManager {
1715
1779
  const cptyDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fields[5]));
1716
1780
  return { domainDecoded, expiryDecoded, privDecoded, secLevelDecoded, protoNameDecoded, cptyDecoded };
1717
1781
  }
1782
+ protocolTokenTags(originator, privileged, securityLevel, protocolName, counterparty) {
1783
+ const tags = [
1784
+ `originator ${originator}`,
1785
+ `privileged ${!!privileged}`,
1786
+ `protocolName ${protocolName}`,
1787
+ `protocolSecurityLevel ${securityLevel}`
1788
+ ];
1789
+ if (securityLevel === 2)
1790
+ tags.push(`counterparty ${counterparty}`);
1791
+ return tags;
1792
+ }
1793
+ async parseProtocolTokenOutput(result, output, expected) {
1794
+ const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
1795
+ const tx = this.transactionFromResultBeef(result, txid);
1796
+ const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1797
+ if (decoded?.fields == null || decoded.fields.length < 6)
1798
+ return undefined;
1799
+ const fields = await this.decryptProtocolTokenFields(decoded.fields);
1800
+ if (this.normalizeOriginator(fields.domainDecoded) !== expected.originator)
1801
+ return undefined;
1802
+ const matches = fields.privDecoded === !!expected.privileged &&
1803
+ fields.secLevelDecoded === expected.securityLevel &&
1804
+ fields.protoNameDecoded === expected.protocolName &&
1805
+ (fields.secLevelDecoded !== 2 || fields.cptyDecoded === expected.counterparty);
1806
+ if (!matches)
1807
+ return undefined;
1808
+ return {
1809
+ tx: tx.toBEEF(),
1810
+ txid,
1811
+ outputIndex,
1812
+ outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1813
+ satoshis: output.satoshis,
1814
+ originator: expected.originator,
1815
+ rawOriginator: fields.domainDecoded,
1816
+ privileged: expected.privileged,
1817
+ protocol: expected.protocolName,
1818
+ securityLevel: expected.securityLevel,
1819
+ expiry: fields.expiryDecoded,
1820
+ counterparty: fields.cptyDecoded
1821
+ };
1822
+ }
1823
+ async parseBasketTokenOutput(result, output, originator, basket) {
1824
+ const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
1825
+ const tx = this.transactionFromResultBeef(result, txid);
1826
+ const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1827
+ if (decoded?.fields == null || decoded.fields.length < 3)
1828
+ return undefined;
1829
+ const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[0]));
1830
+ if (this.normalizeOriginator(domainDecoded) !== originator)
1831
+ return undefined;
1832
+ const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[1])), 10);
1833
+ const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(decoded.fields[2]));
1834
+ if (basketDecoded !== basket)
1835
+ return undefined;
1836
+ return {
1837
+ tx: tx.toBEEF(),
1838
+ txid,
1839
+ outputIndex,
1840
+ outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1841
+ satoshis: output.satoshis,
1842
+ originator,
1843
+ rawOriginator: domainDecoded,
1844
+ basketName: basketDecoded,
1845
+ expiry: expiryDecoded
1846
+ };
1847
+ }
1848
+ async parseCertificateTokenOutput(result, output, expected) {
1849
+ const [txid, outputIndex] = this.parseOutpoint(output.outpoint);
1850
+ const tx = this.transactionFromResultBeef(result, txid);
1851
+ const decoded = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1852
+ if (decoded?.fields == null || decoded.fields.length < 6)
1853
+ return undefined;
1854
+ const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = decoded.fields;
1855
+ const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
1856
+ if (this.normalizeOriginator(domainDecoded) !== expected.originator)
1857
+ return undefined;
1858
+ const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
1859
+ const privileged = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
1860
+ const certType = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(typeRaw));
1861
+ const verifier = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(verifierRaw));
1862
+ const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
1863
+ const metadataMatches = privileged === !!expected.privileged && certType === expected.certType && verifier === expected.verifier;
1864
+ if (!metadataMatches)
1865
+ return undefined;
1866
+ const availableFields = new Set(allFields);
1867
+ if (expected.fields.some(field => !availableFields.has(field)))
1868
+ return undefined;
1869
+ return {
1870
+ tx: tx.toBEEF(),
1871
+ txid,
1872
+ outputIndex,
1873
+ outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1874
+ satoshis: output.satoshis,
1875
+ originator: expected.originator,
1876
+ rawOriginator: domainDecoded,
1877
+ privileged: expected.privileged,
1878
+ verifier,
1879
+ certType,
1880
+ certFields: allFields,
1881
+ expiry: expiryDecoded
1882
+ };
1883
+ }
1718
1884
  /** Parses outpoint string "txid.vout" into [txid, outputIndex]. */
1719
1885
  parseOutpoint(outpoint) {
1720
1886
  const [txid, indexStr] = outpoint.split('.');
@@ -1730,7 +1896,7 @@ class WalletPermissionsManager {
1730
1896
  if (!/^[0-9a-f]{64}$/.test(hex))
1731
1897
  return hex;
1732
1898
  const bytes = hex.match(/../g);
1733
- return (bytes != null) ? bytes.reverse().join('') : hex;
1899
+ return bytes != null ? bytes.reverse().join('') : hex;
1734
1900
  }
1735
1901
  /**
1736
1902
  * Returns true when an outpoint string (e.g. "txid.vout" or "txid:vout") refers to `token`.
@@ -1778,52 +1944,25 @@ class WalletPermissionsManager {
1778
1944
  const [secLevel, protoName] = protocolID;
1779
1945
  const originsToTry = originatorLookupValues?.length ? originatorLookupValues : [originator];
1780
1946
  for (const originTag of originsToTry) {
1781
- const tags = [
1782
- `originator ${originTag}`,
1783
- `privileged ${!!privileged}`,
1784
- `protocolName ${protoName}`,
1785
- `protocolSecurityLevel ${secLevel}`
1786
- ];
1787
- if (secLevel === 2) {
1788
- tags.push(`counterparty ${counterparty}`);
1789
- }
1790
1947
  const result = await this.underlying.listOutputs({
1791
1948
  basket: BASKET_MAP.protocol,
1792
- tags,
1949
+ tags: this.protocolTokenTags(originTag, privileged, secLevel, protoName, counterparty),
1793
1950
  tagQueryMode: 'all',
1794
1951
  include: 'entire transactions'
1795
1952
  }, this.adminOriginator);
1796
1953
  for (const out of result.outputs) {
1797
- const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
1798
- const tx = this.transactionFromResultBeef(result, txid);
1799
- const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1800
- if (dec?.fields == null || dec.fields.length < 6)
1801
- continue;
1802
- const f = await this.decryptProtocolTokenFields(dec.fields);
1803
- if (this.normalizeOriginator(f.domainDecoded) !== originator)
1804
- continue;
1805
- if (f.privDecoded !== !!privileged ||
1806
- f.secLevelDecoded !== secLevel ||
1807
- f.protoNameDecoded !== protoName ||
1808
- (f.secLevelDecoded === 2 && f.cptyDecoded !== counterparty)) {
1809
- continue;
1810
- }
1811
- if (!includeExpired && this.isTokenExpired(f.expiryDecoded))
1812
- continue;
1813
- return {
1814
- tx: tx.toBEEF(),
1815
- txid,
1816
- outputIndex,
1817
- outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1818
- satoshis: out.satoshis,
1954
+ const token = await this.parseProtocolTokenOutput(result, out, {
1819
1955
  originator,
1820
- rawOriginator: f.domainDecoded,
1821
1956
  privileged,
1822
- protocol: protoName,
1823
1957
  securityLevel: secLevel,
1824
- expiry: f.expiryDecoded,
1825
- counterparty: f.cptyDecoded
1826
- };
1958
+ protocolName: protoName,
1959
+ counterparty
1960
+ });
1961
+ if (token == null)
1962
+ continue;
1963
+ if (!includeExpired && this.isTokenExpired(token.expiry))
1964
+ continue;
1965
+ return token;
1827
1966
  }
1828
1967
  }
1829
1968
  return undefined;
@@ -1835,53 +1974,26 @@ class WalletPermissionsManager {
1835
1974
  const matches = [];
1836
1975
  const seen = new Set();
1837
1976
  for (const originTag of originsToTry) {
1838
- const tags = [
1839
- `originator ${originTag}`,
1840
- `privileged ${!!privileged}`,
1841
- `protocolName ${protoName}`,
1842
- `protocolSecurityLevel ${secLevel}`
1843
- ];
1844
- if (secLevel === 2) {
1845
- tags.push(`counterparty ${counterparty}`);
1846
- }
1847
1977
  const result = await this.underlying.listOutputs({
1848
1978
  basket: BASKET_MAP.protocol,
1849
- tags,
1979
+ tags: this.protocolTokenTags(originTag, privileged, secLevel, protoName, counterparty),
1850
1980
  tagQueryMode: 'all',
1851
1981
  include: 'entire transactions'
1852
1982
  }, this.adminOriginator);
1853
1983
  for (const out of result.outputs) {
1854
1984
  if (seen.has(out.outpoint))
1855
1985
  continue;
1856
- const [txid, vout] = this.parseOutpoint(out.outpoint);
1857
- const tx = this.transactionFromResultBeef(result, txid);
1858
- const dec = sdk_1.PushDrop.decode(tx.outputs[vout].lockingScript);
1859
- if (dec?.fields == null || dec.fields.length < 6)
1860
- continue;
1861
- const f = await this.decryptProtocolTokenFields(dec.fields);
1862
- if (this.normalizeOriginator(f.domainDecoded) !== originator)
1863
- continue;
1864
- if (f.privDecoded !== !!privileged ||
1865
- f.secLevelDecoded !== secLevel ||
1866
- f.protoNameDecoded !== protoName ||
1867
- (f.secLevelDecoded === 2 && f.cptyDecoded !== counterparty)) {
1868
- continue;
1869
- }
1870
- seen.add(out.outpoint);
1871
- matches.push({
1872
- tx: tx.toBEEF(),
1873
- txid,
1874
- outputIndex: vout,
1875
- outputScript: tx.outputs[vout].lockingScript.toHex(),
1876
- satoshis: out.satoshis,
1986
+ const token = await this.parseProtocolTokenOutput(result, out, {
1877
1987
  originator,
1878
- rawOriginator: f.domainDecoded,
1879
1988
  privileged,
1880
- protocol: protoName,
1881
1989
  securityLevel: secLevel,
1882
- expiry: f.expiryDecoded,
1883
- counterparty: f.cptyDecoded
1990
+ protocolName: protoName,
1991
+ counterparty
1884
1992
  });
1993
+ if (token == null)
1994
+ continue;
1995
+ seen.add(out.outpoint);
1996
+ matches.push(token);
1885
1997
  }
1886
1998
  }
1887
1999
  return matches;
@@ -1897,31 +2009,12 @@ class WalletPermissionsManager {
1897
2009
  include: 'entire transactions'
1898
2010
  }, this.adminOriginator);
1899
2011
  for (const out of result.outputs) {
1900
- const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
1901
- const tx = this.transactionFromResultBeef(result, txid);
1902
- const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1903
- if (!dec?.fields || dec.fields.length < 3)
2012
+ const token = await this.parseBasketTokenOutput(result, out, originator, basket);
2013
+ if (token == null)
1904
2014
  continue;
1905
- const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(dec.fields[0]));
1906
- if (this.normalizeOriginator(domainDecoded) !== originator)
2015
+ if (!includeExpired && this.isTokenExpired(token.expiry))
1907
2016
  continue;
1908
- const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(dec.fields[1])), 10);
1909
- const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(dec.fields[2]));
1910
- if (basketDecoded !== basket)
1911
- continue;
1912
- if (!includeExpired && this.isTokenExpired(expiryDecoded))
1913
- continue;
1914
- return {
1915
- tx: tx.toBEEF(),
1916
- txid,
1917
- outputIndex,
1918
- outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1919
- satoshis: out.satoshis,
1920
- originator,
1921
- rawOriginator: domainDecoded,
1922
- basketName: basketDecoded,
1923
- expiry: expiryDecoded
1924
- };
2017
+ return token;
1925
2018
  }
1926
2019
  }
1927
2020
  return undefined;
@@ -1937,42 +2030,18 @@ class WalletPermissionsManager {
1937
2030
  include: 'entire transactions'
1938
2031
  }, this.adminOriginator);
1939
2032
  for (const out of result.outputs) {
1940
- const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
1941
- const tx = this.transactionFromResultBeef(result, txid);
1942
- const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
1943
- if (!dec?.fields || dec.fields.length < 6)
1944
- continue;
1945
- const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = dec.fields;
1946
- const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
1947
- if (this.normalizeOriginator(domainDecoded) !== originator)
1948
- continue;
1949
- const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
1950
- const privDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
1951
- const typeDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(typeRaw));
1952
- const verifierDec = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(verifierRaw));
1953
- const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
1954
- if (privDecoded !== !!privileged || typeDecoded !== certType || verifierDec !== verifier)
1955
- continue;
1956
- // Check if 'fields' is a subset of 'allFields'
1957
- const setAll = new Set(allFields);
1958
- if (fields.some(f => !setAll.has(f)))
1959
- continue;
1960
- if (!includeExpired && this.isTokenExpired(expiryDecoded))
1961
- continue;
1962
- return {
1963
- tx: tx.toBEEF(),
1964
- txid,
1965
- outputIndex,
1966
- outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
1967
- satoshis: out.satoshis,
2033
+ const token = await this.parseCertificateTokenOutput(result, out, {
1968
2034
  originator,
1969
- rawOriginator: domainDecoded,
1970
2035
  privileged,
1971
- verifier: verifierDec,
1972
- certType: typeDecoded,
1973
- certFields: allFields,
1974
- expiry: expiryDecoded
1975
- };
2036
+ verifier,
2037
+ certType,
2038
+ fields
2039
+ });
2040
+ if (token == null)
2041
+ continue;
2042
+ if (!includeExpired && this.isTokenExpired(token.expiry))
2043
+ continue;
2044
+ return token;
1976
2045
  }
1977
2046
  }
1978
2047
  return undefined;
@@ -2088,7 +2157,7 @@ class WalletPermissionsManager {
2088
2157
  async mapWithConcurrency(items, concurrency, fn) {
2089
2158
  if (items.length === 0)
2090
2159
  return [];
2091
- const results = new Array(items.length);
2160
+ const results = Array.from({ length: items.length });
2092
2161
  let i = 0;
2093
2162
  const worker = async () => {
2094
2163
  while (true) {
@@ -2228,7 +2297,7 @@ class WalletPermissionsManager {
2228
2297
  satoshis: 1,
2229
2298
  outputDescription: 'Renewed permission token',
2230
2299
  ...(opts?.basket ? { basket: opts.basket } : {}),
2231
- ...((opts?.tags == null) ? {} : { tags: opts.tags })
2300
+ ...(opts?.tags == null ? {} : { tags: opts.tags })
2232
2301
  }
2233
2302
  ],
2234
2303
  options: {
@@ -2417,7 +2486,7 @@ class WalletPermissionsManager {
2417
2486
  async listProtocolPermissions({ originator, privileged, protocolName, protocolSecurityLevel, counterparty } = {}) {
2418
2487
  const baseTags = this.buildProtocolFilterTags({ privileged, protocolName, protocolSecurityLevel, counterparty });
2419
2488
  const originFilter = originator ? this.prepareOriginator(originator) : undefined;
2420
- const originVariants = (originFilter == null) ? [undefined] : originFilter.lookupValues;
2489
+ const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
2421
2490
  const seen = new Set();
2422
2491
  const tokens = [];
2423
2492
  for (const originTag of originVariants) {
@@ -2452,15 +2521,22 @@ class WalletPermissionsManager {
2452
2521
  continue;
2453
2522
  const f = await this.decryptProtocolTokenFields(dec.fields);
2454
2523
  const normalizedDomain = this.normalizeOriginator(f.domainDecoded);
2455
- if ((originFilter != null) && normalizedDomain !== originFilter.normalized)
2524
+ if (originFilter != null && normalizedDomain !== originFilter.normalized)
2456
2525
  continue;
2457
2526
  seen.add(out.outpoint);
2458
2527
  tokens.push({
2459
- tx: tx.toBEEF(), txid, outputIndex,
2528
+ tx: tx.toBEEF(),
2529
+ txid,
2530
+ outputIndex,
2460
2531
  outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
2461
- satoshis: out.satoshis, originator: normalizedDomain, rawOriginator: f.domainDecoded,
2462
- expiry: f.expiryDecoded, privileged: f.privDecoded,
2463
- securityLevel: f.secLevelDecoded, protocol: f.protoNameDecoded, counterparty: f.cptyDecoded
2532
+ satoshis: out.satoshis,
2533
+ originator: normalizedDomain,
2534
+ rawOriginator: f.domainDecoded,
2535
+ expiry: f.expiryDecoded,
2536
+ privileged: f.privDecoded,
2537
+ securityLevel: f.secLevelDecoded,
2538
+ protocol: f.protoNameDecoded,
2539
+ counterparty: f.cptyDecoded
2464
2540
  });
2465
2541
  }
2466
2542
  }
@@ -2495,7 +2571,7 @@ class WalletPermissionsManager {
2495
2571
  baseTags.push(`basket ${params.basket}`);
2496
2572
  }
2497
2573
  const originFilter = params.originator ? this.prepareOriginator(params.originator) : undefined;
2498
- const originVariants = (originFilter == null) ? [undefined] : originFilter.lookupValues;
2574
+ const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
2499
2575
  const seen = new Set();
2500
2576
  const tokens = [];
2501
2577
  for (const originTag of originVariants) {
@@ -2510,37 +2586,41 @@ class WalletPermissionsManager {
2510
2586
  include: 'entire transactions',
2511
2587
  limit: 10000
2512
2588
  }, this.adminOriginator);
2513
- for (const out of result.outputs) {
2514
- if (seen.has(out.outpoint))
2515
- continue;
2516
- const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
2517
- const tx = this.transactionFromResultBeef(result, txid);
2518
- const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
2519
- if (!dec?.fields || dec.fields.length < 3)
2520
- continue;
2521
- const [domainRaw, expiryRaw, basketRaw] = dec.fields;
2522
- const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
2523
- const normalizedDomain = this.normalizeOriginator(domainDecoded);
2524
- if ((originFilter != null) && normalizedDomain !== originFilter.normalized)
2525
- continue;
2526
- const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
2527
- const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(basketRaw));
2528
- seen.add(out.outpoint);
2529
- tokens.push({
2530
- tx: tx.toBEEF(),
2531
- txid,
2532
- outputIndex,
2533
- satoshis: out.satoshis,
2534
- outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
2535
- originator: normalizedDomain,
2536
- rawOriginator: domainDecoded,
2537
- basketName: basketDecoded,
2538
- expiry: expiryDecoded
2539
- });
2540
- }
2589
+ await this.collectBasketTokens(result, originFilter, seen, tokens);
2541
2590
  }
2542
2591
  return tokens;
2543
2592
  }
2593
+ /** Decodes and appends basket permission tokens from a listOutputs result. */
2594
+ async collectBasketTokens(result, originFilter, seen, tokens) {
2595
+ for (const out of result.outputs) {
2596
+ if (seen.has(out.outpoint))
2597
+ continue;
2598
+ const [txid, outputIndex] = this.parseOutpoint(out.outpoint);
2599
+ const tx = this.transactionFromResultBeef(result, txid);
2600
+ const dec = sdk_1.PushDrop.decode(tx.outputs[outputIndex].lockingScript);
2601
+ if (!dec?.fields || dec.fields.length < 3)
2602
+ continue;
2603
+ const [domainRaw, expiryRaw, basketRaw] = dec.fields;
2604
+ const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
2605
+ const normalizedDomain = this.normalizeOriginator(domainDecoded);
2606
+ if (originFilter != null && normalizedDomain !== originFilter.normalized)
2607
+ continue;
2608
+ const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
2609
+ const basketDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(basketRaw));
2610
+ seen.add(out.outpoint);
2611
+ tokens.push({
2612
+ tx: tx.toBEEF(),
2613
+ txid,
2614
+ outputIndex,
2615
+ satoshis: out.satoshis,
2616
+ outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
2617
+ originator: normalizedDomain,
2618
+ rawOriginator: domainDecoded,
2619
+ basketName: basketDecoded,
2620
+ expiry: expiryDecoded
2621
+ });
2622
+ }
2623
+ }
2544
2624
  /**
2545
2625
  * Returns `true` if the originator already holds a valid unexpired basket permission for `basket`.
2546
2626
  */
@@ -2632,7 +2712,7 @@ class WalletPermissionsManager {
2632
2712
  if (params.verifier)
2633
2713
  baseTags.push(`verifier ${params.verifier}`);
2634
2714
  const originFilter = params.originator ? this.prepareOriginator(params.originator) : undefined;
2635
- const originVariants = (originFilter == null) ? [undefined] : originFilter.lookupValues;
2715
+ const originVariants = originFilter == null ? [undefined] : originFilter.lookupValues;
2636
2716
  const seen = new Set();
2637
2717
  const tokens = [];
2638
2718
  for (const originTag of originVariants) {
@@ -2655,7 +2735,7 @@ class WalletPermissionsManager {
2655
2735
  const [domainRaw, expiryRaw, privRaw, typeRaw, fieldsRaw, verifierRaw] = dec.fields;
2656
2736
  const domainDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw));
2657
2737
  const normalizedDomain = this.normalizeOriginator(domainDecoded);
2658
- if ((originFilter != null) && normalizedDomain !== originFilter.normalized)
2738
+ if (originFilter != null && normalizedDomain !== originFilter.normalized)
2659
2739
  continue;
2660
2740
  const expiryDecoded = Number.parseInt(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10);
2661
2741
  const privDecoded = sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true';
@@ -2664,11 +2744,18 @@ class WalletPermissionsManager {
2664
2744
  const allFields = JSON.parse(sdk_1.Utils.toUTF8(await this.decryptPermissionTokenField(fieldsRaw)));
2665
2745
  seen.add(out.outpoint);
2666
2746
  tokens.push({
2667
- tx: tx.toBEEF(), txid, outputIndex, satoshis: out.satoshis,
2747
+ tx: tx.toBEEF(),
2748
+ txid,
2749
+ outputIndex,
2750
+ satoshis: out.satoshis,
2668
2751
  outputScript: tx.outputs[outputIndex].lockingScript.toHex(),
2669
- originator: normalizedDomain, rawOriginator: domainDecoded,
2670
- privileged: privDecoded, certType: typeDecoded, certFields: allFields,
2671
- verifier: verifierDec, expiry: expiryDecoded
2752
+ originator: normalizedDomain,
2753
+ rawOriginator: domainDecoded,
2754
+ privileged: privDecoded,
2755
+ certType: typeDecoded,
2756
+ certFields: allFields,
2757
+ verifier: verifierDec,
2758
+ expiry: expiryDecoded
2672
2759
  });
2673
2760
  }
2674
2761
  }
@@ -2713,7 +2800,7 @@ class WalletPermissionsManager {
2713
2800
  ? this.listSpendingAuthorizations({ originator: preparedOriginator.normalized })
2714
2801
  : Promise.resolve([])
2715
2802
  ]);
2716
- const spendingTokenList = (spendingTokens.length > 0) ? [spendingTokens[0]] : [];
2803
+ const spendingTokenList = spendingTokens.length > 0 ? [spendingTokens[0]] : [];
2717
2804
  const allTokens = [...protocolTokens, ...basketTokens, ...certificateTokens, ...spendingTokenList];
2718
2805
  const seen = new Set();
2719
2806
  const deduped = allTokens.filter(t => {
@@ -2833,11 +2920,21 @@ class WalletPermissionsManager {
2833
2920
  const nonPLabels = this.splitLabelsByPermissionModule(args.labels, pModulesByScheme);
2834
2921
  // 2) Check permissions for non-P baskets
2835
2922
  for (const basket of nonPBaskets) {
2836
- await this.ensureBasketAccess({ originator: originator, basket, reason: args.description, usageType: 'insertion' });
2923
+ await this.ensureBasketAccess({
2924
+ originator: originator,
2925
+ basket,
2926
+ reason: args.description,
2927
+ usageType: 'insertion'
2928
+ });
2837
2929
  }
2838
2930
  // 3) Check permissions for non-P labels
2839
2931
  for (const lbl of nonPLabels) {
2840
- await this.ensureLabelAccess({ originator: originator, label: lbl, reason: args.description, usageType: 'apply' });
2932
+ await this.ensureLabelAccess({
2933
+ originator: originator,
2934
+ label: lbl,
2935
+ reason: args.description,
2936
+ usageType: 'apply'
2937
+ });
2841
2938
  }
2842
2939
  // 4) Force signAndProcess=false unless the originator is admin and explicitly sets it to true.
2843
2940
  const modifiedOptions = this.enforceSignAndProcess(args.options, originator);
@@ -2875,7 +2972,12 @@ class WalletPermissionsManager {
2875
2972
  // 8) If netSpent > 0, require spending authorization. Abort if denied.
2876
2973
  if (netSpent > 0) {
2877
2974
  try {
2878
- await this.ensureSpendingAuthorization({ originator: originator, satoshis: netSpent, lineItems, reason: originalDescription });
2975
+ await this.ensureSpendingAuthorization({
2976
+ originator: originator,
2977
+ satoshis: netSpent,
2978
+ lineItems,
2979
+ reason: originalDescription
2980
+ });
2879
2981
  }
2880
2982
  catch (err) {
2881
2983
  await this.underlying.abortAction({ reference });
@@ -2937,7 +3039,9 @@ class WalletPermissionsManager {
2937
3039
  }
2938
3040
  });
2939
3041
  await Promise.all([
2940
- (async () => { args.description = await this.maybeEncryptMetadata(args.description); })(),
3042
+ (async () => {
3043
+ args.description = await this.maybeEncryptMetadata(args.description);
3044
+ })(),
2941
3045
  ...inputEncryptionTasks,
2942
3046
  ...outputEncryptionTasks
2943
3047
  ]);
@@ -2950,7 +3054,11 @@ class WalletPermissionsManager {
2950
3054
  const pModules = Array.from(pModulesByScheme.values());
2951
3055
  let transformedArgs = finalArgs;
2952
3056
  for (const module of pModules) {
2953
- const transformed = await module.onRequest({ method: 'createAction', args: transformedArgs, originator: originator });
3057
+ const transformed = await module.onRequest({
3058
+ method: 'createAction',
3059
+ args: transformedArgs,
3060
+ originator: originator
3061
+ });
2954
3062
  transformedArgs = transformed.args;
2955
3063
  }
2956
3064
  let createResult = await this.underlying.createAction(transformedArgs, originator);
@@ -3094,85 +3202,86 @@ class WalletPermissionsManager {
3094
3202
  // 4) Transparently decrypt transaction metadata, if configured to do so.
3095
3203
  return await this.decryptListActionsMetadata(results);
3096
3204
  }
3097
- async internalizeAction(...args) {
3098
- const [requestArgs, originator] = args;
3099
- // 1) Identify unique P-modules involved (one per schemeID) from both baskets and labels
3100
- const pModulesByScheme = new Map();
3101
- const nonPBaskets = [];
3102
- // Check baskets for p modules
3205
+ collectInternalizeActionBaskets(requestArgs, pModulesByScheme) {
3206
+ const nonPModuleBaskets = [];
3103
3207
  for (const outIndex in requestArgs.outputs) {
3104
- const out = requestArgs.outputs[outIndex];
3105
- if (out.protocol === 'basket insertion') {
3106
- const basket = out.insertionRemittance.basket;
3107
- if (basket.startsWith('p ')) {
3108
- const schemeID = basket.split(' ')[1];
3109
- this.addPModuleByScheme(schemeID, 'basket', pModulesByScheme);
3110
- }
3111
- else {
3112
- // Track non-P baskets for normal permission checks
3113
- nonPBaskets.push({
3114
- outIndex,
3115
- basket,
3116
- customInstructions: out.insertionRemittance.customInstructions
3117
- });
3118
- }
3208
+ const output = requestArgs.outputs[outIndex];
3209
+ if (output.protocol !== 'basket insertion')
3210
+ continue;
3211
+ const { basket, customInstructions } = output.insertionRemittance;
3212
+ if (basket.startsWith('p ')) {
3213
+ this.addPModuleByScheme(basket.split(' ')[1], 'basket', pModulesByScheme);
3214
+ }
3215
+ else {
3216
+ nonPModuleBaskets.push({ outIndex, basket, customInstructions });
3119
3217
  }
3120
3218
  }
3121
- // Check labels for p modules
3122
- const nonPLabels = this.splitLabelsByPermissionModule(requestArgs.labels, pModulesByScheme);
3123
- // 2) Check permissions for non-P baskets
3124
- for (const { outIndex, basket, customInstructions } of nonPBaskets) {
3219
+ return nonPModuleBaskets;
3220
+ }
3221
+ async authorizeInternalizeActionBaskets(requestArgs, originator, baskets) {
3222
+ for (const { outIndex, basket, customInstructions } of baskets) {
3125
3223
  await this.ensureBasketAccess({
3126
- originator: originator,
3224
+ originator,
3127
3225
  basket,
3128
3226
  reason: requestArgs.description,
3129
3227
  usageType: 'insertion'
3130
3228
  });
3131
- if (customInstructions) {
3132
- requestArgs.outputs[outIndex].insertionRemittance.customInstructions =
3133
- await this.maybeEncryptMetadata(customInstructions);
3134
- }
3229
+ if (customInstructions == null || customInstructions === '')
3230
+ continue;
3231
+ requestArgs.outputs[outIndex].insertionRemittance.customInstructions =
3232
+ await this.maybeEncryptMetadata(customInstructions);
3135
3233
  }
3136
- // 3) Check permissions for non-P labels
3137
- for (const lbl of nonPLabels) {
3234
+ }
3235
+ async authorizeInternalizeActionLabels(requestArgs, originator, labels) {
3236
+ for (const label of labels) {
3138
3237
  await this.ensureLabelAccess({
3139
- originator: originator,
3140
- label: lbl,
3238
+ originator,
3239
+ label,
3141
3240
  reason: requestArgs.description,
3142
3241
  usageType: 'apply'
3143
3242
  });
3144
3243
  }
3244
+ }
3245
+ async encryptInternalizeActionModuleMetadata(requestArgs) {
3246
+ for (const outIndex in requestArgs.outputs) {
3247
+ const output = requestArgs.outputs[outIndex];
3248
+ const customInstructions = output.insertionRemittance?.customInstructions;
3249
+ if (output.protocol !== 'basket insertion' || !customInstructions)
3250
+ continue;
3251
+ output.insertionRemittance.customInstructions = await this.maybeEncryptMetadata(customInstructions);
3252
+ }
3253
+ }
3254
+ async runInternalizeActionModules(requestArgs, originator, modules) {
3255
+ let transformedArgs = requestArgs;
3256
+ for (const module of modules) {
3257
+ const transformed = await module.onRequest({
3258
+ method: 'internalizeAction',
3259
+ args: transformedArgs,
3260
+ originator
3261
+ });
3262
+ transformedArgs = transformed.args;
3263
+ }
3264
+ await this.encryptInternalizeActionModuleMetadata(transformedArgs);
3265
+ let result = await this.underlying.internalizeAction(transformedArgs, originator);
3266
+ for (let index = modules.length - 1; index >= 0; index--) {
3267
+ result = await modules[index].onResponse(result, {
3268
+ method: 'internalizeAction',
3269
+ originator
3270
+ });
3271
+ }
3272
+ return result;
3273
+ }
3274
+ async internalizeAction(...args) {
3275
+ const [requestArgs, originator] = args;
3276
+ // 1) Identify unique P-modules involved (one per schemeID) from both baskets and labels
3277
+ const pModulesByScheme = new Map();
3278
+ const nonPBaskets = this.collectInternalizeActionBaskets(requestArgs, pModulesByScheme);
3279
+ const nonPLabels = this.splitLabelsByPermissionModule(requestArgs.labels, pModulesByScheme);
3280
+ await this.authorizeInternalizeActionBaskets(requestArgs, originator, nonPBaskets);
3281
+ await this.authorizeInternalizeActionLabels(requestArgs, originator, nonPLabels);
3145
3282
  // 4) Call underlying wallet, with P-module transformations if needed
3146
3283
  if (pModulesByScheme.size > 0) {
3147
- // P-modules are involved - chain transformations
3148
- const pModules = Array.from(pModulesByScheme.values());
3149
- // Chain onRequest calls through all modules in order
3150
- let transformedArgs = requestArgs;
3151
- for (const module of pModules) {
3152
- const transformed = await module.onRequest({
3153
- method: 'internalizeAction',
3154
- args: transformedArgs,
3155
- originator: originator
3156
- });
3157
- transformedArgs = transformed.args;
3158
- }
3159
- // Encrypt custom instructions for p basket outputs
3160
- for (const outIndex in transformedArgs.outputs) {
3161
- const out = transformedArgs.outputs[outIndex];
3162
- if (out.protocol === 'basket insertion' && out.insertionRemittance?.customInstructions) {
3163
- out.insertionRemittance.customInstructions = await this.maybeEncryptMetadata(out.insertionRemittance.customInstructions);
3164
- }
3165
- }
3166
- // Call underlying wallet with transformed args
3167
- let results = await this.underlying.internalizeAction(transformedArgs, originator);
3168
- // Chain onResponse calls in reverse order
3169
- for (let i = pModules.length - 1; i >= 0; i--) {
3170
- results = await pModules[i].onResponse(results, {
3171
- method: 'internalizeAction',
3172
- originator: originator
3173
- });
3174
- }
3175
- return results;
3284
+ return await this.runInternalizeActionModules(requestArgs, originator, Array.from(pModulesByScheme.values()));
3176
3285
  }
3177
3286
  // No P-modules - call underlying wallet directly
3178
3287
  return await this.underlying.internalizeAction(...args);
@@ -3593,6 +3702,22 @@ class WalletPermissionsManager {
3593
3702
  * user a duplicate prompt for a grant they already made moments ago.
3594
3703
  */
3595
3704
  async hasRecentOrPendingGrant(cacheKey) {
3705
+ if (!this.telemetry.enabled)
3706
+ return await this.hasRecentOrPendingGrantCore(cacheKey);
3707
+ return await this.telemetry.withSpan('wallet.permission.cache_check', {
3708
+ component: 'wallet-permissions'
3709
+ }, async (span) => {
3710
+ const result = await this.hasRecentOrPendingGrantCore(cacheKey);
3711
+ span.end({
3712
+ attributes: {
3713
+ 'permission.cache_hit': result,
3714
+ 'permission.mint_in_flight': this.mintsInFlight.has(cacheKey)
3715
+ }
3716
+ });
3717
+ return result;
3718
+ });
3719
+ }
3720
+ async hasRecentOrPendingGrantCore(cacheKey) {
3596
3721
  if (this.isPermissionCached(cacheKey) || this.isRecentlyGranted(cacheKey))
3597
3722
  return true;
3598
3723
  const inFlight = this.mintsInFlight.get(cacheKey);