@bsv/wallet-toolbox 1.6.23 → 1.6.25

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 (206) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/docs/client.md +298 -167
  3. package/docs/monitor.md +126 -23
  4. package/docs/services.md +86 -37
  5. package/docs/wallet.md +298 -167
  6. package/mobile/out/src/WalletPermissionsManager.d.ts +3 -0
  7. package/mobile/out/src/WalletPermissionsManager.d.ts.map +1 -1
  8. package/mobile/out/src/WalletPermissionsManager.js +185 -43
  9. package/mobile/out/src/WalletPermissionsManager.js.map +1 -1
  10. package/mobile/out/src/index.mobile.d.ts +1 -1
  11. package/mobile/out/src/index.mobile.js +1 -1
  12. package/mobile/out/src/monitor/Monitor.d.ts +32 -8
  13. package/mobile/out/src/monitor/Monitor.d.ts.map +1 -1
  14. package/mobile/out/src/monitor/Monitor.js +59 -28
  15. package/mobile/out/src/monitor/Monitor.js.map +1 -1
  16. package/mobile/out/src/monitor/tasks/TaskCheckNoSends.js +2 -1
  17. package/mobile/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
  18. package/mobile/out/src/monitor/tasks/TaskClock.js +3 -2
  19. package/mobile/out/src/monitor/tasks/TaskClock.js.map +1 -1
  20. package/mobile/out/src/monitor/tasks/TaskMonitorCallHistory.js +2 -1
  21. package/mobile/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
  22. package/mobile/out/src/monitor/tasks/TaskNewHeader.js +2 -1
  23. package/mobile/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
  24. package/mobile/out/src/monitor/tasks/TaskReorg.d.ts +47 -0
  25. package/mobile/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -0
  26. package/mobile/out/src/monitor/tasks/TaskReorg.js +135 -0
  27. package/mobile/out/src/monitor/tasks/TaskReorg.js.map +1 -0
  28. package/mobile/out/src/monitor/tasks/TaskSendWaiting.js +2 -1
  29. package/mobile/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
  30. package/mobile/out/src/monitor/tasks/TaskUnFail.js +2 -1
  31. package/mobile/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
  32. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +1 -1
  33. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
  34. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +4 -0
  35. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  36. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  37. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js +3 -1
  38. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  39. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
  40. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +4 -1
  41. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
  42. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  43. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +3 -1
  44. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  45. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +5 -0
  46. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -0
  47. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +68 -0
  48. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -0
  49. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -1
  50. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
  51. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +59 -15
  52. package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
  53. package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +1 -1
  54. package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
  55. package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +4 -61
  56. package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
  57. package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +13 -0
  58. package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -0
  59. package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +27 -0
  60. package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -0
  61. package/mobile/out/src/services/chaintracker/chaintracks/index.client.d.ts +2 -28
  62. package/mobile/out/src/services/chaintracker/chaintracks/index.client.d.ts.map +1 -1
  63. package/mobile/out/src/services/chaintracker/chaintracks/index.client.js +2 -50
  64. package/mobile/out/src/services/chaintracker/chaintracks/index.client.js.map +1 -1
  65. package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +30 -0
  66. package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -0
  67. package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.js +68 -0
  68. package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -0
  69. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +11 -11
  70. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  71. package/mobile/package-lock.json +7 -6
  72. package/mobile/package.json +2 -2
  73. package/out/src/WalletPermissionsManager.d.ts +3 -0
  74. package/out/src/WalletPermissionsManager.d.ts.map +1 -1
  75. package/out/src/WalletPermissionsManager.js +185 -43
  76. package/out/src/WalletPermissionsManager.js.map +1 -1
  77. package/out/src/index.mobile.d.ts +1 -1
  78. package/out/src/index.mobile.js +1 -1
  79. package/out/src/monitor/Monitor.d.ts +32 -8
  80. package/out/src/monitor/Monitor.d.ts.map +1 -1
  81. package/out/src/monitor/Monitor.js +59 -28
  82. package/out/src/monitor/Monitor.js.map +1 -1
  83. package/out/src/monitor/MonitorDaemon.d.ts +2 -0
  84. package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
  85. package/out/src/monitor/MonitorDaemon.js +3 -1
  86. package/out/src/monitor/MonitorDaemon.js.map +1 -1
  87. package/out/src/monitor/__test/MonitorDaemon.man.test.js +30 -39
  88. package/out/src/monitor/__test/MonitorDaemon.man.test.js.map +1 -1
  89. package/out/src/monitor/tasks/TaskCheckNoSends.js +2 -1
  90. package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
  91. package/out/src/monitor/tasks/TaskClock.js +3 -2
  92. package/out/src/monitor/tasks/TaskClock.js.map +1 -1
  93. package/out/src/monitor/tasks/TaskMonitorCallHistory.js +2 -1
  94. package/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
  95. package/out/src/monitor/tasks/TaskNewHeader.js +2 -1
  96. package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
  97. package/out/src/monitor/tasks/TaskReorg.d.ts +47 -0
  98. package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -0
  99. package/out/src/monitor/tasks/TaskReorg.js +135 -0
  100. package/out/src/monitor/tasks/TaskReorg.js.map +1 -0
  101. package/out/src/monitor/tasks/TaskSendWaiting.js +2 -1
  102. package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
  103. package/out/src/monitor/tasks/TaskUnFail.js +2 -1
  104. package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
  105. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +1 -1
  106. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
  107. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +4 -0
  108. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  109. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  110. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +3 -1
  111. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  112. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +1 -1
  113. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
  114. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
  115. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +4 -1
  116. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
  117. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
  118. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +3 -1
  119. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
  120. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  121. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +3 -1
  122. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  123. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js +1 -1
  124. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js.map +1 -1
  125. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +5 -0
  126. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -0
  127. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +68 -0
  128. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -0
  129. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts +2 -1
  130. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
  131. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js +66 -22
  132. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
  133. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -1
  134. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
  135. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +59 -15
  136. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
  137. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +1 -1
  138. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
  139. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +4 -61
  140. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
  141. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts +14 -0
  142. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -0
  143. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +27 -0
  144. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -0
  145. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +13 -0
  146. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -0
  147. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +27 -0
  148. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -0
  149. package/out/src/services/chaintracker/chaintracks/index.all.d.ts +1 -0
  150. package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
  151. package/out/src/services/chaintracker/chaintracks/index.all.js +1 -0
  152. package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
  153. package/out/src/services/chaintracker/chaintracks/index.client.d.ts +2 -28
  154. package/out/src/services/chaintracker/chaintracks/index.client.d.ts.map +1 -1
  155. package/out/src/services/chaintracker/chaintracks/index.client.js +2 -50
  156. package/out/src/services/chaintracker/chaintracks/index.client.js.map +1 -1
  157. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +30 -0
  158. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -0
  159. package/out/src/services/chaintracker/chaintracks/index.mobile.js +68 -0
  160. package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -0
  161. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +11 -11
  162. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  163. package/out/src/services/chaintracker/index.mobile.d.ts +4 -0
  164. package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -0
  165. package/out/src/services/chaintracker/index.mobile.js +20 -0
  166. package/out/src/services/chaintracker/index.mobile.js.map +1 -0
  167. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
  168. package/out/src/storage/schema/KnexMigrations.js +12 -0
  169. package/out/src/storage/schema/KnexMigrations.js.map +1 -1
  170. package/out/test/monitor/Monitor.test.js +32 -29
  171. package/out/test/monitor/Monitor.test.js.map +1 -1
  172. package/out/tsconfig.all.tsbuildinfo +1 -1
  173. package/package.json +2 -2
  174. package/src/WalletPermissionsManager.ts +245 -57
  175. package/src/index.mobile.ts +1 -1
  176. package/src/monitor/Monitor.ts +94 -29
  177. package/src/monitor/MonitorDaemon.ts +9 -1
  178. package/src/monitor/__test/MonitorDaemon.man.test.ts +35 -7
  179. package/src/monitor/tasks/TaskCheckNoSends.ts +1 -1
  180. package/src/monitor/tasks/TaskClock.ts +2 -2
  181. package/src/monitor/tasks/TaskMonitorCallHistory.ts +1 -1
  182. package/src/monitor/tasks/TaskNewHeader.ts +1 -1
  183. package/src/monitor/tasks/TaskReorg.ts +139 -0
  184. package/src/monitor/tasks/TaskSendWaiting.ts +3 -3
  185. package/src/monitor/tasks/TaskUnFail.ts +1 -1
  186. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +6 -1
  187. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +4 -0
  188. package/src/services/chaintracker/chaintracks/Chaintracks.ts +3 -1
  189. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +2 -2
  190. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +4 -1
  191. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +4 -12
  192. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +3 -1
  193. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +2 -2
  194. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  195. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +84 -25
  196. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +79 -17
  197. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +11 -64
  198. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  199. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  200. package/src/services/chaintracker/chaintracks/index.all.ts +1 -0
  201. package/src/services/chaintracker/chaintracks/index.client.ts +2 -35
  202. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  203. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +11 -11
  204. package/src/services/chaintracker/index.mobile.ts +4 -0
  205. package/src/storage/schema/KnexMigrations.ts +13 -0
  206. package/test/monitor/Monitor.test.ts +21 -16
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsv/wallet-toolbox",
3
- "version": "1.6.23",
3
+ "version": "1.6.25",
4
4
  "description": "BRC100 conforming wallet, wallet storage and wallet signer components",
