@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
@@ -1,17 +1,45 @@
1
- import * as dotenv from 'dotenv'
2
1
  import { MonitorDaemon } from '../MonitorDaemon'
3
- dotenv.config()
4
-
5
- const cloudMySQLConnection = process.env.TEST_CLOUD_MYSQL_CONNECTION || '{}'
2
+ import { Chain } from '../../sdk/types'
3
+ import { Services } from '../../services/Services'
4
+ import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
5
+ import { createDefaultNoDbChaintracksOptions } from '../../services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions'
6
+ import { Chaintracks } from '../../services/chaintracker/chaintracks/Chaintracks'
6
7
 
7
8
  describe('MonitorDaemon tests', () => {
8
9
  jest.setTimeout(99999999)
9
10
 
10
- test('0', async () => {
11
+ test('0 mainnet', async () => {
12
+ await test0Body('main')
13
+ })
14
+
15
+ test('0a testnet', async () => {
16
+ await test0Body('test')
17
+ })
18
+
19
+ async function test0Body(chain: Chain) {
20
+ const env = _tu.getEnv(chain)
21
+
22
+ const servicesOptions = Services.createDefaultOptions(chain)
23
+ if (env.taalApiKey) {
24
+ servicesOptions.taalApiKey = env.taalApiKey
25
+ servicesOptions.arcConfig.apiKey = env.taalApiKey
26
+ }
27
+ if (env.whatsonchainApiKey) servicesOptions.whatsOnChainApiKey = env.whatsonchainApiKey
28
+ if (env.bitailsApiKey) servicesOptions.bitailsApiKey = env.bitailsApiKey
29
+
30
+ const u = undefined
31
+ const maxRetained = 32
32
+ const chaintracksOptions = createDefaultNoDbChaintracksOptions(chain, env.whatsonchainApiKey, u, maxRetained)
33
+ const chaintracks = new Chaintracks(chaintracksOptions)
34
+ servicesOptions.chaintracks = chaintracks
35
+
11
36
  const d = new MonitorDaemon({
12
37
  chain: 'test',
13
- mySQLConnection: cloudMySQLConnection
38
+ mySQLConnection: env.cloudMySQLConnection,
39
+ servicesOptions,
40
+ chaintracks
14
41
  })
42
+
15
43
  await d.runDaemon()
16
- })
44
+ }
17
45
  })
