Files
Dario LipicarandClaude Opus 4.8 e06d777437 Executable doc-test: price a token via a real Multicall3 round-trip on logoscore (#1)
* ci: executable doc-test (logoscore runtime, Multicall3 round-trip) + publish workflow

Adds a logos-doctest spec that installs uniswap_module + eth_rpc_module under a
logoscore daemon, reads the seeded multi-chain config, then prices USDC via a
real Multicall3 eth_call to a local mock node (1 WETH = 3000 USDC), proving the
batch->eth_rpc->decode path end-to-end. Plus the doctests/run.sh regenerator and
the PR/master CI workflow that publishes the rendered report to GitHub Pages.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(doctest): use verbatim aggregate3 hex + escaping-robust assertions

The hand-split per-word hex dropped a byte (price off by 256x); inline the exact
continuous Multicall3 return. Assert on substrings that survive the daemon's
double-JSON-encoded reply. Doc-test now 22/22 green (WETH prices at $3000).

* docs(doctest): render outputs/uniswap-module-runtime.md (22/22 green)

* fix(doctest): tolerate 'logoscore stop' exit on teardown (|| true)

The daemon-stop teardown step can be SIGTERM'd (exit -15) on CI runners under
'bash -e', reddening an otherwise-green run. Make the teardown non-fatal so the
published report reflects the actual assertions.

* fix(doctest): retry idempotent reads on transient RPC_FAILED

The first proxied call that drives a module through a blocking network round-trip
can hit a cold-replica/transport race on loaded CI runners (RPC_FAILED). The
affected calls are pure reads, so wrap them in a bounded retry-with-backoff
(6x, 3s) — the textbook-safe mitigation for transient RPC flakiness — so the
published report is reliably green. code_block keeps the rendered command clean.

* fix(doctest): survive 'logoscore stop' group-SIGTERM (trap) + reload-recover wedged transport

CI evidence: the teardown's -15 was the dominant remaining failure — 'logoscore
stop' SIGTERMs its own process group, killing the step shell directly (|| true
can't catch a signal), so guard the teardown with 'trap "" TERM'. token-list's
refresh also wedged its transport persistently within a session; on RPC_FAILED
it now reloads + re-configures the module before retrying.

* feat: concurrency:"multi" — uniswap prices/quotes serve concurrently

Every price/quote/swap method blocks on a Multicall3 eth_call through eth_rpc, so
pricing several chains at once no longer serializes. Trait → &self + Send+Sync;
config behind a RwLock (read it, clone the chain, drop the lock, then call).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(doctest): build a 0.2 logoscore so the multi uniswap's deferred reply resolves

uniswap_module is now concurrency:"multi" — CLI calls return a pending sentinel
the daemon must resolve. Override logoscore's protocol (+ liblogos's) to >= 0.2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: bump logos-module-builder → 7bcd2de (qt-sdk QThread multi fix)

uniswap_module is concurrency:"multi" and calls eth_rpc_module from its worker.
The merged logos-qt-sdk#6 (via module-builder#136) spawns the multi handler on a
real QThread so that outbound module→module call's nested QEventLoops can drive
the QtRO replica handshake — without it get_prices hung (METHOD_FAILED). Verified
locally end-to-end: get_prices now returns the Multicall3-priced result ($3000).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 10:59:05 -03:00
..