glamsterdam-compat-lab 0.2.2 → 0.3.1
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/CONTRIBUTING.md +1 -1
- package/README.md +44 -5
- package/ROADMAP.md +8 -2
- package/data/client-compat/clients.example.json +15 -0
- package/datasets/public-seed/README.md +26 -0
- package/datasets/public-seed/comparisons/bytecode-storage-heavy--default-vs-research.json +168 -0
- package/datasets/public-seed/comparisons/traces-besu-debug-structlogs--default-vs-research.json +91 -0
- package/datasets/public-seed/comparisons/traces-besu-mainnet-tracoor-debug-structlogs--default-vs-research.json +140 -0
- package/datasets/public-seed/comparisons/traces-call-tracer-tree--default-vs-research.json +121 -0
- package/datasets/public-seed/comparisons/traces-drpc-call-tracer-real--default-vs-research.json +123 -0
- package/datasets/public-seed/comparisons/traces-erigon-action-trace--default-vs-research.json +121 -0
- package/datasets/public-seed/comparisons/traces-foundry-json-trace--default-vs-research.json +124 -0
- package/datasets/public-seed/comparisons/traces-geth-json-rpc-structlogs--default-vs-research.json +108 -0
- package/datasets/public-seed/comparisons/traces-hardhat-debug-trace--default-vs-research.json +108 -0
- package/datasets/public-seed/comparisons/traces-nethermind-debug-structlogs--default-vs-research.json +153 -0
- package/datasets/public-seed/comparisons/traces-nethermind-mainnet-tracoor-debug-structlogs--default-vs-research.json +140 -0
- package/datasets/public-seed/comparisons/traces-storage-heavy-trace--default-vs-research.json +155 -0
- package/datasets/public-seed/manifest.json +552 -0
- package/datasets/public-seed/reports/bytecode-storage-heavy--default.json +172 -0
- package/datasets/public-seed/reports/bytecode-storage-heavy--research.json +172 -0
- package/datasets/public-seed/reports/indexers-balance-diff-indexer--default.json +63 -0
- package/datasets/public-seed/reports/indexers-explorer-replay-indexer--default.json +45 -0
- package/datasets/public-seed/reports/indexers-subgraph--default.json +123 -0
- package/datasets/public-seed/reports/traces-besu-debug-structlogs--default.json +54 -0
- package/datasets/public-seed/reports/traces-besu-debug-structlogs--research.json +54 -0
- package/datasets/public-seed/reports/traces-besu-mainnet-tracoor-debug-structlogs--default.json +131 -0
- package/datasets/public-seed/reports/traces-besu-mainnet-tracoor-debug-structlogs--research.json +131 -0
- package/datasets/public-seed/reports/traces-call-tracer-tree--default.json +99 -0
- package/datasets/public-seed/reports/traces-call-tracer-tree--research.json +99 -0
- package/datasets/public-seed/reports/traces-drpc-call-tracer-real--default.json +103 -0
- package/datasets/public-seed/reports/traces-drpc-call-tracer-real--research.json +103 -0
- package/datasets/public-seed/reports/traces-erigon-action-trace--default.json +99 -0
- package/datasets/public-seed/reports/traces-erigon-action-trace--research.json +99 -0
- package/datasets/public-seed/reports/traces-foundry-json-trace--default.json +76 -0
- package/datasets/public-seed/reports/traces-foundry-json-trace--research.json +104 -0
- package/datasets/public-seed/reports/traces-geth-json-rpc-structlogs--default.json +78 -0
- package/datasets/public-seed/reports/traces-geth-json-rpc-structlogs--research.json +78 -0
- package/datasets/public-seed/reports/traces-hardhat-debug-trace--default.json +78 -0
- package/datasets/public-seed/reports/traces-hardhat-debug-trace--research.json +78 -0
- package/datasets/public-seed/reports/traces-nethermind-debug-structlogs--default.json +100 -0
- package/datasets/public-seed/reports/traces-nethermind-debug-structlogs--research.json +100 -0
- package/datasets/public-seed/reports/traces-nethermind-mainnet-tracoor-debug-structlogs--default.json +131 -0
- package/datasets/public-seed/reports/traces-nethermind-mainnet-tracoor-debug-structlogs--research.json +131 -0
- package/datasets/public-seed/reports/traces-storage-heavy-trace--default.json +151 -0
- package/datasets/public-seed/reports/traces-storage-heavy-trace--research.json +151 -0
- package/datasets/public-seed/reports/validator-operator-config--default.json +154 -0
- package/datasets/public-seed/reports/validator-operator-config-builder-gap--default.json +91 -0
- package/datasets/public-seed/reports/validator-operator-config-complete--default.json +27 -0
- package/dist/cli.js +17 -1
- package/dist/cli.js.map +1 -1
- package/dist/fixtures/provenance.d.ts +139 -0
- package/dist/fixtures/provenance.js +79 -0
- package/dist/fixtures/provenance.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/reports/compareReports.d.ts +2 -0
- package/dist/reports/compareReports.js +201 -0
- package/dist/reports/compareReports.js.map +1 -0
- package/dist/reports/jsonReporter.d.ts +2 -1
- package/dist/reports/jsonReporter.js +4 -1
- package/dist/reports/jsonReporter.js.map +1 -1
- package/dist/reports/markdownReporter.d.ts +2 -1
- package/dist/reports/markdownReporter.js +74 -0
- package/dist/reports/markdownReporter.js.map +1 -1
- package/dist/reports/reportTypes.d.ts +517 -1
- package/dist/reports/reportTypes.js +86 -1
- package/dist/reports/reportTypes.js.map +1 -1
- package/dist/scanners/validatorScanner.d.ts +1 -1
- package/dist/scanners/validatorScanner.js +4 -2
- package/dist/scanners/validatorScanner.js.map +1 -1
- package/docs/fixtures.md +34 -0
- package/docs/release.md +26 -20
- package/examples/baseline-comparison.md +76 -0
- package/fixtures/indexers/explorer-replay-indexer.json +64 -0
- package/fixtures/provenance.json +697 -0
- package/fixtures/reports/baseline-default-report.json +68 -0
- package/fixtures/reports/candidate-research-report.json +68 -0
- package/fixtures/traces/besu-mainnet-tracoor-debug-structlogs.json +4217 -0
- package/fixtures/traces/nethermind-mainnet-tracoor-debug-structlogs.json +5419 -0
- package/fixtures/validator/operator-config-builder-gap.yaml +22 -0
- package/fixtures/validator/operator-config-complete.yaml +28 -0
- package/package.json +4 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
{
|
|
2
|
+
"toolVersion": "0.3.1",
|
|
3
|
+
"fork": "glamsterdam",
|
|
4
|
+
"target": {
|
|
5
|
+
"kind": "trace",
|
|
6
|
+
"name": "fixtures/traces/storage-heavy-trace.json"
|
|
7
|
+
},
|
|
8
|
+
"summary": {
|
|
9
|
+
"risk": "medium",
|
|
10
|
+
"findingCount": 5,
|
|
11
|
+
"highCount": 0,
|
|
12
|
+
"mediumCount": 3,
|
|
13
|
+
"lowCount": 1,
|
|
14
|
+
"unknownCount": 1
|
|
15
|
+
},
|
|
16
|
+
"findings": [
|
|
17
|
+
{
|
|
18
|
+
"id": "trace.state-heavy-execution-medium",
|
|
19
|
+
"title": "Trace shows state-heavy execution",
|
|
20
|
+
"severity": "medium",
|
|
21
|
+
"confidence": "high",
|
|
22
|
+
"domain": [
|
|
23
|
+
"contracts",
|
|
24
|
+
"execution"
|
|
25
|
+
],
|
|
26
|
+
"relatedEips": [
|
|
27
|
+
"GAS-REPRICING",
|
|
28
|
+
"EIP-7904",
|
|
29
|
+
"EIP-8038",
|
|
30
|
+
"EIP-7976"
|
|
31
|
+
],
|
|
32
|
+
"description": "The executed trace includes repeated storage or state/account access operations. Glamsterdam repricing candidates may affect this cost profile, depending on final fork scope.",
|
|
33
|
+
"evidence": [
|
|
34
|
+
{
|
|
35
|
+
"storageOps": 12,
|
|
36
|
+
"sensitiveOpcodeCount": 12,
|
|
37
|
+
"opcodeCounts": {
|
|
38
|
+
"SLOAD": 6,
|
|
39
|
+
"SSTORE": 6
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"recommendation": "Keep this trace as a regression fixture and replay it when final Glamsterdam client configurations are available."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "trace.calldata-heavy-execution",
|
|
47
|
+
"title": "Trace includes visible calldata-heavy execution",
|
|
48
|
+
"severity": "medium",
|
|
49
|
+
"confidence": "high",
|
|
50
|
+
"domain": [
|
|
51
|
+
"contracts",
|
|
52
|
+
"execution"
|
|
53
|
+
],
|
|
54
|
+
"relatedEips": [
|
|
55
|
+
"GAS-REPRICING",
|
|
56
|
+
"EIP-7976",
|
|
57
|
+
"EIP-7904",
|
|
58
|
+
"EIP-8038"
|
|
59
|
+
],
|
|
60
|
+
"description": "The trace includes CALLDATACOPY or explicit calldata byte counts. Calldata repricing candidates are considered registry items, so large input paths should be tested.",
|
|
61
|
+
"evidence": [
|
|
62
|
+
{
|
|
63
|
+
"CALLDATACOPY": 1,
|
|
64
|
+
"calldataBytes": 8704
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"recommendation": "Replay large-input transactions and compare gas envelopes once a Glamsterdam configuration is available."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "trace.contract-creation-executed",
|
|
71
|
+
"title": "Trace executed contract creation",
|
|
72
|
+
"severity": "medium",
|
|
73
|
+
"confidence": "high",
|
|
74
|
+
"domain": [
|
|
75
|
+
"contracts",
|
|
76
|
+
"execution"
|
|
77
|
+
],
|
|
78
|
+
"relatedEips": [
|
|
79
|
+
"GAS-REPRICING",
|
|
80
|
+
"EIP-8037"
|
|
81
|
+
],
|
|
82
|
+
"description": "The trace executed CREATE or CREATE2. This is direct evidence that this transaction class exercises state creation.",
|
|
83
|
+
"evidence": [
|
|
84
|
+
{
|
|
85
|
+
"CREATE": 0,
|
|
86
|
+
"CREATE2": 1
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"recommendation": "Replay creation-heavy flows against Glamsterdam test environments and verify gas budgeting, relayer assumptions, and deployment automation."
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "trace.logs-calls-visible",
|
|
93
|
+
"title": "Trace includes logs or external calls",
|
|
94
|
+
"severity": "low",
|
|
95
|
+
"confidence": "high",
|
|
96
|
+
"domain": [
|
|
97
|
+
"contracts",
|
|
98
|
+
"indexer",
|
|
99
|
+
"monitoring"
|
|
100
|
+
],
|
|
101
|
+
"relatedEips": [
|
|
102
|
+
"EIP-7708",
|
|
103
|
+
"EIP-7928"
|
|
104
|
+
],
|
|
105
|
+
"description": "The trace includes log or call activity that may be relevant to indexer, explorer, and monitoring assumptions under Glamsterdam-era changes.",
|
|
106
|
+
"evidence": [
|
|
107
|
+
{
|
|
108
|
+
"logOps": 1,
|
|
109
|
+
"explicitLogEntries": 0,
|
|
110
|
+
"callOps": 1,
|
|
111
|
+
"maxDepth": 2
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"recommendation": "Use traces like this to test indexer replay, alerting, and explorer display paths alongside contract gas behavior."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "trace.partial-evidence",
|
|
118
|
+
"title": "Trace omits some useful compatibility evidence",
|
|
119
|
+
"severity": "unknown",
|
|
120
|
+
"confidence": "low",
|
|
121
|
+
"domain": [
|
|
122
|
+
"contracts",
|
|
123
|
+
"execution"
|
|
124
|
+
],
|
|
125
|
+
"relatedEips": [
|
|
126
|
+
"GAS-REPRICING",
|
|
127
|
+
"EIP-7976"
|
|
128
|
+
],
|
|
129
|
+
"description": "The trace was usable, but some formats omit calldata byte counts or per-op gas costs. The scanner reports what it can see and avoids inferring missing data.",
|
|
130
|
+
"evidence": [
|
|
131
|
+
{
|
|
132
|
+
"hasCalldataEvidence": true,
|
|
133
|
+
"hasGasCostEvidence": false,
|
|
134
|
+
"warnings": []
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"recommendation": "Prefer traces that include executed opcodes, depth, calldata/input sizes, and gas costs when comparing current and Glamsterdam behavior."
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"assumptions": [
|
|
141
|
+
"Trace input was normalized from an array of steps, a JSON-RPC result wrapper, a structLogs object, this project's normalized format, an action trace array, or a call-tracer-like calls tree.",
|
|
142
|
+
"The loaded registry is dated 2026-05-08. Glamsterdam scope and gas parameters may change.",
|
|
143
|
+
"Detector thresholds are dated 2026-05-09 and are MVP heuristics, not protocol gas parameters."
|
|
144
|
+
],
|
|
145
|
+
"limitations": [
|
|
146
|
+
"Trace coverage is only as good as the transaction samples provided.",
|
|
147
|
+
"Foundry and Hardhat can emit multiple trace shapes depending on command, plugin, and verbosity; this scanner supports representative JSON-like exports, not every console rendering.",
|
|
148
|
+
"Some trace formats omit calldata sizes, storage keys, gas costs, logs, or call details.",
|
|
149
|
+
"Findings are compatibility prompts and should be validated through replay or benchmarking."
|
|
150
|
+
]
|
|
151
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
{
|
|
2
|
+
"toolVersion": "0.3.1",
|
|
3
|
+
"fork": "glamsterdam",
|
|
4
|
+
"target": {
|
|
5
|
+
"kind": "trace",
|
|
6
|
+
"name": "fixtures/traces/storage-heavy-trace.json"
|
|
7
|
+
},
|
|
8
|
+
"summary": {
|
|
9
|
+
"risk": "medium",
|
|
10
|
+
"findingCount": 5,
|
|
11
|
+
"highCount": 0,
|
|
12
|
+
"mediumCount": 3,
|
|
13
|
+
"lowCount": 1,
|
|
14
|
+
"unknownCount": 1
|
|
15
|
+
},
|
|
16
|
+
"findings": [
|
|
17
|
+
{
|
|
18
|
+
"id": "trace.state-heavy-execution-medium",
|
|
19
|
+
"title": "Trace shows state-heavy execution",
|
|
20
|
+
"severity": "medium",
|
|
21
|
+
"confidence": "high",
|
|
22
|
+
"domain": [
|
|
23
|
+
"contracts",
|
|
24
|
+
"execution"
|
|
25
|
+
],
|
|
26
|
+
"relatedEips": [
|
|
27
|
+
"GAS-REPRICING",
|
|
28
|
+
"EIP-7904",
|
|
29
|
+
"EIP-8038",
|
|
30
|
+
"EIP-7976"
|
|
31
|
+
],
|
|
32
|
+
"description": "The executed trace includes repeated storage or state/account access operations. Glamsterdam repricing candidates may affect this cost profile, depending on final fork scope.",
|
|
33
|
+
"evidence": [
|
|
34
|
+
{
|
|
35
|
+
"storageOps": 12,
|
|
36
|
+
"sensitiveOpcodeCount": 12,
|
|
37
|
+
"opcodeCounts": {
|
|
38
|
+
"SLOAD": 6,
|
|
39
|
+
"SSTORE": 6
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"recommendation": "Keep this trace as a regression fixture and replay it when final Glamsterdam client configurations are available."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "trace.calldata-heavy-execution",
|
|
47
|
+
"title": "Trace includes visible calldata-heavy execution",
|
|
48
|
+
"severity": "medium",
|
|
49
|
+
"confidence": "high",
|
|
50
|
+
"domain": [
|
|
51
|
+
"contracts",
|
|
52
|
+
"execution"
|
|
53
|
+
],
|
|
54
|
+
"relatedEips": [
|
|
55
|
+
"GAS-REPRICING",
|
|
56
|
+
"EIP-7976",
|
|
57
|
+
"EIP-7904",
|
|
58
|
+
"EIP-8038"
|
|
59
|
+
],
|
|
60
|
+
"description": "The trace includes CALLDATACOPY or explicit calldata byte counts. Calldata repricing candidates are considered registry items, so large input paths should be tested.",
|
|
61
|
+
"evidence": [
|
|
62
|
+
{
|
|
63
|
+
"CALLDATACOPY": 1,
|
|
64
|
+
"calldataBytes": 8704
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"recommendation": "Replay large-input transactions and compare gas envelopes once a Glamsterdam configuration is available."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "trace.contract-creation-executed",
|
|
71
|
+
"title": "Trace executed contract creation",
|
|
72
|
+
"severity": "medium",
|
|
73
|
+
"confidence": "high",
|
|
74
|
+
"domain": [
|
|
75
|
+
"contracts",
|
|
76
|
+
"execution"
|
|
77
|
+
],
|
|
78
|
+
"relatedEips": [
|
|
79
|
+
"GAS-REPRICING",
|
|
80
|
+
"EIP-8037"
|
|
81
|
+
],
|
|
82
|
+
"description": "The trace executed CREATE or CREATE2. This is direct evidence that this transaction class exercises state creation.",
|
|
83
|
+
"evidence": [
|
|
84
|
+
{
|
|
85
|
+
"CREATE": 0,
|
|
86
|
+
"CREATE2": 1
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"recommendation": "Replay creation-heavy flows against Glamsterdam test environments and verify gas budgeting, relayer assumptions, and deployment automation."
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "trace.logs-calls-visible",
|
|
93
|
+
"title": "Trace includes logs or external calls",
|
|
94
|
+
"severity": "low",
|
|
95
|
+
"confidence": "high",
|
|
96
|
+
"domain": [
|
|
97
|
+
"contracts",
|
|
98
|
+
"indexer",
|
|
99
|
+
"monitoring"
|
|
100
|
+
],
|
|
101
|
+
"relatedEips": [
|
|
102
|
+
"EIP-7708",
|
|
103
|
+
"EIP-7928"
|
|
104
|
+
],
|
|
105
|
+
"description": "The trace includes log or call activity that may be relevant to indexer, explorer, and monitoring assumptions under Glamsterdam-era changes.",
|
|
106
|
+
"evidence": [
|
|
107
|
+
{
|
|
108
|
+
"logOps": 1,
|
|
109
|
+
"explicitLogEntries": 0,
|
|
110
|
+
"callOps": 1,
|
|
111
|
+
"maxDepth": 2
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"recommendation": "Use traces like this to test indexer replay, alerting, and explorer display paths alongside contract gas behavior."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "trace.partial-evidence",
|
|
118
|
+
"title": "Trace omits some useful compatibility evidence",
|
|
119
|
+
"severity": "unknown",
|
|
120
|
+
"confidence": "low",
|
|
121
|
+
"domain": [
|
|
122
|
+
"contracts",
|
|
123
|
+
"execution"
|
|
124
|
+
],
|
|
125
|
+
"relatedEips": [
|
|
126
|
+
"GAS-REPRICING",
|
|
127
|
+
"EIP-7976"
|
|
128
|
+
],
|
|
129
|
+
"description": "The trace was usable, but some formats omit calldata byte counts or per-op gas costs. The scanner reports what it can see and avoids inferring missing data.",
|
|
130
|
+
"evidence": [
|
|
131
|
+
{
|
|
132
|
+
"hasCalldataEvidence": true,
|
|
133
|
+
"hasGasCostEvidence": false,
|
|
134
|
+
"warnings": []
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"recommendation": "Prefer traces that include executed opcodes, depth, calldata/input sizes, and gas costs when comparing current and Glamsterdam behavior."
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"assumptions": [
|
|
141
|
+
"Trace input was normalized from an array of steps, a JSON-RPC result wrapper, a structLogs object, this project's normalized format, an action trace array, or a call-tracer-like calls tree.",
|
|
142
|
+
"The loaded registry is dated 2026-05-08. Glamsterdam scope and gas parameters may change.",
|
|
143
|
+
"Detector thresholds are dated 2026-05-09 and are MVP heuristics, not protocol gas parameters."
|
|
144
|
+
],
|
|
145
|
+
"limitations": [
|
|
146
|
+
"Trace coverage is only as good as the transaction samples provided.",
|
|
147
|
+
"Foundry and Hardhat can emit multiple trace shapes depending on command, plugin, and verbosity; this scanner supports representative JSON-like exports, not every console rendering.",
|
|
148
|
+
"Some trace formats omit calldata sizes, storage keys, gas costs, logs, or call details.",
|
|
149
|
+
"Findings are compatibility prompts and should be validated through replay or benchmarking."
|
|
150
|
+
]
|
|
151
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
{
|
|
2
|
+
"toolVersion": "0.3.1",
|
|
3
|
+
"fork": "glamsterdam",
|
|
4
|
+
"target": {
|
|
5
|
+
"kind": "validator",
|
|
6
|
+
"name": "fixtures/validator/operator-config.yaml"
|
|
7
|
+
},
|
|
8
|
+
"summary": {
|
|
9
|
+
"risk": "medium",
|
|
10
|
+
"findingCount": 6,
|
|
11
|
+
"highCount": 0,
|
|
12
|
+
"mediumCount": 4,
|
|
13
|
+
"lowCount": 0,
|
|
14
|
+
"unknownCount": 2
|
|
15
|
+
},
|
|
16
|
+
"findings": [
|
|
17
|
+
{
|
|
18
|
+
"id": "validator.unknown-execution-client-compatibility",
|
|
19
|
+
"title": "Unknown Glamsterdam compatibility for execution client",
|
|
20
|
+
"severity": "unknown",
|
|
21
|
+
"confidence": "high",
|
|
22
|
+
"domain": [
|
|
23
|
+
"validator"
|
|
24
|
+
],
|
|
25
|
+
"relatedEips": [
|
|
26
|
+
"EIP-7732"
|
|
27
|
+
],
|
|
28
|
+
"description": "The compatibility matrix does not contain a sourced status for geth v1.99.0-example as a execution client. The scanner will not infer compatibility from client name alone.",
|
|
29
|
+
"evidence": [
|
|
30
|
+
{
|
|
31
|
+
"role": "execution",
|
|
32
|
+
"name": "geth",
|
|
33
|
+
"version": "v1.99.0-example",
|
|
34
|
+
"matrixLastUpdated": "2026-05-08"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"recommendation": "Update the client compatibility matrix with sourced release/devnet information, or treat this as a manual-readiness checklist item."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "validator.unknown-consensus-client-compatibility",
|
|
41
|
+
"title": "Unknown Glamsterdam compatibility for consensus client",
|
|
42
|
+
"severity": "unknown",
|
|
43
|
+
"confidence": "high",
|
|
44
|
+
"domain": [
|
|
45
|
+
"validator"
|
|
46
|
+
],
|
|
47
|
+
"relatedEips": [
|
|
48
|
+
"EIP-7732"
|
|
49
|
+
],
|
|
50
|
+
"description": "The compatibility matrix does not contain a sourced status for lighthouse v9.99.0-example as a consensus client. The scanner will not infer compatibility from client name alone.",
|
|
51
|
+
"evidence": [
|
|
52
|
+
{
|
|
53
|
+
"role": "consensus",
|
|
54
|
+
"name": "lighthouse",
|
|
55
|
+
"version": "v9.99.0-example",
|
|
56
|
+
"matrixLastUpdated": "2026-05-08"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"recommendation": "Update the client compatibility matrix with sourced release/devnet information, or treat this as a manual-readiness checklist item."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "validator.missing-validator-client-version",
|
|
63
|
+
"title": "Missing validator client version",
|
|
64
|
+
"severity": "medium",
|
|
65
|
+
"confidence": "high",
|
|
66
|
+
"domain": [
|
|
67
|
+
"validator"
|
|
68
|
+
],
|
|
69
|
+
"relatedEips": [
|
|
70
|
+
"EIP-7732"
|
|
71
|
+
],
|
|
72
|
+
"description": "The config names lighthouse as the validator client, but does not include a version. Compatibility cannot be assessed without explicit version metadata.",
|
|
73
|
+
"evidence": [
|
|
74
|
+
{
|
|
75
|
+
"name": "lighthouse"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"recommendation": "Add validatorClient.version and keep it updated from deployment automation or release inventory."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "validator.builder-enabled-without-endpoint",
|
|
82
|
+
"title": "Builder integration is enabled but no endpoint is configured",
|
|
83
|
+
"severity": "medium",
|
|
84
|
+
"confidence": "high",
|
|
85
|
+
"domain": [
|
|
86
|
+
"validator",
|
|
87
|
+
"builder",
|
|
88
|
+
"consensus"
|
|
89
|
+
],
|
|
90
|
+
"relatedEips": [
|
|
91
|
+
"EIP-7732"
|
|
92
|
+
],
|
|
93
|
+
"description": "The config marks builder integration as enabled but does not include an endpoint. This may simply mean the local config is incomplete, so the scanner treats it as a readiness checklist item.",
|
|
94
|
+
"evidence": [
|
|
95
|
+
{
|
|
96
|
+
"builderEnabled": true
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"recommendation": "Add the intended builder endpoint or document why endpoint configuration is managed elsewhere."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "validator.missing-monitoring-endpoints",
|
|
103
|
+
"title": "Monitoring endpoint metadata is incomplete",
|
|
104
|
+
"severity": "medium",
|
|
105
|
+
"confidence": "high",
|
|
106
|
+
"domain": [
|
|
107
|
+
"validator",
|
|
108
|
+
"monitoring"
|
|
109
|
+
],
|
|
110
|
+
"relatedEips": [
|
|
111
|
+
"EIP-7732",
|
|
112
|
+
"EIP-7928"
|
|
113
|
+
],
|
|
114
|
+
"description": "The config does not include both Prometheus and Grafana monitoring metadata. Glamsterdam readiness should include observable EL, CL, validator, builder, and fork-specific metrics.",
|
|
115
|
+
"evidence": [
|
|
116
|
+
{
|
|
117
|
+
"prometheus": ""
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"recommendation": "Record monitoring endpoints or dashboards and add alert coverage for devnet/testnet participation, missed duties, builder/API health, and sync status."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "validator.missing-testnet-participation",
|
|
124
|
+
"title": "No testnet or devnet participation metadata found",
|
|
125
|
+
"severity": "medium",
|
|
126
|
+
"confidence": "high",
|
|
127
|
+
"domain": [
|
|
128
|
+
"validator",
|
|
129
|
+
"monitoring"
|
|
130
|
+
],
|
|
131
|
+
"relatedEips": [
|
|
132
|
+
"EIP-7732",
|
|
133
|
+
"EIP-7928"
|
|
134
|
+
],
|
|
135
|
+
"description": "The config does not list Glamsterdam-oriented testnet or devnet participation. Operator readiness should be validated before mainnet activation timing is final.",
|
|
136
|
+
"evidence": [
|
|
137
|
+
{
|
|
138
|
+
"testnetParticipation": []
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"recommendation": "Add planned or completed testnet/devnet participation, including client versions, dates, observed issues, and rollback notes."
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"assumptions": [
|
|
145
|
+
"Validator/operator readiness was checked from a local JSON/YAML config only.",
|
|
146
|
+
"Client compatibility was compared against data/client-compat/clients.example.json. Unknown entries are reported without guessing.",
|
|
147
|
+
"The loaded registry is dated 2026-05-08. Glamsterdam scope and gas parameters may change."
|
|
148
|
+
],
|
|
149
|
+
"limitations": [
|
|
150
|
+
"This scanner does not verify live node state, command-line flags, environment variables, firewall rules, or remote service health.",
|
|
151
|
+
"Client compatibility must come from a maintained matrix with explicit source links.",
|
|
152
|
+
"A clean report does not replace devnet/testnet participation or operational drills."
|
|
153
|
+
]
|
|
154
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"toolVersion": "0.3.1",
|
|
3
|
+
"fork": "glamsterdam",
|
|
4
|
+
"target": {
|
|
5
|
+
"kind": "validator",
|
|
6
|
+
"name": "fixtures/validator/operator-config-builder-gap.yaml"
|
|
7
|
+
},
|
|
8
|
+
"summary": {
|
|
9
|
+
"risk": "medium",
|
|
10
|
+
"findingCount": 3,
|
|
11
|
+
"highCount": 0,
|
|
12
|
+
"mediumCount": 3,
|
|
13
|
+
"lowCount": 0,
|
|
14
|
+
"unknownCount": 0
|
|
15
|
+
},
|
|
16
|
+
"findings": [
|
|
17
|
+
{
|
|
18
|
+
"id": "validator.builder-enabled-without-endpoint",
|
|
19
|
+
"title": "Builder integration is enabled but no endpoint is configured",
|
|
20
|
+
"severity": "medium",
|
|
21
|
+
"confidence": "high",
|
|
22
|
+
"domain": [
|
|
23
|
+
"validator",
|
|
24
|
+
"builder",
|
|
25
|
+
"consensus"
|
|
26
|
+
],
|
|
27
|
+
"relatedEips": [
|
|
28
|
+
"EIP-7732"
|
|
29
|
+
],
|
|
30
|
+
"description": "The config marks builder integration as enabled but does not include an endpoint. This may simply mean the local config is incomplete, so the scanner treats it as a readiness checklist item.",
|
|
31
|
+
"evidence": [
|
|
32
|
+
{
|
|
33
|
+
"builderEnabled": true
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"recommendation": "Add the intended builder endpoint or document why endpoint configuration is managed elsewhere."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "validator.missing-monitoring-endpoints",
|
|
40
|
+
"title": "Monitoring endpoint metadata is incomplete",
|
|
41
|
+
"severity": "medium",
|
|
42
|
+
"confidence": "high",
|
|
43
|
+
"domain": [
|
|
44
|
+
"validator",
|
|
45
|
+
"monitoring"
|
|
46
|
+
],
|
|
47
|
+
"relatedEips": [
|
|
48
|
+
"EIP-7732",
|
|
49
|
+
"EIP-7928"
|
|
50
|
+
],
|
|
51
|
+
"description": "The config does not include both Prometheus and Grafana monitoring metadata. Glamsterdam readiness should include observable EL, CL, validator, builder, and fork-specific metrics.",
|
|
52
|
+
"evidence": [
|
|
53
|
+
{
|
|
54
|
+
"prometheus": "https://monitoring.example.invalid/prometheus"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"recommendation": "Record monitoring endpoints or dashboards and add alert coverage for devnet/testnet participation, missed duties, builder/API health, and sync status."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "validator.missing-testnet-participation",
|
|
61
|
+
"title": "No testnet or devnet participation metadata found",
|
|
62
|
+
"severity": "medium",
|
|
63
|
+
"confidence": "high",
|
|
64
|
+
"domain": [
|
|
65
|
+
"validator",
|
|
66
|
+
"monitoring"
|
|
67
|
+
],
|
|
68
|
+
"relatedEips": [
|
|
69
|
+
"EIP-7732",
|
|
70
|
+
"EIP-7928"
|
|
71
|
+
],
|
|
72
|
+
"description": "The config does not list Glamsterdam-oriented testnet or devnet participation. Operator readiness should be validated before mainnet activation timing is final.",
|
|
73
|
+
"evidence": [
|
|
74
|
+
{
|
|
75
|
+
"testnetParticipation": []
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"recommendation": "Add planned or completed testnet/devnet participation, including client versions, dates, observed issues, and rollback notes."
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"assumptions": [
|
|
82
|
+
"Validator/operator readiness was checked from a local JSON/YAML config only.",
|
|
83
|
+
"Client compatibility was compared against data/client-compat/clients.example.json. Unknown entries are reported without guessing.",
|
|
84
|
+
"The loaded registry is dated 2026-05-08. Glamsterdam scope and gas parameters may change."
|
|
85
|
+
],
|
|
86
|
+
"limitations": [
|
|
87
|
+
"This scanner does not verify live node state, command-line flags, environment variables, firewall rules, or remote service health.",
|
|
88
|
+
"Client compatibility must come from a maintained matrix with explicit source links.",
|
|
89
|
+
"A clean report does not replace devnet/testnet participation or operational drills."
|
|
90
|
+
]
|
|
91
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"toolVersion": "0.3.1",
|
|
3
|
+
"fork": "glamsterdam",
|
|
4
|
+
"target": {
|
|
5
|
+
"kind": "validator",
|
|
6
|
+
"name": "fixtures/validator/operator-config-complete.yaml"
|
|
7
|
+
},
|
|
8
|
+
"summary": {
|
|
9
|
+
"risk": "low",
|
|
10
|
+
"findingCount": 0,
|
|
11
|
+
"highCount": 0,
|
|
12
|
+
"mediumCount": 0,
|
|
13
|
+
"lowCount": 0,
|
|
14
|
+
"unknownCount": 0
|
|
15
|
+
},
|
|
16
|
+
"findings": [],
|
|
17
|
+
"assumptions": [
|
|
18
|
+
"Validator/operator readiness was checked from a local JSON/YAML config only.",
|
|
19
|
+
"Client compatibility was compared against data/client-compat/clients.example.json. Unknown entries are reported without guessing.",
|
|
20
|
+
"The loaded registry is dated 2026-05-08. Glamsterdam scope and gas parameters may change."
|
|
21
|
+
],
|
|
22
|
+
"limitations": [
|
|
23
|
+
"This scanner does not verify live node state, command-line flags, environment variables, firewall rules, or remote service health.",
|
|
24
|
+
"Client compatibility must come from a maintained matrix with explicit source links.",
|
|
25
|
+
"A clean report does not replace devnet/testnet participation or operational drills."
|
|
26
|
+
]
|
|
27
|
+
}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
-
import { combineReports, defaultClientMatrixPath, defaultThresholdsPath, loadEipRegistry, renderJsonReport, renderMarkdownReport, scanBytecode, scanIndexer, scanTraceFile, scanValidatorConfig, validateCompatibilityReport, fetchAndScanTransactionTrace, writeFetchedTrace } from "./index.js";
|
|
4
|
+
import { combineReports, defaultClientMatrixPath, defaultThresholdsPath, compareCompatibilityReports, loadEipRegistry, renderJsonComparisonReport, renderJsonReport, renderMarkdownComparisonReport, renderMarkdownReport, scanBytecode, scanIndexer, scanTraceFile, scanValidatorConfig, validateCompatibilityReport, fetchAndScanTransactionTrace, writeFetchedTrace } from "./index.js";
|
|
5
5
|
import { TOOL_VERSION } from "./reports/reportTypes.js";
|
|
6
6
|
import { parseDebugTraceMode } from "./scanners/rpcTraceScanner.js";
|
|
7
7
|
const program = new Command();
|
|
@@ -111,6 +111,19 @@ program
|
|
|
111
111
|
const parsedReports = reports.map((path) => validateCompatibilityReport(JSON.parse(readFileSync(path, "utf8"))));
|
|
112
112
|
writeReport(combineReports(parsedReports), parseFormat(options.format));
|
|
113
113
|
});
|
|
114
|
+
program
|
|
115
|
+
.command("compare-reports")
|
|
116
|
+
.alias("compare")
|
|
117
|
+
.argument("<baseline-report>", "Baseline JSON report generated with --format json")
|
|
118
|
+
.argument("<candidate-report>", "Candidate JSON report generated with --format json")
|
|
119
|
+
.option("--format <format>", "Output format: markdown or json", "markdown")
|
|
120
|
+
.description("Compare two saved JSON compatibility reports")
|
|
121
|
+
.action((baselineReport, candidateReport, options) => {
|
|
122
|
+
const baseline = validateCompatibilityReport(JSON.parse(readFileSync(baselineReport, "utf8")));
|
|
123
|
+
const candidate = validateCompatibilityReport(JSON.parse(readFileSync(candidateReport, "utf8")));
|
|
124
|
+
const comparison = compareCompatibilityReports(baseline, candidate);
|
|
125
|
+
writeComparisonReport(comparison, parseFormat(options.format));
|
|
126
|
+
});
|
|
114
127
|
program.parseAsync(process.argv).catch((error) => {
|
|
115
128
|
const message = error instanceof Error ? error.message : String(error);
|
|
116
129
|
process.stderr.write(`Error: ${message}\n`);
|
|
@@ -119,6 +132,9 @@ program.parseAsync(process.argv).catch((error) => {
|
|
|
119
132
|
function writeReport(report, format) {
|
|
120
133
|
process.stdout.write(format === "json" ? renderJsonReport(report) : renderMarkdownReport(report));
|
|
121
134
|
}
|
|
135
|
+
function writeComparisonReport(report, format) {
|
|
136
|
+
process.stdout.write(format === "json" ? renderJsonComparisonReport(report) : renderMarkdownComparisonReport(report));
|
|
137
|
+
}
|
|
122
138
|
function parseFormat(format) {
|
|
123
139
|
if (format === "markdown" || format === "json") {
|
|
124
140
|
return format;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,2BAA2B,EAC3B,4BAA4B,EAC5B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|