Ejemplo n.º 1
0
 def _check_updated(self, path):
     path = self._path(path)
     if path not in self.tests or not self.tests[path]["isolated"]:
         return False
     if CONFIG.argv["coverage"] and not self.tests[path]["coverage"]:
         return False
     for txhash in self.tests[path]["txhash"]:
         coverage._check_cached(txhash, False)
     return True
Ejemplo n.º 2
0
    def __init__(
        self,
        txid: Union[str, bytes],
        sender: Any = None,
        silent: bool = False,
        name: str = "",
        revert_data: Optional[Tuple] = None,
    ) -> None:
        """Instantiates a new TransactionReceipt object.

        Args:
            txid: hexstring transaction ID
            sender: sender as a hex string or Account object
            silent: toggles console verbosity
            name: contract function being called
            revert_data: (revert string, program counter, revert type)
        """
        if isinstance(txid, bytes):
            txid = txid.hex()
        if not silent:
            print(
                f"{color['key']}Transaction sent{color}: {color['value']}{txid}{color}"
            )
        history._add_tx(self)

        self._raw_trace = None
        self._trace = None
        self._events = None
        self._return_value = None
        self._revert_msg = None
        self._modified_state = None
        self._confirmed = threading.Event()

        self.sender = sender
        self.status = -1
        self.txid = txid
        self.fn_name = name

        if name and "." in name:
            self.contract_name, self.fn_name = name.split(".", maxsplit=1)

        # avoid querying the trace to get the revert string if possible
        revert_msg, self._revert_pc, revert_type = revert_data or (None, None,
                                                                   None)
        if revert_msg:
            # revert message was returned
            self._revert_msg = revert_msg
        elif revert_type in ("revert", "invalid opcode"):
            # check for dev revert string as a comment
            self._revert_msg = build._get_dev_revert(self._revert_pc)
        else:
            self._revert_msg = revert_type

        # threaded to allow impatient users to ctrl-c to stop waiting in the console
        confirm_thread = threading.Thread(target=self._await_confirmation,
                                          args=(silent, ),
                                          daemon=True)
        confirm_thread.start()
        try:
            confirm_thread.join()
            if ARGV["cli"] == "console":
                return
            # if coverage evaluation is active, evaluate the trace
            if ARGV["coverage"] and not coverage._check_cached(
                    self.coverage_hash) and self.trace:
                self._expand_trace()
            if not self.status:
                if self._revert_msg is None:
                    # no revert message and unable to check dev string - have to get trace
                    self._expand_trace()
                # raise from a new function to reduce pytest traceback length
                _raise(
                    self._revert_msg or "",
                    self._traceback_string()
                    if ARGV["revert"] else self._error_string(1),
                )
        except KeyboardInterrupt:
            if ARGV["cli"] != "console":
                raise
Ejemplo n.º 3
0
    def __init__(
        self,
        txid: Union[str, bytes],
        sender: Any = None,
        silent: bool = False,
        name: str = "",
        revert_data: Optional[Tuple] = None,
    ) -> None:
        """Instantiates a new TransactionReceipt object.

        Args:
            txid: hexstring transaction ID
            sender: sender as a hex string or Account object
            silent: toggles console verbosity
            name: contract function being called
            revert_data: (revert string, program counter, revert type)
        """

        if CONFIG.mode == "test":
            silent = True
        if isinstance(txid, bytes):
            txid = txid.hex()
        if not silent:
            print(f"Transaction sent: {color('bright blue')}{txid}{color}")
        history._add_tx(self)

        self._trace_origin = None
        self._raw_trace = None
        self._trace = None
        self._call_cost = 0
        self._events = None
        self._return_value = None
        self._revert_msg = None
        self._modified_state = None
        self._new_contracts = None
        self._internal_transfers = None
        self._confirmed = threading.Event()

        self.sender = sender
        self.status = -1
        self.txid = txid
        self.fn_name = name

        if name and "." in name:
            self.contract_name, self.fn_name = name.split(".", maxsplit=1)

        # avoid querying the trace to get the revert string if possible
        self._revert_msg, self._revert_pc, revert_type = revert_data or (None, None, None)
        if self._revert_msg is None and revert_type not in ("revert", "invalid_opcode"):
            self._revert_msg = revert_type

        # threaded to allow impatient users to ctrl-c to stop waiting in the console
        confirm_thread = threading.Thread(
            target=self._await_confirmation, args=(silent,), daemon=True
        )
        confirm_thread.start()
        try:
            confirm_thread.join()
            # if coverage evaluation is active, evaluate the trace
            if (
                CONFIG.argv["coverage"]
                and not coverage._check_cached(self.coverage_hash)
                and self.trace
            ):
                self._expand_trace()
        except KeyboardInterrupt:
            if CONFIG.mode != "console":
                raise
Ejemplo n.º 4
0
    def __init__(
        self,
        txid: Union[str, bytes],
        sender: Any = None,
        silent: bool = True,
        required_confs: int = 1,
        name: str = "",
        revert_data: Optional[Tuple] = None,
    ) -> None:
        """Instantiates a new TransactionReceipt object.

        Args:
            txid: hexstring transaction ID
            sender: sender as a hex string or Account object
            required_confs: the number of required confirmations before processing the receipt
            silent: toggles console verbosity (default True)
            name: contract function being called
            revert_data: (revert string, program counter, revert type)
        """
        self._silent = silent

        if isinstance(txid, bytes):
            txid = HexBytes(txid).hex()
        if not self._silent:
            print(f"Transaction sent: {color('bright blue')}{txid}{color}")

        # internal attributes
        self._trace_exc = None
        self._trace_origin = None
        self._raw_trace = None
        self._trace = None
        self._call_cost = 0
        self._events = None
        self._return_value = None
        self._revert_msg = None
        self._modified_state = None
        self._new_contracts = None
        self._internal_transfers = None
        self._subcalls: Optional[List[Dict]] = None
        self._confirmed = threading.Event()

        # attributes that can be set immediately
        self.sender = sender
        self.status = -1
        self.txid = txid
        self.contract_name = None
        self.fn_name = name

        if name and "." in name:
            self.contract_name, self.fn_name = name.split(".", maxsplit=1)

        # avoid querying the trace to get the revert string if possible
        self._revert_msg, self._revert_pc, revert_type = revert_data or (None,
                                                                         None,
                                                                         None)
        if self._revert_msg is None and revert_type not in ("revert",
                                                            "invalid_opcode"):
            self._revert_msg = revert_type

        #self._await_transaction(required_confs)

        # if coverage evaluation is active, evaluate the trace
        if (CONFIG.argv["coverage"]
                and not coverage._check_cached(self.coverage_hash)
                and self.trace):
            self._expand_trace()