Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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.")
Ejemplo n.º 3
0
    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()))}."
            )
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
    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))
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
def test_validate_contract_name_invalidates(name):
    with pytest.raises(ValidationError):
        assert validate_contract_name(name)
Ejemplo n.º 10
0
def test_validate_contract_name_validates(name):
    assert validate_contract_name(name) is None