From 440a173e06c2e7408679e0df64b8a7eeb7c761cd Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 8 Jan 2024 13:35:03 +0000 Subject: [PATCH] Parse BlockParameter correctly for eth_call (#6477) --- .../Nethermind.Blockchain/Find/BlockParameter.cs | 11 ++++++++++- .../Modules/Eth/EthRpcModuleTests.EthCall.cs | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.Blockchain/Find/BlockParameter.cs b/src/Nethermind/Nethermind.Blockchain/Find/BlockParameter.cs index 69bfc03aff4..b646bb29407 100644 --- a/src/Nethermind/Nethermind.Blockchain/Find/BlockParameter.cs +++ b/src/Nethermind/Nethermind.Blockchain/Find/BlockParameter.cs @@ -49,6 +49,8 @@ public BlockParameter(long number) public BlockParameter(Hash256 blockHash, bool requireCanonical = false) { + ArgumentNullException.ThrowIfNull(blockHash); + Type = BlockParameterType.BlockHash; BlockHash = blockHash; RequireCanonical = requireCanonical; @@ -151,10 +153,17 @@ public override void Write(Utf8JsonWriter writer, BlockParameter value, JsonSeri if (tokenType == JsonTokenType.StartObject) { bool requireCanonical = false; + bool readEndObject = false; Hash256 blockHash = null; for (int i = 0; i < 2; i++) { reader.Read(); + if (reader.TokenType == JsonTokenType.EndObject) + { + readEndObject = true; + break; + } + if (reader.ValueTextEquals("requireCanonical"u8)) { reader.Read(); @@ -168,7 +177,7 @@ public override void Write(Utf8JsonWriter writer, BlockParameter value, JsonSeri BlockParameter parameter = new(blockHash, requireCanonical); - if (!reader.Read() || reader.TokenType != JsonTokenType.EndObject) + if ((!readEndObject && !reader.Read()) || reader.TokenType != JsonTokenType.EndObject) { ThrowInvalidFormatting(); } diff --git a/src/Nethermind/Nethermind.JsonRpc.Test/Modules/Eth/EthRpcModuleTests.EthCall.cs b/src/Nethermind/Nethermind.JsonRpc.Test/Modules/Eth/EthRpcModuleTests.EthCall.cs index 8773bf7e244..ceb8024cbbb 100644 --- a/src/Nethermind/Nethermind.JsonRpc.Test/Modules/Eth/EthRpcModuleTests.EthCall.cs +++ b/src/Nethermind/Nethermind.JsonRpc.Test/Modules/Eth/EthRpcModuleTests.EthCall.cs @@ -137,6 +137,19 @@ public async Task Eth_call_ok() Assert.That(serialized, Is.EqualTo("{\"jsonrpc\":\"2.0\",\"result\":\"0x\",\"id\":67}")); } + [Test] + public async Task Eth_call_with_blockhash_ok() + { + using Context ctx = await Context.Create(); + TransactionForRpc transaction = new(Keccak.Zero, 1L, 1, new Transaction()); + transaction.From = TestItem.AddressA; + transaction.To = TestItem.AddressB; + + string serialized = + await ctx.Test.TestEthRpc("eth_call", ctx.Test.JsonSerializer.Serialize(transaction), "{\"blockHash\":\"0xf0b3f69cbd4e1e8d9b0ef02ff5d1384d18e19d251a4052f5f90bab190c5e8937\"}"); + Assert.That(serialized, Is.EqualTo("{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32001,\"message\":\"0xf0b3f69cbd4e1e8d9b0ef02ff5d1384d18e19d251a4052f5f90bab190c5e8937 could not be found\"},\"id\":67}")); + } + [Test] public async Task Eth_call_create_tx_with_empty_data() {