This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
Affected surfaces
ReleasePort's take
Moderate signalThe `prediction-markets` skill now loads correctly after a YAML frontmatter parsing fix, and the prototype key vulnerability that bypassed budget caps has been patched.
Why it matters: Fixes the prediction‑markets skill loading issue; patches a high‑severity (90) prototype key vulnerability preventing non‑finite cost estimates from causing failures.
Summary
AI summaryFixed pricing discrepancies, budget cap bypass, and unregistered skill caused by YAML parse failure.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Prototype key vulnerability that bypassed all budget caps is patched; non‑finite cost estimates now cause failure. Prototype key vulnerability that bypassed all budget caps is patched; non‑finite cost estimates now cause failure. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Feature | Low |
New command `npm run verify:prices` validates that price estimator matches live gateway quotes for all 20 paid routes. New command `npm run verify:prices` validates that price estimator matches live gateway quotes for all 20 paid routes. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | High |
`withTxFee` calculation now correctly rounds up micro‑USDC values, preventing under‑charging. `withTxFee` calculation now correctly rounds up micro‑USDC values, preventing under‑charging. Source: llm_adapter@2026-07-16 Confidence: low |
— |
| Bugfix | Medium |
`prediction-markets` skill now loads correctly after YAML frontmatter parsing fix. `prediction-markets` skill now loads correctly after YAML frontmatter parsing fix. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
`blockrun_surf` endpoint now correctly reports as non-existent, removing phantom 84th entry. `blockrun_surf` endpoint now correctly reports as non-existent, removing phantom 84th entry. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Price discrepancies across paid routes are corrected; estimator now matches live gateway quotes. Price discrepancies across paid routes are corrected; estimator now matches live gateway quotes. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
'withTxFee' calculation rounds up micro‑USDC values to match gateway behavior. 'withTxFee' calculation rounds up micro‑USDC values to match gateway behavior. Source: granite4.1:30b@2026-07-16-audit Confidence: low |
— |
Full changelog
Two of these were live the whole time and invisible to every prior audit round: a skill that never loaded and an endpoint that never existed. Both were found by asking the gateway instead of re-reading our own files.
prediction-markets has never once loaded
Its description read ...you CANNOT get from a public API: historical price.... A plain YAML scalar may not contain ": ", so the frontmatter failed to parse, the loader got no name, and the skill was never registered. It built, it published, the prose read perfectly — the only symptom was that Claude never used a capability we shipped.
blockrun_surf advertised an endpoint that does not exist
chat/completions ("Surf-1.5 chat with citations", $0.02 flat) returns 404 Unknown Surf endpoint — the gateway replies with its own catalog of 83. That phantom was the off-by-one: surf.ts claimed 84 where the skill and the gateway both say 83.
Correctness
withTxFeerounded where the gateway ceils.usdToMicroUsdcis an unconditionalMath.ceil; rounding goes one micro short wherever the ×1.05 margin drifts in float. modal's CPU hour charges 102001 micro, not 102000 —.toFixed(4)had been hiding it.- A prototype key killed every budget cap. modal's GPU tables were object literals, so
TABLE["toString"]returned a function, reaching the gate as NaN —cost > 0is false (call allowed) andspent += NaNsticks for the life of the process. A $1-capped agent was cleared for a $500 call. NowMaps, andbudget.tsfails closed on any non-finite estimate.
Prices — all understating, all corrected against live quotes
| | claimed | charged |
|---|---|---|
| image-prompting nano-banana | ~$0.01 | $0.0545 (5.45×) |
| image-prompting gpt-image-2 poster | ~$0.04 | $0.128 (3.2×) |
| surf worked example | $0.001 | $0.0095 (9.5×) |
| modal A100 example | no price, "auto-evicts when idle" | $1.3413, upfront, never refunded |
| rpc | $0.002 | $0.0040 |
| exa | $0.01 | $0.0120 |
| search max_results:20 | $0.50 | $0.527 |
Plus crypto-data, which documented blockrun_rpc({ chain: ... }) when the param is network — the call as written could not have run.
New: npm run verify:prices
Probes all 20 paid routes and compares each live 402 quote to what the estimator reserves. Under-reserving exits non-zero; over-reserving warns. Free to run (no payment attached). This drift is invisible to CI by construction — the gateway reprices without an MCP release — and had already shipped three times.
0 under-reserving, 0 over-reserving, 0 unreachable, 20 exact
169 tests, typecheck, build green.
Security Fixes
- Fixed budget cap bypass where non-finite estimates allowed $500 calls despite a $1 limit
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About blockrunai/blockrun-mcp
Live data for AI agents — search, research, markets, crypto, X/Twitter. Pay-per-call via x402 micropayments.
Related context
Beta — feedback welcome: [email protected]