From feac4226b1473a3ff4a3f55f9ade66a7ce116637 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Fri, 10 Jul 2026 00:02:39 +0200 Subject: [PATCH] abigen: use original names for custom errors --- accounts/abi/abigen/bindv2_test.go | 22 ++++++++++++++++++++++ accounts/abi/abigen/source2.go.tpl | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/accounts/abi/abigen/bindv2_test.go b/accounts/abi/abigen/bindv2_test.go index ee943f1c3f..9c917a120d 100644 --- a/accounts/abi/abigen/bindv2_test.go +++ b/accounts/abi/abigen/bindv2_test.go @@ -297,6 +297,28 @@ func TestBindingV2ConvertedV1Tests(t *testing.T) { } } +func TestBindingV2ErrorUsesOriginalName(t *testing.T) { + const errorABI = `[{ + "inputs":[{"internalType":"uint256","name":"value","type":"uint256"}], + "name":"bad_thing", + "type":"error" + }]` + + code, err := BindV2([]string{"C"}, []string{errorABI}, []string{""}, "bindings", nil, nil) + if err != nil { + t.Fatalf("failed to generate binding: %v", err) + } + for _, want := range []string{ + `abi.Errors["bad_thing"]`, + `UnpackIntoInterface(out, "bad_thing", raw)`, + `UnpackBadThingError(raw[4:])`, + } { + if !strings.Contains(code, want) { + t.Fatalf("generated binding does not contain %q:\n%s", want, code) + } + } +} + func TestNormalizeArgs(t *testing.T) { type normalizeArgsTc struct { inp []string diff --git a/accounts/abi/abigen/source2.go.tpl b/accounts/abi/abigen/source2.go.tpl index 9285497511..1730fe25a0 100644 --- a/accounts/abi/abigen/source2.go.tpl +++ b/accounts/abi/abigen/source2.go.tpl @@ -219,7 +219,7 @@ var ( // error definitions. func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) UnpackError(raw []byte) (any, error) { {{- range $k, $v := .Errors}} - if bytes.Equal(raw[:4], {{ decapitalise $contract.Type}}.abi.Errors["{{.Normalized.Name}}"].ID.Bytes()[:4]) { + if bytes.Equal(raw[:4], {{ decapitalise $contract.Type}}.abi.Errors["{{.Original.Name}}"].ID.Bytes()[:4]) { return {{ decapitalise $contract.Type}}.Unpack{{.Normalized.Name}}Error(raw[4:]) } {{- end }} @@ -246,7 +246,7 @@ var ( // Solidity: {{.Original.String}} func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Unpack{{.Normalized.Name}}Error(raw []byte) (*{{$contract.Type}}{{.Normalized.Name}}, error) { out := new({{$contract.Type}}{{.Normalized.Name}}) - if err := {{ decapitalise $contract.Type}}.abi.UnpackIntoInterface(out, "{{.Normalized.Name}}", raw); err != nil { + if err := {{ decapitalise $contract.Type}}.abi.UnpackIntoInterface(out, "{{.Original.Name}}", raw); err != nil { return nil, err } return out, nil