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.
Files changed (96) hide show
  1. package/CONTRIBUTING.md +59 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/ROADMAP.md +76 -0
  5. package/SECURITY.md +19 -0
  6. package/data/client-compat/clients.example.json +42 -0
  7. package/data/detectors/thresholds.ci.json +33 -0
  8. package/data/detectors/thresholds.json +33 -0
  9. package/data/detectors/thresholds.research.json +33 -0
  10. package/data/eips/glamsterdam.json +85 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +163 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/detectors/balDetectors.d.ts +3 -0
  15. package/dist/detectors/balDetectors.js +26 -0
  16. package/dist/detectors/balDetectors.js.map +1 -0
  17. package/dist/detectors/contractSizeDetectors.d.ts +3 -0
  18. package/dist/detectors/contractSizeDetectors.js +37 -0
  19. package/dist/detectors/contractSizeDetectors.js.map +1 -0
  20. package/dist/detectors/epbsDetectors.d.ts +7 -0
  21. package/dist/detectors/epbsDetectors.js +33 -0
  22. package/dist/detectors/epbsDetectors.js.map +1 -0
  23. package/dist/detectors/gasRepricingDetectors.d.ts +4 -0
  24. package/dist/detectors/gasRepricingDetectors.js +135 -0
  25. package/dist/detectors/gasRepricingDetectors.js.map +1 -0
  26. package/dist/detectors/nativeEthTransferLogDetectors.d.ts +8 -0
  27. package/dist/detectors/nativeEthTransferLogDetectors.js +54 -0
  28. package/dist/detectors/nativeEthTransferLogDetectors.js.map +1 -0
  29. package/dist/detectors/stateCreationDetectors.d.ts +4 -0
  30. package/dist/detectors/stateCreationDetectors.js +46 -0
  31. package/dist/detectors/stateCreationDetectors.js.map +1 -0
  32. package/dist/detectors/thresholds.d.ts +34 -0
  33. package/dist/detectors/thresholds.js +45 -0
  34. package/dist/detectors/thresholds.js.map +1 -0
  35. package/dist/detectors/types.d.ts +15 -0
  36. package/dist/detectors/types.js +23 -0
  37. package/dist/detectors/types.js.map +1 -0
  38. package/dist/index.d.ts +16 -0
  39. package/dist/index.js +13 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/registry/eipRegistry.d.ts +6 -0
  42. package/dist/registry/eipRegistry.js +30 -0
  43. package/dist/registry/eipRegistry.js.map +1 -0
  44. package/dist/registry/schemas.d.ts +76 -0
  45. package/dist/registry/schemas.js +34 -0
  46. package/dist/registry/schemas.js.map +1 -0
  47. package/dist/reports/jsonReporter.d.ts +2 -0
  48. package/dist/reports/jsonReporter.js +5 -0
  49. package/dist/reports/jsonReporter.js.map +1 -0
  50. package/dist/reports/markdownReporter.d.ts +2 -0
  51. package/dist/reports/markdownReporter.js +75 -0
  52. package/dist/reports/markdownReporter.js.map +1 -0
  53. package/dist/reports/reportTypes.d.ts +150 -0
  54. package/dist/reports/reportTypes.js +111 -0
  55. package/dist/reports/reportTypes.js.map +1 -0
  56. package/dist/scanners/bytecodeScanner.d.ts +11 -0
  57. package/dist/scanners/bytecodeScanner.js +107 -0
  58. package/dist/scanners/bytecodeScanner.js.map +1 -0
  59. package/dist/scanners/indexerScanner.d.ts +13 -0
  60. package/dist/scanners/indexerScanner.js +129 -0
  61. package/dist/scanners/indexerScanner.js.map +1 -0
  62. package/dist/scanners/rpcTraceScanner.d.ts +40 -0
  63. package/dist/scanners/rpcTraceScanner.js +121 -0
  64. package/dist/scanners/rpcTraceScanner.js.map +1 -0
  65. package/dist/scanners/traceScanner.d.ts +24 -0
  66. package/dist/scanners/traceScanner.js +272 -0
  67. package/dist/scanners/traceScanner.js.map +1 -0
  68. package/dist/scanners/validatorScanner.d.ts +40 -0
  69. package/dist/scanners/validatorScanner.js +210 -0
  70. package/dist/scanners/validatorScanner.js.map +1 -0
  71. package/dist/utils/bytecode.d.ts +11 -0
  72. package/dist/utils/bytecode.js +140 -0
  73. package/dist/utils/bytecode.js.map +1 -0
  74. package/dist/utils/files.d.ts +10 -0
  75. package/dist/utils/files.js +51 -0
  76. package/dist/utils/files.js.map +1 -0
  77. package/dist/utils/severity.d.ts +2 -0
  78. package/dist/utils/severity.js +13 -0
  79. package/dist/utils/severity.js.map +1 -0
  80. package/docs/fixtures.md +60 -0
  81. package/docs/release.md +132 -0
  82. package/examples/storage-heavy-bytecode.md +57 -0
  83. package/fixtures/bytecode/storage-heavy.hex +1 -0
  84. package/fixtures/indexers/balance-diff-indexer.json +15 -0
  85. package/fixtures/indexers/subgraph.yaml +24 -0
  86. package/fixtures/traces/besu-debug-structlogs.json +18 -0
  87. package/fixtures/traces/call-tracer-tree.json +27 -0
  88. package/fixtures/traces/drpc-call-tracer-real.json +373 -0
  89. package/fixtures/traces/erigon-action-trace.json +29 -0
  90. package/fixtures/traces/foundry-json-trace.json +19 -0
  91. package/fixtures/traces/geth-json-rpc-structlogs.json +16 -0
  92. package/fixtures/traces/hardhat-debug-trace.json +13 -0
  93. package/fixtures/traces/nethermind-debug-structlogs.json +17 -0
  94. package/fixtures/traces/storage-heavy-trace.json +25 -0
  95. package/fixtures/validator/operator-config.yaml +15 -0
  96. package/package.json +80 -0
