The porting release.
Fixed
- Handler symbols are source-qualified when they would collide. Two sources handling the same event name (three registry contracts all emitting
CollSurplusPoolAddressChanged, say) emitted three identically-named exported functions, three imports sharing one alias, and three manifest entries pointing at the same symbol, whichgraph buildrejects withDuplicate identifier. Colliding handlers now becomehandle<Source><Event>and their trigger classes are aliased per source. A name with nothing to disambiguate is untouched, so the common single-source case still readshandleTransfer. - A bound ABI is imported and listed in the manifest.
Abi.bind(addr)for a contract the data source doesn't itself watch, such as reading a token'ssymbol()from a factory handler or a registry from inside a helperfn, emitted the contract class with no import and no manifestabis:entry, failing eject withCannot find name. Every bind, including in a helper, is now resolved across the project: the ABI is listed on each data source and imported from the modulegraph codegenwrites it to. Declaring an inert template with a dummy block handler is no longer necessary. - Narrow Solidity integers lower correctly. A
uint8/uint16/uint24orint8…int32parameter was typedBigInt, soevent.params.op == 1emitted.equals(1)on whatgraph codegenhad made a nativei32. The width table now matches graph-cli's exactly, and Solidity array types map to lists. - A description containing a colon no longer breaks the manifest. It is emitted as a quoted YAML scalar. Previously the graph CLI refused to parse
subgraph.yamlat all. Bytes.empty/Address.zeroare called, not referenced. They lowered to a bare function reference that failed to compile, likeBigInt.zerobefore it.
Added
redstart verifybuilds, then runsgraph codegen+graph buildover the output.checkandbuildanswer questions about your source;verifyanswers the one that decides a deploy, and it is the command to put in CI. (deploy --dry-runalready did this.verifyis the honest name for it.)entity.field = Noneclears an optional field, lowering to the generated setter'sunset, with no rawstore.get/unset/store.setescape hatch.E056rejects clearing a field that isn'tOption<T>.Booleanis accepted alongsideBool, because that is what everyschema.graphqlsays. The checker used to reject it while its own error text recommended it.E057, unknown trigger parameter.event.params.x(orcall.inputs.x) naming something the ABI doesn't declare is now an error listing the real parameter names, instead of passing through to fail atgraph build. Unnamed ABI inputs areparam0,param1, … exactly asgraph codegennames them.E055,.save()teaches instead of confusing. It used to report "Xhas no fieldsave". It now explains that entities dirty-track and save themselves. The catalogue is 35 codes (29 errors, 6 warnings).- Porting an existing subgraph, a book chapter covering the schema and mapping translation tables, exactly what an event handler can see (and that
event.receiptis not available), the transaction-keyed staging-entity pattern that replaces receipt inspection, multi-source event names, and multi-network deployment. redstart newwrites a fuller.gitignore, andredstart buildsays plainly that its output is generated.