def test_get_contract_deploy_order():
    dependency_graph = {"A": {"B", "C"}, "C": {"E"}, "D": {"B", "E"}, "E": {"B"}, "B": set()}

    # non-deterministic.  Can be deployed in either of these orders.
    expected_deploy_order_a = ["B", "E", "D", "C", "A"]
    expected_deploy_order_b = ["B", "E", "C", "D", "A"]

    actual_deploy_order = get_contract_deploy_order(dependency_graph)

    assert any((actual_deploy_order == expected_deploy_order_a, actual_deploy_order == expected_deploy_order_b))
def test_get_contract_deploy_order():
    dependency_graph = {
        'A': {'B', 'C'},
        'C': {'E'},
        'D': {'B', 'E'},
        'E': {'B'},
        'B': set(),
    }

    # non-deterministic.  Can be deployed in either of these orders.
    expected_deploy_order_a = ['B', 'E', 'D', 'C', 'A']
    expected_deploy_order_b = ['B', 'E', 'C', 'D', 'A']

    actual_deploy_order = get_contract_deploy_order(dependency_graph)

    assert any((
        actual_deploy_order == expected_deploy_order_a,
        actual_deploy_order == expected_deploy_order_b,
    ))
Example #3
0
def get_deploy_order(contracts_to_deploy, compiled_contracts):
    # Extract and dependencies that exist due to library linking.
    dependency_graph = get_shallow_dependency_graph(compiled_contracts)

    # Compute the full set of dependencies needed to deploy the desired
    # contracts.
    all_deploy_dependencies = set(itertools.chain.from_iterable(
        get_recursive_contract_dependencies(contract_name, dependency_graph)
        for contract_name in contracts_to_deploy
    ))
    all_contracts_to_deploy = all_deploy_dependencies.union(contracts_to_deploy)

    # Now compute the order that the contracts should be deployed based on
    # their dependencies.
    deploy_order = [
        (contract_name, compiled_contracts[contract_name])
        for contract_name
        in get_contract_deploy_order(dependency_graph)
        if contract_name in all_contracts_to_deploy
    ]
    return OrderedDict(deploy_order)