@@ -0,0 +1,59 @@
1
+ # Contributing
2
+
3
+ Thanks for helping improve Glamsterdam Compatibility Lab.
4
+
5
+ This project is intentionally data-driven. When adding a detector, keep protocol assumptions in `data/eips/glamsterdam.json` or another data file where possible, and keep detector code focused on evidence found in the input.
6
+
7
+ ## Local workflow
8
+
9
+ ```sh
10
+ pnpm install
11
+ pnpm test
12
+ pnpm build
13
+ ```
14
+
15
+ When report wording or JSON structure changes intentionally, update golden snapshots:
16
+
17
+ ```sh
18
+ pnpm test:update
19
+ ```
20
+
21
+ ## Release workflow
22
+
23
+ Releases are published from semver tags. After CI is green on `main`, create the GitHub release tag, then run the manual `Publish npm` workflow from `main` with the release tag as `release_tag`.
24
+
25
+ Start with `dry_run=true`. For a real publish, prefer npm Trusted Publishing: configure `glamsterdam-compat-lab` on npm with the GitHub repository `CruzMolina/glamsterdam-compat-lab` and workflow file `npm-publish.yml`, then rerun the workflow with `dry_run=false`. If Trusted Publishing is not available yet, configure the repository `NPM_TOKEN` secret with an npm token that can publish `glamsterdam-compat-lab`.
26
+
27
+ The workflow checks out the requested semver tag, verifies that `package.json` matches the tag, installs dependencies, runs tests, builds, and then runs `npm publish --provenance`.
28
+
29
+ See `docs/release.md` for the full release checklist and npm troubleshooting notes.
30
+
31
+ ## Detector guidelines
32
+
33
+ - Use conservative language. Prefer "review" or "replay representative transactions" over claims that something will break.
34
+ - Include actionable recommendations in every finding.
35
+ - Add fixtures and tests for each new detector.
36
+ - Do not guess client compatibility. Add explicit, sourced client metadata to a user-editable compatibility matrix instead.
37
+ - Keep JSON and Markdown report outputs deterministic.
38
+ - Keep detector thresholds in `data/detectors/thresholds.json` unless there is a strong reason to hardcode a parser invariant.
39
+
40
+ ## Registry updates
41
+
42
+ The Glamsterdam fork scope may change. Update `data/eips/glamsterdam.json` with source links, status, detector modules, and a `lastUpdated` date whenever assumptions change.
43
+
44
+ Detector thresholds live in `data/detectors/thresholds.json`. Treat them as signal-quality heuristics, not protocol gas constants.
45
+
46
+ Additional threshold profiles live next to the default thresholds. Use `thresholds.research.json` for broad signal collection and `thresholds.ci.json` for lower-noise automation.
47
+
48
+ ## Fixture contributions
49
+
50
+ See `docs/fixtures.md` before submitting real-world bytecode, traces, indexer configs, validator configs, or compatibility metadata. Fixtures must be safe to publish, clearly licensed, and stripped of secrets or validator-sensitive details.
51
+
52
+ ## Pull requests
53
+
54
+ Please include:
55
+
56
+ - A short description of the compatibility risk being detected.
57
+ - The data source or rationale for any EIP/client metadata changes.
58
+ - New or updated fixtures.
59
+ - Tests showing the expected report output.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Glamsterdam Compatibility Lab contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # Glamsterdam Compatibility Lab
2
+
3
+ Glamsterdam Compatibility Lab is an open-source CLI and TypeScript library for deterministic compatibility checks around Ethereum's upcoming Glamsterdam upgrade.
4
+
5
+ It helps smart-contract teams, dapp teams, indexers, explorers, infrastructure teams, and validator operators produce human-readable and machine-readable readiness reports from bytecode, traces, indexer configs, and local operator configs.
6
+
7
+ This is community open-source tooling. It is not official Ethereum Foundation tooling or an endorsement by the Ethereum Foundation.
8
+
9
+ ## Why this exists
10
+
11
+ The Ethereum Foundation Ecosystem Support Program has a Glamsterdam-focused wishlist that calls out developer tooling, impact analysis, explorer/indexer support, validator tooling, monitoring tooling, and data-driven research. Glamsterdam planning currently includes scheduled work around Block-Level Access Lists and ePBS, plus considered work around gas repricing, native ETH transfer logs, contract-size changes, state creation costs, calldata costs, and related areas.
12
+
13
+ The final Glamsterdam scope and exact parameters may change. This project keeps assumptions in a versioned EIP registry so detector behavior can be updated without rewriting every scanner.
14
+
15
+ Useful anchors:
16
+
17
+ - [ESP Wishlist](https://esp.ethereum.foundation/applicants/wishlist)
18
+ - [EIP-7773: Hardfork Meta - Glamsterdam](https://eips.ethereum.org/EIPS/eip-7773)
19
+ - [ethereum.org Glamsterdam roadmap](https://ethereum.org/roadmap/glamsterdam/)
20
+ - [Protocol priorities update for 2026](https://blog.ethereum.org/2026/02/18/protocol-priorities-update-2026)
21
+ - [Soldogn interop recap](https://blog.ethereum.org/2026/05/02/soldogn-interop-recap)
22
+
23
+ ## Install and run
24
+
25
+ For local development from a clone:
26
+
27
+ ```sh
28
+ pnpm install
29
+ pnpm test
30
+ pnpm test:integration # requires ETH_RPC_URL and ETH_RPC_TX_HASH or ETH_RPC_TX
31
+ pnpm build
32
+ pnpm glamsterdam eips
33
+ pnpm glamsterdam scan-bytecode fixtures/bytecode/storage-heavy.hex
34
+ ```
35
+
36
+ The package is configured as `glamsterdam-compat-lab` in `package.json`, but npm registry publication is still pending package-owner authentication. Until npm shows `glamsterdam-compat-lab@0.2.2`, the current installable release artifact is the v0.2.2 GitHub release tarball:
37
+
38
+ ```sh
39
+ npm install -g https://github.com/CruzMolina/glamsterdam-compat-lab/releases/download/v0.2.2/glamsterdam-compat-lab-0.2.2.tgz
40
+ ```
41
+
42
+ See [docs/release.md](docs/release.md) for npm publication status and maintainer release checks.
43
+
44
+ The default output format is Markdown. Use `--format json` for machine-readable reports.
45
+
46
+ ## CLI commands
47
+
48
+ ```sh
49
+ pnpm glamsterdam eips
50
+ pnpm glamsterdam scan-bytecode fixtures/bytecode/storage-heavy.hex --format markdown
51
+ pnpm glamsterdam scan-traces fixtures/traces/storage-heavy-trace.json --format json
52
+ ETH_RPC_URL=https://your-execution-rpc.example pnpm glamsterdam scan-tx --tx 0x0000000000000000000000000000000000000000000000000000000000000000 --format markdown
53
+ pnpm glamsterdam scan-indexer fixtures/indexers/subgraph.yaml --format markdown
54
+ pnpm glamsterdam scan-validator --config fixtures/validator/operator-config.yaml --format markdown
55
+ pnpm glamsterdam report report-a.json report-b.json --format markdown
56
+ ```
57
+
58
+ Each scanner accepts `--registry <path>` and `--thresholds <path>` so EIP metadata and detector thresholds can be updated without editing detector code.
59
+
60
+ ## What the scanners can detect
61
+
62
+ `scan-bytecode` normalizes EVM bytecode, disassembles opcodes while skipping PUSH data, counts relevant opcodes, and reports conservative risks around contract size, storage/account access, CREATE/CREATE2 usage, calldata copying, logs, and manual-review limits.
63
+
64
+ `scan-traces` accepts either this project's normalized trace shape:
65
+
66
+ ```json
67
+ {
68
+ "format": "glamsterdam-normalized-trace-v0",
69
+ "steps": [
70
+ { "op": "SLOAD", "depth": 1 },
71
+ { "op": "SSTORE", "depth": 1 }
72
+ ]
73
+ }
74
+ ```
75
+
76
+ It also accepts common `debug_traceTransaction`-style objects with `structLogs`, JSON-RPC result wrappers, simple arrays of steps, Foundry/Hardhat-style JSON trace exports, Besu/Nethermind/geth-style struct logs, Erigon/parity-style action traces, and call-tracer-like trees with `calls` or `children`.
77
+
78
+ `scan-tx` fetches a transaction trace from an execution RPC endpoint that supports `debug_traceTransaction`, then runs the same deterministic trace scanner:
79
+
80
+ ```sh
81
+ ETH_RPC_URL=https://your-execution-rpc.example \
82
+ pnpm glamsterdam scan-tx \
83
+ --tx 0x0000000000000000000000000000000000000000000000000000000000000000 \
84
+ --tracer structLogs \
85
+ --trace-out traces/tx.json \
86
+ --format markdown
87
+
88
+ pnpm glamsterdam scan-tx \
89
+ --rpc-url https://your-execution-rpc.example \
90
+ --tx 0x0000000000000000000000000000000000000000000000000000000000000000 \
91
+ --tracer callTracer \
92
+ --format json
93
+ ```
94
+
95
+ RPC URLs are not included in report targets or evidence. Do not paste private RPC URLs or credentials into issues, fixtures, or reports.
96
+
97
+ Use `--trace-out <path>` to save the fetched JSON-RPC trace response while also printing a compatibility report. This is the preferred way to turn a live RPC call into a reusable local fixture. Real-RPC integration tests are gated and skipped unless `ETH_RPC_URL` and `ETH_RPC_TX_HASH` or `ETH_RPC_TX` are set.
98
+
99
+ `scan-indexer` parses JSON and YAML, including `subgraph.yaml`-style configs. It flags event-only indexing assumptions, missing fork/EIP compatibility metadata, missing replay or testnet plans, missing BAL review metadata, and native ETH transfer log readiness as heuristic findings.
100
+
101
+ `scan-validator` parses JSON and YAML operator configs. It checks for execution, consensus, validator, builder/API, monitoring, and testnet/devnet metadata. It compares client names and versions against `data/client-compat/clients.example.json` or a user-provided matrix, but it does not guess compatibility.
102
+
103
+ ## Report model
104
+
105
+ Each scanner returns a `CompatibilityReport`:
106
+
107
+ ```json
108
+ {
109
+ "toolVersion": "0.2.2",
110
+ "fork": "glamsterdam",
111
+ "target": {
112
+ "kind": "bytecode",
113
+ "name": "fixtures/bytecode/storage-heavy.hex"
114
+ },
115
+ "summary": {
116
+ "risk": "medium",
117
+ "findingCount": 1,
118
+ "highCount": 0,
119
+ "mediumCount": 1,
120
+ "lowCount": 0,
121
+ "unknownCount": 0
122
+ },
123
+ "findings": [],
124
+ "assumptions": [],
125
+ "limitations": []
126
+ }
127
+ ```
128
+
129
+ Severity means:
130
+
131
+ - `high`: likely requires action before fork or testnet readiness
132
+ - `medium`: likely requires review or testing
133
+ - `low`: informational or easy follow-up
134
+ - `unknown`: insufficient information; manual review needed
135
+
136
+ Confidence means:
137
+
138
+ - `high`: direct evidence from the input
139
+ - `medium`: strong heuristic
140
+ - `low`: weak heuristic or incomplete input
141
+
142
+ ## Updating the EIP registry
143
+
144
+ Edit `data/eips/glamsterdam.json`.
145
+
146
+ Each entry includes an ID, name, status, domain, detector modules, and notes. Keep uncertain protocol details in the registry notes and external data files. Detector code should not invent exact gas deltas or final fork behavior.
147
+
148
+ ## Updating detector thresholds
149
+
150
+ Edit `data/detectors/thresholds.json`.
151
+
152
+ Thresholds are conservative scanner heuristics, not protocol parameters. The default profile is `data/detectors/thresholds.json`; `data/detectors/thresholds.research.json` is more sensitive for broad data collection, and `data/detectors/thresholds.ci.json` is less sensitive for low-noise automation. When changing thresholds, add or update fixtures and run:
153
+
154
+ ```sh
155
+ pnpm test:update
156
+ pnpm test
157
+ pnpm build
158
+ ```
159
+
160
+ The golden report snapshots in `test/__snapshots__` are intentional review artifacts. Update them when report wording or JSON structure changes on purpose.
161
+
162
+ ## Adding detectors
163
+
164
+ 1. Add or update registry entries in `data/eips/glamsterdam.json`.
165
+ 2. Implement detector logic in `src/detectors`.
166
+ 3. Call the detector from a scanner in `src/scanners`.
167
+ 4. Add a fixture that demonstrates the evidence.
168
+ 5. Add a Vitest test.
169
+ 6. Keep report language practical and humble.
170
+
171
+ ## Contributing fixtures
172
+
173
+ Real-world and real-world-shaped fixtures are welcome when they are safe to publish. See [docs/fixtures.md](docs/fixtures.md) for redaction, licensing, metadata, and snapshot expectations.
174
+
175
+ ## CI and issue triage
176
+
177
+ The GitHub Actions workflow runs install, tests, build, and an npm publish dry run from the package directory. Issue templates are included for detector requests, fixture contributions, registry updates, and false-positive/false-negative reports.
178
+
179
+ Release publishing notes live in [docs/release.md](docs/release.md).
180
+
181
+ ## Roadmap
182
+
183
+ See [ROADMAP.md](ROADMAP.md) for planned phases. Phase 0 is released as `v0.1.0`; `v0.2.0` starts Phase 1 with RPC transaction trace ingestion and broader trace fixture coverage.
184
+
185
+ ## Disclaimer
186
+
187
+ Glamsterdam scope and gas parameters may change. Reports are compatibility prompts, not predictions of breakage. Always replay representative transactions against a relevant devnet, testnet, local fork configuration, or client release when available.
package/ROADMAP.md ADDED
@@ -0,0 +1,76 @@
1
+ # Roadmap
2
+
3
+ This roadmap is intentionally practical. Glamsterdam scope and parameters may change, so the project should keep protocol assumptions in data files and make detector output easy to update.
4
+
5
+ ## Phase 0: MVP CLI
6
+
7
+ Status: released as `v0.1.0`.
8
+
9
+ - Bytecode, trace, indexer, and validator scanners
10
+ - EIP registry
11
+ - Detector thresholds in data
12
+ - Markdown and JSON reports
13
+ - Fixtures, tests, and golden report snapshots
14
+ - CI, CodeQL, Dependabot, and issue templates
15
+
16
+ ## Phase 0.1: Launch Stabilization
17
+
18
+ Status: released as `v0.1.1`.
19
+
20
+ - Triage initial dependency automation
21
+ - Collect real-world fixture submissions
22
+ - Add contribution paths for detector requests, registry updates, and signal-quality reports
23
+ - Add fixture contribution guidance and issue forms
24
+ - Keep README focused on usage while roadmap and planning live here
25
+
26
+ ## Phase 1: Trace Replay Support
27
+
28
+ Status: started in `v0.2.0`; trace capture support added in `v0.2.1`.
29
+
30
+ Goal: make trace scanning useful for contract teams using common development tools.
31
+
32
+ - Add Foundry, Hardhat, geth `structLogs`, Erigon-style action trace, and call-tracer fixtures
33
+ - Add Besu and Nethermind-shaped trace fixtures
34
+ - Normalize common call, opcode, gas, input, explicit log, and log opcode fields
35
+ - Keep golden report snapshots for representative trace formats
36
+ - Add RPC-based `debug_traceTransaction` fetching with `scan-tx`
37
+ - Add `scan-tx --trace-out` and gated real-RPC integration tests
38
+ - Add default, research, and CI threshold profiles
39
+ - Compare current baseline traces with Glamsterdam-aware client or fork configs when available
40
+
41
+ ## Phase 1.1: Baseline Comparison
42
+
43
+ Target release: `v0.3.0`.
44
+
45
+ Goal: compare compatibility reports across profiles and, later, across current-client and Glamsterdam-aware traces.
46
+
47
+ - Compare one trace against multiple threshold profiles
48
+ - Emit report deltas for findings added, removed, or changed in severity
49
+ - Keep comparisons deterministic and JSON-friendly
50
+ - Defer fork-specific gas deltas until they are present in explicit data files or client configs
51
+
52
+ ## Phase 2: Public Dataset
53
+
54
+ Goal: publish reproducible compatibility research.
55
+
56
+ - Scan popular contracts and protocol surfaces
57
+ - Publish deterministic report artifacts
58
+ - Generate aggregate risk statistics
59
+ - Add CSV/notebook/export workflows for researchers
60
+
61
+ ## Phase 3: Devnet Integration
62
+
63
+ Goal: track moving client and spec readiness without hardcoding guesses.
64
+
65
+ - Ingest public devnet and client compatibility metadata
66
+ - Track spec/client changes against registry entries
67
+ - Expand validator/operator compatibility matrix workflows
68
+
69
+ ## Phase 4: Dashboard
70
+
71
+ Goal: make reports discoverable once the CLI and dataset are trustworthy.
72
+
73
+ - Static generated site
74
+ - Searchable reports
75
+ - Machine-readable exports
76
+ - Links back to source fixtures, registry data, and detector versions
package/SECURITY.md ADDED
@@ -0,0 +1,19 @@
1
+ # Security Policy
2
+
3
+ ## Supported versions
4
+
5
+ This project is pre-1.0 compatibility tooling. Security fixes will target the default branch until release branches exist.
6
+
7
+ ## Reporting a vulnerability
8
+
9
+ Please use GitHub private vulnerability reporting if it is enabled on the repository. If private reporting is unavailable, open a minimal issue that avoids exposing exploit details and ask for a maintainer contact path.
10
+
11
+ Do not include private keys, RPC credentials, validator secrets, production endpoint credentials, or non-public trace data in issues, pull requests, fixtures, or screenshots.
12
+
13
+ The `scan-tx` command accepts RPC URLs through `--rpc-url` or `ETH_RPC_URL`. Reports intentionally omit the RPC URL, but shell history, CI logs, and issue text may not. Prefer environment variables or local secret management for private endpoints.
14
+
15
+ When using `scan-tx --trace-out`, review the saved trace before sharing or committing it. Execution traces can contain calldata, addresses, storage keys, revert data, and other sensitive operational context.
16
+
17
+ ## Scanner output
18
+
19
+ Compatibility reports are advisory and deterministic. They are not security audits and should not be treated as proof that a contract, indexer, or validator setup is safe.
@@ -0,0 +1,42 @@
1
+ {
2
+ "fork": "glamsterdam",
3
+ "lastUpdated": "2026-05-08",
4
+ "sources": [
5
+ "Replace with client release notes, devnet pages, or operator-maintained compatibility sources."
6
+ ],
7
+ "clients": [
8
+ {
9
+ "name": "example-execution-client",
10
+ "role": "execution",
11
+ "versions": [
12
+ {
13
+ "version": "0.0.0-example",
14
+ "status": "unknown",
15
+ "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ "name": "example-consensus-client",
21
+ "role": "consensus",
22
+ "versions": [
23
+ {
24
+ "version": "0.0.0-example",
25
+ "status": "unknown",
26
+ "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "name": "example-validator-client",
32
+ "role": "validator",
33
+ "versions": [
34
+ {
35
+ "version": "0.0.0-example",
36
+ "status": "unknown",
37
+ "notes": "Placeholder only. Replace with a sourced compatibility statement before relying on this matrix."
38
+ }
39
+ ]
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "profile": "ci",
4
+ "lastUpdated": "2026-05-09",
5
+ "notes": [
6
+ "CI profile: intentionally less sensitive than the default profile.",
7
+ "Use this when teams want fewer compatibility prompts in automated gates."
8
+ ],
9
+ "bytecode": {
10
+ "contractSize": {
11
+ "currentRuntimeLimitBytes": 24576,
12
+ "nearCurrentLimitBytes": 23000
13
+ },
14
+ "stateAccountOpcodeExposure": {
15
+ "mediumSensitiveOpcodeCount": 16,
16
+ "lowSensitiveOpcodeCount": 6
17
+ },
18
+ "storagePattern": {
19
+ "mediumStorageOpcodeCount": 16
20
+ }
21
+ },
22
+ "trace": {
23
+ "stateHeavyExecution": {
24
+ "highStorageOps": 80,
25
+ "highSensitiveOpcodeCount": 160,
26
+ "mediumStorageOps": 24,
27
+ "mediumSensitiveOpcodeCount": 48
28
+ },
29
+ "calldataHeavy": {
30
+ "mediumCalldataBytes": 8192
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "profile": "default",
4
+ "lastUpdated": "2026-05-09",
5
+ "notes": [
6
+ "Thresholds are conservative MVP heuristics, not protocol gas parameters.",
7
+ "Tune these values with fixture evidence and keep detector code free of final-fork assumptions."
8
+ ],
9
+ "bytecode": {
10
+ "contractSize": {
11
+ "currentRuntimeLimitBytes": 24576,
12
+ "nearCurrentLimitBytes": 20000
13
+ },
14
+ "stateAccountOpcodeExposure": {
15
+ "mediumSensitiveOpcodeCount": 8,
16
+ "lowSensitiveOpcodeCount": 3
17
+ },
18
+ "storagePattern": {
19
+ "mediumStorageOpcodeCount": 8
20
+ }
21
+ },
22
+ "trace": {
23
+ "stateHeavyExecution": {
24
+ "highStorageOps": 40,
25
+ "highSensitiveOpcodeCount": 80,
26
+ "mediumStorageOps": 10,
27
+ "mediumSensitiveOpcodeCount": 20
28
+ },
29
+ "calldataHeavy": {
30
+ "mediumCalldataBytes": 4096
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "profile": "research",
4
+ "lastUpdated": "2026-05-09",
5
+ "notes": [
6
+ "Research profile: intentionally more sensitive than the default profile.",
7
+ "Use this for broad signal collection and aggregate studies, not low-noise CI gating."
8
+ ],
9
+ "bytecode": {
10
+ "contractSize": {
11
+ "currentRuntimeLimitBytes": 24576,
12
+ "nearCurrentLimitBytes": 18000
13
+ },
14
+ "stateAccountOpcodeExposure": {
15
+ "mediumSensitiveOpcodeCount": 4,
16
+ "lowSensitiveOpcodeCount": 1
17
+ },
18
+ "storagePattern": {
19
+ "mediumStorageOpcodeCount": 4
20
+ }
21
+ },
22
+ "trace": {
23
+ "stateHeavyExecution": {
24
+ "highStorageOps": 20,
25
+ "highSensitiveOpcodeCount": 40,
26
+ "mediumStorageOps": 4,
27
+ "mediumSensitiveOpcodeCount": 8
28
+ },
29
+ "calldataHeavy": {
30
+ "mediumCalldataBytes": 1024
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,85 @@
1
+ {
2
+ "fork": "glamsterdam",
3
+ "lastUpdated": "2026-05-08",
4
+ "sources": [
5
+ "https://eips.ethereum.org/EIPS/eip-7773",
6
+ "https://ethereum.org/roadmap/glamsterdam/",
7
+ "https://esp.ethereum.foundation/applicants/wishlist",
8
+ "https://blog.ethereum.org/2026/05/02/soldogn-interop-recap",
9
+ "https://blog.ethereum.org/2026/02/18/protocol-priorities-update-2026"
10
+ ],
11
+ "eips": [
12
+ {
13
+ "id": "EIP-7928",
14
+ "name": "Block-Level Access Lists",
15
+ "status": "scheduled",
16
+ "domain": ["execution", "indexer", "monitoring"],
17
+ "detectors": ["balDetectors"],
18
+ "notes": "Used for BAL-related indexer and monitoring readiness checks. Do not hardcode final behavior in detector code."
19
+ },
20
+ {
21
+ "id": "EIP-7732",
22
+ "name": "Enshrined Proposer-Builder Separation",
23
+ "status": "scheduled",
24
+ "domain": ["consensus", "validator", "builder"],
25
+ "detectors": ["epbsDetectors"],
26
+ "notes": "Used for validator and operator readiness checks around builder/API metadata."
27
+ },
28
+ {
29
+ "id": "EIP-7708",
30
+ "name": "ETH transfers emit a log",
31
+ "status": "considered",
32
+ "domain": ["execution", "indexer", "monitoring"],
33
+ "detectors": ["nativeEthTransferLogDetectors"],
34
+ "notes": "Used for native ETH transfer visibility checks. Treat as considered until status changes."
35
+ },
36
+ {
37
+ "id": "EIP-7904",
38
+ "name": "General Repricing",
39
+ "status": "considered",
40
+ "domain": ["execution", "contracts"],
41
+ "detectors": ["gasRepricingDetectors"],
42
+ "notes": "Broad repricing candidate. Exact gas deltas must come from data, not hardcoded detector logic."
43
+ },
44
+ {
45
+ "id": "EIP-7954",
46
+ "name": "Increase Maximum Contract Size",
47
+ "status": "considered",
48
+ "domain": ["execution", "contracts"],
49
+ "detectors": ["contractSizeDetectors"],
50
+ "notes": "Used only to flag contract-size review areas. Final limits may change."
51
+ },
52
+ {
53
+ "id": "EIP-7976",
54
+ "name": "Increase Calldata Floor Cost",
55
+ "status": "considered",
56
+ "domain": ["execution", "contracts"],
57
+ "detectors": ["gasRepricingDetectors"],
58
+ "notes": "Used for calldata-heavy trace and bytecode review prompts when calldata evidence is visible."
59
+ },
60
+ {
61
+ "id": "EIP-8037",
62
+ "name": "State Creation Gas Cost Increase",
63
+ "status": "considered",
64
+ "domain": ["execution", "contracts"],
65
+ "detectors": ["stateCreationDetectors"],
66
+ "notes": "Used for CREATE and CREATE2 review prompts. Do not infer exact cost changes."
67
+ },
68
+ {
69
+ "id": "EIP-8038",
70
+ "name": "State-access gas cost increase",
71
+ "status": "considered",
72
+ "domain": ["execution", "contracts"],
73
+ "detectors": ["gasRepricingDetectors"],
74
+ "notes": "Used for storage/account access review prompts. Do not infer exact cost changes."
75
+ },
76
+ {
77
+ "id": "GAS-REPRICING",
78
+ "name": "Glamsterdam gas repricing candidates",
79
+ "status": "considered",
80
+ "domain": ["execution", "contracts"],
81
+ "detectors": ["gasRepricingDetectors", "stateCreationDetectors"],
82
+ "notes": "Umbrella entry for broad heuristics until exact final EIPs and parameters are confirmed."
83
+ }
84
+ ]
85
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};