def get_contract_factory(self, name: ContractName, w3: Web3 = None) -> Contract: """ API to generate a contract factory class. """ current_w3 = None if w3 is not None: current_w3 = w3 else: current_w3 = self.w3 validate_contract_name(name) validate_w3_instance(current_w3) try: contract_data = self.package_data["contract_types"][name] validate_minimal_contract_factory_data(contract_data) except KeyError: raise InsufficientAssetsError( "This package has insufficient package data to generate " "a contract factory for contract:{0}.".format(name) ) contract_kwargs = generate_contract_factory_kwargs(contract_data) contract_factory = current_w3.eth.contract(**contract_kwargs) return contract_factory
def set_default_w3(self, w3: Web3) -> None: """ Set the default Web3 instance. """ validate_w3_instance(w3) # Mechanism to bust cached properties when switching chains. if "deployments" in self.__dict__: del self.deployments if "build_dependencies" in self.__dict__: del self.build_dependencies self.w3 = w3 self.w3.eth.defaultContractFactory = LinkableContract
def update_w3(self, w3: Web3) -> "Package": """ Returns a new instance of `Package` containing the same manifest, but connected to a different web3 instance. .. doctest:: >>> new_w3 = Web3(Web3.EthereumTesterProvider()) >>> NewPackage = OwnedPackage.update_w3(new_w3) >>> assert NewPackage.w3 == new_w3 >>> assert OwnedPackage.manifest == NewPackage.manifest """ validate_w3_instance(w3) return Package(self.manifest, w3, self.uri)
def __init__(self, manifest: Dict[str, Any], w3: Web3) -> None: """ A package should be created using one of the available classmethods and a valid w3 instance. """ if not isinstance(manifest, dict): raise TypeError( "Package object must be initialized with a dictionary. " f"Got {type(manifest)}") validate_manifest_against_schema(manifest) validate_manifest_deployments(manifest) validate_w3_instance(w3) self.w3 = w3 self.w3.eth.defaultContractFactory = LinkableContract self.manifest = manifest
def get_deployments(self, w3: Web3 = None) -> 'Deployments': """ API to retrieve instance of deployed contract dependency. """ if w3 is None: w3 = self.w3 validate_w3_instance(w3) validate_deployments_are_present(self.package_data) all_blockchain_uris = self.package_data["deployments"].keys() matching_uri = validate_single_matching_uri(all_blockchain_uris, w3) deployments = self.package_data["deployments"][matching_uri] all_contract_factories = { deployment_data['contract_type']: self.get_contract_type(deployment_data['contract_type'], w3) for deployment_data in deployments.values() } return Deployments(deployments, all_contract_factories, w3)
def get_contract_type(self, name: str, w3: Web3 = None) -> Contract: """ API to generate a contract factory class. """ current_w3 = None if w3 is not None: current_w3 = w3 else: current_w3 = self.w3 validate_contract_name(name) validate_w3_instance(current_w3) if name in self.package_data['contract_types']: contract_data = self.package_data['contract_types'][name] validate_minimal_contract_data_present(contract_data) contract_kwargs = generate_contract_factory_kwargs(contract_data) contract_factory = current_w3.eth.contract(**contract_kwargs) return contract_factory raise ValidationError( "Package does not have contract by name: {}.".format(name))
def test_validate_w3_instance_invalidates(w3): with pytest.raises(ValueError): assert validate_w3_instance(w3)
def test_validate_w3_instance_validates(w3): assert validate_w3_instance(w3) is None