Beispiel #1
0
 def __init__(self, contract_sources: Dict) -> None:
     self._source: Dict = {}
     self._contracts: Dict = {}
     for path, source in contract_sources.items():
         data = _get_contract_data(source, path)
         for name, values in data.items():
             if name in self._contracts:
                 raise NamespaceCollision(
                     f"Project has multiple contracts named '{name}'")
             values["path"] = path
         self._source[path] = source
         self._contracts.update(data)
Beispiel #2
0
    def __init__(self, contract_sources: Dict,
                 interface_sources: Dict) -> None:
        self._contract_sources: Dict = {}
        self._contracts: Dict = {}
        self._interface_sources: Dict = {}
        self._interfaces: Dict = {}

        contracts: Dict = {}
        collisions: Dict = {}
        for path, source in contract_sources.items():
            self._contract_sources[path] = source
            if Path(path).suffix != ".sol":
                contract_names = [(Path(path).stem, "contract")]
            else:
                contract_names = get_contract_names(source)
            for name, type_ in contract_names:
                if name in contracts:
                    if type_ == "interface":
                        # allow names to overlap when dealing with interfaces
                        continue
                    if contracts[name][1] != "interface":
                        collisions.setdefault(name, set()).update(
                            [path, contracts[name][0]])
                contracts[name] = (path, type_)

        self._contracts = {k: v[0] for k, v in contracts.items()}

        for path, source in interface_sources.items():
            self._interface_sources[path] = source

            if Path(path).suffix != ".sol":
                interface_names = [(Path(path).stem, "interface")]
            else:
                interface_names = get_contract_names(source)
            for name, type_ in interface_names:
                if name in self._interfaces:
                    collisions.setdefault(name, set()).update(
                        [path, self._interfaces[name]])
                self._interfaces[name] = path

        if collisions:
            raise NamespaceCollision(
                "Multiple contracts or interfaces with the same name\n  " +
                "\n  ".join(f"{k}: {', '.join(sorted(v))}"
                            for k, v in collisions.items()))
Beispiel #3
0
    def __init__(self, contract_sources: Dict,
                 interface_sources: Dict) -> None:
        self._source: Dict = {}
        self._contracts: Dict = {}
        self._interfaces: Dict = {}

        collisions: Dict = {}
        for path, source in contract_sources.items():
            self._source[path] = source
            if Path(path).suffix != ".sol":
                contract_names = [Path(path).stem]
            else:
                contract_names = get_contract_names(source)
            for name in contract_names:
                if name in self._contracts:
                    collisions.setdefault(name, set()).update(
                        [path, self._contracts[name]])
                self._contracts[name] = path

        for path, source in interface_sources.items():
            self._source[path] = source

            if Path(path).suffix != ".sol":
                interface_names = [Path(path).stem]
            else:
                interface_names = get_contract_names(source)
            for name in interface_names:
                if name in self._contracts:
                    collisions.setdefault(name, set()).update(
                        [path, self._contracts[name]])
                if name in self._interfaces:
                    collisions.setdefault(name, set()).update(
                        [path, self._interfaces[name]])
                self._interfaces[name] = path

        if collisions:
            raise NamespaceCollision(
                "Multiple contracts or interfaces with the same name\n  " +
                "\n  ".join(f"{k}: {', '.join(sorted(v))}"
                            for k, v in collisions.items()))
Beispiel #4
0
    def __init__(self, contract_sources: Dict,
                 interface_sources: Dict) -> None:
        self._source: Dict = {}
        self._contracts: Dict = {}
        self._interfaces: Dict = {}

        collisions: Dict = {}
        for path, source in contract_sources.items():
            self._source[path] = source
            data = _get_contract_data(source, path)
            for name, values in data.items():
                if name in self._contracts:
                    collisions.setdefault(name, set()).update(
                        [path, self._contracts[name]["path"]])
                values["path"] = path
            self._contracts.update(data)

        for path, source in interface_sources.items():
            self._source[path] = source
            if Path(path).suffix != ".sol":
                data = {Path(path).stem: minify(source, Path(path).suffix)[0]}
            else:
                data = get_contracts(minify(source, "Solidity")[0])
            for name, source in data.items():
                if name in self._contracts:
                    collisions.setdefault(name, set()).update(
                        [path, self._contracts[name]["path"]])
                if name in self._interfaces:
                    collisions.setdefault(name, set()).update(
                        [path, self._interfaces[name]["path"]])
                self._interfaces[name] = {
                    "path": path,
                    "hash": sha1(source.encode()).hexdigest()
                }

        if collisions:
            raise NamespaceCollision(
                f"Multiple contracts or interfaces with the same name\n  " +
                "\n  ".join(f"{k}: {', '.join(sorted(v))}"
                            for k, v in collisions.items()))