|
|
|
@ -6,7 +6,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do |
|
|
|
|
import Explorer.Chain.Import.RunnerCase, only: [insert_address_with_token_balances: 1, update_holder_count!: 2] |
|
|
|
|
|
|
|
|
|
alias Ecto.Multi |
|
|
|
|
alias Explorer.Chain.Import.Runner.{Blocks, Transaction} |
|
|
|
|
alias Explorer.Chain.Import.Runner.{Blocks, Transactions} |
|
|
|
|
alias Explorer.Chain.{Address, Block, Transaction} |
|
|
|
|
alias Explorer.Chain |
|
|
|
|
alias Explorer.Repo |
|
|
|
@ -283,6 +283,29 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do |
|
|
|
|
insert_block(new_block1, options) |
|
|
|
|
assert Chain.missing_block_number_ranges(range) == [] |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
# Regression test for https://github.com/poanetwork/blockscout/issues/1911 |
|
|
|
|
test "forces block refetch if transaction is re-collated in a different block", |
|
|
|
|
%{consensus_block: %Block{number: block_number, hash: block_hash, miner_hash: miner_hash}, options: options} do |
|
|
|
|
new_block1 = params_for(:block, miner_hash: miner_hash, parent_hash: block_hash, number: block_number + 1) |
|
|
|
|
new_block2 = params_for(:block, miner_hash: miner_hash, parent_hash: new_block1.hash, number: block_number + 2) |
|
|
|
|
|
|
|
|
|
range = block_number..(block_number + 2) |
|
|
|
|
|
|
|
|
|
insert_block(new_block1, options) |
|
|
|
|
insert_block(new_block2, options) |
|
|
|
|
assert Chain.missing_block_number_ranges(range) == [] |
|
|
|
|
|
|
|
|
|
trans_hash = transaction_hash() |
|
|
|
|
|
|
|
|
|
transaction1 = transaction_params_with_block([hash: trans_hash], new_block1) |
|
|
|
|
insert_transaction(transaction1, options) |
|
|
|
|
assert Chain.missing_block_number_ranges(range) == [] |
|
|
|
|
|
|
|
|
|
transaction2 = transaction_params_with_block([hash: trans_hash], new_block2) |
|
|
|
|
insert_transaction(transaction2, options) |
|
|
|
|
assert Chain.missing_block_number_ranges(range) == [(block_number + 1)..(block_number + 1)] |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp insert_block(block_params, options) do |
|
|
|
@ -293,6 +316,28 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do |
|
|
|
|
|> Repo.transaction() |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp transaction_params_with_block(transaction_params, block_params) do |
|
|
|
|
params_for(:transaction, transaction_params) |
|
|
|
|
|> Map.merge(%{ |
|
|
|
|
block_hash: block_params.hash, |
|
|
|
|
block_number: block_params.number, |
|
|
|
|
cumulative_gas_used: 50_000, |
|
|
|
|
error: nil, |
|
|
|
|
gas_used: 50_000, |
|
|
|
|
index: 0, |
|
|
|
|
from_address_hash: insert(:address).hash |
|
|
|
|
}) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp insert_transaction(transaction_params, options) do |
|
|
|
|
%Ecto.Changeset{valid?: true, changes: transaction_changes} = |
|
|
|
|
Transaction.changeset(%Transaction{}, transaction_params) |
|
|
|
|
|
|
|
|
|
Multi.new() |
|
|
|
|
|> Transactions.run([transaction_changes], options) |
|
|
|
|
|> Repo.transaction() |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp count(schema) do |
|
|
|
|
Repo.one!(select(schema, fragment("COUNT(*)"))) |
|
|
|
|
end |
|
|
|
|