Exemple #1
0
def manifest_with_multiple_matches(w3, tmpdir, safe_math_manifest):
    w3.testing.mine(5)
    block_uri = create_latest_block_uri(w3, from_blocks_ago=0)
    w3.testing.mine(1)
    second_block_uri = create_latest_block_uri(w3, from_blocks_ago=0)
    manifest = copy.deepcopy(safe_math_manifest)
    manifest["deployments"][block_uri] = {
        "SafeMathLib": {
            "contractType":
            "SafeMathLib",
            "address":
            "0x8d2c532d7d211816a2807a411f947b211569b68c",
            "transaction":
            "0xaceef751507a79c2dee6aa0e9d8f759aa24aab081f6dcf6835d792770541cb2b",
            "block":
            "0x420cb2b2bd634ef42f9082e1ee87a8d4aeeaf506ea5cdeddaa8ff7cbf911810c",
        }
    }
    manifest["deployments"][second_block_uri] = {
        "SafeMathLib": {
            "contractType":
            "SafeMathLib",
            "address":
            "0x8d2c532d7d211816a2807a411f947b211569b68c",
            "transaction":
            "0xaceef751507a79c2dee6aa0e9d8f759aa24aab081f6dcf6835d792770541cb2b",
            "block":
            "0x420cb2b2bd634ef42f9082e1ee87a8d4aeeaf506ea5cdeddaa8ff7cbf911810c",
        }
    }
    return manifest
def test_insert_deployment(escrow_deployer):
    w3 = escrow_deployer.package.w3
    escrow_package = escrow_deployer.package
    init_deployment_data = {
        "contract_type": "Escrow",
        "address": "0x",
        "transaction": "0x",
        "block": "0x",
    }
    new_deployment_data = {
        "contract_type": "Escrow",
        "address": "0x123",
        "transaction": "0x123",
        "block": "0x123",
    }
    w3.testing.mine(1)
    init_block_uri = create_latest_block_uri(w3, 0)
    alt_block_uri = init_block_uri[:15] + "yxz123" + init_block_uri[21:]
    init_block_deployment_data = {
        init_block_uri: {
            "Other": {
                "x": "x"
            },
            "Escrow": init_deployment_data
        },
        alt_block_uri: {
            "alt": {
                "x": "x"
            }
        },
    }
    w3.testing.mine(1)
    new_block_uri = create_latest_block_uri(w3, 0)
    escrow_package.manifest = assoc(escrow_package.manifest, "deployments",
                                    init_block_deployment_data)
    updated_manifest = insert_deployment(escrow_package, "Escrow",
                                         new_deployment_data, new_block_uri)
    expected_deployments_data = {
        new_block_uri: {
            "Other": {
                "x": "x"
            },
            "Escrow": new_deployment_data
        },
        alt_block_uri: {
            "alt": {
                "x": "x"
            }
        },
    }
    assert updated_manifest["deployments"] == expected_deployments_data
Exemple #3
0
def build_etherscan_manifest(uri: URI, package_name: str,
                             version: str) -> Iterable[Tuple[str, Any]]:
    address, chain_id = parse.urlparse(uri).netloc.split(":")
    network = get_etherscan_network(chain_id)
    body = make_etherscan_request(address, network)
    contract_type = body["ContractName"]
    w3 = setup_w3(to_int(text=chain_id))
    block_uri = create_latest_block_uri(w3)
    runtime_bytecode = to_hex(
        w3.eth.getCode(ChecksumAddress(HexAddress(HexStr(address)))))

    yield "package_name", package_name
    yield "version", version
    yield "manifest_version", "2"
    yield "sources", {f"./{contract_type}.sol": body["SourceCode"]}
    yield "contract_types", {
        contract_type: {
            "abi": json.loads(body["ABI"]),
            "runtime_bytecode": {
                "bytecode": runtime_bytecode
            },
            "compiler": generate_compiler_info(body),
        }
    }
    yield "deployments", {
        block_uri: {
            contract_type: {
                "contract_type": contract_type,
                "address": address
            }
        }
    }
Exemple #4
0
def _deploy(
    contract_name: str, args: Any, transaction: Dict[str, Any], package: Package
) -> Tuple[Package, Address]:
    # Deploy new instance
    factory = package.get_contract_factory(contract_name)
    if not factory.linked_references and factory.unlinked_references:
        raise LinkerError(
            f"Contract factory: {contract_name} is missing runtime link references, which are "
            "necessary to populate manifest deployments that have a link reference. If using the "
            "builder tool, use `contract_type(..., runtime_bytecode=True)`."
        )
    tx_hash = factory.constructor(*args).transact(transaction)
    tx_receipt = package.w3.eth.waitForTransactionReceipt(tx_hash)
    # Create manifest copy with new deployment instance
    latest_block_uri = create_latest_block_uri(package.w3, 0)
    deployment_data = create_deployment_data(
        contract_name,
        to_checksum_address(tx_receipt.contractAddress),
        tx_receipt,
        factory.linked_references,
    )
    manifest = insert_deployment(
        package, contract_name, deployment_data, latest_block_uri
    )
    logger.info("%s deployed." % contract_name)
    return Package(manifest, package.w3)
Exemple #5
0
def gen_single_deployment(solc_output: Dict[str, Any]) -> Dict[str, Any]:
    chain_id = get_chain_id()
    w3 = setup_w3(chain_id)
    block_uri = create_latest_block_uri(w3)
    address = get_deployment_address()
    available_contract_types = get_contract_types(solc_output)
    contract_type = get_deployment_contract_type(available_contract_types)
    contract_instance = get_deployment_alias(contract_type)
    tx_hash, block_hash = get_deployment_chain_data(w3)
    deployment_data = {
        "block_uri": block_uri,
        "contract_instance": contract_instance,
        "contract_type": contract_type,
        "address": address,
        "transaction": tx_hash,
        "block": block_hash,
    }
    return {field: value for field, value in deployment_data.items() if value}
Exemple #6
0
def gen_single_deployment(solc_output: Dict[str, Any]) -> Dict[str, Any]:
    chain_id = get_chain_id()
    w3 = setup_w3(chain_id)
    block_uri = create_latest_block_uri(w3)
    address = get_deployment_address()
    contract_type = get_deployment_contract_type(solc_output)
    # todo: support custom contract instance definitions
    contract_instance = contract_type
    tx_hash, block_hash = get_deployment_chain_data(w3)
    deployment_data = {
        "block_uri": block_uri,
        "contract_instance": contract_instance,
        "contract_type": contract_type,
        "address": address,
        "transaction": tx_hash,
        "block": block_hash,
    }
    return {field: value for field, value in deployment_data.items() if value}
Exemple #7
0
def amend_single_deployment(manifest: Dict[str, Any]) -> Iterable[Dict[str, Any]]:
    chain_id = get_chain_id()
    w3 = setup_w3(chain_id)
    block_uri = create_latest_block_uri(w3)
    address = get_deployment_address()
    available_contract_types = manifest["contractTypes"].keys()
    contract_type = get_deployment_contract_type(available_contract_types)
    contract_instance = get_deployment_alias(contract_type)
    tx_hash, block_hash = get_deployment_chain_data(w3)
    deployment_data = {
        "block_uri": block_uri,
        "contract_instance": contract_instance,
        "contract_type": contract_type,
        "address": address,
        "transaction": tx_hash,
        "block": block_hash,
    }
    yield {field: value for field, value in deployment_data.items() if value}