def test_deployment_addresses_from_dependencies(): math_manifest = ethpm.get_manifest("ipfs://testipfs-math") assert ethpm.get_deployment_addresses(math_manifest, "Math", MAINNET_GENESIS_HASH) # math is a dependency of complex, the deployment should not be inherited complex_manifest = ethpm.get_manifest("ipfs://testipfs-complex") assert not ethpm.get_deployment_addresses(complex_manifest, "Math", MAINNET_GENESIS_HASH)
def test_deployment_addresses_genesis_hash(network): manifest = ethpm.get_manifest("ipfs://testipfs-complex") ropsten = ethpm.get_deployment_addresses(manifest, "ComplexNothing", ROPSTEN_GENESIS_HASH) assert len(ropsten) == 1 network.connect("ropsten") assert ropsten == ethpm.get_deployment_addresses(manifest, "ComplexNothing")
def test_get_deployment_addresses_active_network(): manifest = ethpm.get_manifest("ipfs://testipfs-complex") mainnet_addresses = ethpm.get_deployment_addresses(manifest, "ComplexNothing", MAINNET_GENESIS_HASH) assert len(mainnet_addresses) == 2 ropsten_addresses = ethpm.get_deployment_addresses(manifest, "ComplexNothing", ROPSTEN_GENESIS_HASH) assert len(ropsten_addresses) == 1 assert ropsten_addresses[0] not in mainnet_addresses
def _deprecated_init( self, name: str, address: Optional[str] = None, abi: Optional[List] = None, manifest_uri: Optional[str] = None, owner: Optional[AccountsType] = None, ) -> None: if manifest_uri and abi: raise ValueError( "Contract requires either abi or manifest_uri, but not both") if manifest_uri is not None: manifest = ethpm.get_manifest(manifest_uri) abi = manifest["contract_types"][name]["abi"] if address is None: address_list = ethpm.get_deployment_addresses(manifest, name) if not address_list: raise ContractNotFound( f"'{manifest['package_name']}' manifest does not contain" f" a deployment of '{name}' on this chain") if len(address_list) > 1: raise ValueError( f"'{manifest['package_name']}' manifest contains more than one " f"deployment of '{name}' on this chain, you must specify an address:" f" {', '.join(address_list)}") address = address_list[0] name = manifest["contract_types"][name]["contract_name"] elif not address: raise TypeError( "Address cannot be None unless creating object from manifest") build = {"abi": abi, "contractName": name, "type": "contract"} _ContractBase.__init__(self, None, build, {}) # type: ignore _DeployedContractBase.__init__(self, address, owner, None)
def from_ethpm( cls, name: str, manifest_uri: str, address: Optional[str] = None, owner: Optional[AccountsType] = None, ) -> "Contract": """ Create a new `Contract` object from an ethPM manifest. Arguments --------- name : str Name of the contract. manifest_uri : str erc1319 registry URI where the manifest is located address : str optional Address where the contract is deployed. Only required if the manifest contains more than one deployment with the given name on the active chain. owner : Account, optional Contract owner. If set, transactions without a `from` field will be performed using this account. """ manifest = ethpm.get_manifest(manifest_uri) if address is None: address_list = ethpm.get_deployment_addresses(manifest, name) if not address_list: raise ContractNotFound( f"'{manifest['package_name']}' manifest does not contain" f" a deployment of '{name}' on this chain" ) if len(address_list) > 1: raise ValueError( f"'{manifest['package_name']}' manifest contains more than one " f"deployment of '{name}' on this chain, you must specify an address:" f" {', '.join(address_list)}" ) address = address_list[0] manifest["contract_types"][name]["contract_name"] build = { "abi": manifest["contract_types"][name]["abi"], "contractName": name, "natspec": manifest["contract_types"][name]["natspec"], "type": "contract", } self = cls.__new__(cls) _ContractBase.__init__(self, None, build, manifest["sources"]) # type: ignore _DeployedContractBase.__init__(self, address, owner) _add_deployment(self) return self
def from_ethpm(uri: str) -> "TempProject": """ Generates a TempProject from an ethPM package. """ manifest = get_manifest(uri) compiler_config = { "evm_version": None, "solc": {"version": None, "optimize": True, "runs": 200}, "vyper": {"version": None}, } project = TempProject(manifest["package_name"], manifest["sources"], compiler_config) if web3.isConnected(): for contract_name in project.keys(): for address in get_deployment_addresses(manifest, contract_name): project[contract_name].at(address) return project