Fetch EVM benchmark suites from the Benchmarkoor API and produce clean tabular outputs.
Project description
benchmarkoor-fetch
Fetch EVM benchmark suites from the Benchmarkoor
API and write clean tabular outputs (runtimes.csv, opcounts.json,
bench_data.parquet, trace.parquet, meta.json).
Data-ingestion only — no modelling, no gas analysis. The artifact bundle feeds evm-gasfit, which owns the gas-cost estimation step.
Install
pip install benchmarkoor-fetch
Requires Python ≥ 3.11.
Auth
The Benchmarkoor API requires a bearer token. Set it once:
export BENCHMARKOOR_TOKEN=...
You can also pass it per-call: --token … on the CLI, or
BenchmarkoorClient(token=…) in Python. It is never read from the YAML
config.
CLI quickstart
Write a fetch.yaml:
query:
network: jochemnet
fork: amsterdam
test_type: compute
start_date: "2026-05-18"
end_date: "2026-05-20"
fork is always required. network and test_type are used to discover
the latest matching suite_hash; if you already know the hashes, list them
under suites: instead and omit network / test_type:
query:
fork: amsterdam
suites:
- 0xaaa111
- 0xbbb222
To keep only the runs whose run_id matches a regex, add run_id_pattern:
query:
fork: amsterdam
suites:
- 0xaaa111
run_id_pattern: '.*-full' # keep runs whose run_id ends with `-full`
run_id_pattern is matched against each run_id with re.fullmatch, so the
whole run_id must match — use .*…* to get substring behaviour (e.g.
'.*bal-full.*' to keep any run_id containing bal-full). A malformed
regex is rejected at config load.
Then run:
benchmarkoor-fetch run --config fetch.yaml --out ./data
If --out is omitted, outputs land in
./{earliest_run_ts}_{latest_run_ts}/ using the actual run timestamps of
the data fetched (not the configured window).
Any query.* or output.* field can be overridden on the command line:
benchmarkoor-fetch run --config fetch.yaml \
--fork osaka --start-date 2026-05-01 --end-date 2026-05-08 \
--out ./data
Resolve the latest suite hash for a (network, fork, test_type) tuple without fetching the bundle:
benchmarkoor-fetch suites --network jochemnet --fork amsterdam --test-type compute
Exit codes: 0 success · 1 config/input error · 2 HTTP error ·
3 empty result.
Verbosity: by default the CLI prints high-level milestones (suite
resolution, runs listed, trace fetch) and a tqdm progress bar while
fetching test stats. Pass --verbose to also emit per-event detail (cache
hit/miss, per-run fetch lines), or --quiet to suppress milestones and
progress; only warnings and errors are shown. --verbose and --quiet
are mutually exclusive.
Python / notebook quickstart
Style A — config-driven, full pipeline:
from benchmarkoor_fetch import BenchmarkoorClient, FetchConfig
config = FetchConfig.from_yaml("fetch.yaml")
client = BenchmarkoorClient() # picks up BENCHMARKOOR_TOKEN
result = client.run(config) # returns FetchResult
result.bench_df # merged DataFrame
result.trace_df # per-fixture opcode counts
result.write("./data") # writes the artifact bundle
Style B — granular, for notebooks that want to inspect mid-pipeline (see examples/quickstart.ipynb for the runnable version):
client = BenchmarkoorClient()
suite_hash = client.resolve_suite(
network="jochemnet", fork="amsterdam", test_type="compute"
)
runs = client.list_runs(suite_hash, start_date="2026-05-18", end_date="2026-05-20")
raw_df = client.fetch_test_stats(runs, suite_hash=suite_hash)
trace = client.fetch_trace(suite_hash)
bench_df, trace_df = client.parse(raw_df, trace, fork="amsterdam")
Outputs
Written to --out:
| File | Contents |
|---|---|
runtimes.csv |
client_name, fixture_name, test_runtime_ms — one row per benchmark run. |
opcounts.json |
{fixture_name: {opcount, OPCODE: count, …}}. |
bench_data.parquet |
The full merged frame: run_id, client_name, test_title, test_file, test_name, test_opcode, test_params, test_runtime_ms, ingestion_timestamp, block_limit_million, opcount. |
trace.parquet |
Per-fixture trace keyed by test_title. |
meta.json |
Resolved suite hashes, query block, fetched-at timestamp, package version, row counts. |
Runtimes are kept in milliseconds (test_runtime_ms) on the wire and
on disk — converting to seconds is left to the consumer.
Feeding evm-gasfit
The two-step workflow is:
# 1. Ingest with benchmarkoor-fetch
benchmarkoor-fetch run --config fetch.yaml --out ./data
# 2. Estimate gas costs with evm-gasfit, pointing at the same folder
evm-gasfit fit --inputs ./data ...
evm-gasfit consumes runtimes.csv + opcounts.json from the output
directory; bench_data.parquet and trace.parquet are there for direct
DataFrame analysis.
Caching
Responses are cached on disk under ./.cache/benchmarkoor-fetch/
(relative to the current working directory) by default. The cache is content-addressed and never expires — keys are
built so that a hit guarantees byte-identical bytes. Suite discovery is
intentionally not cached (it must always reflect the latest suite).
Bypass per-run with --no-cache, relocate with --cache-dir <path>, or
disable in YAML via cache.enabled: false.
Development
pip install -e ".[dev]"
pytest
ruff check src tests
ruff format src tests
License
See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file benchmarkoor_fetch-0.2.0.tar.gz.
File metadata
- Download URL: benchmarkoor_fetch-0.2.0.tar.gz
- Upload date:
- Size: 49.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69bb561114b3e7bf42851be8ef105d0b24b21a4d4f943746a712f5a3343f44ef
|
|
| MD5 |
4b96f3b2bf7b60a6564027761067d1b1
|
|
| BLAKE2b-256 |
1f2660eea0b51ea2c5fc75dfc1f0ae87342f49b5f3c022845df5486bae4c86cb
|
Provenance
The following attestation bundles were made for benchmarkoor_fetch-0.2.0.tar.gz:
Publisher:
release.yml on misilva73/benchmarkoor-fetch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
benchmarkoor_fetch-0.2.0.tar.gz -
Subject digest:
69bb561114b3e7bf42851be8ef105d0b24b21a4d4f943746a712f5a3343f44ef - Sigstore transparency entry: 1669421719
- Sigstore integration time:
-
Permalink:
misilva73/benchmarkoor-fetch@4ba2538fd239be9af4bbdb728fc38611fbf53ea3 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/misilva73
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4ba2538fd239be9af4bbdb728fc38611fbf53ea3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file benchmarkoor_fetch-0.2.0-py3-none-any.whl.
File metadata
- Download URL: benchmarkoor_fetch-0.2.0-py3-none-any.whl
- Upload date:
- Size: 37.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b998b95bbf5216338917e39f84c16fcdd26174ec529af974f1fc21d6dd3ba730
|
|
| MD5 |
fdf913ad6c8ed2c6ba38b3b2977817f1
|
|
| BLAKE2b-256 |
1d829cb54dd54dea1e4d85bcaa5ce7b4ae0ef6e96847867df900fab1f3162661
|
Provenance
The following attestation bundles were made for benchmarkoor_fetch-0.2.0-py3-none-any.whl:
Publisher:
release.yml on misilva73/benchmarkoor-fetch
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
benchmarkoor_fetch-0.2.0-py3-none-any.whl -
Subject digest:
b998b95bbf5216338917e39f84c16fcdd26174ec529af974f1fc21d6dd3ba730 - Sigstore transparency entry: 1669421868
- Sigstore integration time:
-
Permalink:
misilva73/benchmarkoor-fetch@4ba2538fd239be9af4bbdb728fc38611fbf53ea3 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/misilva73
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4ba2538fd239be9af4bbdb728fc38611fbf53ea3 -
Trigger Event:
push
-
Statement type: