Repository navigation
v4.11.0
Nuthatch 4.11.0 is the release the subgraph stopgap needed: a nest that answers a subgraph's own
client queries can now be run from release downloads alone. It also carries four scaled-mode,
/sql and publishing fixes from the previous two days. There is no storage migration.
New: a graph build on every release
Each release now attaches nuthatch-graph-<target>.tar.gz for Linux and macOS, built with
--features graph and attested like the others (#1957). It serves a nest's Graph-dialect GraphQL at
/graphql and /subgraphs/id/<deployment>. The default binary is unchanged and still has no GraphQL
route. The first nest that needs it is
betswirl-bnb-nest, seedable from
the mirror; docs/subgraph-stopgap.md
has the programme.
GraphQL answers more client shapes, and refuses by name
- A to-one relation below another (
gameToken { token { symbol } }), a single@derivedFromfield
and a stored scalar list now answer. A[BigInt!]list answers its elements as strings, as
graph-node sends them (#1949). - An unsupplied nullable variable is an absent argument, as graph-node reads it; a missing non-null
one is still refused.orderBybreaks ties on the id, so paging over equal values is stable (#1949). - A schema whose field descriptions contain a colon or a
#no longer panics the request, and
malformed schema input is an error rather than a panic (#1958, #1948). __schema { queryType { fields } }answers instead of returning null, and an unknown
introspection field is refused by name (#1958).- A collection with no view is refused as
`tokens` is not served by this nestrather than a
raw engine error (#1958).
Ingestion
- A factory nest asks for logs by factory and child addresses until 500 children, in the default
backfill, the tip loop and the runtime cursor, not by topic0 alone from the first window. An
endpoint that refuses a topic0-only fetch switches the cursor to addresses (#1954). - An endpoint that refuses too many addresses in one
eth_getLogs(publicnode on BSC and Polygon:
10 or more) is no longer read as a credentials refusal. The address list is halved until accepted,
and an archive refusal stops a backfill at once with a hint to supply an archive endpoint (#1954). - "eth_getLogs is limited to 0 - 50 blocks range" narrows the window (#1954).
init --from-subgraphno longer turns a block-handler-only source into a contract that indexes
every event in its ABI (#1954).
Porting
port-emit with no mapping source (a deployment CID alone: IPFS holds compiled WASM) now says
nothing was classified and exits non-zero, instead of reporting 100% coverage. @derivedFrom
fields count as answered only when both views exist, and fields of a view with no id column do
not count. Templates get their factory rule from Template.create(...), and the classifier now
sees writes in class methods, +=, getOrCreate helpers and bound-contract reads (#1953, #1947).
/sql and publishing
- The SQL answer cache keys on the rows and segments a statement reads, not on every cursor poll, so
a quiet nest at the tip answers a repeated statement from the cache (#1955). On the BetSwirl nest a
repeated SDKbetsquery went from 10.4 s to 3 ms; the first one is still slow (#1951 stays open). - A cold-only
/sqlanswer reportsprovenance.sourceassealed, nothot+sealed, and a mount
that conflicts with another NID names the route to move it rather than a removed command (#1938). nuthatch_publish_lag_blockscounts final segments the mirror lacks, rather than the seal watermark
less the mirror's highest block, which read millions on quiet nests (#1932).
Scaled mode
A worker that loses a cursor's lease stops ingesting it on that tick, rather than carrying on with
only the fence refusing its writes (#1939).
init's unknown-chain remedy lists every built-in chain, monad and robinhood included (#1931).
Compatibility and upgrade
Replace the binary and restart. No re-index. To serve GraphQL, use the nuthatch-graph download.