Пример #1
0
    def parse_Log(self):
        event = self.stmt._metadata["type"]
        args = self.stmt.value.args

        expected_topics, topics = [], []
        expected_data, data = [], []
        for node, arg_type, is_indexed in zip(args, event.arguments.values(), event.indexed):
            if is_indexed:
                expected_topics.append(arg_type)
                topics.append(node)
            else:
                expected_data.append(arg_type)
                data.append(node)
        topics = pack_logging_topics(event.event_id, topics, expected_topics, self.context)
        inargs, inargsize, inargsize_node, inarg_start = pack_logging_data(
            data, expected_data, self.context, getpos(self.stmt),
        )

        if inargsize_node is None:
            sz = inargsize
        else:
            sz = ["mload", inargsize_node]

        return LLLnode.from_list(
            [
                "seq",
                inargs,
                LLLnode.from_list(
                    ["log" + str(len(topics)), inarg_start, sz] + topics,
                    add_gas_estimate=inargsize * 10,
                ),
            ],
            typ=None,
            pos=getpos(self.stmt),
        )
Пример #2
0
    def parse_Log(self):
        event = self.context.sigs["self"][self.stmt.value.func.id]
        expected_topics, topics = [], []
        expected_data, data = [], []
        for pos, is_indexed in enumerate(event.indexed_list):
            if is_indexed:
                expected_topics.append(event.args[pos])
                topics.append(self.stmt.value.args[pos])
            else:
                expected_data.append(event.args[pos])
                data.append(self.stmt.value.args[pos])
        topics = pack_logging_topics(
            event.event_id,
            topics,
            expected_topics,
            self.context,
            pos=getpos(self.stmt),
        )
        inargs, inargsize, inargsize_node, inarg_start = pack_logging_data(
            expected_data,
            data,
            self.context,
            pos=getpos(self.stmt),
        )

        if inargsize_node is None:
            sz = inargsize
        else:
            sz = ["mload", inargsize_node]

        return LLLnode.from_list(
            [
                "seq",
                inargs,
                LLLnode.from_list(
                    ["log" + str(len(topics)), inarg_start, sz] + topics,
                    add_gas_estimate=inargsize * 10,
                ),
            ],
            typ=None,
            pos=getpos(self.stmt),
        )
Пример #3
0
    def call(self):
        is_self_function = (isinstance(
            self.stmt.func, ast.Attribute)) and isinstance(
                self.stmt.func.value,
                ast.Name) and self.stmt.func.value.id == "self"

        is_log_call = (isinstance(
            self.stmt.func, ast.Attribute)) and isinstance(
                self.stmt.func.value,
                ast.Name) and self.stmt.func.value.id == 'log'

        if isinstance(self.stmt.func, ast.Name):
            if self.stmt.func.id in stmt_dispatch_table:
                if self.stmt.func.id == 'clear':
                    return self._clear()
                else:
                    return stmt_dispatch_table[self.stmt.func.id](self.stmt,
                                                                  self.context)
            elif self.stmt.func.id in dispatch_table:
                raise StructureException(
                    f"Function {self.stmt.func.id} can not be called without being used.",
                    self.stmt,
                )
            else:
                raise StructureException(
                    f"Unknown function: '{self.stmt.func.id}'.",
                    self.stmt,
                )
        elif is_self_function:
            return self_call.make_call(self.stmt, self.context)
        elif is_log_call:
            if self.stmt.func.attr not in self.context.sigs['self']:
                raise EventDeclarationException(
                    f"Event not declared yet: {self.stmt.func.attr}")
            event = self.context.sigs['self'][self.stmt.func.attr]
            if len(event.indexed_list) != len(self.stmt.args):
                raise EventDeclarationException(
                    f"{event.name} received {len(self.stmt.args)} arguments but "
                    f"expected {len(event.indexed_list)}")
            expected_topics, topics = [], []
            expected_data, data = [], []
            for pos, is_indexed in enumerate(event.indexed_list):
                if is_indexed:
                    expected_topics.append(event.args[pos])
                    topics.append(self.stmt.args[pos])
                else:
                    expected_data.append(event.args[pos])
                    data.append(self.stmt.args[pos])
            topics = pack_logging_topics(
                event.event_id,
                topics,
                expected_topics,
                self.context,
                pos=getpos(self.stmt),
            )
            inargs, inargsize, inargsize_node, inarg_start = pack_logging_data(
                expected_data,
                data,
                self.context,
                pos=getpos(self.stmt),
            )

            if inargsize_node is None:
                sz = inargsize
            else:
                sz = ['mload', inargsize_node]

            return LLLnode.from_list([
                'seq', inargs,
                LLLnode.from_list(
                    ["log" + str(len(topics)), inarg_start, sz] + topics,
                    add_gas_estimate=inargsize * 10,
                )
            ],
                                     typ=None,
                                     pos=getpos(self.stmt))
        else:
            return external_call.make_external_call(self.stmt, self.context)