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
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 } } }
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)
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}
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}
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}