Example #1
0
    def __init__(self, address, abi: Dict = None, sources: Dict = None) -> None:
        self._sources = sources
        self.abi = abi
        self.address = address
        self.selectors = None
        self.signatures = None
        if self.abi != None:
            self.selectors = {
                utils.build_function_selector(i): i["name"] for i in self.abi if i["type"] == "function"
            }
            # this isn't fully accurate because of overloaded methods - will be removed in `v2.0.0`
            self.signatures = {
                i["name"]: utils.build_function_selector(i) for i in self.abi if i["type"] == "function"
            }

            fn_names = [i["name"] for i in self.abi if i["type"] == "function"]
            for abi in [i for i in self.abi if i["type"] == "function"]:
                name = f"{self.address}.{abi['name']}"
                natspec: Dict = {}
                if fn_names.count(abi["name"]) == 1:
                    fn = _get_method_object(address, abi, name, None, natspec)
                    self._check_and_set(abi["name"], fn)
                    continue

                # special logic to handle function overloading
                if not hasattr(self, abi["name"]):
                    overloaded = OverloadedMethod(address, name, None)
                    self._check_and_set(abi["name"], overloaded)
                getattr(self, abi["name"])._add_fn(abi, natspec)
Example #2
0
 def __init__(self, project: Any, build: Dict, sources: Dict) -> None:
     self._project = project
     self._build = build.copy()
     self._sources = sources
     self.topics = _get_topics(self.abi)
     self.selectors = {
         build_function_selector(i): i["name"] for i in self.abi if i["type"] == "function"
     }
     # this isn't fully accurate because of overloaded methods - will be removed in `v2.0.0`
     self.signatures = {
         i["name"]: build_function_selector(i) for i in self.abi if i["type"] == "function"
     }
Example #3
0
    def __init__(self, abi: List) -> None:
        self.abi = abi

        # self.topics = _get_topics(self.abi) # CHECK
        self.selectors = {
            build_function_selector(i): i["name"]
            for i in self.abi if i["type"] == "function"
        }

        # this isn't fully accurate because of overloaded methods - will be removed in `v2.0.0`
        self.signatures = {
            i["name"]: build_function_selector(i)
            for i in self.abi if i["type"] == "function"
        }
Example #4
0
    def decode_input(self, calldata: Union[str, bytes]) -> Tuple[str, Any]:
        """
        Decode input calldata for this contract.

        Arguments
        ---------
        calldata : str | bytes
            Calldata for a call to this contract

        Returns
        -------
        str
            Signature of the function that was called
        Any
            Decoded input arguments
        """
        if not isinstance(calldata, HexBytes):
            calldata = HexBytes(calldata)

        abi = next(
            (i for i in self.abi if i["type"] == "function"
             and build_function_selector(i) == calldata[:4].hex()),
            None,
        )
        if abi is None:
            raise ValueError(
                "Four byte selector does not match the ABI for this contract")

        function_sig = build_function_signature(abi)

        types_list = get_type_strings(abi["inputs"])
        result = eth_abi.decode_abi(types_list, calldata[4:])
        input_args = format_input(abi, result)

        return function_sig, input_args
Example #5
0
 def __init__(self, project: Any, build: Dict, sources: Dict) -> None:
     self._project = project
     self._build = build.copy()
     self._sources = sources
     self.topics = _get_topics(self.abi)
     self.signatures = {
         i["name"]: build_function_selector(i)
         for i in self.abi if i["type"] == "function"
     }
Example #6
0
 def __init__(
     self,
     web3: 'AsyncWeb3',
     address: Address,
     abi: Dict,
 ) -> None:
     self.web3 = web3
     self._address = address
     self.abi = abi
     self.signature = build_function_selector(abi)
     self._input_sig = build_function_signature(abi)
Example #7
0
 def __init__(
     self,
     address: str,
     abi: Dict,
     name: str,
     owner: Optional[AccountsType],
     natspec: Optional[Dict] = None,
 ) -> None:
     self._address = address
     self._name = name
     self.abi = abi
     self._owner = owner
     self.signature = build_function_selector(abi)
     self.natspec = natspec or {}
Example #8
0
 def __init__(self, name: str, abi: List) -> None:
     self._name = name
     self.abi = abi
     self.selectors = {
         build_function_selector(i): i["name"] for i in self.abi if i["type"] == "function"
     }