113 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import List
 | 
						|
 | 
						|
from mev_inspect.schemas.traces import ClassifiedTrace
 | 
						|
from mev_inspect.traces import get_child_traces, is_child_trace_address
 | 
						|
 | 
						|
from .helpers import make_many_unknown_traces
 | 
						|
 | 
						|
 | 
						|
def test_is_child_trace_address():
 | 
						|
    assert is_child_trace_address([0], [])
 | 
						|
    assert is_child_trace_address([0, 0], [])
 | 
						|
    assert is_child_trace_address([0, 0], [0])
 | 
						|
    assert is_child_trace_address([100, 1, 10], [100])
 | 
						|
    assert is_child_trace_address([100, 1, 10], [100, 1])
 | 
						|
 | 
						|
    assert not is_child_trace_address([0], [1])
 | 
						|
    assert not is_child_trace_address([1], [0])
 | 
						|
    assert not is_child_trace_address([1, 0], [0])
 | 
						|
    assert not is_child_trace_address([100, 2, 10], [100, 1])
 | 
						|
 | 
						|
 | 
						|
def test_get_child_traces(get_transaction_hashes):
 | 
						|
    block_number = 123
 | 
						|
    [first_hash, second_hash] = get_transaction_hashes(2)
 | 
						|
 | 
						|
    traces = []
 | 
						|
 | 
						|
    first_hash_trace_addresses = [
 | 
						|
        [],
 | 
						|
        [0],
 | 
						|
        [0, 0],
 | 
						|
        [1],
 | 
						|
        [1, 0],
 | 
						|
        [1, 0, 0],
 | 
						|
        [1, 0, 1],
 | 
						|
        [1, 1],
 | 
						|
        [1, 2],
 | 
						|
    ]
 | 
						|
 | 
						|
    second_hash_trace_addresses = [[], [0], [1], [1, 0], [2]]
 | 
						|
 | 
						|
    traces += make_many_unknown_traces(
 | 
						|
        block_number,
 | 
						|
        first_hash,
 | 
						|
        first_hash_trace_addresses,
 | 
						|
    )
 | 
						|
 | 
						|
    traces += make_many_unknown_traces(
 | 
						|
        block_number,
 | 
						|
        second_hash,
 | 
						|
        second_hash_trace_addresses,
 | 
						|
    )
 | 
						|
 | 
						|
    assert has_expected_child_traces(
 | 
						|
        first_hash,
 | 
						|
        [],
 | 
						|
        traces,
 | 
						|
        first_hash_trace_addresses[1:],
 | 
						|
    )
 | 
						|
 | 
						|
    assert has_expected_child_traces(
 | 
						|
        first_hash,
 | 
						|
        [0],
 | 
						|
        traces,
 | 
						|
        [
 | 
						|
            [0, 0],
 | 
						|
        ],
 | 
						|
    )
 | 
						|
 | 
						|
    assert has_expected_child_traces(
 | 
						|
        second_hash,
 | 
						|
        [2],
 | 
						|
        traces,
 | 
						|
        [],
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def has_expected_child_traces(
 | 
						|
    transaction_hash: str,
 | 
						|
    parent_trace_address: List[int],
 | 
						|
    traces: List[ClassifiedTrace],
 | 
						|
    expected_trace_addresses: List[List[int]],
 | 
						|
):
 | 
						|
    child_traces = get_child_traces(
 | 
						|
        transaction_hash,
 | 
						|
        parent_trace_address,
 | 
						|
        traces,
 | 
						|
    )
 | 
						|
 | 
						|
    distinct_trace_addresses = distinct_lists(expected_trace_addresses)
 | 
						|
 | 
						|
    if len(child_traces) != len(distinct_trace_addresses):
 | 
						|
        return False
 | 
						|
 | 
						|
    for trace in child_traces:
 | 
						|
        if trace.transaction_hash != transaction_hash:
 | 
						|
            return False
 | 
						|
 | 
						|
        if trace.trace_address not in distinct_trace_addresses:
 | 
						|
            return False
 | 
						|
 | 
						|
    return True
 | 
						|
 | 
						|
 | 
						|
def distinct_lists(list_of_lists: List[List[int]]) -> List[List[int]]:
 | 
						|
    distinct_so_far = []
 | 
						|
 | 
						|
    for list_of_values in list_of_lists:
 | 
						|
        if list_of_values not in distinct_so_far:
 | 
						|
            distinct_so_far.append(list_of_values)
 | 
						|
 | 
						|
    return distinct_so_far
 |