示例#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
示例#2
0
 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
示例#3
0
    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)
示例#4
0
    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
示例#5
0
    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)
示例#6
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))
示例#7
0
def test_validate_w3_instance_invalidates(w3):
    with pytest.raises(ValueError):
        assert validate_w3_instance(w3)
示例#8
0
def test_validate_w3_instance_validates(w3):
    assert validate_w3_instance(w3) is None