diff --git a/params/json.libevm.go b/params/json.libevm.go index a642b7050f317..5c1bab01bd980 100644 --- a/params/json.libevm.go +++ b/params/json.libevm.go @@ -53,27 +53,29 @@ func (c *ChainConfig) UnmarshalJSON(data []byte) (err error) { // - `reuseJSONRoot` is true: // `data` is decoded into `config` and `data` is decoded into `extra`. func UnmarshalChainConfigJSON[T any](data []byte, config *ChainConfig, extra *T, reuseJSONRoot bool) (err error) { - if extra == nil { - return fmt.Errorf("extra pointer argument is nil") - } - err = json.Unmarshal(data, (*chainConfigWithoutMethods)(config)) switch { - case err != nil: - return fmt.Errorf("decoding root chain config: %s", err) + case extra == nil: + return fmt.Errorf("extra pointer argument is nil") case reuseJSONRoot: + err = json.Unmarshal(data, (*chainConfigWithoutMethods)(config)) + if err != nil { + return fmt.Errorf("decoding root chain config: %s", err) + } err = json.Unmarshal(data, extra) if err != nil { return fmt.Errorf("decoding extra config to %T: %s", extra, err) } - default: - jsonExtra := struct { + case !reuseJSONRoot: + combined := struct { + *chainConfigWithoutMethods Extra *T `json:"extra"` }{ - Extra: extra, + chainConfigWithoutMethods: (*chainConfigWithoutMethods)(config), + Extra: extra, } - err = json.Unmarshal(data, &jsonExtra) + err = json.Unmarshal(data, &combined) if err != nil { - return fmt.Errorf("decoding extra config to %T: %s", extra, err) + return fmt.Errorf("decoding config to combined of chain config and %T: %s", extra, err) } } return nil diff --git a/params/json.libevm_test.go b/params/json.libevm_test.go index c3e0692c9e56f..b63298c3f2528 100644 --- a/params/json.libevm_test.go +++ b/params/json.libevm_test.go @@ -162,7 +162,8 @@ func TestUnmarshalChainConfigJSON(t *testing.T) { "invalid_json": { extra: &testExtra{}, expectedExtra: &testExtra{}, - errMessage: "decoding root chain config: unexpected end of JSON input", + errMessage: "decoding config to combined of chain config and *params.testExtra: " + + "unexpected end of JSON input", }, "nil_extra_at_root_depth": { jsonData: `{"chainId": 1}`, @@ -195,7 +196,7 @@ func TestUnmarshalChainConfigJSON(t *testing.T) { extra: &testExtra{}, expectedConfig: ChainConfig{ChainID: big.NewInt(1)}, expectedExtra: &testExtra{}, - errMessage: "decoding extra config to *params.testExtra: " + + errMessage: "decoding config to combined of chain config and *params.testExtra: " + "json: cannot unmarshal number into Go struct field " + ".extra of type params.testExtra", },