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
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())
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
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
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