@@ -26,7 +26,7 @@ export class TaskCheckNoSends extends WalletMonitorTask {
26
26
 
27
27
  constructor(
28
28
  monitor: Monitor,
29
- public triggerMsecs = monitor.oneDay * 1
29
+ public triggerMsecs = Monitor.oneDay * 1
30
30
  ) {
31
31
  super(monitor, TaskCheckNoSends.taskName)
32
32
  }
@@ -7,7 +7,7 @@ export class TaskClock extends WalletMonitorTask {
7
7
 
8
8
  constructor(
9
9
  monitor: Monitor,
10
- public triggerMsecs = 1 * monitor.oneSecond
10
+ public triggerMsecs = 1 * Monitor.oneSecond
11
11
  ) {
12
12
  super(monitor, TaskClock.taskName)
13
13
  this.nextMinute = this.getNextMinute()
@@ -28,6 +28,6 @@ export class TaskClock extends WalletMonitorTask {
28
28
  }
29
29
 
30
30
  getNextMinute(): number {
31
- return Math.ceil(Date.now() / this.monitor.oneMinute) * this.monitor.oneMinute
31
+ return Math.ceil(Date.now() / Monitor.oneMinute) * Monitor.oneMinute
32
32
  }
33
33
  }
@@ -7,7 +7,7 @@ export class TaskMonitorCallHistory extends WalletMonitorTask {
7
7
 
8
8
  constructor(
9
9
  monitor: Monitor,
10
- public triggerMsecs = monitor.oneMinute * 12
10
+ public triggerMsecs = Monitor.oneMinute * 12
11
11
  ) {
12
12
  super(monitor, TaskMonitorCallHistory.taskName)
13
13
  }
@@ -29,7 +29,7 @@ export class TaskNewHeader extends WalletMonitorTask {
29
29
 
30
30
  constructor(
31
31
  monitor: Monitor,
32
- public triggerMsecs = 1 * monitor.oneMinute
32
+ public triggerMsecs = 1 * Monitor.oneMinute
33
33
  ) {
34
34
  super(monitor, TaskNewHeader.taskName)
35
35
  }
@@ -0,0 +1,139 @@
1
+ import { TableProvenTx } from '../../index.client'
2
+ import { BlockHeader } from '../../services/chaintracker/chaintracks/Api/BlockHeaderApi'
3
+ import { DeactivedHeader, Monitor } from '../Monitor'
4
+ import { WalletMonitorTask } from './WalletMonitorTask'
5
+
6
+ /**
7
+ * Check the `monitor.deactivatedHeaders` for any headers that have been deactivated.
8
+ *
9
+ * When headers are found, review matching ProvenTx records and update proof data as appropriate.
10
+ *
11
+ * New deactivated headers are pushed onto the `deactivatedHeaders` array.
12
+ * They must be shifted out as they are processed.
13
+ *
14
+ * The current implementation ages deactivation notifications by 10 minutes with each retry.
15
+ * If a successful proof update confirms original proof data after 3 retries, the original is retained.
16
+ *
17
+ * In normal operation there should never be any work for this task to perform.
18
+ * The most common result is that there are no matching proven_txs records because
19
+ * generating new proven_txs records intentionally lags new block generation to
20
+ * minimize this disruption.
21
+ *
22
+ * It is very disruptive to update a proven_txs record because:
23
+ * - Sync'ed storage is impacted.
24
+ * - Generated beefs are impacted.
25
+ * - Updated proof data may be unavailable at the time a reorg is first reported.
26
+ *
27
+ * Instead of reorg notification derived from new header notification, reorg repair to
28
+ * the proven_txs table is more effectively driven by noticing that a beef generated for a new
29
+ * createAction fails to verify against the chaintracker.
30
+ *
31
+ * An alternate approach to processing these events is to revert the proven_txs record to a proven_tx_reqs record.
32
+ * Pros:
33
+ * - The same multiple attempt logic that already exists is reused.
34
+ * - Failing to obtain a new proof already has transaction failure handling in place.
35
+ * - Generated beefs automatically become one generation deeper, potentially allowing transaction outputs to be spent.
36
+ * Cons:
37
+ * - Transactions must revert to un-proven / un-mined.
38
+ */
39
+ export class TaskReorg extends WalletMonitorTask {
40
+ static taskName = 'Reorg'
41
+
42
+ process: DeactivedHeader[] = []
43
+
44
+ constructor(
45
+ monitor: Monitor,
46
+ public agedMsecs = Monitor.oneMinute * 10,
47
+ public maxRetries = 3
48
+ ) {
49
+ super(monitor, TaskReorg.taskName)
50
+ }
51
+
52
+ trigger(nowMsecsSinceEpoch: number): { run: boolean } {
53
+ const cutoff = nowMsecsSinceEpoch - this.agedMsecs
54
+ const q = this.monitor.deactivatedHeaders
55
+ while (q.length > 0 && cutoff > q[0].whenMsecs) {
56
+ // Prepare to process deactivated headers that have aged sufficiently (agedMsecs)
57
+ const header = q.shift()!
58
+ this.process.push(header)
59
+ }
60
+ return {
61
+ run: this.process.length > 0
62
+ }
63
+ }
64
+
65
+ async runTask(): Promise<string> {
66
+ let log = ''
67
+
68
+ for (;;) {
69
+ const header = this.process.shift()
70
+ if (!header) break
71
+
72
+ let ptxs: TableProvenTx[] = []
73
+
74
+ await this.storage.runAsStorageProvider(async sp => {
75
+ // Lookup all the proven_txs records matching the deactivated headers
76
+ ptxs = await sp.findProvenTxs({ partial: { blockHash: header.header.hash } })
77
+ })
78
+
79
+ log += ` block ${header.header.hash} orphaned with ${ptxs.length} impacted transactions\n`
80
+
81
+ let retry = false
82
+ for (const ptx of ptxs) {
83
+ const mpr = await this.monitor.services.getMerklePath(ptx.txid)
84
+ if (mpr.merklePath && mpr.header) {
85
+ const mp = mpr.merklePath
86
+ const h = mpr.header
87
+ const leaf = mp.path[0].find(leaf => leaf.txid === true && leaf.hash === ptx.txid)
88
+ if (leaf) {
89
+ const update: Partial<TableProvenTx> = {
90
+ height: mp.blockHeight,
91
+ index: leaf.offset,
92
+ merklePath: mp.toBinary(),
93
+ merkleRoot: h.merkleRoot,
94
+ blockHash: h.hash
95
+ }
96
+ if (update.blockHash === ptx.blockHash) {
97
+ log += ` txid ${ptx.txid} merkle path update still based on deactivated header ${ptx.blockHash}\n`
98
+ if (header.tries + 1 >= this.maxRetries) {
99
+ log += ` maximum retries ${this.maxRetries} exceeded\n`
100
+ } else {
101
+ retry = true
102
+ }
103
+ } else {
104
+ // Verify the new proof's validity.
105
+ const merkleRoot = mp.computeRoot(ptx.txid)
106
+ const chaintracker = await this.monitor.services.getChainTracker()
107
+ const isValid = await chaintracker.isValidRootForHeight(merkleRoot, update.height!)
108
+ const logUpdate = ` height ${ptx.height} ${ptx.height === update.height ? 'unchanged' : `-> ${update.height}`}\n`
109
+ log += ` blockHash ${ptx.blockHash} -> ${update.blockHash}\n`
110
+ log += ` merkleRoot ${ptx.merkleRoot} -> ${update.merkleRoot}\n`
111
+ log += ` index ${ptx.index} -> ${update.index}\n`
112
+ if (!isValid) {
113
+ log +=
114
+ ` txid ${ptx.txid} chaintracker fails to confirm updated merkle path update invalid\n` + logUpdate
115
+ } else {
116
+ await this.storage.runAsStorageProvider(async sp => {
117
+ await sp.updateProvenTx(ptx.provenTxId, update)
118
+ })
119
+ log += ` txid ${ptx.txid} proof data updated\n` + logUpdate
120
+ }
121
+ }
122
+ } else {
123
+ log += ` txid ${ptx.txid} merkle path update doesn't include txid\n`
124
+ retry = true
125
+ }
126
+ } else {
127
+ log += ` txid ${ptx.txid} merkle path update unavailable\n`
128
+ retry = true
129
+ }
130
+ }
131
+ if (retry) {
132
+ log += ` retrying...\n`
133
+ this.monitor.deactivatedHeaders.push({ header: header.header, whenMsecs: Date.now(), tries: header.tries + 1 })
134
+ }
135
+ }
136
+
137
+ return log
138
+ }
139
+ }
@@ -16,9 +16,9 @@ export class TaskSendWaiting extends WalletMonitorTask {
16
16
 
17
17
  constructor(
18
18
  monitor: Monitor,
19
- public triggerMsecs = monitor.oneSecond * 8,
20
- public agedMsecs = monitor.oneSecond * 7,
21
- public sendingMsecs = monitor.oneMinute * 5
19
+ public triggerMsecs = Monitor.oneSecond * 8,
20
+ public agedMsecs = Monitor.oneSecond * 7,
21
+ public sendingMsecs = Monitor.oneMinute * 5
22
22
  ) {
23
23
  super(monitor, TaskSendWaiting.taskName)
24
24
  }
@@ -25,7 +25,7 @@ export class TaskUnFail extends WalletMonitorTask {
25
25
 
26
26
  constructor(
27
27
  monitor: Monitor,
28
- public triggerMsecs = monitor.oneMinute * 10
28
+ public triggerMsecs = Monitor.oneMinute * 10
29
29
  ) {
30
30
  super(monitor, TaskUnFail.taskName)
31
31
  }
@@ -10,7 +10,12 @@ export type HeaderListener = (header: BlockHeader) => void
10
10
  /**
11
11
  * @public
12
12
  */
13
- export type ReorgListener = (depth: number, oldTip: BlockHeader, newTip: BlockHeader) => void
13
+ export type ReorgListener = (
14
+ depth: number,
15
+ oldTip: BlockHeader,
16
+ newTip: BlockHeader,
17
+ deactivatedHeaders?: BlockHeader[]
18
+ ) => void
14
19
 
15
20
  /**
16
21
  * @public
@@ -256,6 +256,10 @@ export type InsertHeaderResult = {
256
256
  * If `added` is true, this header was the active chain tip before the insert. It may or may not still be the active chain tip after the insert.
257
257
  */
258
258
  priorTip: LiveBlockHeader | undefined
259
+ /**
260
+ * If a reorg has occurred, these headers where active and are now deactivated.
261
+ */
262
+ deactivatedHeaders: LiveBlockHeader[]
259
263
  /**
260
264
  * header's previousHash was not found in database
261
265
  */
@@ -416,7 +416,9 @@ export class Chaintracks implements ChaintracksManagementApi {
416
416
  const reorgListener = this.callbacks.reorg[id]
417
417
  if (reorgListener) {
418
418
  try {
419
- reorgListener(ihr.reorgDepth, ihr.priorTip, header)
419
+ const priorTip: BlockHeader = { ...ihr.priorTip }
420
+ const deactivated: BlockHeader[] = ihr.deactivatedHeaders.map(lbh => ({ ...lbh }))
421
+ reorgListener(ihr.reorgDepth, priorTip, header, deactivated)
420
422
  } catch {
421
423
  /* ignore all errors thrown */
422
424
  }
@@ -4,7 +4,7 @@ import { IncomingMessage, Server, ServerResponse } from 'http'
4
4
  import express, { Request, Response } from 'express'
5
5
  import bodyParser from 'body-parser'
6
6
  import { Chain } from '../../../sdk/types'
7
- import { createNoDbChaintracksOptions } from './createDefaultNoDbChaintracksOptions'
7
+ import { createDefaultNoDbChaintracksOptions } from './createDefaultNoDbChaintracksOptions'
8
8
  import { Services } from '../../Services'
9
9
  import { FiatExchangeRates, WERR_INVALID_PARAMETER } from '../../../sdk'
10
10
  import { ChaintracksInfoApi } from './Api/ChaintracksClientApi'
@@ -45,7 +45,7 @@ export class ChaintracksService {
45
45
  this.options = { ...options }
46
46
  this.port = options.port
47
47
  this.chain = options.chain
48
- this.chaintracks = options.chaintracks || new Chaintracks(createNoDbChaintracksOptions(this.chain))
48
+ this.chaintracks = options.chaintracks || new Chaintracks(createDefaultNoDbChaintracksOptions(this.chain))
49
49
  this.services = options.services || new Services(this.chain)
50
50
  // Prevent recursion...
51
51
  this.services.updateFiatExchangeRateServices.remove('ChaintracksService')
@@ -263,7 +263,8 @@ export class ChaintracksStorageIdb extends ChaintracksStorageBase implements Cha
263
263
  isActiveTip: false,
264
264
  reorgDepth: 0,
265
265
  priorTip: undefined,
266
- noTip: false
266
+ noTip: false,
267
+ deactivatedHeaders: []
267
268
  }
268
269
 
269
270
  // Check for duplicate
@@ -359,8 +360,10 @@ export class ChaintracksStorageIdb extends ChaintracksStorageBase implements Cha
359
360
  }
360
361
 
361
362
  if (activeAncestor.headerId !== oneBack.headerId) {
363
+ // Deactivate reorg'ed headers
362
364
  let headerToDeactivate = this.repairStoredLiveHeader(await activeTipIndex.get([1, 1]))!
363
365
  while (headerToDeactivate && headerToDeactivate.headerId !== activeAncestor.headerId) {
366
+ r.deactivatedHeaders.push(headerToDeactivate)
364
367
  await store.put(this.prepareStoredLiveHeader({ ...headerToDeactivate, isActive: false }))
365
368
  headerToDeactivate = this.repairStoredLiveHeader(await store.get(headerToDeactivate.previousHeaderId!))!
366
369
  }
@@ -4,25 +4,15 @@ import { InsertHeaderResult, ChaintracksStorageBaseOptions } from '../Api/Chaint
4
4
  import { ChaintracksStorageBase } from './ChaintracksStorageBase'
5
5
  import { LiveBlockHeader } from '../Api/BlockHeaderApi'
6
6
  import { BlockHeader } from '../../../../sdk/WalletServices.interfaces'
7
- import {
8
- addWork,
9
- convertBitsToWork,
10
- isMoreWork,
11
- serializeBaseBlockHeader,
12
- serializeBaseBlockHeaders
13
- } from '../util/blockHeaderUtilities'
7
+ import { addWork, convertBitsToWork, isMoreWork } from '../util/blockHeaderUtilities'
14
8
  import { verifyOneOrNone } from '../../../../utility/utilityHelpers'
15
9
  import { DBType } from '../../../../storage/StorageReader'
16
10
  import { BulkHeaderFileInfo } from '../util/BulkHeaderFile'
17
11
  import { HeightRange } from '../util/HeightRange'
18
- import { BulkFilesReaderStorage } from '../util/BulkFilesReader'
19
- import { ChaintracksFetch } from '../util/ChaintracksFetch'
20
12
  import { ChaintracksStorageBulkFileApi } from '../Api/ChaintracksStorageApi'
21
13
  import { Chain } from '../../../../sdk/types'
22
14
  import { WERR_INVALID_OPERATION, WERR_INVALID_PARAMETER } from '../../../../sdk/WERR_errors'
23
15
  import { determineDBType } from '../../../../storage/schema/KnexMigrations'
24
- import { BulkFileDataReader } from '../index.client'
25
- import { asArray } from '../../../../utility/utilityHelpers.noBuffer'
26
16
 
27
17
  export interface ChaintracksStorageKnexOptions extends ChaintracksStorageBaseOptions {
28
18
  /**
@@ -231,7 +221,8 @@ export class ChaintracksStorageKnex extends ChaintracksStorageBase implements Ch
231
221
  isActiveTip: false,
232
222
  reorgDepth: 0,
233
223
  priorTip: undefined,
234
- noTip: false
224
+ noTip: false,
225
+ deactivatedHeaders: []
235
226
  }
236
227
 
237
228
  await this.knex.transaction(async trx => {
@@ -337,6 +328,7 @@ export class ChaintracksStorageKnex extends ChaintracksStorageBase implements Ch
337
328
  let [headerToDeactivate] = await trx<LiveBlockHeader>(table).where({ isChainTip: true, isActive: true })
338
329
  while (headerToDeactivate.headerId !== activeAncestor.headerId) {
339
330
  // Headers are deactivated until we reach the activeAncestor
331
+ r.deactivatedHeaders.push(headerToDeactivate)
340
332
  await trx<LiveBlockHeader>(table)
341
333
  .where({ headerId: headerToDeactivate.headerId })
342
334
  .update({ isActive: false })
@@ -177,7 +177,8 @@ export class ChaintracksStorageNoDb extends ChaintracksStorageBase {
177
177
  isActiveTip: false,
178
178
  reorgDepth: 0,
179
179
  priorTip: undefined,
180
- noTip: false
180
+ noTip: false,
181
+ deactivatedHeaders: []
181
182
  }
182
183
 
183
184
  // Check for duplicate
@@ -272,6 +273,7 @@ export class ChaintracksStorageNoDb extends ChaintracksStorageBase {
272
273
  if (activeAncestor.headerId !== oneBack.headerId) {
273
274
  let headerToDeactivate = Array.from(data.liveHeaders.values()).find(h => h.isChainTip && h.isActive)
274
275
  while (headerToDeactivate && headerToDeactivate.headerId !== activeAncestor.headerId) {
276
+ r.deactivatedHeaders.push(headerToDeactivate)
275
277
  data.liveHeaders.set(headerToDeactivate.headerId, { ...headerToDeactivate, isActive: false })
276
278
  headerToDeactivate = data.liveHeaders.get(headerToDeactivate.previousHeaderId!)
277
279
  }
@@ -2,7 +2,7 @@ import { createDefaultKnexChaintracksOptions } from '../createDefaultKnexChaintr
2
2
  import { Chaintracks } from '../Chaintracks'
3
3
  import { wait } from '../../../../utility/utilityHelpers'
4
4
  import { Chain } from '../../../../sdk'
5
- import { createNoDbChaintracksOptions } from '../createDefaultNoDbChaintracksOptions'
5
+ import { createDefaultNoDbChaintracksOptions } from '../createDefaultNoDbChaintracksOptions'
6
6
  import { ChaintracksFs } from '../util/ChaintracksFs'
7
7
  import { LocalCdnServer } from './LocalCdnServer'
8
8
 
@@ -52,7 +52,7 @@ describe('Chaintracks tests', () => {
52
52
  })
53
53
 
54
54
  async function NoDbBody(chain: Chain, exportHeaders?: boolean) {
55
- const o = createNoDbChaintracksOptions(chain)
55
+ const o = createDefaultNoDbChaintracksOptions(chain)
56
56
  const c = new Chaintracks(o)
57
57
  await c.makeAvailable()
58
58
 
@@ -0,0 +1,92 @@
1
+ import { Chain } from '../../../sdk'
2
+ import { ChaintracksOptions } from './Api/ChaintracksApi'
3
+ import { Chaintracks } from './Chaintracks'
4
+ import { BulkIngestorCDNBabbage } from './Ingest/BulkIngestorCDNBabbage'
5
+ import { ChaintracksFetch } from './util/ChaintracksFetch'
6
+ import { LiveIngestorWhatsOnChainOptions, LiveIngestorWhatsOnChainPoll } from './Ingest/LiveIngestorWhatsOnChainPoll'
7
+ import { BulkIngestorWhatsOnChainCdn, BulkIngestorWhatsOnChainOptions } from './Ingest/BulkIngestorWhatsOnChainCdn'
8
+ import { ChaintracksFetchApi } from './Api/ChaintracksFetchApi'
9
+ import { ChaintracksStorageIdb, ChaintracksStorageIdbOptions } from './Storage/ChaintracksStorageIdb'
10
+ import { BulkFileDataManager, BulkFileDataManagerOptions } from './util/BulkFileDataManager'
11
+ import { BulkIngestorCDNOptions } from './Ingest/BulkIngestorCDN'
12
+ import { WhatsOnChainServicesOptions } from './Ingest/WhatsOnChainServices'
13
+
14
+ export function createDefaultIdbChaintracksOptions(
15
+ chain: Chain,
16
+ whatsonchainApiKey: string = '',
17
+ maxPerFile: number = 100000,
18
+ maxRetained: number = 2,
19
+ fetch?: ChaintracksFetchApi,
20
+ cdnUrl: string = 'https://cdn.projectbabbage.com/blockheaders/',
21
+ liveHeightThreshold: number = 2000,
22
+ reorgHeightThreshold: number = 400,
23
+ bulkMigrationChunkSize: number = 500,
24
+ batchInsertLimit: number = 400,
25
+ addLiveRecursionLimit: number = 36
26
+ ): ChaintracksOptions {
27
+ fetch ||= new ChaintracksFetch()
28
+
29
+ const bfo: BulkFileDataManagerOptions = {
30
+ chain,
31
+ fetch,
32
+ maxPerFile,
33
+ maxRetained,
34
+ fromKnownSourceUrl: cdnUrl
35
+ }
36
+ const bulkFileDataManager = new BulkFileDataManager(bfo)
37
+
38
+ const so: ChaintracksStorageIdbOptions = {
39
+ chain,
40
+ bulkFileDataManager,
41
+ liveHeightThreshold,
42
+ reorgHeightThreshold,
43
+ bulkMigrationChunkSize,
44
+ batchInsertLimit
45
+ }
46
+ const storage = new ChaintracksStorageIdb(so)
47
+
48
+ const co: ChaintracksOptions = {
49
+ chain,
50
+ storage,
51
+ bulkIngestors: [],
52
+ liveIngestors: [],
53
+ addLiveRecursionLimit,
54
+ logging: (...args) => console.log(new Date().toISOString(), ...args),
55
+ readonly: false
56
+ }
57
+
58
+ const jsonResource = `${chain}NetBlockHeaders.json`
59
+
60
+ const bulkCdnOptions: BulkIngestorCDNOptions = {
61
+ chain,
62
+ jsonResource,
63
+ fetch,
64
+ cdnUrl,
65
+ maxPerFile
66
+ }
67
+ co.bulkIngestors.push(new BulkIngestorCDNBabbage(bulkCdnOptions))
68
+
69
+ const wocOptions: WhatsOnChainServicesOptions = {
70
+ chain,
71
+ apiKey: whatsonchainApiKey,
72
+ timeout: 30000,
73
+ userAgent: 'BabbageWhatsOnChainServices',
74
+ enableCache: true,
75
+ chainInfoMsecs: 5000
76
+ }
77
+
78
+ const bulkOptions: BulkIngestorWhatsOnChainOptions = {
79
+ ...wocOptions,
80
+ jsonResource,
81
+ idleWait: 5000
82
+ }
83
+ co.bulkIngestors.push(new BulkIngestorWhatsOnChainCdn(bulkOptions))
84
+
85
+ const liveOptions: LiveIngestorWhatsOnChainOptions = {
86
+ ...wocOptions,
87
+ idleWait: 100000
88
+ }
89
+ co.liveIngestors.push(new LiveIngestorWhatsOnChainPoll(liveOptions))
90
+
91
+ return co
92
+ }
@@ -1,13 +1,16 @@
1
1
  import { Knex, knex as makeKnex } from 'knex'
2
2
  import { Chain } from '../../../sdk'
3
3
  import { ChaintracksOptions } from './Api/ChaintracksApi'
4
- import { Chaintracks } from './Chaintracks'
5
4
  import { ChaintracksFs } from './util/ChaintracksFs'
6
- import { ChaintracksStorageKnex } from './Storage/ChaintracksStorageKnex'
5
+ import { ChaintracksStorageKnex, ChaintracksStorageKnexOptions } from './Storage/ChaintracksStorageKnex'
7
6
  import { BulkIngestorCDNBabbage } from './Ingest/BulkIngestorCDNBabbage'
8
7
  import { ChaintracksFetch } from './util/ChaintracksFetch'
9
- import { LiveIngestorWhatsOnChainPoll } from './Ingest/LiveIngestorWhatsOnChainPoll'
10
- import { BulkIngestorWhatsOnChainCdn } from './Ingest/BulkIngestorWhatsOnChainCdn'
8
+ import { LiveIngestorWhatsOnChainOptions, LiveIngestorWhatsOnChainPoll } from './Ingest/LiveIngestorWhatsOnChainPoll'
9
+ import { BulkIngestorWhatsOnChainCdn, BulkIngestorWhatsOnChainOptions } from './Ingest/BulkIngestorWhatsOnChainCdn'
10
+ import { ChaintracksFetchApi } from './Api/ChaintracksFetchApi'
11
+ import { BulkFileDataManager, BulkFileDataManagerOptions } from './util/BulkFileDataManager'
12
+ import { BulkIngestorCDNOptions } from './Ingest/BulkIngestorCDN'
13
+ import { WhatsOnChainServicesOptions } from './Ingest/WhatsOnChainServices'
11
14
 
12
15
  /**
13
16
  *
@@ -17,36 +20,92 @@ import { BulkIngestorWhatsOnChainCdn } from './Ingest/BulkIngestorWhatsOnChainCd
17
20
  */
18
21
  export function createDefaultKnexChaintracksOptions(
19
22
  chain: Chain,
20
- rootFolder?: string,
21
- knexConfig?: Knex.Config
23
+ rootFolder: string = './data/',
24
+ knexConfig?: Knex.Config,
25
+ whatsonchainApiKey: string = '',
26
+ maxPerFile: number = 100000,
27
+ maxRetained: number = 2,
28
+ fetch?: ChaintracksFetchApi,
29
+ cdnUrl: string = 'https://cdn.projectbabbage.com/blockheaders/',
30
+ liveHeightThreshold: number = 2000,
31
+ reorgHeightThreshold: number = 400,
32
+ bulkMigrationChunkSize: number = 500,
33
+ batchInsertLimit: number = 400,
34
+ addLiveRecursionLimit: number = 36
22
35
  ): ChaintracksOptions {
23
- if (!rootFolder) rootFolder = './data/'
36
+ fetch ||= new ChaintracksFetch()
24
37
 
25
- const options = Chaintracks.createOptions(chain)
38
+ const bfo: BulkFileDataManagerOptions = {
39
+ chain,
40
+ fetch,
41
+ maxPerFile,
42
+ maxRetained,
43
+ fromKnownSourceUrl: cdnUrl
44
+ }
45
+ const bulkFileDataManager = new BulkFileDataManager(bfo)
46
+
47
+ if (!knexConfig) {
48
+ knexConfig = {
49
+ client: 'sqlite3',
50
+ connection: { filename: ChaintracksFs.pathJoin(rootFolder, `${chain}Net_chaintracks.sqlite`) },
51
+ useNullAsDefault: true
52
+ }
53
+ }
54
+ const knexInstance = makeKnex(knexConfig)
26
55
 
27
- const fs = ChaintracksFs
28
- const fetch = new ChaintracksFetch()
56
+ const so: ChaintracksStorageKnexOptions = {
57
+ chain,
58
+ knex: knexInstance,
59
+ bulkFileDataManager,
60
+ liveHeightThreshold,
61
+ reorgHeightThreshold,
62
+ bulkMigrationChunkSize,
63
+ batchInsertLimit
64
+ }
65
+ const storage = new ChaintracksStorageKnex(so)
29
66
 
30
- const localSqlite: Knex.Config = {
31
- client: 'sqlite3',
32
- connection: { filename: fs.pathJoin(rootFolder, `${chain}Net_chaintracks.sqlite`) },
33
- useNullAsDefault: true
67
+ const co: ChaintracksOptions = {
68
+ chain,
69
+ storage,
70
+ bulkIngestors: [],
71
+ liveIngestors: [],
72
+ addLiveRecursionLimit,
73
+ logging: (...args) => console.log(new Date().toISOString(), ...args),
74
+ readonly: false
34
75
  }
35
76
 
36
- const knexInstance = makeKnex(knexConfig || localSqlite)
77
+ const jsonResource = `${chain}NetBlockHeaders.json`
37
78
 
38
- const knexOptions = ChaintracksStorageKnex.createStorageKnexOptions(chain)
39
- knexOptions.knex = knexInstance
40
- options.storage = new ChaintracksStorageKnex(knexOptions)
79
+ const bulkCdnOptions: BulkIngestorCDNOptions = {
80
+ chain,
81
+ jsonResource,
82
+ fetch,
83
+ cdnUrl,
84
+ maxPerFile
85
+ }
86
+ co.bulkIngestors.push(new BulkIngestorCDNBabbage(bulkCdnOptions))
41
87
 
42
- const bulkCDNOptions = BulkIngestorCDNBabbage.createBulkIngestorCDNBabbageOptions(chain, fetch)
43
- options.bulkIngestors.push(new BulkIngestorCDNBabbage(bulkCDNOptions))
88
+ const wocOptions: WhatsOnChainServicesOptions = {
89
+ chain,
90
+ apiKey: whatsonchainApiKey,
91
+ timeout: 30000,
92
+ userAgent: 'BabbageWhatsOnChainServices',
93
+ enableCache: true,
94
+ chainInfoMsecs: 5000
95
+ }
44
96
 
45
- const bulkWhatsOnChainOptions = BulkIngestorWhatsOnChainCdn.createBulkIngestorWhatsOnChainOptions(chain)
46
- options.bulkIngestors.push(new BulkIngestorWhatsOnChainCdn(bulkWhatsOnChainOptions))
97
+ const bulkOptions: BulkIngestorWhatsOnChainOptions = {
98
+ ...wocOptions,
99
+ jsonResource,
100
+ idleWait: 5000
101
+ }
102
+ co.bulkIngestors.push(new BulkIngestorWhatsOnChainCdn(bulkOptions))
47
103
 
48
- const liveWhatsOnChainOptions = LiveIngestorWhatsOnChainPoll.createLiveIngestorWhatsOnChainOptions(chain)
49
- options.liveIngestors.push(new LiveIngestorWhatsOnChainPoll(liveWhatsOnChainOptions))
104
+ const liveOptions: LiveIngestorWhatsOnChainOptions = {
105
+ ...wocOptions,
106
+ idleWait: 100000
107
+ }
108
+ co.liveIngestors.push(new LiveIngestorWhatsOnChainPoll(liveOptions))
50
109
 
51
- return options
110
+ return co
52
111
  }