Esempio n. 1
0
    def patched(*args, **kwargs):
        context: 'Mock' = Context.get_context()
        bottom_method_flag = method_flag = get_score_flag(method)
        _, method_name = method.__qualname__.split('.')
        context.current_address = method.__self__.address

        if method_name == 'fallback':
            if not (method_flag & ScoreFlag.PAYABLE) and context.msg.value > 0:
                raise InvalidPayableException(f"This method is not payable")

        if len(context.method_flag_trace) > 0:
            bottom_method_flag = context.method_flag_trace[0]
        if bottom_method_flag & ScoreFlag.READONLY:
            Context._set_query_context(context)
        else:
            Context._set_invoke_context(context)
        if bottom_method_flag & ScoreFlag.PAYABLE and len(
                context.method_flag_trace) is 0:
            IcxEngine.transfer(context, context.msg.sender,
                               context.current_address, context.msg.value)

        context.method_flag_trace.append(method_flag)
        result = method(*args, **kwargs)
        context.method_flag_trace.pop()
        return result
Esempio n. 2
0
    def patch_score_event_logs(score):
        """Patch all event_logs inside SCORE

        :param score: SCORE to be patched
        """
        custom_methods = ScorePatcher._get_custom_methods(score.__class__)
        for method in custom_methods:
            flag = get_score_flag(method)
            if flag == ScoreFlag.EVENTLOG:
                setattr(score, method.__name__, Mock())
Esempio n. 3
0
    def get_custom_methods(score):
        """Get user defined methods inside SCORE

        :param score: SCORE to get the custom method
        :return: user defined methods inside SCORE
        """
        custom_methods = ScorePatcher._get_custom_methods(score)
        methods = set()
        for method in custom_methods:
            flag = get_score_flag(method)
            if flag is ScoreFlag.NONE or is_any_flag_on(flag, ScoreFlag.FUNC):
                methods.add(method)

        methods.add(getattr(score, 'fallback'))
        return methods
Esempio n. 4
0
    def get_custom_methods(score):
        """Get user defined methods inside SCORE

        :param score: SCORE to get the custom method
        :return: user defined methods inside SCORE
        """
        custom_methods = ScorePatcher._get_custom_methods(score)
        methods = set()
        for method in custom_methods:
            flag = get_score_flag(method)
            if is_any_flag_on(flag, ScoreFlag.FUNC | ScoreFlag.EVENTLOG) or \
                    method.__name__ in ("on_install", "on_update"):
                methods.add(method)

        methods.add(getattr(score, 'fallback'))
        return methods
Esempio n. 5
0
    def patched(*args, **kwargs):
        context: 'Mock' = Context.get_context()
        method_flag = get_score_flag(method)
        _, method_name = method.__qualname__.split('.')
        context.current_address = method.__self__.address

        if method_name == 'fallback':
            if not (method_flag & ScoreFlag.PAYABLE) and context.msg.value > 0:
                raise InvalidPayableException(f"This method is not payable")

        if method_flag & ScoreFlag.READONLY == ScoreFlag.READONLY:
            Context._set_query_context(context)
        else:
            Context._set_invoke_context(context)
        if method_flag & ScoreFlag.PAYABLE:
            IcxEngine.transfer(context, context.msg.sender, context.current_address, context.msg.value)

        context.readonly = context.type == IconScoreContextType.QUERY or context.func_type == IconScoreFuncType.READONLY

        result = method(*args, **kwargs)
        return result