5
5
  "main": "./out/src/index.js",
6
6
  "types": "./out/src/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@bsv/auth-express-middleware": "^1.2.3",
35
35
  "@bsv/payment-express-middleware": "^1.2.3",
36
- "@bsv/sdk": "^1.7.3",
36
+ "@bsv/sdk": "^1.7.6",
37
37
  "express": "^4.21.2",
38
38
  "idb": "^8.0.2",
39
39
  "knex": "^3.1.0",
@@ -7,7 +7,9 @@ import {
7
7
  WalletProtocol,
8
8
  Base64String,
9
9
  PubKeyHex,
10
- SecurityLevels
10
+ SecurityLevels,
11
+ CreateActionInput,
12
+ Beef
11
13
  } from '@bsv/sdk'
12
14
  import { validateCreateActionArgs } from './sdk'
13
15
 
@@ -656,17 +658,39 @@ export class WalletPermissionsManager implements WalletInterface {
656
658
  )
657
659
  }
658
660
  for (const p of params.granted.protocolPermissions || []) {
659
- await this.createPermissionOnChain(
660
- {
661
- type: 'protocol',
662
- originator,
663
- privileged: false, // No privileged protocols allowed in groups for added security.
664
- protocolID: p.protocolID,
665
- counterparty: p.counterparty || 'self',
666
- reason: p.description
667
- },
668
- expiry
661
+ const token = await this.findProtocolToken(
662
+ originator,
663
+ false, // No privileged protocols allowed in groups for added security.
664
+ p.protocolID,
665
+ p.counterparty || 'self',
666
+ true
669
667
  )
668
+ if (token) {
669
+ await this.renewPermissionOnChain(
670
+ token,
671
+ {
672
+ type: 'protocol',
673
+ originator,
674
+ privileged: false, // No privileged protocols allowed in groups for added security.
675
+ protocolID: p.protocolID,
676
+ counterparty: p.counterparty || 'self',
677
+ reason: p.description
678
+ },
679
+ expiry
680
+ )
681
+ } else {
682
+ await this.createPermissionOnChain(
683
+ {
684
+ type: 'protocol',
685
+ originator,
686
+ privileged: false, // No privileged protocols allowed in groups for added security.
687
+ protocolID: p.protocolID,
688
+ counterparty: p.counterparty || 'self',
689
+ reason: p.description
690
+ },
691
+ expiry
692
+ )
693
+ }
670
694
  }
671
695
  for (const b of params.granted.basketAccess || []) {
672
696
  await this.createPermissionOnChain(
@@ -1335,6 +1359,89 @@ export class WalletPermissionsManager implements WalletInterface {
1335
1359
  return undefined
1336
1360
  }
1337
1361
 
1362
+ /** Finds ALL DPACP permission tokens matching origin/domain, privileged, protocol, cpty. Never filters by expiry. */
1363
+ private async findAllProtocolTokens(
1364
+ originator: string,
1365
+ privileged: boolean,
1366
+ protocolID: WalletProtocol,
1367
+ counterparty: string
1368
+ ): Promise<PermissionToken[]> {
1369
+ const [secLevel, protoName] = protocolID
1370
+ const tags = [
1371
+ `originator ${originator}`,
1372
+ `privileged ${!!privileged}`,
1373
+ `protocolName ${protoName}`,
1374
+ `protocolSecurityLevel ${secLevel}`
1375
+ ]
1376
+ if (secLevel === 2) {
1377
+ tags.push(`counterparty ${counterparty}`)
1378
+ }
1379
+
1380
+ const result = await this.underlying.listOutputs(
1381
+ {
1382
+ basket: BASKET_MAP.protocol,
1383
+ tags,
1384
+ tagQueryMode: 'all',
1385
+ include: 'entire transactions'
1386
+ },
1387
+ this.adminOriginator
1388
+ )
1389
+
1390
+ const matches: PermissionToken[] = []
1391
+
1392
+ for (const out of result.outputs) {
1393
+ const [txid, outputIndexStr] = out.outpoint.split('.')
1394
+ const tx = Transaction.fromBEEF(result.BEEF!, txid)
1395
+ const vout = Number(outputIndexStr)
1396
+ const dec = PushDrop.decode(tx.outputs[vout].lockingScript)
1397
+ if (!dec || !dec.fields || dec.fields.length < 6) continue
1398
+
1399
+ const domainRaw = dec.fields[0]
1400
+ const expiryRaw = dec.fields[1]
1401
+ const privRaw = dec.fields[2]
1402
+ const secLevelRaw = dec.fields[3]
1403
+ const protoNameRaw = dec.fields[4]
1404
+ const counterpartyRaw = dec.fields[5]
1405
+
1406
+ // Decrypt all fields
1407
+ const domainDecoded = Utils.toUTF8(await this.decryptPermissionTokenField(domainRaw))
1408
+ const expiryDecoded = parseInt(Utils.toUTF8(await this.decryptPermissionTokenField(expiryRaw)), 10)
1409
+ const privDecoded = Utils.toUTF8(await this.decryptPermissionTokenField(privRaw)) === 'true'
1410
+ const secLevelDecoded = parseInt(Utils.toUTF8(await this.decryptPermissionTokenField(secLevelRaw)), 10) as
1411
+ | 0
1412
+ | 1
1413
+ | 2
1414
+ const protoNameDecoded = Utils.toUTF8(await this.decryptPermissionTokenField(protoNameRaw))
1415
+ const cptyDecoded = Utils.toUTF8(await this.decryptPermissionTokenField(counterpartyRaw))
1416
+
1417
+ // Strict attribute match; NO expiry filtering
1418
+ if (
1419
+ domainDecoded !== originator ||
1420
+ privDecoded !== !!privileged ||
1421
+ secLevelDecoded !== secLevel ||
1422
+ protoNameDecoded !== protoName ||
1423
+ (secLevelDecoded === 2 && cptyDecoded !== counterparty)
1424
+ ) {
1425
+ continue
1426
+ }
1427
+
1428
+ matches.push({
1429
+ tx: tx.toBEEF(),
1430
+ txid,
1431
+ outputIndex: vout,
1432
+ outputScript: tx.outputs[vout].lockingScript.toHex(),
1433
+ satoshis: out.satoshis,
1434
+ originator,
1435
+ privileged,
1436
+ protocol: protoName,
1437
+ securityLevel: secLevel,
1438
+ expiry: expiryDecoded,
1439
+ counterparty: cptyDecoded
1440
+ })
1441
+ }
1442
+
1443
+ return matches
1444
+ }
1338
1445
  /** Looks for a DBAP token matching (originator, basket). */
1339
1446
  private async findBasketToken(
1340
1447
  originator: string,
@@ -1569,6 +1676,70 @@ export class WalletPermissionsManager implements WalletInterface {
1569
1676
  )
1570
1677
  }
1571
1678
 
1679
+ private async coalescePermissionTokens(
1680
+ oldTokens: PermissionToken[],
1681
+ newScript: LockingScript,
1682
+ opts?: {
1683
+ tags?: string[]
1684
+ basket?: string
1685
+ description?: string
1686
+ }
1687
+ ): Promise<string> {
1688
+ if (!oldTokens?.length) throw new Error('No permission tokens to coalesce')
1689
+ if (oldTokens.length < 2) throw new Error('Need at least 2 tokens to coalesce')
1690
+
1691
+ // 1) Create a signable action with N inputs and a single renewed output
1692
+ const { signableTransaction } = await this.createAction(
1693
+ {
1694
+ description: opts?.description ?? `Coalesce ${oldTokens.length} permission tokens`,
1695
+ inputs: oldTokens.map((t, i) => ({
1696
+ outpoint: `${t.txid}.${t.outputIndex}`,
1697
+ unlockingScriptLength: 74,
1698
+ inputDescription: `Consume permission token #${i + 1}`
1699
+ })),
1700
+ outputs: [
1701
+ {
1702
+ lockingScript: newScript.toHex(),
1703
+ satoshis: 1,
1704
+ outputDescription: 'Renewed permission token',
1705
+ ...(opts?.basket ? { basket: opts.basket } : {}),
1706
+ ...(opts?.tags ? { tags: opts.tags } : {})
1707
+ }
1708
+ ],
1709
+ options: {
1710
+ acceptDelayedBroadcast: false,
1711
+ randomizeOutputs: false,
1712
+ signAndProcess: false
1713
+ }
1714
+ },
1715
+ this.adminOriginator
1716
+ )
1717
+
1718
+ if (!signableTransaction?.reference || !signableTransaction.tx) {
1719
+ throw new Error('Failed to create signable transaction')
1720
+ }
1721
+
1722
+ // 2) Sign each input
1723
+ const partialTx = Transaction.fromAtomicBEEF(signableTransaction.tx)
1724
+ const pushdrop = new PushDrop(this.underlying)
1725
+ const unlocker = pushdrop.unlock(WalletPermissionsManager.PERM_TOKEN_ENCRYPTION_PROTOCOL, '1', 'self')
1726
+
1727
+ const spends: Record<number, { unlockingScript: string }> = {}
1728
+ for (let i = 0; i < oldTokens.length; i++) {
1729
+ // The signable transaction already contains the necessary prevout context
1730
+ const unlockingScript = await unlocker.sign(partialTx, i)
1731
+ spends[i] = { unlockingScript: unlockingScript.toHex() }
1732
+ }
1733
+
1734
+ // 3) Finalize the action
1735
+ const { txid } = await this.underlying.signAction({
1736
+ reference: signableTransaction.reference,
1737
+ spends
1738
+ })
1739
+
1740
+ if (!txid) throw new Error('Failed to finalize coalescing transaction')
1741
+ return txid
1742
+ }
1572
1743
  /**
1573
1744
  * Renews a permission token by spending the old token as input and creating a new token output.
1574
1745
  * This invalidates the old token and replaces it with a new one.
@@ -1596,57 +1767,74 @@ export class WalletPermissionsManager implements WalletInterface {
1596
1767
  true,
1597
1768
  true
1598
1769
  )
1599
-
1600
1770
  const tags = this.buildTagsForRequest(r)
1771
+ // Check if there are multiple old tokens for the same parameters (shouldn't usually happen)
1772
+ const oldTokens = await this.findAllProtocolTokens(
1773
+ oldToken.originator,
1774
+ oldToken.privileged!,
1775
+ [oldToken.securityLevel!, oldToken.protocol!],
1776
+ oldToken.counterparty!
1777
+ )
1601
1778
 
1602
- // 3) For BRC-100, we do a "createAction" with a partial input referencing oldToken
1603
- // plus a single new output. We'll hydrate the template, then signAction for the wallet to finalize.
1604
- const oldOutpoint = `${oldToken.txid}.${oldToken.outputIndex}`
1605
- const { signableTransaction } = await this.createAction(
1606
- {
1607
- description: `Renew ${r.type} permission`,
1608
- inputBEEF: oldToken.tx,
1609
- inputs: [
1610
- {
1611
- outpoint: oldOutpoint,
1612
- unlockingScriptLength: 73, // length of signature
1613
- inputDescription: `Consume old ${r.type} token`
1779
+ // If so, coalesce them into a single token first, to avoid bloat
1780
+ if (oldTokens.length > 1) {
1781
+ const txid = await this.coalescePermissionTokens(oldTokens, newScript, {
1782
+ tags,
1783
+ basket: BASKET_MAP[r.type],
1784
+ description: `Coalesce ${r.type} permission tokens`
1785
+ })
1786
+ console.log('Coalesced permission tokens:', txid)
1787
+ } else {
1788
+ // Otherwise, just proceed with the single-token renewal
1789
+ // 3) For BRC-100, we do a "createAction" with a partial input referencing oldToken
1790
+ // plus a single new output. We'll hydrate the template, then signAction for the wallet to finalize.
1791
+ const oldOutpoint = `${oldToken.txid}.${oldToken.outputIndex}`
1792
+ const { signableTransaction } = await this.createAction(
1793
+ {
1794
+ description: `Renew ${r.type} permission`,
1795
+ inputBEEF: oldToken.tx,
1796
+ inputs: [
1797
+ {
1798
+ outpoint: oldOutpoint,
1799
+ unlockingScriptLength: 73, // length of signature
1800
+ inputDescription: `Consume old ${r.type} token`
1801
+ }
1802
+ ],
1803
+ outputs: [
1804
+ {
1805
+ lockingScript: newScript.toHex(),
1806
+ satoshis: 1,
1807
+ outputDescription: `Renewed ${r.type} permission token`,
1808
+ basket: BASKET_MAP[r.type],
1809
+ tags
1810
+ }
1811
+ ],
1812
+ options: {
1813
+ acceptDelayedBroadcast: false
1614
1814
  }
1615
- ],
1616
- outputs: [
1617
- {
1618
- lockingScript: newScript.toHex(),
1619
- satoshis: 1,
1620
- outputDescription: `Renewed ${r.type} permission token`,
1621
- basket: BASKET_MAP[r.type],
1622
- tags
1815
+ },
1816
+ this.adminOriginator
1817
+ )
1818
+ const tx = Transaction.fromBEEF(signableTransaction!.tx)
1819
+ const unlocker = new PushDrop(this.underlying).unlock(
1820
+ WalletPermissionsManager.PERM_TOKEN_ENCRYPTION_PROTOCOL,
1821
+ '1',
1822
+ 'self',
1823
+ 'all',
1824
+ false,
1825
+ 1,
1826
+ LockingScript.fromHex(oldToken.outputScript)
1827
+ )
1828
+ const unlockingScript = await unlocker.sign(tx, 0)
1829
+ await this.underlying.signAction({
1830
+ reference: signableTransaction!.reference,
1831
+ spends: {
1832
+ 0: {
1833
+ unlockingScript: unlockingScript.toHex()
1623
1834
  }
1624
- ],
1625
- options: {
1626
- acceptDelayedBroadcast: false
1627
- }
1628
- },
1629
- this.adminOriginator
1630
- )
1631
- const tx = Transaction.fromBEEF(signableTransaction!.tx)
1632
- const unlocker = new PushDrop(this.underlying).unlock(
1633
- WalletPermissionsManager.PERM_TOKEN_ENCRYPTION_PROTOCOL,
1634
- '1',
1635
- 'self',
1636
- 'all',
1637
- false,
1638
- 1,
1639
- LockingScript.fromHex(oldToken.outputScript)
1640
- )
1641
- const unlockingScript = await unlocker.sign(tx, 0)
1642
- await this.underlying.signAction({
1643
- reference: signableTransaction!.reference,
1644
- spends: {
1645
- 0: {
1646
- unlockingScript: unlockingScript.toHex()
1647
1835
  }
1648
- }
1649
- })
1836
+ })
1837
+ }
1650
1838
  }
1651
1839
 
1652
1840
  /**
@@ -2,7 +2,7 @@ export * as sdk from './sdk/index'
2
2
 
3
3
  export * from './utility/index.client'
4
4
  export * from './storage/index.mobile'
5
- export * from './services/chaintracker/chaintracks/index.client'
5
+ export * from './services/chaintracker/chaintracks/index.mobile'
6
6
 
7
7
  export * from './CWIStyleWalletManager'
8
8
  export * from './monitor/Monitor'
@@ -11,6 +11,7 @@ import { TaskCheckForProofs } from './tasks/TaskCheckForProofs'
11
11
  import { TaskClock } from './tasks/TaskClock'
12
12
  import { TaskNewHeader } from './tasks/TaskNewHeader'
13
13
  import { TaskMonitorCallHistory } from './tasks/TaskMonitorCallHistory'
14
+ import { TaskReorg } from './tasks/TaskReorg'
14
15
 
15
16
  import { TaskSendWaiting } from './tasks/TaskSendWaiting'
16
17
  import { TaskCheckNoSends } from './tasks/TaskCheckNoSends'
@@ -21,7 +22,8 @@ import { WERR_BAD_REQUEST, WERR_INVALID_PARAMETER } from '../sdk/WERR_errors'
21
22
  import { WalletError } from '../sdk/WalletError'
22
23
  import { BlockHeader } from '../sdk/WalletServices.interfaces'
23
24
  import { Services } from '../services/Services'
24
- import { ChaintracksClientApi } from '../services/chaintracker/chaintracks/Api/ChaintracksClientApi'
25
+ import { ChaintracksClientApi, ReorgListener } from '../services/chaintracker/chaintracks/Api/ChaintracksClientApi'
26
+ import { Chaintracks } from '../services/chaintracker/chaintracks/Chaintracks'
25
27
 
26
28
  export type MonitorStorage = WalletStorageManager
27
29
 
@@ -34,6 +36,8 @@ export interface MonitorOptions {
34
36
 
35
37
  chaintracks: ChaintracksClientApi
36
38
 
39
+ chaintracksWithEvents?: Chaintracks
40
+
37
41
  /**
38
42
  * How many msecs to wait after each getMerkleProof service request.
39
43
  */
@@ -59,7 +63,12 @@ export interface MonitorOptions {
59
63
  * and potentially that reorgs update proofs that were already received.
60
64
  */
61
65
  export class Monitor {
62
- static createDefaultWalletMonitorOptions(chain: Chain, storage: MonitorStorage, services?: Services): MonitorOptions {
66
+ static createDefaultWalletMonitorOptions(
67
+ chain: Chain,
68
+ storage: MonitorStorage,
69
+ services?: Services,
70
+ chaintracks?: Chaintracks
71
+ ): MonitorOptions {
63
72
  services ||= new Services(chain)
64
73
  if (!services.options.chaintracks) throw new WERR_INVALID_PARAMETER('services.options.chaintracks', 'valid')
65
74
  const o: MonitorOptions = {
@@ -71,7 +80,8 @@ export class Monitor {
71
80
  abandonedMsecs: 1000 * 60 * 5,
72
81
  unprovenAttemptsLimitTest: 10,
73
82
  unprovenAttemptsLimitMain: 144,
74
- chaintracks: services.options.chaintracks
83
+ chaintracks: services.options.chaintracks,
84
+ chaintracksWithEvents: chaintracks
75
85
  }
76
86
  return o
77
87
  }
@@ -81,6 +91,9 @@ export class Monitor {
81
91
  chain: Chain
82
92
  storage: MonitorStorage
83
93
  chaintracks: ChaintracksClientApi
94
+ chaintracksWithEvents?: Chaintracks
95
+ reorgSubscriptionPromise?: Promise<string>
96
+ headersSubscriptionPromise?: Promise<string>
84
97
  onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>
85
98
  onTransactionProven?: (txStatus: ProvenTransactionStatus) => Promise<void>
86
99
 
@@ -90,15 +103,31 @@ export class Monitor {
90
103
  this.chain = this.services.chain
91
104
  this.storage = options.storage
92
105
  this.chaintracks = options.chaintracks
106
+ this.chaintracksWithEvents = options.chaintracksWithEvents
93
107
  this.onTransactionProven = options.onTransactionProven
94
108
  this.onTransactionBroadcasted = options.onTransactionBroadcasted
109
+
110
+ if (this.chaintracksWithEvents) {
111
+ const c = this.chaintracksWithEvents
112
+ this.reorgSubscriptionPromise = c.subscribeReorgs(this.processReorg.bind(this))
113
+ this.headersSubscriptionPromise = c.subscribeHeaders(this.processHeader.bind(this))
114
+ }
95
115
  }
96
116
 
97
- oneSecond = 1000
98
- oneMinute = 60 * this.oneSecond
99
- oneHour = 60 * this.oneMinute
100
- oneDay = 24 * this.oneHour
101
- oneWeek = 7 * this.oneDay
117
+ async destroy(): Promise<void> {
118
+ if (this.chaintracksWithEvents) {
119
+ const c = this.chaintracksWithEvents
120
+ if (this.reorgSubscriptionPromise) await c.unsubscribe(await this.reorgSubscriptionPromise)
121
+ if (this.headersSubscriptionPromise) await c.unsubscribe(await this.headersSubscriptionPromise)
122
+ }
123
+ }
124
+
125
+ static readonly oneSecond = 1000
126
+ static readonly oneMinute = 60 * Monitor.oneSecond
127
+ static readonly oneHour = 60 * Monitor.oneMinute
128
+ static readonly oneDay = 24 * Monitor.oneHour
129
+ static readonly oneWeek = 7 * Monitor.oneDay
130
+
102
131
  /**
103
132
  * _tasks are typically run by the scheduler but may also be run by runTask.
104
133
  */
@@ -113,9 +142,9 @@ export class Monitor {
113
142
  purgeSpent: false,
114
143
  purgeCompleted: false,
115
144
  purgeFailed: true,
116
- purgeSpentAge: 2 * this.oneWeek,
117
- purgeCompletedAge: 2 * this.oneWeek,
118
- purgeFailedAge: 5 * this.oneDay
145
+ purgeSpentAge: 2 * Monitor.oneWeek,
146
+ purgeCompletedAge: 2 * Monitor.oneWeek,
147
+ purgeFailedAge: 5 * Monitor.oneDay
119
148
  }
120
149
 
121
150
  addAllTasksToOther(): void {
@@ -129,6 +158,8 @@ export class Monitor {
129
158
  this._otherTasks.push(new TaskCheckNoSends(this))
130
159
  this._otherTasks.push(new TaskUnFail(this))
131
160
 
161
+ this._otherTasks.push(new TaskReorg(this))
162
+
132
163
  this._otherTasks.push(new TaskFailAbandoned(this))
133
164
 
134
165
  this._otherTasks.push(new TaskSyncWhenIdle(this))
@@ -141,13 +172,14 @@ export class Monitor {
141
172
  this._tasks.push(new TaskClock(this))
142
173
  this._tasks.push(new TaskNewHeader(this))
143
174
  this._tasks.push(new TaskMonitorCallHistory(this))
144
- this._tasks.push(new TaskSendWaiting(this, 8 * this.oneSecond, 7 * this.oneSecond)) // Check every 8 seconds but must be 7 seconds old
145
- this._tasks.push(new TaskCheckForProofs(this, 2 * this.oneHour)) // Every two hours if no block found
175
+ this._tasks.push(new TaskSendWaiting(this, 8 * Monitor.oneSecond, 7 * Monitor.oneSecond)) // Check every 8 seconds but must be 7 seconds old
176
+ this._tasks.push(new TaskCheckForProofs(this, 2 * Monitor.oneHour)) // Every two hours if no block found
146
177
  this._tasks.push(new TaskCheckNoSends(this))
147
- this._tasks.push(new TaskFailAbandoned(this, 8 * this.oneMinute))
178
+ this._tasks.push(new TaskFailAbandoned(this, 8 * Monitor.oneMinute))
148
179
  this._tasks.push(new TaskUnFail(this))
149
- //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * this.oneHour))
180
+ //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * Monitor.oneHour))
150
181
  this._tasks.push(new TaskReviewStatus(this))
182
+ this._tasks.push(new TaskReorg(this))
151
183
  }
152
184
 
153
185
  /**
@@ -158,13 +190,14 @@ export class Monitor {
158
190
  this._tasks.push(new TaskClock(this))
159
191
  this._tasks.push(new TaskNewHeader(this))
160
192
  this._tasks.push(new TaskMonitorCallHistory(this))
161
- this._tasks.push(new TaskSendWaiting(this, 8 * this.oneSecond, 7 * this.oneSecond)) // Check every 8 seconds but must be 7 seconds old
162
- this._tasks.push(new TaskCheckForProofs(this, 2 * this.oneHour)) // Every two hours if no block found
193
+ this._tasks.push(new TaskSendWaiting(this, 8 * Monitor.oneSecond, 7 * Monitor.oneSecond)) // Check every 8 seconds but must be 7 seconds old
194
+ this._tasks.push(new TaskCheckForProofs(this, 2 * Monitor.oneHour)) // Every two hours if no block found
163
195
  this._tasks.push(new TaskCheckNoSends(this))
164
- this._tasks.push(new TaskFailAbandoned(this, 8 * this.oneMinute))
196
+ this._tasks.push(new TaskFailAbandoned(this, 8 * Monitor.oneMinute))
165
197
  this._tasks.push(new TaskUnFail(this))
166
- //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * this.oneHour))
198
+ //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * Monitor.oneHour))
167
199
  this._tasks.push(new TaskReviewStatus(this))
200
+ this._tasks.push(new TaskReorg(this))
168
201
  }
169
202
 
170
203
  addTask(task: WalletMonitorTask): void {
@@ -177,14 +210,6 @@ export class Monitor {
177
210
  this._tasks = this._tasks.filter(t => t.name !== name)
178
211
  }
179
212
 
180
- async setupChaintracksListeners(): Promise<void> {
181
- try {
182
- // TODO: Use a task monitoring the newest block headere to trigger processNewHeader and reorg handling.
183
- } catch (err) {
184
- /* this chaintracks doesn't support event subscriptions */
185
- }
186
- }
187
-
188
213
  async runTask(name: string): Promise<string> {
189
214
  let task = this._tasks.find(t => t.name === name)
190
215
  let log = ''
@@ -248,17 +273,28 @@ export class Monitor {
248
273
  }
249
274
 
250
275
  _runAsyncSetup: boolean = true
276
+ _tasksRunningPromise?: PromiseLike<void>
277
+ resolveCompletion: ((value: void | PromiseLike<void>) => void) | undefined = undefined
251
278
 
252
279
  async startTasks(): Promise<void> {
253
280
  if (this._tasksRunning) throw new WERR_BAD_REQUEST('monitor tasks are already runnining.')
254
281
 
255
282
  this._tasksRunning = true
283
+ this._tasksRunningPromise = new Promise(resolve => {
284
+ this.resolveCompletion = resolve
285
+ })
286
+
256
287
  for (; this._tasksRunning; ) {
257
288
  await this.runOnce()
258
289
 
259
290
  // console.log(`${new Date().toISOString()} tasks run, waiting...`)
260
291
  await wait(this.options.taskRunWaitMsecs)
261
292
  }
293
+
294
+ if (this.resolveCompletion) {
295
+ this.resolveCompletion()
296
+ this.resolveCompletion = undefined
297
+ }
262
298
  }
263
299
 
264
300
  async logEvent(event: string, details?: string): Promise<void> {
@@ -322,6 +358,8 @@ export class Monitor {
322
358
  }
323
359
  }
324
360
 
361
+ deactivatedHeaders: DeactivedHeader[] = []
362
+
325
363
  /**
326
364
  * Process reorg event received from Chaintracks
327
365
  *
@@ -333,7 +371,34 @@ export class Monitor {
333
371
  * Coinbase transactions always become invalid.
334
372
  */
335
373
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
336
- processReorg(depth: number, oldTip: BlockHeader, newTip: BlockHeader): void {
337
- /* */
374
+ processReorg(depth: number, oldTip: BlockHeader, newTip: BlockHeader, deactivatedHeaders?: BlockHeader[]): void {
375
+ if (deactivatedHeaders) {
376
+ for (const header of deactivatedHeaders) {
377
+ this.deactivatedHeaders.push({
378
+ whenMsecs: Date.now(),
379
+ tries: 0,
380
+ header
381
+ })
382
+ }
383
+ }
338
384
  }
385
+
386
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
387
+ processHeader(header: BlockHeader): void {}
388
+ }
389
+
390
+ export interface DeactivedHeader {
391
+ /**
392
+ * To control aging of notification before pursuing updated proof data.
393
+ */
394
+ whenMsecs: number
395
+ /**
396
+ * Number of attempts made to process the header.
397
+ * Supports returning deactivation notification to the queue if proof data is not yet available.
398
+ */
399
+ tries: number
400
+ /**
401
+ * The deactivated block header.
402
+ */
403
+ header: BlockHeader
339
404
  }
@@ -11,6 +11,7 @@ import { Monitor } from './Monitor'
11
11
  import { WERR_INTERNAL, WERR_INVALID_PARAMETER } from '../sdk/WERR_errors'
12
12
  import { wait } from '../utility/utilityHelpers'
13
13
  import { WalletError } from '../sdk/WalletError'
14
+ import { Chaintracks } from '../services/chaintracker/chaintracks/Chaintracks'
14
15
  dotenv.config()
15
16
 
16
17
  const mainDojoConnection = process.env.MAIN_DOJO_CONNECTION || ''
@@ -28,6 +29,7 @@ export interface MonitorDaemonSetup {
28
29
  servicesOptions?: WalletServicesOptions
29
30
  services?: Services
30
31
  monitor?: Monitor
32
+ chaintracks?: Chaintracks
31
33
  }
32
34
 
33
35
  export class MonitorDaemon {
@@ -99,6 +101,7 @@ export class MonitorDaemon {
99
101
  if (a.servicesOptions) {
100
102
  if (a.servicesOptions.chain != a.chain)
101
103
  throw new WERR_INVALID_PARAMETER('serviceOptions.chain', 'same as args.chain')
104
+ a.servicesOptions.chaintracks ||= a.chaintracks
102
105
  a.services = new Services(a.servicesOptions)
103
106
  }
104
107
 
@@ -108,7 +111,12 @@ export class MonitorDaemon {
108
111
 
109
112
  a.storageManager.setServices(a.services)
110
113
 
111
- const monitorOptions = Monitor.createDefaultWalletMonitorOptions(a.chain, a.storageManager, a.services)
114
+ const monitorOptions = Monitor.createDefaultWalletMonitorOptions(
115
+ a.chain,
116
+ a.storageManager,
117
+ a.services,
118
+ a.chaintracks
119
+ )
112
120
  a.monitor = new Monitor(monitorOptions)
113
121
  }
114
122