glamsterdam-compat-lab 0.2.2
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 +59 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/ROADMAP.md +76 -0
- package/SECURITY.md +19 -0
- package/data/client-compat/clients.example.json +42 -0
- package/data/detectors/thresholds.ci.json +33 -0
- package/data/detectors/thresholds.json +33 -0
- package/data/detectors/thresholds.research.json +33 -0
- package/data/eips/glamsterdam.json +85 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +163 -0
- package/dist/cli.js.map +1 -0
- package/dist/detectors/balDetectors.d.ts +3 -0
- package/dist/detectors/balDetectors.js +26 -0
- package/dist/detectors/balDetectors.js.map +1 -0
- package/dist/detectors/contractSizeDetectors.d.ts +3 -0
- package/dist/detectors/contractSizeDetectors.js +37 -0
- package/dist/detectors/contractSizeDetectors.js.map +1 -0
- package/dist/detectors/epbsDetectors.d.ts +7 -0
- package/dist/detectors/epbsDetectors.js +33 -0
- package/dist/detectors/epbsDetectors.js.map +1 -0
- package/dist/detectors/gasRepricingDetectors.d.ts +4 -0
- package/dist/detectors/gasRepricingDetectors.js +135 -0
- package/dist/detectors/gasRepricingDetectors.js.map +1 -0
- package/dist/detectors/nativeEthTransferLogDetectors.d.ts +8 -0
- package/dist/detectors/nativeEthTransferLogDetectors.js +54 -0
- package/dist/detectors/nativeEthTransferLogDetectors.js.map +1 -0
- package/dist/detectors/stateCreationDetectors.d.ts +4 -0
- package/dist/detectors/stateCreationDetectors.js +46 -0
- package/dist/detectors/stateCreationDetectors.js.map +1 -0
- package/dist/detectors/thresholds.d.ts +34 -0
- package/dist/detectors/thresholds.js +45 -0
- package/dist/detectors/thresholds.js.map +1 -0
- package/dist/detectors/types.d.ts +15 -0
- package/dist/detectors/types.js +23 -0
- package/dist/detectors/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/eipRegistry.d.ts +6 -0
- package/dist/registry/eipRegistry.js +30 -0
- package/dist/registry/eipRegistry.js.map +1 -0
- package/dist/registry/schemas.d.ts +76 -0
- package/dist/registry/schemas.js +34 -0
- package/dist/registry/schemas.js.map +1 -0
- package/dist/reports/jsonReporter.d.ts +2 -0
- package/dist/reports/jsonReporter.js +5 -0
- package/dist/reports/jsonReporter.js.map +1 -0
- package/dist/reports/markdownReporter.d.ts +2 -0
- package/dist/reports/markdownReporter.js +75 -0
- package/dist/reports/markdownReporter.js.map +1 -0
- package/dist/reports/reportTypes.d.ts +150 -0
- package/dist/reports/reportTypes.js +111 -0
- package/dist/reports/reportTypes.js.map +1 -0
- package/dist/scanners/bytecodeScanner.d.ts +11 -0
- package/dist/scanners/bytecodeScanner.js +107 -0
- package/dist/scanners/bytecodeScanner.js.map +1 -0
- package/dist/scanners/indexerScanner.d.ts +13 -0
- package/dist/scanners/indexerScanner.js +129 -0
- package/dist/scanners/indexerScanner.js.map +1 -0
- package/dist/scanners/rpcTraceScanner.d.ts +40 -0
- package/dist/scanners/rpcTraceScanner.js +121 -0
- package/dist/scanners/rpcTraceScanner.js.map +1 -0
- package/dist/scanners/traceScanner.d.ts +24 -0
- package/dist/scanners/traceScanner.js +272 -0
- package/dist/scanners/traceScanner.js.map +1 -0
- package/dist/scanners/validatorScanner.d.ts +40 -0
- package/dist/scanners/validatorScanner.js +210 -0
- package/dist/scanners/validatorScanner.js.map +1 -0
- package/dist/utils/bytecode.d.ts +11 -0
- package/dist/utils/bytecode.js +140 -0
- package/dist/utils/bytecode.js.map +1 -0
- package/dist/utils/files.d.ts +10 -0
- package/dist/utils/files.js +51 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/severity.d.ts +2 -0
- package/dist/utils/severity.js +13 -0
- package/dist/utils/severity.js.map +1 -0
- package/docs/fixtures.md +60 -0
- package/docs/release.md +132 -0
- package/examples/storage-heavy-bytecode.md +57 -0
- package/fixtures/bytecode/storage-heavy.hex +1 -0
- package/fixtures/indexers/balance-diff-indexer.json +15 -0
- package/fixtures/indexers/subgraph.yaml +24 -0
- package/fixtures/traces/besu-debug-structlogs.json +18 -0
- package/fixtures/traces/call-tracer-tree.json +27 -0
- package/fixtures/traces/drpc-call-tracer-real.json +373 -0
- package/fixtures/traces/erigon-action-trace.json +29 -0
- package/fixtures/traces/foundry-json-trace.json +19 -0
- package/fixtures/traces/geth-json-rpc-structlogs.json +16 -0
- package/fixtures/traces/hardhat-debug-trace.json +13 -0
- package/fixtures/traces/nethermind-debug-structlogs.json +17 -0
- package/fixtures/traces/storage-heavy-trace.json +25 -0
- package/fixtures/validator/operator-config.yaml +15 -0
- package/package.json +80 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { detectTraceGasRepricingExposure } from "../detectors/gasRepricingDetectors.js";
|
|
2
|
+
import { detectTraceStateCreation } from "../detectors/stateCreationDetectors.js";
|
|
3
|
+
import { domains, makeFinding } from "../detectors/types.js";
|
|
4
|
+
import { loadDetectorThresholds } from "../detectors/thresholds.js";
|
|
5
|
+
import { loadEipRegistry } from "../registry/eipRegistry.js";
|
|
6
|
+
import { makeReport } from "../reports/reportTypes.js";
|
|
7
|
+
import { loadStructuredFile } from "../utils/files.js";
|
|
8
|
+
export function scanTraceFile(traceFile, options = {}) {
|
|
9
|
+
const input = loadStructuredFile(traceFile);
|
|
10
|
+
return scanTrace(input, {
|
|
11
|
+
...options,
|
|
12
|
+
targetName: options.targetName ?? traceFile
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function scanTrace(input, options = {}) {
|
|
16
|
+
const registry = options.registry ?? loadEipRegistry(options.registryPath);
|
|
17
|
+
const thresholds = options.thresholds ?? loadDetectorThresholds(options.thresholdsPath);
|
|
18
|
+
const normalized = normalizeTrace(input);
|
|
19
|
+
const opcodeCounts = countOps(normalized.steps);
|
|
20
|
+
const calldataBytes = normalized.steps.reduce((total, step) => total + (step.calldataBytes ?? 0), 0);
|
|
21
|
+
const explicitLogEntries = normalized.steps.reduce((total, step) => total + (step.logs ?? 0), 0);
|
|
22
|
+
const maxDepth = normalized.steps.reduce((max, step) => Math.max(max, step.depth ?? 0), 0);
|
|
23
|
+
const logOps = ["LOG0", "LOG1", "LOG2", "LOG3", "LOG4"].reduce((total, op) => total + (opcodeCounts[op] ?? 0), 0);
|
|
24
|
+
const callOps = ["CALL", "CALLCODE", "DELEGATECALL", "STATICCALL"].reduce((total, op) => total + (opcodeCounts[op] ?? 0), 0);
|
|
25
|
+
const context = {
|
|
26
|
+
registry,
|
|
27
|
+
thresholds,
|
|
28
|
+
targetName: options.targetName ?? "trace"
|
|
29
|
+
};
|
|
30
|
+
const findings = [
|
|
31
|
+
...detectTraceGasRepricingExposure(opcodeCounts, calldataBytes, context),
|
|
32
|
+
...detectTraceStateCreation(opcodeCounts, context),
|
|
33
|
+
...detectTraceLogAndCallPattern(logOps, explicitLogEntries, callOps, maxDepth),
|
|
34
|
+
...detectTraceIncompleteness(normalized)
|
|
35
|
+
];
|
|
36
|
+
return makeReport({
|
|
37
|
+
fork: registry.fork,
|
|
38
|
+
target: {
|
|
39
|
+
kind: "trace",
|
|
40
|
+
name: options.targetName ?? "trace"
|
|
41
|
+
},
|
|
42
|
+
findings,
|
|
43
|
+
assumptions: [
|
|
44
|
+
"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.",
|
|
45
|
+
`The loaded registry is dated ${registry.lastUpdated}. Glamsterdam scope and gas parameters may change.`,
|
|
46
|
+
`Detector thresholds are dated ${thresholds.lastUpdated} and are MVP heuristics, not protocol gas parameters.`
|
|
47
|
+
],
|
|
48
|
+
limitations: [
|
|
49
|
+
"Trace coverage is only as good as the transaction samples provided.",
|
|
50
|
+
"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.",
|
|
51
|
+
"Some trace formats omit calldata sizes, storage keys, gas costs, logs, or call details.",
|
|
52
|
+
"Findings are compatibility prompts and should be validated through replay or benchmarking."
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export function normalizeTrace(input) {
|
|
57
|
+
const warnings = [];
|
|
58
|
+
if (Array.isArray(input)) {
|
|
59
|
+
return { steps: normalizeTraceSequence(input), warnings };
|
|
60
|
+
}
|
|
61
|
+
if (!isRecord(input)) {
|
|
62
|
+
return {
|
|
63
|
+
steps: [],
|
|
64
|
+
warnings: ["Trace input is not an object or array."]
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (isRecord(input.result)) {
|
|
68
|
+
const normalized = normalizeTrace(input.result);
|
|
69
|
+
return {
|
|
70
|
+
steps: normalized.steps,
|
|
71
|
+
warnings: ["Unwrapped JSON-RPC result object.", ...normalized.warnings]
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(input.steps)) {
|
|
75
|
+
return { steps: input.steps.map(stepFromUnknown).filter(isStep), warnings };
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(input.structLogs)) {
|
|
78
|
+
return { steps: input.structLogs.map(stepFromUnknown).filter(isStep), warnings };
|
|
79
|
+
}
|
|
80
|
+
if (Array.isArray(input.trace)) {
|
|
81
|
+
return { steps: normalizeTraceSequence(input.trace), warnings };
|
|
82
|
+
}
|
|
83
|
+
if (isRecord(input.trace)) {
|
|
84
|
+
const normalized = normalizeTrace(input.trace);
|
|
85
|
+
return {
|
|
86
|
+
steps: normalized.steps,
|
|
87
|
+
warnings: ["Unwrapped nested trace object.", ...normalized.warnings]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(input.traces)) {
|
|
91
|
+
return { steps: normalizeTraceSequence(input.traces), warnings };
|
|
92
|
+
}
|
|
93
|
+
if (Array.isArray(input.calls)
|
|
94
|
+
|| Array.isArray(input.children)
|
|
95
|
+
|| typeof input.type === "string"
|
|
96
|
+
|| typeof input.kind === "string") {
|
|
97
|
+
const steps = flattenCallTree(input);
|
|
98
|
+
if (steps.length === 0) {
|
|
99
|
+
warnings.push("Call tree did not contain recognizable call frames.");
|
|
100
|
+
}
|
|
101
|
+
return { steps, warnings };
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
steps: [],
|
|
105
|
+
warnings: ["No recognized trace steps were found."]
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function detectTraceLogAndCallPattern(logOps, explicitLogEntries, callOps, maxDepth) {
|
|
109
|
+
const findings = [];
|
|
110
|
+
if (logOps > 0 || explicitLogEntries > 0 || callOps > 0) {
|
|
111
|
+
findings.push(makeFinding({
|
|
112
|
+
id: "trace.logs-calls-visible",
|
|
113
|
+
title: "Trace includes logs or external calls",
|
|
114
|
+
severity: "low",
|
|
115
|
+
confidence: "high",
|
|
116
|
+
domain: domains("contracts", "indexer", "monitoring"),
|
|
117
|
+
relatedEips: ["EIP-7708", "EIP-7928"],
|
|
118
|
+
description: "The trace includes log or call activity that may be relevant to indexer, explorer, and monitoring assumptions under Glamsterdam-era changes.",
|
|
119
|
+
evidence: { logOps, explicitLogEntries, callOps, maxDepth },
|
|
120
|
+
recommendation: "Use traces like this to test indexer replay, alerting, and explorer display paths alongside contract gas behavior."
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
return findings;
|
|
124
|
+
}
|
|
125
|
+
function detectTraceIncompleteness(normalized) {
|
|
126
|
+
const findings = [];
|
|
127
|
+
const hasCalldataEvidence = normalized.steps.some((step) => typeof step.calldataBytes === "number");
|
|
128
|
+
const hasGasCostEvidence = normalized.steps.some((step) => typeof step.gasCost === "number");
|
|
129
|
+
if (normalized.steps.length === 0) {
|
|
130
|
+
findings.push(makeFinding({
|
|
131
|
+
id: "trace.no-recognized-steps",
|
|
132
|
+
title: "Trace contains no recognized execution steps",
|
|
133
|
+
severity: "unknown",
|
|
134
|
+
confidence: "high",
|
|
135
|
+
domain: domains("contracts", "execution"),
|
|
136
|
+
relatedEips: ["GAS-REPRICING"],
|
|
137
|
+
description: "The scanner could not normalize execution steps from this trace input, so it cannot infer opcode-level compatibility risks.",
|
|
138
|
+
evidence: normalized.warnings,
|
|
139
|
+
recommendation: "Provide a trace with a `steps`, `structLogs`, `trace`, JSON-RPC `result`, action trace array, or call-tracer-like `calls` shape."
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
else if (!hasCalldataEvidence || !hasGasCostEvidence) {
|
|
143
|
+
findings.push(makeFinding({
|
|
144
|
+
id: "trace.partial-evidence",
|
|
145
|
+
title: "Trace omits some useful compatibility evidence",
|
|
146
|
+
severity: "unknown",
|
|
147
|
+
confidence: "low",
|
|
148
|
+
domain: domains("contracts", "execution"),
|
|
149
|
+
relatedEips: ["GAS-REPRICING", "EIP-7976"],
|
|
150
|
+
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.",
|
|
151
|
+
evidence: { hasCalldataEvidence, hasGasCostEvidence, warnings: normalized.warnings },
|
|
152
|
+
recommendation: "Prefer traces that include executed opcodes, depth, calldata/input sizes, and gas costs when comparing current and Glamsterdam behavior."
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
return findings;
|
|
156
|
+
}
|
|
157
|
+
function countOps(steps) {
|
|
158
|
+
return steps.reduce((counts, step) => {
|
|
159
|
+
counts[step.op] = (counts[step.op] ?? 0) + 1;
|
|
160
|
+
return counts;
|
|
161
|
+
}, {});
|
|
162
|
+
}
|
|
163
|
+
function normalizeTraceSequence(items) {
|
|
164
|
+
return items.flatMap((item) => {
|
|
165
|
+
if (isRecord(item) && (Array.isArray(item.calls) || Array.isArray(item.children))) {
|
|
166
|
+
return flattenCallTree(item);
|
|
167
|
+
}
|
|
168
|
+
const step = stepFromUnknown(item);
|
|
169
|
+
return step ? [step] : [];
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function stepFromUnknown(value) {
|
|
173
|
+
if (!isRecord(value)) {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
const action = isRecord(value.action) ? value.action : undefined;
|
|
177
|
+
const opcode = isRecord(value.opcode) ? value.opcode.name : value.opcode;
|
|
178
|
+
const opRaw = value.op
|
|
179
|
+
?? opcode
|
|
180
|
+
?? value.opName
|
|
181
|
+
?? value.instruction
|
|
182
|
+
?? action?.callType
|
|
183
|
+
?? value.callType
|
|
184
|
+
?? value.call_type
|
|
185
|
+
?? value.type
|
|
186
|
+
?? value.kind
|
|
187
|
+
?? value.actionType;
|
|
188
|
+
if (typeof opRaw !== "string") {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
const input = value.input ?? value.calldata ?? value.data ?? action?.input ?? action?.init;
|
|
192
|
+
return {
|
|
193
|
+
op: normalizeTraceOp(opRaw),
|
|
194
|
+
depth: numberValue(value.depth) ?? depthFromTraceAddress(value.traceAddress),
|
|
195
|
+
gas: numberValue(value.gas),
|
|
196
|
+
gasCost: numberValue(value.gasCost ?? value.cost),
|
|
197
|
+
calldataBytes: numberValue(value.calldataBytes ?? value.inputBytes ?? byteLengthFromHex(input)),
|
|
198
|
+
logs: Array.isArray(value.logs) ? value.logs.length : numberValue(value.logs)
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function flattenCallTree(frame, depth = 0) {
|
|
202
|
+
if (!isRecord(frame)) {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
const type = typeof frame.type === "string"
|
|
206
|
+
? frame.type
|
|
207
|
+
: typeof frame.kind === "string"
|
|
208
|
+
? frame.kind
|
|
209
|
+
: "CALL";
|
|
210
|
+
const current = stepFromUnknown({
|
|
211
|
+
...frame,
|
|
212
|
+
op: type,
|
|
213
|
+
depth,
|
|
214
|
+
calldataBytes: byteLengthFromHex(frame.input ?? frame.calldata ?? frame.data)
|
|
215
|
+
});
|
|
216
|
+
const callChildren = Array.isArray(frame.calls) ? frame.calls : [];
|
|
217
|
+
const genericChildren = Array.isArray(frame.children) ? frame.children : [];
|
|
218
|
+
const childFrames = [...callChildren, ...genericChildren];
|
|
219
|
+
const children = childFrames.flatMap((child) => flattenCallTree(child, depth + 1));
|
|
220
|
+
return current ? [current, ...children] : children;
|
|
221
|
+
}
|
|
222
|
+
function isStep(value) {
|
|
223
|
+
return value !== undefined;
|
|
224
|
+
}
|
|
225
|
+
function isRecord(value) {
|
|
226
|
+
return typeof value === "object" && value !== null;
|
|
227
|
+
}
|
|
228
|
+
function numberValue(value) {
|
|
229
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
if (typeof value === "string" && value.trim() !== "" && Number.isFinite(Number(value))) {
|
|
233
|
+
return Number(value);
|
|
234
|
+
}
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
function normalizeTraceOp(opRaw) {
|
|
238
|
+
const op = opRaw.toUpperCase().replace(/[^A-Z0-9]/g, "");
|
|
239
|
+
if (op === "CALL" || op === "CALLCODE" || op === "DELEGATECALL" || op === "STATICCALL") {
|
|
240
|
+
return op;
|
|
241
|
+
}
|
|
242
|
+
if (op === "CREATE" || op === "CREATE2") {
|
|
243
|
+
return op;
|
|
244
|
+
}
|
|
245
|
+
if (op === "CALLTRACE" || op === "CALLFRAME" || op === "EXTERNALCALL") {
|
|
246
|
+
return "CALL";
|
|
247
|
+
}
|
|
248
|
+
if (op === "STATICCALLTRACE") {
|
|
249
|
+
return "STATICCALL";
|
|
250
|
+
}
|
|
251
|
+
if (op === "DELEGATECALLTRACE") {
|
|
252
|
+
return "DELEGATECALL";
|
|
253
|
+
}
|
|
254
|
+
if (op === "SUICIDE") {
|
|
255
|
+
return "SELFDESTRUCT";
|
|
256
|
+
}
|
|
257
|
+
return op;
|
|
258
|
+
}
|
|
259
|
+
function depthFromTraceAddress(value) {
|
|
260
|
+
return Array.isArray(value) ? value.length + 1 : undefined;
|
|
261
|
+
}
|
|
262
|
+
function byteLengthFromHex(value) {
|
|
263
|
+
if (typeof value !== "string") {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
const hex = value.startsWith("0x") ? value.slice(2) : value;
|
|
267
|
+
if (!/^[0-9a-fA-F]*$/.test(hex)) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
return Math.ceil(hex.length / 2);
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=traceScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceScanner.js","sourceRoot":"","sources":["../../src/scanners/traceScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type DetectorThresholds } from "../detectors/thresholds.js";
|
|
3
|
+
import type { EipRegistry } from "../registry/schemas.js";
|
|
4
|
+
import { type CompatibilityReport } from "../reports/reportTypes.js";
|
|
5
|
+
declare const clientMatrixSchema: z.ZodObject<{
|
|
6
|
+
fork: z.ZodString;
|
|
7
|
+
lastUpdated: z.ZodString;
|
|
8
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
9
|
+
clients: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
role: z.ZodEnum<{
|
|
12
|
+
execution: "execution";
|
|
13
|
+
consensus: "consensus";
|
|
14
|
+
validator: "validator";
|
|
15
|
+
}>;
|
|
16
|
+
versions: z.ZodArray<z.ZodObject<{
|
|
17
|
+
version: z.ZodString;
|
|
18
|
+
status: z.ZodEnum<{
|
|
19
|
+
unknown: "unknown";
|
|
20
|
+
compatible: "compatible";
|
|
21
|
+
incompatible: "incompatible";
|
|
22
|
+
partial: "partial";
|
|
23
|
+
}>;
|
|
24
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
}, z.core.$strip>>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
type ClientMatrix = z.infer<typeof clientMatrixSchema>;
|
|
29
|
+
export interface ValidatorScanOptions {
|
|
30
|
+
registry?: EipRegistry;
|
|
31
|
+
registryPath?: string;
|
|
32
|
+
thresholds?: DetectorThresholds;
|
|
33
|
+
thresholdsPath?: string;
|
|
34
|
+
clientMatrixPath?: string;
|
|
35
|
+
targetName?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function defaultClientMatrixPath(): string;
|
|
38
|
+
export declare function scanValidatorConfig(configPath: string, options?: ValidatorScanOptions): CompatibilityReport;
|
|
39
|
+
export declare function loadClientMatrix(matrixPath: string): ClientMatrix;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { detectEpbsBuilderReadiness } from "../detectors/epbsDetectors.js";
|
|
6
|
+
import { domains, makeFinding } from "../detectors/types.js";
|
|
7
|
+
import { loadDetectorThresholds } from "../detectors/thresholds.js";
|
|
8
|
+
import { loadEipRegistry } from "../registry/eipRegistry.js";
|
|
9
|
+
import { makeReport } from "../reports/reportTypes.js";
|
|
10
|
+
import { loadStructuredFile } from "../utils/files.js";
|
|
11
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const clientVersionSchema = z.object({
|
|
13
|
+
version: z.string(),
|
|
14
|
+
status: z.enum(["compatible", "incompatible", "partial", "unknown"]),
|
|
15
|
+
notes: z.string().optional()
|
|
16
|
+
});
|
|
17
|
+
const clientEntrySchema = z.object({
|
|
18
|
+
name: z.string(),
|
|
19
|
+
role: z.enum(["execution", "consensus", "validator"]),
|
|
20
|
+
versions: z.array(clientVersionSchema)
|
|
21
|
+
});
|
|
22
|
+
const clientMatrixSchema = z.object({
|
|
23
|
+
fork: z.string(),
|
|
24
|
+
lastUpdated: z.string(),
|
|
25
|
+
sources: z.array(z.string()).default([]),
|
|
26
|
+
clients: z.array(clientEntrySchema).default([])
|
|
27
|
+
});
|
|
28
|
+
export function defaultClientMatrixPath() {
|
|
29
|
+
return resolve(moduleDir, "../../data/client-compat/clients.example.json");
|
|
30
|
+
}
|
|
31
|
+
export function scanValidatorConfig(configPath, options = {}) {
|
|
32
|
+
const registry = options.registry ?? loadEipRegistry(options.registryPath);
|
|
33
|
+
const thresholds = options.thresholds ?? loadDetectorThresholds(options.thresholdsPath);
|
|
34
|
+
const config = loadStructuredFile(configPath);
|
|
35
|
+
const matrix = loadClientMatrix(options.clientMatrixPath ?? defaultClientMatrixPath());
|
|
36
|
+
const context = {
|
|
37
|
+
registry,
|
|
38
|
+
thresholds,
|
|
39
|
+
targetName: options.targetName ?? configPath
|
|
40
|
+
};
|
|
41
|
+
const findings = [
|
|
42
|
+
...detectClientMetadata(config, matrix),
|
|
43
|
+
...detectEpbsBuilderReadiness({
|
|
44
|
+
builderEnabled: getPath(config, ["builder", "enabled"]),
|
|
45
|
+
builderEndpoint: getPath(config, ["builder", "endpoint"])
|
|
46
|
+
}, context),
|
|
47
|
+
...detectMonitoringMetadata(config),
|
|
48
|
+
...detectTestnetMetadata(config)
|
|
49
|
+
];
|
|
50
|
+
return makeReport({
|
|
51
|
+
fork: registry.fork,
|
|
52
|
+
target: {
|
|
53
|
+
kind: "validator",
|
|
54
|
+
name: options.targetName ?? configPath
|
|
55
|
+
},
|
|
56
|
+
findings,
|
|
57
|
+
assumptions: [
|
|
58
|
+
"Validator/operator readiness was checked from a local JSON/YAML config only.",
|
|
59
|
+
`Client compatibility was compared against ${options.clientMatrixPath ?? defaultClientMatrixPath()}. Unknown entries are reported without guessing.`,
|
|
60
|
+
`The loaded registry is dated ${registry.lastUpdated}. Glamsterdam scope and gas parameters may change.`
|
|
61
|
+
],
|
|
62
|
+
limitations: [
|
|
63
|
+
"This scanner does not verify live node state, command-line flags, environment variables, firewall rules, or remote service health.",
|
|
64
|
+
"Client compatibility must come from a maintained matrix with explicit source links.",
|
|
65
|
+
"A clean report does not replace devnet/testnet participation or operational drills."
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export function loadClientMatrix(matrixPath) {
|
|
70
|
+
const raw = readFileSync(matrixPath, "utf8");
|
|
71
|
+
return clientMatrixSchema.parse(JSON.parse(raw));
|
|
72
|
+
}
|
|
73
|
+
function detectClientMetadata(config, matrix) {
|
|
74
|
+
const findings = [];
|
|
75
|
+
const clients = [
|
|
76
|
+
{ role: "execution", path: ["executionClient"], label: "execution client" },
|
|
77
|
+
{ role: "consensus", path: ["consensusClient"], label: "consensus client" },
|
|
78
|
+
{ role: "validator", path: ["validatorClient"], label: "validator client" }
|
|
79
|
+
];
|
|
80
|
+
for (const client of clients) {
|
|
81
|
+
const value = getPath(config, client.path);
|
|
82
|
+
const name = getPath(config, [...client.path, "name"]);
|
|
83
|
+
const version = getPath(config, [...client.path, "version"]);
|
|
84
|
+
if (!isRecord(value) || typeof name !== "string" || name.trim() === "") {
|
|
85
|
+
findings.push(makeFinding({
|
|
86
|
+
id: `validator.missing-${client.role}-client-name`,
|
|
87
|
+
title: `Missing ${client.label} metadata`,
|
|
88
|
+
severity: "medium",
|
|
89
|
+
confidence: "high",
|
|
90
|
+
domain: domains("validator"),
|
|
91
|
+
relatedEips: ["EIP-7732"],
|
|
92
|
+
description: `The config does not include a ${client.label} name. Operator readiness reports need explicit client metadata so compatibility can be tracked without guessing.`,
|
|
93
|
+
evidence: { path: client.path.join(".") },
|
|
94
|
+
recommendation: `Add ${client.path.join(".")}.name and ${client.path.join(".")}.version to the operator config or document where this metadata is managed.`
|
|
95
|
+
}));
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (typeof version !== "string" || version.trim() === "") {
|
|
99
|
+
findings.push(makeFinding({
|
|
100
|
+
id: `validator.missing-${client.role}-client-version`,
|
|
101
|
+
title: `Missing ${client.label} version`,
|
|
102
|
+
severity: "medium",
|
|
103
|
+
confidence: "high",
|
|
104
|
+
domain: domains("validator"),
|
|
105
|
+
relatedEips: ["EIP-7732"],
|
|
106
|
+
description: `The config names ${name} as the ${client.label}, but does not include a version. Compatibility cannot be assessed without explicit version metadata.`,
|
|
107
|
+
evidence: { name, version },
|
|
108
|
+
recommendation: `Add ${client.path.join(".")}.version and keep it updated from deployment automation or release inventory.`
|
|
109
|
+
}));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const matrixEntry = findClientMatrixEntry(matrix, client.role, name, version);
|
|
113
|
+
if (!matrixEntry) {
|
|
114
|
+
findings.push(makeFinding({
|
|
115
|
+
id: `validator.unknown-${client.role}-client-compatibility`,
|
|
116
|
+
title: `Unknown Glamsterdam compatibility for ${client.label}`,
|
|
117
|
+
severity: "unknown",
|
|
118
|
+
confidence: "high",
|
|
119
|
+
domain: domains("validator"),
|
|
120
|
+
relatedEips: ["EIP-7732"],
|
|
121
|
+
description: `The compatibility matrix does not contain a sourced status for ${name} ${version} as a ${client.label}. The scanner will not infer compatibility from client name alone.`,
|
|
122
|
+
evidence: { role: client.role, name, version, matrixLastUpdated: matrix.lastUpdated },
|
|
123
|
+
recommendation: "Update the client compatibility matrix with sourced release/devnet information, or treat this as a manual-readiness checklist item."
|
|
124
|
+
}));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (matrixEntry.status !== "compatible") {
|
|
128
|
+
findings.push(makeFinding({
|
|
129
|
+
id: `validator.${client.role}-client-status-${matrixEntry.status}`,
|
|
130
|
+
title: `${client.label} compatibility is ${matrixEntry.status}`,
|
|
131
|
+
severity: matrixEntry.status === "incompatible" ? "high" : "unknown",
|
|
132
|
+
confidence: "high",
|
|
133
|
+
domain: domains("validator"),
|
|
134
|
+
relatedEips: ["EIP-7732"],
|
|
135
|
+
description: `The compatibility matrix reports ${matrixEntry.status} for ${name} ${version}. The scanner reports the matrix value without trying to override it.`,
|
|
136
|
+
evidence: { role: client.role, name, version, matrixEntry },
|
|
137
|
+
recommendation: "Review the matrix source notes, update the client, or validate the status through testnet/devnet participation."
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return findings;
|
|
142
|
+
}
|
|
143
|
+
function detectMonitoringMetadata(config) {
|
|
144
|
+
const prometheus = getPath(config, ["monitoring", "prometheus"]);
|
|
145
|
+
const grafana = getPath(config, ["monitoring", "grafana"]);
|
|
146
|
+
if (truthyString(prometheus) && truthyString(grafana)) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
return [
|
|
150
|
+
makeFinding({
|
|
151
|
+
id: "validator.missing-monitoring-endpoints",
|
|
152
|
+
title: "Monitoring endpoint metadata is incomplete",
|
|
153
|
+
severity: "medium",
|
|
154
|
+
confidence: "high",
|
|
155
|
+
domain: domains("validator", "monitoring"),
|
|
156
|
+
relatedEips: ["EIP-7732", "EIP-7928"],
|
|
157
|
+
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.",
|
|
158
|
+
evidence: { prometheus, grafana },
|
|
159
|
+
recommendation: "Record monitoring endpoints or dashboards and add alert coverage for devnet/testnet participation, missed duties, builder/API health, and sync status."
|
|
160
|
+
})
|
|
161
|
+
];
|
|
162
|
+
}
|
|
163
|
+
function detectTestnetMetadata(config) {
|
|
164
|
+
const participation = getPath(config, ["networks", "testnetParticipation"]);
|
|
165
|
+
const hasParticipation = Array.isArray(participation)
|
|
166
|
+
? participation.length > 0
|
|
167
|
+
: truthyString(participation);
|
|
168
|
+
if (hasParticipation) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
return [
|
|
172
|
+
makeFinding({
|
|
173
|
+
id: "validator.missing-testnet-participation",
|
|
174
|
+
title: "No testnet or devnet participation metadata found",
|
|
175
|
+
severity: "medium",
|
|
176
|
+
confidence: "high",
|
|
177
|
+
domain: domains("validator", "monitoring"),
|
|
178
|
+
relatedEips: ["EIP-7732", "EIP-7928"],
|
|
179
|
+
description: "The config does not list Glamsterdam-oriented testnet or devnet participation. Operator readiness should be validated before mainnet activation timing is final.",
|
|
180
|
+
evidence: { testnetParticipation: participation },
|
|
181
|
+
recommendation: "Add planned or completed testnet/devnet participation, including client versions, dates, observed issues, and rollback notes."
|
|
182
|
+
})
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
function findClientMatrixEntry(matrix, role, name, version) {
|
|
186
|
+
const normalizedName = name.toLowerCase();
|
|
187
|
+
const client = matrix.clients.find((entry) => entry.role === role && entry.name.toLowerCase() === normalizedName);
|
|
188
|
+
if (!client) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
return client.versions.find((entry) => entry.version === version)
|
|
192
|
+
?? client.versions.find((entry) => entry.version === "*");
|
|
193
|
+
}
|
|
194
|
+
function getPath(value, path) {
|
|
195
|
+
let current = value;
|
|
196
|
+
for (const segment of path) {
|
|
197
|
+
if (!isRecord(current)) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
current = current[segment];
|
|
201
|
+
}
|
|
202
|
+
return current;
|
|
203
|
+
}
|
|
204
|
+
function isRecord(value) {
|
|
205
|
+
return typeof value === "object" && value !== null;
|
|
206
|
+
}
|
|
207
|
+
function truthyString(value) {
|
|
208
|
+
return typeof value === "string" ? value.trim().length > 0 : Boolean(value);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=validatorScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validatorScanner.js","sourceRoot":"","sources":["../../src/scanners/validatorScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface Opcode {
|
|
2
|
+
pc: number;
|
|
3
|
+
code: number;
|
|
4
|
+
name: string;
|
|
5
|
+
pushData?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeBytecode(input: string): string;
|
|
8
|
+
export declare function byteLength(bytecode: string): number;
|
|
9
|
+
export declare function disassembleBytecode(bytecode: string): Opcode[];
|
|
10
|
+
export declare function countOpcodeNames(opcodes: Opcode[]): Record<string, number>;
|
|
11
|
+
export declare function opcodeCount(counts: Record<string, number>, names: string[]): number;
|