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 _validate_name_and_references(self, name: str) -> None: validate_contract_name(name) if name not in self.deployment_data: raise KeyError("Contract name not found in deployment data") if name not in self.contract_factories: raise ValidationError("Contract name not found in contract_factories.")
def _validate_name_and_references(self, name: str) -> None: validate_contract_name(name) if name not in self.deployment_data: raise KeyError( "Contract name not found in deployment data. " f"Available deployments include: {list(sorted(self.deployment_data.keys()))}." ) contract_type = self.deployment_data[name]["contract_type"] if contract_type not in self.contract_factories: raise ValidationError( f"Contract type: {contract_type} for alias: {name} not found. " f"Available contract types include: {list(sorted(self.contract_factories.keys()))}." )
def get_contract_instance(self, name: ContractName, address: Address) -> Contract: """ Return a Contract object representing the contract type at the provided address. """ validate_address(address) validate_contract_name(name) try: self.manifest["contract_types"][name]["abi"] except KeyError: raise InsufficientAssetsError( "Package does not have the ABI required to generate a contract instance " f"for contract: {name} at address: {address}.") contract_kwargs = generate_contract_factory_kwargs( self.manifest["contract_types"][name]) canonical_address = to_canonical_address(address) contract_instance = self.w3.eth.contract(address=canonical_address, **contract_kwargs) return contract_instance
def get_contract_factory(self, name: ContractName) -> Contract: """ Return the contract factory for a given contract type, generated from the data vailable in ``Package.manifest``. Contract factories are accessible from the package class. .. code:: python Owned = OwnedPackage.get_contract_factory('owned') In cases where a contract uses a library, the contract factory will have unlinked bytecode. The ``ethpm`` package ships with its own subclass of ``web3.contract.Contract``, ``ethpm.contract.LinkableContract`` with a few extra methods and properties related to bytecode linking. .. code:: python >>> math = owned_package.contract_factories.math >>> math.needs_bytecode_linking True >>> linked_math = math.link_bytecode({'MathLib': '0x1234...'}) >>> linked_math.needs_bytecode_linking False """ validate_contract_name(name) if "contract_types" not in self.manifest: raise InsufficientAssetsError( "This package does not contain any contract type data." ) try: contract_data = self.manifest["contract_types"][name] except KeyError: raise InsufficientAssetsError( "This package does not contain any package data to generate " f"a contract factory for contract type: {name}. Available contract types include: " f"{ list(self.manifest['contract_types'].keys()) }." ) validate_minimal_contract_factory_data(contract_data) contract_kwargs = generate_contract_factory_kwargs(contract_data) contract_factory = self.w3.eth.contract(**contract_kwargs) return contract_factory
def get_contract_instance(self, name: ContractName, address: Address) -> Contract: """ Will return a ``Web3.contract`` instance generated from the contract type data available in ``Package.manifest`` and the provided ``address``. The provided ``address`` must be valid on the connected chain available through ``Package.w3``. """ validate_address(address) validate_contract_name(name) try: self.manifest["contract_types"][name]["abi"] except KeyError: raise InsufficientAssetsError( "Package does not have the ABI required to generate a contract instance " f"for contract: {name} at address: {address}.") contract_kwargs = generate_contract_factory_kwargs( self.manifest["contract_types"][name]) canonical_address = to_canonical_address(address) contract_instance = self.w3.eth.contract(address=canonical_address, **contract_kwargs) return contract_instance
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 get_contract_factory(self, name: ContractName) -> Contract: """ Return a contract factory for a given contract type. """ validate_contract_name(name) if "contract_types" not in self.manifest: raise InsufficientAssetsError( "This package does not contain any contract type data.") try: contract_data = self.manifest["contract_types"][name] except KeyError: raise InsufficientAssetsError( "This package does not contain any package data to generate " f"a contract factory for contract type: {name}. Available contract types include: " f"{ list(self.manifest['contract_types'].keys()) }.") validate_minimal_contract_factory_data(contract_data) contract_kwargs = generate_contract_factory_kwargs(contract_data) contract_factory = self.w3.eth.contract(**contract_kwargs) return contract_factory
def test_validate_contract_name_invalidates(name): with pytest.raises(ValidationError): assert validate_contract_name(name)
def test_validate_contract_name_validates(name): assert validate_contract_name(name) is None