mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-04-14 05:38:37 +00:00
# Summary
Replaces the inline `errors.New("event signature mismatch")` in
generated `UnpackXxxEvent` methods with per-event package-level sentinel
errors (e.g. `ErrTransferSignatureMismatch`,
`ErrApprovalSignatureMismatch`), allowing callers to reliably
distinguish a topic mismatch from a genuine decoding failure via
`errors.Is`.
Each event gets its own sentinel, generated via the abigen template:
```go
var ErrTransferSignatureMismatch = errors.New("event signature mismatch")
```
This scoping is intentional — it allows callers to be precise about
*which* event was mismatched, which is useful when routing logs across
multiple unpackers.
# Motivation
Previously, all errors returned from `UnpackXxxEvent` were
indistinguishable without string matching. This is especially
problematic when processing logs sourced from `eth_getBlockReceipts`,
where a caller receives the full set of logs for a block across all
contracts and event types. In that context, a signature mismatch is
expected and should be skipped, while any other error (malformed data,
topic parsing failure) indicates something is genuinely wrong and should
halt execution:
```go
for _, log := range blockLogs {
event, err := contract.UnpackTransferEvent(log)
if errors.Is(err, gen.ErrTransferSignatureMismatch) {
continue // not our event, expected
}
if err != nil {
return fmt.Errorf("unexpected decode failure: %w", err) // alert
}
// process event
}
```
**Changes:**
- `abigen` template: generates a `ErrXxxSignatureMismatch` sentinel per
event and returns it on topic mismatch instead of an inline error
- Existing generated bindings & testdata: regenerated to reflect the
update
Implements #34075
|
||
|---|---|---|
| .. | ||
| abigen | ||
| bind | ||
| abi.go | ||
| abi_test.go | ||
| abifuzzer_test.go | ||
| argument.go | ||
| doc.go | ||
| error.go | ||
| error_handling.go | ||
| event.go | ||
| event_test.go | ||
| method.go | ||
| method_test.go | ||
| pack.go | ||
| pack_test.go | ||
| packing_test.go | ||
| reflect.go | ||
| reflect_test.go | ||
| selector_parser.go | ||
| selector_parser_test.go | ||
| topics.go | ||
| topics_test.go | ||
| type.go | ||
| type_test.go | ||
| unpack.go | ||
| unpack_test.go | ||
| utils.go | ||