@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/wallet-toolbox",
|
|
3
|
-
"version": "1.6.
|
|
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.
|
|
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.
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
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
|
-
//
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
description: `
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
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
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
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
|
/**
|
package/src/index.mobile.ts
CHANGED
|
@@ -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.
|
|
5
|
+
export * from './services/chaintracker/chaintracks/index.mobile'
|
|
6
6
|
|
|
7
7
|
export * from './CWIStyleWalletManager'
|
|
8
8
|
export * from './monitor/Monitor'
|
package/src/monitor/Monitor.ts
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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 *
|
|
117
|
-
purgeCompletedAge: 2 *
|
|
118
|
-
purgeFailedAge: 5 *
|
|
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 *
|
|
145
|
-
this._tasks.push(new TaskCheckForProofs(this, 2 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
162
|
-
this._tasks.push(new TaskCheckForProofs(this, 2 *
|
|
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 *
|
|
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 *
|
|
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(
|
|
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
|
|