Files
Dario Gabriel LipicarandClaude Opus 5 35fc0365ce feat: the full eth*/op* mirror, generated — and CI to gate it
Grows the typed surface from 8 methods to 60: all 30 eth_* the library
dispatches, plus the 30 op_* mirrors. Everything was already reachable through
rpc(); what was missing was discoverability — `lm methods`, the LIDL contract,
and a caller's type checker.

Generated, not hand-written. Each wrapper is three lines over the same shared
path, so sixty-one of them by hand is sixty-one chances to transpose an
argument; the table is extracted from the library's OWN dispatch table (the
`case $name` in c_frontend.nim), including each parameter's real type — which
is how ethGetBlockByNumber gets a bool, ethFeeHistory a uint64 and a list, and
eth_call an object rather than everything being a string.

They are still committed as literal text: the module's code generator parses
verified_proxy_impl.h as TEXT to build the LIDL contract, so anything hidden
behind a macro would simply not exist to it. `--check` proves the committed
blocks still match, and fails on a one-character edit (verified).

eth_syncing is deliberately excluded from the typed surface — the runtime
issues it as its own keep-alive and a wrapper would invite callers to fight it.
Still reachable through rpc().

CI is new for this repo, which had none: build on Linux and macOS, unit tests
(the check derivation runs the suite as part of building it), and the codegen
drift check. Named explicitly rather than via `nix flake check`, which would
also evaluate the x86_64-windows pseudo-system.

Verified live on sepolia through a real logoscore daemon: ethGasPrice,
ethMaxPriorityFeePerGas, ethBlobBaseFee, ethGetBlockTransactionCountByNumber,
ethGetUncleCountByBlockNumber and ethGetBlockByNumber all answer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 23:09:04 -03:00

64 lines
2.0 KiB
YAML

name: CI
on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: cachix/cachix-action@v15
with:
name: logos-co
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
# libverifproxy is a ~25 minute source build of the whole nimbus/Nim
# toolchain, so the Logos cache is doing real work here rather than
# shaving seconds.
- name: Build module
run: nix build -L
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: cachix/cachix-action@v15
with:
name: logos-co
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
# The check derivation RUNS the suite as part of building it, so a red
# test is a failed build. Named explicitly rather than via `nix flake
# check`, which would also evaluate the x86_64-windows pseudo-system.
- name: Unit tests
run: |
nix build -L ".#checks.$(nix eval --impure --raw --expr builtins.currentSystem).unit-tests"
codegen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# The 60 typed eth_*/op_* wrappers are generated from the library's own
# dispatch table but COMMITTED as literal text, because the module's code
# generator parses verified_proxy_impl.h as text and cannot see through a
# macro. This proves nobody hand-edited the generated blocks, and that a
# bumped nimbus input has not left them behind.
- name: RPC wrappers match the generator
run: python3 tools/gen_rpc_methods.py --check