rpc: reject block parameter with neither number nor hash

An EIP-1898 block parameter object specifying neither blockNumber nor
blockHash (e.g. {}) is invalid, but UnmarshalJSON accepted it and it was
only rejected later in the backend with a generic -32000 error. Reject it
during unmarshalling so it surfaces as -32602 (invalid params), mirroring
the existing 'cannot specify both' check.
This commit is contained in:
stavrosvl7 2026-07-01 19:22:16 +03:00
parent 00a773dad7
commit a3bb5a0596
No known key found for this signature in database
GPG key ID: 3EED9D1D7A71F38F
2 changed files with 5 additions and 0 deletions

View file

@ -158,6 +158,9 @@ func (bnh *BlockNumberOrHash) UnmarshalJSON(data []byte) error {
if e.BlockNumber != nil && e.BlockHash != nil {
return errors.New("cannot specify both BlockHash and BlockNumber, choose one or the other")
}
if e.BlockNumber == nil && e.BlockHash == nil {
return errors.New("must specify either BlockHash or BlockNumber")
}
bnh.BlockNumber = e.BlockNumber
bnh.BlockHash = e.BlockHash
bnh.RequireCanonical = e.RequireCanonical

View file

@ -109,6 +109,8 @@ func TestBlockNumberOrHash_UnmarshalJSON(t *testing.T) {
27: {`{"blockNumber":"safe"}`, false, BlockNumberOrHashWithNumber(SafeBlockNumber)},
28: {`{"blockNumber":"finalized"}`, false, BlockNumberOrHashWithNumber(FinalizedBlockNumber)},
29: {`{"blockNumber":"0x1", "blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`, true, BlockNumberOrHash{}},
30: {`{}`, true, BlockNumberOrHash{}},
31: {`{"requireCanonical":true}`, true, BlockNumberOrHash{}},
}
for i, test := range tests {