@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.
- package/CHANGELOG.md +11 -0
- package/docs/client.md +298 -167
- package/docs/monitor.md +126 -23
- package/docs/services.md +86 -37
- package/docs/wallet.md +298 -167
- package/mobile/out/src/WalletPermissionsManager.d.ts +3 -0
- package/mobile/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/mobile/out/src/WalletPermissionsManager.js +185 -43
- package/mobile/out/src/WalletPermissionsManager.js.map +1 -1
- package/mobile/out/src/index.mobile.d.ts +1 -1
- package/mobile/out/src/index.mobile.js +1 -1
- package/mobile/out/src/monitor/Monitor.d.ts +32 -8
- package/mobile/out/src/monitor/Monitor.d.ts.map +1 -1
- package/mobile/out/src/monitor/Monitor.js +59 -28
- package/mobile/out/src/monitor/Monitor.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskCheckNoSends.js +2 -1
- package/mobile/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskClock.js +3 -2
- package/mobile/out/src/monitor/tasks/TaskClock.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskMonitorCallHistory.js +2 -1
- package/mobile/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskNewHeader.js +2 -1
- package/mobile/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskReorg.d.ts +47 -0
- package/mobile/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -0
- package/mobile/out/src/monitor/tasks/TaskReorg.js +135 -0
- package/mobile/out/src/monitor/tasks/TaskReorg.js.map +1 -0
- package/mobile/out/src/monitor/tasks/TaskSendWaiting.js +2 -1
- package/mobile/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
- package/mobile/out/src/monitor/tasks/TaskUnFail.js +2 -1
- package/mobile/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +4 -0
- package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js +3 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +4 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +3 -1
- package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +5 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +68 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +59 -15
- package/mobile/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +4 -61
- package/mobile/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +13 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +27 -0
- package/mobile/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/index.client.d.ts +2 -28
- package/mobile/out/src/services/chaintracker/chaintracks/index.client.d.ts.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/index.client.js +2 -50
- package/mobile/out/src/services/chaintracker/chaintracks/index.client.js.map +1 -1
- package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +30 -0
- package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.js +68 -0
- package/mobile/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -0
- package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +11 -11
- package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
- package/mobile/package-lock.json +7 -6
- package/mobile/package.json +2 -2
- package/out/src/WalletPermissionsManager.d.ts +3 -0
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +185 -43
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/index.mobile.d.ts +1 -1
- package/out/src/index.mobile.js +1 -1
- package/out/src/monitor/Monitor.d.ts +32 -8
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +59 -28
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/MonitorDaemon.d.ts +2 -0
- package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
- package/out/src/monitor/MonitorDaemon.js +3 -1
- package/out/src/monitor/MonitorDaemon.js.map +1 -1
- package/out/src/monitor/__test/MonitorDaemon.man.test.js +30 -39
- package/out/src/monitor/__test/MonitorDaemon.man.test.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.js +2 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
- package/out/src/monitor/tasks/TaskClock.js +3 -2
- package/out/src/monitor/tasks/TaskClock.js.map +1 -1
- package/out/src/monitor/tasks/TaskMonitorCallHistory.js +2 -1
- package/out/src/monitor/tasks/TaskMonitorCallHistory.js.map +1 -1
- package/out/src/monitor/tasks/TaskNewHeader.js +2 -1
- package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
- package/out/src/monitor/tasks/TaskReorg.d.ts +47 -0
- package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -0
- package/out/src/monitor/tasks/TaskReorg.js +135 -0
- package/out/src/monitor/tasks/TaskReorg.js.map +1 -0
- package/out/src/monitor/tasks/TaskSendWaiting.js +2 -1
- package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.js +2 -1
- package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +4 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js +3 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +4 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +3 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +3 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js +1 -1
- package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts +5 -0
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js +68 -0
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js +66 -22
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js +59 -15
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +4 -61
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts +14 -0
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +27 -0
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts +13 -0
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +27 -0
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts +1 -0
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.js +1 -0
- package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.client.d.ts +2 -28
- package/out/src/services/chaintracker/chaintracks/index.client.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.client.js +2 -50
- package/out/src/services/chaintracker/chaintracks/index.client.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +30 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js +68 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +11 -11
- package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
- package/out/src/services/chaintracker/index.mobile.d.ts +4 -0
- package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -0
- package/out/src/services/chaintracker/index.mobile.js +20 -0
- package/out/src/services/chaintracker/index.mobile.js.map +1 -0
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +12 -0
- package/out/src/storage/schema/KnexMigrations.js.map +1 -1
- package/out/test/monitor/Monitor.test.js +32 -29
- package/out/test/monitor/Monitor.test.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/WalletPermissionsManager.ts +245 -57
- package/src/index.mobile.ts +1 -1
- package/src/monitor/Monitor.ts +94 -29
- package/src/monitor/MonitorDaemon.ts +9 -1
- package/src/monitor/__test/MonitorDaemon.man.test.ts +35 -7
- package/src/monitor/tasks/TaskCheckNoSends.ts +1 -1
- package/src/monitor/tasks/TaskClock.ts +2 -2
- package/src/monitor/tasks/TaskMonitorCallHistory.ts +1 -1
- package/src/monitor/tasks/TaskNewHeader.ts +1 -1
- package/src/monitor/tasks/TaskReorg.ts +139 -0
- package/src/monitor/tasks/TaskSendWaiting.ts +3 -3
- package/src/monitor/tasks/TaskUnFail.ts +1 -1
- package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +6 -1
- package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +4 -0
- package/src/services/chaintracker/chaintracks/Chaintracks.ts +3 -1
- package/src/services/chaintracker/chaintracks/ChaintracksService.ts +2 -2
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +4 -1
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +4 -12
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +3 -1
- package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +2 -2
- package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
- package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +84 -25
- package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +79 -17
- package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +11 -64
- package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
- package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
- package/src/services/chaintracker/chaintracks/index.all.ts +1 -0
- package/src/services/chaintracker/chaintracks/index.client.ts +2 -35
- package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
- package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +11 -11
- package/src/services/chaintracker/index.mobile.ts +4 -0
- package/src/storage/schema/KnexMigrations.ts +13 -0
- 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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
})
|
|
@@ -7,7 +7,7 @@ export class TaskClock extends WalletMonitorTask {
|
|
|
7
7
|
|
|
8
8
|
constructor(
|
|
9
9
|
monitor: Monitor,
|
|
10
|
-
public triggerMsecs = 1 *
|
|
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() /
|
|
31
|
+
return Math.ceil(Date.now() / Monitor.oneMinute) * Monitor.oneMinute
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -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 =
|
|
20
|
-
public agedMsecs =
|
|
21
|
-
public sendingMsecs =
|
|
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
|
}
|
|
@@ -10,7 +10,12 @@ export type HeaderListener = (header: BlockHeader) => void
|
|
|
10
10
|
/**
|
|
11
11
|
* @public
|
|
12
12
|
*/
|
|
13
|
-
export type ReorgListener = (
|
|
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
|
-
|
|
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 {
|
|
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(
|
|
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 {
|
|
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 =
|
|
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
|
|
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
|
-
|
|
36
|
+
fetch ||= new ChaintracksFetch()
|
|
24
37
|
|
|
25
|
-
const
|
|
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
|
|
28
|
-
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
77
|
+
const jsonResource = `${chain}NetBlockHeaders.json`
|
|
37
78
|
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
43
|
-
|
|
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
|
|
46
|
-
|
|
97
|
+
const bulkOptions: BulkIngestorWhatsOnChainOptions = {
|
|
98
|
+
...wocOptions,
|
|
99
|
+
jsonResource,
|
|
100
|
+
idleWait: 5000
|
|
101
|
+
}
|
|
102
|
+
co.bulkIngestors.push(new BulkIngestorWhatsOnChainCdn(bulkOptions))
|
|
47
103
|
|
|
48
|
-
const
|
|
49
|
-
|
|
104
|
+
const liveOptions: LiveIngestorWhatsOnChainOptions = {
|
|
105
|
+
...wocOptions,
|
|
106
|
+
idleWait: 100000
|
|
107
|
+
}
|
|
108
|
+
co.liveIngestors.push(new LiveIngestorWhatsOnChainPoll(liveOptions))
|
|
50
109
|
|
|
51
|
-
return
|
|
110
|
+
return co
|
|
52
111
|
}
|