Blockchain explorer for Ethereum based network and a tool for inspecting and analyzing EVM based blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
blockscout/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/fetched_beneficiaries_test.exs

260 lines
8.6 KiB

defmodule EthereumJSONRPC.FetchedBeneficiariesTest do
use ExUnit.Case, async: true
alias EthereumJSONRPC
alias EthereumJSONRPC.FetchedBeneficiaries
describe "from_responses/2" do
test "when block is not found" do
block_quantity = EthereumJSONRPC.integer_to_quantity(1_000)
responses = [%{id: 0, result: nil}]
id_to_params = %{0 => %{block_quantity: block_quantity}}
expected_output = %EthereumJSONRPC.FetchedBeneficiaries{
errors: [%{code: 404, data: %{block_quantity: block_quantity}, message: "Not Found"}],
params_set: MapSet.new([])
}
assert FetchedBeneficiaries.from_responses(responses, id_to_params) == expected_output
end
test "with an error result" do
block_number = 1_000
block_quantity = EthereumJSONRPC.integer_to_quantity(block_number)
error_code = -32603
error_message = "Internal error occurred: {}, this should not be the case with eth_call, most likely a bug."
responses = [%{id: 0, error: %{code: error_code, message: error_message}}]
id_to_params = %{0 => %{block_quantity: block_quantity}}
expected_output = %EthereumJSONRPC.FetchedBeneficiaries{
errors: [%{code: error_code, data: %{block_quantity: block_quantity}, message: error_message}],
params_set: MapSet.new()
}
assert FetchedBeneficiaries.from_responses(responses, id_to_params) == expected_output
end
test "when reward type is external" do
block_hash = "0x52a8d2185282506ce681364d2aa0c085ba45fdeb5d6c0ddec1131617a71ee2ca"
block_number = 1_000
block_quantity = EthereumJSONRPC.integer_to_quantity(block_number)
hash1 = "0xef481b4e2c3ed62265617f2e9dfcdf3cf3efc11a"
hash2 = "0xef481b4e2c3ed62265617f2e9dfcdf3cf3efc11a"
reward = "0xde0b6b3a7640000"
responses = [
%{
id: 0,
result: [
%{
"action" => %{"author" => hash1, "rewardType" => "external", "value" => reward},
"blockHash" => block_hash,
"blockNumber" => block_number,
"result" => nil,
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => nil,
"transactionPosition" => nil,
"type" => "reward"
},
%{
"action" => %{"author" => hash2, "rewardType" => "external", "value" => reward},
"blockHash" => "0x52a8d2185282506ce681364d2aa0c085ba45fdeb5d6c0ddec1131617a71ee2ca",
"blockNumber" => block_number,
"result" => nil,
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => nil,
"transactionPosition" => nil,
"type" => "reward"
}
]
}
]
id_to_params = %{0 => %{block_quantity: block_quantity}}
expected_output = %EthereumJSONRPC.FetchedBeneficiaries{
errors: [],
params_set:
MapSet.new([
%{
address_hash: hash1,
address_type: :validator,
block_hash: block_hash,
block_number: block_number,
reward: reward
},
%{
address_hash: hash2,
address_type: :emission_funds,
block_hash: block_hash,
block_number: block_number,
reward: reward
}
])
}
assert FetchedBeneficiaries.from_responses(responses, id_to_params) == expected_output
end
test "when reward type is block with uncles" do
block_hash = "0x52a8d2185282506ce681364d2aa0c085ba45fdeb5d6c0ddec1131617a71ee2ca"
block_number = 1_000
block_quantity = EthereumJSONRPC.integer_to_quantity(block_number)
hash1 = "0xef481b4e2c3ed62265617f2e9dfcdf3cf3efc11a"
hash2 = "0x523b6539ff08d72a6c8bb598af95bf50c1ea839c"
reward = "0xde0b6b3a7640000"
responses = [
%{
id: 0,
result: [
%{
"action" => %{"author" => hash1, "rewardType" => "block", "value" => reward},
"blockHash" => block_hash,
"blockNumber" => block_number,
"result" => nil,
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => nil,
"transactionPosition" => nil,
"type" => "reward"
},
%{
"action" => %{"author" => hash2, "rewardType" => "uncle", "value" => reward},
"blockHash" => block_hash,
"blockNumber" => block_number,
"result" => nil,
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => nil,
"transactionPosition" => nil,
"type" => "reward"
}
]
}
]
id_to_params = %{0 => %{block_quantity: block_quantity}}
expected_output = %EthereumJSONRPC.FetchedBeneficiaries{
errors: [],
params_set:
MapSet.new([
%{
address_hash: hash1,
address_type: :validator,
block_hash: block_hash,
block_number: block_number,
reward: reward
},
%{
address_hash: hash2,
address_type: :uncle,
block_hash: block_hash,
block_number: block_number,
reward: reward
}
])
}
assert FetchedBeneficiaries.from_responses(responses, id_to_params) == expected_output
end
test "ignores non-reward responses" do
block_hash = "0x52a8d2185282506ce681364d2aa0c085ba45fdeb5d6c0ddec1131617a71ee2ca"
block_number = 1_000
block_quantity = EthereumJSONRPC.integer_to_quantity(block_number)
hash1 = "0xef481b4e2c3ed62265617f2e9dfcdf3cf3efc11a"
hash2 = "0x523b6539ff08d72a6c8bb598af95bf50c1ea839c"
reward = "0xde0b6b3a7640000"
responses = [
%{
id: 0,
result: [
%{
"action" => %{
"callType" => "call",
"from" => hash1,
"gas" => "0x0",
"input" => "0x",
"to" => hash2,
"value" => "0x4a817c800"
},
"blockHash" => block_hash,
"blockNumber" => block_number,
"result" => %{"gasUsed" => "0x0", "output" => "0x"},
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => "0x5acf90f846b8216bdbc309cf4eb24adc69d730bf29304dc0e740cf6df850666e",
"transactionPosition" => 0,
"type" => "call"
},
%{
"action" => %{"author" => hash1, "rewardType" => "block", "value" => reward},
"blockHash" => block_hash,
"blockNumber" => block_number,
"result" => nil,
"subtraces" => 0,
"traceAddress" => [],
"transactionHash" => nil,
"transactionPosition" => nil,
"type" => "reward"
}
]
}
]
id_to_params = %{0 => %{block_quantity: block_quantity}}
expected_output = %EthereumJSONRPC.FetchedBeneficiaries{
errors: [],
params_set:
MapSet.new([
%{
address_hash: hash1,
address_type: :validator,
block_hash: block_hash,
block_number: block_number,
reward: reward
}
])
}
assert FetchedBeneficiaries.from_responses(responses, id_to_params) == expected_output
end
end
describe "requests/1" do
test "maps multiple ids to request params map" do
input = %{
0 => %{block_quantity: EthereumJSONRPC.integer_to_quantity(1)},
1 => %{block_quantity: EthereumJSONRPC.integer_to_quantity(2)}
}
expected_output = [
%{id: 0, jsonrpc: "2.0", method: "trace_block", params: [EthereumJSONRPC.integer_to_quantity(1)]},
%{id: 1, jsonrpc: "2.0", method: "trace_block", params: [EthereumJSONRPC.integer_to_quantity(2)]}
]
assert FetchedBeneficiaries.requests(input) == expected_output
end
test "skips Genesis block" do
input = %{
0 => %{block_quantity: EthereumJSONRPC.integer_to_quantity(0)},
1 => %{block_quantity: EthereumJSONRPC.integer_to_quantity(1)}
}
expected_output = [
%{id: 1, jsonrpc: "2.0", method: "trace_block", params: [EthereumJSONRPC.integer_to_quantity(1)]}
]
assert FetchedBeneficiaries.requests(input) == expected_output
end
end
end