def test_interfaceconstructor_call(tester): interface = InterfaceContainer(None) interface._add("Test", [{"type": "foo"}]) contract = interface.Test(tester.address) assert isinstance(contract, Contract) assert contract.abi == [{"type": "foo"}]
def test_interface_is_not_persisted(network): network.connect("mainnet") interface = InterfaceContainer(None) interface._add("Test", [{"type": "foo"}]) address = "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e" interface.Test(address) assert _get_deployment(address) == (None, None)
class _ProjectBase: _path: Optional[Path] _build_path: Optional[Path] _sources: Sources _build: Build def _compile(self, contract_sources: Dict, compiler_config: Dict, silent: bool) -> None: compiler_config.setdefault("solc", {}) allow_paths = None cwd = os.getcwd() if self._path is not None: _install_dependencies(self._path) allow_paths = self._path.as_posix() os.chdir(self._path) try: build_json = compiler.compile_and_format( contract_sources, solc_version=compiler_config["solc"].get("version", None), vyper_version=compiler_config["vyper"].get("version", None), optimize=compiler_config["solc"].get("optimize", None), runs=compiler_config["solc"].get("runs", None), evm_version=compiler_config["evm_version"], silent=silent, allow_paths=allow_paths, remappings=compiler_config["solc"].get("remappings", []), optimizer=compiler_config["solc"].get("optimizer", None), ) finally: os.chdir(cwd) for alias, data in build_json.items(): if self._build_path is not None and not data[ "sourcePath"].startswith("interface"): # interfaces should generate artifact in /build/interfaces/ not /build/contracts/ if alias == data["contractName"]: # if the alias == contract name, this is a part of the core project path = self._build_path.joinpath(f"contracts/{alias}.json") else: # otherwise, this is an artifact from an external dependency path = self._build_path.joinpath( f"contracts/dependencies/{alias}.json") for parent in list(path.parents)[::-1]: parent.mkdir(exist_ok=True) with path.open("w") as fp: json.dump(data, fp, sort_keys=True, indent=2, default=sorted) if alias == data["contractName"]: # only add artifacts from the core project for now self._build._add_contract(data) def _create_containers(self) -> None: # create container objects self.interface = InterfaceContainer(self) self._containers: Dict = {} for key, data in self._build.items(): if data["type"] == "interface": self.interface._add(data["contractName"], data["abi"]) if data.get("bytecode"): container = ContractContainer(self, data) self._containers[key] = container setattr(self, container._name, container) def __getitem__(self, key: str) -> ContractContainer: return self._containers[key] def __iter__(self) -> Iterator[ContractContainer]: return iter(self._containers[i] for i in sorted(self._containers)) def __len__(self) -> int: return len(self._containers) def __contains__(self, item: ContractContainer) -> bool: return item in self._containers def dict(self) -> Dict: return dict(self._containers) def keys(self) -> KeysView[Any]: return self._containers.keys()
class _ProjectBase: _path: Optional[Path] _build_path: Optional[Path] _sources: Sources _build: Build def _compile(self, contract_sources: Dict, compiler_config: Dict, silent: bool) -> None: compiler_config.setdefault("solc", {}) allow_paths = None cwd = os.getcwd() if self._path is not None: _install_dependencies(self._path) allow_paths = self._path.as_posix() os.chdir(self._path) try: build_json = compiler.compile_and_format( contract_sources, solc_version=compiler_config["solc"].get("version", None), optimize=compiler_config["solc"].get("optimize", None), runs=compiler_config["solc"].get("runs", None), evm_version=compiler_config["evm_version"], silent=silent, allow_paths=allow_paths, remappings=compiler_config["solc"].get("remappings", []), optimizer=compiler_config["solc"].get("optimizer", None), ) finally: os.chdir(cwd) for data in build_json.values(): if self._build_path is not None: path = self._build_path.joinpath( f"contracts/{data['contractName']}.json") with path.open("w") as fp: json.dump(data, fp, sort_keys=True, indent=2, default=sorted) self._build._add(data) def _create_containers(self) -> None: # create container objects self.interface = InterfaceContainer(self) self._containers: Dict = {} for key, data in self._build.items(): if data["type"] == "interface": self.interface._add(data["contractName"], data["abi"]) if data.get("bytecode"): container = ContractContainer(self, data) self._containers[key] = container setattr(self, container._name, container) def __getitem__(self, key: str) -> ContractContainer: return self._containers[key] def __iter__(self) -> Iterator[ContractContainer]: return iter(self._containers[i] for i in sorted(self._containers)) def __len__(self) -> int: return len(self._containers) def __contains__(self, item: ContractContainer) -> bool: return item in self._containers def dict(self) -> Dict: return dict(self._containers) def keys(self) -> KeysView[Any]: return self._containers.keys()
def test_interfacecontainer_add(): interface = InterfaceContainer(None) interface._add("Test", []) assert hasattr(interface, "Test") assert isinstance(interface.Test, InterfaceConstructor)